diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d93c748 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,42 @@ +version: 2 +updates: + # Root package: the CLI, the Action, and the webhook runner. + - package-ecosystem: npm + directory: / + schedule: + interval: weekly + groups: + dev-dependencies: + dependency-type: development + labels: + - dependencies + + - package-ecosystem: npm + directory: /extension + schedule: + interval: weekly + groups: + dev-dependencies: + dependency-type: development + labels: + - dependencies + + - package-ecosystem: npm + directory: /site + schedule: + interval: weekly + groups: + dev-dependencies: + dependency-type: development + labels: + - dependencies + + # Keeps the SHA-pinned `uses:` refs in .github/workflows current — the same + # supply-chain hygiene Scorecard's Pinned-Dependencies check rewards, kept + # from going stale. + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + labels: + - dependencies diff --git a/.github/drift.yml b/.github/drift.yml new file mode 100644 index 0000000..045ed9b --- /dev/null +++ b/.github/drift.yml @@ -0,0 +1,18 @@ +# Drift's own configuration. See examples/drift.yml for every option and its +# default, and docs/configuration.md for the full reference. + +# Drift ships in `approve` mode by default; dogfooding it here means seeing +# what it actually proposes rather than what it silently does. +mode: approve + +# Code scanning is on by default, so this line changes nothing — it's here to +# make the choice explicit for a repository that means to demonstrate it. +codeScanning: + enabled: true + includeInformational: true + +# Exercises drift-outdated-selftest.yml, which otherwise has nothing to do: +# `outdated.enabled` is Drift's own opt-in gate, independent of the workflow's +# schedule trigger existing at all. +outdated: + enabled: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1feb07..67d3b78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ permissions: jobs: test: + name: test runs-on: ubuntu-latest strategy: @@ -20,9 +21,9 @@ jobs: node: [22] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: ${{ matrix.node }} cache: npm @@ -32,14 +33,14 @@ jobs: # bundle against this binary, because a bundle that works on 22 is not # evidence it works on the runtime GitHub will actually use. - name: Install Node 24 for the Action runtime check - uses: actions/setup-node@v5 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 24 - name: Record the Node 24 binary run: echo "DRIFT_NODE24=$(which node)" >> "$GITHUB_ENV" # Restore the job's own Node version; the step above left 24 on PATH. - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: ${{ matrix.node }} cache: npm @@ -136,9 +137,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 22 cache: npm @@ -160,11 +161,11 @@ jobs: if: github.event_name == 'pull_request' steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 with: fetch-depth: 0 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 22 cache: npm diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..0dda6e3 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,48 @@ +name: CodeQL + +# Static analysis of Drift's own source, separate from Drift's own +# dependency-change findings (`ci.yml`'s dogfood job) and from Scorecard's +# supply-chain checks (`scorecard.yml`). This is what OpenSSF Scorecard's +# SAST check looks for: a static analysis tool wired into CI, not just run +# ad hoc. + +on: + push: + branches: [main] + pull_request: + branches: [main] + schedule: + # Catches new query packs landing upstream, independent of any push here. + - cron: '23 4 * * 2' + +permissions: + contents: read + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + runs-on: ubuntu-latest + permissions: + security-events: write + + strategy: + fail-fast: false + matrix: + # The extension is a separate TypeScript project (its own + # tsconfig/node_modules) but CodeQL's javascript-typescript analyzer + # covers both from the one root query pass. + language: ['javascript-typescript'] + + steps: + - name: Checkout + uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 + + - name: Initialize CodeQL + uses: github/codeql-action/init@c4dd10e44af883a891fe31ced449bcb4a6728b9b # v3.37.6 + with: + languages: ${{ matrix.language }} + + - name: Perform CodeQL analysis + uses: github/codeql-action/analyze@c4dd10e44af883a891fe31ced449bcb4a6728b9b # v3.37.6 + with: + category: '/language:${{ matrix.language }}' diff --git a/.github/workflows/drift-selftest.yml b/.github/workflows/drift-selftest.yml index 469c255..9251dc8 100644 --- a/.github/workflows/drift-selftest.yml +++ b/.github/workflows/drift-selftest.yml @@ -4,8 +4,11 @@ # this repository is private. Referencing a private action from a *different* # repository does not resolve; that needs this repo to be public. # -# Trigger it by hand from the Actions tab, or let it fire when Drift's own -# dependencies change. +# Three ways this runs: on a push that bumps Drift's own dependencies (the +# ordinary diff-triggered path), on a weekly schedule (the outdated-dependency +# scan — see `scan-mode` in src/runners/action.ts, which always takes that +# path on a `schedule` event regardless of the input below), or by hand from +# the Actions tab with either mode. name: Drift (self-check) @@ -13,14 +16,24 @@ on: workflow_dispatch: inputs: dry-run: - description: 'Analyse only — create no branches, issues, or agent tasks' + description: 'Analyse only — create no branches, issues, or agent tasks (diff mode only)' type: boolean default: true mode: - description: 'approve = file an issue and wait · auto = dispatch Copilot' + description: 'approve = file an issue and wait · auto = dispatch Copilot (diff mode only)' type: choice options: [approve, auto] default: approve + scan-mode: + description: 'diff = analyse the push · outdated = scan every installed dependency' + type: choice + options: [diff, outdated] + default: outdated + alert-granularity: + description: 'How code scanning alerts are grouped. Leave blank to use codeScanning.granularity from drift.yml.' + type: choice + options: ['', package, breakingChange, affectedSite] + default: '' push: branches: [main] @@ -28,23 +41,30 @@ on: - 'package.json' - 'package-lock.json' -permissions: - contents: write - issues: write - pull-requests: write - checks: write + schedule: + - cron: '0 9 * * 1' + +permissions: {} jobs: selftest: runs-on: ubuntu-latest + # Drift needs to open branches/PRs, file approval issues, and (in `auto` + # mode) report check results — scoped to this one job, not the workflow. + permissions: + contents: write + issues: write + pull-requests: write + checks: write + security-events: write # upload code scanning alerts steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 with: # Drift diffs the manifest against the previous commit. fetch-depth: 2 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 22 cache: npm @@ -64,6 +84,8 @@ jobs: copilot-token: ${{ secrets.DRIFT_COPILOT_TOKEN }} dry-run: ${{ inputs.dry-run || 'true' }} mode: ${{ inputs.mode || 'approve' }} + scan-mode: ${{ inputs.scan-mode || 'outdated' }} + alert-granularity: ${{ inputs.alert-granularity }} log-level: debug - name: Result diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index b0aefac..c1fa00d 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -18,8 +18,6 @@ on: permissions: contents: read - pages: write - id-token: write # One deploy at a time, and never cancel one in flight: a half-published site is # worse than a slightly stale one. @@ -34,9 +32,9 @@ jobs: run: working-directory: site steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 22 cache: npm @@ -52,7 +50,7 @@ jobs: # repository, including when a custom domain removes it entirely. - name: Configure Pages id: pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 # `enablement: true` was tried here and cannot work: creating a Pages # site needs a permission the workflow's GITHUB_TOKEN does not have # ("Resource not accessible by integration"), and asking for it turned @@ -75,16 +73,22 @@ jobs: - name: Disable Jekyll run: touch out/.nojekyll - - uses: actions/upload-pages-artifact@v3 + - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 with: path: site/out deploy: needs: build runs-on: ubuntu-latest + # Publishing the built artifact needs pages: write, and OIDC-based + # deployment needs id-token: write; scoped to this one job, which is the + # only one that touches Pages, rather than the whole workflow. + permissions: + pages: write + id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7c221f..5388604 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,14 +23,20 @@ on: tags: - 'v*.*.*' -permissions: - contents: write +permissions: {} jobs: release: runs-on: ubuntu-latest + # `gh release create` and moving the floating v0 tag both need contents: + # write; scoped to this one job rather than the whole workflow. id-token: + # write is for `npm publish --provenance`, which needs to mint an OIDC + # token to get the package's Sigstore-signed provenance attestation. + permissions: + contents: write + id-token: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 with: fetch-depth: 0 @@ -38,13 +44,13 @@ jobs: # shipped bundle against this binary, because publishing an Action that # only works on 22 fails in the user's repository, not here. - name: Install Node 24 for the Action runtime check - uses: actions/setup-node@v5 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 24 - name: Record the Node 24 binary run: echo "DRIFT_NODE24=$(which node)" >> "$GITHUB_ENV" - - uses: actions/setup-node@v5 + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: 22 cache: npm @@ -110,7 +116,7 @@ jobs: # ---- Publish phase: each step here is a public, irreversible action. ---- - name: Publish CLI to npm - run: npm publish --access public + run: npm publish --access public --provenance env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} @@ -135,4 +141,4 @@ jobs: if [ "$MAJOR" = "v0" ]; then git tag -f v0 "${{ github.ref_name }}" git push -f origin v0 - fi + fi \ No newline at end of file diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..1540453 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,78 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '37 2 * * 6' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled. + if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request' + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore + # file_mode: git + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@c4dd10e44af883a891fe31ced449bcb4a6728b9b # v3.37.6 + with: + sarif_file: results.sarif diff --git a/.github/workflows/update-action-bundle.yml b/.github/workflows/update-action-bundle.yml new file mode 100644 index 0000000..6e7a476 --- /dev/null +++ b/.github/workflows/update-action-bundle.yml @@ -0,0 +1,69 @@ +name: Update Action bundle + +on: + push: + paths: + - 'action.yml' + - 'src/**' + - 'scripts/build-action.mjs' + - 'package.json' + - 'package-lock.json' + - 'action/**' + - '!action/index.cjs' + - '!action/behavioural-worker.js' + workflow_dispatch: {} + +permissions: {} + +concurrency: + group: update-action-bundle-${{ github.ref_name }} + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + # Committing the rebuilt bundle needs contents: write; scoped to this one + # job rather than the whole workflow, matching every other workflow here. + # main requires a reviewed PR, so pushing there goes through a PR instead + # of a direct commit; every other branch gets pushed to directly. + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 + + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 + with: + node-version: 22 + cache: npm + + - run: npm ci + + - name: Build the action bundle + run: npm run build:action + + - name: Commit and push action/index.cjs + if: github.ref_name != 'main' + run: | + if git diff --quiet -- action/index.cjs; then + echo "action/index.cjs is already up to date" + exit 0 + fi + + git config user.name "$(git log -1 --format='%an')" + git config user.email "$(git log -1 --format='%ae')" + git add action/index.cjs + git commit -m "chore(action): update bundled action" + git push origin HEAD:${{ github.ref_name }} + + - name: Open a PR with the rebuilt bundle + if: github.ref_name == 'main' + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 + with: + commit-message: "chore(action): update bundled action" + title: "chore(action): update bundled action" + body: Automated rebuild of `action/index.cjs` from the latest `action.yml`/`src/**` changes on `main`. + branch: update-action-bundle + delete-branch: true + add-paths: action/index.cjs diff --git a/README.md b/README.md index 52a4526..bf97abc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Drift +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/trydrift/drift/badge)](https://scorecard.dev/viewer/?uri=github.com/trydrift/drift) + +[![CI](https://github.com/trydrift/drift/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/trydrift/drift/actions/workflows/ci.yml) + **Your dependency updated. Did it break your code? Drift finds out, shows the evidence, and prepares the fix.** Drift watches dependency changes in your repositories, works out which upstream @@ -98,7 +102,8 @@ run time and sends it only to `api.github.com`. It is never stored anywhere else ### 3. (Optional) Configure Copy [`examples/drift.yml`](examples/drift.yml) to `.github/drift.yml`. Every value -is a default, so skipping this is fine. +is a default, so skipping this is fine. Or build one from the site's `/configure` +page — pick your options and download a ready-to-commit `drift.yml` and workflow. ### 4. Watch it work @@ -110,6 +115,23 @@ Applying a plan writes a branch and dispatches a coding agent, so it requires it is about to run is byte-for-byte the one recorded on the issue before it acts. See [trust and safety](docs/trust-and-safety.md#an-unauthorized-user-comments-drift-apply). +### 5. (Optional) See it in the Security tab too + +Every plan — breaking or not — can also be uploaded as a code scanning alert, +one per affected package, listing every place its breaking changes are used, +with the same evidence and fix a pull request would carry: which advisories it +closes, where the code that breaks lives (including which workspace, in a +monorepo), and either the exact command for a safe upgrade or the +deterministic fix Drift will make once approved. On by default; turn it off +with `codeScanning.enabled: false`. Rescanning replaces a package's alert +rather than piling up a new one — GitHub retires an alert on its own once the +finding that produced it stops reappearing in a later run. + +To also get alerted about dependencies nobody has bumped yet — not just what +changed in the last push — copy +[`examples/workflows/drift-outdated.yml`](examples/workflows/drift-outdated.yml) +and set `outdated.enabled: true`. See [configuration.md](docs/configuration.md#code-scanning). + --- ## Try it with zero permissions diff --git a/SECURITY.md b/SECURITY.md index 3067440..9cba27e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,17 +2,25 @@ Please do not report security vulnerabilities through public GitHub issues. -Use GitHub's private vulnerability reporting for this repository (**Security → -Report a vulnerability**), or open a draft security advisory directly. +Use GitHub’s private vulnerability reporting (Security → Report a vulnerability) or submit a report directly at: -Include, if you can: + -- the affected Drift surface (CLI, GitHub Action, webhook server, or VS Code - extension) and version or commit; -- the security boundary you believe can be bypassed; -- reproduction steps; -- the impact you believe is possible. +## What to include -We will coordinate disclosure with you before publishing details. See -[docs/trust-and-safety.md](docs/trust-and-safety.md) for the threat model this -project already documents against itself. +If possible, include: + +* the affected Drift surface (CLI, GitHub Action, webhook server, or VS Code extension) and version or commit; +* the security boundary you believe can be bypassed; +* reproduction steps; +* the impact you believe is possible. + +## Response and disclosure + +We aim to acknowledge vulnerability reports within 7 days and coordinate disclosure with the reporter. + +We generally target disclosure within 90 days, depending on severity and remediation complexity. + +Please do not publicly disclose a vulnerability before we have had a reasonable opportunity to investigate and address it. + +See docs/trust-and-safety.md for the threat model Drift documents against itself. diff --git a/action.yml b/action.yml index 38d3de9..3ddfc9e 100644 --- a/action.yml +++ b/action.yml @@ -57,6 +57,27 @@ inputs: description: 'Path to the Drift config file. Default: .github/drift.yml' required: false + scan-mode: + description: >- + "diff" (default) analyses the push that triggered this run, the same as + leaving this unset. "outdated" instead scans every installed + dependency against its registry — the same check `drift outdated` runs + locally — and alerts on what it finds via code scanning, regardless of + any push. Runs automatically on a `schedule` trigger without needing + this input; set it to trigger the same scan from `workflow_dispatch`. + Requires `outdated.enabled: true` in drift.yml. + required: false + + alert-granularity: + description: >- + How code scanning alerts are grouped: "package" (default) files one + alert per dependency, folding every breaking change it caused into a + single alert body. "breakingChange" instead opens one alert per + breaking change. "affectedSite" goes one step further and opens one + alert per individual call site affected. Overrides + `codeScanning.granularity` in drift.yml. + required: false + log-level: description: 'debug | info | warn | error' required: false @@ -64,7 +85,9 @@ inputs: outputs: status: - description: 'dispatched | skipped | blocked | failed' + description: >- + dispatched | skipped | blocked | failed. On `scan-mode: outdated`, always + `skipped` or `failed` — that mode only alerts, it never dispatches. summary: description: 'One-line summary of what Drift did' branch: diff --git a/action/index.cjs b/action/index.cjs index bddd191..503b3fe 100644 --- a/action/index.cjs +++ b/action/index.cjs @@ -1,74 +1,74 @@ -"use strict";var Tx=Object.create;var ol=Object.defineProperty;var xx=Object.getOwnPropertyDescriptor;var $x=Object.getOwnPropertyNames;var Rx=Object.getPrototypeOf,Ax=Object.prototype.hasOwnProperty;var B=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var E=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},al=(t,e)=>{for(var n in e)ol(t,n,{get:e[n],enumerable:!0})},Cx=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of $x(e))!Ax.call(t,s)&&s!==n&&ol(t,s,{get:()=>e[s],enumerable:!(r=xx(e,s))||r.enumerable});return t};var vt=(t,e,n)=>(n=t!=null?Tx(Rx(t)):{},Cx(e||!t||!t.__esModule?ol(n,"default",{value:t,enumerable:!0}):n,t));var Q=E(Re=>{"use strict";var cl=Symbol.for("yaml.alias"),um=Symbol.for("yaml.document"),Ro=Symbol.for("yaml.map"),dm=Symbol.for("yaml.pair"),ll=Symbol.for("yaml.scalar"),Ao=Symbol.for("yaml.seq"),Nt=Symbol.for("yaml.node.type"),Px=t=>!!t&&typeof t=="object"&&t[Nt]===cl,Ox=t=>!!t&&typeof t=="object"&&t[Nt]===um,Ix=t=>!!t&&typeof t=="object"&&t[Nt]===Ro,Dx=t=>!!t&&typeof t=="object"&&t[Nt]===dm,pm=t=>!!t&&typeof t=="object"&&t[Nt]===ll,Mx=t=>!!t&&typeof t=="object"&&t[Nt]===Ao;function fm(t){if(t&&typeof t=="object")switch(t[Nt]){case Ro:case Ao:return!0}return!1}function Nx(t){if(t&&typeof t=="object")switch(t[Nt]){case cl:case Ro:case ll:case Ao:return!0}return!1}var Lx=t=>(pm(t)||fm(t))&&!!t.anchor;Re.ALIAS=cl;Re.DOC=um;Re.MAP=Ro;Re.NODE_TYPE=Nt;Re.PAIR=dm;Re.SCALAR=ll;Re.SEQ=Ao;Re.hasAnchor=Lx;Re.isAlias=Px;Re.isCollection=fm;Re.isDocument=Ox;Re.isMap=Ix;Re.isNode=Nx;Re.isPair=Dx;Re.isScalar=pm;Re.isSeq=Mx});var Vs=E(ul=>{"use strict";var ke=Q(),je=Symbol("break visit"),mm=Symbol("skip children"),kt=Symbol("remove node");function Co(t,e){let n=gm(e);ke.isDocument(t)?Nr(null,t.contents,n,Object.freeze([t]))===kt&&(t.contents=null):Nr(null,t,n,Object.freeze([]))}Co.BREAK=je;Co.SKIP=mm;Co.REMOVE=kt;function Nr(t,e,n,r){let s=hm(t,e,n,r);if(ke.isNode(s)||ke.isPair(s))return ym(t,r,s),Nr(t,s,n,r);if(typeof s!="symbol"){if(ke.isCollection(e)){r=Object.freeze(r.concat(e));for(let i=0;i{"use strict";var bm=Q(),Gx=Vs(),jx={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},Fx=t=>t.replace(/[!,[\]{}]/g,e=>jx[e]),Ws=class t{constructor(e,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,e),this.tags=Object.assign({},t.defaultTags,n)}clone(){let e=new t(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){let e=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return e}add(e,n){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let r=e.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(e,n){if(e==="!")return"!";if(e[0]!=="!")return n(`Not a valid tag: ${e}`),null;if(e[1]==="<"){let o=e.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=e.match(/^(.*!)([^!]*)$/s);s||n(`The ${e} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?e:(n(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[n,r]of Object.entries(this.tags))if(e.startsWith(r))return n+Fx(e.substring(r.length));return e[0]==="!"?e:`!<${e}>`}toString(e){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(e&&r.length>0&&bm.isNode(e.contents)){let i={};Gx.visit(e.contents,(o,a)=>{bm.isNode(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!e||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(` -`)}};Ws.defaultYaml={explicit:!1,version:"1.2"};Ws.defaultTags={"!!":"tag:yaml.org,2002:"};wm.Directives=Ws});var Oo=E(zs=>{"use strict";var vm=Q(),qx=Vs();function Ux(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let n=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(n)}return!0}function km(t){let e=new Set;return qx.visit(t,{Value(n,r){r.anchor&&e.add(r.anchor)}}),e}function Em(t,e){for(let n=1;;++n){let r=`${t}${n}`;if(!e.has(r))return r}}function Bx(t,e){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=km(t));let o=Em(e,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(vm.isScalar(o.node)||vm.isCollection(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}zs.anchorIsValid=Ux;zs.anchorNames=km;zs.createNodeAnchors=Bx;zs.findNewAnchor=Em});var pl=E(Sm=>{"use strict";function Hs(t,e,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s{"use strict";var Vx=Q();function _m(t,e,n){if(Array.isArray(t))return t.map((r,s)=>_m(r,String(s),n));if(t&&typeof t.toJSON=="function"){if(!n||!Vx.hasAnchor(t))return t.toJSON(e,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(t,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=t.toJSON(e,n);return n.onCreate&&n.onCreate(s),s}return typeof t=="bigint"&&!n?.keep?Number(t):t}Tm.toJS=_m});var Io=E($m=>{"use strict";var Wx=pl(),xm=Q(),zx=Xt(),fl=class{constructor(e){Object.defineProperty(this,xm.NODE_TYPE,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!xm.isDocument(e))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:e,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=zx.toJS(this,"",o);if(typeof s=="function")for(let{count:c,res:l}of o.anchors.values())s(l,c);return typeof i=="function"?Wx.applyReviver(i,{"":a},"",a):a}};$m.NodeBase=fl});var Ks=E(Rm=>{"use strict";var Hx=Oo(),Kx=Vs(),Gr=Q(),Jx=Io(),Yx=Xt(),ml=class extends Jx.NodeBase{constructor(e){super(Gr.ALIAS),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],Kx.visit(e,{Node:(i,o)=>{(Gr.isAlias(o)||Gr.hasAnchor(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(e,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let c=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(c)}let a=r.get(o);if(a||(Yx.toJS(o,null,n),a=r.get(o)),a?.res===void 0){let c="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(c)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Do(s,o,r)),a.count*a.aliasCount>i)){let c="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(c)}return a.res}toString(e,n,r){let s=`*${this.source}`;if(e){if(Hx.anchorIsValid(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let i=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(i)}if(e.implicitKey)return`${s} `}return s}};function Do(t,e,n){if(Gr.isAlias(e)){let r=e.resolve(t),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(Gr.isCollection(e)){let r=0;for(let s of e.items){let i=Do(t,s,n);i>r&&(r=i)}return r}else if(Gr.isPair(e)){let r=Do(t,e.key,n),s=Do(t,e.value,n);return Math.max(r,s)}return 1}Rm.Alias=ml});var ve=E(gl=>{"use strict";var Zx=Q(),Xx=Io(),Qx=Xt(),e0=t=>!t||typeof t!="function"&&typeof t!="object",Qt=class extends Xx.NodeBase{constructor(e){super(Zx.SCALAR),this.value=e}toJSON(e,n){return n?.keep?this.value:Qx.toJS(this.value,e,n)}toString(){return String(this.value)}};Qt.BLOCK_FOLDED="BLOCK_FOLDED";Qt.BLOCK_LITERAL="BLOCK_LITERAL";Qt.PLAIN="PLAIN";Qt.QUOTE_DOUBLE="QUOTE_DOUBLE";Qt.QUOTE_SINGLE="QUOTE_SINGLE";gl.Scalar=Qt;gl.isScalarValue=e0});var Js=E(Cm=>{"use strict";var t0=Ks(),Mn=Q(),Am=ve(),n0="tag:yaml.org,2002:";function r0(t,e,n){if(e){let r=n.filter(i=>i.tag===e),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${e} not found`);return s}return n.find(r=>r.identify?.(t)&&!r.format)}function s0(t,e,n){if(Mn.isDocument(t)&&(t=t.contents),Mn.isNode(t))return t;if(Mn.isPair(t)){let d=n.schema[Mn.MAP].createNode?.(n.schema,null,n);return d.items.push(t),d}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,c;if(r&&t&&typeof t=="object"){if(c=a.get(t),c)return c.anchor??(c.anchor=s(t)),new t0.Alias(c.anchor);c={anchor:null,node:null},a.set(t,c)}e?.startsWith("!!")&&(e=n0+e.slice(2));let l=r0(t,e,o.tags);if(!l){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let d=new Am.Scalar(t);return c&&(c.node=d),d}l=t instanceof Map?o[Mn.MAP]:Symbol.iterator in Object(t)?o[Mn.SEQ]:o[Mn.MAP]}i&&(i(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,t,n):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(n.schema,t,n):new Am.Scalar(t);return e?u.tag=e:l.default||(u.tag=l.tag),c&&(c.node=u),u}Cm.createNode=s0});var No=E(Mo=>{"use strict";var i0=Js(),Et=Q(),o0=Io();function hl(t,e,n){let r=n;for(let s=e.length-1;s>=0;--s){let i=e[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return i0.createNode(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var Pm=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,yl=class extends o0.NodeBase{constructor(e,n){super(e),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(e){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(n.schema=e),n.items=n.items.map(r=>Et.isNode(r)||Et.isPair(r)?r.clone(e):r),this.range&&(n.range=this.range.slice()),n}addIn(e,n){if(Pm(e))this.add(n);else{let[r,...s]=e,i=this.get(r,!0);if(Et.isCollection(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,hl(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(e){let[n,...r]=e;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(Et.isCollection(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(e,n){let[r,...s]=e,i=this.get(r,!0);return s.length===0?!n&&Et.isScalar(i)?i.value:i:Et.isCollection(i)?i.getIn(s,n):void 0}hasAllNullValues(e){return this.items.every(n=>{if(!Et.isPair(n))return!1;let r=n.value;return r==null||e&&Et.isScalar(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(e){let[n,...r]=e;if(r.length===0)return this.has(n);let s=this.get(n,!0);return Et.isCollection(s)?s.hasIn(r):!1}setIn(e,n){let[r,...s]=e;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(Et.isCollection(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,hl(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};Mo.Collection=yl;Mo.collectionFromPath=hl;Mo.isEmptyPath=Pm});var Ys=E(Lo=>{"use strict";var a0=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function bl(t,e){return/^\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var c0=(t,e,n)=>t.endsWith(` -`)?bl(n,e):n.includes(` +"use strict";var f$=Object.create;var Al=Object.defineProperty;var m$=Object.getOwnPropertyDescriptor;var g$=Object.getOwnPropertyNames;var h$=Object.getPrototypeOf,y$=Object.prototype.hasOwnProperty;var W=(t,e,n)=>()=>{if(n)throw n[0];try{return t&&(e=t(t=0)),e}catch(r){throw n=[r],r}};var E=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}},Pl=(t,e)=>{for(var n in e)Al(t,n,{get:e[n],enumerable:!0})},b$=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of g$(e))!y$.call(t,s)&&s!==n&&Al(t,s,{get:()=>e[s],enumerable:!(r=m$(e,s))||r.enumerable});return t};var mt=(t,e,n)=>(n=t!=null?f$(h$(t)):{},b$(e||!t||!t.__esModule?Al(n,"default",{value:t,enumerable:!0}):n,t));var re=E(Oe=>{"use strict";var Il=Symbol.for("yaml.alias"),jm=Symbol.for("yaml.document"),Go=Symbol.for("yaml.map"),qm=Symbol.for("yaml.pair"),Ol=Symbol.for("yaml.scalar"),Fo=Symbol.for("yaml.seq"),Gt=Symbol.for("yaml.node.type"),w$=t=>!!t&&typeof t=="object"&&t[Gt]===Il,v$=t=>!!t&&typeof t=="object"&&t[Gt]===jm,k$=t=>!!t&&typeof t=="object"&&t[Gt]===Go,E$=t=>!!t&&typeof t=="object"&&t[Gt]===qm,Um=t=>!!t&&typeof t=="object"&&t[Gt]===Ol,S$=t=>!!t&&typeof t=="object"&&t[Gt]===Fo;function Bm(t){if(t&&typeof t=="object")switch(t[Gt]){case Go:case Fo:return!0}return!1}function x$(t){if(t&&typeof t=="object")switch(t[Gt]){case Il:case Go:case Ol:case Fo:return!0}return!1}var T$=t=>(Um(t)||Bm(t))&&!!t.anchor;Oe.ALIAS=Il;Oe.DOC=jm;Oe.MAP=Go;Oe.NODE_TYPE=Gt;Oe.PAIR=qm;Oe.SCALAR=Ol;Oe.SEQ=Fo;Oe.hasAnchor=T$;Oe.isAlias=w$;Oe.isCollection=Bm;Oe.isDocument=v$;Oe.isMap=k$;Oe.isNode=x$;Oe.isPair=E$;Oe.isScalar=Um;Oe.isSeq=S$});var Zs=E(Dl=>{"use strict";var _e=re(),qe=Symbol("break visit"),Vm=Symbol("skip children"),xt=Symbol("remove node");function jo(t,e){let n=Wm(e);_e.isDocument(t)?Br(null,t.contents,n,Object.freeze([t]))===xt&&(t.contents=null):Br(null,t,n,Object.freeze([]))}jo.BREAK=qe;jo.SKIP=Vm;jo.REMOVE=xt;function Br(t,e,n,r){let s=zm(t,e,n,r);if(_e.isNode(s)||_e.isPair(s))return Hm(t,r,s),Br(t,s,n,r);if(typeof s!="symbol"){if(_e.isCollection(e)){r=Object.freeze(r.concat(e));for(let i=0;i{"use strict";var Km=re(),_$=Zs(),$$={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},R$=t=>t.replace(/[!,[\]{}]/g,e=>$$[e]),Xs=class t{constructor(e,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,e),this.tags=Object.assign({},t.defaultTags,n)}clone(){let e=new t(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){let e=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return e}add(e,n){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let r=e.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(e,n){if(e==="!")return"!";if(e[0]!=="!")return n(`Not a valid tag: ${e}`),null;if(e[1]==="<"){let o=e.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=e.match(/^(.*!)([^!]*)$/s);s||n(`The ${e} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?e:(n(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[n,r]of Object.entries(this.tags))if(e.startsWith(r))return n+R$(e.substring(r.length));return e[0]==="!"?e:`!<${e}>`}toString(e){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(e&&r.length>0&&Km.isNode(e.contents)){let i={};_$.visit(e.contents,(o,a)=>{Km.isNode(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!e||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(` +`)}};Xs.defaultYaml={explicit:!1,version:"1.2"};Xs.defaultTags={"!!":"tag:yaml.org,2002:"};Jm.Directives=Xs});var Uo=E(Qs=>{"use strict";var Ym=re(),C$=Zs();function A$(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let n=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(n)}return!0}function Zm(t){let e=new Set;return C$.visit(t,{Value(n,r){r.anchor&&e.add(r.anchor)}}),e}function Xm(t,e){for(let n=1;;++n){let r=`${t}${n}`;if(!e.has(r))return r}}function P$(t,e){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Zm(t));let o=Xm(e,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(Ym.isScalar(o.node)||Ym.isCollection(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}Qs.anchorIsValid=A$;Qs.anchorNames=Zm;Qs.createNodeAnchors=P$;Qs.findNewAnchor=Xm});var Nl=E(Qm=>{"use strict";function ei(t,e,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s{"use strict";var I$=re();function eg(t,e,n){if(Array.isArray(t))return t.map((r,s)=>eg(r,String(s),n));if(t&&typeof t.toJSON=="function"){if(!n||!I$.hasAnchor(t))return t.toJSON(e,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(t,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=t.toJSON(e,n);return n.onCreate&&n.onCreate(s),s}return typeof t=="bigint"&&!n?.keep?Number(t):t}tg.toJS=eg});var Bo=E(rg=>{"use strict";var O$=Nl(),ng=re(),D$=en(),Ll=class{constructor(e){Object.defineProperty(this,ng.NODE_TYPE,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!ng.isDocument(e))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:e,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=D$.toJS(this,"",o);if(typeof s=="function")for(let{count:c,res:l}of o.anchors.values())s(l,c);return typeof i=="function"?O$.applyReviver(i,{"":a},"",a):a}};rg.NodeBase=Ll});var ti=E(sg=>{"use strict";var M$=Uo(),N$=Zs(),Wr=re(),L$=Bo(),G$=en(),Gl=class extends L$.NodeBase{constructor(e){super(Wr.ALIAS),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],N$.visit(e,{Node:(i,o)=>{(Wr.isAlias(o)||Wr.hasAnchor(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(e,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let c=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(c)}let a=r.get(o);if(a||(G$.toJS(o,null,n),a=r.get(o)),a?.res===void 0){let c="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(c)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Vo(s,o,r)),a.count*a.aliasCount>i)){let c="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(c)}return a.res}toString(e,n,r){let s=`*${this.source}`;if(e){if(M$.anchorIsValid(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let i=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(i)}if(e.implicitKey)return`${s} `}return s}};function Vo(t,e,n){if(Wr.isAlias(e)){let r=e.resolve(t),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(Wr.isCollection(e)){let r=0;for(let s of e.items){let i=Vo(t,s,n);i>r&&(r=i)}return r}else if(Wr.isPair(e)){let r=Vo(t,e.key,n),s=Vo(t,e.value,n);return Math.max(r,s)}return 1}sg.Alias=Gl});var xe=E(Fl=>{"use strict";var F$=re(),j$=Bo(),q$=en(),U$=t=>!t||typeof t!="function"&&typeof t!="object",tn=class extends j$.NodeBase{constructor(e){super(F$.SCALAR),this.value=e}toJSON(e,n){return n?.keep?this.value:q$.toJS(this.value,e,n)}toString(){return String(this.value)}};tn.BLOCK_FOLDED="BLOCK_FOLDED";tn.BLOCK_LITERAL="BLOCK_LITERAL";tn.PLAIN="PLAIN";tn.QUOTE_DOUBLE="QUOTE_DOUBLE";tn.QUOTE_SINGLE="QUOTE_SINGLE";Fl.Scalar=tn;Fl.isScalarValue=U$});var ni=E(og=>{"use strict";var B$=ti(),Fn=re(),ig=xe(),V$="tag:yaml.org,2002:";function W$(t,e,n){if(e){let r=n.filter(i=>i.tag===e),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${e} not found`);return s}return n.find(r=>r.identify?.(t)&&!r.format)}function z$(t,e,n){if(Fn.isDocument(t)&&(t=t.contents),Fn.isNode(t))return t;if(Fn.isPair(t)){let d=n.schema[Fn.MAP].createNode?.(n.schema,null,n);return d.items.push(t),d}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,c;if(r&&t&&typeof t=="object"){if(c=a.get(t),c)return c.anchor??(c.anchor=s(t)),new B$.Alias(c.anchor);c={anchor:null,node:null},a.set(t,c)}e?.startsWith("!!")&&(e=V$+e.slice(2));let l=W$(t,e,o.tags);if(!l){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let d=new ig.Scalar(t);return c&&(c.node=d),d}l=t instanceof Map?o[Fn.MAP]:Symbol.iterator in Object(t)?o[Fn.SEQ]:o[Fn.MAP]}i&&(i(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,t,n):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(n.schema,t,n):new ig.Scalar(t);return e?u.tag=e:l.default||(u.tag=l.tag),c&&(c.node=u),u}og.createNode=z$});var zo=E(Wo=>{"use strict";var H$=ni(),Tt=re(),K$=Bo();function jl(t,e,n){let r=n;for(let s=e.length-1;s>=0;--s){let i=e[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return H$.createNode(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var ag=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,ql=class extends K$.NodeBase{constructor(e,n){super(e),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(e){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(n.schema=e),n.items=n.items.map(r=>Tt.isNode(r)||Tt.isPair(r)?r.clone(e):r),this.range&&(n.range=this.range.slice()),n}addIn(e,n){if(ag(e))this.add(n);else{let[r,...s]=e,i=this.get(r,!0);if(Tt.isCollection(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,jl(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(e){let[n,...r]=e;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(Tt.isCollection(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(e,n){let[r,...s]=e,i=this.get(r,!0);return s.length===0?!n&&Tt.isScalar(i)?i.value:i:Tt.isCollection(i)?i.getIn(s,n):void 0}hasAllNullValues(e){return this.items.every(n=>{if(!Tt.isPair(n))return!1;let r=n.value;return r==null||e&&Tt.isScalar(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(e){let[n,...r]=e;if(r.length===0)return this.has(n);let s=this.get(n,!0);return Tt.isCollection(s)?s.hasIn(r):!1}setIn(e,n){let[r,...s]=e;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(Tt.isCollection(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,jl(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};Wo.Collection=ql;Wo.collectionFromPath=jl;Wo.isEmptyPath=ag});var ri=E(Ho=>{"use strict";var J$=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function Ul(t,e){return/^\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var Y$=(t,e,n)=>t.endsWith(` +`)?Ul(n,e):n.includes(` `)?` -`+bl(n,e):(t.endsWith(" ")?"":" ")+n;Lo.indentComment=bl;Lo.lineComment=c0;Lo.stringifyComment=a0});var Im=E(Zs=>{"use strict";var l0="flow",wl="block",Go="quoted";function u0(t,e,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return t;ss-Math.max(2,i)?l.push(0):d=s-r);let p,f,m=!1,g=-1,h=-1,y=-1;n===wl&&(g=Om(t,g,e.length),g!==-1&&(d=g+c));for(let S;S=t[g+=1];){if(n===Go&&S==="\\"){switch(h=g,t[g+1]){case"x":g+=3;break;case"u":g+=5;break;case"U":g+=9;break;default:g+=1}y=g}if(S===` -`)n===wl&&(g=Om(t,g,e.length)),d=g+e.length+c,p=void 0;else{if(S===" "&&f&&f!==" "&&f!==` -`&&f!==" "){let v=t[g+1];v&&v!==" "&&v!==` -`&&v!==" "&&(p=g)}if(g>=d)if(p)l.push(p),d=p+c,p=void 0;else if(n===Go){for(;f===" "||f===" ";)f=S,S=t[g+=1],m=!0;let v=g>y+1?g-2:h-1;if(u[v])return t;l.push(v),u[v]=!0,d=v+c,p=void 0}else m=!0}f=S}if(m&&a&&a(),l.length===0)return t;o&&o();let w=t.slice(0,l[0]);for(let S=0;S{"use strict";var dt=ve(),en=Im(),Fo=(t,e)=>({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),qo=t=>/^(%|---|\.\.\.)/m.test(t);function d0(t,e,n){if(!e||e<0)return!1;let r=e-n,s=t.length;if(s<=r)return!1;for(let i=0,o=0;ir)return!0;if(o=i+1,s-o<=r)return!1}return!0}function Xs(t,e){let n=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=e,s=e.options.doubleQuotedMinMultiLineLength,i=e.indent||(qo(t)?" ":""),o="",a=0;for(let c=0,l=n[c];l;l=n[++c])if(l===" "&&n[c+1]==="\\"&&n[c+2]==="n"&&(o+=n.slice(a,c)+"\\ ",c+=1,a=c,l="\\"),l==="\\")switch(n[c+1]){case"u":{o+=n.slice(a,c);let u=n.substr(c+2,4);switch(u){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:u.substr(0,2)==="00"?o+="\\x"+u.substr(2):o+=n.substr(c,6)}c+=5,a=c+1}break;case"n":if(r||n[c+2]==='"'||n.length{"use strict";var Z$="flow",Bl="block",Ko="quoted";function X$(t,e,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return t;ss-Math.max(2,i)?l.push(0):d=s-r);let p,f,m=!1,g=-1,h=-1,y=-1;n===Bl&&(g=cg(t,g,e.length),g!==-1&&(d=g+c));for(let S;S=t[g+=1];){if(n===Ko&&S==="\\"){switch(h=g,t[g+1]){case"x":g+=3;break;case"u":g+=5;break;case"U":g+=9;break;default:g+=1}y=g}if(S===` +`)n===Bl&&(g=cg(t,g,e.length)),d=g+e.length+c,p=void 0;else{if(S===" "&&f&&f!==" "&&f!==` +`&&f!==" "){let b=t[g+1];b&&b!==" "&&b!==` +`&&b!==" "&&(p=g)}if(g>=d)if(p)l.push(p),d=p+c,p=void 0;else if(n===Ko){for(;f===" "||f===" ";)f=S,S=t[g+=1],m=!0;let b=g>y+1?g-2:h-1;if(u[b])return t;l.push(b),u[b]=!0,d=b+c,p=void 0}else m=!0}f=S}if(m&&a&&a(),l.length===0)return t;o&&o();let w=t.slice(0,l[0]);for(let S=0;S{"use strict";var gt=xe(),nn=lg(),Yo=(t,e)=>({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),Zo=t=>/^(%|---|\.\.\.)/m.test(t);function Q$(t,e,n){if(!e||e<0)return!1;let r=e-n,s=t.length;if(s<=r)return!1;for(let i=0,o=0;ir)return!0;if(o=i+1,s-o<=r)return!1}return!0}function ii(t,e){let n=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=e,s=e.options.doubleQuotedMinMultiLineLength,i=e.indent||(Zo(t)?" ":""),o="",a=0;for(let c=0,l=n[c];l;l=n[++c])if(l===" "&&n[c+1]==="\\"&&n[c+2]==="n"&&(o+=n.slice(a,c)+"\\ ",c+=1,a=c,l="\\"),l==="\\")switch(n[c+1]){case"u":{o+=n.slice(a,c);let u=n.substr(c+2,4);switch(u){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:u.substr(0,2)==="00"?o+="\\x"+u.substr(2):o+=n.substr(c,6)}c+=5,a=c+1}break;case"n":if(r||n[c+2]==='"'||n.length `;let d,p;for(p=n.length;p>0;--p){let k=n[p-1];if(k!==` `&&k!==" "&&k!==" ")break}let f=n.substring(p),m=f.indexOf(` `);m===-1?d="-":n===f||m!==f.length-1?(d="+",i&&i()):d="",f&&(n=n.slice(0,-f.length),f[f.length-1]===` -`&&(f=f.slice(0,-1)),f=f.replace(kl,`$&${l}`));let g=!1,h,y=-1;for(h=0;h{$=!0});let _=en.foldFlowLines(`${w}${k}${f}`,l,en.FOLD_BLOCK,F);if(!$)return`>${v} -${l}${_}`}return n=n.replace(/\n+/g,`$&${l}`),`|${v} -${l}${w}${n}${f}`}function p0(t,e,n,r){let{type:s,value:i}=t,{actualString:o,implicitKey:a,indent:c,indentStep:l,inFlow:u}=e;if(a&&i.includes(` -`)||u&&/[[\]{},]/.test(i))return jr(i,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(` -`)?jr(i,e):jo(t,e,n,r);if(!a&&!u&&s!==dt.Scalar.PLAIN&&i.includes(` -`))return jo(t,e,n,r);if(qo(i)){if(c==="")return e.forceBlockIndent=!0,jo(t,e,n,r);if(a&&c===l)return jr(i,e)}let d=i.replace(/\n+/g,`$& -${c}`);if(o){let p=g=>g.default&&g.tag!=="tag:yaml.org,2002:str"&&g.test?.test(d),{compat:f,tags:m}=e.doc.schema;if(m.some(p)||f?.some(p))return jr(i,e)}return a?d:en.foldFlowLines(d,c,en.FOLD_FLOW,Fo(e,!1))}function f0(t,e,n,r){let{implicitKey:s,inFlow:i}=e,o=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:a}=t;a!==dt.Scalar.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=dt.Scalar.QUOTE_DOUBLE);let c=u=>{switch(u){case dt.Scalar.BLOCK_FOLDED:case dt.Scalar.BLOCK_LITERAL:return s||i?jr(o.value,e):jo(o,e,n,r);case dt.Scalar.QUOTE_DOUBLE:return Xs(o.value,e);case dt.Scalar.QUOTE_SINGLE:return vl(o.value,e);case dt.Scalar.PLAIN:return p0(o,e,n,r);default:return null}},l=c(a);if(l===null){let{defaultKeyType:u,defaultStringType:d}=e.options,p=s&&u||d;if(l=c(p),l===null)throw new Error(`Unsupported default string type ${p}`)}return l}Dm.stringifyString=f0});var ei=E(El=>{"use strict";var m0=Oo(),tn=Q(),g0=Ys(),h0=Qs();function y0(t,e){let n=Object.assign({blockQuote:!0,commentString:g0.stringifyComment,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,e),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:t,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function b0(t,e){if(e.tag){let s=t.filter(i=>i.tag===e.tag);if(s.length>0)return s.find(i=>i.format===e.format)??s[0]}let n,r;if(tn.isScalar(e)){r=e.value;let s=t.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===e.format)??s.find(i=>!i.format)}else r=e,n=t.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function w0(t,e,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(tn.isScalar(t)||tn.isCollection(t))&&t.anchor;i&&m0.anchorIsValid(i)&&(n.add(i),s.push(`&${i}`));let o=t.tag??(e.default?null:e.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function v0(t,e,n,r){if(tn.isPair(t))return t.toString(e,n,r);if(tn.isAlias(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let s,i=tn.isNode(t)?t:e.doc.createNode(t,{onTagObj:c=>s=c});s??(s=b0(e.doc.schema.tags,i));let o=w0(i,s,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,e,n,r):tn.isScalar(i)?h0.stringifyString(i,e,n,r):i.toString(e,n,r);return o?tn.isScalar(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o} -${e.indent}${a}`:a}El.createStringifyContext=y0;El.stringify=v0});var Gm=E(Lm=>{"use strict";var Lt=Q(),Mm=ve(),Nm=ei(),ti=Ys();function k0({key:t,value:e},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:c,options:{commentString:l,indentSeq:u,simpleKeys:d}}=n,p=Lt.isNode(t)&&t.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(Lt.isCollection(t)||!Lt.isNode(t)&&typeof t=="object"){let F="With simple keys, collection cannot be used as a key value";throw new Error(F)}}let f=!d&&(!t||p&&e==null&&!n.inFlow||Lt.isCollection(t)||(Lt.isScalar(t)?t.type===Mm.Scalar.BLOCK_FOLDED||t.type===Mm.Scalar.BLOCK_LITERAL:typeof t=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!f&&(d||!i),indent:a+c});let m=!1,g=!1,h=Nm.stringify(t,n,()=>m=!0,()=>g=!0);if(!f&&!n.inFlow&&h.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");f=!0}if(n.inFlow){if(i||e==null)return m&&r&&r(),h===""?"?":f?`? ${h}`:h}else if(i&&!d||e==null&&f)return h=`? ${h}`,p&&!m?h+=ti.lineComment(h,n.indent,l(p)):g&&s&&s(),h;m&&(p=null),f?(p&&(h+=ti.lineComment(h,n.indent,l(p))),h=`? ${h} -${a}:`):(h=`${h}:`,p&&(h+=ti.lineComment(h,n.indent,l(p))));let y,w,S;Lt.isNode(e)?(y=!!e.spaceBefore,w=e.commentBefore,S=e.comment):(y=!1,w=null,S=null,e&&typeof e=="object"&&(e=o.createNode(e))),n.implicitKey=!1,!f&&!p&&Lt.isScalar(e)&&(n.indentAtStart=h.length+1),g=!1,!u&&c.length>=2&&!n.inFlow&&!f&&Lt.isSeq(e)&&!e.flow&&!e.tag&&!e.anchor&&(n.indent=n.indent.substring(2));let v=!1,k=Nm.stringify(e,n,()=>v=!0,()=>g=!0),$=" ";if(p||y||w){if($=y?` -`:"",w){let F=l(w);$+=` -${ti.indentComment(F,n.indent)}`}k===""&&!n.inFlow?$===` -`&&S&&($=` - -`):$+=` -${n.indent}`}else if(!f&&Lt.isCollection(e)){let F=k[0],_=k.indexOf(` -`),ne=_!==-1,ie=n.inFlow??e.flow??e.items.length===0;if(ne||!ie){let Me=!1;if(ne&&(F==="&"||F==="!")){let re=k.indexOf(" ");F==="&"&&re!==-1&&re<_&&k[re+1]==="!"&&(re=k.indexOf(" ",re+1)),(re===-1||_{_=!0});let T=nn.foldFlowLines(`${w}${k}${f}`,l,nn.FOLD_BLOCK,G);if(!_)return`>${b} +${l}${T}`}return n=n.replace(/\n+/g,`$&${l}`),`|${b} +${l}${w}${n}${f}`}function e0(t,e,n,r){let{type:s,value:i}=t,{actualString:o,implicitKey:a,indent:c,indentStep:l,inFlow:u}=e;if(a&&i.includes(` +`)||u&&/[[\]{},]/.test(i))return zr(i,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(` +`)?zr(i,e):Jo(t,e,n,r);if(!a&&!u&&s!==gt.Scalar.PLAIN&&i.includes(` +`))return Jo(t,e,n,r);if(Zo(i)){if(c==="")return e.forceBlockIndent=!0,Jo(t,e,n,r);if(a&&c===l)return zr(i,e)}let d=i.replace(/\n+/g,`$& +${c}`);if(o){let p=g=>g.default&&g.tag!=="tag:yaml.org,2002:str"&&g.test?.test(d),{compat:f,tags:m}=e.doc.schema;if(m.some(p)||f?.some(p))return zr(i,e)}return a?d:nn.foldFlowLines(d,c,nn.FOLD_FLOW,Yo(e,!1))}function t0(t,e,n,r){let{implicitKey:s,inFlow:i}=e,o=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:a}=t;a!==gt.Scalar.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=gt.Scalar.QUOTE_DOUBLE);let c=u=>{switch(u){case gt.Scalar.BLOCK_FOLDED:case gt.Scalar.BLOCK_LITERAL:return s||i?zr(o.value,e):Jo(o,e,n,r);case gt.Scalar.QUOTE_DOUBLE:return ii(o.value,e);case gt.Scalar.QUOTE_SINGLE:return Vl(o.value,e);case gt.Scalar.PLAIN:return e0(o,e,n,r);default:return null}},l=c(a);if(l===null){let{defaultKeyType:u,defaultStringType:d}=e.options,p=s&&u||d;if(l=c(p),l===null)throw new Error(`Unsupported default string type ${p}`)}return l}ug.stringifyString=t0});var ai=E(zl=>{"use strict";var n0=Uo(),rn=re(),r0=ri(),s0=oi();function i0(t,e){let n=Object.assign({blockQuote:!0,commentString:r0.stringifyComment,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,e),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:t,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function o0(t,e){if(e.tag){let s=t.filter(i=>i.tag===e.tag);if(s.length>0)return s.find(i=>i.format===e.format)??s[0]}let n,r;if(rn.isScalar(e)){r=e.value;let s=t.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===e.format)??s.find(i=>!i.format)}else r=e,n=t.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function a0(t,e,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(rn.isScalar(t)||rn.isCollection(t))&&t.anchor;i&&n0.anchorIsValid(i)&&(n.add(i),s.push(`&${i}`));let o=t.tag??(e.default?null:e.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function c0(t,e,n,r){if(rn.isPair(t))return t.toString(e,n,r);if(rn.isAlias(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let s,i=rn.isNode(t)?t:e.doc.createNode(t,{onTagObj:c=>s=c});s??(s=o0(e.doc.schema.tags,i));let o=a0(i,s,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,e,n,r):rn.isScalar(i)?s0.stringifyString(i,e,n,r):i.toString(e,n,r);return o?rn.isScalar(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o} +${e.indent}${a}`:a}zl.createStringifyContext=i0;zl.stringify=c0});var mg=E(fg=>{"use strict";var Ft=re(),dg=xe(),pg=ai(),ci=ri();function l0({key:t,value:e},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:c,options:{commentString:l,indentSeq:u,simpleKeys:d}}=n,p=Ft.isNode(t)&&t.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(Ft.isCollection(t)||!Ft.isNode(t)&&typeof t=="object"){let G="With simple keys, collection cannot be used as a key value";throw new Error(G)}}let f=!d&&(!t||p&&e==null&&!n.inFlow||Ft.isCollection(t)||(Ft.isScalar(t)?t.type===dg.Scalar.BLOCK_FOLDED||t.type===dg.Scalar.BLOCK_LITERAL:typeof t=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!f&&(d||!i),indent:a+c});let m=!1,g=!1,h=pg.stringify(t,n,()=>m=!0,()=>g=!0);if(!f&&!n.inFlow&&h.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");f=!0}if(n.inFlow){if(i||e==null)return m&&r&&r(),h===""?"?":f?`? ${h}`:h}else if(i&&!d||e==null&&f)return h=`? ${h}`,p&&!m?h+=ci.lineComment(h,n.indent,l(p)):g&&s&&s(),h;m&&(p=null),f?(p&&(h+=ci.lineComment(h,n.indent,l(p))),h=`? ${h} +${a}:`):(h=`${h}:`,p&&(h+=ci.lineComment(h,n.indent,l(p))));let y,w,S;Ft.isNode(e)?(y=!!e.spaceBefore,w=e.commentBefore,S=e.comment):(y=!1,w=null,S=null,e&&typeof e=="object"&&(e=o.createNode(e))),n.implicitKey=!1,!f&&!p&&Ft.isScalar(e)&&(n.indentAtStart=h.length+1),g=!1,!u&&c.length>=2&&!n.inFlow&&!f&&Ft.isSeq(e)&&!e.flow&&!e.tag&&!e.anchor&&(n.indent=n.indent.substring(2));let b=!1,k=pg.stringify(e,n,()=>b=!0,()=>g=!0),_=" ";if(p||y||w){if(_=y?` +`:"",w){let G=l(w);_+=` +${ci.indentComment(G,n.indent)}`}k===""&&!n.inFlow?_===` +`&&S&&(_=` + +`):_+=` +${n.indent}`}else if(!f&&Ft.isCollection(e)){let G=k[0],T=k.indexOf(` +`),se=T!==-1,ie=n.inFlow??e.flow??e.items.length===0;if(se||!ie){let ce=!1;if(se&&(G==="&"||G==="!")){let ne=k.indexOf(" ");G==="&"&&ne!==-1&&ne{"use strict";var jm=require("process");function E0(t,...e){t==="debug"&&console.log(...e)}function S0(t,e){(t==="debug"||t==="warn")&&(typeof jm.emitWarning=="function"?jm.emitWarning(e):console.warn(e))}Sl.debug=E0;Sl.warn=S0});var zo=E(Wo=>{"use strict";var Vo=Q(),Fm=ve(),Uo="<<",Bo={identify:t=>t===Uo||typeof t=="symbol"&&t.description===Uo,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new Fm.Scalar(Symbol(Uo)),{addToJSMap:qm}),stringify:()=>Uo},_0=(t,e)=>(Bo.identify(e)||Vo.isScalar(e)&&(!e.type||e.type===Fm.Scalar.PLAIN)&&Bo.identify(e.value))&&t?.doc.schema.tags.some(n=>n.tag===Bo.tag&&n.default);function qm(t,e,n){let r=Um(t,n);if(Vo.isSeq(r))for(let s of r.items)Tl(t,e,s);else if(Array.isArray(r))for(let s of r)Tl(t,e,s);else Tl(t,e,r)}function Tl(t,e,n){let r=Um(t,n);if(!Vo.isMap(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,t,Map);for(let[i,o]of s)e instanceof Map?e.has(i)||e.set(i,o):e instanceof Set?e.add(i):Object.prototype.hasOwnProperty.call(e,i)||Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}function Um(t,e){return t&&Vo.isAlias(e)?e.resolve(t.doc,t):e}Wo.addMergeToJSMap=qm;Wo.isMergeKey=_0;Wo.merge=Bo});var $l=E(Wm=>{"use strict";var T0=_l(),Bm=zo(),x0=ei(),Vm=Q(),xl=Xt();function $0(t,e,{key:n,value:r}){if(Vm.isNode(n)&&n.addToJSMap)n.addToJSMap(t,e,r);else if(Bm.isMergeKey(t,n))Bm.addMergeToJSMap(t,e,r);else{let s=xl.toJS(n,"",t);if(e instanceof Map)e.set(s,xl.toJS(r,s,t));else if(e instanceof Set)e.add(s);else{let i=R0(n,s,t),o=xl.toJS(r,i,t);i in e?Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):e[i]=o}}return e}function R0(t,e,n){if(e===null)return"";if(typeof e!="object")return String(e);if(Vm.isNode(t)&&n?.doc){let r=x0.createStringifyContext(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=t.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),T0.warn(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(e)}Wm.addPairToJSMap=$0});var nn=E(Rl=>{"use strict";var zm=Js(),A0=Gm(),C0=$l(),Ho=Q();function P0(t,e,n){let r=zm.createNode(t,void 0,n),s=zm.createNode(e,void 0,n);return new Ko(r,s)}var Ko=class t{constructor(e,n=null){Object.defineProperty(this,Ho.NODE_TYPE,{value:Ho.PAIR}),this.key=e,this.value=n}clone(e){let{key:n,value:r}=this;return Ho.isNode(n)&&(n=n.clone(e)),Ho.isNode(r)&&(r=r.clone(e)),new t(n,r)}toJSON(e,n){let r=n?.mapAsMap?new Map:{};return C0.addPairToJSMap(n,r,this)}toString(e,n,r){return e?.doc?A0.stringifyPair(this,e,n,r):JSON.stringify(this)}};Rl.Pair=Ko;Rl.createPair=P0});var Al=E(Km=>{"use strict";var Nn=Q(),Hm=ei(),Jo=Ys();function O0(t,e,n){return(e.inFlow??t.flow?D0:I0)(t,e,n)}function I0({comment:t,items:e},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:c,options:{commentString:l}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let m=0;mh=null,()=>d=!0);h&&(y+=Jo.lineComment(y,i,l(h))),d&&h&&(d=!1),p.push(r+y)}let f;if(p.length===0)f=s.start+s.end;else{f=p[0];for(let m=1;m{"use strict";var gg=require("process");function u0(t,...e){t==="debug"&&console.log(...e)}function d0(t,e){(t==="debug"||t==="warn")&&(typeof gg.emitWarning=="function"?gg.emitWarning(e):console.warn(e))}Hl.debug=u0;Hl.warn=d0});var na=E(ta=>{"use strict";var ea=re(),hg=xe(),Xo="<<",Qo={identify:t=>t===Xo||typeof t=="symbol"&&t.description===Xo,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new hg.Scalar(Symbol(Xo)),{addToJSMap:yg}),stringify:()=>Xo},p0=(t,e)=>(Qo.identify(e)||ea.isScalar(e)&&(!e.type||e.type===hg.Scalar.PLAIN)&&Qo.identify(e.value))&&t?.doc.schema.tags.some(n=>n.tag===Qo.tag&&n.default);function yg(t,e,n){let r=bg(t,n);if(ea.isSeq(r))for(let s of r.items)Jl(t,e,s);else if(Array.isArray(r))for(let s of r)Jl(t,e,s);else Jl(t,e,r)}function Jl(t,e,n){let r=bg(t,n);if(!ea.isMap(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,t,Map);for(let[i,o]of s)e instanceof Map?e.has(i)||e.set(i,o):e instanceof Set?e.add(i):Object.prototype.hasOwnProperty.call(e,i)||Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}function bg(t,e){return t&&ea.isAlias(e)?e.resolve(t.doc,t):e}ta.addMergeToJSMap=yg;ta.isMergeKey=p0;ta.merge=Qo});var Zl=E(kg=>{"use strict";var f0=Kl(),wg=na(),m0=ai(),vg=re(),Yl=en();function g0(t,e,{key:n,value:r}){if(vg.isNode(n)&&n.addToJSMap)n.addToJSMap(t,e,r);else if(wg.isMergeKey(t,n))wg.addMergeToJSMap(t,e,r);else{let s=Yl.toJS(n,"",t);if(e instanceof Map)e.set(s,Yl.toJS(r,s,t));else if(e instanceof Set)e.add(s);else{let i=h0(n,s,t),o=Yl.toJS(r,i,t);i in e?Object.defineProperty(e,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):e[i]=o}}return e}function h0(t,e,n){if(e===null)return"";if(typeof e!="object")return String(e);if(vg.isNode(t)&&n?.doc){let r=m0.createStringifyContext(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=t.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),f0.warn(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(e)}kg.addPairToJSMap=g0});var sn=E(Xl=>{"use strict";var Eg=ni(),y0=mg(),b0=Zl(),ra=re();function w0(t,e,n){let r=Eg.createNode(t,void 0,n),s=Eg.createNode(e,void 0,n);return new sa(r,s)}var sa=class t{constructor(e,n=null){Object.defineProperty(this,ra.NODE_TYPE,{value:ra.PAIR}),this.key=e,this.value=n}clone(e){let{key:n,value:r}=this;return ra.isNode(n)&&(n=n.clone(e)),ra.isNode(r)&&(r=r.clone(e)),new t(n,r)}toJSON(e,n){let r=n?.mapAsMap?new Map:{};return b0.addPairToJSMap(n,r,this)}toString(e,n,r){return e?.doc?y0.stringifyPair(this,e,n,r):JSON.stringify(this)}};Xl.Pair=sa;Xl.createPair=w0});var Ql=E(xg=>{"use strict";var jn=re(),Sg=ai(),ia=ri();function v0(t,e,n){return(e.inFlow??t.flow?E0:k0)(t,e,n)}function k0({comment:t,items:e},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:c,options:{commentString:l}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let m=0;mh=null,()=>d=!0);h&&(y+=ia.lineComment(y,i,l(h))),d&&h&&(d=!1),p.push(r+y)}let f;if(p.length===0)f=s.start+s.end;else{f=p[0];for(let m=1;mh=null);l||(l=d.length>u||y.includes(` -`)),m0&&(l||(l=d.reduce((w,S)=>w+S.length+2,2)+(y.length+2)>e.options.lineWidth)),l&&(y+=",")),h&&(y+=Jo.lineComment(y,r,a(h))),d.push(y),u=d.length}let{start:p,end:f}=n;if(d.length===0)return p+f;if(!l){let m=d.reduce((g,h)=>g+h.length+2,2);l=e.options.lineWidth>0&&m>e.options.lineWidth}if(l){let m=p;for(let g of d)m+=g?` +`+ia.indentComment(l(t),c),a&&a()):d&&o&&o(),f}function E0({items:t},e,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=e;r+=i;let c=Object.assign({},e,{indent:r,inFlow:!0,type:null}),l=!1,u=0,d=[];for(let m=0;mh=null);l||(l=d.length>u||y.includes(` +`)),m0&&(l||(l=d.reduce((w,S)=>w+S.length+2,2)+(y.length+2)>e.options.lineWidth)),l&&(y+=",")),h&&(y+=ia.lineComment(y,r,a(h))),d.push(y),u=d.length}let{start:p,end:f}=n;if(d.length===0)return p+f;if(!l){let m=d.reduce((g,h)=>g+h.length+2,2);l=e.options.lineWidth>0&&m>e.options.lineWidth}if(l){let m=p;for(let g of d)m+=g?` ${i}${s}${g}`:` `;return`${m} -${s}${f}`}else return`${p}${o}${d.join(" ")}${o}${f}`}function Yo({indent:t,options:{commentString:e}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Jo.indentComment(e(r),t);n.push(i.trimStart())}}Km.stringifyCollection=O0});var sn=E(Pl=>{"use strict";var M0=Al(),N0=$l(),L0=No(),rn=Q(),Zo=nn(),G0=ve();function ni(t,e){let n=rn.isScalar(e)?e.value:e;for(let r of t)if(rn.isPair(r)&&(r.key===e||r.key===n||rn.isScalar(r.key)&&r.key.value===n))return r}var Cl=class extends L0.Collection{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(rn.MAP,e),this.items=[]}static from(e,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(e),a=(c,l)=>{if(typeof i=="function")l=i.call(n,c,l);else if(Array.isArray(i)&&!i.includes(c))return;(l!==void 0||s)&&o.items.push(Zo.createPair(c,l,r))};if(n instanceof Map)for(let[c,l]of n)a(c,l);else if(n&&typeof n=="object")for(let c of Object.keys(n))a(c,n[c]);return typeof e.sortMapEntries=="function"&&o.items.sort(e.sortMapEntries),o}add(e,n){let r;rn.isPair(e)?r=e:!e||typeof e!="object"||!("key"in e)?r=new Zo.Pair(e,e?.value):r=new Zo.Pair(e.key,e.value);let s=ni(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);rn.isScalar(s.value)&&G0.isScalarValue(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(e){let n=ni(this.items,e);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(e,n){let s=ni(this.items,e)?.value;return(!n&&rn.isScalar(s)?s.value:s)??void 0}has(e){return!!ni(this.items,e)}set(e,n){this.add(new Zo.Pair(e,n),!0)}toJSON(e,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)N0.addPairToJSMap(n,s,i);return s}toString(e,n,r){if(!e)return JSON.stringify(this);for(let s of this.items)if(!rn.isPair(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),M0.stringifyCollection(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:r,onComment:n})}};Pl.YAMLMap=Cl;Pl.findPair=ni});var Fr=E(Ym=>{"use strict";var j0=Q(),Jm=sn(),F0={collection:"map",default:!0,nodeClass:Jm.YAMLMap,tag:"tag:yaml.org,2002:map",resolve(t,e){return j0.isMap(t)||e("Expected a mapping for this tag"),t},createNode:(t,e,n)=>Jm.YAMLMap.from(t,e,n)};Ym.map=F0});var on=E(Zm=>{"use strict";var q0=Js(),U0=Al(),B0=No(),Qo=Q(),V0=ve(),W0=Xt(),Ol=class extends B0.Collection{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(Qo.SEQ,e),this.items=[]}add(e){this.items.push(e)}delete(e){let n=Xo(e);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(e,n){let r=Xo(e);if(typeof r!="number")return;let s=this.items[r];return!n&&Qo.isScalar(s)?s.value:s}has(e){let n=Xo(e);return typeof n=="number"&&n=0?e:null}Zm.YAMLSeq=Ol});var qr=E(Qm=>{"use strict";var z0=Q(),Xm=on(),H0={collection:"seq",default:!0,nodeClass:Xm.YAMLSeq,tag:"tag:yaml.org,2002:seq",resolve(t,e){return z0.isSeq(t)||e("Expected a sequence for this tag"),t},createNode:(t,e,n)=>Xm.YAMLSeq.from(t,e,n)};Qm.seq=H0});var ri=E(eg=>{"use strict";var K0=Qs(),J0={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,e,n,r){return e=Object.assign({actualString:!0},e),K0.stringifyString(t,e,n,r)}};eg.string=J0});var ea=E(rg=>{"use strict";var tg=ve(),ng={identify:t=>t==null,createNode:()=>new tg.Scalar(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new tg.Scalar(null),stringify:({source:t},e)=>typeof t=="string"&&ng.test.test(t)?t:e.options.nullStr};rg.nullTag=ng});var Il=E(ig=>{"use strict";var Y0=ve(),sg={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new Y0.Scalar(t[0]==="t"||t[0]==="T"),stringify({source:t,value:e},n){if(t&&sg.test.test(t)){let r=t[0]==="t"||t[0]==="T";if(e===r)return t}return e?n.options.trueStr:n.options.falseStr}};ig.boolTag=sg});var Ur=E(og=>{"use strict";function Z0({format:t,minFractionDigits:e,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!t&&e&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=e-(i.length-o-1);for(;a-- >0;)i+="0"}return i}og.stringifyNumber=Z0});var Ml=E(ta=>{"use strict";var X0=ve(),Dl=Ur(),Q0={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Dl.stringifyNumber},e$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Dl.stringifyNumber(t)}},t$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let e=new X0.Scalar(parseFloat(t)),n=t.indexOf(".");return n!==-1&&t[t.length-1]==="0"&&(e.minFractionDigits=t.length-n-1),e},stringify:Dl.stringifyNumber};ta.float=t$;ta.floatExp=e$;ta.floatNaN=Q0});var Ll=E(ra=>{"use strict";var ag=Ur(),na=t=>typeof t=="bigint"||Number.isInteger(t),Nl=(t,e,n,{intAsBigInt:r})=>r?BigInt(t):parseInt(t.substring(e),n);function cg(t,e,n){let{value:r}=t;return na(r)&&r>=0?n+r.toString(e):ag.stringifyNumber(t)}var n$={identify:t=>na(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,e,n)=>Nl(t,2,8,n),stringify:t=>cg(t,8,"0o")},r$={identify:na,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,e,n)=>Nl(t,0,10,n),stringify:ag.stringifyNumber},s$={identify:t=>na(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,n)=>Nl(t,2,16,n),stringify:t=>cg(t,16,"0x")};ra.int=r$;ra.intHex=s$;ra.intOct=n$});var ug=E(lg=>{"use strict";var i$=Fr(),o$=ea(),a$=qr(),c$=ri(),l$=Il(),Gl=Ml(),jl=Ll(),u$=[i$.map,a$.seq,c$.string,o$.nullTag,l$.boolTag,jl.intOct,jl.int,jl.intHex,Gl.floatNaN,Gl.floatExp,Gl.float];lg.schema=u$});var fg=E(pg=>{"use strict";var d$=ve(),p$=Fr(),f$=qr();function dg(t){return typeof t=="bigint"||Number.isInteger(t)}var sa=({value:t})=>JSON.stringify(t),m$=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:sa},{identify:t=>t==null,createNode:()=>new d$.Scalar(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:sa},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:sa},{identify:dg,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:n})=>n?BigInt(t):parseInt(t,10),stringify:({value:t})=>dg(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:sa}],g$={default:!0,tag:"",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},h$=[p$.map,f$.seq].concat(m$,g$);pg.schema=h$});var ql=E(mg=>{"use strict";var si=require("buffer"),Fl=ve(),y$=Qs(),b$={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,e){if(typeof si.Buffer=="function")return si.Buffer.from(t,"base64");if(typeof atob=="function"){let n=atob(t.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s{"use strict";var ia=Q(),Ul=nn(),w$=ve(),v$=on();function gg(t,e){if(ia.isSeq(t))for(let n=0;n1&&e("Each pair must have its own sequence indicator");let s=r.items[0]||new Ul.Pair(new w$.Scalar(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore} +${s}${f}`}else return`${p}${o}${d.join(" ")}${o}${f}`}function oa({indent:t,options:{commentString:e}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=ia.indentComment(e(r),t);n.push(i.trimStart())}}xg.stringifyCollection=v0});var an=E(tu=>{"use strict";var S0=Ql(),x0=Zl(),T0=zo(),on=re(),aa=sn(),_0=xe();function li(t,e){let n=on.isScalar(e)?e.value:e;for(let r of t)if(on.isPair(r)&&(r.key===e||r.key===n||on.isScalar(r.key)&&r.key.value===n))return r}var eu=class extends T0.Collection{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(on.MAP,e),this.items=[]}static from(e,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(e),a=(c,l)=>{if(typeof i=="function")l=i.call(n,c,l);else if(Array.isArray(i)&&!i.includes(c))return;(l!==void 0||s)&&o.items.push(aa.createPair(c,l,r))};if(n instanceof Map)for(let[c,l]of n)a(c,l);else if(n&&typeof n=="object")for(let c of Object.keys(n))a(c,n[c]);return typeof e.sortMapEntries=="function"&&o.items.sort(e.sortMapEntries),o}add(e,n){let r;on.isPair(e)?r=e:!e||typeof e!="object"||!("key"in e)?r=new aa.Pair(e,e?.value):r=new aa.Pair(e.key,e.value);let s=li(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);on.isScalar(s.value)&&_0.isScalarValue(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(e){let n=li(this.items,e);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(e,n){let s=li(this.items,e)?.value;return(!n&&on.isScalar(s)?s.value:s)??void 0}has(e){return!!li(this.items,e)}set(e,n){this.add(new aa.Pair(e,n),!0)}toJSON(e,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)x0.addPairToJSMap(n,s,i);return s}toString(e,n,r){if(!e)return JSON.stringify(this);for(let s of this.items)if(!on.isPair(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),S0.stringifyCollection(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:r,onComment:n})}};tu.YAMLMap=eu;tu.findPair=li});var Hr=E(_g=>{"use strict";var $0=re(),Tg=an(),R0={collection:"map",default:!0,nodeClass:Tg.YAMLMap,tag:"tag:yaml.org,2002:map",resolve(t,e){return $0.isMap(t)||e("Expected a mapping for this tag"),t},createNode:(t,e,n)=>Tg.YAMLMap.from(t,e,n)};_g.map=R0});var cn=E($g=>{"use strict";var C0=ni(),A0=Ql(),P0=zo(),la=re(),I0=xe(),O0=en(),nu=class extends P0.Collection{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(la.SEQ,e),this.items=[]}add(e){this.items.push(e)}delete(e){let n=ca(e);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(e,n){let r=ca(e);if(typeof r!="number")return;let s=this.items[r];return!n&&la.isScalar(s)?s.value:s}has(e){let n=ca(e);return typeof n=="number"&&n=0?e:null}$g.YAMLSeq=nu});var Kr=E(Cg=>{"use strict";var D0=re(),Rg=cn(),M0={collection:"seq",default:!0,nodeClass:Rg.YAMLSeq,tag:"tag:yaml.org,2002:seq",resolve(t,e){return D0.isSeq(t)||e("Expected a sequence for this tag"),t},createNode:(t,e,n)=>Rg.YAMLSeq.from(t,e,n)};Cg.seq=M0});var ui=E(Ag=>{"use strict";var N0=oi(),L0={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,e,n,r){return e=Object.assign({actualString:!0},e),N0.stringifyString(t,e,n,r)}};Ag.string=L0});var ua=E(Og=>{"use strict";var Pg=xe(),Ig={identify:t=>t==null,createNode:()=>new Pg.Scalar(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Pg.Scalar(null),stringify:({source:t},e)=>typeof t=="string"&&Ig.test.test(t)?t:e.options.nullStr};Og.nullTag=Ig});var ru=E(Mg=>{"use strict";var G0=xe(),Dg={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new G0.Scalar(t[0]==="t"||t[0]==="T"),stringify({source:t,value:e},n){if(t&&Dg.test.test(t)){let r=t[0]==="t"||t[0]==="T";if(e===r)return t}return e?n.options.trueStr:n.options.falseStr}};Mg.boolTag=Dg});var Jr=E(Ng=>{"use strict";function F0({format:t,minFractionDigits:e,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!t&&e&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=e-(i.length-o-1);for(;a-- >0;)i+="0"}return i}Ng.stringifyNumber=F0});var iu=E(da=>{"use strict";var j0=xe(),su=Jr(),q0={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:su.stringifyNumber},U0={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():su.stringifyNumber(t)}},B0={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let e=new j0.Scalar(parseFloat(t)),n=t.indexOf(".");return n!==-1&&t[t.length-1]==="0"&&(e.minFractionDigits=t.length-n-1),e},stringify:su.stringifyNumber};da.float=B0;da.floatExp=U0;da.floatNaN=q0});var au=E(fa=>{"use strict";var Lg=Jr(),pa=t=>typeof t=="bigint"||Number.isInteger(t),ou=(t,e,n,{intAsBigInt:r})=>r?BigInt(t):parseInt(t.substring(e),n);function Gg(t,e,n){let{value:r}=t;return pa(r)&&r>=0?n+r.toString(e):Lg.stringifyNumber(t)}var V0={identify:t=>pa(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,e,n)=>ou(t,2,8,n),stringify:t=>Gg(t,8,"0o")},W0={identify:pa,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,e,n)=>ou(t,0,10,n),stringify:Lg.stringifyNumber},z0={identify:t=>pa(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,n)=>ou(t,2,16,n),stringify:t=>Gg(t,16,"0x")};fa.int=W0;fa.intHex=z0;fa.intOct=V0});var jg=E(Fg=>{"use strict";var H0=Hr(),K0=ua(),J0=Kr(),Y0=ui(),Z0=ru(),cu=iu(),lu=au(),X0=[H0.map,J0.seq,Y0.string,K0.nullTag,Z0.boolTag,lu.intOct,lu.int,lu.intHex,cu.floatNaN,cu.floatExp,cu.float];Fg.schema=X0});var Bg=E(Ug=>{"use strict";var Q0=xe(),eR=Hr(),tR=Kr();function qg(t){return typeof t=="bigint"||Number.isInteger(t)}var ma=({value:t})=>JSON.stringify(t),nR=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:ma},{identify:t=>t==null,createNode:()=>new Q0.Scalar(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:ma},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:ma},{identify:qg,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:n})=>n?BigInt(t):parseInt(t,10),stringify:({value:t})=>qg(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:ma}],rR={default:!0,tag:"",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},sR=[eR.map,tR.seq].concat(nR,rR);Ug.schema=sR});var du=E(Vg=>{"use strict";var di=require("buffer"),uu=xe(),iR=oi(),oR={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,e){if(typeof di.Buffer=="function")return di.Buffer.from(t,"base64");if(typeof atob=="function"){let n=atob(t.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s{"use strict";var ga=re(),pu=sn(),aR=xe(),cR=cn();function Wg(t,e){if(ga.isSeq(t))for(let n=0;n1&&e("Each pair must have its own sequence indicator");let s=r.items[0]||new pu.Pair(new aR.Scalar(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore} ${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment} -${i.comment}`:r.comment}r=s}t.items[n]=ia.isPair(r)?r:new Ul.Pair(r)}}else e("Expected a sequence for this tag");return t}function hg(t,e,n){let{replacer:r}=n,s=new v$.YAMLSeq(t);s.tag="tag:yaml.org,2002:pairs";let i=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof r=="function"&&(o=r.call(e,String(i++),o));let a,c;if(Array.isArray(o))if(o.length===2)a=o[0],c=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let l=Object.keys(o);if(l.length===1)a=l[0],c=o[a];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else a=o;s.items.push(Ul.createPair(a,c,n))}return s}var k$={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:gg,createNode:hg};oa.createPairs=hg;oa.pairs=k$;oa.resolvePairs=gg});var Wl=E(Vl=>{"use strict";var yg=Q(),Bl=Xt(),ii=sn(),E$=on(),bg=aa(),Ln=class t extends E$.YAMLSeq{constructor(){super(),this.add=ii.YAMLMap.prototype.add.bind(this),this.delete=ii.YAMLMap.prototype.delete.bind(this),this.get=ii.YAMLMap.prototype.get.bind(this),this.has=ii.YAMLMap.prototype.has.bind(this),this.set=ii.YAMLMap.prototype.set.bind(this),this.tag=t.tag}toJSON(e,n){if(!n)return super.toJSON(e);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(yg.isPair(s)?(i=Bl.toJS(s.key,"",n),o=Bl.toJS(s.value,i,n)):i=Bl.toJS(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(e,n,r){let s=bg.createPairs(e,n,r),i=new this;return i.items=s.items,i}};Ln.tag="tag:yaml.org,2002:omap";var S$={collection:"seq",identify:t=>t instanceof Map,nodeClass:Ln,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,e){let n=bg.resolvePairs(t,e),r=[];for(let{key:s}of n.items)yg.isScalar(s)&&(r.includes(s.value)?e(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new Ln,n)},createNode:(t,e,n)=>Ln.from(t,e,n)};Vl.YAMLOMap=Ln;Vl.omap=S$});var Sg=E(zl=>{"use strict";var wg=ve();function vg({value:t,source:e},n){return e&&(t?kg:Eg).test.test(e)?e:t?n.options.trueStr:n.options.falseStr}var kg={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new wg.Scalar(!0),stringify:vg},Eg={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new wg.Scalar(!1),stringify:vg};zl.falseTag=Eg;zl.trueTag=kg});var _g=E(ca=>{"use strict";var _$=ve(),Hl=Ur(),T$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Hl.stringifyNumber},x$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Hl.stringifyNumber(t)}},$$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let e=new _$.Scalar(parseFloat(t.replace(/_/g,""))),n=t.indexOf(".");if(n!==-1){let r=t.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(e.minFractionDigits=r.length)}return e},stringify:Hl.stringifyNumber};ca.float=$$;ca.floatExp=x$;ca.floatNaN=T$});var xg=E(ai=>{"use strict";var Tg=Ur(),oi=t=>typeof t=="bigint"||Number.isInteger(t);function la(t,e,n,{intAsBigInt:r}){let s=t[0];if((s==="-"||s==="+")&&(e+=1),t=t.substring(e).replace(/_/g,""),r){switch(n){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let o=BigInt(t);return s==="-"?BigInt(-1)*o:o}let i=parseInt(t,n);return s==="-"?-1*i:i}function Kl(t,e,n){let{value:r}=t;if(oi(r)){let s=r.toString(e);return r<0?"-"+n+s.substr(1):n+s}return Tg.stringifyNumber(t)}var R$={identify:oi,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,n)=>la(t,2,2,n),stringify:t=>Kl(t,2,"0b")},A$={identify:oi,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,n)=>la(t,1,8,n),stringify:t=>Kl(t,8,"0")},C$={identify:oi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,n)=>la(t,0,10,n),stringify:Tg.stringifyNumber},P$={identify:oi,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,n)=>la(t,2,16,n),stringify:t=>Kl(t,16,"0x")};ai.int=C$;ai.intBin=R$;ai.intHex=P$;ai.intOct=A$});var Yl=E(Jl=>{"use strict";var pa=Q(),ua=nn(),da=sn(),Gn=class t extends da.YAMLMap{constructor(e){super(e),this.tag=t.tag}add(e){let n;pa.isPair(e)?n=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?n=new ua.Pair(e.key,null):n=new ua.Pair(e,null),da.findPair(this.items,n.key)||this.items.push(n)}get(e,n){let r=da.findPair(this.items,e);return!n&&pa.isPair(r)?pa.isScalar(r.key)?r.key.value:r.key:r}set(e,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=da.findPair(this.items,e);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ua.Pair(e))}toJSON(e,n){return super.toJSON(e,n,Set)}toString(e,n,r){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(e,n,r){let{replacer:s}=r,i=new this(e);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(ua.createPair(o,null,r));return i}};Gn.tag="tag:yaml.org,2002:set";var O$={collection:"map",identify:t=>t instanceof Set,nodeClass:Gn,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,e,n)=>Gn.from(t,e,n),resolve(t,e){if(pa.isMap(t)){if(t.hasAllNullValues(!0))return Object.assign(new Gn,t);e("Set items must all have null values")}else e("Expected a mapping for this tag");return t}};Jl.YAMLSet=Gn;Jl.set=O$});var Xl=E(fa=>{"use strict";var I$=Ur();function Zl(t,e){let n=t[0],r=n==="-"||n==="+"?t.substring(1):t,s=o=>e?BigInt(o):Number(o),i=r.replace(/_/g,"").split(":").reduce((o,a)=>o*s(60)+s(a),s(0));return n==="-"?s(-1)*i:i}function $g(t){let{value:e}=t,n=o=>o;if(typeof e=="bigint")n=o=>BigInt(o);else if(isNaN(e)||!isFinite(e))return I$.stringifyNumber(t);let r="";e<0&&(r="-",e*=n(-1));let s=n(60),i=[e%s];return e<60?i.unshift(0):(e=(e-i[0])/s,i.unshift(e%s),e>=60&&(e=(e-i[0])/s,i.unshift(e))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var D$={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:n})=>Zl(t,n),stringify:$g},M$={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>Zl(t,!1),stringify:$g},Rg={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let e=t.match(Rg.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=e.map(Number),c=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(n,r-1,s,i||0,o||0,a||0,c),u=e[8];if(u&&u!=="Z"){let d=Zl(u,!1);Math.abs(d)<30&&(d*=60),l-=6e4*d}return new Date(l)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};fa.floatTime=M$;fa.intTime=D$;fa.timestamp=Rg});var Pg=E(Cg=>{"use strict";var N$=Fr(),L$=ea(),G$=qr(),j$=ri(),F$=ql(),Ag=Sg(),Ql=_g(),ma=xg(),q$=zo(),U$=Wl(),B$=aa(),V$=Yl(),eu=Xl(),W$=[N$.map,G$.seq,j$.string,L$.nullTag,Ag.trueTag,Ag.falseTag,ma.intBin,ma.intOct,ma.int,ma.intHex,Ql.floatNaN,Ql.floatExp,Ql.float,F$.binary,q$.merge,U$.omap,B$.pairs,V$.set,eu.intTime,eu.floatTime,eu.timestamp];Cg.schema=W$});var qg=E(ru=>{"use strict";var Mg=Fr(),z$=ea(),Ng=qr(),H$=ri(),K$=Il(),tu=Ml(),nu=Ll(),J$=ug(),Y$=fg(),Lg=ql(),ci=zo(),Gg=Wl(),jg=aa(),Og=Pg(),Fg=Yl(),ga=Xl(),Ig=new Map([["core",J$.schema],["failsafe",[Mg.map,Ng.seq,H$.string]],["json",Y$.schema],["yaml11",Og.schema],["yaml-1.1",Og.schema]]),Dg={binary:Lg.binary,bool:K$.boolTag,float:tu.float,floatExp:tu.floatExp,floatNaN:tu.floatNaN,floatTime:ga.floatTime,int:nu.int,intHex:nu.intHex,intOct:nu.intOct,intTime:ga.intTime,map:Mg.map,merge:ci.merge,null:z$.nullTag,omap:Gg.omap,pairs:jg.pairs,seq:Ng.seq,set:Fg.set,timestamp:ga.timestamp},Z$={"tag:yaml.org,2002:binary":Lg.binary,"tag:yaml.org,2002:merge":ci.merge,"tag:yaml.org,2002:omap":Gg.omap,"tag:yaml.org,2002:pairs":jg.pairs,"tag:yaml.org,2002:set":Fg.set,"tag:yaml.org,2002:timestamp":ga.timestamp};function X$(t,e,n){let r=Ig.get(e);if(r&&!t)return n&&!r.includes(ci.merge)?r.concat(ci.merge):r.slice();let s=r;if(!s)if(Array.isArray(t))s=[];else{let i=Array.from(Ig.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${i} or define customTags array`)}if(Array.isArray(t))for(let i of t)s=s.concat(i);else typeof t=="function"&&(s=t(s.slice()));return n&&(s=s.concat(ci.merge)),s.reduce((i,o)=>{let a=typeof o=="string"?Dg[o]:o;if(!a){let c=JSON.stringify(o),l=Object.keys(Dg).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${c}; use one of ${l}`)}return i.includes(a)||i.push(a),i},[])}ru.coreKnownTags=Z$;ru.getTags=X$});var ou=E(Ug=>{"use strict";var su=Q(),Q$=Fr(),eR=qr(),tR=ri(),ha=qg(),nR=(t,e)=>t.keye.key?1:0,iu=class t{constructor({compat:e,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(e)?ha.getTags(e,"compat"):e?ha.getTags(null,e):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?ha.coreKnownTags:{},this.tags=ha.getTags(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,su.MAP,{value:Q$.map}),Object.defineProperty(this,su.SCALAR,{value:tR.string}),Object.defineProperty(this,su.SEQ,{value:eR.seq}),this.sortMapEntries=typeof o=="function"?o:o===!0?nR:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};Ug.Schema=iu});var Vg=E(Bg=>{"use strict";var rR=Q(),au=ei(),li=Ys();function sR(t,e){let n=[],r=e.directives===!0;if(e.directives!==!1&&t.directives){let c=t.directives.toString(t);c?(n.push(c),r=!0):t.directives.docStart&&(r=!0)}r&&n.push("---");let s=au.createStringifyContext(t,e),{commentString:i}=s.options;if(t.commentBefore){n.length!==1&&n.unshift("");let c=i(t.commentBefore);n.unshift(li.indentComment(c,""))}let o=!1,a=null;if(t.contents){if(rR.isNode(t.contents)){if(t.contents.spaceBefore&&r&&n.push(""),t.contents.commentBefore){let u=i(t.contents.commentBefore);n.push(li.indentComment(u,""))}s.forceBlockIndent=!!t.comment,a=t.contents.comment}let c=a?void 0:()=>o=!0,l=au.stringify(t.contents,s,()=>a=null,c);a&&(l+=li.lineComment(l,"",i(a))),(l[0]==="|"||l[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${l}`:n.push(l)}else n.push(au.stringify(t.contents,s));if(t.directives?.docEnd)if(t.comment){let c=i(t.comment);c.includes(` -`)?(n.push("..."),n.push(li.indentComment(c,""))):n.push(`... ${c}`)}else n.push("...");else{let c=t.comment;c&&o&&(c=c.replace(/^\n+/,"")),c&&((!o||a)&&n[n.length-1]!==""&&n.push(""),n.push(li.indentComment(i(c),"")))}return n.join(` +${i.comment}`:r.comment}r=s}t.items[n]=ga.isPair(r)?r:new pu.Pair(r)}}else e("Expected a sequence for this tag");return t}function zg(t,e,n){let{replacer:r}=n,s=new cR.YAMLSeq(t);s.tag="tag:yaml.org,2002:pairs";let i=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof r=="function"&&(o=r.call(e,String(i++),o));let a,c;if(Array.isArray(o))if(o.length===2)a=o[0],c=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let l=Object.keys(o);if(l.length===1)a=l[0],c=o[a];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else a=o;s.items.push(pu.createPair(a,c,n))}return s}var lR={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Wg,createNode:zg};ha.createPairs=zg;ha.pairs=lR;ha.resolvePairs=Wg});var gu=E(mu=>{"use strict";var Hg=re(),fu=en(),pi=an(),uR=cn(),Kg=ya(),qn=class t extends uR.YAMLSeq{constructor(){super(),this.add=pi.YAMLMap.prototype.add.bind(this),this.delete=pi.YAMLMap.prototype.delete.bind(this),this.get=pi.YAMLMap.prototype.get.bind(this),this.has=pi.YAMLMap.prototype.has.bind(this),this.set=pi.YAMLMap.prototype.set.bind(this),this.tag=t.tag}toJSON(e,n){if(!n)return super.toJSON(e);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(Hg.isPair(s)?(i=fu.toJS(s.key,"",n),o=fu.toJS(s.value,i,n)):i=fu.toJS(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(e,n,r){let s=Kg.createPairs(e,n,r),i=new this;return i.items=s.items,i}};qn.tag="tag:yaml.org,2002:omap";var dR={collection:"seq",identify:t=>t instanceof Map,nodeClass:qn,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,e){let n=Kg.resolvePairs(t,e),r=[];for(let{key:s}of n.items)Hg.isScalar(s)&&(r.includes(s.value)?e(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new qn,n)},createNode:(t,e,n)=>qn.from(t,e,n)};mu.YAMLOMap=qn;mu.omap=dR});var Qg=E(hu=>{"use strict";var Jg=xe();function Yg({value:t,source:e},n){return e&&(t?Zg:Xg).test.test(e)?e:t?n.options.trueStr:n.options.falseStr}var Zg={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Jg.Scalar(!0),stringify:Yg},Xg={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new Jg.Scalar(!1),stringify:Yg};hu.falseTag=Xg;hu.trueTag=Zg});var eh=E(ba=>{"use strict";var pR=xe(),yu=Jr(),fR={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:yu.stringifyNumber},mR={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():yu.stringifyNumber(t)}},gR={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let e=new pR.Scalar(parseFloat(t.replace(/_/g,""))),n=t.indexOf(".");if(n!==-1){let r=t.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(e.minFractionDigits=r.length)}return e},stringify:yu.stringifyNumber};ba.float=gR;ba.floatExp=mR;ba.floatNaN=fR});var nh=E(mi=>{"use strict";var th=Jr(),fi=t=>typeof t=="bigint"||Number.isInteger(t);function wa(t,e,n,{intAsBigInt:r}){let s=t[0];if((s==="-"||s==="+")&&(e+=1),t=t.substring(e).replace(/_/g,""),r){switch(n){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let o=BigInt(t);return s==="-"?BigInt(-1)*o:o}let i=parseInt(t,n);return s==="-"?-1*i:i}function bu(t,e,n){let{value:r}=t;if(fi(r)){let s=r.toString(e);return r<0?"-"+n+s.substr(1):n+s}return th.stringifyNumber(t)}var hR={identify:fi,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,n)=>wa(t,2,2,n),stringify:t=>bu(t,2,"0b")},yR={identify:fi,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,n)=>wa(t,1,8,n),stringify:t=>bu(t,8,"0")},bR={identify:fi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,n)=>wa(t,0,10,n),stringify:th.stringifyNumber},wR={identify:fi,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,n)=>wa(t,2,16,n),stringify:t=>bu(t,16,"0x")};mi.int=bR;mi.intBin=hR;mi.intHex=wR;mi.intOct=yR});var vu=E(wu=>{"use strict";var Ea=re(),va=sn(),ka=an(),Un=class t extends ka.YAMLMap{constructor(e){super(e),this.tag=t.tag}add(e){let n;Ea.isPair(e)?n=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?n=new va.Pair(e.key,null):n=new va.Pair(e,null),ka.findPair(this.items,n.key)||this.items.push(n)}get(e,n){let r=ka.findPair(this.items,e);return!n&&Ea.isPair(r)?Ea.isScalar(r.key)?r.key.value:r.key:r}set(e,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=ka.findPair(this.items,e);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new va.Pair(e))}toJSON(e,n){return super.toJSON(e,n,Set)}toString(e,n,r){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(e,n,r){let{replacer:s}=r,i=new this(e);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(va.createPair(o,null,r));return i}};Un.tag="tag:yaml.org,2002:set";var vR={collection:"map",identify:t=>t instanceof Set,nodeClass:Un,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,e,n)=>Un.from(t,e,n),resolve(t,e){if(Ea.isMap(t)){if(t.hasAllNullValues(!0))return Object.assign(new Un,t);e("Set items must all have null values")}else e("Expected a mapping for this tag");return t}};wu.YAMLSet=Un;wu.set=vR});var Eu=E(Sa=>{"use strict";var kR=Jr();function ku(t,e){let n=t[0],r=n==="-"||n==="+"?t.substring(1):t,s=o=>e?BigInt(o):Number(o),i=r.replace(/_/g,"").split(":").reduce((o,a)=>o*s(60)+s(a),s(0));return n==="-"?s(-1)*i:i}function rh(t){let{value:e}=t,n=o=>o;if(typeof e=="bigint")n=o=>BigInt(o);else if(isNaN(e)||!isFinite(e))return kR.stringifyNumber(t);let r="";e<0&&(r="-",e*=n(-1));let s=n(60),i=[e%s];return e<60?i.unshift(0):(e=(e-i[0])/s,i.unshift(e%s),e>=60&&(e=(e-i[0])/s,i.unshift(e))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var ER={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:n})=>ku(t,n),stringify:rh},SR={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>ku(t,!1),stringify:rh},sh={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let e=t.match(sh.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=e.map(Number),c=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(n,r-1,s,i||0,o||0,a||0,c),u=e[8];if(u&&u!=="Z"){let d=ku(u,!1);Math.abs(d)<30&&(d*=60),l-=6e4*d}return new Date(l)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};Sa.floatTime=SR;Sa.intTime=ER;Sa.timestamp=sh});var ah=E(oh=>{"use strict";var xR=Hr(),TR=ua(),_R=Kr(),$R=ui(),RR=du(),ih=Qg(),Su=eh(),xa=nh(),CR=na(),AR=gu(),PR=ya(),IR=vu(),xu=Eu(),OR=[xR.map,_R.seq,$R.string,TR.nullTag,ih.trueTag,ih.falseTag,xa.intBin,xa.intOct,xa.int,xa.intHex,Su.floatNaN,Su.floatExp,Su.float,RR.binary,CR.merge,AR.omap,PR.pairs,IR.set,xu.intTime,xu.floatTime,xu.timestamp];oh.schema=OR});var yh=E($u=>{"use strict";var dh=Hr(),DR=ua(),ph=Kr(),MR=ui(),NR=ru(),Tu=iu(),_u=au(),LR=jg(),GR=Bg(),fh=du(),gi=na(),mh=gu(),gh=ya(),ch=ah(),hh=vu(),Ta=Eu(),lh=new Map([["core",LR.schema],["failsafe",[dh.map,ph.seq,MR.string]],["json",GR.schema],["yaml11",ch.schema],["yaml-1.1",ch.schema]]),uh={binary:fh.binary,bool:NR.boolTag,float:Tu.float,floatExp:Tu.floatExp,floatNaN:Tu.floatNaN,floatTime:Ta.floatTime,int:_u.int,intHex:_u.intHex,intOct:_u.intOct,intTime:Ta.intTime,map:dh.map,merge:gi.merge,null:DR.nullTag,omap:mh.omap,pairs:gh.pairs,seq:ph.seq,set:hh.set,timestamp:Ta.timestamp},FR={"tag:yaml.org,2002:binary":fh.binary,"tag:yaml.org,2002:merge":gi.merge,"tag:yaml.org,2002:omap":mh.omap,"tag:yaml.org,2002:pairs":gh.pairs,"tag:yaml.org,2002:set":hh.set,"tag:yaml.org,2002:timestamp":Ta.timestamp};function jR(t,e,n){let r=lh.get(e);if(r&&!t)return n&&!r.includes(gi.merge)?r.concat(gi.merge):r.slice();let s=r;if(!s)if(Array.isArray(t))s=[];else{let i=Array.from(lh.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${i} or define customTags array`)}if(Array.isArray(t))for(let i of t)s=s.concat(i);else typeof t=="function"&&(s=t(s.slice()));return n&&(s=s.concat(gi.merge)),s.reduce((i,o)=>{let a=typeof o=="string"?uh[o]:o;if(!a){let c=JSON.stringify(o),l=Object.keys(uh).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${c}; use one of ${l}`)}return i.includes(a)||i.push(a),i},[])}$u.coreKnownTags=FR;$u.getTags=jR});var Au=E(bh=>{"use strict";var Ru=re(),qR=Hr(),UR=Kr(),BR=ui(),_a=yh(),VR=(t,e)=>t.keye.key?1:0,Cu=class t{constructor({compat:e,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(e)?_a.getTags(e,"compat"):e?_a.getTags(null,e):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?_a.coreKnownTags:{},this.tags=_a.getTags(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Ru.MAP,{value:qR.map}),Object.defineProperty(this,Ru.SCALAR,{value:BR.string}),Object.defineProperty(this,Ru.SEQ,{value:UR.seq}),this.sortMapEntries=typeof o=="function"?o:o===!0?VR:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};bh.Schema=Cu});var vh=E(wh=>{"use strict";var WR=re(),Pu=ai(),hi=ri();function zR(t,e){let n=[],r=e.directives===!0;if(e.directives!==!1&&t.directives){let c=t.directives.toString(t);c?(n.push(c),r=!0):t.directives.docStart&&(r=!0)}r&&n.push("---");let s=Pu.createStringifyContext(t,e),{commentString:i}=s.options;if(t.commentBefore){n.length!==1&&n.unshift("");let c=i(t.commentBefore);n.unshift(hi.indentComment(c,""))}let o=!1,a=null;if(t.contents){if(WR.isNode(t.contents)){if(t.contents.spaceBefore&&r&&n.push(""),t.contents.commentBefore){let u=i(t.contents.commentBefore);n.push(hi.indentComment(u,""))}s.forceBlockIndent=!!t.comment,a=t.contents.comment}let c=a?void 0:()=>o=!0,l=Pu.stringify(t.contents,s,()=>a=null,c);a&&(l+=hi.lineComment(l,"",i(a))),(l[0]==="|"||l[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${l}`:n.push(l)}else n.push(Pu.stringify(t.contents,s));if(t.directives?.docEnd)if(t.comment){let c=i(t.comment);c.includes(` +`)?(n.push("..."),n.push(hi.indentComment(c,""))):n.push(`... ${c}`)}else n.push("...");else{let c=t.comment;c&&o&&(c=c.replace(/^\n+/,"")),c&&((!o||a)&&n[n.length-1]!==""&&n.push(""),n.push(hi.indentComment(i(c),"")))}return n.join(` `)+` -`}Bg.stringifyDocument=sR});var ui=E(Wg=>{"use strict";var iR=Ks(),Br=No(),Ye=Q(),oR=nn(),aR=Xt(),cR=ou(),lR=Vg(),cu=Oo(),uR=pl(),dR=Js(),lu=dl(),uu=class t{constructor(e,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ye.NODE_TYPE,{value:Ye.DOC});let s=null;typeof n=="function"||Array.isArray(n)?s=n:r===void 0&&n&&(r=n,n=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},r);this.options=i;let{version:o}=i;r?._directives?(this.directives=r._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new lu.Directives({version:o}),this.setSchema(o,r),this.contents=e===void 0?null:this.createNode(e,s,r)}clone(){let e=Object.create(t.prototype,{[Ye.NODE_TYPE]:{value:Ye.DOC}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=Ye.isNode(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){Vr(this.contents)&&this.contents.add(e)}addIn(e,n){Vr(this.contents)&&this.contents.addIn(e,n)}createAlias(e,n){if(!e.anchor){let r=cu.anchorNames(this);e.anchor=!n||r.has(n)?cu.findNewAnchor(n||"a",r):n}return new iR.Alias(e.anchor)}createNode(e,n,r){let s;if(typeof n=="function")e=n.call({"":e},"",e),s=n;else if(Array.isArray(n)){let h=w=>typeof w=="number"||w instanceof String||w instanceof Number,y=n.filter(h).map(String);y.length>0&&(n=n.concat(y)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:c,onTagObj:l,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:f}=cu.createNodeAnchors(this,o||"a"),m={aliasDuplicateObjects:i??!0,keepUndefined:c??!1,onAnchor:d,onTagObj:l,replacer:s,schema:this.schema,sourceObjects:f},g=dR.createNode(e,u,m);return a&&Ye.isCollection(g)&&(g.flow=!0),p(),g}createPair(e,n,r={}){let s=this.createNode(e,null,r),i=this.createNode(n,null,r);return new oR.Pair(s,i)}delete(e){return Vr(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Br.isEmptyPath(e)?this.contents==null?!1:(this.contents=null,!0):Vr(this.contents)?this.contents.deleteIn(e):!1}get(e,n){return Ye.isCollection(this.contents)?this.contents.get(e,n):void 0}getIn(e,n){return Br.isEmptyPath(e)?!n&&Ye.isScalar(this.contents)?this.contents.value:this.contents:Ye.isCollection(this.contents)?this.contents.getIn(e,n):void 0}has(e){return Ye.isCollection(this.contents)?this.contents.has(e):!1}hasIn(e){return Br.isEmptyPath(e)?this.contents!==void 0:Ye.isCollection(this.contents)?this.contents.hasIn(e):!1}set(e,n){this.contents==null?this.contents=Br.collectionFromPath(this.schema,[e],n):Vr(this.contents)&&this.contents.set(e,n)}setIn(e,n){Br.isEmptyPath(e)?this.contents=n:this.contents==null?this.contents=Br.collectionFromPath(this.schema,Array.from(e),n):Vr(this.contents)&&this.contents.setIn(e,n)}setSchema(e,n={}){typeof e=="number"&&(e=String(e));let r;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new lu.Directives({version:"1.1"}),r={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new lu.Directives({version:e}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new cR.Schema(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!e,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},c=aR.toJS(this.contents,n??"",a);if(typeof i=="function")for(let{count:l,res:u}of a.anchors.values())i(u,l);return typeof o=="function"?uR.applyReviver(o,{"":c},"",c):c}toJSON(e,n){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:n})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let n=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return lR.stringifyDocument(this,e)}};function Vr(t){if(Ye.isCollection(t))return!0;throw new Error("Expected a YAML collection as document contents")}Wg.Document=uu});var fi=E(pi=>{"use strict";var di=class extends Error{constructor(e,n,r,s){super(),this.name=e,this.code=r,this.message=s,this.pos=n}},du=class extends di{constructor(e,n,r){super("YAMLParseError",e,n,r)}},pu=class extends di{constructor(e,n,r){super("YAMLWarning",e,n,r)}},pR=(t,e)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>e.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=t.substring(e.lineStarts[r-1],e.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=t.substring(e.lineStarts[r-2],e.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026 +`}wh.stringifyDocument=zR});var yi=E(kh=>{"use strict";var HR=ti(),Yr=zo(),Qe=re(),KR=sn(),JR=en(),YR=Au(),ZR=vh(),Iu=Uo(),XR=Nl(),QR=ni(),Ou=Ml(),Du=class t{constructor(e,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Qe.NODE_TYPE,{value:Qe.DOC});let s=null;typeof n=="function"||Array.isArray(n)?s=n:r===void 0&&n&&(r=n,n=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},r);this.options=i;let{version:o}=i;r?._directives?(this.directives=r._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new Ou.Directives({version:o}),this.setSchema(o,r),this.contents=e===void 0?null:this.createNode(e,s,r)}clone(){let e=Object.create(t.prototype,{[Qe.NODE_TYPE]:{value:Qe.DOC}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=Qe.isNode(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){Zr(this.contents)&&this.contents.add(e)}addIn(e,n){Zr(this.contents)&&this.contents.addIn(e,n)}createAlias(e,n){if(!e.anchor){let r=Iu.anchorNames(this);e.anchor=!n||r.has(n)?Iu.findNewAnchor(n||"a",r):n}return new HR.Alias(e.anchor)}createNode(e,n,r){let s;if(typeof n=="function")e=n.call({"":e},"",e),s=n;else if(Array.isArray(n)){let h=w=>typeof w=="number"||w instanceof String||w instanceof Number,y=n.filter(h).map(String);y.length>0&&(n=n.concat(y)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:c,onTagObj:l,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:f}=Iu.createNodeAnchors(this,o||"a"),m={aliasDuplicateObjects:i??!0,keepUndefined:c??!1,onAnchor:d,onTagObj:l,replacer:s,schema:this.schema,sourceObjects:f},g=QR.createNode(e,u,m);return a&&Qe.isCollection(g)&&(g.flow=!0),p(),g}createPair(e,n,r={}){let s=this.createNode(e,null,r),i=this.createNode(n,null,r);return new KR.Pair(s,i)}delete(e){return Zr(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Yr.isEmptyPath(e)?this.contents==null?!1:(this.contents=null,!0):Zr(this.contents)?this.contents.deleteIn(e):!1}get(e,n){return Qe.isCollection(this.contents)?this.contents.get(e,n):void 0}getIn(e,n){return Yr.isEmptyPath(e)?!n&&Qe.isScalar(this.contents)?this.contents.value:this.contents:Qe.isCollection(this.contents)?this.contents.getIn(e,n):void 0}has(e){return Qe.isCollection(this.contents)?this.contents.has(e):!1}hasIn(e){return Yr.isEmptyPath(e)?this.contents!==void 0:Qe.isCollection(this.contents)?this.contents.hasIn(e):!1}set(e,n){this.contents==null?this.contents=Yr.collectionFromPath(this.schema,[e],n):Zr(this.contents)&&this.contents.set(e,n)}setIn(e,n){Yr.isEmptyPath(e)?this.contents=n:this.contents==null?this.contents=Yr.collectionFromPath(this.schema,Array.from(e),n):Zr(this.contents)&&this.contents.setIn(e,n)}setSchema(e,n={}){typeof e=="number"&&(e=String(e));let r;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new Ou.Directives({version:"1.1"}),r={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new Ou.Directives({version:e}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new YR.Schema(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!e,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},c=JR.toJS(this.contents,n??"",a);if(typeof i=="function")for(let{count:l,res:u}of a.anchors.values())i(u,l);return typeof o=="function"?XR.applyReviver(o,{"":c},"",c):c}toJSON(e,n){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:n})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let n=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return ZR.stringifyDocument(this,e)}};function Zr(t){if(Qe.isCollection(t))return!0;throw new Error("Expected a YAML collection as document contents")}kh.Document=Du});var vi=E(wi=>{"use strict";var bi=class extends Error{constructor(e,n,r,s){super(),this.name=e,this.code=r,this.message=s,this.pos=n}},Mu=class extends bi{constructor(e,n,r){super("YAMLParseError",e,n,r)}},Nu=class extends bi{constructor(e,n,r){super("YAMLWarning",e,n,r)}},eC=(t,e)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>e.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=t.substring(e.lineStarts[r-1],e.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=t.substring(e.lineStarts[r-2],e.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026 `),o=a+o}if(/[^ ]/.test(o)){let a=1,c=n.linePos[1];c?.line===r&&c.col>s&&(a=Math.max(1,Math.min(c.col-s,80-i)));let l=" ".repeat(i)+"^".repeat(a);n.message+=`: ${o} ${l} -`}};pi.YAMLError=di;pi.YAMLParseError=du;pi.YAMLWarning=pu;pi.prettifyError=pR});var mi=E(zg=>{"use strict";function fR(t,{flow:e,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let c=!1,l=a,u=a,d="",p="",f=!1,m=!1,g=null,h=null,y=null,w=null,S=null,v=null,k=null;for(let _ of t)switch(m&&(_.type!=="space"&&_.type!=="newline"&&_.type!=="comma"&&i(_.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m=!1),g&&(l&&_.type!=="comment"&&_.type!=="newline"&&i(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),g=null),_.type){case"space":!e&&(n!=="doc-start"||r?.type!=="flow-collection")&&_.source.includes(" ")&&(g=_),u=!0;break;case"comment":{u||i(_,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let ne=_.source.substring(1)||" ";d?d+=p+ne:d=ne,p="",l=!1;break}case"newline":l?d?d+=_.source:(!v||n!=="seq-item-ind")&&(c=!0):p+=_.source,l=!0,f=!0,(h||y)&&(w=_),u=!0;break;case"anchor":h&&i(_,"MULTIPLE_ANCHORS","A node can have at most one anchor"),_.source.endsWith(":")&&i(_.offset+_.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),h=_,k??(k=_.offset),l=!1,u=!1,m=!0;break;case"tag":{y&&i(_,"MULTIPLE_TAGS","A node can have at most one tag"),y=_,k??(k=_.offset),l=!1,u=!1,m=!0;break}case n:(h||y)&&i(_,"BAD_PROP_ORDER",`Anchors and tags must be after the ${_.source} indicator`),v&&i(_,"UNEXPECTED_TOKEN",`Unexpected ${_.source} in ${e??"collection"}`),v=_,l=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(e){S&&i(_,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=_,l=!1,u=!1;break}default:i(_,"UNEXPECTED_TOKEN",`Unexpected ${_.type} token`),l=!1,u=!1}let $=t[t.length-1],F=$?$.offset+$.source.length:s;return m&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),g&&(l&&g.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:S,found:v,spaceBefore:c,comment:d,hasNewline:f,anchor:h,tag:y,newlineAfterProp:w,end:F,start:k??F}}zg.resolveProps=fR});var ya=E(Hg=>{"use strict";function fu(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` -`))return!0;if(t.end){for(let e of t.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of t.items){for(let n of e.start)if(n.type==="newline")return!0;if(e.sep){for(let n of e.sep)if(n.type==="newline")return!0}if(fu(e.key)||fu(e.value))return!0}return!1;default:return!0}}Hg.containsNewline=fu});var mu=E(Kg=>{"use strict";var mR=ya();function gR(t,e,n){if(e?.type==="flow-collection"){let r=e.end[0];r.indent===t&&(r.source==="]"||r.source==="}")&&mR.containsNewline(e)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}Kg.flowIndentCheck=gR});var gu=E(Yg=>{"use strict";var Jg=Q();function hR(t,e,n){let{uniqueKeys:r}=t.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||Jg.isScalar(i)&&Jg.isScalar(o)&&i.value===o.value;return e.some(i=>s(i.key,n))}Yg.mapIncludes=hR});var nh=E(th=>{"use strict";var Zg=nn(),yR=sn(),Xg=mi(),bR=ya(),Qg=mu(),wR=gu(),eh="All mapping items must start at the same column";function vR({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=i?.nodeClass??yR.YAMLMap,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let c=r.offset,l=null;for(let u of r.items){let{start:d,key:p,sep:f,value:m}=u,g=Xg.resolveProps(d,{indicator:"explicit-key-ind",next:p??f?.[0],offset:c,onError:s,parentIndent:r.indent,startOnNewline:!0}),h=!g.found;if(h){if(p&&(p.type==="block-seq"?s(c,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(c,"BAD_INDENT",eh)),!g.anchor&&!g.tag&&!f){l=g.end,g.comment&&(a.comment?a.comment+=` -`+g.comment:a.comment=g.comment);continue}(g.newlineAfterProp||bR.containsNewline(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else g.found?.indent!==r.indent&&s(c,"BAD_INDENT",eh);n.atKey=!0;let y=g.end,w=p?t(n,p,g,s):e(n,y,d,null,g,s);n.schema.compat&&Qg.flowIndentCheck(r.indent,p,s),n.atKey=!1,wR.mapIncludes(n,a.items,w)&&s(y,"DUPLICATE_KEY","Map keys must be unique");let S=Xg.resolveProps(f??[],{indicator:"map-value-ind",next:m,offset:w.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(c=S.end,S.found){h&&(m?.type==="block-map"&&!S.hasNewline&&s(c,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&g.start{"use strict";var kR=on(),ER=mi(),SR=mu();function _R({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=i?.nodeClass??kR.YAMLSeq,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let c=r.offset,l=null;for(let{start:u,value:d}of r.items){let p=ER.resolveProps(u,{indicator:"seq-item-ind",next:d,offset:c,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||d)d?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(c,"MISSING_CHAR","Sequence item without - indicator");else{l=p.end,p.comment&&(a.comment=p.comment);continue}let f=d?t(n,d,p,s):e(n,p.end,u,null,p,s);n.schema.compat&&SR.flowIndentCheck(r.indent,d,s),c=f.range[2],a.items.push(f)}return a.range=[r.offset,c,l??c],a}rh.resolveBlockSeq=_R});var Wr=E(ih=>{"use strict";function TR(t,e,n,r){let s="";if(t){let i=!1,o="";for(let a of t){let{source:c,type:l}=a;switch(l){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let u=c.substring(1)||" ";s?s+=o+u:s=u,o="";break}case"newline":s&&(o+=c),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${l} at node end`)}e+=c.length}}return{comment:s,offset:e}}ih.resolveEnd=TR});var lh=E(ch=>{"use strict";var xR=Q(),$R=nn(),oh=sn(),RR=on(),AR=Wr(),ah=mi(),CR=ya(),PR=gu(),hu="Block collections are not allowed within flow collections",yu=t=>t&&(t.type==="block-map"||t.type==="block-seq");function OR({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",c=i?.nodeClass??(o?oh.YAMLMap:RR.YAMLSeq),l=new c(n.schema);l.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let h=0;h0){let h=AR.resolveEnd(m,g,n.options.strict,s);h.comment&&(l.comment?l.comment+=` -`+h.comment:l.comment=h.comment),l.range=[r.offset,g,h.offset]}else l.range=[r.offset,g,g];return l}ch.resolveFlowCollection=OR});var dh=E(uh=>{"use strict";var IR=Q(),DR=ve(),MR=sn(),NR=on(),LR=nh(),GR=sh(),jR=lh();function bu(t,e,n,r,s,i){let o=n.type==="block-map"?LR.resolveBlockMap(t,e,n,r,i):n.type==="block-seq"?GR.resolveBlockSeq(t,e,n,r,i):jR.resolveFlowCollection(t,e,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function FR(t,e,n,r,s){let i=r.tag,o=i?e.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:f}=r,m=p&&i?p.offset>i.offset?p:i:p??i;m&&(!f||f.offsetp.tag===o&&p.collection===a);if(!c){let p=e.schema.knownTags[o];if(p?.collection===a)e.schema.tags.push(Object.assign({},p,{default:!1})),c=p;else return p?s(i,"BAD_COLLECTION_TYPE",`${p.tag} used for ${a} collection, but expects ${p.collection??"scalar"}`,!0):s(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${o}`,!0),bu(t,e,n,s,o)}let l=bu(t,e,n,s,o,c),u=c.resolve?.(l,p=>s(i,"TAG_RESOLVE_FAILED",p),e.options)??l,d=IR.isNode(u)?u:new DR.Scalar(u);return d.range=l.range,d.tag=o,c?.format&&(d.format=c.format),d}uh.composeCollection=FR});var vu=E(ph=>{"use strict";var wu=ve();function qR(t,e,n){let r=e.offset,s=UR(e,t.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?wu.Scalar.BLOCK_FOLDED:wu.Scalar.BLOCK_LITERAL,o=e.source?BR(e.source):[],a=o.length;for(let g=o.length-1;g>=0;--g){let h=o[g][1];if(h===""||h==="\r")a=g;else break}if(a===0){let g=s.chomp==="+"&&o.length>0?` +`}};wi.YAMLError=bi;wi.YAMLParseError=Mu;wi.YAMLWarning=Nu;wi.prettifyError=eC});var ki=E(Eh=>{"use strict";function tC(t,{flow:e,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let c=!1,l=a,u=a,d="",p="",f=!1,m=!1,g=null,h=null,y=null,w=null,S=null,b=null,k=null;for(let T of t)switch(m&&(T.type!=="space"&&T.type!=="newline"&&T.type!=="comma"&&i(T.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m=!1),g&&(l&&T.type!=="comment"&&T.type!=="newline"&&i(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),g=null),T.type){case"space":!e&&(n!=="doc-start"||r?.type!=="flow-collection")&&T.source.includes(" ")&&(g=T),u=!0;break;case"comment":{u||i(T,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let se=T.source.substring(1)||" ";d?d+=p+se:d=se,p="",l=!1;break}case"newline":l?d?d+=T.source:(!b||n!=="seq-item-ind")&&(c=!0):p+=T.source,l=!0,f=!0,(h||y)&&(w=T),u=!0;break;case"anchor":h&&i(T,"MULTIPLE_ANCHORS","A node can have at most one anchor"),T.source.endsWith(":")&&i(T.offset+T.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),h=T,k??(k=T.offset),l=!1,u=!1,m=!0;break;case"tag":{y&&i(T,"MULTIPLE_TAGS","A node can have at most one tag"),y=T,k??(k=T.offset),l=!1,u=!1,m=!0;break}case n:(h||y)&&i(T,"BAD_PROP_ORDER",`Anchors and tags must be after the ${T.source} indicator`),b&&i(T,"UNEXPECTED_TOKEN",`Unexpected ${T.source} in ${e??"collection"}`),b=T,l=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(e){S&&i(T,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=T,l=!1,u=!1;break}default:i(T,"UNEXPECTED_TOKEN",`Unexpected ${T.type} token`),l=!1,u=!1}let _=t[t.length-1],G=_?_.offset+_.source.length:s;return m&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),g&&(l&&g.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:S,found:b,spaceBefore:c,comment:d,hasNewline:f,anchor:h,tag:y,newlineAfterProp:w,end:G,start:k??G}}Eh.resolveProps=tC});var $a=E(Sh=>{"use strict";function Lu(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` +`))return!0;if(t.end){for(let e of t.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of t.items){for(let n of e.start)if(n.type==="newline")return!0;if(e.sep){for(let n of e.sep)if(n.type==="newline")return!0}if(Lu(e.key)||Lu(e.value))return!0}return!1;default:return!0}}Sh.containsNewline=Lu});var Gu=E(xh=>{"use strict";var nC=$a();function rC(t,e,n){if(e?.type==="flow-collection"){let r=e.end[0];r.indent===t&&(r.source==="]"||r.source==="}")&&nC.containsNewline(e)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}xh.flowIndentCheck=rC});var Fu=E(_h=>{"use strict";var Th=re();function sC(t,e,n){let{uniqueKeys:r}=t.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||Th.isScalar(i)&&Th.isScalar(o)&&i.value===o.value;return e.some(i=>s(i.key,n))}_h.mapIncludes=sC});var Ih=E(Ph=>{"use strict";var $h=sn(),iC=an(),Rh=ki(),oC=$a(),Ch=Gu(),aC=Fu(),Ah="All mapping items must start at the same column";function cC({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=i?.nodeClass??iC.YAMLMap,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let c=r.offset,l=null;for(let u of r.items){let{start:d,key:p,sep:f,value:m}=u,g=Rh.resolveProps(d,{indicator:"explicit-key-ind",next:p??f?.[0],offset:c,onError:s,parentIndent:r.indent,startOnNewline:!0}),h=!g.found;if(h){if(p&&(p.type==="block-seq"?s(c,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(c,"BAD_INDENT",Ah)),!g.anchor&&!g.tag&&!f){l=g.end,g.comment&&(a.comment?a.comment+=` +`+g.comment:a.comment=g.comment);continue}(g.newlineAfterProp||oC.containsNewline(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else g.found?.indent!==r.indent&&s(c,"BAD_INDENT",Ah);n.atKey=!0;let y=g.end,w=p?t(n,p,g,s):e(n,y,d,null,g,s);n.schema.compat&&Ch.flowIndentCheck(r.indent,p,s),n.atKey=!1,aC.mapIncludes(n,a.items,w)&&s(y,"DUPLICATE_KEY","Map keys must be unique");let S=Rh.resolveProps(f??[],{indicator:"map-value-ind",next:m,offset:w.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(c=S.end,S.found){h&&(m?.type==="block-map"&&!S.hasNewline&&s(c,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&g.start{"use strict";var lC=cn(),uC=ki(),dC=Gu();function pC({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=i?.nodeClass??lC.YAMLSeq,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let c=r.offset,l=null;for(let{start:u,value:d}of r.items){let p=uC.resolveProps(u,{indicator:"seq-item-ind",next:d,offset:c,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||d)d?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(c,"MISSING_CHAR","Sequence item without - indicator");else{l=p.end,p.comment&&(a.comment=p.comment);continue}let f=d?t(n,d,p,s):e(n,p.end,u,null,p,s);n.schema.compat&&dC.flowIndentCheck(r.indent,d,s),c=f.range[2],a.items.push(f)}return a.range=[r.offset,c,l??c],a}Oh.resolveBlockSeq=pC});var Xr=E(Mh=>{"use strict";function fC(t,e,n,r){let s="";if(t){let i=!1,o="";for(let a of t){let{source:c,type:l}=a;switch(l){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let u=c.substring(1)||" ";s?s+=o+u:s=u,o="";break}case"newline":s&&(o+=c),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${l} at node end`)}e+=c.length}}return{comment:s,offset:e}}Mh.resolveEnd=fC});var Fh=E(Gh=>{"use strict";var mC=re(),gC=sn(),Nh=an(),hC=cn(),yC=Xr(),Lh=ki(),bC=$a(),wC=Fu(),ju="Block collections are not allowed within flow collections",qu=t=>t&&(t.type==="block-map"||t.type==="block-seq");function vC({composeNode:t,composeEmptyNode:e},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",c=i?.nodeClass??(o?Nh.YAMLMap:hC.YAMLSeq),l=new c(n.schema);l.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let h=0;h0){let h=yC.resolveEnd(m,g,n.options.strict,s);h.comment&&(l.comment?l.comment+=` +`+h.comment:l.comment=h.comment),l.range=[r.offset,g,h.offset]}else l.range=[r.offset,g,g];return l}Gh.resolveFlowCollection=vC});var qh=E(jh=>{"use strict";var kC=re(),EC=xe(),SC=an(),xC=cn(),TC=Ih(),_C=Dh(),$C=Fh();function Uu(t,e,n,r,s,i){let o=n.type==="block-map"?TC.resolveBlockMap(t,e,n,r,i):n.type==="block-seq"?_C.resolveBlockSeq(t,e,n,r,i):$C.resolveFlowCollection(t,e,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function RC(t,e,n,r,s){let i=r.tag,o=i?e.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:f}=r,m=p&&i?p.offset>i.offset?p:i:p??i;m&&(!f||f.offsetp.tag===o&&p.collection===a);if(!c){let p=e.schema.knownTags[o];if(p?.collection===a)e.schema.tags.push(Object.assign({},p,{default:!1})),c=p;else return p?s(i,"BAD_COLLECTION_TYPE",`${p.tag} used for ${a} collection, but expects ${p.collection??"scalar"}`,!0):s(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${o}`,!0),Uu(t,e,n,s,o)}let l=Uu(t,e,n,s,o,c),u=c.resolve?.(l,p=>s(i,"TAG_RESOLVE_FAILED",p),e.options)??l,d=kC.isNode(u)?u:new EC.Scalar(u);return d.range=l.range,d.tag=o,c?.format&&(d.format=c.format),d}jh.composeCollection=RC});var Vu=E(Uh=>{"use strict";var Bu=xe();function CC(t,e,n){let r=e.offset,s=AC(e,t.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?Bu.Scalar.BLOCK_FOLDED:Bu.Scalar.BLOCK_LITERAL,o=e.source?PC(e.source):[],a=o.length;for(let g=o.length-1;g>=0;--g){let h=o[g][1];if(h===""||h==="\r")a=g;else break}if(a===0){let g=s.chomp==="+"&&o.length>0?` `.repeat(Math.max(1,o.length-1)):"",h=r+s.length;return e.source&&(h+=e.source.length),{value:g,type:i,comment:s.comment,range:[r,h,h]}}let c=e.indent+s.indent,l=e.offset+s.length,u=0;for(let g=0;gc&&(c=h.length);else{h.length=a;--g)o[g][0].length>c&&(a=g+1);let d="",p="",f=!1;for(let g=0;gc||y[0]===" "?(p===" "?p=` `:!f&&p===` `&&(p=` @@ -81,119 +81,119 @@ ${l} `+o[g][0].slice(c);d[d.length-1]!==` `&&(d+=` `);break;default:d+=` -`}let m=r+s.length+e.source.length;return{value:d,type:i,comment:s.comment,range:[r,m,m]}}function UR({offset:t,props:e},n,r){if(e[0].type!=="block-scalar-header")return r(e[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=e[0],i=s[0],o=0,a="",c=-1;for(let p=1;p{"use strict";var ku=ve(),VR=Wr();function WR(t,e,n){let{offset:r,type:s,source:i,end:o}=t,a,c,l=(p,f,m)=>n(r+p,f,m);switch(s){case"scalar":a=ku.Scalar.PLAIN,c=zR(i,l);break;case"single-quoted-scalar":a=ku.Scalar.QUOTE_SINGLE,c=HR(i,l);break;case"double-quoted-scalar":a=ku.Scalar.QUOTE_DOUBLE,c=KR(i,l);break;default:return n(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let u=r+i.length,d=VR.resolveEnd(o,u,e,n);return{value:c,type:a,comment:d.comment,range:[r,u,d.offset]}}function zR(t,e){let n="";switch(t[0]){case" ":n="a tab character";break;case",":n="flow indicator character ,";break;case"%":n="directive indicator character %";break;case"|":case">":{n=`block scalar indicator ${t[0]}`;break}case"@":case"`":{n=`reserved character ${t[0]}`;break}}return n&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${n}`),fh(t)}function HR(t,e){return(t[t.length-1]!=="'"||t.length===1)&&e(t.length,"MISSING_CHAR","Missing closing 'quote"),fh(t.slice(1,-1)).replace(/''/g,"'")}function fh(t){let e,n;try{e=new RegExp(`(.*?)(?{"use strict";var Wu=xe(),IC=Xr();function OC(t,e,n){let{offset:r,type:s,source:i,end:o}=t,a,c,l=(p,f,m)=>n(r+p,f,m);switch(s){case"scalar":a=Wu.Scalar.PLAIN,c=DC(i,l);break;case"single-quoted-scalar":a=Wu.Scalar.QUOTE_SINGLE,c=MC(i,l);break;case"double-quoted-scalar":a=Wu.Scalar.QUOTE_DOUBLE,c=NC(i,l);break;default:return n(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let u=r+i.length,d=IC.resolveEnd(o,u,e,n);return{value:c,type:a,comment:d.comment,range:[r,u,d.offset]}}function DC(t,e){let n="";switch(t[0]){case" ":n="a tab character";break;case",":n="flow indicator character ,";break;case"%":n="directive indicator character %";break;case"|":case">":{n=`block scalar indicator ${t[0]}`;break}case"@":case"`":{n=`reserved character ${t[0]}`;break}}return n&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${n}`),Bh(t)}function MC(t,e){return(t[t.length-1]!=="'"||t.length===1)&&e(t.length,"MISSING_CHAR","Missing closing 'quote"),Bh(t.slice(1,-1)).replace(/''/g,"'")}function Bh(t){let e,n;try{e=new RegExp(`(.*?)(?i?t.slice(i,r+1):s)}else n+=s}return(t[t.length-1]!=='"'||t.length===1)&&e(t.length,"MISSING_CHAR",'Missing closing "quote'),n}function JR(t,e){let n="",r=t[e+1];for(;(r===" "||r===" "||r===` +`)&&(n+=r>i?t.slice(i,r+1):s)}else n+=s}return(t[t.length-1]!=='"'||t.length===1)&&e(t.length,"MISSING_CHAR",'Missing closing "quote'),n}function LC(t,e){let n="",r=t[e+1];for(;(r===" "||r===" "||r===` `||r==="\r")&&!(r==="\r"&&t[e+2]!==` `);)r===` `&&(n+=` -`),e+=1,r=t[e+1];return n||(n=" "),{fold:n,offset:e}}var YR={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` -`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function ZR(t,e,n,r){let s=t.substr(e,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=t.substr(e-2,n+2);return r(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}mh.resolveFlowScalar=WR});var yh=E(hh=>{"use strict";var jn=Q(),gh=ve(),XR=vu(),QR=Eu();function eA(t,e,n,r){let{value:s,type:i,comment:o,range:a}=e.type==="block-scalar"?XR.resolveBlockScalar(t,e,r):QR.resolveFlowScalar(e,t.options.strict,r),c=n?t.directives.tagName(n.source,d=>r(n,"TAG_RESOLVE_FAILED",d)):null,l;t.options.stringKeys&&t.atKey?l=t.schema[jn.SCALAR]:c?l=tA(t.schema,s,c,n,r):e.type==="scalar"?l=nA(t,s,e,r):l=t.schema[jn.SCALAR];let u;try{let d=l.resolve(s,p=>r(n??e,"TAG_RESOLVE_FAILED",p),t.options);u=jn.isScalar(d)?d:new gh.Scalar(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??e,"TAG_RESOLVE_FAILED",p),u=new gh.Scalar(s)}return u.range=a,u.source=s,i&&(u.type=i),c&&(u.tag=c),l.format&&(u.format=l.format),o&&(u.comment=o),u}function tA(t,e,n,r,s){if(n==="!")return t[jn.SCALAR];let i=[];for(let a of t.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(e))return a;let o=t.knownTags[n];return o&&!o.collection?(t.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),t[jn.SCALAR])}function nA({atKey:t,directives:e,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||t&&a.default==="key")&&a.test?.test(r))||n[jn.SCALAR];if(n.compat){let a=n.compat.find(c=>c.default&&c.test?.test(r))??n[jn.SCALAR];if(o.tag!==a.tag){let c=e.tagString(o.tag),l=e.tagString(a.tag),u=`Value may be parsed as either ${c} or ${l}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}hh.composeScalar=eA});var wh=E(bh=>{"use strict";function rA(t,e,n){if(e){n??(n=e.length);for(let r=n-1;r>=0;--r){let s=e[r];switch(s.type){case"space":case"comment":case"newline":t-=s.source.length;continue}for(s=e[++r];s?.type==="space";)t+=s.source.length,s=e[++r];break}}return t}bh.emptyScalarPosition=rA});var Eh=E(_u=>{"use strict";var sA=Ks(),iA=Q(),oA=dh(),vh=yh(),aA=Wr(),cA=wh(),lA={composeNode:kh,composeEmptyNode:Su};function kh(t,e,n,r){let s=t.atKey,{spaceBefore:i,comment:o,anchor:a,tag:c}=n,l,u=!0;switch(e.type){case"alias":l=uA(t,e,r),(a||c)&&r(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=vh.composeScalar(t,e,c,r),a&&(l.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{l=oA.composeCollection(lA,t,e,n,r),a&&(l.anchor=a.source.substring(1))}catch(d){let p=d instanceof Error?d.message:String(d);r(e,"RESOURCE_EXHAUSTION",p)}break;default:{let d=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;r(e,"UNEXPECTED_TOKEN",d),u=!1}}return l??(l=Su(t,e.offset,void 0,null,n,r)),a&&l.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&t.options.stringKeys&&(!iA.isScalar(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&r(c??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(l.spaceBefore=!0),o&&(e.type==="scalar"&&e.source===""?l.comment=o:l.commentBefore=o),t.options.keepSourceTokens&&u&&(l.srcToken=e),l}function Su(t,e,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:c},l){let u={type:"scalar",offset:cA.emptyScalarPosition(e,n,r),indent:-1,source:""},d=vh.composeScalar(t,u,a,l);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&l(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=c),d}function uA({options:t},{offset:e,source:n,end:r},s){let i=new sA.Alias(n.substring(1));i.source===""&&s(e,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(e+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=e+n.length,a=aA.resolveEnd(r,o,t.strict,s);return i.range=[e,o,a.offset],a.comment&&(i.comment=a.comment),i}_u.composeEmptyNode=Su;_u.composeNode=kh});var Th=E(_h=>{"use strict";var dA=ui(),Sh=Eh(),pA=Wr(),fA=mi();function mA(t,e,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:e},t),c=new dA.Document(void 0,a),l={atKey:!1,atRoot:!0,directives:c.directives,options:c.options,schema:c.schema},u=fA.resolveProps(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(c.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),c.contents=s?Sh.composeNode(l,s,u,o):Sh.composeEmptyNode(l,u.end,r,null,u,o);let d=c.contents.range[2],p=pA.resolveEnd(i,d,!1,o);return p.comment&&(c.comment=p.comment),c.range=[n,d,p.offset],c}_h.composeDoc=mA});var xu=E(Rh=>{"use strict";var gA=require("process"),hA=dl(),yA=ui(),gi=fi(),xh=Q(),bA=Th(),wA=Wr();function hi(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:n}=t;return[e,e+(typeof n=="string"?n.length:1)]}function $h(t){let e="",n=!1,r=!1;for(let s=0;s{"use strict";var Bn=re(),Wh=xe(),jC=Vu(),qC=zu();function UC(t,e,n,r){let{value:s,type:i,comment:o,range:a}=e.type==="block-scalar"?jC.resolveBlockScalar(t,e,r):qC.resolveFlowScalar(e,t.options.strict,r),c=n?t.directives.tagName(n.source,d=>r(n,"TAG_RESOLVE_FAILED",d)):null,l;t.options.stringKeys&&t.atKey?l=t.schema[Bn.SCALAR]:c?l=BC(t.schema,s,c,n,r):e.type==="scalar"?l=VC(t,s,e,r):l=t.schema[Bn.SCALAR];let u;try{let d=l.resolve(s,p=>r(n??e,"TAG_RESOLVE_FAILED",p),t.options);u=Bn.isScalar(d)?d:new Wh.Scalar(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??e,"TAG_RESOLVE_FAILED",p),u=new Wh.Scalar(s)}return u.range=a,u.source=s,i&&(u.type=i),c&&(u.tag=c),l.format&&(u.format=l.format),o&&(u.comment=o),u}function BC(t,e,n,r,s){if(n==="!")return t[Bn.SCALAR];let i=[];for(let a of t.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(e))return a;let o=t.knownTags[n];return o&&!o.collection?(t.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),t[Bn.SCALAR])}function VC({atKey:t,directives:e,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||t&&a.default==="key")&&a.test?.test(r))||n[Bn.SCALAR];if(n.compat){let a=n.compat.find(c=>c.default&&c.test?.test(r))??n[Bn.SCALAR];if(o.tag!==a.tag){let c=e.tagString(o.tag),l=e.tagString(a.tag),u=`Value may be parsed as either ${c} or ${l}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}zh.composeScalar=UC});var Jh=E(Kh=>{"use strict";function WC(t,e,n){if(e){n??(n=e.length);for(let r=n-1;r>=0;--r){let s=e[r];switch(s.type){case"space":case"comment":case"newline":t-=s.source.length;continue}for(s=e[++r];s?.type==="space";)t+=s.source.length,s=e[++r];break}}return t}Kh.emptyScalarPosition=WC});var Xh=E(Ku=>{"use strict";var zC=ti(),HC=re(),KC=qh(),Yh=Hh(),JC=Xr(),YC=Jh(),ZC={composeNode:Zh,composeEmptyNode:Hu};function Zh(t,e,n,r){let s=t.atKey,{spaceBefore:i,comment:o,anchor:a,tag:c}=n,l,u=!0;switch(e.type){case"alias":l=XC(t,e,r),(a||c)&&r(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=Yh.composeScalar(t,e,c,r),a&&(l.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{l=KC.composeCollection(ZC,t,e,n,r),a&&(l.anchor=a.source.substring(1))}catch(d){let p=d instanceof Error?d.message:String(d);r(e,"RESOURCE_EXHAUSTION",p)}break;default:{let d=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;r(e,"UNEXPECTED_TOKEN",d),u=!1}}return l??(l=Hu(t,e.offset,void 0,null,n,r)),a&&l.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&t.options.stringKeys&&(!HC.isScalar(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&r(c??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(l.spaceBefore=!0),o&&(e.type==="scalar"&&e.source===""?l.comment=o:l.commentBefore=o),t.options.keepSourceTokens&&u&&(l.srcToken=e),l}function Hu(t,e,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:c},l){let u={type:"scalar",offset:YC.emptyScalarPosition(e,n,r),indent:-1,source:""},d=Yh.composeScalar(t,u,a,l);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&l(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=c),d}function XC({options:t},{offset:e,source:n,end:r},s){let i=new zC.Alias(n.substring(1));i.source===""&&s(e,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(e+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=e+n.length,a=JC.resolveEnd(r,o,t.strict,s);return i.range=[e,o,a.offset],a.comment&&(i.comment=a.comment),i}Ku.composeEmptyNode=Hu;Ku.composeNode=Zh});var ty=E(ey=>{"use strict";var QC=yi(),Qh=Xh(),eA=Xr(),tA=ki();function nA(t,e,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:e},t),c=new QC.Document(void 0,a),l={atKey:!1,atRoot:!0,directives:c.directives,options:c.options,schema:c.schema},u=tA.resolveProps(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(c.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),c.contents=s?Qh.composeNode(l,s,u,o):Qh.composeEmptyNode(l,u.end,r,null,u,o);let d=c.contents.range[2],p=eA.resolveEnd(i,d,!1,o);return p.comment&&(c.comment=p.comment),c.range=[n,d,p.offset],c}ey.composeDoc=nA});var Yu=E(sy=>{"use strict";var rA=require("process"),sA=Ml(),iA=yi(),Ei=vi(),ny=re(),oA=ty(),aA=Xr();function Si(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:n}=t;return[e,e+(typeof n=="string"?n.length:1)]}function ry(t){let e="",n=!1,r=!1;for(let s=0;s{let o=hi(n);i?this.warnings.push(new gi.YAMLWarning(o,r,s)):this.errors.push(new gi.YAMLParseError(o,r,s))},this.directives=new hA.Directives({version:e.version||"1.2"}),this.options=e}decorate(e,n){let{comment:r,afterEmptyLine:s}=$h(this.prelude);if(r){let i=e.contents;if(n)e.comment=e.comment?`${e.comment} -${r}`:r;else if(s||e.directives.docStart||!i)e.commentBefore=r;else if(xh.isCollection(i)&&!i.flow&&i.items.length>0){let o=i.items[0];xh.isPair(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r} +`)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":t[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:e,afterEmptyLine:r}}var Ju=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Si(n);i?this.warnings.push(new Ei.YAMLWarning(o,r,s)):this.errors.push(new Ei.YAMLParseError(o,r,s))},this.directives=new sA.Directives({version:e.version||"1.2"}),this.options=e}decorate(e,n){let{comment:r,afterEmptyLine:s}=ry(this.prelude);if(r){let i=e.contents;if(n)e.comment=e.comment?`${e.comment} +${r}`:r;else if(s||e.directives.docStart||!i)e.commentBefore=r;else if(ny.isCollection(i)&&!i.flow&&i.items.length>0){let o=i.items[0];ny.isPair(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r} ${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r} -${o}`:r}}if(n){for(let i=0;i{let i=hi(e);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let n=bA.composeDoc(this.options,this.directives,e,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let n=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,r=new gi.YAMLParseError(hi(e),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new gi.YAMLParseError(hi(e),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=wA.resolveEnd(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r} -${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new gi.YAMLParseError(hi(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let r=Object.assign({_directives:this.directives},this.options),s=new yA.Document(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};Rh.Composer=Tu});var Ph=E(ba=>{"use strict";var vA=vu(),kA=Eu(),EA=fi(),Ah=Qs();function SA(t,e=!0,n){if(t){let r=(s,i,o)=>{let a=typeof s=="number"?s:Array.isArray(s)?s[0]:s.offset;if(n)n(a,i,o);else throw new EA.YAMLParseError([a,a+1],i,o)};switch(t.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return kA.resolveFlowScalar(t,e,r);case"block-scalar":return vA.resolveBlockScalar({options:{strict:e}},t,r)}}return null}function _A(t,e){let{implicitKey:n=!1,indent:r,inFlow:s=!1,offset:i=-1,type:o="PLAIN"}=e,a=Ah.stringifyString({type:o,value:t},{implicitKey:n,indent:r>0?" ".repeat(r):"",inFlow:s,options:{blockQuote:!0,lineWidth:-1}}),c=e.end??[{type:"newline",offset:-1,indent:r,source:` +${o}`:r}}if(n){for(let i=0;i{let i=Si(e);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let n=oA.composeDoc(this.options,this.directives,e,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let n=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,r=new Ei.YAMLParseError(Si(e),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new Ei.YAMLParseError(Si(e),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=aA.resolveEnd(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r} +${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new Ei.YAMLParseError(Si(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let r=Object.assign({_directives:this.directives},this.options),s=new iA.Document(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};sy.Composer=Ju});var ay=E(Ra=>{"use strict";var cA=Vu(),lA=zu(),uA=vi(),iy=oi();function dA(t,e=!0,n){if(t){let r=(s,i,o)=>{let a=typeof s=="number"?s:Array.isArray(s)?s[0]:s.offset;if(n)n(a,i,o);else throw new uA.YAMLParseError([a,a+1],i,o)};switch(t.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return lA.resolveFlowScalar(t,e,r);case"block-scalar":return cA.resolveBlockScalar({options:{strict:e}},t,r)}}return null}function pA(t,e){let{implicitKey:n=!1,indent:r,inFlow:s=!1,offset:i=-1,type:o="PLAIN"}=e,a=iy.stringifyString({type:o,value:t},{implicitKey:n,indent:r>0?" ".repeat(r):"",inFlow:s,options:{blockQuote:!0,lineWidth:-1}}),c=e.end??[{type:"newline",offset:-1,indent:r,source:` `}];switch(a[0]){case"|":case">":{let l=a.indexOf(` `),u=a.substring(0,l),d=a.substring(l+1)+` -`,p=[{type:"block-scalar-header",offset:i,indent:r,source:u}];return Ch(p,c)||p.push({type:"newline",offset:-1,indent:r,source:` -`}),{type:"block-scalar",offset:i,indent:r,props:p,source:d}}case'"':return{type:"double-quoted-scalar",offset:i,indent:r,source:a,end:c};case"'":return{type:"single-quoted-scalar",offset:i,indent:r,source:a,end:c};default:return{type:"scalar",offset:i,indent:r,source:a,end:c}}}function TA(t,e,n={}){let{afterKey:r=!1,implicitKey:s=!1,inFlow:i=!1,type:o}=n,a="indent"in t?t.indent:null;if(r&&typeof a=="number"&&(a+=2),!o)switch(t.type){case"single-quoted-scalar":o="QUOTE_SINGLE";break;case"double-quoted-scalar":o="QUOTE_DOUBLE";break;case"block-scalar":{let l=t.props[0];if(l.type!=="block-scalar-header")throw new Error("Invalid block scalar header");o=l.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:o="PLAIN"}let c=Ah.stringifyString({type:o,value:e},{implicitKey:s||a===null,indent:a!==null&&a>0?" ".repeat(a):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}});switch(c[0]){case"|":case">":xA(t,c);break;case'"':$u(t,c,"double-quoted-scalar");break;case"'":$u(t,c,"single-quoted-scalar");break;default:$u(t,c,"scalar")}}function xA(t,e){let n=e.indexOf(` +`,p=[{type:"block-scalar-header",offset:i,indent:r,source:u}];return oy(p,c)||p.push({type:"newline",offset:-1,indent:r,source:` +`}),{type:"block-scalar",offset:i,indent:r,props:p,source:d}}case'"':return{type:"double-quoted-scalar",offset:i,indent:r,source:a,end:c};case"'":return{type:"single-quoted-scalar",offset:i,indent:r,source:a,end:c};default:return{type:"scalar",offset:i,indent:r,source:a,end:c}}}function fA(t,e,n={}){let{afterKey:r=!1,implicitKey:s=!1,inFlow:i=!1,type:o}=n,a="indent"in t?t.indent:null;if(r&&typeof a=="number"&&(a+=2),!o)switch(t.type){case"single-quoted-scalar":o="QUOTE_SINGLE";break;case"double-quoted-scalar":o="QUOTE_DOUBLE";break;case"block-scalar":{let l=t.props[0];if(l.type!=="block-scalar-header")throw new Error("Invalid block scalar header");o=l.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:o="PLAIN"}let c=iy.stringifyString({type:o,value:e},{implicitKey:s||a===null,indent:a!==null&&a>0?" ".repeat(a):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}});switch(c[0]){case"|":case">":mA(t,c);break;case'"':Zu(t,c,"double-quoted-scalar");break;case"'":Zu(t,c,"single-quoted-scalar");break;default:Zu(t,c,"scalar")}}function mA(t,e){let n=e.indexOf(` `),r=e.substring(0,n),s=e.substring(n+1)+` -`;if(t.type==="block-scalar"){let i=t.props[0];if(i.type!=="block-scalar-header")throw new Error("Invalid block scalar header");i.source=r,t.source=s}else{let{offset:i}=t,o="indent"in t?t.indent:-1,a=[{type:"block-scalar-header",offset:i,indent:o,source:r}];Ch(a,"end"in t?t.end:void 0)||a.push({type:"newline",offset:-1,indent:o,source:` -`});for(let c of Object.keys(t))c!=="type"&&c!=="offset"&&delete t[c];Object.assign(t,{type:"block-scalar",indent:o,props:a,source:s})}}function Ch(t,e){if(e)for(let n of e)switch(n.type){case"space":case"comment":t.push(n);break;case"newline":return t.push(n),!0}return!1}function $u(t,e,n){switch(t.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":t.type=n,t.source=e;break;case"block-scalar":{let r=t.props.slice(1),s=e.length;t.props[0].type==="block-scalar-header"&&(s-=t.props[0].source.length);for(let i of r)i.offset+=s;delete t.props,Object.assign(t,{type:n,source:e,end:r});break}case"block-map":case"block-seq":{let s={type:"newline",offset:t.offset+e.length,indent:t.indent,source:` -`};delete t.items,Object.assign(t,{type:n,source:e,end:[s]});break}default:{let r="indent"in t?t.indent:-1,s="end"in t&&Array.isArray(t.end)?t.end.filter(i=>i.type==="space"||i.type==="comment"||i.type==="newline"):[];for(let i of Object.keys(t))i!=="type"&&i!=="offset"&&delete t[i];Object.assign(t,{type:n,indent:r,source:e,end:s})}}}ba.createScalarToken=_A;ba.resolveAsScalar=SA;ba.setScalarValue=TA});var Ih=E(Oh=>{"use strict";var $A=t=>"type"in t?va(t):wa(t);function va(t){switch(t.type){case"block-scalar":{let e="";for(let n of t.props)e+=va(n);return e+t.source}case"block-map":case"block-seq":{let e="";for(let n of t.items)e+=wa(n);return e}case"flow-collection":{let e=t.start.source;for(let n of t.items)e+=wa(n);for(let n of t.end)e+=n.source;return e}case"document":{let e=wa(t);if(t.end)for(let n of t.end)e+=n.source;return e}default:{let e=t.source;if("end"in t&&t.end)for(let n of t.end)e+=n.source;return e}}}function wa({start:t,key:e,sep:n,value:r}){let s="";for(let i of t)s+=i.source;if(e&&(s+=va(e)),n)for(let i of n)s+=i.source;return r&&(s+=va(r)),s}Oh.stringify=$A});var Lh=E(Nh=>{"use strict";var Ru=Symbol("break visit"),RA=Symbol("skip children"),Dh=Symbol("remove item");function Fn(t,e){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),Mh(Object.freeze([]),t,e)}Fn.BREAK=Ru;Fn.SKIP=RA;Fn.REMOVE=Dh;Fn.itemAtPath=(t,e)=>{let n=t;for(let[r,s]of e){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};Fn.parentCollection=(t,e)=>{let n=Fn.itemAtPath(t,e.slice(0,-1)),r=e[e.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function Mh(t,e,n){let r=n(e,t);if(typeof r=="symbol")return r;for(let s of["key","value"]){let i=e[s];if(i&&"items"in i){for(let o=0;o{"use strict";var Au=Ph(),AA=Ih(),CA=Lh(),Cu="\uFEFF",Pu="",Ou="",Iu="",PA=t=>!!t&&"items"in t,OA=t=>!!t&&(t.type==="scalar"||t.type==="single-quoted-scalar"||t.type==="double-quoted-scalar"||t.type==="block-scalar");function IA(t){switch(t){case Cu:return"";case Pu:return"";case Ou:return"";case Iu:return"";default:return JSON.stringify(t)}}function DA(t){switch(t){case Cu:return"byte-order-mark";case Pu:return"doc-mode";case Ou:return"flow-error-end";case Iu:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case` +`;if(t.type==="block-scalar"){let i=t.props[0];if(i.type!=="block-scalar-header")throw new Error("Invalid block scalar header");i.source=r,t.source=s}else{let{offset:i}=t,o="indent"in t?t.indent:-1,a=[{type:"block-scalar-header",offset:i,indent:o,source:r}];oy(a,"end"in t?t.end:void 0)||a.push({type:"newline",offset:-1,indent:o,source:` +`});for(let c of Object.keys(t))c!=="type"&&c!=="offset"&&delete t[c];Object.assign(t,{type:"block-scalar",indent:o,props:a,source:s})}}function oy(t,e){if(e)for(let n of e)switch(n.type){case"space":case"comment":t.push(n);break;case"newline":return t.push(n),!0}return!1}function Zu(t,e,n){switch(t.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":t.type=n,t.source=e;break;case"block-scalar":{let r=t.props.slice(1),s=e.length;t.props[0].type==="block-scalar-header"&&(s-=t.props[0].source.length);for(let i of r)i.offset+=s;delete t.props,Object.assign(t,{type:n,source:e,end:r});break}case"block-map":case"block-seq":{let s={type:"newline",offset:t.offset+e.length,indent:t.indent,source:` +`};delete t.items,Object.assign(t,{type:n,source:e,end:[s]});break}default:{let r="indent"in t?t.indent:-1,s="end"in t&&Array.isArray(t.end)?t.end.filter(i=>i.type==="space"||i.type==="comment"||i.type==="newline"):[];for(let i of Object.keys(t))i!=="type"&&i!=="offset"&&delete t[i];Object.assign(t,{type:n,indent:r,source:e,end:s})}}}Ra.createScalarToken=pA;Ra.resolveAsScalar=dA;Ra.setScalarValue=fA});var ly=E(cy=>{"use strict";var gA=t=>"type"in t?Aa(t):Ca(t);function Aa(t){switch(t.type){case"block-scalar":{let e="";for(let n of t.props)e+=Aa(n);return e+t.source}case"block-map":case"block-seq":{let e="";for(let n of t.items)e+=Ca(n);return e}case"flow-collection":{let e=t.start.source;for(let n of t.items)e+=Ca(n);for(let n of t.end)e+=n.source;return e}case"document":{let e=Ca(t);if(t.end)for(let n of t.end)e+=n.source;return e}default:{let e=t.source;if("end"in t&&t.end)for(let n of t.end)e+=n.source;return e}}}function Ca({start:t,key:e,sep:n,value:r}){let s="";for(let i of t)s+=i.source;if(e&&(s+=Aa(e)),n)for(let i of n)s+=i.source;return r&&(s+=Aa(r)),s}cy.stringify=gA});var fy=E(py=>{"use strict";var Xu=Symbol("break visit"),hA=Symbol("skip children"),uy=Symbol("remove item");function Vn(t,e){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),dy(Object.freeze([]),t,e)}Vn.BREAK=Xu;Vn.SKIP=hA;Vn.REMOVE=uy;Vn.itemAtPath=(t,e)=>{let n=t;for(let[r,s]of e){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};Vn.parentCollection=(t,e)=>{let n=Vn.itemAtPath(t,e.slice(0,-1)),r=e[e.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function dy(t,e,n){let r=n(e,t);if(typeof r=="symbol")return r;for(let s of["key","value"]){let i=e[s];if(i&&"items"in i){for(let o=0;o{"use strict";var Qu=ay(),yA=ly(),bA=fy(),ed="\uFEFF",td="",nd="",rd="",wA=t=>!!t&&"items"in t,vA=t=>!!t&&(t.type==="scalar"||t.type==="single-quoted-scalar"||t.type==="double-quoted-scalar"||t.type==="block-scalar");function kA(t){switch(t){case ed:return"";case td:return"";case nd:return"";case rd:return"";default:return JSON.stringify(t)}}function EA(t){switch(t){case ed:return"byte-order-mark";case td:return"doc-mode";case nd:return"flow-error-end";case rd:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case` `:case`\r -`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(t[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}Fe.createScalarToken=Au.createScalarToken;Fe.resolveAsScalar=Au.resolveAsScalar;Fe.setScalarValue=Au.setScalarValue;Fe.stringify=AA.stringify;Fe.visit=CA.visit;Fe.BOM=Cu;Fe.DOCUMENT=Pu;Fe.FLOW_END=Ou;Fe.SCALAR=Iu;Fe.isCollection=PA;Fe.isScalar=OA;Fe.prettyToken=IA;Fe.tokenType=DA});var Nu=E(jh=>{"use strict";var yi=ka();function pt(t){switch(t){case void 0:case" ":case` -`:case"\r":case" ":return!0;default:return!1}}var Gh=new Set("0123456789ABCDEFabcdef"),MA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Ea=new Set(",[]{}"),NA=new Set(` ,[]{} -\r `),Du=t=>!t||NA.has(t),Mu=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,n=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let e=this.pos,n=this.buffer[e];for(;n===" "||n===" ";)n=this.buffer[++e];return!n||n==="#"||n===` +`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(t[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}Ue.createScalarToken=Qu.createScalarToken;Ue.resolveAsScalar=Qu.resolveAsScalar;Ue.setScalarValue=Qu.setScalarValue;Ue.stringify=yA.stringify;Ue.visit=bA.visit;Ue.BOM=ed;Ue.DOCUMENT=td;Ue.FLOW_END=nd;Ue.SCALAR=rd;Ue.isCollection=wA;Ue.isScalar=vA;Ue.prettyToken=kA;Ue.tokenType=EA});var od=E(gy=>{"use strict";var xi=Pa();function ht(t){switch(t){case void 0:case" ":case` +`:case"\r":case" ":return!0;default:return!1}}var my=new Set("0123456789ABCDEFabcdef"),SA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Ia=new Set(",[]{}"),xA=new Set(` ,[]{} +\r `),sd=t=>!t||xA.has(t),id=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,n=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let e=this.pos,n=this.buffer[e];for(;n===" "||n===" ";)n=this.buffer[++e];return!n||n==="#"||n===` `?!0:n==="\r"?this.buffer[e+1]===` `:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let n=this.buffer[e];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+e];if(n==="\r"){let s=this.buffer[r+e+1];if(s===` `||!s&&!this.atEnd)return e+r+1}return n===` -`||r>=this.indentNext||!n&&!this.atEnd?e+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(e,3);if((r==="---"||r==="...")&&pt(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!pt(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&pt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(e[n]){case"#":yield*this.pushCount(e.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Du),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,n,r=-1;do e=yield*this.pushNewline(),e>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(e+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r=this.indentNext||!n&&!this.atEnd?e+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(e,3);if((r==="---"||r==="...")&&ht(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!ht(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&ht(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(e[n]){case"#":yield*this.pushCount(e.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(sd),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,n,r=-1;do e=yield*this.pushNewline(),e>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(e+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>pt(n)||n==="#")}*parseBlockScalar(){let e=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case` +`,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let e=this.pos;for(;;){let n=this.buffer[++e];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>ht(n)||n==="#")}*parseBlockScalar(){let e=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case` `:e=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===` `)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(e+1);if(i===-1)break;e=this.buffer.indexOf(` `,i)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let s=e+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===` `;)r=this.buffer[++s];e=s-1}else if(!this.blockScalarKeep)do{let i=e-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===` -`&&i>=this.pos&&i+1+n>a)e=i;else break}while(!0);return yield yi.SCALAR,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(pt(i)||e&&Ea.has(i))break;n=r}else if(pt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===` +`&&i>=this.pos&&i+1+n>a)e=i;else break}while(!0);return yield xi.SCALAR,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(ht(i)||e&&Ia.has(i))break;n=r}else if(ht(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===` `?(r+=1,s=` -`,i=this.buffer[r+1]):n=r),i==="#"||e&&Ea.has(i))break;if(s===` -`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(e&&Ea.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield yi.SCALAR,yield*this.pushToIndex(n+1,!0),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,n){let r=this.buffer.slice(this.pos,e);return r?(yield r,this.pos+=r.length,r.length):(n&&(yield""),0)}*pushIndicators(){let e=0;e:for(;;){switch(this.charAt(0)){case"!":e+=yield*this.pushTag(),e+=yield*this.pushSpaces(!0);continue e;case"&":e+=yield*this.pushUntil(Du),e+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(pt(r)||n&&Ea.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,e+=yield*this.pushCount(1),e+=yield*this.pushSpaces(!0);continue e}}}break e}return e}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,n=this.buffer[e];for(;!pt(n)&&n!==">";)n=this.buffer[++e];return yield*this.pushToIndex(n===">"?e+1:e,!1)}else{let e=this.pos+1,n=this.buffer[e];for(;n;)if(MA.has(n))n=this.buffer[++e];else if(n==="%"&&Gh.has(this.buffer[e+1])&&Gh.has(this.buffer[e+2]))n=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===` +`,i=this.buffer[r+1]):n=r),i==="#"||e&&Ia.has(i))break;if(s===` +`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(e&&Ia.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield xi.SCALAR,yield*this.pushToIndex(n+1,!0),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,n){let r=this.buffer.slice(this.pos,e);return r?(yield r,this.pos+=r.length,r.length):(n&&(yield""),0)}*pushIndicators(){let e=0;e:for(;;){switch(this.charAt(0)){case"!":e+=yield*this.pushTag(),e+=yield*this.pushSpaces(!0);continue e;case"&":e+=yield*this.pushUntil(sd),e+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(ht(r)||n&&Ia.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,e+=yield*this.pushCount(1),e+=yield*this.pushSpaces(!0);continue e}}}break e}return e}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,n=this.buffer[e];for(;!ht(n)&&n!==">";)n=this.buffer[++e];return yield*this.pushToIndex(n===">"?e+1:e,!1)}else{let e=this.pos+1,n=this.buffer[e];for(;n;)if(SA.has(n))n=this.buffer[++e];else if(n==="%"&&my.has(this.buffer[e+1])&&my.has(this.buffer[e+2]))n=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===` `?yield*this.pushCount(1):e==="\r"&&this.charAt(1)===` -`?yield*this.pushCount(2):0}*pushSpaces(e){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||e&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(e){let n=this.pos,r=this.buffer[n];for(;!e(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};jh.Lexer=Mu});var Gu=E(Fh=>{"use strict";var Lu=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let n=0,r=this.lineStarts.length;for(;n>1;this.lineStarts[i]{"use strict";var LA=require("process"),qh=ka(),GA=Nu();function an(t,e){for(let n=0;n=0;)switch(t[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;t[++e]?.type==="space";);return t.splice(e,t.length)}function _a(t,e){if(e.length<1e5)Array.prototype.push.apply(t,e);else for(let n=0;n0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case"document":return yield*this.document(e);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(e);case"block-scalar":return yield*this.blockScalar(e);case"block-map":return yield*this.blockMap(e);case"block-seq":return yield*this.blockSequence(e);case"flow-collection":return yield*this.flowCollection(e);case"doc-end":return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let n=e??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&Bh(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&Uh(s.start)===-1&&(n.indent===0||s.start.every(i=>i.type!=="comment"||i.indent0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(e){let n=this.pos,r=this.buffer[n];for(;!e(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};gy.Lexer=id});var cd=E(hy=>{"use strict";var ad=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let n=0,r=this.lineStarts.length;for(;n>1;this.lineStarts[i]{"use strict";var TA=require("process"),yy=Pa(),_A=od();function ln(t,e){for(let n=0;n=0;)switch(t[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;t[++e]?.type==="space";);return t.splice(e,t.length)}function Da(t,e){if(e.length<1e5)Array.prototype.push.apply(t,e);else for(let n=0;n0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case"document":return yield*this.document(e);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(e);case"block-scalar":return yield*this.blockScalar(e);case"block-map":return yield*this.blockMap(e);case"block-seq":return yield*this.blockSequence(e);case"flow-collection":return yield*this.flowCollection(e);case"doc-end":return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let n=e??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&wy(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&by(s.start)===-1&&(n.indent===0||s.start.every(i=>i.type!=="comment"||i.indent=e.indent){let r=!this.onKeyLine&&this.indent===e.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;ae.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(an(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Vh(n.key)&&!an(n.sep,"newline")){let o=zr(n.start),a=n.key,c=n.sep;c.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:c}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(an(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=zr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?e.items.push({start:i,key:null,sep:[this.sourceToken]}):an(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(e.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(e);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!an(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&e.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let n=e.items[e.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,e.indent)){let s=e.items[e.items.length-2]?.value?.end;if(Array.isArray(s)){_a(s,n.start),s.push(this.sourceToken),e.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=e.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;n.value||an(n.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>e.indent){let r=this.startBlockValue(e);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let n=e.items[e.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?e.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?e.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?e.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let r=this.startBlockValue(e);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===e.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=Sa(r),i=zr(s);Bh(e);let o=e.end.splice(1,e.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:i,key:e,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let n=this.source.indexOf(` +`,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let n=e.items[e.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)e.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,e.indent)){let s=e.items[e.items.length-2]?.value?.end;if(Array.isArray(s)){Da(s,n.start),s.push(this.sourceToken),e.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let r=!this.onKeyLine&&this.indent===e.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;ae.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(ln(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(vy(n.key)&&!ln(n.sep,"newline")){let o=Qr(n.start),a=n.key,c=n.sep;c.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:c}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(ln(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=Qr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?e.items.push({start:i,key:null,sep:[this.sourceToken]}):ln(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(e.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(e);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!ln(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&e.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let n=e.items[e.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,e.indent)){let s=e.items[e.items.length-2]?.value?.end;if(Array.isArray(s)){Da(s,n.start),s.push(this.sourceToken),e.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=e.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;n.value||ln(n.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>e.indent){let r=this.startBlockValue(e);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let n=e.items[e.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?e.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?e.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?e.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let r=this.startBlockValue(e);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===e.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=Oa(r),i=Qr(s);wy(e);let o=e.end.splice(1,e.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:i,key:e,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let n=this.source.indexOf(` `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(` -`,n)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=Sa(e),r=zr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=Sa(e),r=zr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,n){return this.type!=="comment"||this.indent<=n?!1:e.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};Wh.Parser=ju});var Yh=E(wi=>{"use strict";var zh=xu(),jA=ui(),bi=fi(),FA=_l(),qA=Q(),UA=Gu(),Hh=Fu();function Kh(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new UA.LineCounter||null,prettyErrors:e}}function BA(t,e={}){let{lineCounter:n,prettyErrors:r}=Kh(e),s=new Hh.Parser(n?.addNewLine),i=new zh.Composer(e),o=Array.from(i.compose(s.parse(t)));if(r&&n)for(let a of o)a.errors.forEach(bi.prettifyError(t,n)),a.warnings.forEach(bi.prettifyError(t,n));return o.length>0?o:Object.assign([],{empty:!0},i.streamInfo())}function Jh(t,e={}){let{lineCounter:n,prettyErrors:r}=Kh(e),s=new Hh.Parser(n?.addNewLine),i=new zh.Composer(e),o=null;for(let a of i.compose(s.parse(t),!0,t.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new bi.YAMLParseError(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(bi.prettifyError(t,n)),o.warnings.forEach(bi.prettifyError(t,n))),o}function VA(t,e,n){let r;typeof e=="function"?r=e:n===void 0&&e&&typeof e=="object"&&(n=e);let s=Jh(t,n);if(!s)return null;if(s.warnings.forEach(i=>FA.warn(s.options.logLevel,i)),s.errors.length>0){if(s.options.logLevel!=="silent")throw s.errors[0];s.errors=[]}return s.toJS(Object.assign({reviver:r},n))}function WA(t,e,n){let r=null;if(typeof e=="function"||Array.isArray(e)?r=e:n===void 0&&e&&(n=e),typeof n=="string"&&(n=n.length),typeof n=="number"){let s=Math.round(n);n=s<1?void 0:s>8?{indent:8}:{indent:s}}if(t===void 0){let{keepUndefined:s}=n??e??{};if(!s)return}return qA.isDocument(t)&&!r?t.toString(n):new jA.Document(t,r,n).toString(n)}wi.parse=VA;wi.parseAllDocuments=BA;wi.parseDocument=Jh;wi.stringify=WA});var vi=E(se=>{"use strict";var zA=xu(),HA=ui(),KA=ou(),qu=fi(),JA=Ks(),cn=Q(),YA=nn(),ZA=ve(),XA=sn(),QA=on(),eC=ka(),tC=Nu(),nC=Gu(),rC=Fu(),Ta=Yh(),Zh=Vs();se.Composer=zA.Composer;se.Document=HA.Document;se.Schema=KA.Schema;se.YAMLError=qu.YAMLError;se.YAMLParseError=qu.YAMLParseError;se.YAMLWarning=qu.YAMLWarning;se.Alias=JA.Alias;se.isAlias=cn.isAlias;se.isCollection=cn.isCollection;se.isDocument=cn.isDocument;se.isMap=cn.isMap;se.isNode=cn.isNode;se.isPair=cn.isPair;se.isScalar=cn.isScalar;se.isSeq=cn.isSeq;se.Pair=YA.Pair;se.Scalar=ZA.Scalar;se.YAMLMap=XA.YAMLMap;se.YAMLSeq=QA.YAMLSeq;se.CST=eC;se.Lexer=tC.Lexer;se.LineCounter=nC.LineCounter;se.Parser=rC.Parser;se.parse=Ta.parse;se.parseAllDocuments=Ta.parseAllDocuments;se.parseDocument=Ta.parseDocument;se.stringify=Ta.stringify;se.visit=Zh.visit;se.visitAsync=Zh.visitAsync});var Oy=E(Da=>{"use strict";Object.defineProperty(Da,"__esModule",{value:!0});Da.format=DP;Da.parse=MP;var PP=/^[\u0009\u0020-\u007e\u0080-\u00ff]*$/,$y=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,OP=/[\\"]/g,IP=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Ry=(()=>{let t=function(){};return t.prototype=Object.create(null),t})();function DP(t){let{type:e,parameters:n}=t;if(!e||!IP.test(e))throw new TypeError(`Invalid type: ${e}`);let r=e;if(n)for(let s of Object.keys(n)){if(!$y.test(s))throw new TypeError(`Invalid parameter name: ${s}`);r+=`; ${s}=${jP(n[s])}`}return r}function MP(t,e){let n=t.length,r=Yu(t,0,n),s=r;r=Ju(t,r,n);let i=Zu(t,s,r),o=t.slice(s,i).toLowerCase(),a=e?.parameters===!1?new Ry:GP(t,r,n);return{type:o,parameters:a}}var Ay=32,Cy=9,Py=59,NP=61,xy=34,LP=92;function GP(t,e,n){let r=new Ry;e:for(;ee;){let r=t.charCodeAt(n-1);if(r!==Ay&&r!==Cy)break;n--}return n}function jP(t){if($y.test(t))return t;if(PP.test(t))return`"${t.replace(OP,"\\$&")}"`;throw new TypeError(`Invalid parameter value: ${t}`)}});var ss=E((fH,ib)=>{"use strict";var kO="2.0.0",EO=Number.MAX_SAFE_INTEGER||9007199254740991,SO=16,_O=250,TO=["major","premajor","minor","preminor","patch","prepatch","prerelease"];ib.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:SO,MAX_SAFE_BUILD_LENGTH:_O,MAX_SAFE_INTEGER:EO,RELEASE_TYPES:TO,SEMVER_SPEC_VERSION:kO,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var xi=E((mH,ob)=>{"use strict";var xO=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};ob.exports=xO});var is=E((xt,ab)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:pd,MAX_SAFE_BUILD_LENGTH:$O,MAX_LENGTH:RO}=ss(),AO=xi();xt=ab.exports={};var CO=xt.re=[],PO=xt.safeRe=[],O=xt.src=[],OO=xt.safeSrc=[],I=xt.t={},IO=0,fd="[a-zA-Z0-9-]",DO=[["\\s",1],["\\d",RO],[fd,$O]],MO=t=>{for(let[e,n]of DO)t=t.split(`${e}*`).join(`${e}{0,${n}}`).split(`${e}+`).join(`${e}{1,${n}}`);return t},z=(t,e,n)=>{let r=MO(e),s=IO++;AO(t,s,e),I[t]=s,O[s]=e,OO[s]=r,CO[s]=new RegExp(e,n?"g":void 0),PO[s]=new RegExp(r,n?"g":void 0)};z("NUMERICIDENTIFIER","0|[1-9]\\d*");z("NUMERICIDENTIFIERLOOSE","\\d+");z("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${fd}*`);z("MAINVERSION",`(${O[I.NUMERICIDENTIFIER]})\\.(${O[I.NUMERICIDENTIFIER]})\\.(${O[I.NUMERICIDENTIFIER]})`);z("MAINVERSIONLOOSE",`(${O[I.NUMERICIDENTIFIERLOOSE]})\\.(${O[I.NUMERICIDENTIFIERLOOSE]})\\.(${O[I.NUMERICIDENTIFIERLOOSE]})`);z("PRERELEASEIDENTIFIER",`(?:${O[I.NONNUMERICIDENTIFIER]}|${O[I.NUMERICIDENTIFIER]})`);z("PRERELEASEIDENTIFIERLOOSE",`(?:${O[I.NONNUMERICIDENTIFIER]}|${O[I.NUMERICIDENTIFIERLOOSE]})`);z("PRERELEASE",`(?:-(${O[I.PRERELEASEIDENTIFIER]}(?:\\.${O[I.PRERELEASEIDENTIFIER]})*))`);z("PRERELEASELOOSE",`(?:-?(${O[I.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${O[I.PRERELEASEIDENTIFIERLOOSE]})*))`);z("BUILDIDENTIFIER",`${fd}+`);z("BUILD",`(?:\\+(${O[I.BUILDIDENTIFIER]}(?:\\.${O[I.BUILDIDENTIFIER]})*))`);z("FULLPLAIN",`v?${O[I.MAINVERSION]}${O[I.PRERELEASE]}?${O[I.BUILD]}?`);z("FULL",`^${O[I.FULLPLAIN]}$`);z("LOOSEPLAIN",`[v=\\s]*${O[I.MAINVERSIONLOOSE]}${O[I.PRERELEASELOOSE]}?${O[I.BUILD]}?`);z("LOOSE",`^${O[I.LOOSEPLAIN]}$`);z("GTLT","((?:<|>)?=?)");z("XRANGEIDENTIFIERLOOSE",`${O[I.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);z("XRANGEIDENTIFIER",`${O[I.NUMERICIDENTIFIER]}|x|X|\\*`);z("XRANGEPLAIN",`[v=\\s]*(${O[I.XRANGEIDENTIFIER]})(?:\\.(${O[I.XRANGEIDENTIFIER]})(?:\\.(${O[I.XRANGEIDENTIFIER]})(?:${O[I.PRERELEASE]})?${O[I.BUILD]}?)?)?`);z("XRANGEPLAINLOOSE",`[v=\\s]*(${O[I.XRANGEIDENTIFIERLOOSE]})(?:\\.(${O[I.XRANGEIDENTIFIERLOOSE]})(?:\\.(${O[I.XRANGEIDENTIFIERLOOSE]})(?:${O[I.PRERELEASELOOSE]})?${O[I.BUILD]}?)?)?`);z("XRANGE",`^${O[I.GTLT]}\\s*${O[I.XRANGEPLAIN]}$`);z("XRANGELOOSE",`^${O[I.GTLT]}\\s*${O[I.XRANGEPLAINLOOSE]}$`);z("COERCEPLAIN",`(^|[^\\d])(\\d{1,${pd}})(?:\\.(\\d{1,${pd}}))?(?:\\.(\\d{1,${pd}}))?`);z("COERCE",`${O[I.COERCEPLAIN]}(?:$|[^\\d])`);z("COERCEFULL",O[I.COERCEPLAIN]+`(?:${O[I.PRERELEASE]})?(?:${O[I.BUILD]})?(?:$|[^\\d])`);z("COERCERTL",O[I.COERCE],!0);z("COERCERTLFULL",O[I.COERCEFULL],!0);z("LONETILDE","(?:~>?)");z("TILDETRIM",`(\\s*)${O[I.LONETILDE]}\\s+`,!0);xt.tildeTrimReplace="$1~";z("TILDE",`^${O[I.LONETILDE]}${O[I.XRANGEPLAIN]}$`);z("TILDELOOSE",`^${O[I.LONETILDE]}${O[I.XRANGEPLAINLOOSE]}$`);z("LONECARET","(?:\\^)");z("CARETTRIM",`(\\s*)${O[I.LONECARET]}\\s+`,!0);xt.caretTrimReplace="$1^";z("CARET",`^${O[I.LONECARET]}${O[I.XRANGEPLAIN]}$`);z("CARETLOOSE",`^${O[I.LONECARET]}${O[I.XRANGEPLAINLOOSE]}$`);z("COMPARATORLOOSE",`^${O[I.GTLT]}\\s*(${O[I.LOOSEPLAIN]})$|^$`);z("COMPARATOR",`^${O[I.GTLT]}\\s*(${O[I.FULLPLAIN]})$|^$`);z("COMPARATORTRIM",`(\\s*)${O[I.GTLT]}\\s*(${O[I.LOOSEPLAIN]}|${O[I.XRANGEPLAIN]})`,!0);xt.comparatorTrimReplace="$1$2$3";z("HYPHENRANGE",`^\\s*(${O[I.XRANGEPLAIN]})\\s+-\\s+(${O[I.XRANGEPLAIN]})\\s*$`);z("HYPHENRANGELOOSE",`^\\s*(${O[I.XRANGEPLAINLOOSE]})\\s+-\\s+(${O[I.XRANGEPLAINLOOSE]})\\s*$`);z("STAR","(<|>)?=?\\s*\\*");z("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");z("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var ja=E((gH,cb)=>{"use strict";var NO=Object.freeze({loose:!0}),LO=Object.freeze({}),GO=t=>t?typeof t!="object"?NO:t:LO;cb.exports=GO});var md=E((hH,db)=>{"use strict";var lb=/^[0-9]+$/,ub=(t,e)=>{if(typeof t=="number"&&typeof e=="number")return t===e?0:tub(e,t);db.exports={compareIdentifiers:ub,rcompareIdentifiers:jO}});var Ce=E((yH,fb)=>{"use strict";var Fa=xi(),{MAX_LENGTH:pb,MAX_SAFE_INTEGER:qa}=ss(),{safeRe:Ua,t:Ba}=is(),FO=ja(),{compareIdentifiers:gd}=md(),qO=(t,e)=>{let n=e.split(".");if(n.length>t.length)return!1;for(let r=0;rpb)throw new TypeError(`version is longer than ${pb} characters`);Fa("SemVer",e,n),this.options=n,this.loose=!!n.loose,this.includePrerelease=!!n.includePrerelease;let r=e.trim().match(n.loose?Ua[Ba.LOOSE]:Ua[Ba.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>qa||this.major<0)throw new TypeError("Invalid major version");if(this.minor>qa||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>qa||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(s=>{if(/^[0-9]+$/.test(s)){let i=+s;if(i>=0&&ie.major?1:this.minore.minor?1:this.patche.patch?1:0}comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let n=0;do{let r=this.prerelease[n],s=e.prerelease[n];if(Fa("prerelease compare",n,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return gd(r,s)}while(++n)}compareBuild(e){e instanceof t||(e=new t(e,this.options));let n=0;do{let r=this.build[n],s=e.build[n];if(Fa("build compare",n,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return gd(r,s)}while(++n)}inc(e,n,r){if(e.startsWith("pre")){if(!n&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(n){let s=`-${n}`.match(this.options.loose?Ua[Ba.PRERELEASELOOSE]:Ua[Ba.PRERELEASE]);if(!s||s[1]!==n)throw new Error(`invalid identifier: ${n}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",n,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",n,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",n,r),this.inc("pre",n,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",n,r),this.inc("pre",n,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let s=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[s];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(n===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(n){let i=[n,s];if(r===!1&&(i=[n]),qO(this.prerelease,n)){let o=this.prerelease[n.split(".").length];isNaN(o)&&(this.prerelease=i)}else this.prerelease=i}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};fb.exports=hd});var gn=E((bH,gb)=>{"use strict";var mb=Ce(),UO=(t,e,n=!1)=>{if(t instanceof mb)return t;try{return new mb(t,e)}catch(r){if(!n)return null;throw r}};gb.exports=UO});var yb=E((wH,hb)=>{"use strict";var BO=gn(),VO=(t,e)=>{let n=BO(t,e);return n?n.version:null};hb.exports=VO});var wb=E((vH,bb)=>{"use strict";var WO=gn(),zO=(t,e)=>{let n=WO(t.trim().replace(/^[=v]+/,""),e);return n?n.version:null};bb.exports=zO});var Eb=E((kH,kb)=>{"use strict";var vb=Ce(),HO=(t,e,n,r,s)=>{typeof n=="string"&&(s=r,r=n,n=void 0);try{return new vb(t instanceof vb?t.version:t,n).inc(e,r,s).version}catch{return null}};kb.exports=HO});var Tb=E((EH,_b)=>{"use strict";var Sb=gn(),KO=(t,e)=>{let n=Sb(t,null,!0),r=Sb(e,null,!0),s=n.compare(r);if(s===0)return null;let i=s>0,o=i?n:r,a=i?r:n,c=!!o.prerelease.length;if(!!a.prerelease.length&&!c){if(!a.patch&&!a.minor)return"major";if(a.compareMain(o)===0)return a.minor&&!a.patch?"minor":"patch"}let u=c?"pre":"";return n.major!==r.major?u+"major":n.minor!==r.minor?u+"minor":n.patch!==r.patch?u+"patch":"prerelease"};_b.exports=KO});var $b=E((SH,xb)=>{"use strict";var JO=Ce(),YO=(t,e)=>new JO(t,e).major;xb.exports=YO});var Ab=E((_H,Rb)=>{"use strict";var ZO=Ce(),XO=(t,e)=>new ZO(t,e).minor;Rb.exports=XO});var Pb=E((TH,Cb)=>{"use strict";var QO=Ce(),eI=(t,e)=>new QO(t,e).patch;Cb.exports=eI});var Ib=E((xH,Ob)=>{"use strict";var tI=gn(),nI=(t,e)=>{let n=tI(t,e);return n&&n.prerelease.length?n.prerelease:null};Ob.exports=nI});var et=E(($H,Mb)=>{"use strict";var Db=Ce(),rI=(t,e,n)=>new Db(t,n).compare(new Db(e,n));Mb.exports=rI});var Lb=E((RH,Nb)=>{"use strict";var sI=et(),iI=(t,e,n)=>sI(e,t,n);Nb.exports=iI});var jb=E((AH,Gb)=>{"use strict";var oI=et(),aI=(t,e)=>oI(t,e,!0);Gb.exports=aI});var Va=E((CH,qb)=>{"use strict";var Fb=Ce(),cI=(t,e,n)=>{let r=new Fb(t,n),s=new Fb(e,n);return r.compare(s)||r.compareBuild(s)};qb.exports=cI});var Bb=E((PH,Ub)=>{"use strict";var lI=Va(),uI=(t,e)=>t.sort((n,r)=>lI(n,r,e));Ub.exports=uI});var Wb=E((OH,Vb)=>{"use strict";var dI=Va(),pI=(t,e)=>t.sort((n,r)=>dI(r,n,e));Vb.exports=pI});var $i=E((IH,zb)=>{"use strict";var fI=et(),mI=(t,e,n)=>fI(t,e,n)>0;zb.exports=mI});var Wa=E((DH,Hb)=>{"use strict";var gI=et(),hI=(t,e,n)=>gI(t,e,n)<0;Hb.exports=hI});var yd=E((MH,Kb)=>{"use strict";var yI=et(),bI=(t,e,n)=>yI(t,e,n)===0;Kb.exports=bI});var bd=E((NH,Jb)=>{"use strict";var wI=et(),vI=(t,e,n)=>wI(t,e,n)!==0;Jb.exports=vI});var za=E((LH,Yb)=>{"use strict";var kI=et(),EI=(t,e,n)=>kI(t,e,n)>=0;Yb.exports=EI});var Ha=E((GH,Zb)=>{"use strict";var SI=et(),_I=(t,e,n)=>SI(t,e,n)<=0;Zb.exports=_I});var wd=E((jH,Xb)=>{"use strict";var TI=yd(),xI=bd(),$I=$i(),RI=za(),AI=Wa(),CI=Ha(),PI=(t,e,n,r)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t===n;case"!==":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t!==n;case"":case"=":case"==":return TI(t,n,r);case"!=":return xI(t,n,r);case">":return $I(t,n,r);case">=":return RI(t,n,r);case"<":return AI(t,n,r);case"<=":return CI(t,n,r);default:throw new TypeError(`Invalid operator: ${e}`)}};Xb.exports=PI});var ew=E((FH,Qb)=>{"use strict";var OI=Ce(),II=gn(),{safeRe:Ka,t:Ja}=is(),DI=(t,e)=>{if(t instanceof OI)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let n=null;if(!e.rtl)n=t.match(e.includePrerelease?Ka[Ja.COERCEFULL]:Ka[Ja.COERCE]);else{let c=e.includePrerelease?Ka[Ja.COERCERTLFULL]:Ka[Ja.COERCERTL],l;for(;(l=c.exec(t))&&(!n||n.index+n[0].length!==t.length);)(!n||l.index+l[0].length!==n.index+n[0].length)&&(n=l),c.lastIndex=l.index+l[1].length+l[2].length;c.lastIndex=-1}if(n===null)return null;let r=n[2],s=n[3]||"0",i=n[4]||"0",o=e.includePrerelease&&n[5]?`-${n[5]}`:"",a=e.includePrerelease&&n[6]?`+${n[6]}`:"";return II(`${r}.${s}.${i}${o}${a}`,e)};Qb.exports=DI});var nw=E((qH,tw)=>{"use strict";var MI=gn(),NI=ss(),LI=Ce(),GI=(t,e,n)=>{if(!NI.RELEASE_TYPES.includes(e))return null;let r=jI(t,n);return r&&FI(r,e)},jI=(t,e)=>{let n=t instanceof LI?t.version:t;return MI(n,e)},FI=(t,e)=>{if(qI(e))return t.version;switch(t.prerelease=[],e){case"major":t.minor=0,t.patch=0;break;case"minor":t.patch=0;break}return t.format()},qI=t=>t.startsWith("pre");tw.exports=GI});var sw=E((UH,rw)=>{"use strict";var vd=class{constructor(){this.max=1e3,this.map=new Map}get(e){let n=this.map.get(e);if(n!==void 0)return this.map.delete(e),this.map.set(e,n),n}delete(e){return this.map.delete(e)}set(e,n){if(!this.delete(e)&&n!==void 0){if(this.map.size>=this.max){let s=this.map.keys().next().value;this.delete(s)}this.map.set(e,n)}return this}};rw.exports=vd});var tt=E((BH,cw)=>{"use strict";var UI=/\s+/g,kd=class t{constructor(e,n){if(n=VI(n),e instanceof t)return e.loose===!!n.loose&&e.includePrerelease===!!n.includePrerelease?e:new t(e.raw,n);if(e instanceof Ed)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=n,this.loose=!!n.loose,this.includePrerelease=!!n.includePrerelease,this.raw=e.trim().replace(UI," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!ow(s[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let s of this.set)if(s.length===1&&QI(s[0])){this.set=[s];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e0&&(this.formatted+="||");let n=this.set[e];for(let r=0;r0&&(this.formatted+=" "),this.formatted+=n[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){e=e.replace(XI,"");let r=((this.options.includePrerelease&&YI)|(this.options.loose&&ZI))+":"+e,s=iw.get(r);if(s)return s;let i=this.options.loose,o=i?Ne[Pe.HYPHENRANGELOOSE]:Ne[Pe.HYPHENRANGE];e=e.replace(o,u1(this.options.includePrerelease)),ae("hyphen replace",e),e=e.replace(Ne[Pe.COMPARATORTRIM],HI),ae("comparator trim",e),e=e.replace(Ne[Pe.TILDETRIM],KI),ae("tilde trim",e),e=e.replace(Ne[Pe.CARETTRIM],JI),ae("caret trim",e);let a=e.split(" ").map(d=>e1(d,this.options)).join(" ").split(/\s+/).map(d=>l1(d,this.options));i&&(a=a.filter(d=>(ae("loose invalid filter",d,this.options),!!d.match(Ne[Pe.COMPARATORLOOSE])))),ae("range list",a);let c=new Map,l=a.map(d=>new Ed(d,this.options));for(let d of l){if(ow(d))return[d];c.set(d.value,d)}c.size>1&&c.has("")&&c.delete("");let u=[...c.values()];return iw.set(r,u),u}intersects(e,n){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(r=>aw(r,n)&&e.set.some(s=>aw(s,n)&&r.every(i=>s.every(o=>i.intersects(o,n)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new WI(e,this.options)}catch{return!1}for(let n=0;nt.value==="<0.0.0-0",QI=t=>t.value==="",aw=(t,e)=>{let n=!0,r=t.slice(),s=r.pop();for(;n&&r.length;)n=r.every(i=>s.intersects(i,e)),s=r.pop();return n},e1=(t,e)=>(t=t.replace(Ne[Pe.BUILD],""),ae("comp",t,e),t=s1(t,e),ae("caret",t),t=n1(t,e),ae("tildes",t),t=o1(t,e),ae("xrange",t),t=c1(t,e),ae("stars",t),t),Ee=t=>!t||t.toLowerCase()==="x"||t==="*",t1=(t,e,n)=>Ee(t)&&!Ee(e)||Ee(e)&&n&&!Ee(n),n1=(t,e)=>t.trim().split(/\s+/).map(n=>r1(n,e)).join(" "),r1=(t,e)=>{let n=e.loose?Ne[Pe.TILDELOOSE]:Ne[Pe.TILDE],r=e.includePrerelease?"-0":"";return t.replace(n,(s,i,o,a,c)=>{ae("tilde",t,s,i,o,a,c);let l;return Ee(i)?l="":Ee(o)?l=`>=${i}.0.0${r} <${+i+1}.0.0-0`:Ee(a)?l=`>=${i}.${o}.0${r} <${i}.${+o+1}.0-0`:c?(ae("replaceTilde pr",c),l=`>=${i}.${o}.${a}-${c} <${i}.${+o+1}.0-0`):l=`>=${i}.${o}.${a} <${i}.${+o+1}.0-0`,ae("tilde return",l),l})},s1=(t,e)=>t.trim().split(/\s+/).map(n=>i1(n,e)).join(" "),i1=(t,e)=>{ae("caret",t,e);let n=e.loose?Ne[Pe.CARETLOOSE]:Ne[Pe.CARET],r=e.includePrerelease?"-0":"";return t.replace(n,(s,i,o,a,c)=>{ae("caret",t,s,i,o,a,c);let l;return Ee(i)?l="":Ee(o)?l=`>=${i}.0.0${r} <${+i+1}.0.0-0`:Ee(a)?i==="0"?l=`>=${i}.${o}.0${r} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.0${r} <${+i+1}.0.0-0`:c?(ae("replaceCaret pr",c),i==="0"?o==="0"?l=`>=${i}.${o}.${a}-${c} <${i}.${o}.${+a+1}-0`:l=`>=${i}.${o}.${a}-${c} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.${a}-${c} <${+i+1}.0.0-0`):(ae("no pr"),i==="0"?o==="0"?l=`>=${i}.${o}.${a} <${i}.${o}.${+a+1}-0`:l=`>=${i}.${o}.${a} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.${a} <${+i+1}.0.0-0`),ae("caret return",l),l})},o1=(t,e)=>(ae("replaceXRanges",t,e),t.split(/\s+/).map(n=>a1(n,e)).join(" ")),a1=(t,e)=>{t=t.trim();let n=e.loose?Ne[Pe.XRANGELOOSE]:Ne[Pe.XRANGE];return t.replace(n,(r,s,i,o,a,c)=>{if(ae("xRange",t,r,s,i,o,a,c),t1(i,o,a))return t;let l=Ee(i),u=l||Ee(o),d=u||Ee(a),p=d;return s==="="&&p&&(s=""),c=e.includePrerelease?"-0":"",l?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&p?(u&&(o=0),a=0,s===">"?(s=">=",u?(i=+i+1,o=0,a=0):(o=+o+1,a=0)):s==="<="&&(s="<",u?i=+i+1:o=+o+1),s==="<"&&(c="-0"),r=`${s+i}.${o}.${a}${c}`):u?r=`>=${i}.0.0${c} <${+i+1}.0.0-0`:d&&(r=`>=${i}.${o}.0${c} <${i}.${+o+1}.0-0`),ae("xRange return",r),r})},c1=(t,e)=>(ae("replaceStars",t,e),t.trim().replace(Ne[Pe.STAR],"")),l1=(t,e)=>(ae("replaceGTE0",t,e),t.trim().replace(Ne[e.includePrerelease?Pe.GTE0PRE:Pe.GTE0],"")),u1=t=>(e,n,r,s,i,o,a,c,l,u,d,p)=>(Ee(r)?n="":Ee(s)?n=`>=${r}.0.0${t?"-0":""}`:Ee(i)?n=`>=${r}.${s}.0${t?"-0":""}`:o?n=`>=${n}`:n=`>=${n}${t?"-0":""}`,Ee(l)?c="":Ee(u)?c=`<${+l+1}.0.0-0`:Ee(d)?c=`<${l}.${+u+1}.0-0`:p?c=`<=${l}.${u}.${d}-${p}`:t?c=`<${l}.${u}.${+d+1}-0`:c=`<=${c}`,`${n} ${c}`.trim()),d1=(t,e,n)=>{for(let r=0;r0){let s=t[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0}});var Ri=E((VH,mw)=>{"use strict";var Ai=Symbol("SemVer ANY"),Td=class t{static get ANY(){return Ai}constructor(e,n){if(n=lw(n),e instanceof t){if(e.loose===!!n.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),_d("comparator",e,n),this.options=n,this.loose=!!n.loose,this.parse(e),this.semver===Ai?this.value="":this.value=this.operator+this.semver.version,_d("comp",this)}parse(e){let n=this.options.loose?uw[dw.COMPARATORLOOSE]:uw[dw.COMPARATOR],r=e.match(n);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new pw(r[2],this.options.loose):this.semver=Ai}toString(){return this.value}test(e){if(_d("Comparator.test",e,this.options.loose),this.semver===Ai||e===Ai)return!0;if(typeof e=="string")try{e=new pw(e,this.options)}catch{return!1}return Sd(e,this.operator,this.semver,this.options)}intersects(e,n){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new fw(e.value,n).test(this.value):e.operator===""?e.value===""?!0:new fw(this.value,n).test(e.semver):(n=lw(n),n.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!n.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||Sd(this.semver,"<",e.semver,n)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Sd(this.semver,">",e.semver,n)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};mw.exports=Td;var lw=ja(),{safeRe:uw,t:dw}=is(),Sd=wd(),_d=xi(),pw=Ce(),fw=tt()});var Ci=E((WH,gw)=>{"use strict";var p1=tt(),f1=(t,e,n)=>{try{e=new p1(e,n)}catch{return!1}return e.test(t)};gw.exports=f1});var yw=E((zH,hw)=>{"use strict";var m1=tt(),g1=(t,e)=>new m1(t,e).set.map(n=>n.map(r=>r.value).join(" ").trim().split(" "));hw.exports=g1});var ww=E((HH,bw)=>{"use strict";var h1=Ce(),y1=tt(),b1=(t,e,n)=>{let r=null,s=null,i=null;try{i=new y1(e,n)}catch{return null}return t.forEach(o=>{i.test(o)&&(!r||s.compare(o)===-1)&&(r=o,s=new h1(r,n))}),r};bw.exports=b1});var kw=E((KH,vw)=>{"use strict";var w1=Ce(),v1=tt(),k1=(t,e,n)=>{let r=null,s=null,i=null;try{i=new v1(e,n)}catch{return null}return t.forEach(o=>{i.test(o)&&(!r||s.compare(o)===1)&&(r=o,s=new w1(r,n))}),r};vw.exports=k1});var _w=E((JH,Sw)=>{"use strict";var xd=Ce(),E1=tt(),Ew=$i(),S1=(t,e)=>{t=new E1(t,e);let n=new xd("0.0.0");if(t.test(n)||(n=new xd("0.0.0-0"),t.test(n)))return n;n=null;for(let r=0;r{let a=new xd(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!i||Ew(a,i))&&(i=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),i&&(!n||Ew(n,i))&&(n=i)}return n&&t.test(n)?n:null};Sw.exports=S1});var xw=E((YH,Tw)=>{"use strict";var _1=tt(),T1=(t,e)=>{try{return new _1(t,e).range||"*"}catch{return null}};Tw.exports=T1});var Ya=E((ZH,Cw)=>{"use strict";var x1=Ce(),Aw=Ri(),{ANY:$1}=Aw,R1=tt(),A1=Ci(),$w=$i(),Rw=Wa(),C1=Ha(),P1=za(),O1=(t,e,n,r)=>{t=new x1(t,r),e=new R1(e,r);let s,i,o,a,c;switch(n){case">":s=$w,i=C1,o=Rw,a=">",c=">=";break;case"<":s=Rw,i=P1,o=$w,a="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(A1(t,e,r))return!1;for(let l=0;l{f.semver===$1&&(f=new Aw(">=0.0.0")),d=d||f,p=p||f,s(f.semver,d.semver,r)?d=f:o(f.semver,p.semver,r)&&(p=f)}),d.operator===a||d.operator===c||(!p.operator||p.operator===a)&&i(t,p.semver))return!1;if(p.operator===c&&o(t,p.semver))return!1}return!0};Cw.exports=O1});var Ow=E((XH,Pw)=>{"use strict";var I1=Ya(),D1=(t,e,n)=>I1(t,e,">",n);Pw.exports=D1});var Dw=E((QH,Iw)=>{"use strict";var M1=Ya(),N1=(t,e,n)=>M1(t,e,"<",n);Iw.exports=N1});var Lw=E((eK,Nw)=>{"use strict";var Mw=tt(),L1=(t,e,n)=>(t=new Mw(t,n),e=new Mw(e,n),t.intersects(e,n));Nw.exports=L1});var jw=E((tK,Gw)=>{"use strict";var G1=Ci(),j1=et();Gw.exports=(t,e,n)=>{let r=[],s=null,i=null,o=t.sort((u,d)=>j1(u,d,n));for(let u of o)G1(u,e,n)?(i=u,s||(s=u)):(i&&r.push([s,i]),i=null,s=null);s&&r.push([s,null]);let a=[];for(let[u,d]of r)u===d?a.push(u):!d&&u===o[0]?a.push("*"):d?u===o[0]?a.push(`<=${d}`):a.push(`${u} - ${d}`):a.push(`>=${u}`);let c=a.join(" || "),l=typeof e.raw=="string"?e.raw:String(e);return c.length{"use strict";var Fw=tt(),Ad=Ri(),{ANY:$d}=Ad,Rd=Ci(),Cd=et(),F1=(t,e,n={})=>{if(t===e)return!0;t=new Fw(t,n),e=new Fw(e,n);let r=!1;e:for(let s of t.set){for(let i of e.set){let o=U1(s,i,n);if(r=r||o!==null,o)continue e}if(r)return!1}return!0},q1=[new Ad(">=0.0.0-0")],qw=[new Ad(">=0.0.0")],U1=(t,e,n)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===$d){if(e.length===1&&e[0].semver===$d)return!0;n.includePrerelease?t=q1:t=qw}if(e.length===1&&e[0].semver===$d){if(n.includePrerelease)return!0;e=qw}let r=new Set,s,i;for(let f of t)f.operator===">"||f.operator===">="?s=Uw(s,f,n):f.operator==="<"||f.operator==="<="?i=Bw(i,f,n):r.add(f.semver);if(r.size>1)return null;let o;if(s&&i){if(o=Cd(s.semver,i.semver,n),o>0)return null;if(o===0&&(s.operator!==">="||i.operator!=="<="))return null}for(let f of r){if(s&&!Rd(f,String(s),n)||i&&!Rd(f,String(i),n))return null;for(let m of e)if(!Rd(f,String(m),n))return!1;return!0}let a,c,l,u,d=i&&!n.includePrerelease&&i.semver.prerelease.length?i.semver:!1,p=s&&!n.includePrerelease&&s.semver.prerelease.length?s.semver:!1;d&&d.prerelease.length===1&&i.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let f of e){if(u=u||f.operator===">"||f.operator===">=",l=l||f.operator==="<"||f.operator==="<=",s){if(p&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===p.major&&f.semver.minor===p.minor&&f.semver.patch===p.patch&&(p=!1),f.operator===">"||f.operator===">="){if(a=Uw(s,f,n),a===f&&a!==s)return!1}else if(s.operator===">="&&!f.test(s.semver))return!1}if(i){if(d&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===d.major&&f.semver.minor===d.minor&&f.semver.patch===d.patch&&(d=!1),f.operator==="<"||f.operator==="<="){if(c=Bw(i,f,n),c===f&&c!==i)return!1}else if(i.operator==="<="&&!f.test(i.semver))return!1}if(!f.operator&&(i||s)&&o!==0)return!1}return!(s&&l&&!i&&o!==0||i&&u&&!s&&o!==0||p||d)},Uw=(t,e,n)=>{if(!t)return e;let r=Cd(t.semver,e.semver,n);return r>0?t:r<0||e.operator===">"&&t.operator===">="?e:t},Bw=(t,e,n)=>{if(!t)return e;let r=Cd(t.semver,e.semver,n);return r<0?t:r>0||e.operator==="<"&&t.operator==="<="?e:t};Vw.exports=F1});var os=E((rK,Kw)=>{"use strict";var Pd=is(),zw=ss(),B1=Ce(),Hw=md(),V1=gn(),W1=yb(),z1=wb(),H1=Eb(),K1=Tb(),J1=$b(),Y1=Ab(),Z1=Pb(),X1=Ib(),Q1=et(),eD=Lb(),tD=jb(),nD=Va(),rD=Bb(),sD=Wb(),iD=$i(),oD=Wa(),aD=yd(),cD=bd(),lD=za(),uD=Ha(),dD=wd(),pD=ew(),fD=nw(),mD=Ri(),gD=tt(),hD=Ci(),yD=yw(),bD=ww(),wD=kw(),vD=_w(),kD=xw(),ED=Ya(),SD=Ow(),_D=Dw(),TD=Lw(),xD=jw(),$D=Ww();Kw.exports={parse:V1,valid:W1,clean:z1,inc:H1,diff:K1,major:J1,minor:Y1,patch:Z1,prerelease:X1,compare:Q1,rcompare:eD,compareLoose:tD,compareBuild:nD,sort:rD,rsort:sD,gt:iD,lt:oD,eq:aD,neq:cD,gte:lD,lte:uD,cmp:dD,coerce:pD,truncate:fD,Comparator:mD,Range:gD,satisfies:hD,toComparators:yD,maxSatisfying:bD,minSatisfying:wD,minVersion:vD,validRange:kD,outside:ED,gtr:SD,ltr:_D,intersects:TD,simplifyRange:xD,subset:$D,SemVer:B1,re:Pd.re,src:Pd.src,tokens:Pd.t,SEMVER_SPEC_VERSION:zw.SEMVER_SPEC_VERSION,RELEASE_TYPES:zw.RELEASE_TYPES,compareIdentifiers:Hw.compareIdentifiers,rcompareIdentifiers:Hw.rcompareIdentifiers}});var xE={};al(xE,{TABLE:()=>R,decodeFieldSignature:()=>TE,decodeMethodSignature:()=>_E,readAssembly:()=>hc});function oj(t){if(t.length<64||t.readUInt16LE(0)!==23117)return null;let e=t.readUInt32LE(60);if(e+24>t.length||t.readUInt32LE(e)!==17744)return null;let n=t.readUInt16LE(e+6),r=t.readUInt16LE(e+20),s=e+24;if(r===0)return null;let i=t.readUInt16LE(s),o=s+(i===523?112:96),a=[],c=s+r;for(let f=0;ft.length)break;a.push({virtualSize:t.readUInt32LE(m+8),virtualAddress:t.readUInt32LE(m+12),rawAddress:t.readUInt32LE(m+20)})}let l=t.readUInt32LE(o+112);if(l===0)return null;let u=wE(l,a);if(u===null||u+16>t.length)return null;let d=t.readUInt32LE(u+8),p=wE(d,a);return p===null?null:{offset:p,sections:a}}function wE(t,e){for(let n of e)if(t>=n.virtualAddress&&tt.length||t.readUInt32LE(e)!==1112167234)return null;let n=t.readUInt32LE(e+12),r=e+16+n+2,s=t.readUInt16LE(r);r+=2;let i=new Map;for(let c=0;c"||h.startsWith("<"))continue;let y=Ej(r,s,l,f),w=SE(r,m[3]),S=[],v=[];for(let k of kE(m[4],f,s,4,i.length)){let $=i[k];if(!vE($[0]))continue;let F=r.string($[1]);F.startsWith("<")||(S.push(F),v.push(`${F}: ${TE(r,r.blob($[2]))}`))}for(let k of kE(m[5],f,s,5,o.length)){let $=o[k];if(!vE($[2]))continue;let F=r.string($[3]);F.startsWith("<")||/^(get_|set_|add_|remove_)/.test(F)||(S.push(F),v.push(`${F}${_E(r,r.blob($[4]))}`))}for(let k of u.get(f+1)??[]){let $=r.string(a[k][1]);$.startsWith("<")||(S.push($),v.push(`${$} { get; set; }`))}for(let k of d.get(f+1)??[]){let $=r.string(c[k][1]);$.startsWith("<")||(S.push($),v.push(`event ${$}`))}p.push({fullName:y,kind:kj(g,w),members:[...new Set(S)],signatures:[...new Set(v)]})}return p}function kj(t,e){return t&gj?"interface":e==="System.Enum"?"enum":e==="System.ValueType"?"struct":e==="System.MulticastDelegate"||e==="System.Delegate"?"delegate":"class"}function Ej(t,e,n,r){let s=[],i=r;for(let o=0;o<16;o++){let a=e[i];if(!a)break;s.unshift(t.string(a[1]));let c=n.get(i+1);if(c===void 0){let l=t.string(a[2]);return l?`${l}.${s.join("+")}`:s.join("+")}i=c-1}return s.join("+")}function SE(t,e){let n=e&3,r=e>>2;if(r===0)return null;if(n===0){let s=t.table(R.TypeDef)[r-1];if(!s)return null;let i=t.string(s[2]),o=t.string(s[1]);return i?`${i}.${o}`:o}if(n===1){let s=t.table(R.TypeRef)[r-1];if(!s)return null;let i=t.string(s[2]),o=t.string(s[1]);return i?`${i}.${o}`:o}return null}function kE(t,e,n,r,s){let i=n[e+1]?.[r]??s+1,o=[];for(let a=t;a`}let i=Pt(e,n);n+=i.width;let o=mt(t,e,n);n=o.offset;let a=[];for(let c=0;c=e.length);c++){let l=mt(t,e,n);n=l.offset,a.push(l.text)}return`${s}(${a.join(", ")}): ${o.text}`}function TE(t,e){return e.length<2?"?":mt(t,e,1).text}function mt(t,e,n){let r=n,s=e[r++];if(s===void 0)return{text:"?",offset:r};let i=Sj[s];if(i)return{text:i,offset:r};switch(s){case 15:{let o=mt(t,e,r);return{text:`${o.text}*`,offset:o.offset}}case 16:{let o=mt(t,e,r);return{text:`ref ${o.text}`,offset:o.offset}}case 29:{let o=mt(t,e,r);return{text:`${o.text}[]`,offset:o.offset}}case 69:{let o=mt(t,e,r);return{text:o.text,offset:o.offset}}case 17:case 18:{let o=Pt(e,r);return r+=o.width,{text:SE(t,o.value)??"object",offset:r}}case 19:case 30:{let o=Pt(e,r);return r+=o.width,{text:`${s===19?"T":"M"}${o.value}`,offset:r}}case 21:{let o=mt(t,e,r);r=o.offset;let a=Pt(e,r);r+=a.width;let c=[];for(let l=0;l`,offset:r}}case 20:{let o=mt(t,e,r);r=o.offset;let a=Pt(e,r);r+=a.width;for(let c of["sizes","lowBounds"]){let l=Pt(e,r);r+=l.width;for(let u=0;u{"use strict";ge={type:"u16"},ce={type:"u32"},he={type:"string"},lp={type:"guid"},Le={type:"blob"},le=t=>({type:"rid",table:t}),_e=t=>({type:"coded",family:t}),R={Module:0,TypeRef:1,TypeDef:2,Field:4,MethodDef:6,Param:8,InterfaceImpl:9,MemberRef:10,Constant:11,CustomAttribute:12,FieldMarshal:13,DeclSecurity:14,ClassLayout:15,FieldLayout:16,StandAloneSig:17,EventMap:18,Event:20,PropertyMap:21,Property:23,MethodSemantics:24,MethodImpl:25,ModuleRef:26,TypeSpec:27,ImplMap:28,FieldRVA:29,Assembly:32,AssemblyRef:35,File:38,ExportedType:39,ManifestResource:40,NestedClass:41,GenericParam:42,MethodSpec:43,GenericParamConstraint:44},cj={TypeDefOrRef:[R.TypeDef,R.TypeRef,R.TypeSpec],HasConstant:[R.Field,R.Param,R.Property],HasCustomAttribute:[R.MethodDef,R.Field,R.TypeRef,R.TypeDef,R.Param,R.InterfaceImpl,R.MemberRef,R.Module,R.DeclSecurity,R.Property,R.Event,R.StandAloneSig,R.ModuleRef,R.TypeSpec,R.Assembly,R.AssemblyRef,R.File,R.ExportedType,R.ManifestResource,R.GenericParam,R.GenericParamConstraint,R.MethodSpec],HasFieldMarshal:[R.Field,R.Param],HasDeclSecurity:[R.TypeDef,R.MethodDef,R.Assembly],MemberRefParent:[R.TypeDef,R.TypeRef,R.ModuleRef,R.MethodDef,R.TypeSpec],HasSemantics:[R.Event,R.Property],MethodDefOrRef:[R.MethodDef,R.MemberRef],MemberForwarded:[R.Field,R.MethodDef],Implementation:[R.File,R.AssemblyRef,R.ExportedType],CustomAttributeType:[null,null,R.MethodDef,R.MemberRef,null],ResolutionScope:[R.Module,R.ModuleRef,R.AssemblyRef,R.TypeRef],TypeOrMethodDef:[R.TypeDef,R.MethodDef]},lj={0:[ge,he,lp,lp,lp],1:[_e("ResolutionScope"),he,he],2:[ce,he,he,_e("TypeDefOrRef"),le(R.Field),le(R.MethodDef)],3:[le(R.Field)],4:[ge,he,Le],5:[le(R.MethodDef)],6:[ce,ge,ge,he,Le,le(R.Param)],7:[le(R.Param)],8:[ge,ge,he],9:[le(R.TypeDef),_e("TypeDefOrRef")],10:[_e("MemberRefParent"),he,Le],11:[ge,_e("HasConstant"),Le],12:[_e("HasCustomAttribute"),_e("CustomAttributeType"),Le],13:[_e("HasFieldMarshal"),Le],14:[ge,_e("HasDeclSecurity"),Le],15:[ge,ce,le(R.TypeDef)],16:[ce,le(R.Field)],17:[Le],18:[le(R.TypeDef),le(R.Event)],19:[le(R.Event)],20:[ge,he,_e("TypeDefOrRef")],21:[le(R.TypeDef),le(R.Property)],22:[le(R.Property)],23:[ge,he,Le],24:[ge,le(R.MethodDef),_e("HasSemantics")],25:[le(R.TypeDef),_e("MethodDefOrRef"),_e("MethodDefOrRef")],26:[he],27:[Le],28:[ge,_e("MemberForwarded"),he,le(R.ModuleRef)],29:[ce,le(R.Field)],30:[ce,ce],31:[ce],32:[ce,ge,ge,ge,ge,ce,Le,he,he],33:[ce],34:[ce,ce,ce],35:[ge,ge,ge,ge,ce,Le,he,he,Le],36:[ce,le(R.AssemblyRef)],37:[ce,ce,ce,le(R.AssemblyRef)],38:[ce,he,Le],39:[ce,ce,he,he,_e("Implementation")],40:[ce,ce,he,_e("Implementation")],41:[le(R.TypeDef),le(R.TypeDef)],42:[ge,ge,_e("TypeOrMethodDef"),he],43:[_e("MethodDefOrRef"),Le],44:[le(R.GenericParam),_e("TypeDefOrRef")]},up=class{constructor(e,n,r){this.strings=e;this.blobs=n;let s=r.readUInt8(6),i=r.readBigUInt64LE(8),o=new Map,a=24;for(let u=0;u<64;u++)i>>BigInt(u)&1n&&(o.set(u,r.readUInt32LE(a)),a+=4);let c={string:s&1?4:2,guid:s&2?4:2,blob:s&4?4:2},l=u=>{switch(u.type){case"u16":return 2;case"u32":return 4;case"string":return c.string;case"guid":return c.guid;case"blob":return c.blob;case"rid":return(o.get(u.table)??0)<65536?2:4;case"coded":{let d=cj[u.family],p=Math.ceil(Math.log2(d.length));return Math.max(...d.map(m=>m===null?0:o.get(m)??0))<1<<16-p?2:4}}};for(let[u,d]of o){let p=lj[u];if(!p)break;let f=p.map(l),m=f.reduce((h,y)=>h+y,0),g=[];for(let h=0;hr.length);h++){let y=[],w=a;for(let S of f)y.push(S===2?r.readUInt16LE(w):r.readUInt32LE(w)),w+=S;g.push(y),a+=m}this.rows.set(u,g)}}strings;blobs;rows=new Map;table(e){return this.rows.get(e)??[]}string(e){if(e>=this.strings.length)return"";let n=e;for(;n=this.blobs.length)return Buffer.alloc(0);let{value:n,width:r}=Pt(this.blobs,e);return this.blobs.subarray(e+r,e+r+n)}};uj=7,dj=1,pj=2,fj=4,mj=7,gj=32,hj=7,yj=4,bj=6,wj=5;Sj={1:"void",2:"bool",3:"char",4:"sbyte",5:"byte",6:"short",7:"ushort",8:"int",9:"uint",10:"long",11:"ulong",12:"float",13:"double",14:"string",22:"TypedReference",24:"IntPtr",25:"UIntPtr",28:"object"}});function P(t,e,n,r,s){if(r==="m")throw new TypeError("Private method is not writable");if(r==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n}function b(t,e,n,r){if(n==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!r:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?r:n==="a"?r.call(t):r?r.value:e.get(t)}var Bt=B(()=>{});var mp,oS=B(()=>{mp=function(){let{crypto:t}=globalThis;if(t?.randomUUID)return mp=t.randomUUID.bind(t),t.randomUUID();let e=new Uint8Array(1),n=t?()=>t.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,r=>(+r^n()&15>>+r/4).toString(16))}});function Vt(t){return typeof t=="object"&&t!==null&&("name"in t&&t.name==="AbortError"||"message"in t&&String(t.message).includes("FetchRequestCanceledException"))}var Ji,vs=B(()=>{Ji=t=>{if(t instanceof Error)return t;if(typeof t=="object"&&t!==null){try{if(Object.prototype.toString.call(t)==="[object Error]"){let e=new Error(t.message,t.cause?{cause:t.cause}:{});return t.stack&&(e.stack=t.stack),t.cause&&!e.cause&&(e.cause=t.cause),t.name&&(e.name=t.name),e}}catch{}try{return new Error(JSON.stringify(t))}catch{}}return new Error(t)}});var j,Te,xe,Wt,hr,yr,br,wr,vr,kr,Er,Sr,_r,gt=B(()=>{vs();j=class extends Error{},Te=class t extends j{constructor(e,n,r,s){super(`${t.makeMessage(e,n,r)}`),this.status=e,this.headers=s,this.requestID=s?.get("request-id"),this.error=n}static makeMessage(e,n,r){let s=n?.message?typeof n.message=="string"?n.message:JSON.stringify(n.message):n?JSON.stringify(n):r;return e&&s?`${e} ${s}`:e?`${e} status code (no body)`:s||"(no status code or body)"}static generate(e,n,r,s){if(!e||!s)return new Wt({message:r,cause:Ji(n)});let i=n;return e===400?new yr(e,i,r,s):e===401?new br(e,i,r,s):e===403?new wr(e,i,r,s):e===404?new vr(e,i,r,s):e===409?new kr(e,i,r,s):e===422?new Er(e,i,r,s):e===429?new Sr(e,i,r,s):e>=500?new _r(e,i,r,s):new t(e,i,r,s)}},xe=class extends Te{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},Wt=class extends Te{constructor({message:e,cause:n}){super(void 0,void 0,e||"Connection error.",void 0),n&&(this.cause=n)}},hr=class extends Wt{constructor({message:e}={}){super({message:e??"Request timed out."})}},yr=class extends Te{},br=class extends Te{},wr=class extends Te{},vr=class extends Te{},kr=class extends Te{},Er=class extends Te{},Sr=class extends Te{},_r=class extends Te{}});function vc(t){return typeof t!="object"?{}:t??{}}function cS(t){if(!t)return!0;for(let e in t)return!1;return!0}function lS(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var Xj,aS,gp,hp,uS,kc,Tr=B(()=>{gt();Xj=/^[a-z][a-z0-9+.-]*:/i,aS=t=>Xj.test(t),gp=t=>(gp=Array.isArray,gp(t)),hp=gp;uS=(t,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new j(`${t} must be an integer`);if(e<0)throw new j(`${t} must be a positive integer`);return e},kc=t=>{try{return JSON.parse(t)}catch{return}}});var dS,pS=B(()=>{dS=t=>new Promise(e=>setTimeout(e,t))});var _n,yp=B(()=>{_n="0.68.0"});function Qj(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}function tF(){if(typeof navigator>"u"||!navigator)return null;let t=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:e,pattern:n}of t){let r=n.exec(navigator.userAgent);if(r){let s=r[1]||0,i=r[2]||0,o=r[3]||0;return{browser:e,version:`${s}.${i}.${o}`}}}return null}var hS,eF,fS,mS,gS,yS,bp=B(()=>{yp();hS=()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u";eF=()=>{let t=Qj();if(t==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":_n,"X-Stainless-OS":mS(Deno.build.os),"X-Stainless-Arch":fS(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":_n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(t==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":_n,"X-Stainless-OS":mS(globalThis.process.platform??"unknown"),"X-Stainless-Arch":fS(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=tF();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":_n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${e.browser}`,"X-Stainless-Runtime-Version":e.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":_n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};fS=t=>t==="x32"?"x32":t==="x86_64"||t==="x64"?"x64":t==="arm"?"arm":t==="aarch64"||t==="arm64"?"arm64":t?`other:${t}`:"unknown",mS=t=>(t=t.toLowerCase(),t.includes("ios")?"iOS":t==="android"?"Android":t==="darwin"?"MacOS":t==="win32"?"Windows":t==="freebsd"?"FreeBSD":t==="openbsd"?"OpenBSD":t==="linux"?"Linux":t?`Other:${t}`:"Unknown"),yS=()=>gS??(gS=eF())});function bS(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function wp(...t){let e=globalThis.ReadableStream;if(typeof e>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new e(...t)}function Ec(t){let e=Symbol.asyncIterator in t?t[Symbol.asyncIterator]():t[Symbol.iterator]();return wp({start(){},async pull(n){let{done:r,value:s}=await e.next();r?n.close():n.enqueue(s)},async cancel(){await e.return?.()}})}function Yi(t){if(t[Symbol.asyncIterator])return t;let e=t.getReader();return{async next(){try{let n=await e.read();return n?.done&&e.releaseLock(),n}catch(n){throw e.releaseLock(),n}},async return(){let n=e.cancel();return e.releaseLock(),await n,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function wS(t){if(t===null||typeof t!="object")return;if(t[Symbol.asyncIterator]){await t[Symbol.asyncIterator]().return?.();return}let e=t.getReader(),n=e.cancel();e.releaseLock(),await n}var ks=B(()=>{});var vS,kS=B(()=>{vS=({headers:t,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)})});function _S(t){let e=0;for(let s of t)e+=s.length;let n=new Uint8Array(e),r=0;for(let s of t)n.set(s,r),r+=s.length;return n}function Zi(t){let e;return(ES??(e=new globalThis.TextEncoder,ES=e.encode.bind(e)))(t)}function vp(t){let e;return(SS??(e=new globalThis.TextDecoder,SS=e.decode.bind(e)))(t)}var ES,SS,kp=B(()=>{});function sF(t,e){for(let s=e??0;s{Bt();kp();zt=class{constructor(){He.set(this,void 0),Ke.set(this,void 0),P(this,He,new Uint8Array,"f"),P(this,Ke,null,"f")}decode(e){if(e==null)return[];let n=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?Zi(e):e;P(this,He,_S([b(this,He,"f"),n]),"f");let r=[],s;for(;(s=sF(b(this,He,"f"),b(this,Ke,"f")))!=null;){if(s.carriage&&b(this,Ke,"f")==null){P(this,Ke,s.index,"f");continue}if(b(this,Ke,"f")!=null&&(s.index!==b(this,Ke,"f")+1||s.carriage)){r.push(vp(b(this,He,"f").subarray(0,b(this,Ke,"f")-1))),P(this,He,b(this,He,"f").subarray(b(this,Ke,"f")),"f"),P(this,Ke,null,"f");continue}let i=b(this,Ke,"f")!==null?s.preceding-1:s.preceding,o=vp(b(this,He,"f").subarray(0,i));r.push(o),P(this,He,b(this,He,"f").subarray(s.index),"f"),P(this,Ke,null,"f")}return r}flush(){return b(this,He,"f").length?this.decode(` -`):[]}};He=new WeakMap,Ke=new WeakMap;zt.NEWLINE_CHARS=new Set([` -`,"\r"]);zt.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function Xi(){}function Sc(t,e,n){return!e||_c[t]>_c[n]?Xi:e[t].bind(e)}function $e(t){let e=t.logger,n=t.logLevel??"off";if(!e)return iF;let r=xS.get(e);if(r&&r[0]===n)return r[1];let s={error:Sc("error",e,n),warn:Sc("warn",e,n),info:Sc("info",e,n),debug:Sc("debug",e,n)};return xS.set(e,[n,s]),s}var _c,Sp,iF,xS,Ht,Tc=B(()=>{Tr();_c={off:0,error:200,warn:300,info:400,debug:500},Sp=(t,e,n)=>{if(t){if(lS(_c,t))return t;$e(n).warn(`${e} was set to ${JSON.stringify(t)}, expected one of ${JSON.stringify(Object.keys(_c))}`)}};iF={error:Xi,warn:Xi,info:Xi,debug:Xi},xS=new WeakMap;Ht=t=>(t.options&&(t.options={...t.options},delete t.options.headers),t.headers&&(t.headers=Object.fromEntries((t.headers instanceof Headers?[...t.headers]:Object.entries(t.headers)).map(([e,n])=>[e,e.toLowerCase()==="x-api-key"||e.toLowerCase()==="authorization"||e.toLowerCase()==="cookie"||e.toLowerCase()==="set-cookie"?"***":n]))),"retryOfRequestLogID"in t&&(t.retryOfRequestLogID&&(t.retryOf=t.retryOfRequestLogID),delete t.retryOfRequestLogID),t)});async function*oF(t,e){if(!t.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new j("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new j("Attempted to iterate over a response with no body");let n=new _p,r=new zt,s=Yi(t.body);for await(let i of aF(s))for(let o of r.decode(i)){let a=n.decode(o);a&&(yield a)}for(let i of r.flush()){let o=n.decode(i);o&&(yield o)}}async function*aF(t){let e=new Uint8Array;for await(let n of t){if(n==null)continue;let r=n instanceof ArrayBuffer?new Uint8Array(n):typeof n=="string"?Zi(n):n,s=new Uint8Array(e.length+r.length);s.set(e),s.set(r,e.length),e=s;let i;for(;(i=TS(e))!==-1;)yield e.slice(0,i),e=e.slice(i)}e.length>0&&(yield e)}function cF(t,e){let n=t.indexOf(e);return n!==-1?[t.substring(0,n),e,t.substring(n+e.length)]:[t,"",""]}var Qi,Ot,_p,Tp=B(()=>{Bt();gt();ks();Ep();ks();vs();Tr();kp();Tc();gt();Ot=class t{constructor(e,n,r){this.iterator=e,Qi.set(this,void 0),this.controller=n,P(this,Qi,r,"f")}static fromSSEResponse(e,n,r){let s=!1,i=r?$e(r):console;async function*o(){if(s)throw new j("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let a=!1;try{for await(let c of oF(e,n)){if(c.event==="completion")try{yield JSON.parse(c.data)}catch(l){throw i.error("Could not parse message into JSON:",c.data),i.error("From chunk:",c.raw),l}if(c.event==="message_start"||c.event==="message_delta"||c.event==="message_stop"||c.event==="content_block_start"||c.event==="content_block_delta"||c.event==="content_block_stop")try{yield JSON.parse(c.data)}catch(l){throw i.error("Could not parse message into JSON:",c.data),i.error("From chunk:",c.raw),l}if(c.event!=="ping"&&c.event==="error")throw new Te(void 0,kc(c.data)??c.data,void 0,e.headers)}a=!0}catch(c){if(Vt(c))return;throw c}finally{a||n.abort()}}return new t(o,n,r)}static fromReadableStream(e,n,r){let s=!1;async function*i(){let a=new zt,c=Yi(e);for await(let l of c)for(let u of a.decode(l))yield u;for(let l of a.flush())yield l}async function*o(){if(s)throw new j("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let a=!1;try{for await(let c of i())a||c&&(yield JSON.parse(c));a=!0}catch(c){if(Vt(c))return;throw c}finally{a||n.abort()}}return new t(o,n,r)}[(Qi=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let e=[],n=[],r=this.iterator(),s=i=>({next:()=>{if(i.length===0){let o=r.next();e.push(o),n.push(o)}return i.shift()}});return[new t(()=>s(e),this.controller,b(this,Qi,"f")),new t(()=>s(n),this.controller,b(this,Qi,"f"))]}toReadableStream(){let e=this,n;return wp({async start(){n=e[Symbol.asyncIterator]()},async pull(r){try{let{value:s,done:i}=await n.next();if(i)return r.close();let o=Zi(JSON.stringify(s)+` -`);r.enqueue(o)}catch(s){r.error(s)}},async cancel(){await n.return?.()}})}};_p=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;let i={event:this.event,data:this.data.join(` -`),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],i}if(this.chunks.push(e),e.startsWith(":"))return null;let[n,r,s]=cF(e,":");return s.startsWith(" ")&&(s=s.substring(1)),n==="event"?this.event=s:n==="data"&&this.data.push(s),null}}});async function xc(t,e){let{response:n,requestLogID:r,retryOfRequestLogID:s,startTime:i}=e,o=await(async()=>{if(e.options.stream)return $e(t).debug("response",n.status,n.url,n.headers,n.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(n,e.controller):Ot.fromSSEResponse(n,e.controller);if(n.status===204)return null;if(e.options.__binaryResponse)return n;let c=n.headers.get("content-type")?.split(";")[0]?.trim();if(c?.includes("application/json")||c?.endsWith("+json")){let d=await n.json();return xp(d,n)}return await n.text()})();return $e(t).debug(`[${r}] response parsed`,Ht({retryOfRequestLogID:s,url:n.url,status:n.status,body:o,durationMs:Date.now()-i})),o}function xp(t,e){return!t||typeof t!="object"||Array.isArray(t)?t:Object.defineProperty(t,"_request_id",{value:e.headers.get("request-id"),enumerable:!1})}var $p=B(()=>{Tp();Tc()});var eo,Tn,$c=B(()=>{Bt();$p();Tn=class t extends Promise{constructor(e,n,r=xc){super(s=>{s(null)}),this.responsePromise=n,this.parseResponse=r,eo.set(this,void 0),P(this,eo,e,"f")}_thenUnwrap(e){return new t(b(this,eo,"f"),this.responsePromise,async(n,r)=>xp(e(await this.parseResponse(n,r),r),r.response))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,n]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:n,request_id:n.headers.get("request-id")}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(b(this,eo,"f"),e))),this.parsedPromise}then(e,n){return this.parse().then(e,n)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};eo=new WeakMap});var Rc,Ac,Es,st,Ss,It=B(()=>{Bt();gt();$p();$c();Tr();Ac=class{constructor(e,n,r,s){Rc.set(this,void 0),P(this,Rc,e,"f"),this.options=s,this.response=n,this.body=r}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new j("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await b(this,Rc,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Rc=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let n of e.getPaginatedItems())yield n}},Es=class extends Tn{constructor(e,n,r){super(e,n,async(s,i)=>new r(s,i.response,await xc(s,i),i.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let n of e)yield n}},st=class extends Ac{constructor(e,n,r,s){super(e,n,r,s),this.data=r.data||[],this.has_more=r.has_more||!1,this.first_id=r.first_id||null,this.last_id=r.last_id||null}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){if(this.options.query?.before_id){let n=this.first_id;return n?{...this.options,query:{...vc(this.options.query),before_id:n}}:null}let e=this.last_id;return e?{...this.options,query:{...vc(this.options.query),after_id:e}}:null}},Ss=class extends Ac{constructor(e,n,r,s){super(e,n,r,s),this.data=r.data||[],this.has_more=r.has_more||!1,this.next_page=r.next_page||null}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.next_page;return e?{...this.options,query:{...vc(this.options.query),page:e}}:null}}});function xr(t,e,n){return Ap(),new File(t,e??"unknown_file",n)}function to(t){return(typeof t=="object"&&t!==null&&("name"in t&&t.name&&String(t.name)||"url"in t&&t.url&&String(t.url)||"filename"in t&&t.filename&&String(t.filename)||"path"in t&&t.path&&String(t.path))||"").split(/[\\/]/).pop()||void 0}function uF(t){let e=typeof t=="function"?t:t.fetch,n=$S.get(e);if(n)return n;let r=(async()=>{try{let s="Response"in e?e.Response:(await e("data:,")).constructor,i=new FormData;return i.toString()!==await new s(i).text()}catch{return!0}})();return $S.set(e,r),r}var Ap,Cp,_s,$S,dF,pF,Rp,Ts=B(()=>{ks();Ap=()=>{if(typeof File>"u"){let{process:t}=globalThis,e=typeof t?.versions?.node=="string"&&parseInt(t.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(e?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};Cp=t=>t!=null&&typeof t=="object"&&typeof t[Symbol.asyncIterator]=="function",_s=async(t,e)=>({...t,body:await dF(t.body,e)}),$S=new WeakMap;dF=async(t,e)=>{if(!await uF(e))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let n=new FormData;return await Promise.all(Object.entries(t||{}).map(([r,s])=>Rp(n,r,s))),n},pF=t=>t instanceof Blob&&"name"in t,Rp=async(t,e,n)=>{if(n!==void 0){if(n==null)throw new TypeError(`Received null for "${e}"; to pass null in FormData, you must use the string 'null'`);if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")t.append(e,String(n));else if(n instanceof Response){let r={},s=n.headers.get("Content-Type");s&&(r={type:s}),t.append(e,xr([await n.blob()],to(n),r))}else if(Cp(n))t.append(e,xr([await new Response(Ec(n)).blob()],to(n)));else if(pF(n))t.append(e,xr([n],to(n),{type:n.type}));else if(Array.isArray(n))await Promise.all(n.map(r=>Rp(t,e+"[]",r)));else if(typeof n=="object")await Promise.all(Object.entries(n).map(([r,s])=>Rp(t,`${e}[${r}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${n} instead`)}}});async function no(t,e,n){if(Ap(),t=await t,e||(e=to(t)),fF(t))return t instanceof File&&e==null&&n==null?t:xr([await t.arrayBuffer()],e??t.name,{type:t.type,lastModified:t.lastModified,...n});if(mF(t)){let s=await t.blob();return e||(e=new URL(t.url).pathname.split(/[\\/]/).pop()),xr(await Pp(s),e,n)}let r=await Pp(t);if(!n?.type){let s=r.find(i=>typeof i=="object"&&"type"in i&&i.type);typeof s=="string"&&(n={...n,type:s})}return xr(r,e,n)}async function Pp(t){let e=[];if(typeof t=="string"||ArrayBuffer.isView(t)||t instanceof ArrayBuffer)e.push(t);else if(RS(t))e.push(t instanceof Blob?t:await t.arrayBuffer());else if(Cp(t))for await(let n of t)e.push(...await Pp(n));else{let n=t?.constructor?.name;throw new Error(`Unexpected data type: ${typeof t}${n?`; constructor: ${n}`:""}${gF(t)}`)}return e}function gF(t){return typeof t!="object"||t===null?"":`; props: [${Object.getOwnPropertyNames(t).map(n=>`"${n}"`).join(", ")}]`}var RS,fF,mF,AS=B(()=>{Ts();Ts();RS=t=>t!=null&&typeof t=="object"&&typeof t.size=="number"&&typeof t.type=="string"&&typeof t.text=="function"&&typeof t.slice=="function"&&typeof t.arrayBuffer=="function",fF=t=>t!=null&&typeof t=="object"&&typeof t.name=="string"&&typeof t.lastModified=="number"&&RS(t),mF=t=>t!=null&&typeof t=="object"&&typeof t.url=="string"&&typeof t.blob=="function"});var Op=B(()=>{AS()});var CS=B(()=>{});var ue,it=B(()=>{ue=class{constructor(e){this._client=e}}});function*yF(t){if(!t)return;if(PS in t){let{values:r,nulls:s}=t;yield*r.entries();for(let i of s)yield[i,null];return}let e=!1,n;t instanceof Headers?n=t.entries():hp(t)?n=t:(e=!0,n=Object.entries(t??{}));for(let r of n){let s=r[0];if(typeof s!="string")throw new TypeError("expected header name to be a string");let i=hp(r[1])?r[1]:[r[1]],o=!1;for(let a of i)a!==void 0&&(e&&!o&&(o=!0,yield[s,null]),yield[s,a])}}var PS,W,ot=B(()=>{Tr();PS=Symbol.for("brand.privateNullableHeaders");W=t=>{let e=new Headers,n=new Set;for(let r of t){let s=new Set;for(let[i,o]of yF(r)){let a=i.toLowerCase();s.has(a)||(e.delete(i),s.add(a)),o===null?(e.delete(i),n.add(a)):(e.append(i,o),n.delete(a))}}return{[PS]:!0,values:e,nulls:n}}});function IS(t){return t.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var OS,bF,de,xn=B(()=>{gt();OS=Object.freeze(Object.create(null)),bF=(t=IS)=>function(n,...r){if(n.length===1)return n[0];let s=!1,i=[],o=n.reduce((u,d,p)=>{/[?#]/.test(d)&&(s=!0);let f=r[p],m=(s?encodeURIComponent:t)(""+f);return p!==r.length&&(f==null||typeof f=="object"&&f.toString===Object.getPrototypeOf(Object.getPrototypeOf(f.hasOwnProperty??OS)??OS)?.toString)&&(m=f+"",i.push({start:u.length+d.length,length:m.length,error:`Value of type ${Object.prototype.toString.call(f).slice(8,-1)} is not a valid path parameter`})),u+d+(p===r.length?"":m)},""),a=o.split(/[?#]/,1)[0],c=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,l;for(;(l=c.exec(a))!==null;)i.push({start:l.index,length:l[0].length,error:`Value "${l[0]}" can't be safely passed as a path parameter`});if(i.sort((u,d)=>u.start-d.start),i.length>0){let u=0,d=i.reduce((p,f)=>{let m=" ".repeat(f.start-u),g="^".repeat(f.length);return u=f.start+f.length,p+m+g},"");throw new j(`Path parameters result in path with invalid segments: +`,n)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=Oa(e),r=Qr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=Oa(e),r=Qr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,n){return this.type!=="comment"||this.indent<=n?!1:e.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};ky.Parser=ld});var _y=E(_i=>{"use strict";var Ey=Yu(),$A=yi(),Ti=vi(),RA=Kl(),CA=re(),AA=cd(),Sy=ud();function xy(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new AA.LineCounter||null,prettyErrors:e}}function PA(t,e={}){let{lineCounter:n,prettyErrors:r}=xy(e),s=new Sy.Parser(n?.addNewLine),i=new Ey.Composer(e),o=Array.from(i.compose(s.parse(t)));if(r&&n)for(let a of o)a.errors.forEach(Ti.prettifyError(t,n)),a.warnings.forEach(Ti.prettifyError(t,n));return o.length>0?o:Object.assign([],{empty:!0},i.streamInfo())}function Ty(t,e={}){let{lineCounter:n,prettyErrors:r}=xy(e),s=new Sy.Parser(n?.addNewLine),i=new Ey.Composer(e),o=null;for(let a of i.compose(s.parse(t),!0,t.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new Ti.YAMLParseError(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Ti.prettifyError(t,n)),o.warnings.forEach(Ti.prettifyError(t,n))),o}function IA(t,e,n){let r;typeof e=="function"?r=e:n===void 0&&e&&typeof e=="object"&&(n=e);let s=Ty(t,n);if(!s)return null;if(s.warnings.forEach(i=>RA.warn(s.options.logLevel,i)),s.errors.length>0){if(s.options.logLevel!=="silent")throw s.errors[0];s.errors=[]}return s.toJS(Object.assign({reviver:r},n))}function OA(t,e,n){let r=null;if(typeof e=="function"||Array.isArray(e)?r=e:n===void 0&&e&&(n=e),typeof n=="string"&&(n=n.length),typeof n=="number"){let s=Math.round(n);n=s<1?void 0:s>8?{indent:8}:{indent:s}}if(t===void 0){let{keepUndefined:s}=n??e??{};if(!s)return}return CA.isDocument(t)&&!r?t.toString(n):new $A.Document(t,r,n).toString(n)}_i.parse=IA;_i.parseAllDocuments=PA;_i.parseDocument=Ty;_i.stringify=OA});var $i=E(ae=>{"use strict";var DA=Yu(),MA=yi(),NA=Au(),dd=vi(),LA=ti(),un=re(),GA=sn(),FA=xe(),jA=an(),qA=cn(),UA=Pa(),BA=od(),VA=cd(),WA=ud(),Ma=_y(),$y=Zs();ae.Composer=DA.Composer;ae.Document=MA.Document;ae.Schema=NA.Schema;ae.YAMLError=dd.YAMLError;ae.YAMLParseError=dd.YAMLParseError;ae.YAMLWarning=dd.YAMLWarning;ae.Alias=LA.Alias;ae.isAlias=un.isAlias;ae.isCollection=un.isCollection;ae.isDocument=un.isDocument;ae.isMap=un.isMap;ae.isNode=un.isNode;ae.isPair=un.isPair;ae.isScalar=un.isScalar;ae.isSeq=un.isSeq;ae.Pair=GA.Pair;ae.Scalar=FA.Scalar;ae.YAMLMap=jA.YAMLMap;ae.YAMLSeq=qA.YAMLSeq;ae.CST=UA;ae.Lexer=BA.Lexer;ae.LineCounter=VA.LineCounter;ae.Parser=WA.Parser;ae.parse=Ma.parse;ae.parseAllDocuments=Ma.parseAllDocuments;ae.parseDocument=Ma.parseDocument;ae.stringify=Ma.stringify;ae.visit=$y.visit;ae.visitAsync=$y.visitAsync});var cb=E(Va=>{"use strict";Object.defineProperty(Va,"__esModule",{value:!0});Va.format=EI;Va.parse=SI;var wI=/^[\u0009\u0020-\u007e\u0080-\u00ff]*$/,rb=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,vI=/[\\"]/g,kI=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,sb=(()=>{let t=function(){};return t.prototype=Object.create(null),t})();function EI(t){let{type:e,parameters:n}=t;if(!e||!kI.test(e))throw new TypeError(`Invalid type: ${e}`);let r=e;if(n)for(let s of Object.keys(n)){if(!rb.test(s))throw new TypeError(`Invalid parameter name: ${s}`);r+=`; ${s}=${$I(n[s])}`}return r}function SI(t,e){let n=t.length,r=vd(t,0,n),s=r;r=wd(t,r,n);let i=kd(t,s,r),o=t.slice(s,i).toLowerCase(),a=e?.parameters===!1?new sb:_I(t,r,n);return{type:o,parameters:a}}var ib=32,ob=9,ab=59,xI=61,nb=34,TI=92;function _I(t,e,n){let r=new sb;e:for(;ee;){let r=t.charCodeAt(n-1);if(r!==ib&&r!==ob)break;n--}return n}function $I(t){if(rb.test(t))return t;if(wI.test(t))return`"${t.replace(vI,"\\$&")}"`;throw new TypeError(`Invalid parameter value: ${t}`)}});var ds=E((GK,Nb)=>{"use strict";var lO="2.0.0",uO=Number.MAX_SAFE_INTEGER||9007199254740991,dO=16,pO=250,fO=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Nb.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:dO,MAX_SAFE_BUILD_LENGTH:pO,MAX_SAFE_INTEGER:uO,RELEASE_TYPES:fO,SEMVER_SPEC_VERSION:lO,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Oi=E((FK,Lb)=>{"use strict";var mO=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};Lb.exports=mO});var ps=E((Ct,Gb)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:Nd,MAX_SAFE_BUILD_LENGTH:gO,MAX_LENGTH:hO}=ds(),yO=Oi();Ct=Gb.exports={};var bO=Ct.re=[],wO=Ct.safeRe=[],O=Ct.src=[],vO=Ct.safeSrc=[],D=Ct.t={},kO=0,Ld="[a-zA-Z0-9-]",EO=[["\\s",1],["\\d",hO],[Ld,gO]],SO=t=>{for(let[e,n]of EO)t=t.split(`${e}*`).join(`${e}{0,${n}}`).split(`${e}+`).join(`${e}{1,${n}}`);return t},Y=(t,e,n)=>{let r=SO(e),s=kO++;yO(t,s,e),D[t]=s,O[s]=e,vO[s]=r,bO[s]=new RegExp(e,n?"g":void 0),wO[s]=new RegExp(r,n?"g":void 0)};Y("NUMERICIDENTIFIER","0|[1-9]\\d*");Y("NUMERICIDENTIFIERLOOSE","\\d+");Y("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${Ld}*`);Y("MAINVERSION",`(${O[D.NUMERICIDENTIFIER]})\\.(${O[D.NUMERICIDENTIFIER]})\\.(${O[D.NUMERICIDENTIFIER]})`);Y("MAINVERSIONLOOSE",`(${O[D.NUMERICIDENTIFIERLOOSE]})\\.(${O[D.NUMERICIDENTIFIERLOOSE]})\\.(${O[D.NUMERICIDENTIFIERLOOSE]})`);Y("PRERELEASEIDENTIFIER",`(?:${O[D.NONNUMERICIDENTIFIER]}|${O[D.NUMERICIDENTIFIER]})`);Y("PRERELEASEIDENTIFIERLOOSE",`(?:${O[D.NONNUMERICIDENTIFIER]}|${O[D.NUMERICIDENTIFIERLOOSE]})`);Y("PRERELEASE",`(?:-(${O[D.PRERELEASEIDENTIFIER]}(?:\\.${O[D.PRERELEASEIDENTIFIER]})*))`);Y("PRERELEASELOOSE",`(?:-?(${O[D.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${O[D.PRERELEASEIDENTIFIERLOOSE]})*))`);Y("BUILDIDENTIFIER",`${Ld}+`);Y("BUILD",`(?:\\+(${O[D.BUILDIDENTIFIER]}(?:\\.${O[D.BUILDIDENTIFIER]})*))`);Y("FULLPLAIN",`v?${O[D.MAINVERSION]}${O[D.PRERELEASE]}?${O[D.BUILD]}?`);Y("FULL",`^${O[D.FULLPLAIN]}$`);Y("LOOSEPLAIN",`[v=\\s]*${O[D.MAINVERSIONLOOSE]}${O[D.PRERELEASELOOSE]}?${O[D.BUILD]}?`);Y("LOOSE",`^${O[D.LOOSEPLAIN]}$`);Y("GTLT","((?:<|>)?=?)");Y("XRANGEIDENTIFIERLOOSE",`${O[D.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Y("XRANGEIDENTIFIER",`${O[D.NUMERICIDENTIFIER]}|x|X|\\*`);Y("XRANGEPLAIN",`[v=\\s]*(${O[D.XRANGEIDENTIFIER]})(?:\\.(${O[D.XRANGEIDENTIFIER]})(?:\\.(${O[D.XRANGEIDENTIFIER]})(?:${O[D.PRERELEASE]})?${O[D.BUILD]}?)?)?`);Y("XRANGEPLAINLOOSE",`[v=\\s]*(${O[D.XRANGEIDENTIFIERLOOSE]})(?:\\.(${O[D.XRANGEIDENTIFIERLOOSE]})(?:\\.(${O[D.XRANGEIDENTIFIERLOOSE]})(?:${O[D.PRERELEASELOOSE]})?${O[D.BUILD]}?)?)?`);Y("XRANGE",`^${O[D.GTLT]}\\s*${O[D.XRANGEPLAIN]}$`);Y("XRANGELOOSE",`^${O[D.GTLT]}\\s*${O[D.XRANGEPLAINLOOSE]}$`);Y("COERCEPLAIN",`(^|[^\\d])(\\d{1,${Nd}})(?:\\.(\\d{1,${Nd}}))?(?:\\.(\\d{1,${Nd}}))?`);Y("COERCE",`${O[D.COERCEPLAIN]}(?:$|[^\\d])`);Y("COERCEFULL",O[D.COERCEPLAIN]+`(?:${O[D.PRERELEASE]})?(?:${O[D.BUILD]})?(?:$|[^\\d])`);Y("COERCERTL",O[D.COERCE],!0);Y("COERCERTLFULL",O[D.COERCEFULL],!0);Y("LONETILDE","(?:~>?)");Y("TILDETRIM",`(\\s*)${O[D.LONETILDE]}\\s+`,!0);Ct.tildeTrimReplace="$1~";Y("TILDE",`^${O[D.LONETILDE]}${O[D.XRANGEPLAIN]}$`);Y("TILDELOOSE",`^${O[D.LONETILDE]}${O[D.XRANGEPLAINLOOSE]}$`);Y("LONECARET","(?:\\^)");Y("CARETTRIM",`(\\s*)${O[D.LONECARET]}\\s+`,!0);Ct.caretTrimReplace="$1^";Y("CARET",`^${O[D.LONECARET]}${O[D.XRANGEPLAIN]}$`);Y("CARETLOOSE",`^${O[D.LONECARET]}${O[D.XRANGEPLAINLOOSE]}$`);Y("COMPARATORLOOSE",`^${O[D.GTLT]}\\s*(${O[D.LOOSEPLAIN]})$|^$`);Y("COMPARATOR",`^${O[D.GTLT]}\\s*(${O[D.FULLPLAIN]})$|^$`);Y("COMPARATORTRIM",`(\\s*)${O[D.GTLT]}\\s*(${O[D.LOOSEPLAIN]}|${O[D.XRANGEPLAIN]})`,!0);Ct.comparatorTrimReplace="$1$2$3";Y("HYPHENRANGE",`^\\s*(${O[D.XRANGEPLAIN]})\\s+-\\s+(${O[D.XRANGEPLAIN]})\\s*$`);Y("HYPHENRANGELOOSE",`^\\s*(${O[D.XRANGEPLAINLOOSE]})\\s+-\\s+(${O[D.XRANGEPLAINLOOSE]})\\s*$`);Y("STAR","(<|>)?=?\\s*\\*");Y("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Y("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Ja=E((jK,Fb)=>{"use strict";var xO=Object.freeze({loose:!0}),TO=Object.freeze({}),_O=t=>t?typeof t!="object"?xO:t:TO;Fb.exports=_O});var Gd=E((qK,Ub)=>{"use strict";var jb=/^[0-9]+$/,qb=(t,e)=>{if(typeof t=="number"&&typeof e=="number")return t===e?0:tqb(e,t);Ub.exports={compareIdentifiers:qb,rcompareIdentifiers:$O}});var Me=E((UK,Vb)=>{"use strict";var Ya=Oi(),{MAX_LENGTH:Bb,MAX_SAFE_INTEGER:Za}=ds(),{safeRe:Xa,t:Qa}=ps(),RO=Ja(),{compareIdentifiers:Fd}=Gd(),CO=(t,e)=>{let n=e.split(".");if(n.length>t.length)return!1;for(let r=0;rBb)throw new TypeError(`version is longer than ${Bb} characters`);Ya("SemVer",e,n),this.options=n,this.loose=!!n.loose,this.includePrerelease=!!n.includePrerelease;let r=e.trim().match(n.loose?Xa[Qa.LOOSE]:Xa[Qa.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>Za||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Za||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Za||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map(s=>{if(/^[0-9]+$/.test(s)){let i=+s;if(i>=0&&ie.major?1:this.minore.minor?1:this.patche.patch?1:0}comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let n=0;do{let r=this.prerelease[n],s=e.prerelease[n];if(Ya("prerelease compare",n,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Fd(r,s)}while(++n)}compareBuild(e){e instanceof t||(e=new t(e,this.options));let n=0;do{let r=this.build[n],s=e.build[n];if(Ya("build compare",n,r,s),r===void 0&&s===void 0)return 0;if(s===void 0)return 1;if(r===void 0)return-1;if(r===s)continue;return Fd(r,s)}while(++n)}inc(e,n,r){if(e.startsWith("pre")){if(!n&&r===!1)throw new Error("invalid increment argument: identifier is empty");if(n){let s=`-${n}`.match(this.options.loose?Xa[Qa.PRERELEASELOOSE]:Xa[Qa.PRERELEASE]);if(!s||s[1]!==n)throw new Error(`invalid identifier: ${n}`)}}switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",n,r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",n,r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",n,r),this.inc("pre",n,r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",n,r),this.inc("pre",n,r);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let s=Number(r)?1:0;if(this.prerelease.length===0)this.prerelease=[s];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(n===this.prerelease.join(".")&&r===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(s)}}if(n){let i=[n,s];if(r===!1&&(i=[n]),CO(this.prerelease,n)){let o=this.prerelease[n.split(".").length];isNaN(o)&&(this.prerelease=i)}else this.prerelease=i}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};Vb.exports=jd});var yn=E((BK,zb)=>{"use strict";var Wb=Me(),AO=(t,e,n=!1)=>{if(t instanceof Wb)return t;try{return new Wb(t,e)}catch(r){if(!n)return null;throw r}};zb.exports=AO});var Kb=E((VK,Hb)=>{"use strict";var PO=yn(),IO=(t,e)=>{let n=PO(t,e);return n?n.version:null};Hb.exports=IO});var Yb=E((WK,Jb)=>{"use strict";var OO=yn(),DO=(t,e)=>{let n=OO(t.trim().replace(/^[=v]+/,""),e);return n?n.version:null};Jb.exports=DO});var Qb=E((zK,Xb)=>{"use strict";var Zb=Me(),MO=(t,e,n,r,s)=>{typeof n=="string"&&(s=r,r=n,n=void 0);try{return new Zb(t instanceof Zb?t.version:t,n).inc(e,r,s).version}catch{return null}};Xb.exports=MO});var nw=E((HK,tw)=>{"use strict";var ew=yn(),NO=(t,e)=>{let n=ew(t,null,!0),r=ew(e,null,!0),s=n.compare(r);if(s===0)return null;let i=s>0,o=i?n:r,a=i?r:n,c=!!o.prerelease.length;if(!!a.prerelease.length&&!c){if(!a.patch&&!a.minor)return"major";if(a.compareMain(o)===0)return a.minor&&!a.patch?"minor":"patch"}let u=c?"pre":"";return n.major!==r.major?u+"major":n.minor!==r.minor?u+"minor":n.patch!==r.patch?u+"patch":"prerelease"};tw.exports=NO});var sw=E((KK,rw)=>{"use strict";var LO=Me(),GO=(t,e)=>new LO(t,e).major;rw.exports=GO});var ow=E((JK,iw)=>{"use strict";var FO=Me(),jO=(t,e)=>new FO(t,e).minor;iw.exports=jO});var cw=E((YK,aw)=>{"use strict";var qO=Me(),UO=(t,e)=>new qO(t,e).patch;aw.exports=UO});var uw=E((ZK,lw)=>{"use strict";var BO=yn(),VO=(t,e)=>{let n=BO(t,e);return n&&n.prerelease.length?n.prerelease:null};lw.exports=VO});var rt=E((XK,pw)=>{"use strict";var dw=Me(),WO=(t,e,n)=>new dw(t,n).compare(new dw(e,n));pw.exports=WO});var mw=E((QK,fw)=>{"use strict";var zO=rt(),HO=(t,e,n)=>zO(e,t,n);fw.exports=HO});var hw=E((e4,gw)=>{"use strict";var KO=rt(),JO=(t,e)=>KO(t,e,!0);gw.exports=JO});var ec=E((t4,bw)=>{"use strict";var yw=Me(),YO=(t,e,n)=>{let r=new yw(t,n),s=new yw(e,n);return r.compare(s)||r.compareBuild(s)};bw.exports=YO});var vw=E((n4,ww)=>{"use strict";var ZO=ec(),XO=(t,e)=>t.sort((n,r)=>ZO(n,r,e));ww.exports=XO});var Ew=E((r4,kw)=>{"use strict";var QO=ec(),e1=(t,e)=>t.sort((n,r)=>QO(r,n,e));kw.exports=e1});var Di=E((s4,Sw)=>{"use strict";var t1=rt(),n1=(t,e,n)=>t1(t,e,n)>0;Sw.exports=n1});var tc=E((i4,xw)=>{"use strict";var r1=rt(),s1=(t,e,n)=>r1(t,e,n)<0;xw.exports=s1});var qd=E((o4,Tw)=>{"use strict";var i1=rt(),o1=(t,e,n)=>i1(t,e,n)===0;Tw.exports=o1});var Ud=E((a4,_w)=>{"use strict";var a1=rt(),c1=(t,e,n)=>a1(t,e,n)!==0;_w.exports=c1});var nc=E((c4,$w)=>{"use strict";var l1=rt(),u1=(t,e,n)=>l1(t,e,n)>=0;$w.exports=u1});var rc=E((l4,Rw)=>{"use strict";var d1=rt(),p1=(t,e,n)=>d1(t,e,n)<=0;Rw.exports=p1});var Bd=E((u4,Cw)=>{"use strict";var f1=qd(),m1=Ud(),g1=Di(),h1=nc(),y1=tc(),b1=rc(),w1=(t,e,n,r)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t===n;case"!==":return typeof t=="object"&&(t=t.version),typeof n=="object"&&(n=n.version),t!==n;case"":case"=":case"==":return f1(t,n,r);case"!=":return m1(t,n,r);case">":return g1(t,n,r);case">=":return h1(t,n,r);case"<":return y1(t,n,r);case"<=":return b1(t,n,r);default:throw new TypeError(`Invalid operator: ${e}`)}};Cw.exports=w1});var Pw=E((d4,Aw)=>{"use strict";var v1=Me(),k1=yn(),{safeRe:sc,t:ic}=ps(),E1=(t,e)=>{if(t instanceof v1)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let n=null;if(!e.rtl)n=t.match(e.includePrerelease?sc[ic.COERCEFULL]:sc[ic.COERCE]);else{let c=e.includePrerelease?sc[ic.COERCERTLFULL]:sc[ic.COERCERTL],l;for(;(l=c.exec(t))&&(!n||n.index+n[0].length!==t.length);)(!n||l.index+l[0].length!==n.index+n[0].length)&&(n=l),c.lastIndex=l.index+l[1].length+l[2].length;c.lastIndex=-1}if(n===null)return null;let r=n[2],s=n[3]||"0",i=n[4]||"0",o=e.includePrerelease&&n[5]?`-${n[5]}`:"",a=e.includePrerelease&&n[6]?`+${n[6]}`:"";return k1(`${r}.${s}.${i}${o}${a}`,e)};Aw.exports=E1});var Ow=E((p4,Iw)=>{"use strict";var S1=yn(),x1=ds(),T1=Me(),_1=(t,e,n)=>{if(!x1.RELEASE_TYPES.includes(e))return null;let r=$1(t,n);return r&&R1(r,e)},$1=(t,e)=>{let n=t instanceof T1?t.version:t;return S1(n,e)},R1=(t,e)=>{if(C1(e))return t.version;switch(t.prerelease=[],e){case"major":t.minor=0,t.patch=0;break;case"minor":t.patch=0;break}return t.format()},C1=t=>t.startsWith("pre");Iw.exports=_1});var Mw=E((f4,Dw)=>{"use strict";var Vd=class{constructor(){this.max=1e3,this.map=new Map}get(e){let n=this.map.get(e);if(n!==void 0)return this.map.delete(e),this.map.set(e,n),n}delete(e){return this.map.delete(e)}set(e,n){if(!this.delete(e)&&n!==void 0){if(this.map.size>=this.max){let s=this.map.keys().next().value;this.delete(s)}this.map.set(e,n)}return this}};Dw.exports=Vd});var st=E((m4,Fw)=>{"use strict";var A1=/\s+/g,Wd=class t{constructor(e,n){if(n=I1(n),e instanceof t)return e.loose===!!n.loose&&e.includePrerelease===!!n.includePrerelease?e:new t(e.raw,n);if(e instanceof zd)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=n,this.loose=!!n.loose,this.includePrerelease=!!n.includePrerelease,this.raw=e.trim().replace(A1," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(r=>r.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let r=this.set[0];if(this.set=this.set.filter(s=>!Lw(s[0])),this.set.length===0)this.set=[r];else if(this.set.length>1){for(let s of this.set)if(s.length===1&&q1(s[0])){this.set=[s];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let e=0;e0&&(this.formatted+="||");let n=this.set[e];for(let r=0;r0&&(this.formatted+=" "),this.formatted+=n[r].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){e=e.replace(j1,"");let r=((this.options.includePrerelease&&G1)|(this.options.loose&&F1))+":"+e,s=Nw.get(r);if(s)return s;let i=this.options.loose,o=i?Fe[Ne.HYPHENRANGELOOSE]:Fe[Ne.HYPHENRANGE];e=e.replace(o,X1(this.options.includePrerelease)),le("hyphen replace",e),e=e.replace(Fe[Ne.COMPARATORTRIM],M1),le("comparator trim",e),e=e.replace(Fe[Ne.TILDETRIM],N1),le("tilde trim",e),e=e.replace(Fe[Ne.CARETTRIM],L1),le("caret trim",e);let a=e.split(" ").map(d=>U1(d,this.options)).join(" ").split(/\s+/).map(d=>Z1(d,this.options));i&&(a=a.filter(d=>(le("loose invalid filter",d,this.options),!!d.match(Fe[Ne.COMPARATORLOOSE])))),le("range list",a);let c=new Map,l=a.map(d=>new zd(d,this.options));for(let d of l){if(Lw(d))return[d];c.set(d.value,d)}c.size>1&&c.has("")&&c.delete("");let u=[...c.values()];return Nw.set(r,u),u}intersects(e,n){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(r=>Gw(r,n)&&e.set.some(s=>Gw(s,n)&&r.every(i=>s.every(o=>i.intersects(o,n)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new O1(e,this.options)}catch{return!1}for(let n=0;nt.value==="<0.0.0-0",q1=t=>t.value==="",Gw=(t,e)=>{let n=!0,r=t.slice(),s=r.pop();for(;n&&r.length;)n=r.every(i=>s.intersects(i,e)),s=r.pop();return n},U1=(t,e)=>(t=t.replace(Fe[Ne.BUILD],""),le("comp",t,e),t=z1(t,e),le("caret",t),t=V1(t,e),le("tildes",t),t=K1(t,e),le("xrange",t),t=Y1(t,e),le("stars",t),t),$e=t=>!t||t.toLowerCase()==="x"||t==="*",B1=(t,e,n)=>$e(t)&&!$e(e)||$e(e)&&n&&!$e(n),V1=(t,e)=>t.trim().split(/\s+/).map(n=>W1(n,e)).join(" "),W1=(t,e)=>{let n=e.loose?Fe[Ne.TILDELOOSE]:Fe[Ne.TILDE],r=e.includePrerelease?"-0":"";return t.replace(n,(s,i,o,a,c)=>{le("tilde",t,s,i,o,a,c);let l;return $e(i)?l="":$e(o)?l=`>=${i}.0.0${r} <${+i+1}.0.0-0`:$e(a)?l=`>=${i}.${o}.0${r} <${i}.${+o+1}.0-0`:c?(le("replaceTilde pr",c),l=`>=${i}.${o}.${a}-${c} <${i}.${+o+1}.0-0`):l=`>=${i}.${o}.${a} <${i}.${+o+1}.0-0`,le("tilde return",l),l})},z1=(t,e)=>t.trim().split(/\s+/).map(n=>H1(n,e)).join(" "),H1=(t,e)=>{le("caret",t,e);let n=e.loose?Fe[Ne.CARETLOOSE]:Fe[Ne.CARET],r=e.includePrerelease?"-0":"";return t.replace(n,(s,i,o,a,c)=>{le("caret",t,s,i,o,a,c);let l;return $e(i)?l="":$e(o)?l=`>=${i}.0.0${r} <${+i+1}.0.0-0`:$e(a)?i==="0"?l=`>=${i}.${o}.0${r} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.0${r} <${+i+1}.0.0-0`:c?(le("replaceCaret pr",c),i==="0"?o==="0"?l=`>=${i}.${o}.${a}-${c} <${i}.${o}.${+a+1}-0`:l=`>=${i}.${o}.${a}-${c} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.${a}-${c} <${+i+1}.0.0-0`):(le("no pr"),i==="0"?o==="0"?l=`>=${i}.${o}.${a} <${i}.${o}.${+a+1}-0`:l=`>=${i}.${o}.${a} <${i}.${+o+1}.0-0`:l=`>=${i}.${o}.${a} <${+i+1}.0.0-0`),le("caret return",l),l})},K1=(t,e)=>(le("replaceXRanges",t,e),t.split(/\s+/).map(n=>J1(n,e)).join(" ")),J1=(t,e)=>{t=t.trim();let n=e.loose?Fe[Ne.XRANGELOOSE]:Fe[Ne.XRANGE];return t.replace(n,(r,s,i,o,a,c)=>{if(le("xRange",t,r,s,i,o,a,c),B1(i,o,a))return t;let l=$e(i),u=l||$e(o),d=u||$e(a),p=d;return s==="="&&p&&(s=""),c=e.includePrerelease?"-0":"",l?s===">"||s==="<"?r="<0.0.0-0":r="*":s&&p?(u&&(o=0),a=0,s===">"?(s=">=",u?(i=+i+1,o=0,a=0):(o=+o+1,a=0)):s==="<="&&(s="<",u?i=+i+1:o=+o+1),s==="<"&&(c="-0"),r=`${s+i}.${o}.${a}${c}`):u?r=`>=${i}.0.0${c} <${+i+1}.0.0-0`:d&&(r=`>=${i}.${o}.0${c} <${i}.${+o+1}.0-0`),le("xRange return",r),r})},Y1=(t,e)=>(le("replaceStars",t,e),t.trim().replace(Fe[Ne.STAR],"")),Z1=(t,e)=>(le("replaceGTE0",t,e),t.trim().replace(Fe[e.includePrerelease?Ne.GTE0PRE:Ne.GTE0],"")),X1=t=>(e,n,r,s,i,o,a,c,l,u,d,p)=>($e(r)?n="":$e(s)?n=`>=${r}.0.0${t?"-0":""}`:$e(i)?n=`>=${r}.${s}.0${t?"-0":""}`:o?n=`>=${n}`:n=`>=${n}${t?"-0":""}`,$e(l)?c="":$e(u)?c=`<${+l+1}.0.0-0`:$e(d)?c=`<${l}.${+u+1}.0-0`:p?c=`<=${l}.${u}.${d}-${p}`:t?c=`<${l}.${u}.${+d+1}-0`:c=`<=${c}`,`${n} ${c}`.trim()),Q1=(t,e,n)=>{for(let r=0;r0){let s=t[r].semver;if(s.major===e.major&&s.minor===e.minor&&s.patch===e.patch)return!0}return!1}return!0}});var Mi=E((g4,Ww)=>{"use strict";var Ni=Symbol("SemVer ANY"),Jd=class t{static get ANY(){return Ni}constructor(e,n){if(n=jw(n),e instanceof t){if(e.loose===!!n.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),Kd("comparator",e,n),this.options=n,this.loose=!!n.loose,this.parse(e),this.semver===Ni?this.value="":this.value=this.operator+this.semver.version,Kd("comp",this)}parse(e){let n=this.options.loose?qw[Uw.COMPARATORLOOSE]:qw[Uw.COMPARATOR],r=e.match(n);if(!r)throw new TypeError(`Invalid comparator: ${e}`);this.operator=r[1]!==void 0?r[1]:"",this.operator==="="&&(this.operator=""),r[2]?this.semver=new Bw(r[2],this.options.loose):this.semver=Ni}toString(){return this.value}test(e){if(Kd("Comparator.test",e,this.options.loose),this.semver===Ni||e===Ni)return!0;if(typeof e=="string")try{e=new Bw(e,this.options)}catch{return!1}return Hd(e,this.operator,this.semver,this.options)}intersects(e,n){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Vw(e.value,n).test(this.value):e.operator===""?e.value===""?!0:new Vw(this.value,n).test(e.semver):(n=jw(n),n.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!n.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||Hd(this.semver,"<",e.semver,n)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||Hd(this.semver,">",e.semver,n)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Ww.exports=Jd;var jw=Ja(),{safeRe:qw,t:Uw}=ps(),Hd=Bd(),Kd=Oi(),Bw=Me(),Vw=st()});var Li=E((h4,zw)=>{"use strict";var eD=st(),tD=(t,e,n)=>{try{e=new eD(e,n)}catch{return!1}return e.test(t)};zw.exports=tD});var Kw=E((y4,Hw)=>{"use strict";var nD=st(),rD=(t,e)=>new nD(t,e).set.map(n=>n.map(r=>r.value).join(" ").trim().split(" "));Hw.exports=rD});var Yw=E((b4,Jw)=>{"use strict";var sD=Me(),iD=st(),oD=(t,e,n)=>{let r=null,s=null,i=null;try{i=new iD(e,n)}catch{return null}return t.forEach(o=>{i.test(o)&&(!r||s.compare(o)===-1)&&(r=o,s=new sD(r,n))}),r};Jw.exports=oD});var Xw=E((w4,Zw)=>{"use strict";var aD=Me(),cD=st(),lD=(t,e,n)=>{let r=null,s=null,i=null;try{i=new cD(e,n)}catch{return null}return t.forEach(o=>{i.test(o)&&(!r||s.compare(o)===1)&&(r=o,s=new aD(r,n))}),r};Zw.exports=lD});var tv=E((v4,ev)=>{"use strict";var Yd=Me(),uD=st(),Qw=Di(),dD=(t,e)=>{t=new uD(t,e);let n=new Yd("0.0.0");if(t.test(n)||(n=new Yd("0.0.0-0"),t.test(n)))return n;n=null;for(let r=0;r{let a=new Yd(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!i||Qw(a,i))&&(i=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),i&&(!n||Qw(n,i))&&(n=i)}return n&&t.test(n)?n:null};ev.exports=dD});var rv=E((k4,nv)=>{"use strict";var pD=st(),fD=(t,e)=>{try{return new pD(t,e).range||"*"}catch{return null}};nv.exports=fD});var oc=E((E4,av)=>{"use strict";var mD=Me(),ov=Mi(),{ANY:gD}=ov,hD=st(),yD=Li(),sv=Di(),iv=tc(),bD=rc(),wD=nc(),vD=(t,e,n,r)=>{t=new mD(t,r),e=new hD(e,r);let s,i,o,a,c;switch(n){case">":s=sv,i=bD,o=iv,a=">",c=">=";break;case"<":s=iv,i=wD,o=sv,a="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(yD(t,e,r))return!1;for(let l=0;l{f.semver===gD&&(f=new ov(">=0.0.0")),d=d||f,p=p||f,s(f.semver,d.semver,r)?d=f:o(f.semver,p.semver,r)&&(p=f)}),d.operator===a||d.operator===c||(!p.operator||p.operator===a)&&i(t,p.semver))return!1;if(p.operator===c&&o(t,p.semver))return!1}return!0};av.exports=vD});var lv=E((S4,cv)=>{"use strict";var kD=oc(),ED=(t,e,n)=>kD(t,e,">",n);cv.exports=ED});var dv=E((x4,uv)=>{"use strict";var SD=oc(),xD=(t,e,n)=>SD(t,e,"<",n);uv.exports=xD});var mv=E((T4,fv)=>{"use strict";var pv=st(),TD=(t,e,n)=>(t=new pv(t,n),e=new pv(e,n),t.intersects(e,n));fv.exports=TD});var hv=E((_4,gv)=>{"use strict";var _D=Li(),$D=rt();gv.exports=(t,e,n)=>{let r=[],s=null,i=null,o=t.sort((u,d)=>$D(u,d,n));for(let u of o)_D(u,e,n)?(i=u,s||(s=u)):(i&&r.push([s,i]),i=null,s=null);s&&r.push([s,null]);let a=[];for(let[u,d]of r)u===d?a.push(u):!d&&u===o[0]?a.push("*"):d?u===o[0]?a.push(`<=${d}`):a.push(`${u} - ${d}`):a.push(`>=${u}`);let c=a.join(" || "),l=typeof e.raw=="string"?e.raw:String(e);return c.length{"use strict";var yv=st(),Qd=Mi(),{ANY:Zd}=Qd,Xd=Li(),ep=rt(),RD=(t,e,n={})=>{if(t===e)return!0;t=new yv(t,n),e=new yv(e,n);let r=!1;e:for(let s of t.set){for(let i of e.set){let o=AD(s,i,n);if(r=r||o!==null,o)continue e}if(r)return!1}return!0},CD=[new Qd(">=0.0.0-0")],bv=[new Qd(">=0.0.0")],AD=(t,e,n)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===Zd){if(e.length===1&&e[0].semver===Zd)return!0;n.includePrerelease?t=CD:t=bv}if(e.length===1&&e[0].semver===Zd){if(n.includePrerelease)return!0;e=bv}let r=new Set,s,i;for(let f of t)f.operator===">"||f.operator===">="?s=wv(s,f,n):f.operator==="<"||f.operator==="<="?i=vv(i,f,n):r.add(f.semver);if(r.size>1)return null;let o;if(s&&i){if(o=ep(s.semver,i.semver,n),o>0)return null;if(o===0&&(s.operator!==">="||i.operator!=="<="))return null}for(let f of r){if(s&&!Xd(f,String(s),n)||i&&!Xd(f,String(i),n))return null;for(let m of e)if(!Xd(f,String(m),n))return!1;return!0}let a,c,l,u,d=i&&!n.includePrerelease&&i.semver.prerelease.length?i.semver:!1,p=s&&!n.includePrerelease&&s.semver.prerelease.length?s.semver:!1;d&&d.prerelease.length===1&&i.operator==="<"&&d.prerelease[0]===0&&(d=!1);for(let f of e){if(u=u||f.operator===">"||f.operator===">=",l=l||f.operator==="<"||f.operator==="<=",s){if(p&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===p.major&&f.semver.minor===p.minor&&f.semver.patch===p.patch&&(p=!1),f.operator===">"||f.operator===">="){if(a=wv(s,f,n),a===f&&a!==s)return!1}else if(s.operator===">="&&!f.test(s.semver))return!1}if(i){if(d&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===d.major&&f.semver.minor===d.minor&&f.semver.patch===d.patch&&(d=!1),f.operator==="<"||f.operator==="<="){if(c=vv(i,f,n),c===f&&c!==i)return!1}else if(i.operator==="<="&&!f.test(i.semver))return!1}if(!f.operator&&(i||s)&&o!==0)return!1}return!(s&&l&&!i&&o!==0||i&&u&&!s&&o!==0||p||d)},wv=(t,e,n)=>{if(!t)return e;let r=ep(t.semver,e.semver,n);return r>0?t:r<0||e.operator===">"&&t.operator===">="?e:t},vv=(t,e,n)=>{if(!t)return e;let r=ep(t.semver,e.semver,n);return r<0?t:r>0||e.operator==="<"&&t.operator==="<="?e:t};kv.exports=RD});var ur=E((R4,Tv)=>{"use strict";var tp=ps(),Sv=ds(),PD=Me(),xv=Gd(),ID=yn(),OD=Kb(),DD=Yb(),MD=Qb(),ND=nw(),LD=sw(),GD=ow(),FD=cw(),jD=uw(),qD=rt(),UD=mw(),BD=hw(),VD=ec(),WD=vw(),zD=Ew(),HD=Di(),KD=tc(),JD=qd(),YD=Ud(),ZD=nc(),XD=rc(),QD=Bd(),eM=Pw(),tM=Ow(),nM=Mi(),rM=st(),sM=Li(),iM=Kw(),oM=Yw(),aM=Xw(),cM=tv(),lM=rv(),uM=oc(),dM=lv(),pM=dv(),fM=mv(),mM=hv(),gM=Ev();Tv.exports={parse:ID,valid:OD,clean:DD,inc:MD,diff:ND,major:LD,minor:GD,patch:FD,prerelease:jD,compare:qD,rcompare:UD,compareLoose:BD,compareBuild:VD,sort:WD,rsort:zD,gt:HD,lt:KD,eq:JD,neq:YD,gte:ZD,lte:XD,cmp:QD,coerce:eM,truncate:tM,Comparator:nM,Range:rM,satisfies:sM,toComparators:iM,maxSatisfying:oM,minSatisfying:aM,minVersion:cM,validRange:lM,outside:uM,gtr:dM,ltr:pM,intersects:fM,simplifyRange:mM,subset:gM,SemVer:PD,re:tp.re,src:tp.src,tokens:tp.t,SEMVER_SPEC_VERSION:Sv.SEMVER_SPEC_VERSION,RELEASE_TYPES:Sv.RELEASE_TYPES,compareIdentifiers:xv.compareIdentifiers,rcompareIdentifiers:xv.rcompareIdentifiers}});var nS={};Pl(nS,{TABLE:()=>R,decodeFieldSignature:()=>tS,decodeMethodSignature:()=>eS,readAssembly:()=>Pc});function HF(t){if(t.length<64||t.readUInt16LE(0)!==23117)return null;let e=t.readUInt32LE(60);if(e+24>t.length||t.readUInt32LE(e)!==17744)return null;let n=t.readUInt16LE(e+6),r=t.readUInt16LE(e+20),s=e+24;if(r===0)return null;let i=t.readUInt16LE(s),o=s+(i===523?112:96),a=[],c=s+r;for(let f=0;ft.length)break;a.push({virtualSize:t.readUInt32LE(m+8),virtualAddress:t.readUInt32LE(m+12),rawAddress:t.readUInt32LE(m+20)})}let l=t.readUInt32LE(o+112);if(l===0)return null;let u=JE(l,a);if(u===null||u+16>t.length)return null;let d=t.readUInt32LE(u+8),p=JE(d,a);return p===null?null:{offset:p,sections:a}}function JE(t,e){for(let n of e)if(t>=n.virtualAddress&&tt.length||t.readUInt32LE(e)!==1112167234)return null;let n=t.readUInt32LE(e+12),r=e+16+n+2,s=t.readUInt16LE(r);r+=2;let i=new Map;for(let c=0;c"||h.startsWith("<"))continue;let y=lj(r,s,l,f),w=QE(r,m[3]),S=[],b=[];for(let k of ZE(m[4],f,s,4,i.length)){let _=i[k];if(!YE(_[0]))continue;let G=r.string(_[1]);G.startsWith("<")||(S.push(G),b.push(`${G}: ${tS(r,r.blob(_[2]))}`))}for(let k of ZE(m[5],f,s,5,o.length)){let _=o[k];if(!YE(_[2]))continue;let G=r.string(_[3]);G.startsWith("<")||/^(get_|set_|add_|remove_)/.test(G)||(S.push(G),b.push(`${G}${eS(r,r.blob(_[4]))}`))}for(let k of u.get(f+1)??[]){let _=r.string(a[k][1]);_.startsWith("<")||(S.push(_),b.push(`${_} { get; set; }`))}for(let k of d.get(f+1)??[]){let _=r.string(c[k][1]);_.startsWith("<")||(S.push(_),b.push(`event ${_}`))}p.push({fullName:y,kind:cj(g,w),members:[...new Set(S)],signatures:[...new Set(b)]})}return p}function cj(t,e){return t&nj?"interface":e==="System.Enum"?"enum":e==="System.ValueType"?"struct":e==="System.MulticastDelegate"||e==="System.Delegate"?"delegate":"class"}function lj(t,e,n,r){let s=[],i=r;for(let o=0;o<16;o++){let a=e[i];if(!a)break;s.unshift(t.string(a[1]));let c=n.get(i+1);if(c===void 0){let l=t.string(a[2]);return l?`${l}.${s.join("+")}`:s.join("+")}i=c-1}return s.join("+")}function QE(t,e){let n=e&3,r=e>>2;if(r===0)return null;if(n===0){let s=t.table(R.TypeDef)[r-1];if(!s)return null;let i=t.string(s[2]),o=t.string(s[1]);return i?`${i}.${o}`:o}if(n===1){let s=t.table(R.TypeRef)[r-1];if(!s)return null;let i=t.string(s[2]),o=t.string(s[1]);return i?`${i}.${o}`:o}return null}function ZE(t,e,n,r,s){let i=n[e+1]?.[r]??s+1,o=[];for(let a=t;a`}let i=Dt(e,n);n+=i.width;let o=wt(t,e,n);n=o.offset;let a=[];for(let c=0;c=e.length);c++){let l=wt(t,e,n);n=l.offset,a.push(l.text)}return`${s}(${a.join(", ")}): ${o.text}`}function tS(t,e){return e.length<2?"?":wt(t,e,1).text}function wt(t,e,n){let r=n,s=e[r++];if(s===void 0)return{text:"?",offset:r};let i=uj[s];if(i)return{text:i,offset:r};switch(s){case 15:{let o=wt(t,e,r);return{text:`${o.text}*`,offset:o.offset}}case 16:{let o=wt(t,e,r);return{text:`ref ${o.text}`,offset:o.offset}}case 29:{let o=wt(t,e,r);return{text:`${o.text}[]`,offset:o.offset}}case 69:{let o=wt(t,e,r);return{text:o.text,offset:o.offset}}case 17:case 18:{let o=Dt(e,r);return r+=o.width,{text:QE(t,o.value)??"object",offset:r}}case 19:case 30:{let o=Dt(e,r);return r+=o.width,{text:`${s===19?"T":"M"}${o.value}`,offset:r}}case 21:{let o=wt(t,e,r);r=o.offset;let a=Dt(e,r);r+=a.width;let c=[];for(let l=0;l`,offset:r}}case 20:{let o=wt(t,e,r);r=o.offset;let a=Dt(e,r);r+=a.width;for(let c of["sizes","lowBounds"]){let l=Dt(e,r);r+=l.width;for(let u=0;u{"use strict";ye={type:"u16"},ue={type:"u32"},be={type:"string"},Op={type:"guid"},je={type:"blob"},de=t=>({type:"rid",table:t}),Ce=t=>({type:"coded",family:t}),R={Module:0,TypeRef:1,TypeDef:2,Field:4,MethodDef:6,Param:8,InterfaceImpl:9,MemberRef:10,Constant:11,CustomAttribute:12,FieldMarshal:13,DeclSecurity:14,ClassLayout:15,FieldLayout:16,StandAloneSig:17,EventMap:18,Event:20,PropertyMap:21,Property:23,MethodSemantics:24,MethodImpl:25,ModuleRef:26,TypeSpec:27,ImplMap:28,FieldRVA:29,Assembly:32,AssemblyRef:35,File:38,ExportedType:39,ManifestResource:40,NestedClass:41,GenericParam:42,MethodSpec:43,GenericParamConstraint:44},JF={TypeDefOrRef:[R.TypeDef,R.TypeRef,R.TypeSpec],HasConstant:[R.Field,R.Param,R.Property],HasCustomAttribute:[R.MethodDef,R.Field,R.TypeRef,R.TypeDef,R.Param,R.InterfaceImpl,R.MemberRef,R.Module,R.DeclSecurity,R.Property,R.Event,R.StandAloneSig,R.ModuleRef,R.TypeSpec,R.Assembly,R.AssemblyRef,R.File,R.ExportedType,R.ManifestResource,R.GenericParam,R.GenericParamConstraint,R.MethodSpec],HasFieldMarshal:[R.Field,R.Param],HasDeclSecurity:[R.TypeDef,R.MethodDef,R.Assembly],MemberRefParent:[R.TypeDef,R.TypeRef,R.ModuleRef,R.MethodDef,R.TypeSpec],HasSemantics:[R.Event,R.Property],MethodDefOrRef:[R.MethodDef,R.MemberRef],MemberForwarded:[R.Field,R.MethodDef],Implementation:[R.File,R.AssemblyRef,R.ExportedType],CustomAttributeType:[null,null,R.MethodDef,R.MemberRef,null],ResolutionScope:[R.Module,R.ModuleRef,R.AssemblyRef,R.TypeRef],TypeOrMethodDef:[R.TypeDef,R.MethodDef]},YF={0:[ye,be,Op,Op,Op],1:[Ce("ResolutionScope"),be,be],2:[ue,be,be,Ce("TypeDefOrRef"),de(R.Field),de(R.MethodDef)],3:[de(R.Field)],4:[ye,be,je],5:[de(R.MethodDef)],6:[ue,ye,ye,be,je,de(R.Param)],7:[de(R.Param)],8:[ye,ye,be],9:[de(R.TypeDef),Ce("TypeDefOrRef")],10:[Ce("MemberRefParent"),be,je],11:[ye,Ce("HasConstant"),je],12:[Ce("HasCustomAttribute"),Ce("CustomAttributeType"),je],13:[Ce("HasFieldMarshal"),je],14:[ye,Ce("HasDeclSecurity"),je],15:[ye,ue,de(R.TypeDef)],16:[ue,de(R.Field)],17:[je],18:[de(R.TypeDef),de(R.Event)],19:[de(R.Event)],20:[ye,be,Ce("TypeDefOrRef")],21:[de(R.TypeDef),de(R.Property)],22:[de(R.Property)],23:[ye,be,je],24:[ye,de(R.MethodDef),Ce("HasSemantics")],25:[de(R.TypeDef),Ce("MethodDefOrRef"),Ce("MethodDefOrRef")],26:[be],27:[je],28:[ye,Ce("MemberForwarded"),be,de(R.ModuleRef)],29:[ue,de(R.Field)],30:[ue,ue],31:[ue],32:[ue,ye,ye,ye,ye,ue,je,be,be],33:[ue],34:[ue,ue,ue],35:[ye,ye,ye,ye,ue,je,be,be,je],36:[ue,de(R.AssemblyRef)],37:[ue,ue,ue,de(R.AssemblyRef)],38:[ue,be,je],39:[ue,ue,be,be,Ce("Implementation")],40:[ue,ue,be,Ce("Implementation")],41:[de(R.TypeDef),de(R.TypeDef)],42:[ye,ye,Ce("TypeOrMethodDef"),be],43:[Ce("MethodDefOrRef"),je],44:[de(R.GenericParam),Ce("TypeDefOrRef")]},Dp=class{constructor(e,n,r){this.strings=e;this.blobs=n;let s=r.readUInt8(6),i=r.readBigUInt64LE(8),o=new Map,a=24;for(let u=0;u<64;u++)i>>BigInt(u)&1n&&(o.set(u,r.readUInt32LE(a)),a+=4);let c={string:s&1?4:2,guid:s&2?4:2,blob:s&4?4:2},l=u=>{switch(u.type){case"u16":return 2;case"u32":return 4;case"string":return c.string;case"guid":return c.guid;case"blob":return c.blob;case"rid":return(o.get(u.table)??0)<65536?2:4;case"coded":{let d=JF[u.family],p=Math.ceil(Math.log2(d.length));return Math.max(...d.map(m=>m===null?0:o.get(m)??0))<1<<16-p?2:4}}};for(let[u,d]of o){let p=YF[u];if(!p)break;let f=p.map(l),m=f.reduce((h,y)=>h+y,0),g=[];for(let h=0;hr.length);h++){let y=[],w=a;for(let S of f)y.push(S===2?r.readUInt16LE(w):r.readUInt32LE(w)),w+=S;g.push(y),a+=m}this.rows.set(u,g)}}strings;blobs;rows=new Map;table(e){return this.rows.get(e)??[]}string(e){if(e>=this.strings.length)return"";let n=e;for(;n=this.blobs.length)return Buffer.alloc(0);let{value:n,width:r}=Dt(this.blobs,e);return this.blobs.subarray(e+r,e+r+n)}};ZF=7,XF=1,QF=2,ej=4,tj=7,nj=32,rj=7,sj=4,ij=6,oj=5;uj={1:"void",2:"bool",3:"char",4:"sbyte",5:"byte",6:"short",7:"ushort",8:"int",9:"uint",10:"long",11:"ulong",12:"float",13:"double",14:"string",22:"TypedReference",24:"IntPtr",25:"UIntPtr",28:"object"}});function I(t,e,n,r,s){if(r==="m")throw new TypeError("Private method is not writable");if(r==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n}function v(t,e,n,r){if(n==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!r:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?r:n==="a"?r.call(t):r?r.value:e.get(t)}var Wt=W(()=>{});var Gp,MS=W(()=>{Gp=function(){let{crypto:t}=globalThis;if(t?.randomUUID)return Gp=t.randomUUID.bind(t),t.randomUUID();let e=new Uint8Array(1),n=t?()=>t.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,r=>(+r^n()&15>>+r/4).toString(16))}});function zt(t){return typeof t=="object"&&t!==null&&("name"in t&&t.name==="AbortError"||"message"in t&&String(t.message).includes("FetchRequestCanceledException"))}var to,$s=W(()=>{to=t=>{if(t instanceof Error)return t;if(typeof t=="object"&&t!==null){try{if(Object.prototype.toString.call(t)==="[object Error]"){let e=new Error(t.message,t.cause?{cause:t.cause}:{});return t.stack&&(e.stack=t.stack),t.cause&&!e.cause&&(e.cause=t.cause),t.name&&(e.name=t.name),e}}catch{}try{return new Error(JSON.stringify(t))}catch{}}return new Error(t)}});var q,Ae,Pe,Ht,kr,Er,Sr,xr,Tr,_r,$r,Rr,Cr,vt=W(()=>{$s();q=class extends Error{},Ae=class t extends q{constructor(e,n,r,s){super(`${t.makeMessage(e,n,r)}`),this.status=e,this.headers=s,this.requestID=s?.get("request-id"),this.error=n}static makeMessage(e,n,r){let s=n?.message?typeof n.message=="string"?n.message:JSON.stringify(n.message):n?JSON.stringify(n):r;return e&&s?`${e} ${s}`:e?`${e} status code (no body)`:s||"(no status code or body)"}static generate(e,n,r,s){if(!e||!s)return new Ht({message:r,cause:to(n)});let i=n;return e===400?new Er(e,i,r,s):e===401?new Sr(e,i,r,s):e===403?new xr(e,i,r,s):e===404?new Tr(e,i,r,s):e===409?new _r(e,i,r,s):e===422?new $r(e,i,r,s):e===429?new Rr(e,i,r,s):e>=500?new Cr(e,i,r,s):new t(e,i,r,s)}},Pe=class extends Ae{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},Ht=class extends Ae{constructor({message:e,cause:n}){super(void 0,void 0,e||"Connection error.",void 0),n&&(this.cause=n)}},kr=class extends Ht{constructor({message:e}={}){super({message:e??"Request timed out."})}},Er=class extends Ae{},Sr=class extends Ae{},xr=class extends Ae{},Tr=class extends Ae{},_r=class extends Ae{},$r=class extends Ae{},Rr=class extends Ae{},Cr=class extends Ae{}});function Nc(t){return typeof t!="object"?{}:t??{}}function LS(t){if(!t)return!0;for(let e in t)return!1;return!0}function GS(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var Fj,NS,Fp,jp,FS,Lc,Ar=W(()=>{vt();Fj=/^[a-z][a-z0-9+.-]*:/i,NS=t=>Fj.test(t),Fp=t=>(Fp=Array.isArray,Fp(t)),jp=Fp;FS=(t,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new q(`${t} must be an integer`);if(e<0)throw new q(`${t} must be a positive integer`);return e},Lc=t=>{try{return JSON.parse(t)}catch{return}}});var jS,qS=W(()=>{jS=t=>new Promise(e=>setTimeout(e,t))});var $n,qp=W(()=>{$n="0.68.0"});function jj(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}function Uj(){if(typeof navigator>"u"||!navigator)return null;let t=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:e,pattern:n}of t){let r=n.exec(navigator.userAgent);if(r){let s=r[1]||0,i=r[2]||0,o=r[3]||0;return{browser:e,version:`${s}.${i}.${o}`}}}return null}var WS,qj,US,BS,VS,zS,Up=W(()=>{qp();WS=()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u";qj=()=>{let t=jj();if(t==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$n,"X-Stainless-OS":BS(Deno.build.os),"X-Stainless-Arch":US(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(t==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$n,"X-Stainless-OS":BS(globalThis.process.platform??"unknown"),"X-Stainless-Arch":US(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=Uj();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${e.browser}`,"X-Stainless-Runtime-Version":e.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":$n,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};US=t=>t==="x32"?"x32":t==="x86_64"||t==="x64"?"x64":t==="arm"?"arm":t==="aarch64"||t==="arm64"?"arm64":t?`other:${t}`:"unknown",BS=t=>(t=t.toLowerCase(),t.includes("ios")?"iOS":t==="android"?"Android":t==="darwin"?"MacOS":t==="win32"?"Windows":t==="freebsd"?"FreeBSD":t==="openbsd"?"OpenBSD":t==="linux"?"Linux":t?`Other:${t}`:"Unknown"),zS=()=>VS??(VS=qj())});function HS(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function Bp(...t){let e=globalThis.ReadableStream;if(typeof e>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new e(...t)}function Gc(t){let e=Symbol.asyncIterator in t?t[Symbol.asyncIterator]():t[Symbol.iterator]();return Bp({start(){},async pull(n){let{done:r,value:s}=await e.next();r?n.close():n.enqueue(s)},async cancel(){await e.return?.()}})}function no(t){if(t[Symbol.asyncIterator])return t;let e=t.getReader();return{async next(){try{let n=await e.read();return n?.done&&e.releaseLock(),n}catch(n){throw e.releaseLock(),n}},async return(){let n=e.cancel();return e.releaseLock(),await n,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function KS(t){if(t===null||typeof t!="object")return;if(t[Symbol.asyncIterator]){await t[Symbol.asyncIterator]().return?.();return}let e=t.getReader(),n=e.cancel();e.releaseLock(),await n}var Rs=W(()=>{});var JS,YS=W(()=>{JS=({headers:t,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)})});function QS(t){let e=0;for(let s of t)e+=s.length;let n=new Uint8Array(e),r=0;for(let s of t)n.set(s,r),r+=s.length;return n}function ro(t){let e;return(ZS??(e=new globalThis.TextEncoder,ZS=e.encode.bind(e)))(t)}function Vp(t){let e;return(XS??(e=new globalThis.TextDecoder,XS=e.decode.bind(e)))(t)}var ZS,XS,Wp=W(()=>{});function Wj(t,e){for(let s=e??0;s{Wt();Wp();Kt=class{constructor(){Je.set(this,void 0),Ye.set(this,void 0),I(this,Je,new Uint8Array,"f"),I(this,Ye,null,"f")}decode(e){if(e==null)return[];let n=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?ro(e):e;I(this,Je,QS([v(this,Je,"f"),n]),"f");let r=[],s;for(;(s=Wj(v(this,Je,"f"),v(this,Ye,"f")))!=null;){if(s.carriage&&v(this,Ye,"f")==null){I(this,Ye,s.index,"f");continue}if(v(this,Ye,"f")!=null&&(s.index!==v(this,Ye,"f")+1||s.carriage)){r.push(Vp(v(this,Je,"f").subarray(0,v(this,Ye,"f")-1))),I(this,Je,v(this,Je,"f").subarray(v(this,Ye,"f")),"f"),I(this,Ye,null,"f");continue}let i=v(this,Ye,"f")!==null?s.preceding-1:s.preceding,o=Vp(v(this,Je,"f").subarray(0,i));r.push(o),I(this,Je,v(this,Je,"f").subarray(s.index),"f"),I(this,Ye,null,"f")}return r}flush(){return v(this,Je,"f").length?this.decode(` +`):[]}};Je=new WeakMap,Ye=new WeakMap;Kt.NEWLINE_CHARS=new Set([` +`,"\r"]);Kt.NEWLINE_REGEXP=/\r\n|[\n\r]/g});function so(){}function Fc(t,e,n){return!e||jc[t]>jc[n]?so:e[t].bind(e)}function Ie(t){let e=t.logger,n=t.logLevel??"off";if(!e)return zj;let r=tx.get(e);if(r&&r[0]===n)return r[1];let s={error:Fc("error",e,n),warn:Fc("warn",e,n),info:Fc("info",e,n),debug:Fc("debug",e,n)};return tx.set(e,[n,s]),s}var jc,Hp,zj,tx,Jt,qc=W(()=>{Ar();jc={off:0,error:200,warn:300,info:400,debug:500},Hp=(t,e,n)=>{if(t){if(GS(jc,t))return t;Ie(n).warn(`${e} was set to ${JSON.stringify(t)}, expected one of ${JSON.stringify(Object.keys(jc))}`)}};zj={error:so,warn:so,info:so,debug:so},tx=new WeakMap;Jt=t=>(t.options&&(t.options={...t.options},delete t.options.headers),t.headers&&(t.headers=Object.fromEntries((t.headers instanceof Headers?[...t.headers]:Object.entries(t.headers)).map(([e,n])=>[e,e.toLowerCase()==="x-api-key"||e.toLowerCase()==="authorization"||e.toLowerCase()==="cookie"||e.toLowerCase()==="set-cookie"?"***":n]))),"retryOfRequestLogID"in t&&(t.retryOfRequestLogID&&(t.retryOf=t.retryOfRequestLogID),delete t.retryOfRequestLogID),t)});async function*Hj(t,e){if(!t.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new q("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new q("Attempted to iterate over a response with no body");let n=new Kp,r=new Kt,s=no(t.body);for await(let i of Kj(s))for(let o of r.decode(i)){let a=n.decode(o);a&&(yield a)}for(let i of r.flush()){let o=n.decode(i);o&&(yield o)}}async function*Kj(t){let e=new Uint8Array;for await(let n of t){if(n==null)continue;let r=n instanceof ArrayBuffer?new Uint8Array(n):typeof n=="string"?ro(n):n,s=new Uint8Array(e.length+r.length);s.set(e),s.set(r,e.length),e=s;let i;for(;(i=ex(e))!==-1;)yield e.slice(0,i),e=e.slice(i)}e.length>0&&(yield e)}function Jj(t,e){let n=t.indexOf(e);return n!==-1?[t.substring(0,n),e,t.substring(n+e.length)]:[t,"",""]}var io,Mt,Kp,Jp=W(()=>{Wt();vt();Rs();zp();Rs();$s();Ar();Wp();qc();vt();Mt=class t{constructor(e,n,r){this.iterator=e,io.set(this,void 0),this.controller=n,I(this,io,r,"f")}static fromSSEResponse(e,n,r){let s=!1,i=r?Ie(r):console;async function*o(){if(s)throw new q("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let a=!1;try{for await(let c of Hj(e,n)){if(c.event==="completion")try{yield JSON.parse(c.data)}catch(l){throw i.error("Could not parse message into JSON:",c.data),i.error("From chunk:",c.raw),l}if(c.event==="message_start"||c.event==="message_delta"||c.event==="message_stop"||c.event==="content_block_start"||c.event==="content_block_delta"||c.event==="content_block_stop")try{yield JSON.parse(c.data)}catch(l){throw i.error("Could not parse message into JSON:",c.data),i.error("From chunk:",c.raw),l}if(c.event!=="ping"&&c.event==="error")throw new Ae(void 0,Lc(c.data)??c.data,void 0,e.headers)}a=!0}catch(c){if(zt(c))return;throw c}finally{a||n.abort()}}return new t(o,n,r)}static fromReadableStream(e,n,r){let s=!1;async function*i(){let a=new Kt,c=no(e);for await(let l of c)for(let u of a.decode(l))yield u;for(let l of a.flush())yield l}async function*o(){if(s)throw new q("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");s=!0;let a=!1;try{for await(let c of i())a||c&&(yield JSON.parse(c));a=!0}catch(c){if(zt(c))return;throw c}finally{a||n.abort()}}return new t(o,n,r)}[(io=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let e=[],n=[],r=this.iterator(),s=i=>({next:()=>{if(i.length===0){let o=r.next();e.push(o),n.push(o)}return i.shift()}});return[new t(()=>s(e),this.controller,v(this,io,"f")),new t(()=>s(n),this.controller,v(this,io,"f"))]}toReadableStream(){let e=this,n;return Bp({async start(){n=e[Symbol.asyncIterator]()},async pull(r){try{let{value:s,done:i}=await n.next();if(i)return r.close();let o=ro(JSON.stringify(s)+` +`);r.enqueue(o)}catch(s){r.error(s)}},async cancel(){await n.return?.()}})}};Kp=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;let i={event:this.event,data:this.data.join(` +`),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],i}if(this.chunks.push(e),e.startsWith(":"))return null;let[n,r,s]=Jj(e,":");return s.startsWith(" ")&&(s=s.substring(1)),n==="event"?this.event=s:n==="data"&&this.data.push(s),null}}});async function Uc(t,e){let{response:n,requestLogID:r,retryOfRequestLogID:s,startTime:i}=e,o=await(async()=>{if(e.options.stream)return Ie(t).debug("response",n.status,n.url,n.headers,n.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(n,e.controller):Mt.fromSSEResponse(n,e.controller);if(n.status===204)return null;if(e.options.__binaryResponse)return n;let c=n.headers.get("content-type")?.split(";")[0]?.trim();if(c?.includes("application/json")||c?.endsWith("+json")){let d=await n.json();return Yp(d,n)}return await n.text()})();return Ie(t).debug(`[${r}] response parsed`,Jt({retryOfRequestLogID:s,url:n.url,status:n.status,body:o,durationMs:Date.now()-i})),o}function Yp(t,e){return!t||typeof t!="object"||Array.isArray(t)?t:Object.defineProperty(t,"_request_id",{value:e.headers.get("request-id"),enumerable:!1})}var Zp=W(()=>{Jp();qc()});var oo,Rn,Bc=W(()=>{Wt();Zp();Rn=class t extends Promise{constructor(e,n,r=Uc){super(s=>{s(null)}),this.responsePromise=n,this.parseResponse=r,oo.set(this,void 0),I(this,oo,e,"f")}_thenUnwrap(e){return new t(v(this,oo,"f"),this.responsePromise,async(n,r)=>Yp(e(await this.parseResponse(n,r),r),r.response))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,n]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:n,request_id:n.headers.get("request-id")}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(v(this,oo,"f"),e))),this.parsedPromise}then(e,n){return this.parse().then(e,n)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};oo=new WeakMap});var Vc,Wc,Cs,at,As,Nt=W(()=>{Wt();vt();Zp();Bc();Ar();Wc=class{constructor(e,n,r,s){Vc.set(this,void 0),I(this,Vc,e,"f"),this.options=s,this.response=n,this.body=r}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new q("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await v(this,Vc,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Vc=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let n of e.getPaginatedItems())yield n}},Cs=class extends Rn{constructor(e,n,r){super(e,n,async(s,i)=>new r(s,i.response,await Uc(s,i),i.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let n of e)yield n}},at=class extends Wc{constructor(e,n,r,s){super(e,n,r,s),this.data=r.data||[],this.has_more=r.has_more||!1,this.first_id=r.first_id||null,this.last_id=r.last_id||null}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){if(this.options.query?.before_id){let n=this.first_id;return n?{...this.options,query:{...Nc(this.options.query),before_id:n}}:null}let e=this.last_id;return e?{...this.options,query:{...Nc(this.options.query),after_id:e}}:null}},As=class extends Wc{constructor(e,n,r,s){super(e,n,r,s),this.data=r.data||[],this.has_more=r.has_more||!1,this.next_page=r.next_page||null}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.next_page;return e?{...this.options,query:{...Nc(this.options.query),page:e}}:null}}});function Pr(t,e,n){return Qp(),new File(t,e??"unknown_file",n)}function ao(t){return(typeof t=="object"&&t!==null&&("name"in t&&t.name&&String(t.name)||"url"in t&&t.url&&String(t.url)||"filename"in t&&t.filename&&String(t.filename)||"path"in t&&t.path&&String(t.path))||"").split(/[\\/]/).pop()||void 0}function Zj(t){let e=typeof t=="function"?t:t.fetch,n=nx.get(e);if(n)return n;let r=(async()=>{try{let s="Response"in e?e.Response:(await e("data:,")).constructor,i=new FormData;return i.toString()!==await new s(i).text()}catch{return!0}})();return nx.set(e,r),r}var Qp,ef,Ps,nx,Xj,Qj,Xp,Is=W(()=>{Rs();Qp=()=>{if(typeof File>"u"){let{process:t}=globalThis,e=typeof t?.versions?.node=="string"&&parseInt(t.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(e?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};ef=t=>t!=null&&typeof t=="object"&&typeof t[Symbol.asyncIterator]=="function",Ps=async(t,e)=>({...t,body:await Xj(t.body,e)}),nx=new WeakMap;Xj=async(t,e)=>{if(!await Zj(e))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let n=new FormData;return await Promise.all(Object.entries(t||{}).map(([r,s])=>Xp(n,r,s))),n},Qj=t=>t instanceof Blob&&"name"in t,Xp=async(t,e,n)=>{if(n!==void 0){if(n==null)throw new TypeError(`Received null for "${e}"; to pass null in FormData, you must use the string 'null'`);if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")t.append(e,String(n));else if(n instanceof Response){let r={},s=n.headers.get("Content-Type");s&&(r={type:s}),t.append(e,Pr([await n.blob()],ao(n),r))}else if(ef(n))t.append(e,Pr([await new Response(Gc(n)).blob()],ao(n)));else if(Qj(n))t.append(e,Pr([n],ao(n),{type:n.type}));else if(Array.isArray(n))await Promise.all(n.map(r=>Xp(t,e+"[]",r)));else if(typeof n=="object")await Promise.all(Object.entries(n).map(([r,s])=>Xp(t,`${e}[${r}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${n} instead`)}}});async function co(t,e,n){if(Qp(),t=await t,e||(e=ao(t)),eq(t))return t instanceof File&&e==null&&n==null?t:Pr([await t.arrayBuffer()],e??t.name,{type:t.type,lastModified:t.lastModified,...n});if(tq(t)){let s=await t.blob();return e||(e=new URL(t.url).pathname.split(/[\\/]/).pop()),Pr(await tf(s),e,n)}let r=await tf(t);if(!n?.type){let s=r.find(i=>typeof i=="object"&&"type"in i&&i.type);typeof s=="string"&&(n={...n,type:s})}return Pr(r,e,n)}async function tf(t){let e=[];if(typeof t=="string"||ArrayBuffer.isView(t)||t instanceof ArrayBuffer)e.push(t);else if(rx(t))e.push(t instanceof Blob?t:await t.arrayBuffer());else if(ef(t))for await(let n of t)e.push(...await tf(n));else{let n=t?.constructor?.name;throw new Error(`Unexpected data type: ${typeof t}${n?`; constructor: ${n}`:""}${nq(t)}`)}return e}function nq(t){return typeof t!="object"||t===null?"":`; props: [${Object.getOwnPropertyNames(t).map(n=>`"${n}"`).join(", ")}]`}var rx,eq,tq,sx=W(()=>{Is();Is();rx=t=>t!=null&&typeof t=="object"&&typeof t.size=="number"&&typeof t.type=="string"&&typeof t.text=="function"&&typeof t.slice=="function"&&typeof t.arrayBuffer=="function",eq=t=>t!=null&&typeof t=="object"&&typeof t.name=="string"&&typeof t.lastModified=="number"&&rx(t),tq=t=>t!=null&&typeof t=="object"&&typeof t.url=="string"&&typeof t.blob=="function"});var nf=W(()=>{sx()});var ix=W(()=>{});var pe,ct=W(()=>{pe=class{constructor(e){this._client=e}}});function*sq(t){if(!t)return;if(ox in t){let{values:r,nulls:s}=t;yield*r.entries();for(let i of s)yield[i,null];return}let e=!1,n;t instanceof Headers?n=t.entries():jp(t)?n=t:(e=!0,n=Object.entries(t??{}));for(let r of n){let s=r[0];if(typeof s!="string")throw new TypeError("expected header name to be a string");let i=jp(r[1])?r[1]:[r[1]],o=!1;for(let a of i)a!==void 0&&(e&&!o&&(o=!0,yield[s,null]),yield[s,a])}}var ox,J,lt=W(()=>{Ar();ox=Symbol.for("brand.privateNullableHeaders");J=t=>{let e=new Headers,n=new Set;for(let r of t){let s=new Set;for(let[i,o]of sq(r)){let a=i.toLowerCase();s.has(a)||(e.delete(i),s.add(a)),o===null?(e.delete(i),n.add(a)):(e.append(i,o),n.delete(a))}}return{[ox]:!0,values:e,nulls:n}}});function cx(t){return t.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var ax,iq,fe,Cn=W(()=>{vt();ax=Object.freeze(Object.create(null)),iq=(t=cx)=>function(n,...r){if(n.length===1)return n[0];let s=!1,i=[],o=n.reduce((u,d,p)=>{/[?#]/.test(d)&&(s=!0);let f=r[p],m=(s?encodeURIComponent:t)(""+f);return p!==r.length&&(f==null||typeof f=="object"&&f.toString===Object.getPrototypeOf(Object.getPrototypeOf(f.hasOwnProperty??ax)??ax)?.toString)&&(m=f+"",i.push({start:u.length+d.length,length:m.length,error:`Value of type ${Object.prototype.toString.call(f).slice(8,-1)} is not a valid path parameter`})),u+d+(p===r.length?"":m)},""),a=o.split(/[?#]/,1)[0],c=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,l;for(;(l=c.exec(a))!==null;)i.push({start:l.index,length:l[0].length,error:`Value "${l[0]}" can't be safely passed as a path parameter`});if(i.sort((u,d)=>u.start-d.start),i.length>0){let u=0,d=i.reduce((p,f)=>{let m=" ".repeat(f.start-u),g="^".repeat(f.length);return u=f.start+f.length,p+m+g},"");throw new q(`Path parameters result in path with invalid segments: ${i.map(p=>p.error).join(` `)} ${o} -${d}`)}return o},de=bF(IS)});var xs,Ip=B(()=>{it();It();ot();Ts();xn();xs=class extends ue{list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/files",st,{query:s,...n,headers:W([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(de`/v1/files/${e}`,{...r,headers:W([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString()},r?.headers])})}download(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/files/${e}/content`,{...r,headers:W([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString(),Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}retrieveMetadata(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/files/${e}`,{...r,headers:W([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString()},r?.headers])})}upload(e,n){let{betas:r,...s}=e;return this._client.post("/v1/files",_s({body:s,...n,headers:W([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},n?.headers])},this._client))}}});var $s,Dp=B(()=>{it();It();ot();xn();$s=class extends ue{retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/models/${e}?beta=true`,{...r,headers:W([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/models?beta=true",st,{query:s,...n,headers:W([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers])})}}});var Rs,Mp=B(()=>{gt();ks();Ep();Rs=class t{constructor(e,n){this.iterator=e,this.controller=n}async*decoder(){let e=new zt;for await(let n of this.iterator)for(let r of e.decode(n))yield JSON.parse(r);for(let n of e.flush())yield JSON.parse(n)}[Symbol.asyncIterator](){return this.decoder()}static fromResponse(e,n){if(!e.body)throw n.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new j("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new j("Attempted to iterate over a response with no body");return new t(Yi(e.body),n)}}});var ro=B(()=>{gt()});var As,Np=B(()=>{it();It();ot();Mp();ro();xn();As=class extends ue{create(e,n){let{betas:r,...s}=e;return this._client.post("/v1/messages/batches?beta=true",{body:s,...n,headers:W([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},n?.headers])})}retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/messages/batches/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/messages/batches?beta=true",st,{query:s,...n,headers:W([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(de`/v1/messages/batches/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}cancel(e,n={},r){let{betas:s}=n??{};return this._client.post(de`/v1/messages/batches/${e}/cancel?beta=true`,{...r,headers:W([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}async results(e,n={},r){let s=await this.retrieve(e);if(!s.results_url)throw new j(`No batch \`results_url\`; Has it finished processing? ${s.processing_status} - ${s.id}`);let{betas:i}=n??{};return this._client.get(s.results_url,{...r,headers:W([{"anthropic-beta":[...i??[],"message-batches-2024-09-24"].toString(),Accept:"application/binary"},r?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((o,a)=>Rs.fromResponse(a.response,a.controller))}}});var Lp=B(()=>{Tp()});var EF,Cs,SF,_F,Cc,Gp=B(()=>{EF=t=>{let e=0,n=[];for(;e{if(t.length===0)return t;let e=t[t.length-1];switch(e.type){case"separator":return t=t.slice(0,t.length-1),Cs(t);break;case"number":let n=e.value[e.value.length-1];if(n==="."||n==="-")return t=t.slice(0,t.length-1),Cs(t);case"string":let r=t[t.length-2];if(r?.type==="delimiter")return t=t.slice(0,t.length-1),Cs(t);if(r?.type==="brace"&&r.value==="{")return t=t.slice(0,t.length-1),Cs(t);break;case"delimiter":return t=t.slice(0,t.length-1),Cs(t);break}return t},SF=t=>{let e=[];return t.map(n=>{n.type==="brace"&&(n.value==="{"?e.push("}"):e.splice(e.lastIndexOf("}"),1)),n.type==="paren"&&(n.value==="["?e.push("]"):e.splice(e.lastIndexOf("]"),1))}),e.length>0&&e.reverse().map(n=>{n==="}"?t.push({type:"brace",value:"}"}):n==="]"&&t.push({type:"paren",value:"]"})}),t},_F=t=>{let e="";return t.map(n=>{n.type==="string"?e+='"'+n.value+'"':e+=n.value}),e},Cc=t=>JSON.parse(_F(SF(Cs(EF(t)))))});function LS(t){return t.type==="tool_use"||t.type==="server_tool_use"||t.type==="mcp_tool_use"}var at,$n,so,Pc,io,oo,Oc,ao,Kt,co,Ic,Dc,Ps,Mc,Nc,jp,DS,Lc,Fp,qp,Up,MS,NS,Gc,GS=B(()=>{Bt();vs();ro();Lp();Gp();NS="__json_buf";Gc=class t{constructor(){at.add(this),this.messages=[],this.receivedMessages=[],$n.set(this,void 0),this.controller=new AbortController,so.set(this,void 0),Pc.set(this,()=>{}),io.set(this,()=>{}),oo.set(this,void 0),Oc.set(this,()=>{}),ao.set(this,()=>{}),Kt.set(this,{}),co.set(this,!1),Ic.set(this,!1),Dc.set(this,!1),Ps.set(this,!1),Mc.set(this,void 0),Nc.set(this,void 0),Lc.set(this,e=>{if(P(this,Ic,!0,"f"),Vt(e)&&(e=new xe),e instanceof xe)return P(this,Dc,!0,"f"),this._emit("abort",e);if(e instanceof j)return this._emit("error",e);if(e instanceof Error){let n=new j(e.message);return n.cause=e,this._emit("error",n)}return this._emit("error",new j(String(e)))}),P(this,so,new Promise((e,n)=>{P(this,Pc,e,"f"),P(this,io,n,"f")}),"f"),P(this,oo,new Promise((e,n)=>{P(this,Oc,e,"f"),P(this,ao,n,"f")}),"f"),b(this,so,"f").catch(()=>{}),b(this,oo,"f").catch(()=>{})}get response(){return b(this,Mc,"f")}get request_id(){return b(this,Nc,"f")}async withResponse(){let e=await b(this,so,"f");if(!e)throw new Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let n=new t;return n._run(()=>n._fromReadableStream(e)),n}static createMessage(e,n,r){let s=new t;for(let i of n.messages)s._addMessageParam(i);return s._run(()=>s._createMessage(e,{...n,stream:!0},{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},b(this,Lc,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,n=!0){this.receivedMessages.push(e),n&&this._emit("message",e)}async _createMessage(e,n,r){let s=r?.signal,i;s&&(s.aborted&&this.controller.abort(),i=this.controller.abort.bind(this.controller),s.addEventListener("abort",i));try{b(this,at,"m",Fp).call(this);let{response:o,data:a}=await e.create({...n,stream:!0},{...r,signal:this.controller.signal}).withResponse();this._connected(o);for await(let c of a)b(this,at,"m",qp).call(this,c);if(a.controller.signal?.aborted)throw new xe;b(this,at,"m",Up).call(this)}finally{s&&i&&s.removeEventListener("abort",i)}}_connected(e){this.ended||(P(this,Mc,e,"f"),P(this,Nc,e?.headers.get("request-id"),"f"),b(this,Pc,"f").call(this,e),this._emit("connect"))}get ended(){return b(this,co,"f")}get errored(){return b(this,Ic,"f")}get aborted(){return b(this,Dc,"f")}abort(){this.controller.abort()}on(e,n){return(b(this,Kt,"f")[e]||(b(this,Kt,"f")[e]=[])).push({listener:n}),this}off(e,n){let r=b(this,Kt,"f")[e];if(!r)return this;let s=r.findIndex(i=>i.listener===n);return s>=0&&r.splice(s,1),this}once(e,n){return(b(this,Kt,"f")[e]||(b(this,Kt,"f")[e]=[])).push({listener:n,once:!0}),this}emitted(e){return new Promise((n,r)=>{P(this,Ps,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,n)})}async done(){P(this,Ps,!0,"f"),await b(this,oo,"f")}get currentMessage(){return b(this,$n,"f")}async finalMessage(){return await this.done(),b(this,at,"m",jp).call(this)}async finalText(){return await this.done(),b(this,at,"m",DS).call(this)}_emit(e,...n){if(b(this,co,"f"))return;e==="end"&&(P(this,co,!0,"f"),b(this,Oc,"f").call(this));let r=b(this,Kt,"f")[e];if(r&&(b(this,Kt,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...n))),e==="abort"){let s=n[0];!b(this,Ps,"f")&&!r?.length&&Promise.reject(s),b(this,io,"f").call(this,s),b(this,ao,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=n[0];!b(this,Ps,"f")&&!r?.length&&Promise.reject(s),b(this,io,"f").call(this,s),b(this,ao,"f").call(this,s),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",b(this,at,"m",jp).call(this))}async _fromReadableStream(e,n){let r=n?.signal,s;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{b(this,at,"m",Fp).call(this),this._connected(null);let i=Ot.fromReadableStream(e,this.controller);for await(let o of i)b(this,at,"m",qp).call(this,o);if(i.controller.signal?.aborted)throw new xe;b(this,at,"m",Up).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[($n=new WeakMap,so=new WeakMap,Pc=new WeakMap,io=new WeakMap,oo=new WeakMap,Oc=new WeakMap,ao=new WeakMap,Kt=new WeakMap,co=new WeakMap,Ic=new WeakMap,Dc=new WeakMap,Ps=new WeakMap,Mc=new WeakMap,Nc=new WeakMap,Lc=new WeakMap,at=new WeakSet,jp=function(){if(this.receivedMessages.length===0)throw new j("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},DS=function(){if(this.receivedMessages.length===0)throw new j("stream ended without producing a Message with role=assistant");let n=this.receivedMessages.at(-1).content.filter(r=>r.type==="text").map(r=>r.text);if(n.length===0)throw new j("stream ended without producing a content block with type=text");return n.join(" ")},Fp=function(){this.ended||P(this,$n,void 0,"f")},qp=function(n){if(this.ended)return;let r=b(this,at,"m",MS).call(this,n);switch(this._emit("streamEvent",n,r),n.type){case"content_block_delta":{let s=r.content.at(-1);switch(n.delta.type){case"text_delta":{s.type==="text"&&this._emit("text",n.delta.text,s.text||"");break}case"citations_delta":{s.type==="text"&&this._emit("citation",n.delta.citation,s.citations??[]);break}case"input_json_delta":{LS(s)&&s.input&&this._emit("inputJson",n.delta.partial_json,s.input);break}case"thinking_delta":{s.type==="thinking"&&this._emit("thinking",n.delta.thinking,s.thinking);break}case"signature_delta":{s.type==="thinking"&&this._emit("signature",s.signature);break}default:n.delta}break}case"message_stop":{this._addMessageParam(r),this._addMessage(r,!0);break}case"content_block_stop":{this._emit("contentBlock",r.content.at(-1));break}case"message_start":{P(this,$n,r,"f");break}case"content_block_start":case"message_delta":break}},Up=function(){if(this.ended)throw new j("stream has ended, this shouldn't happen");let n=b(this,$n,"f");if(!n)throw new j("request ended without sending any chunks");return P(this,$n,void 0,"f"),n},MS=function(n){let r=b(this,$n,"f");if(n.type==="message_start"){if(r)throw new j(`Unexpected event order, got ${n.type} before receiving "message_stop"`);return n.message}if(!r)throw new j(`Unexpected event order, got ${n.type} before "message_start"`);switch(n.type){case"message_stop":return r;case"message_delta":return r.container=n.delta.container,r.stop_reason=n.delta.stop_reason,r.stop_sequence=n.delta.stop_sequence,r.usage.output_tokens=n.usage.output_tokens,r.context_management=n.context_management,n.usage.input_tokens!=null&&(r.usage.input_tokens=n.usage.input_tokens),n.usage.cache_creation_input_tokens!=null&&(r.usage.cache_creation_input_tokens=n.usage.cache_creation_input_tokens),n.usage.cache_read_input_tokens!=null&&(r.usage.cache_read_input_tokens=n.usage.cache_read_input_tokens),n.usage.server_tool_use!=null&&(r.usage.server_tool_use=n.usage.server_tool_use),r;case"content_block_start":return r.content.push(n.content_block),r;case"content_block_delta":{let s=r.content.at(n.index);switch(n.delta.type){case"text_delta":{s?.type==="text"&&(r.content[n.index]={...s,text:(s.text||"")+n.delta.text});break}case"citations_delta":{s?.type==="text"&&(r.content[n.index]={...s,citations:[...s.citations??[],n.delta.citation]});break}case"input_json_delta":{if(s&&LS(s)){let i=s[NS]||"";i+=n.delta.partial_json;let o={...s};if(Object.defineProperty(o,NS,{value:i,enumerable:!1,writable:!0}),i)try{o.input=Cc(i)}catch(a){let c=new j(`Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${a}. JSON: ${i}`);b(this,Lc,"f").call(this,c)}r.content[n.index]=o}break}case"thinking_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,thinking:s.thinking+n.delta.thinking});break}case"signature_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,signature:n.delta.signature});break}default:n.delta}return r}case"content_block_stop":return r}},Symbol.asyncIterator)](){let e=[],n=[],r=!1;return this.on("streamEvent",s=>{let i=n.shift();i?i.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of n)s.resolve(void 0);n.length=0}),this.on("abort",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),this.on("error",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((i,o)=>n.push({resolve:i,reject:o})).then(i=>i?{value:i,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new Ot(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}});var jc,Bp=B(()=>{jc={"claude-opus-4-20250514":8192,"claude-opus-4-0":8192,"claude-4-opus-20250514":8192,"anthropic.claude-opus-4-20250514-v1:0":8192,"claude-opus-4@20250514":8192,"claude-opus-4-1-20250805":8192,"anthropic.claude-opus-4-1-20250805-v1:0":8192,"claude-opus-4-1@20250805":8192}});function jS(){let t,e;return{promise:new Promise((r,s)=>{t=r,e=s}),resolve:t,reject:e}}async function TF(t,e=t.messages.at(-1)){if(!e||e.role!=="assistant"||!e.content||typeof e.content=="string")return null;let n=e.content.filter(s=>s.type==="tool_use");return n.length===0?null:{role:"user",content:await Promise.all(n.map(async s=>{let i=t.tools.find(o=>o.name===s.name);if(!i||!("run"in i))return{type:"tool_result",tool_use_id:s.id,content:`Error: Tool '${s.name}' not found`,is_error:!0};try{let o=s.input;"parse"in i&&i.parse&&(o=i.parse(o));let a=await i.run(o);return{type:"tool_result",tool_use_id:s.id,content:a}}catch(o){return{type:"tool_result",tool_use_id:s.id,content:`Error: ${o instanceof Error?o.message:String(o)}`,is_error:!0}}}))}}var Fc,Os,$r,Ve,lo,ht,Jt,Rn,uo,Vp,Is,Wp=B(()=>{Bt();gt();ot();Is=class{constructor(e,n,r){Fc.add(this),this.client=e,Os.set(this,!1),$r.set(this,!1),Ve.set(this,void 0),lo.set(this,void 0),ht.set(this,void 0),Jt.set(this,void 0),Rn.set(this,void 0),uo.set(this,0),P(this,Ve,{params:{...n,messages:structuredClone(n.messages)}},"f"),P(this,lo,{...r,headers:W([{"x-stainless-helper":"BetaToolRunner"},r?.headers])},"f"),P(this,Rn,jS(),"f")}async*[(Os=new WeakMap,$r=new WeakMap,Ve=new WeakMap,lo=new WeakMap,ht=new WeakMap,Jt=new WeakMap,Rn=new WeakMap,uo=new WeakMap,Fc=new WeakSet,Symbol.asyncIterator)](){var e;if(b(this,Os,"f"))throw new j("Cannot iterate over a consumed stream");P(this,Os,!0,"f"),P(this,$r,!0,"f"),P(this,Jt,void 0,"f");try{for(;;){let n;try{if(b(this,Ve,"f").params.max_iterations&&b(this,uo,"f")>=b(this,Ve,"f").params.max_iterations)break;P(this,$r,!1,"f"),P(this,ht,void 0,"f"),P(this,Jt,void 0,"f"),P(this,uo,(e=b(this,uo,"f"),e++,e),"f");let{max_iterations:r,...s}=b(this,Ve,"f").params;if(s.stream?(n=this.client.beta.messages.stream({...s},b(this,lo,"f")),P(this,ht,n.finalMessage(),"f"),b(this,ht,"f").catch(()=>{}),yield n):(P(this,ht,this.client.beta.messages.create({...s,stream:!1},b(this,lo,"f")),"f"),yield b(this,ht,"f")),!b(this,$r,"f")){let{role:o,content:a}=await b(this,ht,"f");b(this,Ve,"f").params.messages.push({role:o,content:a})}let i=await b(this,Fc,"m",Vp).call(this,b(this,Ve,"f").params.messages.at(-1));if(i&&b(this,Ve,"f").params.messages.push(i),!i&&!b(this,$r,"f"))break}finally{n&&n.abort()}}if(!b(this,ht,"f"))throw new j("ToolRunner concluded without a message from the server");b(this,Rn,"f").resolve(await b(this,ht,"f"))}catch(n){throw P(this,Os,!1,"f"),b(this,Rn,"f").promise.catch(()=>{}),b(this,Rn,"f").reject(n),P(this,Rn,jS(),"f"),n}}setMessagesParams(e){typeof e=="function"?b(this,Ve,"f").params=e(b(this,Ve,"f").params):b(this,Ve,"f").params=e,P(this,$r,!0,"f"),P(this,Jt,void 0,"f")}async generateToolResponse(){let e=await b(this,ht,"f")??this.params.messages.at(-1);return e?b(this,Fc,"m",Vp).call(this,e):null}done(){return b(this,Rn,"f").promise}async runUntilDone(){if(!b(this,Os,"f"))for await(let e of this);return this.done()}get params(){return b(this,Ve,"f").params}pushMessages(...e){this.setMessagesParams(n=>({...n,messages:[...n.messages,...e]}))}then(e,n){return this.runUntilDone().then(e,n)}};Vp=async function(e){return b(this,Jt,"f")!==void 0?b(this,Jt,"f"):(P(this,Jt,TF(b(this,Ve,"f").params,e),"f"),b(this,Jt,"f"))}});var FS,An,zp=B(()=>{it();Np();Np();ot();GS();Bp();Wp();Wp();FS={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026"},An=class extends ue{constructor(){super(...arguments),this.batches=new As(this._client)}create(e,n){let{betas:r,...s}=e;s.model in FS&&console.warn(`The model '${s.model}' is deprecated and will reach end-of-life on ${FS[s.model]} -Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`);let i=this._client._options.timeout;if(!s.stream&&i==null){let o=jc[s.model]??void 0;i=this._client.calculateNonstreamingTimeout(s.max_tokens,o)}return this._client.post("/v1/messages?beta=true",{body:s,timeout:i??6e5,...n,headers:W([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers]),stream:e.stream??!1})}stream(e,n){return Gc.createMessage(this,e,n)}countTokens(e,n){let{betas:r,...s}=e;return this._client.post("/v1/messages/count_tokens?beta=true",{body:s,...n,headers:W([{"anthropic-beta":[...r??[],"token-counting-2024-11-01"].toString()},n?.headers])})}toolRunner(e,n){return new Is(this._client,e,n)}};An.Batches=As;An.BetaToolRunner=Is});var Ds,Hp=B(()=>{it();It();ot();Ts();xn();Ds=class extends ue{create(e,n={},r){let{betas:s,...i}=n??{};return this._client.post(de`/v1/skills/${e}/versions?beta=true`,_s({body:i,...r,headers:W([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])},this._client))}retrieve(e,n,r){let{skill_id:s,betas:i}=n;return this._client.get(de`/v1/skills/${s}/versions/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...i??[],"skills-2025-10-02"].toString()},r?.headers])})}list(e,n={},r){let{betas:s,...i}=n??{};return this._client.getAPIList(de`/v1/skills/${e}/versions?beta=true`,Ss,{query:i,...r,headers:W([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}delete(e,n,r){let{skill_id:s,betas:i}=n;return this._client.delete(de`/v1/skills/${s}/versions/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...i??[],"skills-2025-10-02"].toString()},r?.headers])})}}});var Rr,Kp=B(()=>{it();Hp();Hp();It();ot();Ts();xn();Rr=class extends ue{constructor(){super(...arguments),this.versions=new Ds(this._client)}create(e={},n){let{betas:r,...s}=e??{};return this._client.post("/v1/skills?beta=true",_s({body:s,...n,headers:W([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},n?.headers])},this._client))}retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/skills/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/skills?beta=true",Ss,{query:s,...n,headers:W([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(de`/v1/skills/${e}?beta=true`,{...r,headers:W([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}};Rr.Versions=Ds});var yt,Jp=B(()=>{it();Ip();Ip();Dp();Dp();zp();zp();Kp();Kp();yt=class extends ue{constructor(){super(...arguments),this.models=new $s(this._client),this.messages=new An(this._client),this.files=new xs(this._client),this.skills=new Rr(this._client)}};yt.Models=$s;yt.Messages=An;yt.Files=xs;yt.Skills=Rr});var Ar,Yp=B(()=>{it();ot();Ar=class extends ue{create(e,n){let{betas:r,...s}=e;return this._client.post("/v1/complete",{body:s,timeout:this._client._options.timeout??6e5,...n,headers:W([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers]),stream:e.stream??!1})}}});function VS(t){return t.type==="tool_use"||t.type==="server_tool_use"}var ct,Cn,po,qc,fo,mo,Uc,go,Yt,ho,Bc,Vc,Ms,Wc,zc,Zp,qS,Xp,Qp,ef,tf,US,BS,Hc,WS=B(()=>{Bt();vs();ro();Lp();Gp();BS="__json_buf";Hc=class t{constructor(){ct.add(this),this.messages=[],this.receivedMessages=[],Cn.set(this,void 0),this.controller=new AbortController,po.set(this,void 0),qc.set(this,()=>{}),fo.set(this,()=>{}),mo.set(this,void 0),Uc.set(this,()=>{}),go.set(this,()=>{}),Yt.set(this,{}),ho.set(this,!1),Bc.set(this,!1),Vc.set(this,!1),Ms.set(this,!1),Wc.set(this,void 0),zc.set(this,void 0),Xp.set(this,e=>{if(P(this,Bc,!0,"f"),Vt(e)&&(e=new xe),e instanceof xe)return P(this,Vc,!0,"f"),this._emit("abort",e);if(e instanceof j)return this._emit("error",e);if(e instanceof Error){let n=new j(e.message);return n.cause=e,this._emit("error",n)}return this._emit("error",new j(String(e)))}),P(this,po,new Promise((e,n)=>{P(this,qc,e,"f"),P(this,fo,n,"f")}),"f"),P(this,mo,new Promise((e,n)=>{P(this,Uc,e,"f"),P(this,go,n,"f")}),"f"),b(this,po,"f").catch(()=>{}),b(this,mo,"f").catch(()=>{})}get response(){return b(this,Wc,"f")}get request_id(){return b(this,zc,"f")}async withResponse(){let e=await b(this,po,"f");if(!e)throw new Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let n=new t;return n._run(()=>n._fromReadableStream(e)),n}static createMessage(e,n,r){let s=new t;for(let i of n.messages)s._addMessageParam(i);return s._run(()=>s._createMessage(e,{...n,stream:!0},{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},b(this,Xp,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,n=!0){this.receivedMessages.push(e),n&&this._emit("message",e)}async _createMessage(e,n,r){let s=r?.signal,i;s&&(s.aborted&&this.controller.abort(),i=this.controller.abort.bind(this.controller),s.addEventListener("abort",i));try{b(this,ct,"m",Qp).call(this);let{response:o,data:a}=await e.create({...n,stream:!0},{...r,signal:this.controller.signal}).withResponse();this._connected(o);for await(let c of a)b(this,ct,"m",ef).call(this,c);if(a.controller.signal?.aborted)throw new xe;b(this,ct,"m",tf).call(this)}finally{s&&i&&s.removeEventListener("abort",i)}}_connected(e){this.ended||(P(this,Wc,e,"f"),P(this,zc,e?.headers.get("request-id"),"f"),b(this,qc,"f").call(this,e),this._emit("connect"))}get ended(){return b(this,ho,"f")}get errored(){return b(this,Bc,"f")}get aborted(){return b(this,Vc,"f")}abort(){this.controller.abort()}on(e,n){return(b(this,Yt,"f")[e]||(b(this,Yt,"f")[e]=[])).push({listener:n}),this}off(e,n){let r=b(this,Yt,"f")[e];if(!r)return this;let s=r.findIndex(i=>i.listener===n);return s>=0&&r.splice(s,1),this}once(e,n){return(b(this,Yt,"f")[e]||(b(this,Yt,"f")[e]=[])).push({listener:n,once:!0}),this}emitted(e){return new Promise((n,r)=>{P(this,Ms,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,n)})}async done(){P(this,Ms,!0,"f"),await b(this,mo,"f")}get currentMessage(){return b(this,Cn,"f")}async finalMessage(){return await this.done(),b(this,ct,"m",Zp).call(this)}async finalText(){return await this.done(),b(this,ct,"m",qS).call(this)}_emit(e,...n){if(b(this,ho,"f"))return;e==="end"&&(P(this,ho,!0,"f"),b(this,Uc,"f").call(this));let r=b(this,Yt,"f")[e];if(r&&(b(this,Yt,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...n))),e==="abort"){let s=n[0];!b(this,Ms,"f")&&!r?.length&&Promise.reject(s),b(this,fo,"f").call(this,s),b(this,go,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=n[0];!b(this,Ms,"f")&&!r?.length&&Promise.reject(s),b(this,fo,"f").call(this,s),b(this,go,"f").call(this,s),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",b(this,ct,"m",Zp).call(this))}async _fromReadableStream(e,n){let r=n?.signal,s;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{b(this,ct,"m",Qp).call(this),this._connected(null);let i=Ot.fromReadableStream(e,this.controller);for await(let o of i)b(this,ct,"m",ef).call(this,o);if(i.controller.signal?.aborted)throw new xe;b(this,ct,"m",tf).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[(Cn=new WeakMap,po=new WeakMap,qc=new WeakMap,fo=new WeakMap,mo=new WeakMap,Uc=new WeakMap,go=new WeakMap,Yt=new WeakMap,ho=new WeakMap,Bc=new WeakMap,Vc=new WeakMap,Ms=new WeakMap,Wc=new WeakMap,zc=new WeakMap,Xp=new WeakMap,ct=new WeakSet,Zp=function(){if(this.receivedMessages.length===0)throw new j("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},qS=function(){if(this.receivedMessages.length===0)throw new j("stream ended without producing a Message with role=assistant");let n=this.receivedMessages.at(-1).content.filter(r=>r.type==="text").map(r=>r.text);if(n.length===0)throw new j("stream ended without producing a content block with type=text");return n.join(" ")},Qp=function(){this.ended||P(this,Cn,void 0,"f")},ef=function(n){if(this.ended)return;let r=b(this,ct,"m",US).call(this,n);switch(this._emit("streamEvent",n,r),n.type){case"content_block_delta":{let s=r.content.at(-1);switch(n.delta.type){case"text_delta":{s.type==="text"&&this._emit("text",n.delta.text,s.text||"");break}case"citations_delta":{s.type==="text"&&this._emit("citation",n.delta.citation,s.citations??[]);break}case"input_json_delta":{VS(s)&&s.input&&this._emit("inputJson",n.delta.partial_json,s.input);break}case"thinking_delta":{s.type==="thinking"&&this._emit("thinking",n.delta.thinking,s.thinking);break}case"signature_delta":{s.type==="thinking"&&this._emit("signature",s.signature);break}default:n.delta}break}case"message_stop":{this._addMessageParam(r),this._addMessage(r,!0);break}case"content_block_stop":{this._emit("contentBlock",r.content.at(-1));break}case"message_start":{P(this,Cn,r,"f");break}case"content_block_start":case"message_delta":break}},tf=function(){if(this.ended)throw new j("stream has ended, this shouldn't happen");let n=b(this,Cn,"f");if(!n)throw new j("request ended without sending any chunks");return P(this,Cn,void 0,"f"),n},US=function(n){let r=b(this,Cn,"f");if(n.type==="message_start"){if(r)throw new j(`Unexpected event order, got ${n.type} before receiving "message_stop"`);return n.message}if(!r)throw new j(`Unexpected event order, got ${n.type} before "message_start"`);switch(n.type){case"message_stop":return r;case"message_delta":return r.stop_reason=n.delta.stop_reason,r.stop_sequence=n.delta.stop_sequence,r.usage.output_tokens=n.usage.output_tokens,n.usage.input_tokens!=null&&(r.usage.input_tokens=n.usage.input_tokens),n.usage.cache_creation_input_tokens!=null&&(r.usage.cache_creation_input_tokens=n.usage.cache_creation_input_tokens),n.usage.cache_read_input_tokens!=null&&(r.usage.cache_read_input_tokens=n.usage.cache_read_input_tokens),n.usage.server_tool_use!=null&&(r.usage.server_tool_use=n.usage.server_tool_use),r;case"content_block_start":return r.content.push({...n.content_block}),r;case"content_block_delta":{let s=r.content.at(n.index);switch(n.delta.type){case"text_delta":{s?.type==="text"&&(r.content[n.index]={...s,text:(s.text||"")+n.delta.text});break}case"citations_delta":{s?.type==="text"&&(r.content[n.index]={...s,citations:[...s.citations??[],n.delta.citation]});break}case"input_json_delta":{if(s&&VS(s)){let i=s[BS]||"";i+=n.delta.partial_json;let o={...s};Object.defineProperty(o,BS,{value:i,enumerable:!1,writable:!0}),i&&(o.input=Cc(i)),r.content[n.index]=o}break}case"thinking_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,thinking:s.thinking+n.delta.thinking});break}case"signature_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,signature:n.delta.signature});break}default:n.delta}return r}case"content_block_stop":return r}},Symbol.asyncIterator)](){let e=[],n=[],r=!1;return this.on("streamEvent",s=>{let i=n.shift();i?i.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of n)s.resolve(void 0);n.length=0}),this.on("abort",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),this.on("error",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((i,o)=>n.push({resolve:i,reject:o})).then(i=>i?{value:i,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new Ot(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}});var Ns,nf=B(()=>{it();It();ot();Mp();ro();xn();Ns=class extends ue{create(e,n){return this._client.post("/v1/messages/batches",{body:e,...n})}retrieve(e,n){return this._client.get(de`/v1/messages/batches/${e}`,n)}list(e={},n){return this._client.getAPIList("/v1/messages/batches",st,{query:e,...n})}delete(e,n){return this._client.delete(de`/v1/messages/batches/${e}`,n)}cancel(e,n){return this._client.post(de`/v1/messages/batches/${e}/cancel`,n)}async results(e,n){let r=await this.retrieve(e);if(!r.results_url)throw new j(`No batch \`results_url\`; Has it finished processing? ${r.processing_status} - ${r.id}`);return this._client.get(r.results_url,{...n,headers:W([{Accept:"application/binary"},n?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((s,i)=>Rs.fromResponse(i.response,i.controller))}}});var Pn,zS,rf=B(()=>{it();WS();nf();nf();Bp();Pn=class extends ue{constructor(){super(...arguments),this.batches=new Ns(this._client)}create(e,n){e.model in zS&&console.warn(`The model '${e.model}' is deprecated and will reach end-of-life on ${zS[e.model]} -Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`);let r=this._client._options.timeout;if(!e.stream&&r==null){let s=jc[e.model]??void 0;r=this._client.calculateNonstreamingTimeout(e.max_tokens,s)}return this._client.post("/v1/messages",{body:e,timeout:r??6e5,...n,stream:e.stream??!1})}stream(e,n){return Hc.createMessage(this,e,n)}countTokens(e,n){return this._client.post("/v1/messages/count_tokens",{body:e,...n})}},zS={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026"};Pn.Batches=Ns});var Cr,sf=B(()=>{it();It();ot();xn();Cr=class extends ue{retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(de`/v1/models/${e}`,{...r,headers:W([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/models",st,{query:s,...n,headers:W([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers])})}}});var HS=B(()=>{CS();Jp();Yp();rf();sf()});var yo,KS=B(()=>{yo=t=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[t]?.trim()??void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(t)?.trim()}});var of,af,Kc,JS,cf,lf,pe,Zt,uf=B(()=>{Bt();oS();Tr();pS();vs();bp();ks();kS();yp();gt();It();Op();HS();$c();Yp();sf();Jp();rf();bp();ot();KS();Tc();Tr();cf="\\n\\nHuman:",lf="\\n\\nAssistant:",pe=class{constructor({baseURL:e=yo("ANTHROPIC_BASE_URL"),apiKey:n=yo("ANTHROPIC_API_KEY")??null,authToken:r=yo("ANTHROPIC_AUTH_TOKEN")??null,...s}={}){of.add(this),Kc.set(this,void 0);let i={apiKey:n,authToken:r,...s,baseURL:e||"https://api.anthropic.com"};if(!i.dangerouslyAllowBrowser&&hS())throw new j(`It looks like you're running in a browser-like environment. +${d}`)}return o},fe=iq(cx)});var Os,rf=W(()=>{ct();Nt();lt();Is();Cn();Os=class extends pe{list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/files",at,{query:s,...n,headers:J([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(fe`/v1/files/${e}`,{...r,headers:J([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString()},r?.headers])})}download(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/files/${e}/content`,{...r,headers:J([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString(),Accept:"application/binary"},r?.headers]),__binaryResponse:!0})}retrieveMetadata(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/files/${e}`,{...r,headers:J([{"anthropic-beta":[...s??[],"files-api-2025-04-14"].toString()},r?.headers])})}upload(e,n){let{betas:r,...s}=e;return this._client.post("/v1/files",Ps({body:s,...n,headers:J([{"anthropic-beta":[...r??[],"files-api-2025-04-14"].toString()},n?.headers])},this._client))}}});var Ds,sf=W(()=>{ct();Nt();lt();Cn();Ds=class extends pe{retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/models/${e}?beta=true`,{...r,headers:J([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/models?beta=true",at,{query:s,...n,headers:J([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers])})}}});var Ms,of=W(()=>{vt();Rs();zp();Ms=class t{constructor(e,n){this.iterator=e,this.controller=n}async*decoder(){let e=new Kt;for await(let n of this.iterator)for(let r of e.decode(n))yield JSON.parse(r);for(let n of e.flush())yield JSON.parse(n)}[Symbol.asyncIterator](){return this.decoder()}static fromResponse(e,n){if(!e.body)throw n.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new q("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new q("Attempted to iterate over a response with no body");return new t(no(e.body),n)}}});var lo=W(()=>{vt()});var Ns,af=W(()=>{ct();Nt();lt();of();lo();Cn();Ns=class extends pe{create(e,n){let{betas:r,...s}=e;return this._client.post("/v1/messages/batches?beta=true",{body:s,...n,headers:J([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},n?.headers])})}retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/messages/batches/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/messages/batches?beta=true",at,{query:s,...n,headers:J([{"anthropic-beta":[...r??[],"message-batches-2024-09-24"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(fe`/v1/messages/batches/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}cancel(e,n={},r){let{betas:s}=n??{};return this._client.post(fe`/v1/messages/batches/${e}/cancel?beta=true`,{...r,headers:J([{"anthropic-beta":[...s??[],"message-batches-2024-09-24"].toString()},r?.headers])})}async results(e,n={},r){let s=await this.retrieve(e);if(!s.results_url)throw new q(`No batch \`results_url\`; Has it finished processing? ${s.processing_status} - ${s.id}`);let{betas:i}=n??{};return this._client.get(s.results_url,{...r,headers:J([{"anthropic-beta":[...i??[],"message-batches-2024-09-24"].toString(),Accept:"application/binary"},r?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((o,a)=>Ms.fromResponse(a.response,a.controller))}}});var cf=W(()=>{Jp()});var lq,Ls,uq,dq,zc,lf=W(()=>{lq=t=>{let e=0,n=[];for(;e{if(t.length===0)return t;let e=t[t.length-1];switch(e.type){case"separator":return t=t.slice(0,t.length-1),Ls(t);break;case"number":let n=e.value[e.value.length-1];if(n==="."||n==="-")return t=t.slice(0,t.length-1),Ls(t);case"string":let r=t[t.length-2];if(r?.type==="delimiter")return t=t.slice(0,t.length-1),Ls(t);if(r?.type==="brace"&&r.value==="{")return t=t.slice(0,t.length-1),Ls(t);break;case"delimiter":return t=t.slice(0,t.length-1),Ls(t);break}return t},uq=t=>{let e=[];return t.map(n=>{n.type==="brace"&&(n.value==="{"?e.push("}"):e.splice(e.lastIndexOf("}"),1)),n.type==="paren"&&(n.value==="["?e.push("]"):e.splice(e.lastIndexOf("]"),1))}),e.length>0&&e.reverse().map(n=>{n==="}"?t.push({type:"brace",value:"}"}):n==="]"&&t.push({type:"paren",value:"]"})}),t},dq=t=>{let e="";return t.map(n=>{n.type==="string"?e+='"'+n.value+'"':e+=n.value}),e},zc=t=>JSON.parse(dq(uq(Ls(lq(t)))))});function px(t){return t.type==="tool_use"||t.type==="server_tool_use"||t.type==="mcp_tool_use"}var ut,An,uo,Hc,po,fo,Kc,mo,Yt,go,Jc,Yc,Gs,Zc,Xc,uf,lx,Qc,df,pf,ff,ux,dx,el,fx=W(()=>{Wt();$s();lo();cf();lf();dx="__json_buf";el=class t{constructor(){ut.add(this),this.messages=[],this.receivedMessages=[],An.set(this,void 0),this.controller=new AbortController,uo.set(this,void 0),Hc.set(this,()=>{}),po.set(this,()=>{}),fo.set(this,void 0),Kc.set(this,()=>{}),mo.set(this,()=>{}),Yt.set(this,{}),go.set(this,!1),Jc.set(this,!1),Yc.set(this,!1),Gs.set(this,!1),Zc.set(this,void 0),Xc.set(this,void 0),Qc.set(this,e=>{if(I(this,Jc,!0,"f"),zt(e)&&(e=new Pe),e instanceof Pe)return I(this,Yc,!0,"f"),this._emit("abort",e);if(e instanceof q)return this._emit("error",e);if(e instanceof Error){let n=new q(e.message);return n.cause=e,this._emit("error",n)}return this._emit("error",new q(String(e)))}),I(this,uo,new Promise((e,n)=>{I(this,Hc,e,"f"),I(this,po,n,"f")}),"f"),I(this,fo,new Promise((e,n)=>{I(this,Kc,e,"f"),I(this,mo,n,"f")}),"f"),v(this,uo,"f").catch(()=>{}),v(this,fo,"f").catch(()=>{})}get response(){return v(this,Zc,"f")}get request_id(){return v(this,Xc,"f")}async withResponse(){let e=await v(this,uo,"f");if(!e)throw new Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let n=new t;return n._run(()=>n._fromReadableStream(e)),n}static createMessage(e,n,r){let s=new t;for(let i of n.messages)s._addMessageParam(i);return s._run(()=>s._createMessage(e,{...n,stream:!0},{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},v(this,Qc,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,n=!0){this.receivedMessages.push(e),n&&this._emit("message",e)}async _createMessage(e,n,r){let s=r?.signal,i;s&&(s.aborted&&this.controller.abort(),i=this.controller.abort.bind(this.controller),s.addEventListener("abort",i));try{v(this,ut,"m",df).call(this);let{response:o,data:a}=await e.create({...n,stream:!0},{...r,signal:this.controller.signal}).withResponse();this._connected(o);for await(let c of a)v(this,ut,"m",pf).call(this,c);if(a.controller.signal?.aborted)throw new Pe;v(this,ut,"m",ff).call(this)}finally{s&&i&&s.removeEventListener("abort",i)}}_connected(e){this.ended||(I(this,Zc,e,"f"),I(this,Xc,e?.headers.get("request-id"),"f"),v(this,Hc,"f").call(this,e),this._emit("connect"))}get ended(){return v(this,go,"f")}get errored(){return v(this,Jc,"f")}get aborted(){return v(this,Yc,"f")}abort(){this.controller.abort()}on(e,n){return(v(this,Yt,"f")[e]||(v(this,Yt,"f")[e]=[])).push({listener:n}),this}off(e,n){let r=v(this,Yt,"f")[e];if(!r)return this;let s=r.findIndex(i=>i.listener===n);return s>=0&&r.splice(s,1),this}once(e,n){return(v(this,Yt,"f")[e]||(v(this,Yt,"f")[e]=[])).push({listener:n,once:!0}),this}emitted(e){return new Promise((n,r)=>{I(this,Gs,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,n)})}async done(){I(this,Gs,!0,"f"),await v(this,fo,"f")}get currentMessage(){return v(this,An,"f")}async finalMessage(){return await this.done(),v(this,ut,"m",uf).call(this)}async finalText(){return await this.done(),v(this,ut,"m",lx).call(this)}_emit(e,...n){if(v(this,go,"f"))return;e==="end"&&(I(this,go,!0,"f"),v(this,Kc,"f").call(this));let r=v(this,Yt,"f")[e];if(r&&(v(this,Yt,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...n))),e==="abort"){let s=n[0];!v(this,Gs,"f")&&!r?.length&&Promise.reject(s),v(this,po,"f").call(this,s),v(this,mo,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=n[0];!v(this,Gs,"f")&&!r?.length&&Promise.reject(s),v(this,po,"f").call(this,s),v(this,mo,"f").call(this,s),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",v(this,ut,"m",uf).call(this))}async _fromReadableStream(e,n){let r=n?.signal,s;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{v(this,ut,"m",df).call(this),this._connected(null);let i=Mt.fromReadableStream(e,this.controller);for await(let o of i)v(this,ut,"m",pf).call(this,o);if(i.controller.signal?.aborted)throw new Pe;v(this,ut,"m",ff).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[(An=new WeakMap,uo=new WeakMap,Hc=new WeakMap,po=new WeakMap,fo=new WeakMap,Kc=new WeakMap,mo=new WeakMap,Yt=new WeakMap,go=new WeakMap,Jc=new WeakMap,Yc=new WeakMap,Gs=new WeakMap,Zc=new WeakMap,Xc=new WeakMap,Qc=new WeakMap,ut=new WeakSet,uf=function(){if(this.receivedMessages.length===0)throw new q("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},lx=function(){if(this.receivedMessages.length===0)throw new q("stream ended without producing a Message with role=assistant");let n=this.receivedMessages.at(-1).content.filter(r=>r.type==="text").map(r=>r.text);if(n.length===0)throw new q("stream ended without producing a content block with type=text");return n.join(" ")},df=function(){this.ended||I(this,An,void 0,"f")},pf=function(n){if(this.ended)return;let r=v(this,ut,"m",ux).call(this,n);switch(this._emit("streamEvent",n,r),n.type){case"content_block_delta":{let s=r.content.at(-1);switch(n.delta.type){case"text_delta":{s.type==="text"&&this._emit("text",n.delta.text,s.text||"");break}case"citations_delta":{s.type==="text"&&this._emit("citation",n.delta.citation,s.citations??[]);break}case"input_json_delta":{px(s)&&s.input&&this._emit("inputJson",n.delta.partial_json,s.input);break}case"thinking_delta":{s.type==="thinking"&&this._emit("thinking",n.delta.thinking,s.thinking);break}case"signature_delta":{s.type==="thinking"&&this._emit("signature",s.signature);break}default:n.delta}break}case"message_stop":{this._addMessageParam(r),this._addMessage(r,!0);break}case"content_block_stop":{this._emit("contentBlock",r.content.at(-1));break}case"message_start":{I(this,An,r,"f");break}case"content_block_start":case"message_delta":break}},ff=function(){if(this.ended)throw new q("stream has ended, this shouldn't happen");let n=v(this,An,"f");if(!n)throw new q("request ended without sending any chunks");return I(this,An,void 0,"f"),n},ux=function(n){let r=v(this,An,"f");if(n.type==="message_start"){if(r)throw new q(`Unexpected event order, got ${n.type} before receiving "message_stop"`);return n.message}if(!r)throw new q(`Unexpected event order, got ${n.type} before "message_start"`);switch(n.type){case"message_stop":return r;case"message_delta":return r.container=n.delta.container,r.stop_reason=n.delta.stop_reason,r.stop_sequence=n.delta.stop_sequence,r.usage.output_tokens=n.usage.output_tokens,r.context_management=n.context_management,n.usage.input_tokens!=null&&(r.usage.input_tokens=n.usage.input_tokens),n.usage.cache_creation_input_tokens!=null&&(r.usage.cache_creation_input_tokens=n.usage.cache_creation_input_tokens),n.usage.cache_read_input_tokens!=null&&(r.usage.cache_read_input_tokens=n.usage.cache_read_input_tokens),n.usage.server_tool_use!=null&&(r.usage.server_tool_use=n.usage.server_tool_use),r;case"content_block_start":return r.content.push(n.content_block),r;case"content_block_delta":{let s=r.content.at(n.index);switch(n.delta.type){case"text_delta":{s?.type==="text"&&(r.content[n.index]={...s,text:(s.text||"")+n.delta.text});break}case"citations_delta":{s?.type==="text"&&(r.content[n.index]={...s,citations:[...s.citations??[],n.delta.citation]});break}case"input_json_delta":{if(s&&px(s)){let i=s[dx]||"";i+=n.delta.partial_json;let o={...s};if(Object.defineProperty(o,dx,{value:i,enumerable:!1,writable:!0}),i)try{o.input=zc(i)}catch(a){let c=new q(`Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${a}. JSON: ${i}`);v(this,Qc,"f").call(this,c)}r.content[n.index]=o}break}case"thinking_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,thinking:s.thinking+n.delta.thinking});break}case"signature_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,signature:n.delta.signature});break}default:n.delta}return r}case"content_block_stop":return r}},Symbol.asyncIterator)](){let e=[],n=[],r=!1;return this.on("streamEvent",s=>{let i=n.shift();i?i.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of n)s.resolve(void 0);n.length=0}),this.on("abort",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),this.on("error",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((i,o)=>n.push({resolve:i,reject:o})).then(i=>i?{value:i,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new Mt(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}});var tl,mf=W(()=>{tl={"claude-opus-4-20250514":8192,"claude-opus-4-0":8192,"claude-4-opus-20250514":8192,"anthropic.claude-opus-4-20250514-v1:0":8192,"claude-opus-4@20250514":8192,"claude-opus-4-1-20250805":8192,"anthropic.claude-opus-4-1-20250805-v1:0":8192,"claude-opus-4-1@20250805":8192}});function mx(){let t,e;return{promise:new Promise((r,s)=>{t=r,e=s}),resolve:t,reject:e}}async function pq(t,e=t.messages.at(-1)){if(!e||e.role!=="assistant"||!e.content||typeof e.content=="string")return null;let n=e.content.filter(s=>s.type==="tool_use");return n.length===0?null:{role:"user",content:await Promise.all(n.map(async s=>{let i=t.tools.find(o=>o.name===s.name);if(!i||!("run"in i))return{type:"tool_result",tool_use_id:s.id,content:`Error: Tool '${s.name}' not found`,is_error:!0};try{let o=s.input;"parse"in i&&i.parse&&(o=i.parse(o));let a=await i.run(o);return{type:"tool_result",tool_use_id:s.id,content:a}}catch(o){return{type:"tool_result",tool_use_id:s.id,content:`Error: ${o instanceof Error?o.message:String(o)}`,is_error:!0}}}))}}var nl,Fs,Ir,ze,ho,kt,Zt,Pn,yo,gf,js,hf=W(()=>{Wt();vt();lt();js=class{constructor(e,n,r){nl.add(this),this.client=e,Fs.set(this,!1),Ir.set(this,!1),ze.set(this,void 0),ho.set(this,void 0),kt.set(this,void 0),Zt.set(this,void 0),Pn.set(this,void 0),yo.set(this,0),I(this,ze,{params:{...n,messages:structuredClone(n.messages)}},"f"),I(this,ho,{...r,headers:J([{"x-stainless-helper":"BetaToolRunner"},r?.headers])},"f"),I(this,Pn,mx(),"f")}async*[(Fs=new WeakMap,Ir=new WeakMap,ze=new WeakMap,ho=new WeakMap,kt=new WeakMap,Zt=new WeakMap,Pn=new WeakMap,yo=new WeakMap,nl=new WeakSet,Symbol.asyncIterator)](){var e;if(v(this,Fs,"f"))throw new q("Cannot iterate over a consumed stream");I(this,Fs,!0,"f"),I(this,Ir,!0,"f"),I(this,Zt,void 0,"f");try{for(;;){let n;try{if(v(this,ze,"f").params.max_iterations&&v(this,yo,"f")>=v(this,ze,"f").params.max_iterations)break;I(this,Ir,!1,"f"),I(this,kt,void 0,"f"),I(this,Zt,void 0,"f"),I(this,yo,(e=v(this,yo,"f"),e++,e),"f");let{max_iterations:r,...s}=v(this,ze,"f").params;if(s.stream?(n=this.client.beta.messages.stream({...s},v(this,ho,"f")),I(this,kt,n.finalMessage(),"f"),v(this,kt,"f").catch(()=>{}),yield n):(I(this,kt,this.client.beta.messages.create({...s,stream:!1},v(this,ho,"f")),"f"),yield v(this,kt,"f")),!v(this,Ir,"f")){let{role:o,content:a}=await v(this,kt,"f");v(this,ze,"f").params.messages.push({role:o,content:a})}let i=await v(this,nl,"m",gf).call(this,v(this,ze,"f").params.messages.at(-1));if(i&&v(this,ze,"f").params.messages.push(i),!i&&!v(this,Ir,"f"))break}finally{n&&n.abort()}}if(!v(this,kt,"f"))throw new q("ToolRunner concluded without a message from the server");v(this,Pn,"f").resolve(await v(this,kt,"f"))}catch(n){throw I(this,Fs,!1,"f"),v(this,Pn,"f").promise.catch(()=>{}),v(this,Pn,"f").reject(n),I(this,Pn,mx(),"f"),n}}setMessagesParams(e){typeof e=="function"?v(this,ze,"f").params=e(v(this,ze,"f").params):v(this,ze,"f").params=e,I(this,Ir,!0,"f"),I(this,Zt,void 0,"f")}async generateToolResponse(){let e=await v(this,kt,"f")??this.params.messages.at(-1);return e?v(this,nl,"m",gf).call(this,e):null}done(){return v(this,Pn,"f").promise}async runUntilDone(){if(!v(this,Fs,"f"))for await(let e of this);return this.done()}get params(){return v(this,ze,"f").params}pushMessages(...e){this.setMessagesParams(n=>({...n,messages:[...n.messages,...e]}))}then(e,n){return this.runUntilDone().then(e,n)}};gf=async function(e){return v(this,Zt,"f")!==void 0?v(this,Zt,"f"):(I(this,Zt,pq(v(this,ze,"f").params,e),"f"),v(this,Zt,"f"))}});var gx,In,yf=W(()=>{ct();af();af();lt();fx();mf();hf();hf();gx={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026"},In=class extends pe{constructor(){super(...arguments),this.batches=new Ns(this._client)}create(e,n){let{betas:r,...s}=e;s.model in gx&&console.warn(`The model '${s.model}' is deprecated and will reach end-of-life on ${gx[s.model]} +Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`);let i=this._client._options.timeout;if(!s.stream&&i==null){let o=tl[s.model]??void 0;i=this._client.calculateNonstreamingTimeout(s.max_tokens,o)}return this._client.post("/v1/messages?beta=true",{body:s,timeout:i??6e5,...n,headers:J([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers]),stream:e.stream??!1})}stream(e,n){return el.createMessage(this,e,n)}countTokens(e,n){let{betas:r,...s}=e;return this._client.post("/v1/messages/count_tokens?beta=true",{body:s,...n,headers:J([{"anthropic-beta":[...r??[],"token-counting-2024-11-01"].toString()},n?.headers])})}toolRunner(e,n){return new js(this._client,e,n)}};In.Batches=Ns;In.BetaToolRunner=js});var qs,bf=W(()=>{ct();Nt();lt();Is();Cn();qs=class extends pe{create(e,n={},r){let{betas:s,...i}=n??{};return this._client.post(fe`/v1/skills/${e}/versions?beta=true`,Ps({body:i,...r,headers:J([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])},this._client))}retrieve(e,n,r){let{skill_id:s,betas:i}=n;return this._client.get(fe`/v1/skills/${s}/versions/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...i??[],"skills-2025-10-02"].toString()},r?.headers])})}list(e,n={},r){let{betas:s,...i}=n??{};return this._client.getAPIList(fe`/v1/skills/${e}/versions?beta=true`,As,{query:i,...r,headers:J([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}delete(e,n,r){let{skill_id:s,betas:i}=n;return this._client.delete(fe`/v1/skills/${s}/versions/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...i??[],"skills-2025-10-02"].toString()},r?.headers])})}}});var Or,wf=W(()=>{ct();bf();bf();Nt();lt();Is();Cn();Or=class extends pe{constructor(){super(...arguments),this.versions=new qs(this._client)}create(e={},n){let{betas:r,...s}=e??{};return this._client.post("/v1/skills?beta=true",Ps({body:s,...n,headers:J([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},n?.headers])},this._client))}retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/skills/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/skills?beta=true",As,{query:s,...n,headers:J([{"anthropic-beta":[...r??[],"skills-2025-10-02"].toString()},n?.headers])})}delete(e,n={},r){let{betas:s}=n??{};return this._client.delete(fe`/v1/skills/${e}?beta=true`,{...r,headers:J([{"anthropic-beta":[...s??[],"skills-2025-10-02"].toString()},r?.headers])})}};Or.Versions=qs});var Et,vf=W(()=>{ct();rf();rf();sf();sf();yf();yf();wf();wf();Et=class extends pe{constructor(){super(...arguments),this.models=new Ds(this._client),this.messages=new In(this._client),this.files=new Os(this._client),this.skills=new Or(this._client)}};Et.Models=Ds;Et.Messages=In;Et.Files=Os;Et.Skills=Or});var Dr,kf=W(()=>{ct();lt();Dr=class extends pe{create(e,n){let{betas:r,...s}=e;return this._client.post("/v1/complete",{body:s,timeout:this._client._options.timeout??6e5,...n,headers:J([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers]),stream:e.stream??!1})}}});function wx(t){return t.type==="tool_use"||t.type==="server_tool_use"}var dt,On,bo,rl,wo,vo,sl,ko,Xt,Eo,il,ol,Us,al,cl,Ef,hx,Sf,xf,Tf,_f,yx,bx,ll,vx=W(()=>{Wt();$s();lo();cf();lf();bx="__json_buf";ll=class t{constructor(){dt.add(this),this.messages=[],this.receivedMessages=[],On.set(this,void 0),this.controller=new AbortController,bo.set(this,void 0),rl.set(this,()=>{}),wo.set(this,()=>{}),vo.set(this,void 0),sl.set(this,()=>{}),ko.set(this,()=>{}),Xt.set(this,{}),Eo.set(this,!1),il.set(this,!1),ol.set(this,!1),Us.set(this,!1),al.set(this,void 0),cl.set(this,void 0),Sf.set(this,e=>{if(I(this,il,!0,"f"),zt(e)&&(e=new Pe),e instanceof Pe)return I(this,ol,!0,"f"),this._emit("abort",e);if(e instanceof q)return this._emit("error",e);if(e instanceof Error){let n=new q(e.message);return n.cause=e,this._emit("error",n)}return this._emit("error",new q(String(e)))}),I(this,bo,new Promise((e,n)=>{I(this,rl,e,"f"),I(this,wo,n,"f")}),"f"),I(this,vo,new Promise((e,n)=>{I(this,sl,e,"f"),I(this,ko,n,"f")}),"f"),v(this,bo,"f").catch(()=>{}),v(this,vo,"f").catch(()=>{})}get response(){return v(this,al,"f")}get request_id(){return v(this,cl,"f")}async withResponse(){let e=await v(this,bo,"f");if(!e)throw new Error("Could not resolve a `Response` object");return{data:this,response:e,request_id:e.headers.get("request-id")}}static fromReadableStream(e){let n=new t;return n._run(()=>n._fromReadableStream(e)),n}static createMessage(e,n,r){let s=new t;for(let i of n.messages)s._addMessageParam(i);return s._run(()=>s._createMessage(e,{...n,stream:!0},{...r,headers:{...r?.headers,"X-Stainless-Helper-Method":"stream"}})),s}_run(e){e().then(()=>{this._emitFinal(),this._emit("end")},v(this,Sf,"f"))}_addMessageParam(e){this.messages.push(e)}_addMessage(e,n=!0){this.receivedMessages.push(e),n&&this._emit("message",e)}async _createMessage(e,n,r){let s=r?.signal,i;s&&(s.aborted&&this.controller.abort(),i=this.controller.abort.bind(this.controller),s.addEventListener("abort",i));try{v(this,dt,"m",xf).call(this);let{response:o,data:a}=await e.create({...n,stream:!0},{...r,signal:this.controller.signal}).withResponse();this._connected(o);for await(let c of a)v(this,dt,"m",Tf).call(this,c);if(a.controller.signal?.aborted)throw new Pe;v(this,dt,"m",_f).call(this)}finally{s&&i&&s.removeEventListener("abort",i)}}_connected(e){this.ended||(I(this,al,e,"f"),I(this,cl,e?.headers.get("request-id"),"f"),v(this,rl,"f").call(this,e),this._emit("connect"))}get ended(){return v(this,Eo,"f")}get errored(){return v(this,il,"f")}get aborted(){return v(this,ol,"f")}abort(){this.controller.abort()}on(e,n){return(v(this,Xt,"f")[e]||(v(this,Xt,"f")[e]=[])).push({listener:n}),this}off(e,n){let r=v(this,Xt,"f")[e];if(!r)return this;let s=r.findIndex(i=>i.listener===n);return s>=0&&r.splice(s,1),this}once(e,n){return(v(this,Xt,"f")[e]||(v(this,Xt,"f")[e]=[])).push({listener:n,once:!0}),this}emitted(e){return new Promise((n,r)=>{I(this,Us,!0,"f"),e!=="error"&&this.once("error",r),this.once(e,n)})}async done(){I(this,Us,!0,"f"),await v(this,vo,"f")}get currentMessage(){return v(this,On,"f")}async finalMessage(){return await this.done(),v(this,dt,"m",Ef).call(this)}async finalText(){return await this.done(),v(this,dt,"m",hx).call(this)}_emit(e,...n){if(v(this,Eo,"f"))return;e==="end"&&(I(this,Eo,!0,"f"),v(this,sl,"f").call(this));let r=v(this,Xt,"f")[e];if(r&&(v(this,Xt,"f")[e]=r.filter(s=>!s.once),r.forEach(({listener:s})=>s(...n))),e==="abort"){let s=n[0];!v(this,Us,"f")&&!r?.length&&Promise.reject(s),v(this,wo,"f").call(this,s),v(this,ko,"f").call(this,s),this._emit("end");return}if(e==="error"){let s=n[0];!v(this,Us,"f")&&!r?.length&&Promise.reject(s),v(this,wo,"f").call(this,s),v(this,ko,"f").call(this,s),this._emit("end")}}_emitFinal(){this.receivedMessages.at(-1)&&this._emit("finalMessage",v(this,dt,"m",Ef).call(this))}async _fromReadableStream(e,n){let r=n?.signal,s;r&&(r.aborted&&this.controller.abort(),s=this.controller.abort.bind(this.controller),r.addEventListener("abort",s));try{v(this,dt,"m",xf).call(this),this._connected(null);let i=Mt.fromReadableStream(e,this.controller);for await(let o of i)v(this,dt,"m",Tf).call(this,o);if(i.controller.signal?.aborted)throw new Pe;v(this,dt,"m",_f).call(this)}finally{r&&s&&r.removeEventListener("abort",s)}}[(On=new WeakMap,bo=new WeakMap,rl=new WeakMap,wo=new WeakMap,vo=new WeakMap,sl=new WeakMap,ko=new WeakMap,Xt=new WeakMap,Eo=new WeakMap,il=new WeakMap,ol=new WeakMap,Us=new WeakMap,al=new WeakMap,cl=new WeakMap,Sf=new WeakMap,dt=new WeakSet,Ef=function(){if(this.receivedMessages.length===0)throw new q("stream ended without producing a Message with role=assistant");return this.receivedMessages.at(-1)},hx=function(){if(this.receivedMessages.length===0)throw new q("stream ended without producing a Message with role=assistant");let n=this.receivedMessages.at(-1).content.filter(r=>r.type==="text").map(r=>r.text);if(n.length===0)throw new q("stream ended without producing a content block with type=text");return n.join(" ")},xf=function(){this.ended||I(this,On,void 0,"f")},Tf=function(n){if(this.ended)return;let r=v(this,dt,"m",yx).call(this,n);switch(this._emit("streamEvent",n,r),n.type){case"content_block_delta":{let s=r.content.at(-1);switch(n.delta.type){case"text_delta":{s.type==="text"&&this._emit("text",n.delta.text,s.text||"");break}case"citations_delta":{s.type==="text"&&this._emit("citation",n.delta.citation,s.citations??[]);break}case"input_json_delta":{wx(s)&&s.input&&this._emit("inputJson",n.delta.partial_json,s.input);break}case"thinking_delta":{s.type==="thinking"&&this._emit("thinking",n.delta.thinking,s.thinking);break}case"signature_delta":{s.type==="thinking"&&this._emit("signature",s.signature);break}default:n.delta}break}case"message_stop":{this._addMessageParam(r),this._addMessage(r,!0);break}case"content_block_stop":{this._emit("contentBlock",r.content.at(-1));break}case"message_start":{I(this,On,r,"f");break}case"content_block_start":case"message_delta":break}},_f=function(){if(this.ended)throw new q("stream has ended, this shouldn't happen");let n=v(this,On,"f");if(!n)throw new q("request ended without sending any chunks");return I(this,On,void 0,"f"),n},yx=function(n){let r=v(this,On,"f");if(n.type==="message_start"){if(r)throw new q(`Unexpected event order, got ${n.type} before receiving "message_stop"`);return n.message}if(!r)throw new q(`Unexpected event order, got ${n.type} before "message_start"`);switch(n.type){case"message_stop":return r;case"message_delta":return r.stop_reason=n.delta.stop_reason,r.stop_sequence=n.delta.stop_sequence,r.usage.output_tokens=n.usage.output_tokens,n.usage.input_tokens!=null&&(r.usage.input_tokens=n.usage.input_tokens),n.usage.cache_creation_input_tokens!=null&&(r.usage.cache_creation_input_tokens=n.usage.cache_creation_input_tokens),n.usage.cache_read_input_tokens!=null&&(r.usage.cache_read_input_tokens=n.usage.cache_read_input_tokens),n.usage.server_tool_use!=null&&(r.usage.server_tool_use=n.usage.server_tool_use),r;case"content_block_start":return r.content.push({...n.content_block}),r;case"content_block_delta":{let s=r.content.at(n.index);switch(n.delta.type){case"text_delta":{s?.type==="text"&&(r.content[n.index]={...s,text:(s.text||"")+n.delta.text});break}case"citations_delta":{s?.type==="text"&&(r.content[n.index]={...s,citations:[...s.citations??[],n.delta.citation]});break}case"input_json_delta":{if(s&&wx(s)){let i=s[bx]||"";i+=n.delta.partial_json;let o={...s};Object.defineProperty(o,bx,{value:i,enumerable:!1,writable:!0}),i&&(o.input=zc(i)),r.content[n.index]=o}break}case"thinking_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,thinking:s.thinking+n.delta.thinking});break}case"signature_delta":{s?.type==="thinking"&&(r.content[n.index]={...s,signature:n.delta.signature});break}default:n.delta}return r}case"content_block_stop":return r}},Symbol.asyncIterator)](){let e=[],n=[],r=!1;return this.on("streamEvent",s=>{let i=n.shift();i?i.resolve(s):e.push(s)}),this.on("end",()=>{r=!0;for(let s of n)s.resolve(void 0);n.length=0}),this.on("abort",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),this.on("error",s=>{r=!0;for(let i of n)i.reject(s);n.length=0}),{next:async()=>e.length?{value:e.shift(),done:!1}:r?{value:void 0,done:!0}:new Promise((i,o)=>n.push({resolve:i,reject:o})).then(i=>i?{value:i,done:!1}:{value:void 0,done:!0}),return:async()=>(this.abort(),{value:void 0,done:!0})}}toReadableStream(){return new Mt(this[Symbol.asyncIterator].bind(this),this.controller).toReadableStream()}}});var Bs,$f=W(()=>{ct();Nt();lt();of();lo();Cn();Bs=class extends pe{create(e,n){return this._client.post("/v1/messages/batches",{body:e,...n})}retrieve(e,n){return this._client.get(fe`/v1/messages/batches/${e}`,n)}list(e={},n){return this._client.getAPIList("/v1/messages/batches",at,{query:e,...n})}delete(e,n){return this._client.delete(fe`/v1/messages/batches/${e}`,n)}cancel(e,n){return this._client.post(fe`/v1/messages/batches/${e}/cancel`,n)}async results(e,n){let r=await this.retrieve(e);if(!r.results_url)throw new q(`No batch \`results_url\`; Has it finished processing? ${r.processing_status} - ${r.id}`);return this._client.get(r.results_url,{...n,headers:J([{Accept:"application/binary"},n?.headers]),stream:!0,__binaryResponse:!0})._thenUnwrap((s,i)=>Ms.fromResponse(i.response,i.controller))}}});var Dn,kx,Rf=W(()=>{ct();vx();$f();$f();mf();Dn=class extends pe{constructor(){super(...arguments),this.batches=new Bs(this._client)}create(e,n){e.model in kx&&console.warn(`The model '${e.model}' is deprecated and will reach end-of-life on ${kx[e.model]} +Please migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`);let r=this._client._options.timeout;if(!e.stream&&r==null){let s=tl[e.model]??void 0;r=this._client.calculateNonstreamingTimeout(e.max_tokens,s)}return this._client.post("/v1/messages",{body:e,timeout:r??6e5,...n,stream:e.stream??!1})}stream(e,n){return ll.createMessage(this,e,n)}countTokens(e,n){return this._client.post("/v1/messages/count_tokens",{body:e,...n})}},kx={"claude-1.3":"November 6th, 2024","claude-1.3-100k":"November 6th, 2024","claude-instant-1.1":"November 6th, 2024","claude-instant-1.1-100k":"November 6th, 2024","claude-instant-1.2":"November 6th, 2024","claude-3-sonnet-20240229":"July 21st, 2025","claude-3-opus-20240229":"January 5th, 2026","claude-2.1":"July 21st, 2025","claude-2.0":"July 21st, 2025","claude-3-7-sonnet-latest":"February 19th, 2026","claude-3-7-sonnet-20250219":"February 19th, 2026"};Dn.Batches=Bs});var Mr,Cf=W(()=>{ct();Nt();lt();Cn();Mr=class extends pe{retrieve(e,n={},r){let{betas:s}=n??{};return this._client.get(fe`/v1/models/${e}`,{...r,headers:J([{...s?.toString()!=null?{"anthropic-beta":s?.toString()}:void 0},r?.headers])})}list(e={},n){let{betas:r,...s}=e??{};return this._client.getAPIList("/v1/models",at,{query:s,...n,headers:J([{...r?.toString()!=null?{"anthropic-beta":r?.toString()}:void 0},n?.headers])})}}});var Ex=W(()=>{ix();vf();kf();Rf();Cf()});var So,Sx=W(()=>{So=t=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[t]?.trim()??void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(t)?.trim()}});var Af,Pf,ul,xx,If,Of,me,Qt,Df=W(()=>{Wt();MS();Ar();qS();$s();Up();Rs();YS();qp();vt();Nt();nf();Ex();Bc();kf();Cf();vf();Rf();Up();lt();Sx();qc();Ar();If="\\n\\nHuman:",Of="\\n\\nAssistant:",me=class{constructor({baseURL:e=So("ANTHROPIC_BASE_URL"),apiKey:n=So("ANTHROPIC_API_KEY")??null,authToken:r=So("ANTHROPIC_AUTH_TOKEN")??null,...s}={}){Af.add(this),ul.set(this,void 0);let i={apiKey:n,authToken:r,...s,baseURL:e||"https://api.anthropic.com"};if(!i.dangerouslyAllowBrowser&&WS())throw new q(`It looks like you're running in a browser-like environment. This is disabled by default, as it risks exposing your secret API credentials to attackers. If you understand the risks and have appropriate mitigations in place, you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g., new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); -`);this.baseURL=i.baseURL,this.timeout=i.timeout??af.DEFAULT_TIMEOUT,this.logger=i.logger??console;let o="warn";this.logLevel=o,this.logLevel=Sp(i.logLevel,"ClientOptions.logLevel",this)??Sp(yo("ANTHROPIC_LOG"),"process.env['ANTHROPIC_LOG']",this)??o,this.fetchOptions=i.fetchOptions,this.maxRetries=i.maxRetries??2,this.fetch=i.fetch??bS(),P(this,Kc,vS,"f"),this._options=i,this.apiKey=n,this.authToken=r}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,authToken:this.authToken,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:n}){if(!(this.apiKey&&e.get("x-api-key"))&&!n.has("x-api-key")&&!(this.authToken&&e.get("authorization"))&&!n.has("authorization"))throw new Error('Could not resolve authentication method. Expected either apiKey or authToken to be set. Or for one of the "X-Api-Key" or "Authorization" headers to be explicitly omitted')}async authHeaders(e){return W([await this.apiKeyAuth(e),await this.bearerAuth(e)])}async apiKeyAuth(e){if(this.apiKey!=null)return W([{"X-Api-Key":this.apiKey}])}async bearerAuth(e){if(this.authToken!=null)return W([{Authorization:`Bearer ${this.authToken}`}])}stringifyQuery(e){return Object.entries(e).filter(([n,r])=>typeof r<"u").map(([n,r])=>{if(typeof r=="string"||typeof r=="number"||typeof r=="boolean")return`${encodeURIComponent(n)}=${encodeURIComponent(r)}`;if(r===null)return`${encodeURIComponent(n)}=`;throw new j(`Cannot stringify type ${typeof r}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}getUserAgent(){return`${this.constructor.name}/JS ${_n}`}defaultIdempotencyKey(){return`stainless-node-retry-${mp()}`}makeStatusError(e,n,r,s){return Te.generate(e,n,r,s)}buildURL(e,n,r){let s=!b(this,of,"m",JS).call(this)&&r||this.baseURL,i=aS(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),o=this.defaultQuery();return cS(o)||(n={...o,...n}),typeof n=="object"&&n&&!Array.isArray(n)&&(i.search=this.stringifyQuery(n)),i.toString()}_calculateNonstreamingTimeout(e){if(3600*e/128e3>600)throw new j("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#streaming-responses for more details");return 600*1e3}async prepareOptions(e){}async prepareRequest(e,{url:n,options:r}){}get(e,n){return this.methodRequest("get",e,n)}post(e,n){return this.methodRequest("post",e,n)}patch(e,n){return this.methodRequest("patch",e,n)}put(e,n){return this.methodRequest("put",e,n)}delete(e,n){return this.methodRequest("delete",e,n)}methodRequest(e,n,r){return this.request(Promise.resolve(r).then(s=>({method:e,path:n,...s})))}request(e,n=null){return new Tn(this,this.makeRequest(e,n,void 0))}async makeRequest(e,n,r){let s=await e,i=s.maxRetries??this.maxRetries;n==null&&(n=i),await this.prepareOptions(s);let{req:o,url:a,timeout:c}=await this.buildRequest(s,{retryCount:i-n});await this.prepareRequest(o,{url:a,options:s});let l="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),u=r===void 0?"":`, retryOf: ${r}`,d=Date.now();if($e(this).debug(`[${l}] sending request`,Ht({retryOfRequestLogID:r,method:s.method,url:a,options:s,headers:o.headers})),s.signal?.aborted)throw new xe;let p=new AbortController,f=await this.fetchWithTimeout(a,o,c,p).catch(Ji),m=Date.now();if(f instanceof globalThis.Error){let y=`retrying, ${n} attempts remaining`;if(s.signal?.aborted)throw new xe;let w=Vt(f)||/timed? ?out/i.test(String(f)+("cause"in f?String(f.cause):""));if(n)return $e(this).info(`[${l}] connection ${w?"timed out":"failed"} - ${y}`),$e(this).debug(`[${l}] connection ${w?"timed out":"failed"} (${y})`,Ht({retryOfRequestLogID:r,url:a,durationMs:m-d,message:f.message})),this.retryRequest(s,n,r??l);throw $e(this).info(`[${l}] connection ${w?"timed out":"failed"} - error; no more retries left`),$e(this).debug(`[${l}] connection ${w?"timed out":"failed"} (error; no more retries left)`,Ht({retryOfRequestLogID:r,url:a,durationMs:m-d,message:f.message})),w?new hr:new Wt({cause:f})}let g=[...f.headers.entries()].filter(([y])=>y==="request-id").map(([y,w])=>", "+y+": "+JSON.stringify(w)).join(""),h=`[${l}${u}${g}] ${o.method} ${a} ${f.ok?"succeeded":"failed"} with status ${f.status} in ${m-d}ms`;if(!f.ok){let y=await this.shouldRetry(f);if(n&&y){let F=`retrying, ${n} attempts remaining`;return await wS(f.body),$e(this).info(`${h} - ${F}`),$e(this).debug(`[${l}] response error (${F})`,Ht({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,durationMs:m-d})),this.retryRequest(s,n,r??l,f.headers)}let w=y?"error; no more retries left":"error; not retryable";$e(this).info(`${h} - ${w}`);let S=await f.text().catch(F=>Ji(F).message),v=kc(S),k=v?void 0:S;throw $e(this).debug(`[${l}] response error (${w})`,Ht({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,message:k,durationMs:Date.now()-d})),this.makeStatusError(f.status,v,k,f.headers)}return $e(this).info(h),$e(this).debug(`[${l}] response start`,Ht({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,durationMs:m-d})),{response:f,options:s,controller:p,requestLogID:l,retryOfRequestLogID:r,startTime:d}}getAPIList(e,n,r){return this.requestAPIList(n,{method:"get",path:e,...r})}requestAPIList(e,n){let r=this.makeRequest(n,null,void 0);return new Es(this,r,e)}async fetchWithTimeout(e,n,r,s){let{signal:i,method:o,...a}=n||{};i&&i.addEventListener("abort",()=>s.abort());let c=setTimeout(()=>s.abort(),r),l=globalThis.ReadableStream&&a.body instanceof globalThis.ReadableStream||typeof a.body=="object"&&a.body!==null&&Symbol.asyncIterator in a.body,u={signal:s.signal,...l?{duplex:"half"}:{},method:"GET",...a};o&&(u.method=o.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let n=e.headers.get("x-should-retry");return n==="true"?!0:n==="false"?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,n,r,s){let i,o=s?.get("retry-after-ms");if(o){let c=parseFloat(o);Number.isNaN(c)||(i=c)}let a=s?.get("retry-after");if(a&&!i){let c=parseFloat(a);Number.isNaN(c)?i=Date.parse(a)-Date.now():i=c*1e3}if(!(i&&0<=i&&i<60*1e3)){let c=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(n,c)}return await dS(i),this.makeRequest(e,n-1,r)}calculateDefaultRetryTimeoutMillis(e,n){let i=n-e,o=Math.min(.5*Math.pow(2,i),8),a=1-Math.random()*.25;return o*a*1e3}calculateNonstreamingTimeout(e,n){if(36e5*e/128e3>6e5||n!=null&&e>n)throw new j("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#long-requests for more details");return 6e5}async buildRequest(e,{retryCount:n=0}={}){let r={...e},{method:s,path:i,query:o,defaultBaseURL:a}=r,c=this.buildURL(i,o,a);"timeout"in r&&uS("timeout",r.timeout),r.timeout=r.timeout??this.timeout;let{bodyHeaders:l,body:u}=this.buildBody({options:r}),d=await this.buildHeaders({options:e,method:s,bodyHeaders:l,retryCount:n});return{req:{method:s,headers:d,...r.signal&&{signal:r.signal},...globalThis.ReadableStream&&u instanceof globalThis.ReadableStream&&{duplex:"half"},...u&&{body:u},...this.fetchOptions??{},...r.fetchOptions??{}},url:c,timeout:r.timeout}}async buildHeaders({options:e,method:n,bodyHeaders:r,retryCount:s}){let i={};this.idempotencyHeader&&n!=="get"&&(e.idempotencyKey||(e.idempotencyKey=this.defaultIdempotencyKey()),i[this.idempotencyHeader]=e.idempotencyKey);let o=W([i,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(s),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...yS(),...this._options.dangerouslyAllowBrowser?{"anthropic-dangerous-direct-browser-access":"true"}:void 0,"anthropic-version":"2023-06-01"},await this.authHeaders(e),this._options.defaultHeaders,r,e.headers]);return this.validateHeaders(o),o.values}buildBody({options:{body:e,headers:n}}){if(!e)return{bodyHeaders:void 0,body:void 0};let r=W([n]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||typeof e=="string"&&r.values.has("content-type")||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:typeof e=="object"&&(Symbol.asyncIterator in e||Symbol.iterator in e&&"next"in e&&typeof e.next=="function")?{bodyHeaders:void 0,body:Ec(e)}:b(this,Kc,"f").call(this,{body:e,headers:r})}};af=pe,Kc=new WeakMap,of=new WeakSet,JS=function(){return this.baseURL!=="https://api.anthropic.com"};pe.Anthropic=af;pe.HUMAN_PROMPT=cf;pe.AI_PROMPT=lf;pe.DEFAULT_TIMEOUT=6e5;pe.AnthropicError=j;pe.APIError=Te;pe.APIConnectionError=Wt;pe.APIConnectionTimeoutError=hr;pe.APIUserAbortError=xe;pe.NotFoundError=vr;pe.ConflictError=kr;pe.RateLimitError=Sr;pe.BadRequestError=yr;pe.AuthenticationError=br;pe.InternalServerError=_r;pe.PermissionDeniedError=wr;pe.UnprocessableEntityError=Er;pe.toFile=no;Zt=class extends pe{constructor(){super(...arguments),this.completions=new Ar(this),this.messages=new Pn(this),this.models=new Cr(this),this.beta=new yt(this)}};Zt.Completions=Ar;Zt.Messages=Pn;Zt.Models=Cr;Zt.Beta=yt});var YS={};al(YS,{AI_PROMPT:()=>lf,APIConnectionError:()=>Wt,APIConnectionTimeoutError:()=>hr,APIError:()=>Te,APIPromise:()=>Tn,APIUserAbortError:()=>xe,Anthropic:()=>Zt,AnthropicError:()=>j,AuthenticationError:()=>br,BadRequestError:()=>yr,BaseAnthropic:()=>pe,ConflictError:()=>kr,HUMAN_PROMPT:()=>cf,InternalServerError:()=>_r,NotFoundError:()=>vr,PagePromise:()=>Es,PermissionDeniedError:()=>wr,RateLimitError:()=>Sr,UnprocessableEntityError:()=>Er,default:()=>Zt,toFile:()=>no});var ZS=B(()=>{uf();Op();$c();uf();It();gt()});var am=require("node:fs/promises"),cm=require("node:fs/promises");var py=vt(vi(),1);var x={};al(x,{BRAND:()=>AC,DIRTY:()=>qn,EMPTY_PATH:()=>aC,INVALID:()=>q,NEVER:()=>fP,OK:()=>De,ParseStatus:()=>Ae,Schema:()=>Y,ZodAny:()=>dn,ZodArray:()=>qt,ZodBigInt:()=>Bn,ZodBoolean:()=>Vn,ZodBranded:()=>Ei,ZodCatch:()=>tr,ZodDate:()=>Wn,ZodDefault:()=>er,ZodDiscriminatedUnion:()=>Ra,ZodEffects:()=>Qe,ZodEnum:()=>Xn,ZodError:()=>qe,ZodFirstPartyTypeKind:()=>U,ZodFunction:()=>Ca,ZodIntersection:()=>Jn,ZodIssueCode:()=>T,ZodLazy:()=>Yn,ZodLiteral:()=>Zn,ZodMap:()=>Xr,ZodNaN:()=>es,ZodNativeEnum:()=>Qn,ZodNever:()=>ft,ZodNull:()=>Hn,ZodNullable:()=>Tt,ZodNumber:()=>Un,ZodObject:()=>Ue,ZodOptional:()=>Ze,ZodParsedType:()=>C,ZodPipeline:()=>Si,ZodPromise:()=>pn,ZodReadonly:()=>nr,ZodRecord:()=>Aa,ZodSchema:()=>Y,ZodSet:()=>Qr,ZodString:()=>un,ZodSymbol:()=>Yr,ZodTransformer:()=>Qe,ZodTuple:()=>_t,ZodType:()=>Y,ZodUndefined:()=>zn,ZodUnion:()=>Kn,ZodUnknown:()=>Ft,ZodVoid:()=>Zr,addIssueToContext:()=>A,any:()=>GC,array:()=>UC,bigint:()=>IC,boolean:()=>cy,coerce:()=>pP,custom:()=>iy,date:()=>DC,datetimeRegex:()=>ry,defaultErrorMap:()=>Gt,discriminatedUnion:()=>zC,effect:()=>sP,enum:()=>tP,function:()=>XC,getErrorMap:()=>Hr,getParsedType:()=>St,instanceof:()=>PC,intersection:()=>HC,isAborted:()=>xa,isAsync:()=>Kr,isDirty:()=>$a,isValid:()=>ln,late:()=>CC,lazy:()=>QC,literal:()=>eP,makeIssue:()=>ki,map:()=>YC,nan:()=>OC,nativeEnum:()=>nP,never:()=>FC,null:()=>LC,nullable:()=>oP,number:()=>ay,object:()=>BC,objectUtil:()=>Uu,oboolean:()=>dP,onumber:()=>uP,optional:()=>iP,ostring:()=>lP,pipeline:()=>cP,preprocess:()=>aP,promise:()=>rP,quotelessJson:()=>sC,record:()=>JC,set:()=>ZC,setErrorMap:()=>oC,strictObject:()=>VC,string:()=>oy,symbol:()=>MC,transformer:()=>sP,tuple:()=>KC,undefined:()=>NC,union:()=>WC,unknown:()=>jC,util:()=>Z,void:()=>qC});var Z;(function(t){t.assertEqual=s=>{};function e(s){}t.assertIs=e;function n(s){throw new Error}t.assertNever=n,t.arrayToEnum=s=>{let i={};for(let o of s)i[o]=o;return i},t.getValidEnumValues=s=>{let i=t.objectKeys(s).filter(a=>typeof s[s[a]]!="number"),o={};for(let a of i)o[a]=s[a];return t.objectValues(o)},t.objectValues=s=>t.objectKeys(s).map(function(i){return s[i]}),t.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{let i=[];for(let o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.push(o);return i},t.find=(s,i)=>{for(let o of s)if(i(o))return o},t.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,i=" | "){return s.map(o=>typeof o=="string"?`'${o}'`:o).join(i)}t.joinValues=r,t.jsonStringifyReplacer=(s,i)=>typeof i=="bigint"?i.toString():i})(Z||(Z={}));var Uu;(function(t){t.mergeShapes=(e,n)=>({...e,...n})})(Uu||(Uu={}));var C=Z.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),St=t=>{switch(typeof t){case"undefined":return C.undefined;case"string":return C.string;case"number":return Number.isNaN(t)?C.nan:C.number;case"boolean":return C.boolean;case"function":return C.function;case"bigint":return C.bigint;case"symbol":return C.symbol;case"object":return Array.isArray(t)?C.array:t===null?C.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?C.promise:typeof Map<"u"&&t instanceof Map?C.map:typeof Set<"u"&&t instanceof Set?C.set:typeof Date<"u"&&t instanceof Date?C.date:C.object;default:return C.unknown}};var T=Z.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),sC=t=>JSON.stringify(t,null,2).replace(/"([^"]+)":/g,"$1:"),qe=class t extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};let n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=e}format(e){let n=e||function(i){return i.message},r={_errors:[]},s=i=>{for(let o of i.issues)if(o.code==="invalid_union")o.unionErrors.map(s);else if(o.code==="invalid_return_type")s(o.returnTypeError);else if(o.code==="invalid_arguments")s(o.argumentsError);else if(o.path.length===0)r._errors.push(n(o));else{let a=r,c=0;for(;cn.message){let n={},r=[];for(let s of this.issues)if(s.path.length>0){let i=s.path[0];n[i]=n[i]||[],n[i].push(e(s))}else r.push(e(s));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};qe.create=t=>new qe(t);var iC=(t,e)=>{let n;switch(t.code){case T.invalid_type:t.received===C.undefined?n="Required":n=`Expected ${t.expected}, received ${t.received}`;break;case T.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(t.expected,Z.jsonStringifyReplacer)}`;break;case T.unrecognized_keys:n=`Unrecognized key(s) in object: ${Z.joinValues(t.keys,", ")}`;break;case T.invalid_union:n="Invalid input";break;case T.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${Z.joinValues(t.options)}`;break;case T.invalid_enum_value:n=`Invalid enum value. Expected ${Z.joinValues(t.options)}, received '${t.received}'`;break;case T.invalid_arguments:n="Invalid function arguments";break;case T.invalid_return_type:n="Invalid function return type";break;case T.invalid_date:n="Invalid date";break;case T.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(n=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?n=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?n=`Invalid input: must end with "${t.validation.endsWith}"`:Z.assertNever(t.validation):t.validation!=="regex"?n=`Invalid ${t.validation}`:n="Invalid";break;case T.too_small:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:n="Invalid input";break;case T.too_big:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?n=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:n="Invalid input";break;case T.custom:n="Invalid input";break;case T.invalid_intersection_types:n="Intersection results could not be merged";break;case T.not_multiple_of:n=`Number must be a multiple of ${t.multipleOf}`;break;case T.not_finite:n="Number must be finite";break;default:n=e.defaultError,Z.assertNever(t)}return{message:n}},Gt=iC;var Xh=Gt;function oC(t){Xh=t}function Hr(){return Xh}var ki=t=>{let{data:e,path:n,errorMaps:r,issueData:s}=t,i=[...n,...s.path||[]],o={...s,path:i};if(s.message!==void 0)return{...s,path:i,message:s.message};let a="",c=r.filter(l=>!!l).slice().reverse();for(let l of c)a=l(o,{data:e,defaultError:a}).message;return{...s,path:i,message:a}},aC=[];function A(t,e){let n=Hr(),r=ki({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,n,n===Gt?void 0:Gt].filter(s=>!!s)});t.common.issues.push(r)}var Ae=class t{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,n){let r=[];for(let s of n){if(s.status==="aborted")return q;s.status==="dirty"&&e.dirty(),r.push(s.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,n){let r=[];for(let s of n){let i=await s.key,o=await s.value;r.push({key:i,value:o})}return t.mergeObjectSync(e,r)}static mergeObjectSync(e,n){let r={};for(let s of n){let{key:i,value:o}=s;if(i.status==="aborted"||o.status==="aborted")return q;i.status==="dirty"&&e.dirty(),o.status==="dirty"&&e.dirty(),i.value!=="__proto__"&&(typeof o.value<"u"||s.alwaysSet)&&(r[i.value]=o.value)}return{status:e.value,value:r}}},q=Object.freeze({status:"aborted"}),qn=t=>({status:"dirty",value:t}),De=t=>({status:"valid",value:t}),xa=t=>t.status==="aborted",$a=t=>t.status==="dirty",ln=t=>t.status==="valid",Kr=t=>typeof Promise<"u"&&t instanceof Promise;var N;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(N||(N={}));var Xe=class{constructor(e,n,r,s){this._cachedPath=[],this.parent=e,this.data=n,this._path=r,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},Qh=(t,e)=>{if(ln(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let n=new qe(t.common.issues);return this._error=n,this._error}}};function H(t){if(!t)return{};let{errorMap:e,invalid_type_error:n,required_error:r,description:s}=t;if(e&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(o,a)=>{let{message:c}=t;return o.code==="invalid_enum_value"?{message:c??a.defaultError}:typeof a.data>"u"?{message:c??r??a.defaultError}:o.code!=="invalid_type"?{message:a.defaultError}:{message:c??n??a.defaultError}},description:s}}var Y=class{get description(){return this._def.description}_getType(e){return St(e.data)}_getOrReturnCtx(e,n){return n||{common:e.parent.common,data:e.data,parsedType:St(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new Ae,ctx:{common:e.parent.common,data:e.data,parsedType:St(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let n=this._parse(e);if(Kr(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(e){let n=this._parse(e);return Promise.resolve(n)}parse(e,n){let r=this.safeParse(e,n);if(r.success)return r.data;throw r.error}safeParse(e,n){let r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:St(e)},s=this._parseSync({data:e,path:r.path,parent:r});return Qh(r,s)}"~validate"(e){let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:St(e)};if(!this["~standard"].async)try{let r=this._parseSync({data:e,path:[],parent:n});return ln(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:n}).then(r=>ln(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(e,n){let r=await this.safeParseAsync(e,n);if(r.success)return r.data;throw r.error}async safeParseAsync(e,n){let r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:St(e)},s=this._parse({data:e,path:r.path,parent:r}),i=await(Kr(s)?s:Promise.resolve(s));return Qh(r,i)}refine(e,n){let r=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,i)=>{let o=e(s),a=()=>i.addIssue({code:T.custom,...r(s)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(a(),!1)):o?!0:(a(),!1)})}refinement(e,n){return this._refinement((r,s)=>e(r)?!0:(s.addIssue(typeof n=="function"?n(r,s):n),!1))}_refinement(e){return new Qe({schema:this,typeName:U.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return Ze.create(this,this._def)}nullable(){return Tt.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return qt.create(this)}promise(){return pn.create(this,this._def)}or(e){return Kn.create([this,e],this._def)}and(e){return Jn.create(this,e,this._def)}transform(e){return new Qe({...H(this._def),schema:this,typeName:U.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let n=typeof e=="function"?e:()=>e;return new er({...H(this._def),innerType:this,defaultValue:n,typeName:U.ZodDefault})}brand(){return new Ei({typeName:U.ZodBranded,type:this,...H(this._def)})}catch(e){let n=typeof e=="function"?e:()=>e;return new tr({...H(this._def),innerType:this,catchValue:n,typeName:U.ZodCatch})}describe(e){let n=this.constructor;return new n({...this._def,description:e})}pipe(e){return Si.create(this,e)}readonly(){return nr.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cC=/^c[^\s-]{8,}$/i,lC=/^[0-9a-z]+$/,uC=/^[0-9A-HJKMNP-TV-Z]{26}$/i,dC=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,pC=/^[a-z0-9_-]{21}$/i,fC=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,mC=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,gC=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,hC="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",Bu,yC=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,bC=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,wC=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,vC=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,kC=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,EC=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,ty="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",SC=new RegExp(`^${ty}$`);function ny(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);let n=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${n}`}function _C(t){return new RegExp(`^${ny(t)}$`)}function ry(t){let e=`${ty}T${ny(t)}`,n=[];return n.push(t.local?"Z?":"Z"),t.offset&&n.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${n.join("|")})`,new RegExp(`^${e}$`)}function TC(t,e){return!!((e==="v4"||!e)&&yC.test(t)||(e==="v6"||!e)&&wC.test(t))}function xC(t,e){if(!fC.test(t))return!1;try{let[n]=t.split(".");if(!n)return!1;let r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(r));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||e&&s.alg!==e)}catch{return!1}}function $C(t,e){return!!((e==="v4"||!e)&&bC.test(t)||(e==="v6"||!e)&&vC.test(t))}var un=class t extends Y{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==C.string){let i=this._getOrReturnCtx(e);return A(i,{code:T.invalid_type,expected:C.string,received:i.parsedType}),q}let r=new Ae,s;for(let i of this._def.checks)if(i.kind==="min")e.data.lengthi.value&&(s=this._getOrReturnCtx(e,s),A(s,{code:T.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="length"){let o=e.data.length>i.value,a=e.data.lengthe.test(s),{validation:n,code:T.invalid_string,...N.errToObj(r)})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...N.errToObj(e)})}url(e){return this._addCheck({kind:"url",...N.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...N.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...N.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...N.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...N.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...N.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...N.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...N.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...N.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...N.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...N.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...N.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...N.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...N.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...N.errToObj(e)})}regex(e,n){return this._addCheck({kind:"regex",regex:e,...N.errToObj(n)})}includes(e,n){return this._addCheck({kind:"includes",value:e,position:n?.position,...N.errToObj(n?.message)})}startsWith(e,n){return this._addCheck({kind:"startsWith",value:e,...N.errToObj(n)})}endsWith(e,n){return this._addCheck({kind:"endsWith",value:e,...N.errToObj(n)})}min(e,n){return this._addCheck({kind:"min",value:e,...N.errToObj(n)})}max(e,n){return this._addCheck({kind:"max",value:e,...N.errToObj(n)})}length(e,n){return this._addCheck({kind:"length",value:e,...N.errToObj(n)})}nonempty(e){return this.min(1,N.errToObj(e))}trim(){return new t({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxLength(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew un({checks:[],typeName:U.ZodString,coerce:t?.coerce??!1,...H(t)});function RC(t,e){let n=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,s=n>r?n:r,i=Number.parseInt(t.toFixed(s).replace(".","")),o=Number.parseInt(e.toFixed(s).replace(".",""));return i%o/10**s}var Un=class t extends Y{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==C.number){let i=this._getOrReturnCtx(e);return A(i,{code:T.invalid_type,expected:C.number,received:i.parsedType}),q}let r,s=new Ae;for(let i of this._def.checks)i.kind==="int"?Z.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),A(r,{code:T.invalid_type,expected:"integer",received:"float",message:i.message}),s.dirty()):i.kind==="min"?(i.inclusive?e.datai.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),A(r,{code:T.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),s.dirty()):i.kind==="multipleOf"?RC(e.data,i.value)!==0&&(r=this._getOrReturnCtx(e,r),A(r,{code:T.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):i.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),A(r,{code:T.not_finite,message:i.message}),s.dirty()):Z.assertNever(i);return{status:s.value,value:e.data}}gte(e,n){return this.setLimit("min",e,!0,N.toString(n))}gt(e,n){return this.setLimit("min",e,!1,N.toString(n))}lte(e,n){return this.setLimit("max",e,!0,N.toString(n))}lt(e,n){return this.setLimit("max",e,!1,N.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:N.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:N.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:N.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:N.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:N.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:N.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:N.toString(n)})}finite(e){return this._addCheck({kind:"finite",message:N.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:N.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:N.toString(e)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuee.kind==="int"||e.kind==="multipleOf"&&Z.isInteger(e.value))}get isFinite(){let e=null,n=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(e===null||r.valuenew Un({checks:[],typeName:U.ZodNumber,coerce:t?.coerce||!1,...H(t)});var Bn=class t extends Y{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==C.bigint)return this._getInvalidInput(e);let r,s=new Ae;for(let i of this._def.checks)i.kind==="min"?(i.inclusive?e.datai.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),A(r,{code:T.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),s.dirty()):i.kind==="multipleOf"?e.data%i.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),A(r,{code:T.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):Z.assertNever(i);return{status:s.value,value:e.data}}_getInvalidInput(e){let n=this._getOrReturnCtx(e);return A(n,{code:T.invalid_type,expected:C.bigint,received:n.parsedType}),q}gte(e,n){return this.setLimit("min",e,!0,N.toString(n))}gt(e,n){return this.setLimit("min",e,!1,N.toString(n))}lte(e,n){return this.setLimit("max",e,!0,N.toString(n))}lt(e,n){return this.setLimit("max",e,!1,N.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:N.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:N.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:N.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:N.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:N.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:N.toString(n)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew Bn({checks:[],typeName:U.ZodBigInt,coerce:t?.coerce??!1,...H(t)});var Vn=class extends Y{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==C.boolean){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.boolean,received:r.parsedType}),q}return De(e.data)}};Vn.create=t=>new Vn({typeName:U.ZodBoolean,coerce:t?.coerce||!1,...H(t)});var Wn=class t extends Y{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==C.date){let i=this._getOrReturnCtx(e);return A(i,{code:T.invalid_type,expected:C.date,received:i.parsedType}),q}if(Number.isNaN(e.data.getTime())){let i=this._getOrReturnCtx(e);return A(i,{code:T.invalid_date}),q}let r=new Ae,s;for(let i of this._def.checks)i.kind==="min"?e.data.getTime()i.value&&(s=this._getOrReturnCtx(e,s),A(s,{code:T.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),r.dirty()):Z.assertNever(i);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}min(e,n){return this._addCheck({kind:"min",value:e.getTime(),message:N.toString(n)})}max(e,n){return this._addCheck({kind:"max",value:e.getTime(),message:N.toString(n)})}get minDate(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew Wn({checks:[],coerce:t?.coerce||!1,typeName:U.ZodDate,...H(t)});var Yr=class extends Y{_parse(e){if(this._getType(e)!==C.symbol){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.symbol,received:r.parsedType}),q}return De(e.data)}};Yr.create=t=>new Yr({typeName:U.ZodSymbol,...H(t)});var zn=class extends Y{_parse(e){if(this._getType(e)!==C.undefined){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.undefined,received:r.parsedType}),q}return De(e.data)}};zn.create=t=>new zn({typeName:U.ZodUndefined,...H(t)});var Hn=class extends Y{_parse(e){if(this._getType(e)!==C.null){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.null,received:r.parsedType}),q}return De(e.data)}};Hn.create=t=>new Hn({typeName:U.ZodNull,...H(t)});var dn=class extends Y{constructor(){super(...arguments),this._any=!0}_parse(e){return De(e.data)}};dn.create=t=>new dn({typeName:U.ZodAny,...H(t)});var Ft=class extends Y{constructor(){super(...arguments),this._unknown=!0}_parse(e){return De(e.data)}};Ft.create=t=>new Ft({typeName:U.ZodUnknown,...H(t)});var ft=class extends Y{_parse(e){let n=this._getOrReturnCtx(e);return A(n,{code:T.invalid_type,expected:C.never,received:n.parsedType}),q}};ft.create=t=>new ft({typeName:U.ZodNever,...H(t)});var Zr=class extends Y{_parse(e){if(this._getType(e)!==C.undefined){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.void,received:r.parsedType}),q}return De(e.data)}};Zr.create=t=>new Zr({typeName:U.ZodVoid,...H(t)});var qt=class t extends Y{_parse(e){let{ctx:n,status:r}=this._processInputParams(e),s=this._def;if(n.parsedType!==C.array)return A(n,{code:T.invalid_type,expected:C.array,received:n.parsedType}),q;if(s.exactLength!==null){let o=n.data.length>s.exactLength.value,a=n.data.lengths.maxLength.value&&(A(n,{code:T.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((o,a)=>s.type._parseAsync(new Xe(n,o,n.path,a)))).then(o=>Ae.mergeArray(r,o));let i=[...n.data].map((o,a)=>s.type._parseSync(new Xe(n,o,n.path,a)));return Ae.mergeArray(r,i)}get element(){return this._def.type}min(e,n){return new t({...this._def,minLength:{value:e,message:N.toString(n)}})}max(e,n){return new t({...this._def,maxLength:{value:e,message:N.toString(n)}})}length(e,n){return new t({...this._def,exactLength:{value:e,message:N.toString(n)}})}nonempty(e){return this.min(1,e)}};qt.create=(t,e)=>new qt({type:t,minLength:null,maxLength:null,exactLength:null,typeName:U.ZodArray,...H(e)});function Jr(t){if(t instanceof Ue){let e={};for(let n in t.shape){let r=t.shape[n];e[n]=Ze.create(Jr(r))}return new Ue({...t._def,shape:()=>e})}else return t instanceof qt?new qt({...t._def,type:Jr(t.element)}):t instanceof Ze?Ze.create(Jr(t.unwrap())):t instanceof Tt?Tt.create(Jr(t.unwrap())):t instanceof _t?_t.create(t.items.map(e=>Jr(e))):t}var Ue=class t extends Y{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),n=Z.objectKeys(e);return this._cached={shape:e,keys:n},this._cached}_parse(e){if(this._getType(e)!==C.object){let l=this._getOrReturnCtx(e);return A(l,{code:T.invalid_type,expected:C.object,received:l.parsedType}),q}let{status:r,ctx:s}=this._processInputParams(e),{shape:i,keys:o}=this._getCached(),a=[];if(!(this._def.catchall instanceof ft&&this._def.unknownKeys==="strip"))for(let l in s.data)o.includes(l)||a.push(l);let c=[];for(let l of o){let u=i[l],d=s.data[l];c.push({key:{status:"valid",value:l},value:u._parse(new Xe(s,d,s.path,l)),alwaysSet:l in s.data})}if(this._def.catchall instanceof ft){let l=this._def.unknownKeys;if(l==="passthrough")for(let u of a)c.push({key:{status:"valid",value:u},value:{status:"valid",value:s.data[u]}});else if(l==="strict")a.length>0&&(A(s,{code:T.unrecognized_keys,keys:a}),r.dirty());else if(l!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let l=this._def.catchall;for(let u of a){let d=s.data[u];c.push({key:{status:"valid",value:u},value:l._parse(new Xe(s,d,s.path,u)),alwaysSet:u in s.data})}}return s.common.async?Promise.resolve().then(async()=>{let l=[];for(let u of c){let d=await u.key,p=await u.value;l.push({key:d,value:p,alwaysSet:u.alwaysSet})}return l}).then(l=>Ae.mergeObjectSync(r,l)):Ae.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return N.errToObj,new t({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(n,r)=>{let s=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:N.errToObj(e).message??s}:{message:s}}}:{}})}strip(){return new t({...this._def,unknownKeys:"strip"})}passthrough(){return new t({...this._def,unknownKeys:"passthrough"})}extend(e){return new t({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new t({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:U.ZodObject})}setKey(e,n){return this.augment({[e]:n})}catchall(e){return new t({...this._def,catchall:e})}pick(e){let n={};for(let r of Z.objectKeys(e))e[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}omit(e){let n={};for(let r of Z.objectKeys(this.shape))e[r]||(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}deepPartial(){return Jr(this)}partial(e){let n={};for(let r of Z.objectKeys(this.shape)){let s=this.shape[r];e&&!e[r]?n[r]=s:n[r]=s.optional()}return new t({...this._def,shape:()=>n})}required(e){let n={};for(let r of Z.objectKeys(this.shape))if(e&&!e[r])n[r]=this.shape[r];else{let i=this.shape[r];for(;i instanceof Ze;)i=i._def.innerType;n[r]=i}return new t({...this._def,shape:()=>n})}keyof(){return sy(Z.objectKeys(this.shape))}};Ue.create=(t,e)=>new Ue({shape:()=>t,unknownKeys:"strip",catchall:ft.create(),typeName:U.ZodObject,...H(e)});Ue.strictCreate=(t,e)=>new Ue({shape:()=>t,unknownKeys:"strict",catchall:ft.create(),typeName:U.ZodObject,...H(e)});Ue.lazycreate=(t,e)=>new Ue({shape:t,unknownKeys:"strip",catchall:ft.create(),typeName:U.ZodObject,...H(e)});var Kn=class extends Y{_parse(e){let{ctx:n}=this._processInputParams(e),r=this._def.options;function s(i){for(let a of i)if(a.result.status==="valid")return a.result;for(let a of i)if(a.result.status==="dirty")return n.common.issues.push(...a.ctx.common.issues),a.result;let o=i.map(a=>new qe(a.ctx.common.issues));return A(n,{code:T.invalid_union,unionErrors:o}),q}if(n.common.async)return Promise.all(r.map(async i=>{let o={...n,common:{...n.common,issues:[]},parent:null};return{result:await i._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(s);{let i,o=[];for(let c of r){let l={...n,common:{...n.common,issues:[]},parent:null},u=c._parseSync({data:n.data,path:n.path,parent:l});if(u.status==="valid")return u;u.status==="dirty"&&!i&&(i={result:u,ctx:l}),l.common.issues.length&&o.push(l.common.issues)}if(i)return n.common.issues.push(...i.ctx.common.issues),i.result;let a=o.map(c=>new qe(c));return A(n,{code:T.invalid_union,unionErrors:a}),q}}get options(){return this._def.options}};Kn.create=(t,e)=>new Kn({options:t,typeName:U.ZodUnion,...H(e)});var jt=t=>t instanceof Yn?jt(t.schema):t instanceof Qe?jt(t.innerType()):t instanceof Zn?[t.value]:t instanceof Xn?t.options:t instanceof Qn?Z.objectValues(t.enum):t instanceof er?jt(t._def.innerType):t instanceof zn?[void 0]:t instanceof Hn?[null]:t instanceof Ze?[void 0,...jt(t.unwrap())]:t instanceof Tt?[null,...jt(t.unwrap())]:t instanceof Ei||t instanceof nr?jt(t.unwrap()):t instanceof tr?jt(t._def.innerType):[],Ra=class t extends Y{_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==C.object)return A(n,{code:T.invalid_type,expected:C.object,received:n.parsedType}),q;let r=this.discriminator,s=n.data[r],i=this.optionsMap.get(s);return i?n.common.async?i._parseAsync({data:n.data,path:n.path,parent:n}):i._parseSync({data:n.data,path:n.path,parent:n}):(A(n,{code:T.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),q)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,n,r){let s=new Map;for(let i of n){let o=jt(i.shape[e]);if(!o.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let a of o){if(s.has(a))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`);s.set(a,i)}}return new t({typeName:U.ZodDiscriminatedUnion,discriminator:e,options:n,optionsMap:s,...H(r)})}};function Vu(t,e){let n=St(t),r=St(e);if(t===e)return{valid:!0,data:t};if(n===C.object&&r===C.object){let s=Z.objectKeys(e),i=Z.objectKeys(t).filter(a=>s.indexOf(a)!==-1),o={...t,...e};for(let a of i){let c=Vu(t[a],e[a]);if(!c.valid)return{valid:!1};o[a]=c.data}return{valid:!0,data:o}}else if(n===C.array&&r===C.array){if(t.length!==e.length)return{valid:!1};let s=[];for(let i=0;i{if(xa(i)||xa(o))return q;let a=Vu(i.value,o.value);return a.valid?(($a(i)||$a(o))&&n.dirty(),{status:n.value,value:a.data}):(A(r,{code:T.invalid_intersection_types}),q)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([i,o])=>s(i,o)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};Jn.create=(t,e,n)=>new Jn({left:t,right:e,typeName:U.ZodIntersection,...H(n)});var _t=class t extends Y{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==C.array)return A(r,{code:T.invalid_type,expected:C.array,received:r.parsedType}),q;if(r.data.lengththis._def.items.length&&(A(r,{code:T.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());let i=[...r.data].map((o,a)=>{let c=this._def.items[a]||this._def.rest;return c?c._parse(new Xe(r,o,r.path,a)):null}).filter(o=>!!o);return r.common.async?Promise.all(i).then(o=>Ae.mergeArray(n,o)):Ae.mergeArray(n,i)}get items(){return this._def.items}rest(e){return new t({...this._def,rest:e})}};_t.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new _t({items:t,typeName:U.ZodTuple,rest:null,...H(e)})};var Aa=class t extends Y{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==C.object)return A(r,{code:T.invalid_type,expected:C.object,received:r.parsedType}),q;let s=[],i=this._def.keyType,o=this._def.valueType;for(let a in r.data)s.push({key:i._parse(new Xe(r,a,r.path,a)),value:o._parse(new Xe(r,r.data[a],r.path,a)),alwaysSet:a in r.data});return r.common.async?Ae.mergeObjectAsync(n,s):Ae.mergeObjectSync(n,s)}get element(){return this._def.valueType}static create(e,n,r){return n instanceof Y?new t({keyType:e,valueType:n,typeName:U.ZodRecord,...H(r)}):new t({keyType:un.create(),valueType:e,typeName:U.ZodRecord,...H(n)})}},Xr=class extends Y{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==C.map)return A(r,{code:T.invalid_type,expected:C.map,received:r.parsedType}),q;let s=this._def.keyType,i=this._def.valueType,o=[...r.data.entries()].map(([a,c],l)=>({key:s._parse(new Xe(r,a,r.path,[l,"key"])),value:i._parse(new Xe(r,c,r.path,[l,"value"]))}));if(r.common.async){let a=new Map;return Promise.resolve().then(async()=>{for(let c of o){let l=await c.key,u=await c.value;if(l.status==="aborted"||u.status==="aborted")return q;(l.status==="dirty"||u.status==="dirty")&&n.dirty(),a.set(l.value,u.value)}return{status:n.value,value:a}})}else{let a=new Map;for(let c of o){let l=c.key,u=c.value;if(l.status==="aborted"||u.status==="aborted")return q;(l.status==="dirty"||u.status==="dirty")&&n.dirty(),a.set(l.value,u.value)}return{status:n.value,value:a}}}};Xr.create=(t,e,n)=>new Xr({valueType:e,keyType:t,typeName:U.ZodMap,...H(n)});var Qr=class t extends Y{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==C.set)return A(r,{code:T.invalid_type,expected:C.set,received:r.parsedType}),q;let s=this._def;s.minSize!==null&&r.data.sizes.maxSize.value&&(A(r,{code:T.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),n.dirty());let i=this._def.valueType;function o(c){let l=new Set;for(let u of c){if(u.status==="aborted")return q;u.status==="dirty"&&n.dirty(),l.add(u.value)}return{status:n.value,value:l}}let a=[...r.data.values()].map((c,l)=>i._parse(new Xe(r,c,r.path,l)));return r.common.async?Promise.all(a).then(c=>o(c)):o(a)}min(e,n){return new t({...this._def,minSize:{value:e,message:N.toString(n)}})}max(e,n){return new t({...this._def,maxSize:{value:e,message:N.toString(n)}})}size(e,n){return this.min(e,n).max(e,n)}nonempty(e){return this.min(1,e)}};Qr.create=(t,e)=>new Qr({valueType:t,minSize:null,maxSize:null,typeName:U.ZodSet,...H(e)});var Ca=class t extends Y{constructor(){super(...arguments),this.validate=this.implement}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==C.function)return A(n,{code:T.invalid_type,expected:C.function,received:n.parsedType}),q;function r(a,c){return ki({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Hr(),Gt].filter(l=>!!l),issueData:{code:T.invalid_arguments,argumentsError:c}})}function s(a,c){return ki({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Hr(),Gt].filter(l=>!!l),issueData:{code:T.invalid_return_type,returnTypeError:c}})}let i={errorMap:n.common.contextualErrorMap},o=n.data;if(this._def.returns instanceof pn){let a=this;return De(async function(...c){let l=new qe([]),u=await a._def.args.parseAsync(c,i).catch(f=>{throw l.addIssue(r(c,f)),l}),d=await Reflect.apply(o,this,u);return await a._def.returns._def.type.parseAsync(d,i).catch(f=>{throw l.addIssue(s(d,f)),l})})}else{let a=this;return De(function(...c){let l=a._def.args.safeParse(c,i);if(!l.success)throw new qe([r(c,l.error)]);let u=Reflect.apply(o,this,l.data),d=a._def.returns.safeParse(u,i);if(!d.success)throw new qe([s(u,d.error)]);return d.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new t({...this._def,args:_t.create(e).rest(Ft.create())})}returns(e){return new t({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,n,r){return new t({args:e||_t.create([]).rest(Ft.create()),returns:n||Ft.create(),typeName:U.ZodFunction,...H(r)})}},Yn=class extends Y{get schema(){return this._def.getter()}_parse(e){let{ctx:n}=this._processInputParams(e);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}};Yn.create=(t,e)=>new Yn({getter:t,typeName:U.ZodLazy,...H(e)});var Zn=class extends Y{_parse(e){if(e.data!==this._def.value){let n=this._getOrReturnCtx(e);return A(n,{received:n.data,code:T.invalid_literal,expected:this._def.value}),q}return{status:"valid",value:e.data}}get value(){return this._def.value}};Zn.create=(t,e)=>new Zn({value:t,typeName:U.ZodLiteral,...H(e)});function sy(t,e){return new Xn({values:t,typeName:U.ZodEnum,...H(e)})}var Xn=class t extends Y{_parse(e){if(typeof e.data!="string"){let n=this._getOrReturnCtx(e),r=this._def.values;return A(n,{expected:Z.joinValues(r),received:n.parsedType,code:T.invalid_type}),q}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){let n=this._getOrReturnCtx(e),r=this._def.values;return A(n,{received:n.data,code:T.invalid_enum_value,options:r}),q}return De(e.data)}get options(){return this._def.values}get enum(){let e={};for(let n of this._def.values)e[n]=n;return e}get Values(){let e={};for(let n of this._def.values)e[n]=n;return e}get Enum(){let e={};for(let n of this._def.values)e[n]=n;return e}extract(e,n=this._def){return t.create(e,{...this._def,...n})}exclude(e,n=this._def){return t.create(this.options.filter(r=>!e.includes(r)),{...this._def,...n})}};Xn.create=sy;var Qn=class extends Y{_parse(e){let n=Z.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==C.string&&r.parsedType!==C.number){let s=Z.objectValues(n);return A(r,{expected:Z.joinValues(s),received:r.parsedType,code:T.invalid_type}),q}if(this._cache||(this._cache=new Set(Z.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){let s=Z.objectValues(n);return A(r,{received:r.data,code:T.invalid_enum_value,options:s}),q}return De(e.data)}get enum(){return this._def.values}};Qn.create=(t,e)=>new Qn({values:t,typeName:U.ZodNativeEnum,...H(e)});var pn=class extends Y{unwrap(){return this._def.type}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==C.promise&&n.common.async===!1)return A(n,{code:T.invalid_type,expected:C.promise,received:n.parsedType}),q;let r=n.parsedType===C.promise?n.data:Promise.resolve(n.data);return De(r.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}};pn.create=(t,e)=>new pn({type:t,typeName:U.ZodPromise,...H(e)});var Qe=class extends Y{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===U.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:n,ctx:r}=this._processInputParams(e),s=this._def.effect||null,i={addIssue:o=>{A(r,o),o.fatal?n.abort():n.dirty()},get path(){return r.path}};if(i.addIssue=i.addIssue.bind(i),s.type==="preprocess"){let o=s.transform(r.data,i);if(r.common.async)return Promise.resolve(o).then(async a=>{if(n.value==="aborted")return q;let c=await this._def.schema._parseAsync({data:a,path:r.path,parent:r});return c.status==="aborted"?q:c.status==="dirty"?qn(c.value):n.value==="dirty"?qn(c.value):c});{if(n.value==="aborted")return q;let a=this._def.schema._parseSync({data:o,path:r.path,parent:r});return a.status==="aborted"?q:a.status==="dirty"?qn(a.value):n.value==="dirty"?qn(a.value):a}}if(s.type==="refinement"){let o=a=>{let c=s.refinement(a,i);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return a};if(r.common.async===!1){let a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?q:(a.status==="dirty"&&n.dirty(),o(a.value),{status:n.value,value:a.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>a.status==="aborted"?q:(a.status==="dirty"&&n.dirty(),o(a.value).then(()=>({status:n.value,value:a.value}))))}if(s.type==="transform")if(r.common.async===!1){let o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ln(o))return q;let a=s.transform(o.value,i);if(a instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:a}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ln(o)?Promise.resolve(s.transform(o.value,i)).then(a=>({status:n.value,value:a})):q);Z.assertNever(s)}};Qe.create=(t,e,n)=>new Qe({schema:t,typeName:U.ZodEffects,effect:e,...H(n)});Qe.createWithPreprocess=(t,e,n)=>new Qe({schema:e,effect:{type:"preprocess",transform:t},typeName:U.ZodEffects,...H(n)});var Ze=class extends Y{_parse(e){return this._getType(e)===C.undefined?De(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Ze.create=(t,e)=>new Ze({innerType:t,typeName:U.ZodOptional,...H(e)});var Tt=class extends Y{_parse(e){return this._getType(e)===C.null?De(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Tt.create=(t,e)=>new Tt({innerType:t,typeName:U.ZodNullable,...H(e)});var er=class extends Y{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return n.parsedType===C.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}};er.create=(t,e)=>new er({innerType:t,typeName:U.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...H(e)});var tr=class extends Y{_parse(e){let{ctx:n}=this._processInputParams(e),r={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Kr(s)?s.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new qe(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new qe(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};tr.create=(t,e)=>new tr({innerType:t,typeName:U.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...H(e)});var es=class extends Y{_parse(e){if(this._getType(e)!==C.nan){let r=this._getOrReturnCtx(e);return A(r,{code:T.invalid_type,expected:C.nan,received:r.parsedType}),q}return{status:"valid",value:e.data}}};es.create=t=>new es({typeName:U.ZodNaN,...H(t)});var AC=Symbol("zod_brand"),Ei=class extends Y{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}},Si=class t extends Y{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{let i=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?q:i.status==="dirty"?(n.dirty(),qn(i.value)):this._def.out._parseAsync({data:i.value,path:r.path,parent:r})})();{let s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?q:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(e,n){return new t({in:e,out:n,typeName:U.ZodPipeline})}},nr=class extends Y{_parse(e){let n=this._def.innerType._parse(e),r=s=>(ln(s)&&(s.value=Object.freeze(s.value)),s);return Kr(n)?n.then(s=>r(s)):r(n)}unwrap(){return this._def.innerType}};nr.create=(t,e)=>new nr({innerType:t,typeName:U.ZodReadonly,...H(e)});function ey(t,e){let n=typeof t=="function"?t(e):typeof t=="string"?{message:t}:t;return typeof n=="string"?{message:n}:n}function iy(t,e={},n){return t?dn.create().superRefine((r,s)=>{let i=t(r);if(i instanceof Promise)return i.then(o=>{if(!o){let a=ey(e,r),c=a.fatal??n??!0;s.addIssue({code:"custom",...a,fatal:c})}});if(!i){let o=ey(e,r),a=o.fatal??n??!0;s.addIssue({code:"custom",...o,fatal:a})}}):dn.create()}var CC={object:Ue.lazycreate},U;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(U||(U={}));var PC=(t,e={message:`Input not instance of ${t.name}`})=>iy(n=>n instanceof t,e),oy=un.create,ay=Un.create,OC=es.create,IC=Bn.create,cy=Vn.create,DC=Wn.create,MC=Yr.create,NC=zn.create,LC=Hn.create,GC=dn.create,jC=Ft.create,FC=ft.create,qC=Zr.create,UC=qt.create,BC=Ue.create,VC=Ue.strictCreate,WC=Kn.create,zC=Ra.create,HC=Jn.create,KC=_t.create,JC=Aa.create,YC=Xr.create,ZC=Qr.create,XC=Ca.create,QC=Yn.create,eP=Zn.create,tP=Xn.create,nP=Qn.create,rP=pn.create,sP=Qe.create,iP=Ze.create,oP=Tt.create,aP=Qe.createWithPreprocess,cP=Si.create,lP=()=>oy().optional(),uP=()=>ay().optional(),dP=()=>cy().optional(),pP={string:(t=>un.create({...t,coerce:!0})),number:(t=>Un.create({...t,coerce:!0})),boolean:(t=>Vn.create({...t,coerce:!0})),bigint:(t=>Bn.create({...t,coerce:!0})),date:(t=>Wn.create({...t,coerce:!0}))};var fP=q;var ly=x.enum(["npm","pypi","go","cargo","maven","rubygems","nuget","packagist","hex","pub","swift","cocoapods","opam","conan","vcpkg","arduino"]);var Wu=x.object({mode:x.enum(["auto","approve"]).default("approve"),maxAutoRisk:x.enum(["none","low","medium","high"]).default("medium"),watchBranches:x.array(x.string()).default(["main","master","develop"]),ecosystems:x.array(ly).default([...ly.options]),ignore:x.array(x.string()).default([]),alwaysApprove:x.array(x.string()).default([]),triggerOn:x.object({major:x.boolean().default(!0),minor:x.boolean().default(!0),patch:x.boolean().default(!1),transitive:x.boolean().default(!1),dev:x.boolean().default(!1)}).default({}),evidence:x.object({githubReleases:x.boolean().default(!0),changelog:x.boolean().default(!0),typeSurface:x.boolean().default(!0),openapi:x.boolean().default(!0),openapiSpecs:x.array(x.string()).default([]),maxReleases:x.number().int().min(1).max(100).default(25)}).default({}),rationale:x.object({security:x.boolean().default(!0),maintenance:x.boolean().default(!0),summary:x.boolean().default(!0)}).default({}),licenses:x.object({enabled:x.boolean().default(!1),allow:x.array(x.string()).default([]),deny:x.array(x.string()).default([]),requireDeclared:x.boolean().default(!1)}).default({}),guardrails:x.object({protectedPaths:x.array(x.string()).default([".github/workflows/**","**/*.lock","infra/**","terraform/**","**/secrets/**"]),maxFilesChanged:x.number().int().min(1).default(50),maxDependenciesPerRun:x.number().int().min(1).default(10),requireEvidence:x.boolean().default(!0),minConfidence:x.enum(["low","medium","high"]).default("medium"),experimentalDispatchBelowMinConfidence:x.boolean().default(!1),forbidTestWeakening:x.boolean().default(!0)}).default({}),remediation:x.object({commitGranularity:x.enum(["per-breaking-change","per-dependency","single"]).default("per-breaking-change"),branchPrefix:x.string().default("drift/"),draftPr:x.boolean().optional(),model:x.string().optional(),customInstructions:x.string().default(""),awaitCompletion:x.object({enabled:x.boolean().default(!1),timeoutMinutes:x.number().int().min(1).max(360).default(20),pollIntervalSeconds:x.number().int().min(5).max(300).default(30)}).default({}),communityRecipes:x.boolean().default(!1)}).default({}),verification:x.object({behavioural:x.object({enabled:x.boolean().default(!1),sandbox:x.literal("required").default("required"),maxSymbols:x.number().int().min(1).max(100).default(10),maxCasesPerSymbol:x.number().int().min(1).max(100).default(20),timeoutSeconds:x.number().int().min(1).max(1800).default(120),network:x.boolean().default(!1),memoryMb:x.number().int().min(128).max(16384).default(1024),cpuLimit:x.number().min(.1).max(32).default(1),retainArtifacts:x.boolean().default(!1)}).default({})}).default({}),telemetry:x.object({enabled:x.boolean().default(!1),endpoint:x.string().url().optional(),installationId:x.string().optional(),rotationSalt:x.string().optional(),retentionDays:x.number().int().min(1).max(730).default(180)}).default({}),pullRequest:x.object({enabled:x.boolean().default(!0),confirm:x.enum(["ask","never"]).default("ask"),base:x.enum(["branched-from","default-branch"]).default("branched-from"),draft:x.boolean().optional(),labels:x.array(x.string()).default([]),reviewers:x.array(x.string()).default([]),branchTemplate:x.string().default("{prefix}upgrade-{summary}-{date}"),titleTemplate:x.string().default("chore(deps): upgrade {summary}"),coAuthor:x.boolean().default(!0)}).default({}),llm:x.object({enabled:x.boolean().default(!1),provider:x.enum(["anthropic"]).default("anthropic"),model:x.string().default("claude-opus-5"),effort:x.enum(["low","medium","high","xhigh","max"]).default("medium"),apiKeyEnv:x.string().default("ANTHROPIC_API_KEY")}).default({})}),ts=Wu.parse({});function uy(t){return t.pullRequest.draft??t.remediation.draftPr??!0}var Pa={none:0,low:1,medium:2,high:3};function zu(t,e){return Pa[t]<=Pa[e]}function dy(t,e){return Pa[t]-Pa[e]}var mP=[".github/drift.yml",".github/drift.yaml","drift.yml","drift.yaml"];function gP(t,e=null){let n=[];if(!t.trim())return{config:ts,path:e,problems:n};let r;try{r=(0,py.parse)(t)}catch(i){return n.push(`Could not parse ${e??"config"} as YAML: ${i.message}`),{config:ts,path:e,problems:n}}if(r==null)return{config:ts,path:e,problems:n};let s=Wu.safeParse(r);if(!s.success){for(let i of s.error.issues){let o=i.path.length?i.path.join("."):"(root)";n.push(`${o}: ${i.message}`)}return n.push("Falling back to Drift defaults (mode: approve)."),{config:ts,path:e,problems:n}}return{config:s.data,path:e,problems:n}}async function Oa(t){for(let e of mP){let n;try{n=await t(e)}catch{continue}if(n!==null)return gP(n,e)}return{config:ts,path:null,problems:[]}}function fn(){return typeof navigator=="object"&&"userAgent"in navigator?navigator.userAgent:typeof process=="object"&&process.version!==void 0?`Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`:""}function Ia(t,e,n,r){if(typeof n!="function")throw new Error("method for before hook must be a function");return r||(r={}),Array.isArray(e)?e.reverse().reduce((s,i)=>Ia.bind(null,t,i,s,r),n)():Promise.resolve().then(()=>t.registry[e]?t.registry[e].reduce((s,i)=>i.hook.bind(null,s,r),n)():n(r))}function fy(t,e,n,r){let s=r;t.registry[n]||(t.registry[n]=[]),e==="before"&&(r=(i,o)=>Promise.resolve().then(s.bind(null,o)).then(i.bind(null,o))),e==="after"&&(r=(i,o)=>{let a;return Promise.resolve().then(i.bind(null,o)).then(c=>(a=c,s(a,o))).then(()=>a)}),e==="error"&&(r=(i,o)=>Promise.resolve().then(i.bind(null,o)).catch(a=>s(a,o))),t.registry[n].push({hook:r,orig:s})}function my(t,e,n){if(!t.registry[e])return;let r=t.registry[e].map(s=>s.orig).indexOf(n);r!==-1&&t.registry[e].splice(r,1)}var gy=Function.bind,hy=gy.bind(gy);function yy(t,e,n){let r=hy(my,null).apply(null,n?[e,n]:[e]);t.api={remove:r},t.remove=r,["before","error","after","wrap"].forEach(s=>{let i=n?[e,s,n]:[e,s];t[s]=t.api[s]=hy(fy,null).apply(null,i)})}function hP(){let t=Symbol("Singular"),e={registry:{}},n=Ia.bind(null,e,t);return yy(n,e,t),n}function yP(){let t={registry:{}},e=Ia.bind(null,t);return yy(e,t),e}var by={Singular:hP,Collection:yP};var bP="0.0.0-development",wP=`octokit-endpoint.js/${bP} ${fn()}`,vP={method:"GET",baseUrl:"https://api.github.com",headers:{accept:"application/vnd.github.v3+json","user-agent":wP},mediaType:{format:""}};function kP(t){return t?Object.keys(t).reduce((e,n)=>(e[n.toLowerCase()]=t[n],e),{}):{}}function EP(t){if(typeof t!="object"||t===null||Object.prototype.toString.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);if(e===null)return!0;let n=Object.prototype.hasOwnProperty.call(e,"constructor")&&e.constructor;return typeof n=="function"&&n instanceof n&&Function.prototype.call(n)===Function.prototype.call(t)}function ky(t,e){let n=Object.assign({},t);return Object.keys(e).forEach(r=>{EP(e[r])?r in t?n[r]=ky(t[r],e[r]):Object.assign(n,{[r]:e[r]}):Object.assign(n,{[r]:e[r]})}),n}function wy(t){for(let e in t)t[e]===void 0&&delete t[e];return t}function Ku(t,e,n){if(typeof e=="string"){let[s,i]=e.split(" ");n=Object.assign(i?{method:s,url:i}:{url:s},n)}else n=Object.assign({},e);n.headers=kP(n.headers),wy(n),wy(n.headers);let r=ky(t||{},n);return n.url==="/graphql"&&(t&&t.mediaType.previews?.length&&(r.mediaType.previews=t.mediaType.previews.filter(s=>!r.mediaType.previews.includes(s)).concat(r.mediaType.previews)),r.mediaType.previews=(r.mediaType.previews||[]).map(s=>s.replace(/-preview/,""))),r}function SP(t,e){let n=/\?/.test(t)?"&":"?",r=Object.keys(e);return r.length===0?t:t+n+r.map(s=>s==="q"?"q="+e.q.split("+").map(encodeURIComponent).join("+"):`${s}=${encodeURIComponent(e[s])}`).join("&")}var _P=/\{[^{}}]+\}/g;function TP(t){return t.replace(/(?:^\W+)|(?:(?n.concat(r),[]):[]}function vy(t,e){let n={__proto__:null};for(let r of Object.keys(t))e.indexOf(r)===-1&&(n[r]=t[r]);return n}function Ey(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(e){return/%[0-9A-Fa-f]/.test(e)||(e=encodeURI(e).replace(/%5B/g,"[").replace(/%5D/g,"]")),e}).join("")}function rs(t){return encodeURIComponent(t).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function _i(t,e,n){return e=t==="+"||t==="#"?Ey(e):rs(e),n?rs(n)+"="+e:e}function ns(t){return t!=null}function Hu(t){return t===";"||t==="&"||t==="?"}function $P(t,e,n,r){var s=t[n],i=[];if(ns(s)&&s!=="")if(typeof s=="string"||typeof s=="number"||typeof s=="bigint"||typeof s=="boolean")s=s.toString(),r&&r!=="*"&&(s=s.substring(0,parseInt(r,10))),i.push(_i(e,s,Hu(e)?n:""));else if(r==="*")Array.isArray(s)?s.filter(ns).forEach(function(o){i.push(_i(e,o,Hu(e)?n:""))}):Object.keys(s).forEach(function(o){ns(s[o])&&i.push(_i(e,s[o],o))});else{let o=[];Array.isArray(s)?s.filter(ns).forEach(function(a){o.push(_i(e,a))}):Object.keys(s).forEach(function(a){ns(s[a])&&(o.push(rs(a)),o.push(_i(e,s[a].toString())))}),Hu(e)?i.push(rs(n)+"="+o.join(",")):o.length!==0&&i.push(o.join(","))}else e===";"?ns(s)&&i.push(rs(n)):s===""&&(e==="&"||e==="?")?i.push(rs(n)+"="):s===""&&i.push("");return i}function RP(t){return{expand:AP.bind(null,t)}}function AP(t,e){var n=["+","#",".","/",";","?","&"];return t=t.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g,function(r,s,i){if(s){let a="",c=[];if(n.indexOf(s.charAt(0))!==-1&&(a=s.charAt(0),s=s.substr(1)),s.split(/,/g).forEach(function(l){var u=/([^:\*]*)(?::(\d+)|(\*))?/.exec(l);c.push($P(e,a,u[1],u[2]||u[3]))}),a&&a!=="+"){var o=",";return a==="?"?o="&":a!=="#"&&(o=a),(c.length!==0?a:"")+c.join(o)}else return c.join(",")}else return Ey(i)}),t==="/"?t:t.replace(/\/$/,"")}function Sy(t){let e=t.method.toUpperCase(),n=(t.url||"/").replace(/:([a-z]\w+)/g,"{$1}"),r=Object.assign({},t.headers),s,i=vy(t,["method","baseUrl","url","headers","request","mediaType"]),o=xP(n);n=RP(n).expand(i),/^http/.test(n)||(n=t.baseUrl+n);let a=Object.keys(t).filter(u=>o.includes(u)).concat("baseUrl"),c=vy(i,a);if(!/application\/octet-stream/i.test(r.accept)&&(t.mediaType.format&&(r.accept=r.accept.split(/,/).map(u=>u.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,`application/vnd$1$2.${t.mediaType.format}`)).join(",")),n.endsWith("/graphql")&&t.mediaType.previews?.length)){let u=r.accept.match(/(?{let p=t.mediaType.format?`.${t.mediaType.format}`:"+json";return`application/vnd.github.${d}-preview${p}`}).join(",")}return["GET","HEAD"].includes(e)?n=SP(n,c):"data"in c?s=c.data:Object.keys(c).length&&(s=c),!r["content-type"]&&typeof s<"u"&&(r["content-type"]="application/json; charset=utf-8"),["PATCH","PUT"].includes(e)&&typeof s>"u"&&(s=""),Object.assign({method:e,url:n,headers:r},typeof s<"u"?{body:s}:null,t.request?{request:t.request}:null)}function CP(t,e,n){return Sy(Ku(t,e,n))}function _y(t,e){let n=Ku(t,e),r=CP.bind(null,n);return Object.assign(r,{DEFAULTS:n,defaults:_y.bind(null,n),merge:Ku.bind(null,n),parse:Sy})}var Ty=_y(null,vP);var By=vt(Oy(),1);var FP=/^-?\d+$/,Na=/^-?\d+n+$/,mn=JSON.stringify,Xu=JSON.parse,Ly=/^-?\d+n$/,Iy=/([\[:])?"(-?\d+)n"($|\s*[,\}\]])/g,Dy=/([\[:])?("-?\d+n+)n("$|"\s*[,\}\]])/g,Qu=t=>t===void 0||typeof t=="function"||typeof t=="symbol",ed=t=>t!==null&&typeof t=="object"&&t.constructor&&t.constructor.name==="RawJSON",qP=(t,e,n)=>{let r="";typeof n=="number"?r=" ".repeat(Math.min(10,Math.max(0,Math.floor(n)))):typeof n=="string"&&(r=n.slice(0,10));let s=typeof e=="function",i=Array.isArray(e)?new Set(e.map(String)):null,o=(m,g,h)=>(h!==null&&typeof h=="object"&&typeof h.toJSON=="function"&&(h=h.toJSON(g)),typeof h=="string"&&Na.test(h)?h+"n":typeof h=="bigint"?"rawJSON"in JSON?JSON.rawJSON(h.toString()):h.toString()+"n":(s&&(h=e.call(m,g,h)),h!==null&&typeof h=="object"&&(h instanceof Number||h instanceof String||h instanceof Boolean)&&(h=h.valueOf()),h)),a=o({"":t},"",t);if(Qu(a))return;let c=a===null||typeof a!="object",l=ed(a);if(c||l)return mn(a);let u=[],d=0,p=[{parent:{"":a},key:"",val:a,isArray:Array.isArray(a),keys:Array.isArray(a)?null:Object.keys(a),index:0,first:!0}],f=new WeakSet([a]);for(;p.length>0;){let m=p[p.length-1];m.index===0&&(u.push(m.isArray?"[":"{"),d++);let g=!1;if(m.isArray)if(m.index=m.keys.length&&p[p.length-1]===m&&(g=!0)}g&&(d--,!m.first&&r&&u.push(` -`+r.repeat(d)),u.push(m.isArray?"]":"}"),f.delete(m.val),p.pop())}return u.join("")},Gy=(t,e,n)=>{try{return"rawJSON"in JSON?mn(t,(a,c)=>typeof c=="bigint"?JSON.rawJSON(c.toString()):typeof e=="function"?e(a,c):(Array.isArray(e)&&e.includes(a),c),n):t?mn(t,(a,c)=>typeof c=="string"&&Na.test(c)||typeof c=="bigint"?c.toString()+"n":typeof e=="function"?e(a,c):(Array.isArray(e)&&e.includes(a),c),n).replace(Iy,"$1$2$3").replace(Dy,"$1$2$3"):mn(t,e,n)}catch(r){if(r instanceof RangeError){let s=qP(t,e,n);return s===void 0?void 0:"rawJSON"in JSON?s:s.replace(Iy,"$1$2$3").replace(Dy,"$1$2$3")}throw r}},Ma=new Map,UP=()=>{let t=JSON.parse.toString();if(Ma.has(t))return Ma.get(t);try{let e=JSON.parse("1",(n,r,s)=>!!s?.source&&s.source==="1");return Ma.set(t,e),e}catch{return Ma.set(t,!1),!1}},BP=(t,e,n,r)=>typeof e=="string"&&Ly.test(e)?BigInt(e.slice(0,-1)):typeof e=="string"&&Na.test(e)?e.slice(0,-1):typeof r=="function"?r(t,e,n):e,VP=(t,e)=>JSON.parse(t,(n,r,s)=>{let i=typeof r=="number",o=r>Number.MAX_SAFE_INTEGER||r{let n={"":t},r=[{parent:n,key:"",visited:!1}];for(;r.length>0;){let s=r[r.length-1];if(s.visited){let{parent:i,key:o}=s,a=i[o];typeof a=="string"&&(Ly.test(a)?a=BigInt(a.slice(0,-1)):Na.test(a)&&(a=a.slice(0,-1))),typeof e=="function"&&(a=e.call(i,o,a)),a===void 0?delete i[o]:i[o]=a,r.pop()}else{s.visited=!0;let i=s.parent[s.key];if(i!==null&&typeof i=="object"){let a=Object.keys(i);for(let c=a.length-1;c>=0;c--)r.push({parent:i,key:a[c],visited:!1})}}}return n[""]},Ny=t=>t.replace(WP,(e,n,r,s)=>{let i=e[0]==='"';if(i&&zP.test(e))return e.substring(0,e.length-1)+'n"';let a=r||s,c=n&&(n.length{if(!t)return Xu(t,e);try{if(UP())return VP(t,e);let n=Ny(t);return Xu(n,(r,s,i)=>BP(r,s,i,e))}catch(n){if(n instanceof RangeError){let r=Ny(t),s=Xu(r);return HP(s,e)}throw n}};var rr=class extends Error{name;status;request;response;constructor(e,n,r){super(e,{cause:r.cause}),this.name="HttpError",this.status=Number.parseInt(n),Number.isNaN(this.status)&&(this.status=0);"response"in r&&(this.response=r.response);let s=Object.assign({},r.request);r.request.headers.authorization&&(s.headers=Object.assign({},r.request.headers,{authorization:r.request.headers.authorization.replace(/(?"";async function Uy(t){let e=t.request?.fetch||globalThis.fetch;if(!e)throw new Error("fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing");let n=t.request?.log||console,r=t.request?.parseSuccessResponseBody!==!1,s=YP(t.body)||Array.isArray(t.body)?Gy(t.body):t.body,i=Object.fromEntries(Object.entries(t.headers).map(([d,p])=>[d,String(p)])),o;try{o=await e(t.url,{method:t.method,body:s,redirect:t.request?.redirect,headers:i,signal:t.request?.signal,...t.body&&{duplex:"half"}})}catch(d){let p="Unknown Error";if(d instanceof Error){if(d.name==="AbortError")throw d.status=500,d;p=d.message,d.name==="TypeError"&&"cause"in d&&(d.cause instanceof Error?p=d.cause.message:typeof d.cause=="string"&&(p=d.cause))}let f=new rr(p,500,{request:t});throw f.cause=d,f}let a=o.status,c=o.url,l={};for(let[d,p]of o.headers)l[d]=p;let u={url:c,status:a,headers:l,data:""};if("deprecation"in l){let d=l.link&&l.link.match(/<([^<>]+)>; rel="deprecation"/),p=d&&d.pop();n.warn(`[@octokit/request] "${t.method} ${t.url}" is deprecated. It is scheduled to be removed on ${l.sunset}${p?`. See ${p}`:""}`)}if(a===204||a===205)return u;if(t.method==="HEAD"){if(a<400)return u;throw new rr(o.statusText,a,{response:u,request:t})}if(a===304)throw u.data=await td(o),new rr("Not modified",a,{response:u,request:t});if(a>=400)throw u.data=await td(o),new rr(XP(u.data),a,{response:u,request:t});return u.data=r?await td(o):o.body,u}async function td(t){let e=t.headers.get("content-type");if(!e)return t.text().catch(qy);let n=(0,By.parse)(e);if(ZP(n)){let r="";try{return r=await t.text(),Fy(r)}catch{return r}}else return n.type.startsWith("text/")||n.parameters.charset?.toLowerCase()==="utf-8"&&n.type!=="application/octet-stream"?t.text().catch(qy):t.arrayBuffer().catch(()=>new ArrayBuffer(0))}function ZP(t){return t.type==="application/json"||t.type==="application/scim+json"}function XP(t){if(typeof t=="string")return t;if(t instanceof ArrayBuffer)return"Unknown error";if(typeof t=="object"&&t!==null&&"message"in t){let e=t,n="documentation_url"in e?` - ${e.documentation_url}`:"";return Array.isArray(e.errors)?`${e.message}: ${e.errors.map(r=>JSON.stringify(r)).join(", ")}${n}`:`${e.message}${n}`}return`Unknown error: ${JSON.stringify(t)}`}function nd(t,e){let n=t.defaults(e);return Object.assign(function(s,i){let o=n.merge(s,i);if(!o.request||!o.request.hook)return Uy(n.parse(o));let a=(c,l)=>Uy(n.parse(n.merge(c,l)));return Object.assign(a,{endpoint:n,defaults:nd.bind(null,n)}),o.request.hook(a,o)},{endpoint:n,defaults:nd.bind(null,n)})}var Ti=nd(Ty,JP);var QP="0.0.0-development";function eO(t){return`Request failed due to following response errors: +`);this.baseURL=i.baseURL,this.timeout=i.timeout??Pf.DEFAULT_TIMEOUT,this.logger=i.logger??console;let o="warn";this.logLevel=o,this.logLevel=Hp(i.logLevel,"ClientOptions.logLevel",this)??Hp(So("ANTHROPIC_LOG"),"process.env['ANTHROPIC_LOG']",this)??o,this.fetchOptions=i.fetchOptions,this.maxRetries=i.maxRetries??2,this.fetch=i.fetch??HS(),I(this,ul,JS,"f"),this._options=i,this.apiKey=n,this.authToken=r}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,authToken:this.authToken,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:n}){if(!(this.apiKey&&e.get("x-api-key"))&&!n.has("x-api-key")&&!(this.authToken&&e.get("authorization"))&&!n.has("authorization"))throw new Error('Could not resolve authentication method. Expected either apiKey or authToken to be set. Or for one of the "X-Api-Key" or "Authorization" headers to be explicitly omitted')}async authHeaders(e){return J([await this.apiKeyAuth(e),await this.bearerAuth(e)])}async apiKeyAuth(e){if(this.apiKey!=null)return J([{"X-Api-Key":this.apiKey}])}async bearerAuth(e){if(this.authToken!=null)return J([{Authorization:`Bearer ${this.authToken}`}])}stringifyQuery(e){return Object.entries(e).filter(([n,r])=>typeof r<"u").map(([n,r])=>{if(typeof r=="string"||typeof r=="number"||typeof r=="boolean")return`${encodeURIComponent(n)}=${encodeURIComponent(r)}`;if(r===null)return`${encodeURIComponent(n)}=`;throw new q(`Cannot stringify type ${typeof r}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join("&")}getUserAgent(){return`${this.constructor.name}/JS ${$n}`}defaultIdempotencyKey(){return`stainless-node-retry-${Gp()}`}makeStatusError(e,n,r,s){return Ae.generate(e,n,r,s)}buildURL(e,n,r){let s=!v(this,Af,"m",xx).call(this)&&r||this.baseURL,i=NS(e)?new URL(e):new URL(s+(s.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),o=this.defaultQuery();return LS(o)||(n={...o,...n}),typeof n=="object"&&n&&!Array.isArray(n)&&(i.search=this.stringifyQuery(n)),i.toString()}_calculateNonstreamingTimeout(e){if(3600*e/128e3>600)throw new q("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#streaming-responses for more details");return 600*1e3}async prepareOptions(e){}async prepareRequest(e,{url:n,options:r}){}get(e,n){return this.methodRequest("get",e,n)}post(e,n){return this.methodRequest("post",e,n)}patch(e,n){return this.methodRequest("patch",e,n)}put(e,n){return this.methodRequest("put",e,n)}delete(e,n){return this.methodRequest("delete",e,n)}methodRequest(e,n,r){return this.request(Promise.resolve(r).then(s=>({method:e,path:n,...s})))}request(e,n=null){return new Rn(this,this.makeRequest(e,n,void 0))}async makeRequest(e,n,r){let s=await e,i=s.maxRetries??this.maxRetries;n==null&&(n=i),await this.prepareOptions(s);let{req:o,url:a,timeout:c}=await this.buildRequest(s,{retryCount:i-n});await this.prepareRequest(o,{url:a,options:s});let l="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),u=r===void 0?"":`, retryOf: ${r}`,d=Date.now();if(Ie(this).debug(`[${l}] sending request`,Jt({retryOfRequestLogID:r,method:s.method,url:a,options:s,headers:o.headers})),s.signal?.aborted)throw new Pe;let p=new AbortController,f=await this.fetchWithTimeout(a,o,c,p).catch(to),m=Date.now();if(f instanceof globalThis.Error){let y=`retrying, ${n} attempts remaining`;if(s.signal?.aborted)throw new Pe;let w=zt(f)||/timed? ?out/i.test(String(f)+("cause"in f?String(f.cause):""));if(n)return Ie(this).info(`[${l}] connection ${w?"timed out":"failed"} - ${y}`),Ie(this).debug(`[${l}] connection ${w?"timed out":"failed"} (${y})`,Jt({retryOfRequestLogID:r,url:a,durationMs:m-d,message:f.message})),this.retryRequest(s,n,r??l);throw Ie(this).info(`[${l}] connection ${w?"timed out":"failed"} - error; no more retries left`),Ie(this).debug(`[${l}] connection ${w?"timed out":"failed"} (error; no more retries left)`,Jt({retryOfRequestLogID:r,url:a,durationMs:m-d,message:f.message})),w?new kr:new Ht({cause:f})}let g=[...f.headers.entries()].filter(([y])=>y==="request-id").map(([y,w])=>", "+y+": "+JSON.stringify(w)).join(""),h=`[${l}${u}${g}] ${o.method} ${a} ${f.ok?"succeeded":"failed"} with status ${f.status} in ${m-d}ms`;if(!f.ok){let y=await this.shouldRetry(f);if(n&&y){let G=`retrying, ${n} attempts remaining`;return await KS(f.body),Ie(this).info(`${h} - ${G}`),Ie(this).debug(`[${l}] response error (${G})`,Jt({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,durationMs:m-d})),this.retryRequest(s,n,r??l,f.headers)}let w=y?"error; no more retries left":"error; not retryable";Ie(this).info(`${h} - ${w}`);let S=await f.text().catch(G=>to(G).message),b=Lc(S),k=b?void 0:S;throw Ie(this).debug(`[${l}] response error (${w})`,Jt({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,message:k,durationMs:Date.now()-d})),this.makeStatusError(f.status,b,k,f.headers)}return Ie(this).info(h),Ie(this).debug(`[${l}] response start`,Jt({retryOfRequestLogID:r,url:f.url,status:f.status,headers:f.headers,durationMs:m-d})),{response:f,options:s,controller:p,requestLogID:l,retryOfRequestLogID:r,startTime:d}}getAPIList(e,n,r){return this.requestAPIList(n,{method:"get",path:e,...r})}requestAPIList(e,n){let r=this.makeRequest(n,null,void 0);return new Cs(this,r,e)}async fetchWithTimeout(e,n,r,s){let{signal:i,method:o,...a}=n||{};i&&i.addEventListener("abort",()=>s.abort());let c=setTimeout(()=>s.abort(),r),l=globalThis.ReadableStream&&a.body instanceof globalThis.ReadableStream||typeof a.body=="object"&&a.body!==null&&Symbol.asyncIterator in a.body,u={signal:s.signal,...l?{duplex:"half"}:{},method:"GET",...a};o&&(u.method=o.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let n=e.headers.get("x-should-retry");return n==="true"?!0:n==="false"?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,n,r,s){let i,o=s?.get("retry-after-ms");if(o){let c=parseFloat(o);Number.isNaN(c)||(i=c)}let a=s?.get("retry-after");if(a&&!i){let c=parseFloat(a);Number.isNaN(c)?i=Date.parse(a)-Date.now():i=c*1e3}if(!(i&&0<=i&&i<60*1e3)){let c=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(n,c)}return await jS(i),this.makeRequest(e,n-1,r)}calculateDefaultRetryTimeoutMillis(e,n){let i=n-e,o=Math.min(.5*Math.pow(2,i),8),a=1-Math.random()*.25;return o*a*1e3}calculateNonstreamingTimeout(e,n){if(36e5*e/128e3>6e5||n!=null&&e>n)throw new q("Streaming is required for operations that may take longer than 10 minutes. See https://github.com/anthropics/anthropic-sdk-typescript#long-requests for more details");return 6e5}async buildRequest(e,{retryCount:n=0}={}){let r={...e},{method:s,path:i,query:o,defaultBaseURL:a}=r,c=this.buildURL(i,o,a);"timeout"in r&&FS("timeout",r.timeout),r.timeout=r.timeout??this.timeout;let{bodyHeaders:l,body:u}=this.buildBody({options:r}),d=await this.buildHeaders({options:e,method:s,bodyHeaders:l,retryCount:n});return{req:{method:s,headers:d,...r.signal&&{signal:r.signal},...globalThis.ReadableStream&&u instanceof globalThis.ReadableStream&&{duplex:"half"},...u&&{body:u},...this.fetchOptions??{},...r.fetchOptions??{}},url:c,timeout:r.timeout}}async buildHeaders({options:e,method:n,bodyHeaders:r,retryCount:s}){let i={};this.idempotencyHeader&&n!=="get"&&(e.idempotencyKey||(e.idempotencyKey=this.defaultIdempotencyKey()),i[this.idempotencyHeader]=e.idempotencyKey);let o=J([i,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(s),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...zS(),...this._options.dangerouslyAllowBrowser?{"anthropic-dangerous-direct-browser-access":"true"}:void 0,"anthropic-version":"2023-06-01"},await this.authHeaders(e),this._options.defaultHeaders,r,e.headers]);return this.validateHeaders(o),o.values}buildBody({options:{body:e,headers:n}}){if(!e)return{bodyHeaders:void 0,body:void 0};let r=J([n]);return ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof DataView||typeof e=="string"&&r.values.has("content-type")||globalThis.Blob&&e instanceof globalThis.Blob||e instanceof FormData||e instanceof URLSearchParams||globalThis.ReadableStream&&e instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:e}:typeof e=="object"&&(Symbol.asyncIterator in e||Symbol.iterator in e&&"next"in e&&typeof e.next=="function")?{bodyHeaders:void 0,body:Gc(e)}:v(this,ul,"f").call(this,{body:e,headers:r})}};Pf=me,ul=new WeakMap,Af=new WeakSet,xx=function(){return this.baseURL!=="https://api.anthropic.com"};me.Anthropic=Pf;me.HUMAN_PROMPT=If;me.AI_PROMPT=Of;me.DEFAULT_TIMEOUT=6e5;me.AnthropicError=q;me.APIError=Ae;me.APIConnectionError=Ht;me.APIConnectionTimeoutError=kr;me.APIUserAbortError=Pe;me.NotFoundError=Tr;me.ConflictError=_r;me.RateLimitError=Rr;me.BadRequestError=Er;me.AuthenticationError=Sr;me.InternalServerError=Cr;me.PermissionDeniedError=xr;me.UnprocessableEntityError=$r;me.toFile=co;Qt=class extends me{constructor(){super(...arguments),this.completions=new Dr(this),this.messages=new Dn(this),this.models=new Mr(this),this.beta=new Et(this)}};Qt.Completions=Dr;Qt.Messages=Dn;Qt.Models=Mr;Qt.Beta=Et});var Tx={};Pl(Tx,{AI_PROMPT:()=>Of,APIConnectionError:()=>Ht,APIConnectionTimeoutError:()=>kr,APIError:()=>Ae,APIPromise:()=>Rn,APIUserAbortError:()=>Pe,Anthropic:()=>Qt,AnthropicError:()=>q,AuthenticationError:()=>Sr,BadRequestError:()=>Er,BaseAnthropic:()=>me,ConflictError:()=>_r,HUMAN_PROMPT:()=>If,InternalServerError:()=>Cr,NotFoundError:()=>Tr,PagePromise:()=>Cs,PermissionDeniedError:()=>xr,RateLimitError:()=>Rr,UnprocessableEntityError:()=>$r,default:()=>Qt,toFile:()=>co});var _x=W(()=>{Df();nf();Bc();Df();Nt();vt()});var Lm=require("node:fs/promises"),Gm=require("node:fs/promises");var Uy=mt($i(),1);var x={};Pl(x,{BRAND:()=>yP,DIRTY:()=>Wn,EMPTY_PATH:()=>JA,INVALID:()=>U,NEVER:()=>tI,OK:()=>Ge,ParseStatus:()=>De,Schema:()=>X,ZodAny:()=>fn,ZodArray:()=>Bt,ZodBigInt:()=>Hn,ZodBoolean:()=>Kn,ZodBranded:()=>Ci,ZodCatch:()=>ir,ZodDate:()=>Jn,ZodDefault:()=>sr,ZodDiscriminatedUnion:()=>Ga,ZodEffects:()=>nt,ZodEnum:()=>nr,ZodError:()=>Be,ZodFirstPartyTypeKind:()=>B,ZodFunction:()=>ja,ZodIntersection:()=>Qn,ZodIssueCode:()=>$,ZodLazy:()=>er,ZodLiteral:()=>tr,ZodMap:()=>is,ZodNaN:()=>as,ZodNativeEnum:()=>rr,ZodNever:()=>yt,ZodNull:()=>Zn,ZodNullable:()=>Rt,ZodNumber:()=>zn,ZodObject:()=>Ve,ZodOptional:()=>et,ZodParsedType:()=>P,ZodPipeline:()=>Ai,ZodPromise:()=>mn,ZodReadonly:()=>or,ZodRecord:()=>Fa,ZodSchema:()=>X,ZodSet:()=>os,ZodString:()=>pn,ZodSymbol:()=>rs,ZodTransformer:()=>nt,ZodTuple:()=>$t,ZodType:()=>X,ZodUndefined:()=>Yn,ZodUnion:()=>Xn,ZodUnknown:()=>Ut,ZodVoid:()=>ss,addIssueToContext:()=>C,any:()=>_P,array:()=>AP,bigint:()=>kP,boolean:()=>Gy,coerce:()=>eI,custom:()=>My,date:()=>EP,datetimeRegex:()=>Oy,defaultErrorMap:()=>jt,discriminatedUnion:()=>DP,effect:()=>zP,enum:()=>BP,function:()=>jP,getErrorMap:()=>es,getParsedType:()=>_t,instanceof:()=>wP,intersection:()=>MP,isAborted:()=>Na,isAsync:()=>ts,isDirty:()=>La,isValid:()=>dn,late:()=>bP,lazy:()=>qP,literal:()=>UP,makeIssue:()=>Ri,map:()=>GP,nan:()=>vP,nativeEnum:()=>VP,never:()=>RP,null:()=>TP,nullable:()=>KP,number:()=>Ly,object:()=>PP,objectUtil:()=>pd,oboolean:()=>QP,onumber:()=>XP,optional:()=>HP,ostring:()=>ZP,pipeline:()=>YP,preprocess:()=>JP,promise:()=>WP,quotelessJson:()=>zA,record:()=>LP,set:()=>FP,setErrorMap:()=>KA,strictObject:()=>IP,string:()=>Ny,symbol:()=>SP,transformer:()=>zP,tuple:()=>NP,undefined:()=>xP,union:()=>OP,unknown:()=>$P,util:()=>ee,void:()=>CP});var ee;(function(t){t.assertEqual=s=>{};function e(s){}t.assertIs=e;function n(s){throw new Error}t.assertNever=n,t.arrayToEnum=s=>{let i={};for(let o of s)i[o]=o;return i},t.getValidEnumValues=s=>{let i=t.objectKeys(s).filter(a=>typeof s[s[a]]!="number"),o={};for(let a of i)o[a]=s[a];return t.objectValues(o)},t.objectValues=s=>t.objectKeys(s).map(function(i){return s[i]}),t.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{let i=[];for(let o in s)Object.prototype.hasOwnProperty.call(s,o)&&i.push(o);return i},t.find=(s,i)=>{for(let o of s)if(i(o))return o},t.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,i=" | "){return s.map(o=>typeof o=="string"?`'${o}'`:o).join(i)}t.joinValues=r,t.jsonStringifyReplacer=(s,i)=>typeof i=="bigint"?i.toString():i})(ee||(ee={}));var pd;(function(t){t.mergeShapes=(e,n)=>({...e,...n})})(pd||(pd={}));var P=ee.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),_t=t=>{switch(typeof t){case"undefined":return P.undefined;case"string":return P.string;case"number":return Number.isNaN(t)?P.nan:P.number;case"boolean":return P.boolean;case"function":return P.function;case"bigint":return P.bigint;case"symbol":return P.symbol;case"object":return Array.isArray(t)?P.array:t===null?P.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?P.promise:typeof Map<"u"&&t instanceof Map?P.map:typeof Set<"u"&&t instanceof Set?P.set:typeof Date<"u"&&t instanceof Date?P.date:P.object;default:return P.unknown}};var $=ee.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),zA=t=>JSON.stringify(t,null,2).replace(/"([^"]+)":/g,"$1:"),Be=class t extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};let n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=e}format(e){let n=e||function(i){return i.message},r={_errors:[]},s=i=>{for(let o of i.issues)if(o.code==="invalid_union")o.unionErrors.map(s);else if(o.code==="invalid_return_type")s(o.returnTypeError);else if(o.code==="invalid_arguments")s(o.argumentsError);else if(o.path.length===0)r._errors.push(n(o));else{let a=r,c=0;for(;cn.message){let n={},r=[];for(let s of this.issues)if(s.path.length>0){let i=s.path[0];n[i]=n[i]||[],n[i].push(e(s))}else r.push(e(s));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}};Be.create=t=>new Be(t);var HA=(t,e)=>{let n;switch(t.code){case $.invalid_type:t.received===P.undefined?n="Required":n=`Expected ${t.expected}, received ${t.received}`;break;case $.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(t.expected,ee.jsonStringifyReplacer)}`;break;case $.unrecognized_keys:n=`Unrecognized key(s) in object: ${ee.joinValues(t.keys,", ")}`;break;case $.invalid_union:n="Invalid input";break;case $.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${ee.joinValues(t.options)}`;break;case $.invalid_enum_value:n=`Invalid enum value. Expected ${ee.joinValues(t.options)}, received '${t.received}'`;break;case $.invalid_arguments:n="Invalid function arguments";break;case $.invalid_return_type:n="Invalid function return type";break;case $.invalid_date:n="Invalid date";break;case $.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(n=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?n=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?n=`Invalid input: must end with "${t.validation.endsWith}"`:ee.assertNever(t.validation):t.validation!=="regex"?n=`Invalid ${t.validation}`:n="Invalid";break;case $.too_small:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:n="Invalid input";break;case $.too_big:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?n=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:n="Invalid input";break;case $.custom:n="Invalid input";break;case $.invalid_intersection_types:n="Intersection results could not be merged";break;case $.not_multiple_of:n=`Number must be a multiple of ${t.multipleOf}`;break;case $.not_finite:n="Number must be finite";break;default:n=e.defaultError,ee.assertNever(t)}return{message:n}},jt=HA;var Ry=jt;function KA(t){Ry=t}function es(){return Ry}var Ri=t=>{let{data:e,path:n,errorMaps:r,issueData:s}=t,i=[...n,...s.path||[]],o={...s,path:i};if(s.message!==void 0)return{...s,path:i,message:s.message};let a="",c=r.filter(l=>!!l).slice().reverse();for(let l of c)a=l(o,{data:e,defaultError:a}).message;return{...s,path:i,message:a}},JA=[];function C(t,e){let n=es(),r=Ri({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,n,n===jt?void 0:jt].filter(s=>!!s)});t.common.issues.push(r)}var De=class t{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,n){let r=[];for(let s of n){if(s.status==="aborted")return U;s.status==="dirty"&&e.dirty(),r.push(s.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,n){let r=[];for(let s of n){let i=await s.key,o=await s.value;r.push({key:i,value:o})}return t.mergeObjectSync(e,r)}static mergeObjectSync(e,n){let r={};for(let s of n){let{key:i,value:o}=s;if(i.status==="aborted"||o.status==="aborted")return U;i.status==="dirty"&&e.dirty(),o.status==="dirty"&&e.dirty(),i.value!=="__proto__"&&(typeof o.value<"u"||s.alwaysSet)&&(r[i.value]=o.value)}return{status:e.value,value:r}}},U=Object.freeze({status:"aborted"}),Wn=t=>({status:"dirty",value:t}),Ge=t=>({status:"valid",value:t}),Na=t=>t.status==="aborted",La=t=>t.status==="dirty",dn=t=>t.status==="valid",ts=t=>typeof Promise<"u"&&t instanceof Promise;var L;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(L||(L={}));var tt=class{constructor(e,n,r,s){this._cachedPath=[],this.parent=e,this.data=n,this._path=r,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},Cy=(t,e)=>{if(dn(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let n=new Be(t.common.issues);return this._error=n,this._error}}};function Z(t){if(!t)return{};let{errorMap:e,invalid_type_error:n,required_error:r,description:s}=t;if(e&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(o,a)=>{let{message:c}=t;return o.code==="invalid_enum_value"?{message:c??a.defaultError}:typeof a.data>"u"?{message:c??r??a.defaultError}:o.code!=="invalid_type"?{message:a.defaultError}:{message:c??n??a.defaultError}},description:s}}var X=class{get description(){return this._def.description}_getType(e){return _t(e.data)}_getOrReturnCtx(e,n){return n||{common:e.parent.common,data:e.data,parsedType:_t(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new De,ctx:{common:e.parent.common,data:e.data,parsedType:_t(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let n=this._parse(e);if(ts(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(e){let n=this._parse(e);return Promise.resolve(n)}parse(e,n){let r=this.safeParse(e,n);if(r.success)return r.data;throw r.error}safeParse(e,n){let r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_t(e)},s=this._parseSync({data:e,path:r.path,parent:r});return Cy(r,s)}"~validate"(e){let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_t(e)};if(!this["~standard"].async)try{let r=this._parseSync({data:e,path:[],parent:n});return dn(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:n}).then(r=>dn(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(e,n){let r=await this.safeParseAsync(e,n);if(r.success)return r.data;throw r.error}async safeParseAsync(e,n){let r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_t(e)},s=this._parse({data:e,path:r.path,parent:r}),i=await(ts(s)?s:Promise.resolve(s));return Cy(r,i)}refine(e,n){let r=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,i)=>{let o=e(s),a=()=>i.addIssue({code:$.custom,...r(s)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(a(),!1)):o?!0:(a(),!1)})}refinement(e,n){return this._refinement((r,s)=>e(r)?!0:(s.addIssue(typeof n=="function"?n(r,s):n),!1))}_refinement(e){return new nt({schema:this,typeName:B.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return et.create(this,this._def)}nullable(){return Rt.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Bt.create(this)}promise(){return mn.create(this,this._def)}or(e){return Xn.create([this,e],this._def)}and(e){return Qn.create(this,e,this._def)}transform(e){return new nt({...Z(this._def),schema:this,typeName:B.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let n=typeof e=="function"?e:()=>e;return new sr({...Z(this._def),innerType:this,defaultValue:n,typeName:B.ZodDefault})}brand(){return new Ci({typeName:B.ZodBranded,type:this,...Z(this._def)})}catch(e){let n=typeof e=="function"?e:()=>e;return new ir({...Z(this._def),innerType:this,catchValue:n,typeName:B.ZodCatch})}describe(e){let n=this.constructor;return new n({...this._def,description:e})}pipe(e){return Ai.create(this,e)}readonly(){return or.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},YA=/^c[^\s-]{8,}$/i,ZA=/^[0-9a-z]+$/,XA=/^[0-9A-HJKMNP-TV-Z]{26}$/i,QA=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,eP=/^[a-z0-9_-]{21}$/i,tP=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,nP=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,rP=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,sP="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",fd,iP=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,oP=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,aP=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,cP=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,lP=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,uP=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Py="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",dP=new RegExp(`^${Py}$`);function Iy(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);let n=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${n}`}function pP(t){return new RegExp(`^${Iy(t)}$`)}function Oy(t){let e=`${Py}T${Iy(t)}`,n=[];return n.push(t.local?"Z?":"Z"),t.offset&&n.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${n.join("|")})`,new RegExp(`^${e}$`)}function fP(t,e){return!!((e==="v4"||!e)&&iP.test(t)||(e==="v6"||!e)&&aP.test(t))}function mP(t,e){if(!tP.test(t))return!1;try{let[n]=t.split(".");if(!n)return!1;let r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(r));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||e&&s.alg!==e)}catch{return!1}}function gP(t,e){return!!((e==="v4"||!e)&&oP.test(t)||(e==="v6"||!e)&&cP.test(t))}var pn=class t extends X{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==P.string){let i=this._getOrReturnCtx(e);return C(i,{code:$.invalid_type,expected:P.string,received:i.parsedType}),U}let r=new De,s;for(let i of this._def.checks)if(i.kind==="min")e.data.lengthi.value&&(s=this._getOrReturnCtx(e,s),C(s,{code:$.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="length"){let o=e.data.length>i.value,a=e.data.lengthe.test(s),{validation:n,code:$.invalid_string,...L.errToObj(r)})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...L.errToObj(e)})}url(e){return this._addCheck({kind:"url",...L.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...L.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...L.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...L.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...L.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...L.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...L.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...L.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...L.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...L.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...L.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...L.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...L.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...L.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...L.errToObj(e)})}regex(e,n){return this._addCheck({kind:"regex",regex:e,...L.errToObj(n)})}includes(e,n){return this._addCheck({kind:"includes",value:e,position:n?.position,...L.errToObj(n?.message)})}startsWith(e,n){return this._addCheck({kind:"startsWith",value:e,...L.errToObj(n)})}endsWith(e,n){return this._addCheck({kind:"endsWith",value:e,...L.errToObj(n)})}min(e,n){return this._addCheck({kind:"min",value:e,...L.errToObj(n)})}max(e,n){return this._addCheck({kind:"max",value:e,...L.errToObj(n)})}length(e,n){return this._addCheck({kind:"length",value:e,...L.errToObj(n)})}nonempty(e){return this.min(1,L.errToObj(e))}trim(){return new t({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxLength(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew pn({checks:[],typeName:B.ZodString,coerce:t?.coerce??!1,...Z(t)});function hP(t,e){let n=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,s=n>r?n:r,i=Number.parseInt(t.toFixed(s).replace(".","")),o=Number.parseInt(e.toFixed(s).replace(".",""));return i%o/10**s}var zn=class t extends X{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==P.number){let i=this._getOrReturnCtx(e);return C(i,{code:$.invalid_type,expected:P.number,received:i.parsedType}),U}let r,s=new De;for(let i of this._def.checks)i.kind==="int"?ee.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),C(r,{code:$.invalid_type,expected:"integer",received:"float",message:i.message}),s.dirty()):i.kind==="min"?(i.inclusive?e.datai.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),C(r,{code:$.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),s.dirty()):i.kind==="multipleOf"?hP(e.data,i.value)!==0&&(r=this._getOrReturnCtx(e,r),C(r,{code:$.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):i.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),C(r,{code:$.not_finite,message:i.message}),s.dirty()):ee.assertNever(i);return{status:s.value,value:e.data}}gte(e,n){return this.setLimit("min",e,!0,L.toString(n))}gt(e,n){return this.setLimit("min",e,!1,L.toString(n))}lte(e,n){return this.setLimit("max",e,!0,L.toString(n))}lt(e,n){return this.setLimit("max",e,!1,L.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:L.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:L.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:L.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:L.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:L.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:L.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:L.toString(n)})}finite(e){return this._addCheck({kind:"finite",message:L.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:L.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:L.toString(e)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuee.kind==="int"||e.kind==="multipleOf"&&ee.isInteger(e.value))}get isFinite(){let e=null,n=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(e===null||r.valuenew zn({checks:[],typeName:B.ZodNumber,coerce:t?.coerce||!1,...Z(t)});var Hn=class t extends X{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==P.bigint)return this._getInvalidInput(e);let r,s=new De;for(let i of this._def.checks)i.kind==="min"?(i.inclusive?e.datai.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),C(r,{code:$.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),s.dirty()):i.kind==="multipleOf"?e.data%i.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),C(r,{code:$.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):ee.assertNever(i);return{status:s.value,value:e.data}}_getInvalidInput(e){let n=this._getOrReturnCtx(e);return C(n,{code:$.invalid_type,expected:P.bigint,received:n.parsedType}),U}gte(e,n){return this.setLimit("min",e,!0,L.toString(n))}gt(e,n){return this.setLimit("min",e,!1,L.toString(n))}lte(e,n){return this.setLimit("max",e,!0,L.toString(n))}lt(e,n){return this.setLimit("max",e,!1,L.toString(n))}setLimit(e,n,r,s){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:L.toString(s)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:L.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:L.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:L.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:L.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:L.toString(n)})}get minValue(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew Hn({checks:[],typeName:B.ZodBigInt,coerce:t?.coerce??!1,...Z(t)});var Kn=class extends X{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==P.boolean){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.boolean,received:r.parsedType}),U}return Ge(e.data)}};Kn.create=t=>new Kn({typeName:B.ZodBoolean,coerce:t?.coerce||!1,...Z(t)});var Jn=class t extends X{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==P.date){let i=this._getOrReturnCtx(e);return C(i,{code:$.invalid_type,expected:P.date,received:i.parsedType}),U}if(Number.isNaN(e.data.getTime())){let i=this._getOrReturnCtx(e);return C(i,{code:$.invalid_date}),U}let r=new De,s;for(let i of this._def.checks)i.kind==="min"?e.data.getTime()i.value&&(s=this._getOrReturnCtx(e,s),C(s,{code:$.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),r.dirty()):ee.assertNever(i);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}min(e,n){return this._addCheck({kind:"min",value:e.getTime(),message:L.toString(n)})}max(e,n){return this._addCheck({kind:"max",value:e.getTime(),message:L.toString(n)})}get minDate(){let e=null;for(let n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let n of this._def.checks)n.kind==="max"&&(e===null||n.valuenew Jn({checks:[],coerce:t?.coerce||!1,typeName:B.ZodDate,...Z(t)});var rs=class extends X{_parse(e){if(this._getType(e)!==P.symbol){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.symbol,received:r.parsedType}),U}return Ge(e.data)}};rs.create=t=>new rs({typeName:B.ZodSymbol,...Z(t)});var Yn=class extends X{_parse(e){if(this._getType(e)!==P.undefined){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.undefined,received:r.parsedType}),U}return Ge(e.data)}};Yn.create=t=>new Yn({typeName:B.ZodUndefined,...Z(t)});var Zn=class extends X{_parse(e){if(this._getType(e)!==P.null){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.null,received:r.parsedType}),U}return Ge(e.data)}};Zn.create=t=>new Zn({typeName:B.ZodNull,...Z(t)});var fn=class extends X{constructor(){super(...arguments),this._any=!0}_parse(e){return Ge(e.data)}};fn.create=t=>new fn({typeName:B.ZodAny,...Z(t)});var Ut=class extends X{constructor(){super(...arguments),this._unknown=!0}_parse(e){return Ge(e.data)}};Ut.create=t=>new Ut({typeName:B.ZodUnknown,...Z(t)});var yt=class extends X{_parse(e){let n=this._getOrReturnCtx(e);return C(n,{code:$.invalid_type,expected:P.never,received:n.parsedType}),U}};yt.create=t=>new yt({typeName:B.ZodNever,...Z(t)});var ss=class extends X{_parse(e){if(this._getType(e)!==P.undefined){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.void,received:r.parsedType}),U}return Ge(e.data)}};ss.create=t=>new ss({typeName:B.ZodVoid,...Z(t)});var Bt=class t extends X{_parse(e){let{ctx:n,status:r}=this._processInputParams(e),s=this._def;if(n.parsedType!==P.array)return C(n,{code:$.invalid_type,expected:P.array,received:n.parsedType}),U;if(s.exactLength!==null){let o=n.data.length>s.exactLength.value,a=n.data.lengths.maxLength.value&&(C(n,{code:$.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((o,a)=>s.type._parseAsync(new tt(n,o,n.path,a)))).then(o=>De.mergeArray(r,o));let i=[...n.data].map((o,a)=>s.type._parseSync(new tt(n,o,n.path,a)));return De.mergeArray(r,i)}get element(){return this._def.type}min(e,n){return new t({...this._def,minLength:{value:e,message:L.toString(n)}})}max(e,n){return new t({...this._def,maxLength:{value:e,message:L.toString(n)}})}length(e,n){return new t({...this._def,exactLength:{value:e,message:L.toString(n)}})}nonempty(e){return this.min(1,e)}};Bt.create=(t,e)=>new Bt({type:t,minLength:null,maxLength:null,exactLength:null,typeName:B.ZodArray,...Z(e)});function ns(t){if(t instanceof Ve){let e={};for(let n in t.shape){let r=t.shape[n];e[n]=et.create(ns(r))}return new Ve({...t._def,shape:()=>e})}else return t instanceof Bt?new Bt({...t._def,type:ns(t.element)}):t instanceof et?et.create(ns(t.unwrap())):t instanceof Rt?Rt.create(ns(t.unwrap())):t instanceof $t?$t.create(t.items.map(e=>ns(e))):t}var Ve=class t extends X{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),n=ee.objectKeys(e);return this._cached={shape:e,keys:n},this._cached}_parse(e){if(this._getType(e)!==P.object){let l=this._getOrReturnCtx(e);return C(l,{code:$.invalid_type,expected:P.object,received:l.parsedType}),U}let{status:r,ctx:s}=this._processInputParams(e),{shape:i,keys:o}=this._getCached(),a=[];if(!(this._def.catchall instanceof yt&&this._def.unknownKeys==="strip"))for(let l in s.data)o.includes(l)||a.push(l);let c=[];for(let l of o){let u=i[l],d=s.data[l];c.push({key:{status:"valid",value:l},value:u._parse(new tt(s,d,s.path,l)),alwaysSet:l in s.data})}if(this._def.catchall instanceof yt){let l=this._def.unknownKeys;if(l==="passthrough")for(let u of a)c.push({key:{status:"valid",value:u},value:{status:"valid",value:s.data[u]}});else if(l==="strict")a.length>0&&(C(s,{code:$.unrecognized_keys,keys:a}),r.dirty());else if(l!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let l=this._def.catchall;for(let u of a){let d=s.data[u];c.push({key:{status:"valid",value:u},value:l._parse(new tt(s,d,s.path,u)),alwaysSet:u in s.data})}}return s.common.async?Promise.resolve().then(async()=>{let l=[];for(let u of c){let d=await u.key,p=await u.value;l.push({key:d,value:p,alwaysSet:u.alwaysSet})}return l}).then(l=>De.mergeObjectSync(r,l)):De.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return L.errToObj,new t({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(n,r)=>{let s=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:L.errToObj(e).message??s}:{message:s}}}:{}})}strip(){return new t({...this._def,unknownKeys:"strip"})}passthrough(){return new t({...this._def,unknownKeys:"passthrough"})}extend(e){return new t({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new t({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:B.ZodObject})}setKey(e,n){return this.augment({[e]:n})}catchall(e){return new t({...this._def,catchall:e})}pick(e){let n={};for(let r of ee.objectKeys(e))e[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}omit(e){let n={};for(let r of ee.objectKeys(this.shape))e[r]||(n[r]=this.shape[r]);return new t({...this._def,shape:()=>n})}deepPartial(){return ns(this)}partial(e){let n={};for(let r of ee.objectKeys(this.shape)){let s=this.shape[r];e&&!e[r]?n[r]=s:n[r]=s.optional()}return new t({...this._def,shape:()=>n})}required(e){let n={};for(let r of ee.objectKeys(this.shape))if(e&&!e[r])n[r]=this.shape[r];else{let i=this.shape[r];for(;i instanceof et;)i=i._def.innerType;n[r]=i}return new t({...this._def,shape:()=>n})}keyof(){return Dy(ee.objectKeys(this.shape))}};Ve.create=(t,e)=>new Ve({shape:()=>t,unknownKeys:"strip",catchall:yt.create(),typeName:B.ZodObject,...Z(e)});Ve.strictCreate=(t,e)=>new Ve({shape:()=>t,unknownKeys:"strict",catchall:yt.create(),typeName:B.ZodObject,...Z(e)});Ve.lazycreate=(t,e)=>new Ve({shape:t,unknownKeys:"strip",catchall:yt.create(),typeName:B.ZodObject,...Z(e)});var Xn=class extends X{_parse(e){let{ctx:n}=this._processInputParams(e),r=this._def.options;function s(i){for(let a of i)if(a.result.status==="valid")return a.result;for(let a of i)if(a.result.status==="dirty")return n.common.issues.push(...a.ctx.common.issues),a.result;let o=i.map(a=>new Be(a.ctx.common.issues));return C(n,{code:$.invalid_union,unionErrors:o}),U}if(n.common.async)return Promise.all(r.map(async i=>{let o={...n,common:{...n.common,issues:[]},parent:null};return{result:await i._parseAsync({data:n.data,path:n.path,parent:o}),ctx:o}})).then(s);{let i,o=[];for(let c of r){let l={...n,common:{...n.common,issues:[]},parent:null},u=c._parseSync({data:n.data,path:n.path,parent:l});if(u.status==="valid")return u;u.status==="dirty"&&!i&&(i={result:u,ctx:l}),l.common.issues.length&&o.push(l.common.issues)}if(i)return n.common.issues.push(...i.ctx.common.issues),i.result;let a=o.map(c=>new Be(c));return C(n,{code:$.invalid_union,unionErrors:a}),U}}get options(){return this._def.options}};Xn.create=(t,e)=>new Xn({options:t,typeName:B.ZodUnion,...Z(e)});var qt=t=>t instanceof er?qt(t.schema):t instanceof nt?qt(t.innerType()):t instanceof tr?[t.value]:t instanceof nr?t.options:t instanceof rr?ee.objectValues(t.enum):t instanceof sr?qt(t._def.innerType):t instanceof Yn?[void 0]:t instanceof Zn?[null]:t instanceof et?[void 0,...qt(t.unwrap())]:t instanceof Rt?[null,...qt(t.unwrap())]:t instanceof Ci||t instanceof or?qt(t.unwrap()):t instanceof ir?qt(t._def.innerType):[],Ga=class t extends X{_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==P.object)return C(n,{code:$.invalid_type,expected:P.object,received:n.parsedType}),U;let r=this.discriminator,s=n.data[r],i=this.optionsMap.get(s);return i?n.common.async?i._parseAsync({data:n.data,path:n.path,parent:n}):i._parseSync({data:n.data,path:n.path,parent:n}):(C(n,{code:$.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),U)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,n,r){let s=new Map;for(let i of n){let o=qt(i.shape[e]);if(!o.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let a of o){if(s.has(a))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`);s.set(a,i)}}return new t({typeName:B.ZodDiscriminatedUnion,discriminator:e,options:n,optionsMap:s,...Z(r)})}};function md(t,e){let n=_t(t),r=_t(e);if(t===e)return{valid:!0,data:t};if(n===P.object&&r===P.object){let s=ee.objectKeys(e),i=ee.objectKeys(t).filter(a=>s.indexOf(a)!==-1),o={...t,...e};for(let a of i){let c=md(t[a],e[a]);if(!c.valid)return{valid:!1};o[a]=c.data}return{valid:!0,data:o}}else if(n===P.array&&r===P.array){if(t.length!==e.length)return{valid:!1};let s=[];for(let i=0;i{if(Na(i)||Na(o))return U;let a=md(i.value,o.value);return a.valid?((La(i)||La(o))&&n.dirty(),{status:n.value,value:a.data}):(C(r,{code:$.invalid_intersection_types}),U)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([i,o])=>s(i,o)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};Qn.create=(t,e,n)=>new Qn({left:t,right:e,typeName:B.ZodIntersection,...Z(n)});var $t=class t extends X{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==P.array)return C(r,{code:$.invalid_type,expected:P.array,received:r.parsedType}),U;if(r.data.lengththis._def.items.length&&(C(r,{code:$.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());let i=[...r.data].map((o,a)=>{let c=this._def.items[a]||this._def.rest;return c?c._parse(new tt(r,o,r.path,a)):null}).filter(o=>!!o);return r.common.async?Promise.all(i).then(o=>De.mergeArray(n,o)):De.mergeArray(n,i)}get items(){return this._def.items}rest(e){return new t({...this._def,rest:e})}};$t.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new $t({items:t,typeName:B.ZodTuple,rest:null,...Z(e)})};var Fa=class t extends X{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==P.object)return C(r,{code:$.invalid_type,expected:P.object,received:r.parsedType}),U;let s=[],i=this._def.keyType,o=this._def.valueType;for(let a in r.data)s.push({key:i._parse(new tt(r,a,r.path,a)),value:o._parse(new tt(r,r.data[a],r.path,a)),alwaysSet:a in r.data});return r.common.async?De.mergeObjectAsync(n,s):De.mergeObjectSync(n,s)}get element(){return this._def.valueType}static create(e,n,r){return n instanceof X?new t({keyType:e,valueType:n,typeName:B.ZodRecord,...Z(r)}):new t({keyType:pn.create(),valueType:e,typeName:B.ZodRecord,...Z(n)})}},is=class extends X{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==P.map)return C(r,{code:$.invalid_type,expected:P.map,received:r.parsedType}),U;let s=this._def.keyType,i=this._def.valueType,o=[...r.data.entries()].map(([a,c],l)=>({key:s._parse(new tt(r,a,r.path,[l,"key"])),value:i._parse(new tt(r,c,r.path,[l,"value"]))}));if(r.common.async){let a=new Map;return Promise.resolve().then(async()=>{for(let c of o){let l=await c.key,u=await c.value;if(l.status==="aborted"||u.status==="aborted")return U;(l.status==="dirty"||u.status==="dirty")&&n.dirty(),a.set(l.value,u.value)}return{status:n.value,value:a}})}else{let a=new Map;for(let c of o){let l=c.key,u=c.value;if(l.status==="aborted"||u.status==="aborted")return U;(l.status==="dirty"||u.status==="dirty")&&n.dirty(),a.set(l.value,u.value)}return{status:n.value,value:a}}}};is.create=(t,e,n)=>new is({valueType:e,keyType:t,typeName:B.ZodMap,...Z(n)});var os=class t extends X{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==P.set)return C(r,{code:$.invalid_type,expected:P.set,received:r.parsedType}),U;let s=this._def;s.minSize!==null&&r.data.sizes.maxSize.value&&(C(r,{code:$.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),n.dirty());let i=this._def.valueType;function o(c){let l=new Set;for(let u of c){if(u.status==="aborted")return U;u.status==="dirty"&&n.dirty(),l.add(u.value)}return{status:n.value,value:l}}let a=[...r.data.values()].map((c,l)=>i._parse(new tt(r,c,r.path,l)));return r.common.async?Promise.all(a).then(c=>o(c)):o(a)}min(e,n){return new t({...this._def,minSize:{value:e,message:L.toString(n)}})}max(e,n){return new t({...this._def,maxSize:{value:e,message:L.toString(n)}})}size(e,n){return this.min(e,n).max(e,n)}nonempty(e){return this.min(1,e)}};os.create=(t,e)=>new os({valueType:t,minSize:null,maxSize:null,typeName:B.ZodSet,...Z(e)});var ja=class t extends X{constructor(){super(...arguments),this.validate=this.implement}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==P.function)return C(n,{code:$.invalid_type,expected:P.function,received:n.parsedType}),U;function r(a,c){return Ri({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,es(),jt].filter(l=>!!l),issueData:{code:$.invalid_arguments,argumentsError:c}})}function s(a,c){return Ri({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,es(),jt].filter(l=>!!l),issueData:{code:$.invalid_return_type,returnTypeError:c}})}let i={errorMap:n.common.contextualErrorMap},o=n.data;if(this._def.returns instanceof mn){let a=this;return Ge(async function(...c){let l=new Be([]),u=await a._def.args.parseAsync(c,i).catch(f=>{throw l.addIssue(r(c,f)),l}),d=await Reflect.apply(o,this,u);return await a._def.returns._def.type.parseAsync(d,i).catch(f=>{throw l.addIssue(s(d,f)),l})})}else{let a=this;return Ge(function(...c){let l=a._def.args.safeParse(c,i);if(!l.success)throw new Be([r(c,l.error)]);let u=Reflect.apply(o,this,l.data),d=a._def.returns.safeParse(u,i);if(!d.success)throw new Be([s(u,d.error)]);return d.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new t({...this._def,args:$t.create(e).rest(Ut.create())})}returns(e){return new t({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,n,r){return new t({args:e||$t.create([]).rest(Ut.create()),returns:n||Ut.create(),typeName:B.ZodFunction,...Z(r)})}},er=class extends X{get schema(){return this._def.getter()}_parse(e){let{ctx:n}=this._processInputParams(e);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}};er.create=(t,e)=>new er({getter:t,typeName:B.ZodLazy,...Z(e)});var tr=class extends X{_parse(e){if(e.data!==this._def.value){let n=this._getOrReturnCtx(e);return C(n,{received:n.data,code:$.invalid_literal,expected:this._def.value}),U}return{status:"valid",value:e.data}}get value(){return this._def.value}};tr.create=(t,e)=>new tr({value:t,typeName:B.ZodLiteral,...Z(e)});function Dy(t,e){return new nr({values:t,typeName:B.ZodEnum,...Z(e)})}var nr=class t extends X{_parse(e){if(typeof e.data!="string"){let n=this._getOrReturnCtx(e),r=this._def.values;return C(n,{expected:ee.joinValues(r),received:n.parsedType,code:$.invalid_type}),U}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){let n=this._getOrReturnCtx(e),r=this._def.values;return C(n,{received:n.data,code:$.invalid_enum_value,options:r}),U}return Ge(e.data)}get options(){return this._def.values}get enum(){let e={};for(let n of this._def.values)e[n]=n;return e}get Values(){let e={};for(let n of this._def.values)e[n]=n;return e}get Enum(){let e={};for(let n of this._def.values)e[n]=n;return e}extract(e,n=this._def){return t.create(e,{...this._def,...n})}exclude(e,n=this._def){return t.create(this.options.filter(r=>!e.includes(r)),{...this._def,...n})}};nr.create=Dy;var rr=class extends X{_parse(e){let n=ee.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==P.string&&r.parsedType!==P.number){let s=ee.objectValues(n);return C(r,{expected:ee.joinValues(s),received:r.parsedType,code:$.invalid_type}),U}if(this._cache||(this._cache=new Set(ee.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){let s=ee.objectValues(n);return C(r,{received:r.data,code:$.invalid_enum_value,options:s}),U}return Ge(e.data)}get enum(){return this._def.values}};rr.create=(t,e)=>new rr({values:t,typeName:B.ZodNativeEnum,...Z(e)});var mn=class extends X{unwrap(){return this._def.type}_parse(e){let{ctx:n}=this._processInputParams(e);if(n.parsedType!==P.promise&&n.common.async===!1)return C(n,{code:$.invalid_type,expected:P.promise,received:n.parsedType}),U;let r=n.parsedType===P.promise?n.data:Promise.resolve(n.data);return Ge(r.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}};mn.create=(t,e)=>new mn({type:t,typeName:B.ZodPromise,...Z(e)});var nt=class extends X{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===B.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:n,ctx:r}=this._processInputParams(e),s=this._def.effect||null,i={addIssue:o=>{C(r,o),o.fatal?n.abort():n.dirty()},get path(){return r.path}};if(i.addIssue=i.addIssue.bind(i),s.type==="preprocess"){let o=s.transform(r.data,i);if(r.common.async)return Promise.resolve(o).then(async a=>{if(n.value==="aborted")return U;let c=await this._def.schema._parseAsync({data:a,path:r.path,parent:r});return c.status==="aborted"?U:c.status==="dirty"?Wn(c.value):n.value==="dirty"?Wn(c.value):c});{if(n.value==="aborted")return U;let a=this._def.schema._parseSync({data:o,path:r.path,parent:r});return a.status==="aborted"?U:a.status==="dirty"?Wn(a.value):n.value==="dirty"?Wn(a.value):a}}if(s.type==="refinement"){let o=a=>{let c=s.refinement(a,i);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return a};if(r.common.async===!1){let a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?U:(a.status==="dirty"&&n.dirty(),o(a.value),{status:n.value,value:a.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>a.status==="aborted"?U:(a.status==="dirty"&&n.dirty(),o(a.value).then(()=>({status:n.value,value:a.value}))))}if(s.type==="transform")if(r.common.async===!1){let o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!dn(o))return U;let a=s.transform(o.value,i);if(a instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:a}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>dn(o)?Promise.resolve(s.transform(o.value,i)).then(a=>({status:n.value,value:a})):U);ee.assertNever(s)}};nt.create=(t,e,n)=>new nt({schema:t,typeName:B.ZodEffects,effect:e,...Z(n)});nt.createWithPreprocess=(t,e,n)=>new nt({schema:e,effect:{type:"preprocess",transform:t},typeName:B.ZodEffects,...Z(n)});var et=class extends X{_parse(e){return this._getType(e)===P.undefined?Ge(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};et.create=(t,e)=>new et({innerType:t,typeName:B.ZodOptional,...Z(e)});var Rt=class extends X{_parse(e){return this._getType(e)===P.null?Ge(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Rt.create=(t,e)=>new Rt({innerType:t,typeName:B.ZodNullable,...Z(e)});var sr=class extends X{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return n.parsedType===P.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}};sr.create=(t,e)=>new sr({innerType:t,typeName:B.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...Z(e)});var ir=class extends X{_parse(e){let{ctx:n}=this._processInputParams(e),r={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return ts(s)?s.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new Be(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Be(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};ir.create=(t,e)=>new ir({innerType:t,typeName:B.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...Z(e)});var as=class extends X{_parse(e){if(this._getType(e)!==P.nan){let r=this._getOrReturnCtx(e);return C(r,{code:$.invalid_type,expected:P.nan,received:r.parsedType}),U}return{status:"valid",value:e.data}}};as.create=t=>new as({typeName:B.ZodNaN,...Z(t)});var yP=Symbol("zod_brand"),Ci=class extends X{_parse(e){let{ctx:n}=this._processInputParams(e),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}},Ai=class t extends X{_parse(e){let{status:n,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{let i=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?U:i.status==="dirty"?(n.dirty(),Wn(i.value)):this._def.out._parseAsync({data:i.value,path:r.path,parent:r})})();{let s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?U:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(e,n){return new t({in:e,out:n,typeName:B.ZodPipeline})}},or=class extends X{_parse(e){let n=this._def.innerType._parse(e),r=s=>(dn(s)&&(s.value=Object.freeze(s.value)),s);return ts(n)?n.then(s=>r(s)):r(n)}unwrap(){return this._def.innerType}};or.create=(t,e)=>new or({innerType:t,typeName:B.ZodReadonly,...Z(e)});function Ay(t,e){let n=typeof t=="function"?t(e):typeof t=="string"?{message:t}:t;return typeof n=="string"?{message:n}:n}function My(t,e={},n){return t?fn.create().superRefine((r,s)=>{let i=t(r);if(i instanceof Promise)return i.then(o=>{if(!o){let a=Ay(e,r),c=a.fatal??n??!0;s.addIssue({code:"custom",...a,fatal:c})}});if(!i){let o=Ay(e,r),a=o.fatal??n??!0;s.addIssue({code:"custom",...o,fatal:a})}}):fn.create()}var bP={object:Ve.lazycreate},B;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(B||(B={}));var wP=(t,e={message:`Input not instance of ${t.name}`})=>My(n=>n instanceof t,e),Ny=pn.create,Ly=zn.create,vP=as.create,kP=Hn.create,Gy=Kn.create,EP=Jn.create,SP=rs.create,xP=Yn.create,TP=Zn.create,_P=fn.create,$P=Ut.create,RP=yt.create,CP=ss.create,AP=Bt.create,PP=Ve.create,IP=Ve.strictCreate,OP=Xn.create,DP=Ga.create,MP=Qn.create,NP=$t.create,LP=Fa.create,GP=is.create,FP=os.create,jP=ja.create,qP=er.create,UP=tr.create,BP=nr.create,VP=rr.create,WP=mn.create,zP=nt.create,HP=et.create,KP=Rt.create,JP=nt.createWithPreprocess,YP=Ai.create,ZP=()=>Ny().optional(),XP=()=>Ly().optional(),QP=()=>Gy().optional(),eI={string:(t=>pn.create({...t,coerce:!0})),number:(t=>zn.create({...t,coerce:!0})),boolean:(t=>Kn.create({...t,coerce:!0})),bigint:(t=>Hn.create({...t,coerce:!0})),date:(t=>Jn.create({...t,coerce:!0}))};var tI=U;var Fy=x.enum(["npm","pypi","go","cargo","maven","rubygems","nuget","packagist","hex","pub","swift","cocoapods","opam","conan","vcpkg","arduino"]);var gd=x.object({mode:x.enum(["auto","approve"]).default("approve"),maxAutoRisk:x.enum(["none","low","medium","high"]).default("medium"),watchBranches:x.array(x.string()).default(["main","master","develop"]),ecosystems:x.array(Fy).default([...Fy.options]),ignore:x.array(x.string()).default([]),alwaysApprove:x.array(x.string()).default([]),triggerOn:x.object({major:x.boolean().default(!0),minor:x.boolean().default(!0),patch:x.boolean().default(!1),transitive:x.boolean().default(!1),dev:x.boolean().default(!0)}).default({}),evidence:x.object({githubReleases:x.boolean().default(!0),changelog:x.boolean().default(!0),typeSurface:x.boolean().default(!0),openapi:x.boolean().default(!0),openapiSpecs:x.array(x.string()).default([]),maxReleases:x.number().int().min(1).max(100).default(25)}).default({}),rationale:x.object({security:x.boolean().default(!0),maintenance:x.boolean().default(!0),summary:x.boolean().default(!0)}).default({}),licenses:x.object({enabled:x.boolean().default(!1),allow:x.array(x.string()).default([]),deny:x.array(x.string()).default([]),requireDeclared:x.boolean().default(!1)}).default({}),guardrails:x.object({protectedPaths:x.array(x.string()).default([".github/workflows/**","**/*.lock","infra/**","terraform/**","**/secrets/**"]),maxFilesChanged:x.number().int().min(1).default(50),maxDependenciesPerRun:x.number().int().min(1).default(10),requireEvidence:x.boolean().default(!0),minConfidence:x.enum(["low","medium","high"]).default("medium"),experimentalDispatchBelowMinConfidence:x.boolean().default(!1),forbidTestWeakening:x.boolean().default(!0)}).default({}),remediation:x.object({commitGranularity:x.enum(["per-breaking-change","per-dependency","single"]).default("per-breaking-change"),branchPrefix:x.string().default("drift/"),draftPr:x.boolean().optional(),model:x.string().optional(),customInstructions:x.string().default(""),awaitCompletion:x.object({enabled:x.boolean().default(!1),timeoutMinutes:x.number().int().min(1).max(360).default(20),pollIntervalSeconds:x.number().int().min(5).max(300).default(30)}).default({}),communityRecipes:x.boolean().default(!1)}).default({}),verification:x.object({behavioural:x.object({enabled:x.boolean().default(!1),sandbox:x.literal("required").default("required"),maxSymbols:x.number().int().min(1).max(100).default(10),maxCasesPerSymbol:x.number().int().min(1).max(100).default(20),timeoutSeconds:x.number().int().min(1).max(1800).default(120),network:x.boolean().default(!1),memoryMb:x.number().int().min(128).max(16384).default(1024),cpuLimit:x.number().min(.1).max(32).default(1),retainArtifacts:x.boolean().default(!1)}).default({})}).default({}),telemetry:x.object({enabled:x.boolean().default(!1),endpoint:x.string().url().optional(),installationId:x.string().optional(),rotationSalt:x.string().optional(),retentionDays:x.number().int().min(1).max(730).default(180)}).default({}),pullRequest:x.object({enabled:x.boolean().default(!0),confirm:x.enum(["ask","never"]).default("ask"),base:x.enum(["branched-from","default-branch"]).default("branched-from"),draft:x.boolean().optional(),labels:x.array(x.string()).default([]),reviewers:x.array(x.string()).default([]),branchTemplate:x.string().default("{prefix}upgrade-{summary}-{date}"),titleTemplate:x.string().default("chore(deps): upgrade {summary}"),coAuthor:x.boolean().default(!0)}).default({}),llm:x.object({enabled:x.boolean().default(!1),provider:x.enum(["anthropic"]).default("anthropic"),model:x.string().default("claude-opus-5"),effort:x.enum(["low","medium","high","xhigh","max"]).default("medium"),apiKeyEnv:x.string().default("ANTHROPIC_API_KEY")}).default({}),codeScanning:x.object({enabled:x.boolean().default(!0),includeInformational:x.boolean().default(!1),granularity:x.enum(["package","breakingChange","affectedSite"]).default("package"),createIssuesPerAlert:x.boolean().default(!1)}).default({}),issueCreation:x.object({default:x.enum(["issue","branch","both"]).default("issue"),granularity:x.enum(["package","change"]).default("package"),assignees:x.array(x.string()).default([])}).default({}),outdated:x.object({enabled:x.boolean().default(!1)}).default({})}),cs=gd.parse({});function jy(t){return t.pullRequest.draft??t.remediation.draftPr??!0}var qa={none:0,low:1,medium:2,high:3};function hd(t,e){return qa[t]<=qa[e]}function qy(t,e){return qa[t]-qa[e]}var nI=[".github/drift.yml",".github/drift.yaml","drift.yml","drift.yaml"];function rI(t,e=null){let n=[];if(!t.trim())return{config:cs,path:e,problems:n};let r;try{r=(0,Uy.parse)(t)}catch(i){return n.push(`Could not parse ${e??"config"} as YAML: ${i.message}`),{config:cs,path:e,problems:n}}if(r==null)return{config:cs,path:e,problems:n};let s=gd.safeParse(r);if(!s.success){for(let i of s.error.issues){let o=i.path.length?i.path.join("."):"(root)";n.push(`${o}: ${i.message}`)}return n.push("Falling back to Drift defaults (mode: approve)."),{config:cs,path:e,problems:n}}return{config:s.data,path:e,problems:n}}async function Ua(t){for(let e of nI){let n;try{n=await t(e)}catch{continue}if(n!==null)return rI(n,e)}return{config:cs,path:null,problems:[]}}var Db=require("node:zlib");function gn(){return typeof navigator=="object"&&"userAgent"in navigator?navigator.userAgent:typeof process=="object"&&process.version!==void 0?`Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`:""}function Ba(t,e,n,r){if(typeof n!="function")throw new Error("method for before hook must be a function");return r||(r={}),Array.isArray(e)?e.reverse().reduce((s,i)=>Ba.bind(null,t,i,s,r),n)():Promise.resolve().then(()=>t.registry[e]?t.registry[e].reduce((s,i)=>i.hook.bind(null,s,r),n)():n(r))}function By(t,e,n,r){let s=r;t.registry[n]||(t.registry[n]=[]),e==="before"&&(r=(i,o)=>Promise.resolve().then(s.bind(null,o)).then(i.bind(null,o))),e==="after"&&(r=(i,o)=>{let a;return Promise.resolve().then(i.bind(null,o)).then(c=>(a=c,s(a,o))).then(()=>a)}),e==="error"&&(r=(i,o)=>Promise.resolve().then(i.bind(null,o)).catch(a=>s(a,o))),t.registry[n].push({hook:r,orig:s})}function Vy(t,e,n){if(!t.registry[e])return;let r=t.registry[e].map(s=>s.orig).indexOf(n);r!==-1&&t.registry[e].splice(r,1)}var Wy=Function.bind,zy=Wy.bind(Wy);function Hy(t,e,n){let r=zy(Vy,null).apply(null,n?[e,n]:[e]);t.api={remove:r},t.remove=r,["before","error","after","wrap"].forEach(s=>{let i=n?[e,s,n]:[e,s];t[s]=t.api[s]=zy(By,null).apply(null,i)})}function sI(){let t=Symbol("Singular"),e={registry:{}},n=Ba.bind(null,e,t);return Hy(n,e,t),n}function iI(){let t={registry:{}},e=Ba.bind(null,t);return Hy(e,t),e}var Ky={Singular:sI,Collection:iI};var oI="0.0.0-development",aI=`octokit-endpoint.js/${oI} ${gn()}`,cI={method:"GET",baseUrl:"https://api.github.com",headers:{accept:"application/vnd.github.v3+json","user-agent":aI},mediaType:{format:""}};function lI(t){return t?Object.keys(t).reduce((e,n)=>(e[n.toLowerCase()]=t[n],e),{}):{}}function uI(t){if(typeof t!="object"||t===null||Object.prototype.toString.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);if(e===null)return!0;let n=Object.prototype.hasOwnProperty.call(e,"constructor")&&e.constructor;return typeof n=="function"&&n instanceof n&&Function.prototype.call(n)===Function.prototype.call(t)}function Zy(t,e){let n=Object.assign({},t);return Object.keys(e).forEach(r=>{uI(e[r])?r in t?n[r]=Zy(t[r],e[r]):Object.assign(n,{[r]:e[r]}):Object.assign(n,{[r]:e[r]})}),n}function Jy(t){for(let e in t)t[e]===void 0&&delete t[e];return t}function bd(t,e,n){if(typeof e=="string"){let[s,i]=e.split(" ");n=Object.assign(i?{method:s,url:i}:{url:s},n)}else n=Object.assign({},e);n.headers=lI(n.headers),Jy(n),Jy(n.headers);let r=Zy(t||{},n);return n.url==="/graphql"&&(t&&t.mediaType.previews?.length&&(r.mediaType.previews=t.mediaType.previews.filter(s=>!r.mediaType.previews.includes(s)).concat(r.mediaType.previews)),r.mediaType.previews=(r.mediaType.previews||[]).map(s=>s.replace(/-preview/,""))),r}function dI(t,e){let n=/\?/.test(t)?"&":"?",r=Object.keys(e);return r.length===0?t:t+n+r.map(s=>s==="q"?"q="+e.q.split("+").map(encodeURIComponent).join("+"):`${s}=${encodeURIComponent(e[s])}`).join("&")}var pI=/\{[^{}}]+\}/g;function fI(t){return t.replace(/(?:^\W+)|(?:(?n.concat(r),[]):[]}function Yy(t,e){let n={__proto__:null};for(let r of Object.keys(t))e.indexOf(r)===-1&&(n[r]=t[r]);return n}function Xy(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(e){return/%[0-9A-Fa-f]/.test(e)||(e=encodeURI(e).replace(/%5B/g,"[").replace(/%5D/g,"]")),e}).join("")}function us(t){return encodeURIComponent(t).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function Pi(t,e,n){return e=t==="+"||t==="#"?Xy(e):us(e),n?us(n)+"="+e:e}function ls(t){return t!=null}function yd(t){return t===";"||t==="&"||t==="?"}function gI(t,e,n,r){var s=t[n],i=[];if(ls(s)&&s!=="")if(typeof s=="string"||typeof s=="number"||typeof s=="bigint"||typeof s=="boolean")s=s.toString(),r&&r!=="*"&&(s=s.substring(0,parseInt(r,10))),i.push(Pi(e,s,yd(e)?n:""));else if(r==="*")Array.isArray(s)?s.filter(ls).forEach(function(o){i.push(Pi(e,o,yd(e)?n:""))}):Object.keys(s).forEach(function(o){ls(s[o])&&i.push(Pi(e,s[o],o))});else{let o=[];Array.isArray(s)?s.filter(ls).forEach(function(a){o.push(Pi(e,a))}):Object.keys(s).forEach(function(a){ls(s[a])&&(o.push(us(a)),o.push(Pi(e,s[a].toString())))}),yd(e)?i.push(us(n)+"="+o.join(",")):o.length!==0&&i.push(o.join(","))}else e===";"?ls(s)&&i.push(us(n)):s===""&&(e==="&"||e==="?")?i.push(us(n)+"="):s===""&&i.push("");return i}function hI(t){return{expand:yI.bind(null,t)}}function yI(t,e){var n=["+","#",".","/",";","?","&"];return t=t.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g,function(r,s,i){if(s){let a="",c=[];if(n.indexOf(s.charAt(0))!==-1&&(a=s.charAt(0),s=s.substr(1)),s.split(/,/g).forEach(function(l){var u=/([^:\*]*)(?::(\d+)|(\*))?/.exec(l);c.push(gI(e,a,u[1],u[2]||u[3]))}),a&&a!=="+"){var o=",";return a==="?"?o="&":a!=="#"&&(o=a),(c.length!==0?a:"")+c.join(o)}else return c.join(",")}else return Xy(i)}),t==="/"?t:t.replace(/\/$/,"")}function Qy(t){let e=t.method.toUpperCase(),n=(t.url||"/").replace(/:([a-z]\w+)/g,"{$1}"),r=Object.assign({},t.headers),s,i=Yy(t,["method","baseUrl","url","headers","request","mediaType"]),o=mI(n);n=hI(n).expand(i),/^http/.test(n)||(n=t.baseUrl+n);let a=Object.keys(t).filter(u=>o.includes(u)).concat("baseUrl"),c=Yy(i,a);if(!/application\/octet-stream/i.test(r.accept)&&(t.mediaType.format&&(r.accept=r.accept.split(/,/).map(u=>u.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,`application/vnd$1$2.${t.mediaType.format}`)).join(",")),n.endsWith("/graphql")&&t.mediaType.previews?.length)){let u=r.accept.match(/(?{let p=t.mediaType.format?`.${t.mediaType.format}`:"+json";return`application/vnd.github.${d}-preview${p}`}).join(",")}return["GET","HEAD"].includes(e)?n=dI(n,c):"data"in c?s=c.data:Object.keys(c).length&&(s=c),!r["content-type"]&&typeof s<"u"&&(r["content-type"]="application/json; charset=utf-8"),["PATCH","PUT"].includes(e)&&typeof s>"u"&&(s=""),Object.assign({method:e,url:n,headers:r},typeof s<"u"?{body:s}:null,t.request?{request:t.request}:null)}function bI(t,e,n){return Qy(bd(t,e,n))}function eb(t,e){let n=bd(t,e),r=bI.bind(null,n);return Object.assign(r,{DEFAULTS:n,defaults:eb.bind(null,n),merge:bd.bind(null,n),parse:Qy})}var tb=eb(null,cI);var wb=mt(cb(),1);var RI=/^-?\d+$/,za=/^-?\d+n+$/,hn=JSON.stringify,Ed=JSON.parse,fb=/^-?\d+n$/,lb=/([\[:])?"(-?\d+)n"($|\s*[,\}\]])/g,ub=/([\[:])?("-?\d+n+)n("$|"\s*[,\}\]])/g,Sd=t=>t===void 0||typeof t=="function"||typeof t=="symbol",xd=t=>t!==null&&typeof t=="object"&&t.constructor&&t.constructor.name==="RawJSON",CI=(t,e,n)=>{let r="";typeof n=="number"?r=" ".repeat(Math.min(10,Math.max(0,Math.floor(n)))):typeof n=="string"&&(r=n.slice(0,10));let s=typeof e=="function",i=Array.isArray(e)?new Set(e.map(String)):null,o=(m,g,h)=>(h!==null&&typeof h=="object"&&typeof h.toJSON=="function"&&(h=h.toJSON(g)),typeof h=="string"&&za.test(h)?h+"n":typeof h=="bigint"?"rawJSON"in JSON?JSON.rawJSON(h.toString()):h.toString()+"n":(s&&(h=e.call(m,g,h)),h!==null&&typeof h=="object"&&(h instanceof Number||h instanceof String||h instanceof Boolean)&&(h=h.valueOf()),h)),a=o({"":t},"",t);if(Sd(a))return;let c=a===null||typeof a!="object",l=xd(a);if(c||l)return hn(a);let u=[],d=0,p=[{parent:{"":a},key:"",val:a,isArray:Array.isArray(a),keys:Array.isArray(a)?null:Object.keys(a),index:0,first:!0}],f=new WeakSet([a]);for(;p.length>0;){let m=p[p.length-1];m.index===0&&(u.push(m.isArray?"[":"{"),d++);let g=!1;if(m.isArray)if(m.index=m.keys.length&&p[p.length-1]===m&&(g=!0)}g&&(d--,!m.first&&r&&u.push(` +`+r.repeat(d)),u.push(m.isArray?"]":"}"),f.delete(m.val),p.pop())}return u.join("")},mb=(t,e,n)=>{try{return"rawJSON"in JSON?hn(t,(a,c)=>typeof c=="bigint"?JSON.rawJSON(c.toString()):typeof e=="function"?e(a,c):(Array.isArray(e)&&e.includes(a),c),n):t?hn(t,(a,c)=>typeof c=="string"&&za.test(c)||typeof c=="bigint"?c.toString()+"n":typeof e=="function"?e(a,c):(Array.isArray(e)&&e.includes(a),c),n).replace(lb,"$1$2$3").replace(ub,"$1$2$3"):hn(t,e,n)}catch(r){if(r instanceof RangeError){let s=CI(t,e,n);return s===void 0?void 0:"rawJSON"in JSON?s:s.replace(lb,"$1$2$3").replace(ub,"$1$2$3")}throw r}},Wa=new Map,AI=()=>{let t=JSON.parse.toString();if(Wa.has(t))return Wa.get(t);try{let e=JSON.parse("1",(n,r,s)=>!!s?.source&&s.source==="1");return Wa.set(t,e),e}catch{return Wa.set(t,!1),!1}},PI=(t,e,n,r)=>typeof e=="string"&&fb.test(e)?BigInt(e.slice(0,-1)):typeof e=="string"&&za.test(e)?e.slice(0,-1):typeof r=="function"?r(t,e,n):e,II=(t,e)=>JSON.parse(t,(n,r,s)=>{let i=typeof r=="number",o=r>Number.MAX_SAFE_INTEGER||r{let n={"":t},r=[{parent:n,key:"",visited:!1}];for(;r.length>0;){let s=r[r.length-1];if(s.visited){let{parent:i,key:o}=s,a=i[o];typeof a=="string"&&(fb.test(a)?a=BigInt(a.slice(0,-1)):za.test(a)&&(a=a.slice(0,-1))),typeof e=="function"&&(a=e.call(i,o,a)),a===void 0?delete i[o]:i[o]=a,r.pop()}else{s.visited=!0;let i=s.parent[s.key];if(i!==null&&typeof i=="object"){let a=Object.keys(i);for(let c=a.length-1;c>=0;c--)r.push({parent:i,key:a[c],visited:!1})}}}return n[""]},pb=t=>t.replace(OI,(e,n,r,s)=>{let i=e[0]==='"';if(i&&DI.test(e))return e.substring(0,e.length-1)+'n"';let a=r||s,c=n&&(n.length{if(!t)return Ed(t,e);try{if(AI())return II(t,e);let n=pb(t);return Ed(n,(r,s,i)=>PI(r,s,i,e))}catch(n){if(n instanceof RangeError){let r=pb(t),s=Ed(r);return MI(s,e)}throw n}};var ar=class extends Error{name;status;request;response;constructor(e,n,r){super(e,{cause:r.cause}),this.name="HttpError",this.status=Number.parseInt(n),Number.isNaN(this.status)&&(this.status=0);"response"in r&&(this.response=r.response);let s=Object.assign({},r.request);r.request.headers.authorization&&(s.headers=Object.assign({},r.request.headers,{authorization:r.request.headers.authorization.replace(/(?"";async function bb(t){let e=t.request?.fetch||globalThis.fetch;if(!e)throw new Error("fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing");let n=t.request?.log||console,r=t.request?.parseSuccessResponseBody!==!1,s=GI(t.body)||Array.isArray(t.body)?mb(t.body):t.body,i=Object.fromEntries(Object.entries(t.headers).map(([d,p])=>[d,String(p)])),o;try{o=await e(t.url,{method:t.method,body:s,redirect:t.request?.redirect,headers:i,signal:t.request?.signal,...t.body&&{duplex:"half"}})}catch(d){let p="Unknown Error";if(d instanceof Error){if(d.name==="AbortError")throw d.status=500,d;p=d.message,d.name==="TypeError"&&"cause"in d&&(d.cause instanceof Error?p=d.cause.message:typeof d.cause=="string"&&(p=d.cause))}let f=new ar(p,500,{request:t});throw f.cause=d,f}let a=o.status,c=o.url,l={};for(let[d,p]of o.headers)l[d]=p;let u={url:c,status:a,headers:l,data:""};if("deprecation"in l){let d=l.link&&l.link.match(/<([^<>]+)>; rel="deprecation"/),p=d&&d.pop();n.warn(`[@octokit/request] "${t.method} ${t.url}" is deprecated. It is scheduled to be removed on ${l.sunset}${p?`. See ${p}`:""}`)}if(a===204||a===205)return u;if(t.method==="HEAD"){if(a<400)return u;throw new ar(o.statusText,a,{response:u,request:t})}if(a===304)throw u.data=await Td(o),new ar("Not modified",a,{response:u,request:t});if(a>=400)throw u.data=await Td(o),new ar(jI(u.data),a,{response:u,request:t});return u.data=r?await Td(o):o.body,u}async function Td(t){let e=t.headers.get("content-type");if(!e)return t.text().catch(yb);let n=(0,wb.parse)(e);if(FI(n)){let r="";try{return r=await t.text(),hb(r)}catch{return r}}else return n.type.startsWith("text/")||n.parameters.charset?.toLowerCase()==="utf-8"&&n.type!=="application/octet-stream"?t.text().catch(yb):t.arrayBuffer().catch(()=>new ArrayBuffer(0))}function FI(t){return t.type==="application/json"||t.type==="application/scim+json"}function jI(t){if(typeof t=="string")return t;if(t instanceof ArrayBuffer)return"Unknown error";if(typeof t=="object"&&t!==null&&"message"in t){let e=t,n="documentation_url"in e?` - ${e.documentation_url}`:"";return Array.isArray(e.errors)?`${e.message}: ${e.errors.map(r=>JSON.stringify(r)).join(", ")}${n}`:`${e.message}${n}`}return`Unknown error: ${JSON.stringify(t)}`}function _d(t,e){let n=t.defaults(e);return Object.assign(function(s,i){let o=n.merge(s,i);if(!o.request||!o.request.hook)return bb(n.parse(o));let a=(c,l)=>bb(n.parse(n.merge(c,l)));return Object.assign(a,{endpoint:n,defaults:_d.bind(null,n)}),o.request.hook(a,o)},{endpoint:n,defaults:_d.bind(null,n)})}var Ii=_d(tb,LI);var qI="0.0.0-development";function UI(t){return`Request failed due to following response errors: `+t.errors.map(e=>` - ${e.message}`).join(` -`)}var tO=class extends Error{constructor(t,e,n){super(eO(n)),this.request=t,this.headers=e,this.response=n,this.errors=n.errors,this.data=n.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}request;headers;response;name="GraphqlResponseError";errors;data},nO=["method","baseUrl","url","headers","request","query","mediaType","operationName"],rO=["query","method","url"],Vy=/\/api\/v3\/?$/;function sO(t,e,n){if(n){if(typeof e=="string"&&"query"in n)return Promise.reject(new Error('[@octokit/graphql] "query" cannot be used as variable name'));for(let o in n)if(rO.includes(o))return Promise.reject(new Error(`[@octokit/graphql] "${o}" cannot be used as variable name`))}let r=typeof e=="string"?Object.assign({query:e},n):e,s=Object.keys(r).reduce((o,a)=>nO.includes(a)?(o[a]=r[a],o):(o.variables||(o.variables={}),o.variables[a]=r[a],o),{}),i=r.baseUrl||t.endpoint.DEFAULTS.baseUrl;return Vy.test(i)&&(s.url=i.replace(Vy,"/api/graphql")),t(s).then(o=>{if(o.data.errors){let a={};for(let c of Object.keys(o.headers))a[c]=o.headers[c];throw new tO(s,a,o.data)}return o.data.data})}function rd(t,e){let n=t.defaults(e);return Object.assign((s,i)=>sO(n,s,i),{defaults:rd.bind(null,n),endpoint:n.endpoint})}var Pz=rd(Ti,{headers:{"user-agent":`octokit-graphql.js/${QP} ${fn()}`},method:"POST",url:"/graphql"});function Wy(t){return rd(t,{method:"POST",url:"/graphql"})}var sd="(?:[a-zA-Z0-9_-]+)",zy="\\.",Hy=new RegExp(`^${sd}${zy}${sd}${zy}${sd}$`),iO=Hy.test.bind(Hy);async function oO(t){let e=iO(t),n=t.startsWith("v1.")||t.startsWith("ghs_"),r=t.startsWith("ghu_");return{type:"token",token:t,tokenType:e?"app":n?"installation":r?"user-to-server":"oauth"}}function aO(t){return t.split(/\./).length===3?`bearer ${t}`:`token ${t}`}async function cO(t,e,n,r){let s=e.endpoint.merge(n,r);return s.headers.authorization=aO(t),e(s)}var Ky=function(e){if(!e)throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");if(typeof e!="string")throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");return e=e.replace(/^(token|bearer) +/i,""),Object.assign(oO.bind(null,e),{hook:cO.bind(null,e)})};var id="7.0.7";var Jy=()=>{},lO=console.warn.bind(console),uO=console.error.bind(console);function dO(t={}){return typeof t.debug!="function"&&(t.debug=Jy),typeof t.info!="function"&&(t.info=Jy),typeof t.warn!="function"&&(t.warn=lO),typeof t.error!="function"&&(t.error=uO),t}var Yy=`octokit-core.js/${id} ${fn()}`,La=class{static VERSION=id;static defaults(e){return class extends this{constructor(...r){let s=r[0]||{};if(typeof e=="function"){super(e(s));return}super(Object.assign({},e,s,s.userAgent&&e.userAgent?{userAgent:`${s.userAgent} ${e.userAgent}`}:null))}}}static plugins=[];static plugin(...e){let n=this.plugins;return class extends this{static plugins=n.concat(e.filter(s=>!n.includes(s)))}}constructor(e={}){let n=new by.Collection,r={baseUrl:Ti.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:n.bind(null,"request")}),mediaType:{previews:[],format:""}};if(r.headers["user-agent"]=e.userAgent?`${e.userAgent} ${Yy}`:Yy,e.baseUrl&&(r.baseUrl=e.baseUrl),e.previews&&(r.mediaType.previews=e.previews),e.timeZone&&(r.headers["time-zone"]=e.timeZone),this.request=Ti.defaults(r),this.graphql=Wy(this.request).defaults(r),this.log=dO(e.log),this.hook=n,e.authStrategy){let{authStrategy:i,...o}=e,a=i(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:o},e.auth));n.wrap("request",a.hook),this.auth=a}else if(!e.auth)this.auth=async()=>({type:"unauthenticated"});else{let i=Ky(e.auth);n.wrap("request",i.hook),this.auth=i}let s=this.constructor;for(let i=0;i{t.log.debug("request",n);let r=Date.now(),s=t.request.endpoint.parse(n),i=s.url.replace(n.baseUrl,"");return e(n).then(o=>{let a=o.headers["x-github-request-id"];return t.log.info(`${s.method} ${i} - ${o.status} with id ${a} in ${Date.now()-r}ms`),o}).catch(o=>{let a=o.response?.headers["x-github-request-id"]||"UNKNOWN";throw t.log.error(`${s.method} ${i} - ${o.status} with id ${a} in ${Date.now()-r}ms`),o})})}od.VERSION=Zy;var pO="0.0.0-development";function fO(t){if(!t.data)return{...t,data:[]};if(!(("total_count"in t.data||"total_commits"in t.data)&&!("url"in t.data)))return t;let n=t.data.incomplete_results,r=t.data.repository_selection,s=t.data.total_count,i=t.data.total_commits;delete t.data.incomplete_results,delete t.data.repository_selection,delete t.data.total_count,delete t.data.total_commits;let o=Object.keys(t.data)[0],a=t.data[o];return t.data=a,typeof n<"u"&&(t.data.incomplete_results=n),typeof r<"u"&&(t.data.repository_selection=r),t.data.total_count=s,t.data.total_commits=i,t}function ad(t,e,n){let r=typeof e=="function"?e.endpoint(n):t.request.endpoint(e,n),s=typeof e=="function"?e:t.request,i=r.method,o=r.headers,a=r.url;return{[Symbol.asyncIterator]:()=>({async next(){if(!a)return{done:!0};try{let c=await s({method:i,url:a,headers:o}),l=fO(c);if(a=((l.headers.link||"").match(/<([^<>]+)>;\s*rel="next"/)||[])[1],!a&&"total_commits"in l.data){let u=new URL(l.url),d=u.searchParams,p=parseInt(d.get("page")||"1",10),f=parseInt(d.get("per_page")||"250",10);p*f{if(s.done)return e;let i=!1;function o(){i=!0}return e=e.concat(r?r(s.value,o):s.value.data),i?e:Qy(t,e,n,r)})}var Kz=Object.assign(Xy,{iterator:ad});function cd(t){return{paginate:Object.assign(Xy.bind(null,t),{iterator:ad.bind(null,t)})}}cd.VERSION=pO;var ld="17.0.0";var mO={actions:{addCustomLabelsToSelfHostedRunnerForOrg:["POST /orgs/{org}/actions/runners/{runner_id}/labels"],addCustomLabelsToSelfHostedRunnerForRepo:["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],addRepoAccessToSelfHostedRunnerGroupInOrg:["PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],approveWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"],cancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"],createEnvironmentVariable:["POST /repos/{owner}/{repo}/environments/{environment_name}/variables"],createHostedRunnerForOrg:["POST /orgs/{org}/actions/hosted-runners"],createOrUpdateEnvironmentSecret:["PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"],createOrgVariable:["POST /orgs/{org}/actions/variables"],createRegistrationTokenForOrg:["POST /orgs/{org}/actions/runners/registration-token"],createRegistrationTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/registration-token"],createRemoveTokenForOrg:["POST /orgs/{org}/actions/runners/remove-token"],createRemoveTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/remove-token"],createRepoVariable:["POST /repos/{owner}/{repo}/actions/variables"],createWorkflowDispatch:["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"],deleteActionsCacheById:["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],deleteActionsCacheByKey:["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],deleteArtifact:["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],deleteCustomImageFromOrg:["DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"],deleteCustomImageVersionFromOrg:["DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"],deleteEnvironmentSecret:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],deleteEnvironmentVariable:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],deleteHostedRunnerForOrg:["DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],deleteOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}"],deleteOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"],deleteRepoVariable:["DELETE /repos/{owner}/{repo}/actions/variables/{name}"],deleteSelfHostedRunnerFromOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}"],deleteSelfHostedRunnerFromRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"],deleteWorkflowRun:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],deleteWorkflowRunLogs:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],disableSelectedRepositoryGithubActionsOrganization:["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"],disableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"],downloadArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"],downloadJobLogsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"],downloadWorkflowRunAttemptLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"],downloadWorkflowRunLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],enableSelectedRepositoryGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"],enableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"],forceCancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"],generateRunnerJitconfigForOrg:["POST /orgs/{org}/actions/runners/generate-jitconfig"],generateRunnerJitconfigForRepo:["POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"],getActionsCacheList:["GET /repos/{owner}/{repo}/actions/caches"],getActionsCacheUsage:["GET /repos/{owner}/{repo}/actions/cache/usage"],getActionsCacheUsageByRepoForOrg:["GET /orgs/{org}/actions/cache/usage-by-repository"],getActionsCacheUsageForOrg:["GET /orgs/{org}/actions/cache/usage"],getAllowedActionsOrganization:["GET /orgs/{org}/actions/permissions/selected-actions"],getAllowedActionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"],getArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],getCustomImageForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"],getCustomImageVersionForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"],getCustomOidcSubClaimForRepo:["GET /repos/{owner}/{repo}/actions/oidc/customization/sub"],getEnvironmentPublicKey:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key"],getEnvironmentSecret:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],getEnvironmentVariable:["GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],getGithubActionsDefaultWorkflowPermissionsOrganization:["GET /orgs/{org}/actions/permissions/workflow"],getGithubActionsDefaultWorkflowPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/workflow"],getGithubActionsPermissionsOrganization:["GET /orgs/{org}/actions/permissions"],getGithubActionsPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions"],getHostedRunnerForOrg:["GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],getHostedRunnersGithubOwnedImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/github-owned"],getHostedRunnersLimitsForOrg:["GET /orgs/{org}/actions/hosted-runners/limits"],getHostedRunnersMachineSpecsForOrg:["GET /orgs/{org}/actions/hosted-runners/machine-sizes"],getHostedRunnersPartnerImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/partner"],getHostedRunnersPlatformsForOrg:["GET /orgs/{org}/actions/hosted-runners/platforms"],getJobForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],getOrgPublicKey:["GET /orgs/{org}/actions/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}"],getOrgVariable:["GET /orgs/{org}/actions/variables/{name}"],getPendingDeploymentsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],getRepoPermissions:["GET /repos/{owner}/{repo}/actions/permissions",{},{renamed:["actions","getGithubActionsPermissionsRepository"]}],getRepoPublicKey:["GET /repos/{owner}/{repo}/actions/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],getRepoVariable:["GET /repos/{owner}/{repo}/actions/variables/{name}"],getReviewsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"],getSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}"],getSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"],getWorkflow:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],getWorkflowAccessToRepository:["GET /repos/{owner}/{repo}/actions/permissions/access"],getWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],getWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],getWorkflowRunUsage:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"],getWorkflowUsage:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"],listArtifactsForRepo:["GET /repos/{owner}/{repo}/actions/artifacts"],listCustomImageVersionsForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions"],listCustomImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom"],listEnvironmentSecrets:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets"],listEnvironmentVariables:["GET /repos/{owner}/{repo}/environments/{environment_name}/variables"],listGithubHostedRunnersInGroupForOrg:["GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners"],listHostedRunnersForOrg:["GET /orgs/{org}/actions/hosted-runners"],listJobsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"],listJobsForWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],listLabelsForSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}/labels"],listLabelsForSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],listOrgSecrets:["GET /orgs/{org}/actions/secrets"],listOrgVariables:["GET /orgs/{org}/actions/variables"],listRepoOrganizationSecrets:["GET /repos/{owner}/{repo}/actions/organization-secrets"],listRepoOrganizationVariables:["GET /repos/{owner}/{repo}/actions/organization-variables"],listRepoSecrets:["GET /repos/{owner}/{repo}/actions/secrets"],listRepoVariables:["GET /repos/{owner}/{repo}/actions/variables"],listRepoWorkflows:["GET /repos/{owner}/{repo}/actions/workflows"],listRunnerApplicationsForOrg:["GET /orgs/{org}/actions/runners/downloads"],listRunnerApplicationsForRepo:["GET /repos/{owner}/{repo}/actions/runners/downloads"],listSelectedReposForOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"],listSelectedReposForOrgVariable:["GET /orgs/{org}/actions/variables/{name}/repositories"],listSelectedRepositoriesEnabledGithubActionsOrganization:["GET /orgs/{org}/actions/permissions/repositories"],listSelfHostedRunnersForOrg:["GET /orgs/{org}/actions/runners"],listSelfHostedRunnersForRepo:["GET /repos/{owner}/{repo}/actions/runners"],listWorkflowRunArtifacts:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"],listWorkflowRuns:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"],listWorkflowRunsForRepo:["GET /repos/{owner}/{repo}/actions/runs"],reRunJobForWorkflowRun:["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],reRunWorkflow:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],reRunWorkflowFailedJobs:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],removeAllCustomLabelsFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],removeAllCustomLabelsFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],removeCustomLabelFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],removeCustomLabelFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],reviewCustomGatesForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"],reviewPendingDeploymentsForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],setAllowedActionsOrganization:["PUT /orgs/{org}/actions/permissions/selected-actions"],setAllowedActionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"],setCustomLabelsForSelfHostedRunnerForOrg:["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],setCustomLabelsForSelfHostedRunnerForRepo:["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],setCustomOidcSubClaimForRepo:["PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"],setGithubActionsDefaultWorkflowPermissionsOrganization:["PUT /orgs/{org}/actions/permissions/workflow"],setGithubActionsDefaultWorkflowPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],setGithubActionsPermissionsOrganization:["PUT /orgs/{org}/actions/permissions"],setGithubActionsPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"],setSelectedReposForOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories"],setSelectedRepositoriesEnabledGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories"],setWorkflowAccessToRepository:["PUT /repos/{owner}/{repo}/actions/permissions/access"],updateEnvironmentVariable:["PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],updateHostedRunnerForOrg:["PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],updateOrgVariable:["PATCH /orgs/{org}/actions/variables/{name}"],updateRepoVariable:["PATCH /repos/{owner}/{repo}/actions/variables/{name}"]},activity:{checkRepoIsStarredByAuthenticatedUser:["GET /user/starred/{owner}/{repo}"],deleteRepoSubscription:["DELETE /repos/{owner}/{repo}/subscription"],deleteThreadSubscription:["DELETE /notifications/threads/{thread_id}/subscription"],getFeeds:["GET /feeds"],getRepoSubscription:["GET /repos/{owner}/{repo}/subscription"],getThread:["GET /notifications/threads/{thread_id}"],getThreadSubscriptionForAuthenticatedUser:["GET /notifications/threads/{thread_id}/subscription"],listEventsForAuthenticatedUser:["GET /users/{username}/events"],listNotificationsForAuthenticatedUser:["GET /notifications"],listOrgEventsForAuthenticatedUser:["GET /users/{username}/events/orgs/{org}"],listPublicEvents:["GET /events"],listPublicEventsForRepoNetwork:["GET /networks/{owner}/{repo}/events"],listPublicEventsForUser:["GET /users/{username}/events/public"],listPublicOrgEvents:["GET /orgs/{org}/events"],listReceivedEventsForUser:["GET /users/{username}/received_events"],listReceivedPublicEventsForUser:["GET /users/{username}/received_events/public"],listRepoEvents:["GET /repos/{owner}/{repo}/events"],listRepoNotificationsForAuthenticatedUser:["GET /repos/{owner}/{repo}/notifications"],listReposStarredByAuthenticatedUser:["GET /user/starred"],listReposStarredByUser:["GET /users/{username}/starred"],listReposWatchedByUser:["GET /users/{username}/subscriptions"],listStargazersForRepo:["GET /repos/{owner}/{repo}/stargazers"],listWatchedReposForAuthenticatedUser:["GET /user/subscriptions"],listWatchersForRepo:["GET /repos/{owner}/{repo}/subscribers"],markNotificationsAsRead:["PUT /notifications"],markRepoNotificationsAsRead:["PUT /repos/{owner}/{repo}/notifications"],markThreadAsDone:["DELETE /notifications/threads/{thread_id}"],markThreadAsRead:["PATCH /notifications/threads/{thread_id}"],setRepoSubscription:["PUT /repos/{owner}/{repo}/subscription"],setThreadSubscription:["PUT /notifications/threads/{thread_id}/subscription"],starRepoForAuthenticatedUser:["PUT /user/starred/{owner}/{repo}"],unstarRepoForAuthenticatedUser:["DELETE /user/starred/{owner}/{repo}"]},apps:{addRepoToInstallation:["PUT /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","addRepoToInstallationForAuthenticatedUser"]}],addRepoToInstallationForAuthenticatedUser:["PUT /user/installations/{installation_id}/repositories/{repository_id}"],checkToken:["POST /applications/{client_id}/token"],createFromManifest:["POST /app-manifests/{code}/conversions"],createInstallationAccessToken:["POST /app/installations/{installation_id}/access_tokens"],deleteAuthorization:["DELETE /applications/{client_id}/grant"],deleteInstallation:["DELETE /app/installations/{installation_id}"],deleteToken:["DELETE /applications/{client_id}/token"],getAuthenticated:["GET /app"],getBySlug:["GET /apps/{app_slug}"],getInstallation:["GET /app/installations/{installation_id}"],getOrgInstallation:["GET /orgs/{org}/installation"],getRepoInstallation:["GET /repos/{owner}/{repo}/installation"],getSubscriptionPlanForAccount:["GET /marketplace_listing/accounts/{account_id}"],getSubscriptionPlanForAccountStubbed:["GET /marketplace_listing/stubbed/accounts/{account_id}"],getUserInstallation:["GET /users/{username}/installation"],getWebhookConfigForApp:["GET /app/hook/config"],getWebhookDelivery:["GET /app/hook/deliveries/{delivery_id}"],listAccountsForPlan:["GET /marketplace_listing/plans/{plan_id}/accounts"],listAccountsForPlanStubbed:["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"],listInstallationReposForAuthenticatedUser:["GET /user/installations/{installation_id}/repositories"],listInstallationRequestsForAuthenticatedApp:["GET /app/installation-requests"],listInstallations:["GET /app/installations"],listInstallationsForAuthenticatedUser:["GET /user/installations"],listPlans:["GET /marketplace_listing/plans"],listPlansStubbed:["GET /marketplace_listing/stubbed/plans"],listReposAccessibleToInstallation:["GET /installation/repositories"],listSubscriptionsForAuthenticatedUser:["GET /user/marketplace_purchases"],listSubscriptionsForAuthenticatedUserStubbed:["GET /user/marketplace_purchases/stubbed"],listWebhookDeliveries:["GET /app/hook/deliveries"],redeliverWebhookDelivery:["POST /app/hook/deliveries/{delivery_id}/attempts"],removeRepoFromInstallation:["DELETE /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","removeRepoFromInstallationForAuthenticatedUser"]}],removeRepoFromInstallationForAuthenticatedUser:["DELETE /user/installations/{installation_id}/repositories/{repository_id}"],resetToken:["PATCH /applications/{client_id}/token"],revokeInstallationAccessToken:["DELETE /installation/token"],scopeToken:["POST /applications/{client_id}/token/scoped"],suspendInstallation:["PUT /app/installations/{installation_id}/suspended"],unsuspendInstallation:["DELETE /app/installations/{installation_id}/suspended"],updateWebhookConfigForApp:["PATCH /app/hook/config"]},billing:{getGithubActionsBillingOrg:["GET /orgs/{org}/settings/billing/actions"],getGithubActionsBillingUser:["GET /users/{username}/settings/billing/actions"],getGithubBillingPremiumRequestUsageReportOrg:["GET /organizations/{org}/settings/billing/premium_request/usage"],getGithubBillingPremiumRequestUsageReportUser:["GET /users/{username}/settings/billing/premium_request/usage"],getGithubBillingUsageReportOrg:["GET /organizations/{org}/settings/billing/usage"],getGithubBillingUsageReportUser:["GET /users/{username}/settings/billing/usage"],getGithubPackagesBillingOrg:["GET /orgs/{org}/settings/billing/packages"],getGithubPackagesBillingUser:["GET /users/{username}/settings/billing/packages"],getSharedStorageBillingOrg:["GET /orgs/{org}/settings/billing/shared-storage"],getSharedStorageBillingUser:["GET /users/{username}/settings/billing/shared-storage"]},campaigns:{createCampaign:["POST /orgs/{org}/campaigns"],deleteCampaign:["DELETE /orgs/{org}/campaigns/{campaign_number}"],getCampaignSummary:["GET /orgs/{org}/campaigns/{campaign_number}"],listOrgCampaigns:["GET /orgs/{org}/campaigns"],updateCampaign:["PATCH /orgs/{org}/campaigns/{campaign_number}"]},checks:{create:["POST /repos/{owner}/{repo}/check-runs"],createSuite:["POST /repos/{owner}/{repo}/check-suites"],get:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],getSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],listAnnotations:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"],listForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],listForSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"],listSuitesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],rerequestRun:["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],rerequestSuite:["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"],setSuitesPreferences:["PATCH /repos/{owner}/{repo}/check-suites/preferences"],update:["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]},codeScanning:{commitAutofix:["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits"],createAutofix:["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"],createVariantAnalysis:["POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses"],deleteAnalysis:["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"],deleteCodeqlDatabase:["DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],getAlert:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",{},{renamedParameters:{alert_id:"alert_number"}}],getAnalysis:["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"],getAutofix:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"],getCodeqlDatabase:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],getDefaultSetup:["GET /repos/{owner}/{repo}/code-scanning/default-setup"],getSarif:["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],getVariantAnalysis:["GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}"],getVariantAnalysisRepoTask:["GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}"],listAlertInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"],listAlertsForOrg:["GET /orgs/{org}/code-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/code-scanning/alerts"],listAlertsInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",{},{renamed:["codeScanning","listAlertInstances"]}],listCodeqlDatabases:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"],listRecentAnalyses:["GET /repos/{owner}/{repo}/code-scanning/analyses"],updateAlert:["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"],updateDefaultSetup:["PATCH /repos/{owner}/{repo}/code-scanning/default-setup"],uploadSarif:["POST /repos/{owner}/{repo}/code-scanning/sarifs"]},codeSecurity:{attachConfiguration:["POST /orgs/{org}/code-security/configurations/{configuration_id}/attach"],attachEnterpriseConfiguration:["POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach"],createConfiguration:["POST /orgs/{org}/code-security/configurations"],createConfigurationForEnterprise:["POST /enterprises/{enterprise}/code-security/configurations"],deleteConfiguration:["DELETE /orgs/{org}/code-security/configurations/{configuration_id}"],deleteConfigurationForEnterprise:["DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}"],detachConfiguration:["DELETE /orgs/{org}/code-security/configurations/detach"],getConfiguration:["GET /orgs/{org}/code-security/configurations/{configuration_id}"],getConfigurationForRepository:["GET /repos/{owner}/{repo}/code-security-configuration"],getConfigurationsForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations"],getConfigurationsForOrg:["GET /orgs/{org}/code-security/configurations"],getDefaultConfigurations:["GET /orgs/{org}/code-security/configurations/defaults"],getDefaultConfigurationsForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations/defaults"],getRepositoriesForConfiguration:["GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories"],getRepositoriesForEnterpriseConfiguration:["GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories"],getSingleConfigurationForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}"],setConfigurationAsDefault:["PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults"],setConfigurationAsDefaultForEnterprise:["PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults"],updateConfiguration:["PATCH /orgs/{org}/code-security/configurations/{configuration_id}"],updateEnterpriseConfiguration:["PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}"]},codesOfConduct:{getAllCodesOfConduct:["GET /codes_of_conduct"],getConductCode:["GET /codes_of_conduct/{key}"]},codespaces:{addRepositoryForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],checkPermissionsForDevcontainer:["GET /repos/{owner}/{repo}/codespaces/permissions_check"],codespaceMachinesForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/machines"],createForAuthenticatedUser:["POST /user/codespaces"],createOrUpdateOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],createOrUpdateSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}"],createWithPrForAuthenticatedUser:["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],createWithRepoForAuthenticatedUser:["POST /repos/{owner}/{repo}/codespaces"],deleteForAuthenticatedUser:["DELETE /user/codespaces/{codespace_name}"],deleteFromOrganization:["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],deleteOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],deleteSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}"],exportForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/exports"],getCodespacesForUserInOrg:["GET /orgs/{org}/members/{username}/codespaces"],getExportDetailsForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/exports/{export_id}"],getForAuthenticatedUser:["GET /user/codespaces/{codespace_name}"],getOrgPublicKey:["GET /orgs/{org}/codespaces/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}"],getPublicKeyForAuthenticatedUser:["GET /user/codespaces/secrets/public-key"],getRepoPublicKey:["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],getSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}"],listDevcontainersInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/devcontainers"],listForAuthenticatedUser:["GET /user/codespaces"],listInOrganization:["GET /orgs/{org}/codespaces",{},{renamedParameters:{org_id:"org"}}],listInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces"],listOrgSecrets:["GET /orgs/{org}/codespaces/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/codespaces/secrets"],listRepositoriesForSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}/repositories"],listSecretsForAuthenticatedUser:["GET /user/codespaces/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],preFlightWithRepoForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/new"],publishForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/publish"],removeRepositoryForSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],repoMachinesForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/machines"],setRepositoriesForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],startForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/start"],stopForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/stop"],stopInOrganization:["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],updateForAuthenticatedUser:["PATCH /user/codespaces/{codespace_name}"]},copilot:{addCopilotSeatsForTeams:["POST /orgs/{org}/copilot/billing/selected_teams"],addCopilotSeatsForUsers:["POST /orgs/{org}/copilot/billing/selected_users"],cancelCopilotSeatAssignmentForTeams:["DELETE /orgs/{org}/copilot/billing/selected_teams"],cancelCopilotSeatAssignmentForUsers:["DELETE /orgs/{org}/copilot/billing/selected_users"],copilotMetricsForOrganization:["GET /orgs/{org}/copilot/metrics"],copilotMetricsForTeam:["GET /orgs/{org}/team/{team_slug}/copilot/metrics"],getCopilotOrganizationDetails:["GET /orgs/{org}/copilot/billing"],getCopilotSeatDetailsForUser:["GET /orgs/{org}/members/{username}/copilot"],listCopilotSeats:["GET /orgs/{org}/copilot/billing/seats"]},credentials:{revoke:["POST /credentials/revoke"]},dependabot:{addSelectedRepoToOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],deleteOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],getAlert:["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],getOrgPublicKey:["GET /orgs/{org}/dependabot/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}"],getRepoPublicKey:["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],listAlertsForEnterprise:["GET /enterprises/{enterprise}/dependabot/alerts"],listAlertsForOrg:["GET /orgs/{org}/dependabot/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/dependabot/alerts"],listOrgSecrets:["GET /orgs/{org}/dependabot/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/dependabot/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],repositoryAccessForOrg:["GET /organizations/{org}/dependabot/repository-access"],setRepositoryAccessDefaultLevel:["PUT /organizations/{org}/dependabot/repository-access/default-level"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],updateAlert:["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],updateRepositoryAccessForOrg:["PATCH /organizations/{org}/dependabot/repository-access"]},dependencyGraph:{createRepositorySnapshot:["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],diffRange:["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"],exportSbom:["GET /repos/{owner}/{repo}/dependency-graph/sbom"]},emojis:{get:["GET /emojis"]},enterpriseTeamMemberships:{add:["PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"],bulkAdd:["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add"],bulkRemove:["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove"],get:["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"],list:["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"],remove:["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"]},enterpriseTeamOrganizations:{add:["PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],bulkAdd:["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add"],bulkRemove:["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove"],delete:["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],getAssignment:["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],getAssignments:["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations"]},enterpriseTeams:{create:["POST /enterprises/{enterprise}/teams"],delete:["DELETE /enterprises/{enterprise}/teams/{team_slug}"],get:["GET /enterprises/{enterprise}/teams/{team_slug}"],list:["GET /enterprises/{enterprise}/teams"],update:["PATCH /enterprises/{enterprise}/teams/{team_slug}"]},gists:{checkIsStarred:["GET /gists/{gist_id}/star"],create:["POST /gists"],createComment:["POST /gists/{gist_id}/comments"],delete:["DELETE /gists/{gist_id}"],deleteComment:["DELETE /gists/{gist_id}/comments/{comment_id}"],fork:["POST /gists/{gist_id}/forks"],get:["GET /gists/{gist_id}"],getComment:["GET /gists/{gist_id}/comments/{comment_id}"],getRevision:["GET /gists/{gist_id}/{sha}"],list:["GET /gists"],listComments:["GET /gists/{gist_id}/comments"],listCommits:["GET /gists/{gist_id}/commits"],listForUser:["GET /users/{username}/gists"],listForks:["GET /gists/{gist_id}/forks"],listPublic:["GET /gists/public"],listStarred:["GET /gists/starred"],star:["PUT /gists/{gist_id}/star"],unstar:["DELETE /gists/{gist_id}/star"],update:["PATCH /gists/{gist_id}"],updateComment:["PATCH /gists/{gist_id}/comments/{comment_id}"]},git:{createBlob:["POST /repos/{owner}/{repo}/git/blobs"],createCommit:["POST /repos/{owner}/{repo}/git/commits"],createRef:["POST /repos/{owner}/{repo}/git/refs"],createTag:["POST /repos/{owner}/{repo}/git/tags"],createTree:["POST /repos/{owner}/{repo}/git/trees"],deleteRef:["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],getBlob:["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],getCommit:["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],getRef:["GET /repos/{owner}/{repo}/git/ref/{ref}"],getTag:["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],getTree:["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],listMatchingRefs:["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],updateRef:["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]},gitignore:{getAllTemplates:["GET /gitignore/templates"],getTemplate:["GET /gitignore/templates/{name}"]},hostedCompute:{createNetworkConfigurationForOrg:["POST /orgs/{org}/settings/network-configurations"],deleteNetworkConfigurationFromOrg:["DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}"],getNetworkConfigurationForOrg:["GET /orgs/{org}/settings/network-configurations/{network_configuration_id}"],getNetworkSettingsForOrg:["GET /orgs/{org}/settings/network-settings/{network_settings_id}"],listNetworkConfigurationsForOrg:["GET /orgs/{org}/settings/network-configurations"],updateNetworkConfigurationForOrg:["PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}"]},interactions:{getRestrictionsForAuthenticatedUser:["GET /user/interaction-limits"],getRestrictionsForOrg:["GET /orgs/{org}/interaction-limits"],getRestrictionsForRepo:["GET /repos/{owner}/{repo}/interaction-limits"],getRestrictionsForYourPublicRepos:["GET /user/interaction-limits",{},{renamed:["interactions","getRestrictionsForAuthenticatedUser"]}],removeRestrictionsForAuthenticatedUser:["DELETE /user/interaction-limits"],removeRestrictionsForOrg:["DELETE /orgs/{org}/interaction-limits"],removeRestrictionsForRepo:["DELETE /repos/{owner}/{repo}/interaction-limits"],removeRestrictionsForYourPublicRepos:["DELETE /user/interaction-limits",{},{renamed:["interactions","removeRestrictionsForAuthenticatedUser"]}],setRestrictionsForAuthenticatedUser:["PUT /user/interaction-limits"],setRestrictionsForOrg:["PUT /orgs/{org}/interaction-limits"],setRestrictionsForRepo:["PUT /repos/{owner}/{repo}/interaction-limits"],setRestrictionsForYourPublicRepos:["PUT /user/interaction-limits",{},{renamed:["interactions","setRestrictionsForAuthenticatedUser"]}]},issues:{addAssignees:["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"],addBlockedByDependency:["POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"],addLabels:["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],addSubIssue:["POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"],checkUserCanBeAssigned:["GET /repos/{owner}/{repo}/assignees/{assignee}"],checkUserCanBeAssignedToIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"],create:["POST /repos/{owner}/{repo}/issues"],createComment:["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"],createLabel:["POST /repos/{owner}/{repo}/labels"],createMilestone:["POST /repos/{owner}/{repo}/milestones"],deleteComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"],deleteLabel:["DELETE /repos/{owner}/{repo}/labels/{name}"],deleteMilestone:["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"],get:["GET /repos/{owner}/{repo}/issues/{issue_number}"],getComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],getEvent:["GET /repos/{owner}/{repo}/issues/events/{event_id}"],getLabel:["GET /repos/{owner}/{repo}/labels/{name}"],getMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],getParent:["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"],list:["GET /issues"],listAssignees:["GET /repos/{owner}/{repo}/assignees"],listComments:["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],listCommentsForRepo:["GET /repos/{owner}/{repo}/issues/comments"],listDependenciesBlockedBy:["GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"],listDependenciesBlocking:["GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking"],listEvents:["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],listEventsForRepo:["GET /repos/{owner}/{repo}/issues/events"],listEventsForTimeline:["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"],listForAuthenticatedUser:["GET /user/issues"],listForOrg:["GET /orgs/{org}/issues"],listForRepo:["GET /repos/{owner}/{repo}/issues"],listLabelsForMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"],listLabelsForRepo:["GET /repos/{owner}/{repo}/labels"],listLabelsOnIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"],listMilestones:["GET /repos/{owner}/{repo}/milestones"],listSubIssues:["GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"],lock:["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],removeAllLabels:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"],removeAssignees:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"],removeDependencyBlockedBy:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}"],removeLabel:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"],removeSubIssue:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue"],reprioritizeSubIssue:["PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority"],setLabels:["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],unlock:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],update:["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],updateComment:["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],updateLabel:["PATCH /repos/{owner}/{repo}/labels/{name}"],updateMilestone:["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"]},licenses:{get:["GET /licenses/{license}"],getAllCommonlyUsed:["GET /licenses"],getForRepo:["GET /repos/{owner}/{repo}/license"]},markdown:{render:["POST /markdown"],renderRaw:["POST /markdown/raw",{headers:{"content-type":"text/plain; charset=utf-8"}}]},meta:{get:["GET /meta"],getAllVersions:["GET /versions"],getOctocat:["GET /octocat"],getZen:["GET /zen"],root:["GET /"]},migrations:{deleteArchiveForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/archive"],deleteArchiveForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/archive"],downloadArchiveForOrg:["GET /orgs/{org}/migrations/{migration_id}/archive"],getArchiveForAuthenticatedUser:["GET /user/migrations/{migration_id}/archive"],getStatusForAuthenticatedUser:["GET /user/migrations/{migration_id}"],getStatusForOrg:["GET /orgs/{org}/migrations/{migration_id}"],listForAuthenticatedUser:["GET /user/migrations"],listForOrg:["GET /orgs/{org}/migrations"],listReposForAuthenticatedUser:["GET /user/migrations/{migration_id}/repositories"],listReposForOrg:["GET /orgs/{org}/migrations/{migration_id}/repositories"],listReposForUser:["GET /user/migrations/{migration_id}/repositories",{},{renamed:["migrations","listReposForAuthenticatedUser"]}],startForAuthenticatedUser:["POST /user/migrations"],startForOrg:["POST /orgs/{org}/migrations"],unlockRepoForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"],unlockRepoForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"]},oidc:{getOidcCustomSubTemplateForOrg:["GET /orgs/{org}/actions/oidc/customization/sub"],updateOidcCustomSubTemplateForOrg:["PUT /orgs/{org}/actions/oidc/customization/sub"]},orgs:{addSecurityManagerTeam:["PUT /orgs/{org}/security-managers/teams/{team_slug}",{},{deprecated:"octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team"}],assignTeamToOrgRole:["PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],assignUserToOrgRole:["PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"],blockUser:["PUT /orgs/{org}/blocks/{username}"],cancelInvitation:["DELETE /orgs/{org}/invitations/{invitation_id}"],checkBlockedUser:["GET /orgs/{org}/blocks/{username}"],checkMembershipForUser:["GET /orgs/{org}/members/{username}"],checkPublicMembershipForUser:["GET /orgs/{org}/public_members/{username}"],convertMemberToOutsideCollaborator:["PUT /orgs/{org}/outside_collaborators/{username}"],createArtifactStorageRecord:["POST /orgs/{org}/artifacts/metadata/storage-record"],createInvitation:["POST /orgs/{org}/invitations"],createIssueType:["POST /orgs/{org}/issue-types"],createWebhook:["POST /orgs/{org}/hooks"],customPropertiesForOrgsCreateOrUpdateOrganizationValues:["PATCH /organizations/{org}/org-properties/values"],customPropertiesForOrgsGetOrganizationValues:["GET /organizations/{org}/org-properties/values"],customPropertiesForReposCreateOrUpdateOrganizationDefinition:["PUT /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposCreateOrUpdateOrganizationDefinitions:["PATCH /orgs/{org}/properties/schema"],customPropertiesForReposCreateOrUpdateOrganizationValues:["PATCH /orgs/{org}/properties/values"],customPropertiesForReposDeleteOrganizationDefinition:["DELETE /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposGetOrganizationDefinition:["GET /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposGetOrganizationDefinitions:["GET /orgs/{org}/properties/schema"],customPropertiesForReposGetOrganizationValues:["GET /orgs/{org}/properties/values"],delete:["DELETE /orgs/{org}"],deleteAttestationsBulk:["POST /orgs/{org}/attestations/delete-request"],deleteAttestationsById:["DELETE /orgs/{org}/attestations/{attestation_id}"],deleteAttestationsBySubjectDigest:["DELETE /orgs/{org}/attestations/digest/{subject_digest}"],deleteIssueType:["DELETE /orgs/{org}/issue-types/{issue_type_id}"],deleteWebhook:["DELETE /orgs/{org}/hooks/{hook_id}"],disableSelectedRepositoryImmutableReleasesOrganization:["DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"],enableSelectedRepositoryImmutableReleasesOrganization:["PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"],get:["GET /orgs/{org}"],getImmutableReleasesSettings:["GET /orgs/{org}/settings/immutable-releases"],getImmutableReleasesSettingsRepositories:["GET /orgs/{org}/settings/immutable-releases/repositories"],getMembershipForAuthenticatedUser:["GET /user/memberships/orgs/{org}"],getMembershipForUser:["GET /orgs/{org}/memberships/{username}"],getOrgRole:["GET /orgs/{org}/organization-roles/{role_id}"],getOrgRulesetHistory:["GET /orgs/{org}/rulesets/{ruleset_id}/history"],getOrgRulesetVersion:["GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"],getWebhook:["GET /orgs/{org}/hooks/{hook_id}"],getWebhookConfigForOrg:["GET /orgs/{org}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],list:["GET /organizations"],listAppInstallations:["GET /orgs/{org}/installations"],listArtifactStorageRecords:["GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records"],listAttestationRepositories:["GET /orgs/{org}/attestations/repositories"],listAttestations:["GET /orgs/{org}/attestations/{subject_digest}"],listAttestationsBulk:["POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"],listBlockedUsers:["GET /orgs/{org}/blocks"],listFailedInvitations:["GET /orgs/{org}/failed_invitations"],listForAuthenticatedUser:["GET /user/orgs"],listForUser:["GET /users/{username}/orgs"],listInvitationTeams:["GET /orgs/{org}/invitations/{invitation_id}/teams"],listIssueTypes:["GET /orgs/{org}/issue-types"],listMembers:["GET /orgs/{org}/members"],listMembershipsForAuthenticatedUser:["GET /user/memberships/orgs"],listOrgRoleTeams:["GET /orgs/{org}/organization-roles/{role_id}/teams"],listOrgRoleUsers:["GET /orgs/{org}/organization-roles/{role_id}/users"],listOrgRoles:["GET /orgs/{org}/organization-roles"],listOrganizationFineGrainedPermissions:["GET /orgs/{org}/organization-fine-grained-permissions"],listOutsideCollaborators:["GET /orgs/{org}/outside_collaborators"],listPatGrantRepositories:["GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"],listPatGrantRequestRepositories:["GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"],listPatGrantRequests:["GET /orgs/{org}/personal-access-token-requests"],listPatGrants:["GET /orgs/{org}/personal-access-tokens"],listPendingInvitations:["GET /orgs/{org}/invitations"],listPublicMembers:["GET /orgs/{org}/public_members"],listSecurityManagerTeams:["GET /orgs/{org}/security-managers",{},{deprecated:"octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams"}],listWebhookDeliveries:["GET /orgs/{org}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /orgs/{org}/hooks"],pingWebhook:["POST /orgs/{org}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeMember:["DELETE /orgs/{org}/members/{username}"],removeMembershipForUser:["DELETE /orgs/{org}/memberships/{username}"],removeOutsideCollaborator:["DELETE /orgs/{org}/outside_collaborators/{username}"],removePublicMembershipForAuthenticatedUser:["DELETE /orgs/{org}/public_members/{username}"],removeSecurityManagerTeam:["DELETE /orgs/{org}/security-managers/teams/{team_slug}",{},{deprecated:"octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team"}],reviewPatGrantRequest:["POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"],reviewPatGrantRequestsInBulk:["POST /orgs/{org}/personal-access-token-requests"],revokeAllOrgRolesTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}"],revokeAllOrgRolesUser:["DELETE /orgs/{org}/organization-roles/users/{username}"],revokeOrgRoleTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],revokeOrgRoleUser:["DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"],setImmutableReleasesSettings:["PUT /orgs/{org}/settings/immutable-releases"],setImmutableReleasesSettingsRepositories:["PUT /orgs/{org}/settings/immutable-releases/repositories"],setMembershipForUser:["PUT /orgs/{org}/memberships/{username}"],setPublicMembershipForAuthenticatedUser:["PUT /orgs/{org}/public_members/{username}"],unblockUser:["DELETE /orgs/{org}/blocks/{username}"],update:["PATCH /orgs/{org}"],updateIssueType:["PUT /orgs/{org}/issue-types/{issue_type_id}"],updateMembershipForAuthenticatedUser:["PATCH /user/memberships/orgs/{org}"],updatePatAccess:["POST /orgs/{org}/personal-access-tokens/{pat_id}"],updatePatAccesses:["POST /orgs/{org}/personal-access-tokens"],updateWebhook:["PATCH /orgs/{org}/hooks/{hook_id}"],updateWebhookConfigForOrg:["PATCH /orgs/{org}/hooks/{hook_id}/config"]},packages:{deletePackageForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}"],deletePackageForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}"],deletePackageForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}"],deletePackageVersionForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getAllPackageVersionsForAPackageOwnedByAnOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByOrg"]}],getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByAuthenticatedUser"]}],getAllPackageVersionsForPackageOwnedByAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions"],getPackageForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}"],getPackageForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}"],getPackageForUser:["GET /users/{username}/packages/{package_type}/{package_name}"],getPackageVersionForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],listDockerMigrationConflictingPackagesForAuthenticatedUser:["GET /user/docker/conflicts"],listDockerMigrationConflictingPackagesForOrganization:["GET /orgs/{org}/docker/conflicts"],listDockerMigrationConflictingPackagesForUser:["GET /users/{username}/docker/conflicts"],listPackagesForAuthenticatedUser:["GET /user/packages"],listPackagesForOrganization:["GET /orgs/{org}/packages"],listPackagesForUser:["GET /users/{username}/packages"],restorePackageForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForUser:["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageVersionForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForUser:["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]},privateRegistries:{createOrgPrivateRegistry:["POST /orgs/{org}/private-registries"],deleteOrgPrivateRegistry:["DELETE /orgs/{org}/private-registries/{secret_name}"],getOrgPrivateRegistry:["GET /orgs/{org}/private-registries/{secret_name}"],getOrgPublicKey:["GET /orgs/{org}/private-registries/public-key"],listOrgPrivateRegistries:["GET /orgs/{org}/private-registries"],updateOrgPrivateRegistry:["PATCH /orgs/{org}/private-registries/{secret_name}"]},projects:{addItemForOrg:["POST /orgs/{org}/projectsV2/{project_number}/items"],addItemForUser:["POST /users/{username}/projectsV2/{project_number}/items"],deleteItemForOrg:["DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],deleteItemForUser:["DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}"],getFieldForOrg:["GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"],getFieldForUser:["GET /users/{username}/projectsV2/{project_number}/fields/{field_id}"],getForOrg:["GET /orgs/{org}/projectsV2/{project_number}"],getForUser:["GET /users/{username}/projectsV2/{project_number}"],getOrgItem:["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],getUserItem:["GET /users/{username}/projectsV2/{project_number}/items/{item_id}"],listFieldsForOrg:["GET /orgs/{org}/projectsV2/{project_number}/fields"],listFieldsForUser:["GET /users/{username}/projectsV2/{project_number}/fields"],listForOrg:["GET /orgs/{org}/projectsV2"],listForUser:["GET /users/{username}/projectsV2"],listItemsForOrg:["GET /orgs/{org}/projectsV2/{project_number}/items"],listItemsForUser:["GET /users/{username}/projectsV2/{project_number}/items"],updateItemForOrg:["PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],updateItemForUser:["PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}"]},pulls:{checkIfMerged:["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],create:["POST /repos/{owner}/{repo}/pulls"],createReplyForReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"],createReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],createReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"],deletePendingReview:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],deleteReviewComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"],dismissReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"],get:["GET /repos/{owner}/{repo}/pulls/{pull_number}"],getReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],getReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],list:["GET /repos/{owner}/{repo}/pulls"],listCommentsForReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"],listCommits:["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],listFiles:["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],listRequestedReviewers:["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],listReviewComments:["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"],listReviewCommentsForRepo:["GET /repos/{owner}/{repo}/pulls/comments"],listReviews:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],merge:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],removeRequestedReviewers:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],requestReviewers:["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],submitReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"],update:["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],updateBranch:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"],updateReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],updateReviewComment:["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"]},rateLimit:{get:["GET /rate_limit"]},reactions:{createForCommitComment:["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"],createForIssue:["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],createForIssueComment:["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],createForPullRequestReviewComment:["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],createForRelease:["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],createForTeamDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],createForTeamDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],deleteForCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],deleteForIssue:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],deleteForIssueComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],deleteForPullRequestComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],deleteForRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],deleteForTeamDiscussion:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],deleteForTeamDiscussionComment:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],listForCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],listForIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],listForIssueComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],listForPullRequestReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],listForRelease:["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],listForTeamDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],listForTeamDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]},repos:{acceptInvitation:["PATCH /user/repository_invitations/{invitation_id}",{},{renamed:["repos","acceptInvitationForAuthenticatedUser"]}],acceptInvitationForAuthenticatedUser:["PATCH /user/repository_invitations/{invitation_id}"],addAppAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],addCollaborator:["PUT /repos/{owner}/{repo}/collaborators/{username}"],addStatusCheckContexts:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],addTeamAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],addUserAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],cancelPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"],checkAutomatedSecurityFixes:["GET /repos/{owner}/{repo}/automated-security-fixes"],checkCollaborator:["GET /repos/{owner}/{repo}/collaborators/{username}"],checkImmutableReleases:["GET /repos/{owner}/{repo}/immutable-releases"],checkPrivateVulnerabilityReporting:["GET /repos/{owner}/{repo}/private-vulnerability-reporting"],checkVulnerabilityAlerts:["GET /repos/{owner}/{repo}/vulnerability-alerts"],codeownersErrors:["GET /repos/{owner}/{repo}/codeowners/errors"],compareCommits:["GET /repos/{owner}/{repo}/compare/{base}...{head}"],compareCommitsWithBasehead:["GET /repos/{owner}/{repo}/compare/{basehead}"],createAttestation:["POST /repos/{owner}/{repo}/attestations"],createAutolink:["POST /repos/{owner}/{repo}/autolinks"],createCommitComment:["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],createCommitSignatureProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],createCommitStatus:["POST /repos/{owner}/{repo}/statuses/{sha}"],createDeployKey:["POST /repos/{owner}/{repo}/keys"],createDeployment:["POST /repos/{owner}/{repo}/deployments"],createDeploymentBranchPolicy:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],createDeploymentProtectionRule:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],createDeploymentStatus:["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],createDispatchEvent:["POST /repos/{owner}/{repo}/dispatches"],createForAuthenticatedUser:["POST /user/repos"],createFork:["POST /repos/{owner}/{repo}/forks"],createInOrg:["POST /orgs/{org}/repos"],createOrUpdateEnvironment:["PUT /repos/{owner}/{repo}/environments/{environment_name}"],createOrUpdateFileContents:["PUT /repos/{owner}/{repo}/contents/{path}"],createOrgRuleset:["POST /orgs/{org}/rulesets"],createPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments"],createPagesSite:["POST /repos/{owner}/{repo}/pages"],createRelease:["POST /repos/{owner}/{repo}/releases"],createRepoRuleset:["POST /repos/{owner}/{repo}/rulesets"],createUsingTemplate:["POST /repos/{template_owner}/{template_repo}/generate"],createWebhook:["POST /repos/{owner}/{repo}/hooks"],customPropertiesForReposCreateOrUpdateRepositoryValues:["PATCH /repos/{owner}/{repo}/properties/values"],customPropertiesForReposGetRepositoryValues:["GET /repos/{owner}/{repo}/properties/values"],declineInvitation:["DELETE /user/repository_invitations/{invitation_id}",{},{renamed:["repos","declineInvitationForAuthenticatedUser"]}],declineInvitationForAuthenticatedUser:["DELETE /user/repository_invitations/{invitation_id}"],delete:["DELETE /repos/{owner}/{repo}"],deleteAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],deleteAdminBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],deleteAnEnvironment:["DELETE /repos/{owner}/{repo}/environments/{environment_name}"],deleteAutolink:["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],deleteBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"],deleteCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],deleteCommitSignatureProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],deleteDeployKey:["DELETE /repos/{owner}/{repo}/keys/{key_id}"],deleteDeployment:["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"],deleteDeploymentBranchPolicy:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],deleteFile:["DELETE /repos/{owner}/{repo}/contents/{path}"],deleteInvitation:["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"],deleteOrgRuleset:["DELETE /orgs/{org}/rulesets/{ruleset_id}"],deletePagesSite:["DELETE /repos/{owner}/{repo}/pages"],deletePullRequestReviewProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],deleteRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}"],deleteReleaseAsset:["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"],deleteRepoRuleset:["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],deleteWebhook:["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],disableAutomatedSecurityFixes:["DELETE /repos/{owner}/{repo}/automated-security-fixes"],disableDeploymentProtectionRule:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],disableImmutableReleases:["DELETE /repos/{owner}/{repo}/immutable-releases"],disablePrivateVulnerabilityReporting:["DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"],disableVulnerabilityAlerts:["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],downloadArchive:["GET /repos/{owner}/{repo}/zipball/{ref}",{},{renamed:["repos","downloadZipballArchive"]}],downloadTarballArchive:["GET /repos/{owner}/{repo}/tarball/{ref}"],downloadZipballArchive:["GET /repos/{owner}/{repo}/zipball/{ref}"],enableAutomatedSecurityFixes:["PUT /repos/{owner}/{repo}/automated-security-fixes"],enableImmutableReleases:["PUT /repos/{owner}/{repo}/immutable-releases"],enablePrivateVulnerabilityReporting:["PUT /repos/{owner}/{repo}/private-vulnerability-reporting"],enableVulnerabilityAlerts:["PUT /repos/{owner}/{repo}/vulnerability-alerts"],generateReleaseNotes:["POST /repos/{owner}/{repo}/releases/generate-notes"],get:["GET /repos/{owner}/{repo}"],getAccessRestrictions:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],getAdminBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],getAllDeploymentProtectionRules:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],getAllEnvironments:["GET /repos/{owner}/{repo}/environments"],getAllStatusCheckContexts:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"],getAllTopics:["GET /repos/{owner}/{repo}/topics"],getAppsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],getAutolink:["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],getBranch:["GET /repos/{owner}/{repo}/branches/{branch}"],getBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection"],getBranchRules:["GET /repos/{owner}/{repo}/rules/branches/{branch}"],getClones:["GET /repos/{owner}/{repo}/traffic/clones"],getCodeFrequencyStats:["GET /repos/{owner}/{repo}/stats/code_frequency"],getCollaboratorPermissionLevel:["GET /repos/{owner}/{repo}/collaborators/{username}/permission"],getCombinedStatusForRef:["GET /repos/{owner}/{repo}/commits/{ref}/status"],getCommit:["GET /repos/{owner}/{repo}/commits/{ref}"],getCommitActivityStats:["GET /repos/{owner}/{repo}/stats/commit_activity"],getCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}"],getCommitSignatureProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],getCommunityProfileMetrics:["GET /repos/{owner}/{repo}/community/profile"],getContent:["GET /repos/{owner}/{repo}/contents/{path}"],getContributorsStats:["GET /repos/{owner}/{repo}/stats/contributors"],getCustomDeploymentProtectionRule:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],getDeployKey:["GET /repos/{owner}/{repo}/keys/{key_id}"],getDeployment:["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],getDeploymentBranchPolicy:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],getDeploymentStatus:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"],getEnvironment:["GET /repos/{owner}/{repo}/environments/{environment_name}"],getLatestPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/latest"],getLatestRelease:["GET /repos/{owner}/{repo}/releases/latest"],getOrgRuleSuite:["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],getOrgRuleSuites:["GET /orgs/{org}/rulesets/rule-suites"],getOrgRuleset:["GET /orgs/{org}/rulesets/{ruleset_id}"],getOrgRulesets:["GET /orgs/{org}/rulesets"],getPages:["GET /repos/{owner}/{repo}/pages"],getPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],getPagesDeployment:["GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"],getPagesHealthCheck:["GET /repos/{owner}/{repo}/pages/health"],getParticipationStats:["GET /repos/{owner}/{repo}/stats/participation"],getPullRequestReviewProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],getPunchCardStats:["GET /repos/{owner}/{repo}/stats/punch_card"],getReadme:["GET /repos/{owner}/{repo}/readme"],getReadmeInDirectory:["GET /repos/{owner}/{repo}/readme/{dir}"],getRelease:["GET /repos/{owner}/{repo}/releases/{release_id}"],getReleaseAsset:["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],getReleaseByTag:["GET /repos/{owner}/{repo}/releases/tags/{tag}"],getRepoRuleSuite:["GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"],getRepoRuleSuites:["GET /repos/{owner}/{repo}/rulesets/rule-suites"],getRepoRuleset:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],getRepoRulesetHistory:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"],getRepoRulesetVersion:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"],getRepoRulesets:["GET /repos/{owner}/{repo}/rulesets"],getStatusChecksProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],getTeamsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"],getTopPaths:["GET /repos/{owner}/{repo}/traffic/popular/paths"],getTopReferrers:["GET /repos/{owner}/{repo}/traffic/popular/referrers"],getUsersWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"],getViews:["GET /repos/{owner}/{repo}/traffic/views"],getWebhook:["GET /repos/{owner}/{repo}/hooks/{hook_id}"],getWebhookConfigForRepo:["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],listActivities:["GET /repos/{owner}/{repo}/activity"],listAttestations:["GET /repos/{owner}/{repo}/attestations/{subject_digest}"],listAutolinks:["GET /repos/{owner}/{repo}/autolinks"],listBranches:["GET /repos/{owner}/{repo}/branches"],listBranchesForHeadCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],listCollaborators:["GET /repos/{owner}/{repo}/collaborators"],listCommentsForCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"],listCommitCommentsForRepo:["GET /repos/{owner}/{repo}/comments"],listCommitStatusesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/statuses"],listCommits:["GET /repos/{owner}/{repo}/commits"],listContributors:["GET /repos/{owner}/{repo}/contributors"],listCustomDeploymentRuleIntegrations:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"],listDeployKeys:["GET /repos/{owner}/{repo}/keys"],listDeploymentBranchPolicies:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],listDeploymentStatuses:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],listDeployments:["GET /repos/{owner}/{repo}/deployments"],listForAuthenticatedUser:["GET /user/repos"],listForOrg:["GET /orgs/{org}/repos"],listForUser:["GET /users/{username}/repos"],listForks:["GET /repos/{owner}/{repo}/forks"],listInvitations:["GET /repos/{owner}/{repo}/invitations"],listInvitationsForAuthenticatedUser:["GET /user/repository_invitations"],listLanguages:["GET /repos/{owner}/{repo}/languages"],listPagesBuilds:["GET /repos/{owner}/{repo}/pages/builds"],listPublic:["GET /repositories"],listPullRequestsAssociatedWithCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"],listReleaseAssets:["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],listReleases:["GET /repos/{owner}/{repo}/releases"],listTags:["GET /repos/{owner}/{repo}/tags"],listTeams:["GET /repos/{owner}/{repo}/teams"],listWebhookDeliveries:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /repos/{owner}/{repo}/hooks"],merge:["POST /repos/{owner}/{repo}/merges"],mergeUpstream:["POST /repos/{owner}/{repo}/merge-upstream"],pingWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeAppAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],removeCollaborator:["DELETE /repos/{owner}/{repo}/collaborators/{username}"],removeStatusCheckContexts:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],removeStatusCheckProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],removeTeamAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],removeUserAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],renameBranch:["POST /repos/{owner}/{repo}/branches/{branch}/rename"],replaceAllTopics:["PUT /repos/{owner}/{repo}/topics"],requestPagesBuild:["POST /repos/{owner}/{repo}/pages/builds"],setAdminBranchProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],setAppAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],setStatusCheckContexts:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],setTeamAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],setUserAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],testPushWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],transfer:["POST /repos/{owner}/{repo}/transfer"],update:["PATCH /repos/{owner}/{repo}"],updateBranchProtection:["PUT /repos/{owner}/{repo}/branches/{branch}/protection"],updateCommitComment:["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],updateDeploymentBranchPolicy:["PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],updateInformationAboutPagesSite:["PUT /repos/{owner}/{repo}/pages"],updateInvitation:["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"],updateOrgRuleset:["PUT /orgs/{org}/rulesets/{ruleset_id}"],updatePullRequestReviewProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],updateRelease:["PATCH /repos/{owner}/{repo}/releases/{release_id}"],updateReleaseAsset:["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"],updateRepoRuleset:["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],updateStatusCheckPotection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",{},{renamed:["repos","updateStatusCheckProtection"]}],updateStatusCheckProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],updateWebhook:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],updateWebhookConfigForRepo:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"],uploadReleaseAsset:["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",{baseUrl:"https://uploads.github.com"}]},search:{code:["GET /search/code"],commits:["GET /search/commits"],issuesAndPullRequests:["GET /search/issues"],labels:["GET /search/labels"],repos:["GET /search/repositories"],topics:["GET /search/topics"],users:["GET /search/users"]},secretScanning:{createPushProtectionBypass:["POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses"],getAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],getScanHistory:["GET /repos/{owner}/{repo}/secret-scanning/scan-history"],listAlertsForOrg:["GET /orgs/{org}/secret-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/secret-scanning/alerts"],listLocationsForAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],listOrgPatternConfigs:["GET /orgs/{org}/secret-scanning/pattern-configurations"],updateAlert:["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],updateOrgPatternConfigs:["PATCH /orgs/{org}/secret-scanning/pattern-configurations"]},securityAdvisories:{createFork:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"],createPrivateVulnerabilityReport:["POST /repos/{owner}/{repo}/security-advisories/reports"],createRepositoryAdvisory:["POST /repos/{owner}/{repo}/security-advisories"],createRepositoryAdvisoryCveRequest:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"],getGlobalAdvisory:["GET /advisories/{ghsa_id}"],getRepositoryAdvisory:["GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"],listGlobalAdvisories:["GET /advisories"],listOrgRepositoryAdvisories:["GET /orgs/{org}/security-advisories"],listRepositoryAdvisories:["GET /repos/{owner}/{repo}/security-advisories"],updateRepositoryAdvisory:["PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"]},teams:{addOrUpdateMembershipForUserInOrg:["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"],addOrUpdateRepoPermissionsInOrg:["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],checkPermissionsForRepoInOrg:["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],create:["POST /orgs/{org}/teams"],createDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],createDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions"],deleteDiscussionCommentInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],deleteDiscussionInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],deleteInOrg:["DELETE /orgs/{org}/teams/{team_slug}"],getByName:["GET /orgs/{org}/teams/{team_slug}"],getDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],getDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],getMembershipForUserInOrg:["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"],list:["GET /orgs/{org}/teams"],listChildInOrg:["GET /orgs/{org}/teams/{team_slug}/teams"],listDiscussionCommentsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],listDiscussionsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions"],listForAuthenticatedUser:["GET /user/teams"],listMembersInOrg:["GET /orgs/{org}/teams/{team_slug}/members"],listPendingInvitationsInOrg:["GET /orgs/{org}/teams/{team_slug}/invitations"],listReposInOrg:["GET /orgs/{org}/teams/{team_slug}/repos"],removeMembershipForUserInOrg:["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"],removeRepoInOrg:["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],updateDiscussionCommentInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],updateDiscussionInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],updateInOrg:["PATCH /orgs/{org}/teams/{team_slug}"]},users:{addEmailForAuthenticated:["POST /user/emails",{},{renamed:["users","addEmailForAuthenticatedUser"]}],addEmailForAuthenticatedUser:["POST /user/emails"],addSocialAccountForAuthenticatedUser:["POST /user/social_accounts"],block:["PUT /user/blocks/{username}"],checkBlocked:["GET /user/blocks/{username}"],checkFollowingForUser:["GET /users/{username}/following/{target_user}"],checkPersonIsFollowedByAuthenticated:["GET /user/following/{username}"],createGpgKeyForAuthenticated:["POST /user/gpg_keys",{},{renamed:["users","createGpgKeyForAuthenticatedUser"]}],createGpgKeyForAuthenticatedUser:["POST /user/gpg_keys"],createPublicSshKeyForAuthenticated:["POST /user/keys",{},{renamed:["users","createPublicSshKeyForAuthenticatedUser"]}],createPublicSshKeyForAuthenticatedUser:["POST /user/keys"],createSshSigningKeyForAuthenticatedUser:["POST /user/ssh_signing_keys"],deleteAttestationsBulk:["POST /users/{username}/attestations/delete-request"],deleteAttestationsById:["DELETE /users/{username}/attestations/{attestation_id}"],deleteAttestationsBySubjectDigest:["DELETE /users/{username}/attestations/digest/{subject_digest}"],deleteEmailForAuthenticated:["DELETE /user/emails",{},{renamed:["users","deleteEmailForAuthenticatedUser"]}],deleteEmailForAuthenticatedUser:["DELETE /user/emails"],deleteGpgKeyForAuthenticated:["DELETE /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","deleteGpgKeyForAuthenticatedUser"]}],deleteGpgKeyForAuthenticatedUser:["DELETE /user/gpg_keys/{gpg_key_id}"],deletePublicSshKeyForAuthenticated:["DELETE /user/keys/{key_id}",{},{renamed:["users","deletePublicSshKeyForAuthenticatedUser"]}],deletePublicSshKeyForAuthenticatedUser:["DELETE /user/keys/{key_id}"],deleteSocialAccountForAuthenticatedUser:["DELETE /user/social_accounts"],deleteSshSigningKeyForAuthenticatedUser:["DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"],follow:["PUT /user/following/{username}"],getAuthenticated:["GET /user"],getById:["GET /user/{account_id}"],getByUsername:["GET /users/{username}"],getContextForUser:["GET /users/{username}/hovercard"],getGpgKeyForAuthenticated:["GET /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","getGpgKeyForAuthenticatedUser"]}],getGpgKeyForAuthenticatedUser:["GET /user/gpg_keys/{gpg_key_id}"],getPublicSshKeyForAuthenticated:["GET /user/keys/{key_id}",{},{renamed:["users","getPublicSshKeyForAuthenticatedUser"]}],getPublicSshKeyForAuthenticatedUser:["GET /user/keys/{key_id}"],getSshSigningKeyForAuthenticatedUser:["GET /user/ssh_signing_keys/{ssh_signing_key_id}"],list:["GET /users"],listAttestations:["GET /users/{username}/attestations/{subject_digest}"],listAttestationsBulk:["POST /users/{username}/attestations/bulk-list{?per_page,before,after}"],listBlockedByAuthenticated:["GET /user/blocks",{},{renamed:["users","listBlockedByAuthenticatedUser"]}],listBlockedByAuthenticatedUser:["GET /user/blocks"],listEmailsForAuthenticated:["GET /user/emails",{},{renamed:["users","listEmailsForAuthenticatedUser"]}],listEmailsForAuthenticatedUser:["GET /user/emails"],listFollowedByAuthenticated:["GET /user/following",{},{renamed:["users","listFollowedByAuthenticatedUser"]}],listFollowedByAuthenticatedUser:["GET /user/following"],listFollowersForAuthenticatedUser:["GET /user/followers"],listFollowersForUser:["GET /users/{username}/followers"],listFollowingForUser:["GET /users/{username}/following"],listGpgKeysForAuthenticated:["GET /user/gpg_keys",{},{renamed:["users","listGpgKeysForAuthenticatedUser"]}],listGpgKeysForAuthenticatedUser:["GET /user/gpg_keys"],listGpgKeysForUser:["GET /users/{username}/gpg_keys"],listPublicEmailsForAuthenticated:["GET /user/public_emails",{},{renamed:["users","listPublicEmailsForAuthenticatedUser"]}],listPublicEmailsForAuthenticatedUser:["GET /user/public_emails"],listPublicKeysForUser:["GET /users/{username}/keys"],listPublicSshKeysForAuthenticated:["GET /user/keys",{},{renamed:["users","listPublicSshKeysForAuthenticatedUser"]}],listPublicSshKeysForAuthenticatedUser:["GET /user/keys"],listSocialAccountsForAuthenticatedUser:["GET /user/social_accounts"],listSocialAccountsForUser:["GET /users/{username}/social_accounts"],listSshSigningKeysForAuthenticatedUser:["GET /user/ssh_signing_keys"],listSshSigningKeysForUser:["GET /users/{username}/ssh_signing_keys"],setPrimaryEmailVisibilityForAuthenticated:["PATCH /user/email/visibility",{},{renamed:["users","setPrimaryEmailVisibilityForAuthenticatedUser"]}],setPrimaryEmailVisibilityForAuthenticatedUser:["PATCH /user/email/visibility"],unblock:["DELETE /user/blocks/{username}"],unfollow:["DELETE /user/following/{username}"],updateAuthenticated:["PATCH /user"]}},eb=mO;var sr=new Map;for(let[t,e]of Object.entries(eb))for(let[n,r]of Object.entries(e)){let[s,i,o]=r,[a,c]=s.split(/ /),l=Object.assign({method:a,url:c},i);sr.has(t)||sr.set(t,new Map),sr.get(t).set(n,{scope:t,methodName:n,endpointDefaults:l,decorations:o})}var gO={has({scope:t},e){return sr.get(t).has(e)},getOwnPropertyDescriptor(t,e){return{value:this.get(t,e),configurable:!0,writable:!0,enumerable:!0}},defineProperty(t,e,n){return Object.defineProperty(t.cache,e,n),!0},deleteProperty(t,e){return delete t.cache[e],!0},ownKeys({scope:t}){return[...sr.get(t).keys()]},set(t,e,n){return t.cache[e]=n},get({octokit:t,scope:e,cache:n},r){if(n[r])return n[r];let s=sr.get(e).get(r);if(!s)return;let{endpointDefaults:i,decorations:o}=s;return o?n[r]=hO(t,e,r,i,o):n[r]=t.request.defaults(i),n[r]}};function ud(t){let e={};for(let n of sr.keys())e[n]=new Proxy({octokit:t,scope:n,cache:{}},gO);return e}function hO(t,e,n,r,s){let i=t.request.defaults(r);function o(...a){let c=i.endpoint.merge(...a);if(s.mapToData)return c=Object.assign({},c,{data:c[s.mapToData],[s.mapToData]:void 0}),i(c);if(s.renamed){let[l,u]=s.renamed;t.log.warn(`octokit.${e}.${n}() has been renamed to octokit.${l}.${u}()`)}if(s.deprecated&&t.log.warn(s.deprecated),s.renamedParameters){let l=i.endpoint.merge(...a);for(let[u,d]of Object.entries(s.renamedParameters))u in l&&(t.log.warn(`"${u}" parameter is deprecated for "octokit.${e}.${n}()". Use "${d}" instead`),d in l||(l[d]=l[u]),delete l[u]);return i(l)}return i(...a)}return Object.assign(o,i)}function yO(t){return{rest:ud(t)}}yO.VERSION=ld;function dd(t){let e=ud(t);return{...e,rest:e}}dd.VERSION=ld;var tb="22.0.1";var nb=La.plugin(od,dd,cd).defaults({userAgent:`octokit-rest.js/${tb}`});var Ga=class{octokit;logger;selfLogin;constructor(e){this.octokit=new nb({auth:e.repoToken,baseUrl:e.baseUrl??"https://api.github.com",userAgent:"drift-bot/0.1"}),this.logger=e.logger}async readFile(e,n,r){try{let i=(await this.octokit.repos.getContent({owner:e.owner,repo:e.repo,path:n,ref:r})).data;return Array.isArray(i)||i.type!=="file"||!("content"in i)?null:Buffer.from(i.content,"base64").toString("utf8")}catch(s){if(rb(s))return null;throw this.logger.debug(`Failed to read ${n}@${r}: ${s.message}`),s}}async changedFiles(e){try{let n=await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${e.beforeSha}...${e.afterSha}`}),r=n.data.files??[],s=n.data.commits??[];return r.length>=300||s.lengtho.filename)}catch(n){throw this.logger.warn(`Could not compare ${e.beforeSha}...${e.afterSha}: ${n.message}`),n}}async changedFilesByCommit(e){let n=new Set;for await(let s of this.octokit.paginate.iterator(this.octokit.repos.compareCommitsWithBasehead,{owner:e.owner,repo:e.repo,basehead:`${e.beforeSha}...${e.afterSha}`,per_page:250})){let i=s.data;for(let o of i.commits??[])n.add(o.sha)}let r=new Set;for(let s of n)for await(let i of this.octokit.paginate.iterator(this.octokit.repos.getCommit,{owner:e.owner,repo:e.repo,ref:s,per_page:300})){let o=i.data;for(let a of o.files??[])r.add(a.filename)}return[...r]}async createBranch(e,n,r){try{return await this.octokit.git.createRef({owner:e.owner,repo:e.repo,ref:`refs/heads/${n}`,sha:r}),this.logger.info(`Created branch ${n} at ${r.slice(0,7)}`),!0}catch(s){if(bO(s)){let i=await this.getBranchHead(e,n);return i===r?(this.logger.info(`Branch ${n} already exists at ${r.slice(0,7)}; reusing it`),!0):i&&await this.isAncestor(e,r,i)?await this.commitsAreAllBots(e,r,i)?(this.logger.info(`Branch ${n} already exists ahead of ${r.slice(0,7)}; reusing it`),!0):(this.logger.error(`Branch ${n} already exists ahead of ${r.slice(0,7)} with commit(s) not made by Drift; refusing to reuse a branch that may carry manual changes`),!1):(this.logger.error(`Branch ${n} already exists but is not based on ${r.slice(0,7)} (current head: ${i??"unknown"}); refusing to reuse a stale branch`),!1)}return this.logger.error(`Could not create branch ${n}: ${s.message}`),!1}}async isAncestor(e,n,r){if(n===r)return!0;try{let s=await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${n}...${r}`});return s.data.status==="ahead"||s.data.status==="identical"}catch{return!1}}async commitsAreAllBots(e,n,r){try{let i=(await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${n}...${r}`})).data.commits??[];return i.length===0?!0:i.every(o=>(o.author?.login??o.committer?.login??"").endsWith("[bot]"))}catch{return!1}}async commitFiles(e,n,r,s){if(r.length===0)return null;try{let o=(await this.octokit.git.getRef({owner:e.owner,repo:e.repo,ref:`heads/${n}`})).data.object.sha,a=await this.octokit.git.getCommit({owner:e.owner,repo:e.repo,commit_sha:o}),c=await Promise.all(r.map(async d=>{let p=await this.octokit.git.createBlob({owner:e.owner,repo:e.repo,content:Buffer.from(d.content,"utf8").toString("base64"),encoding:"base64"});return{path:d.path,mode:"100644",type:"blob",sha:p.data.sha}})),l=await this.octokit.git.createTree({owner:e.owner,repo:e.repo,base_tree:a.data.tree.sha,tree:c}),u=await this.octokit.git.createCommit({owner:e.owner,repo:e.repo,message:s,tree:l.data.sha,parents:[o]});return await this.octokit.git.updateRef({owner:e.owner,repo:e.repo,ref:`heads/${n}`,sha:u.data.sha}),this.logger.info(`Committed ${r.length} file(s) to ${n}: ${u.data.sha.slice(0,7)}`),{sha:u.data.sha}}catch(i){return this.logger.error(`Could not commit to ${n}: ${i.message}`),null}}async createIssue(e,n){try{let r=await this.octokit.issues.create({owner:e.owner,repo:e.repo,title:n.title,body:n.body,labels:n.labels});return{number:r.data.number,url:r.data.html_url}}catch(r){return this.logger.error(`Could not create issue: ${r.message}`),null}}async getCollaboratorPermission(e,n){try{let r=await this.octokit.repos.getCollaboratorPermissionLevel({owner:e.owner,repo:e.repo,username:n}),s=r.data.permission,o=(r.data.role_name??s??"").toLowerCase();switch(o){case"admin":case"maintain":case"write":case"triage":case"read":case"none":return o;case"push":return"write";case"pull":return"read";default:return this.logger.warn(`Unrecognised permission \`${o}\` for ${n}; treating it as unknown and refusing.`),null}}catch(r){return rb(r)?"none":(this.logger.warn(`Could not determine ${n}'s permission on ${e.owner}/${e.repo}: ${r.message}`),null)}}async getAuthenticatedLogin(){if(this.selfLogin!==void 0)return this.selfLogin;try{let e=await this.octokit.users.getAuthenticated();this.selfLogin=e.data.login}catch{this.selfLogin=null}return this.selfLogin}async getIssue(e,n){try{let r=await this.octokit.issues.get({owner:e.owner,repo:e.repo,issue_number:n});return{number:r.data.number,body:r.data.body??null,state:r.data.state,labels:r.data.labels.map(s=>typeof s=="string"?s:s.name??"").filter(Boolean),pullRequest:!!r.data.pull_request}}catch(r){return this.logger.warn(`Could not read issue #${n}: ${r.message}`),null}}async listIssueComments(e,n){try{return(await this.octokit.issues.listComments({owner:e.owner,repo:e.repo,issue_number:n,per_page:100})).data.map(s=>({body:s.body??null,authorLogin:s.user?.login??null}))}catch(r){throw this.logger.warn(`Could not list comments on #${n}: ${r.message}`),r}}async commitExists(e,n){try{return await this.octokit.repos.getCommit({owner:e.owner,repo:e.repo,ref:n}),!0}catch{return!1}}async getBranchHead(e,n){try{return(await this.octokit.repos.getBranch({owner:e.owner,repo:e.repo,branch:n})).data.commit.sha}catch{return null}}async commentOnIssue(e,n,r){try{return await this.octokit.issues.createComment({owner:e.owner,repo:e.repo,issue_number:n,body:r}),!0}catch(s){return this.logger.warn(`Could not comment on #${n}: ${s.message}`),!1}}async findOpenPlanIssue(e,n){try{return(await this.octokit.search.issuesAndPullRequests({q:`repo:${e.owner}/${e.repo} is:issue is:open in:body "${n}"`,per_page:1})).data.items[0]?.number??null}catch{return null}}async createCheckRun(e,n){try{await this.octokit.checks.create({owner:e.owner,repo:e.repo,name:n.name,head_sha:e.afterSha,status:"completed",conclusion:n.conclusion,output:{title:n.title,summary:n.summary,text:n.text}})}catch(r){this.logger.debug(`Could not create check run: ${r.message}`)}}async findPullRequestForBranch(e,n){try{let s=(await this.octokit.pulls.list({owner:e.owner,repo:e.repo,head:`${e.owner}:${n}`,state:"all",per_page:1})).data[0];return s?{number:s.number,url:s.html_url}:null}catch{return null}}async createPullRequest(e,n){try{let r=await this.octokit.pulls.create({owner:e.owner,repo:e.repo,head:n.head,base:n.base,title:n.title,body:n.body,draft:n.draft??!1}),s=r.data.number;return await this.decoratePullRequest(e,s,n),this.logger.info(`Opened pull request #${s}: ${n.head} \u2192 ${n.base}`),{number:s,url:r.data.html_url,existing:!1}}catch(r){let s=await this.findPullRequestForBranch(e,n.head);return s?(this.logger.info(`Pull request #${s.number} already open for ${n.head}`),{...s,existing:!0}):(this.logger.error(`Could not open a pull request: ${r.message}`),null)}}async decoratePullRequest(e,n,r){if(r.labels?.length)try{await this.octokit.issues.addLabels({owner:e.owner,repo:e.repo,issue_number:n,labels:[...r.labels]})}catch(s){this.logger.warn(`Could not label #${n}: ${s.message}`)}if(r.reviewers?.length)try{let s=r.reviewers.filter(o=>o.includes("/")).map(o=>o.split("/").pop()),i=r.reviewers.filter(o=>!o.includes("/"));await this.octokit.pulls.requestReviewers({owner:e.owner,repo:e.repo,pull_number:n,reviewers:i,team_reviewers:s})}catch(s){this.logger.warn(`Could not request reviewers on #${n}: ${s.message}`)}}async updatePullRequestBody(e,n,r){try{await this.octokit.pulls.update({owner:e.owner,repo:e.repo,pull_number:n,body:r})}catch(s){this.logger.warn(`Could not update PR #${n}: ${s.message}`)}}async getDefaultBranch(e,n){try{return(await this.octokit.repos.get({owner:e,repo:n})).data.default_branch}catch{return null}}asRepoProvider(e){return{changedFiles:()=>this.changedFiles(e),readFile:(n,r)=>this.readFile(e,n,r)}}get rest(){return this.octokit}};function rb(t){return t?.status===404}function bO(t){let e=t?.status,n=t?.message??"";return e===422&&/already exists/i.test(n)}function wO(t,e){return vO(t).test(e)}function ir(t,e){return t.some(n=>wO(n,e))}var sb=new Map;function vO(t){let e=sb.get(t);if(e)return e;let n="^";for(let s=0;s<=!]+\s*/,"").replace(/^[[(]\s*/,""),e=e.split(/\s+/)[0].trim(),e=e.replace(/^v/i,"").replace(/[\])]$/,""),e=e.replace(/\+incompatible$/,""),e||null)}function te(t){let e=Jw(t);return e?nt.default.valid(e)??nt.default.valid(nt.default.coerce(e)??"")??null:null}function Od(t){let e=Jw(t);return e?nt.default.valid(e)??null:null}function Yw(t,e){if(t===null&&e!==null)return"added";if(t!==null&&e===null)return"removed";if(t===null||e===null)return"unknown";let n=te(t),r=te(e);if(!n||!r||nt.default.eq(n,r))return"unknown";switch(nt.default.diff(n,r)){case"major":case"premajor":return"major";case"minor":case"preminor":return"minor";case"patch":case"prepatch":return"patch";case"prerelease":return"prerelease";default:return"unknown"}}function Pi(t,e){let n=te(t),r=te(e);return!n||!r?!1:nt.default.lt(r,n)}function Oi(t,e){let n=te(t),r=te(e);return!n||!r||nt.default.major(n)!==0||nt.default.major(r)!==0?!1:nt.default.minor(n)!==nt.default.minor(r)}function D(t){let e=t.split("/");return(e[e.length-1]??"").toLowerCase()}function Se(t){try{return JSON.parse(t)}catch{return null}}var Xw={ecosystem:"arduino",name:"arduino",handles(t){let e=D(t);return e==="library.properties"||e==="platformio.ini"},isLockfile(){return!1},parse(t,e){return D(e)==="platformio.ini"?CD(t):RD(t)}};function RD(t){let e=new Map;for(let n of t.split(` -`)){let r=n.trim();if(r.startsWith("#"))continue;let s=/^depends\s*=\s*(.*)$/i.exec(r);if(s)for(let i of s[1].split(",")){let o=AD(i);o&&e.set(o.name,{version:o.version,kind:"runtime"})}}return e}function AD(t){let e=t.trim();if(!e)return null;let n=/^(.*?)\s*\(([^)]*)\)\s*$/.exec(e);if(n){let r=n[1].trim(),s=n[2].trim();return r?{name:r,version:s||null}:null}return{name:e,version:null}}function CD(t){let e=new Map,n=t.split(` -`),r=!1;for(let s of n){let i=s.split(/\s+[;#]/)[0],o=i.trim();if(/^\[/.test(o)){r=!1;continue}let a=/^(lib_deps[\w.]*|lib_extra_dirs|lib_ignore)\s*=\s*(.*)$/.exec(o);if(a){r=a[1].startsWith("lib_deps"),r&&a[2]&&Zw(e,a[2],"runtime");continue}if(r&&/^\s/.test(i)&&o!==""){Zw(e,o,"runtime");continue}o!==""&&(r=!1)}return e}function Zw(t,e,n){let r=e.trim();if(!r||/^[a-z+]+:\/\//i.test(r)||r.startsWith("file://")||r.startsWith(".")||r.includes("${")||/\.(git|zip|tar\.gz)$/i.test(r))return;let s=r.lastIndexOf("@"),i=s>0,o=i?r.slice(0,s):r,a=i?r.slice(s+1).trim():null,c=o.lastIndexOf("/"),l=(c===-1?o:o.slice(c+1)).trim();l&&t.set(l,{version:a||null,kind:n})}function $t(t){let e=[],n={header:"",entries:new Map,lines:[]};e.push(n);let r=t.split(` -`);for(let s=0;sas(u,"]")){let d=as(u,"[")-as(u,"]");for(;d>0&&s+1n.header===e)}function Ii(t){let e=t.trim().replace(/^\[/,"").replace(/\]$/,""),n=[];for(let r of e.matchAll(/"((?:[^"\\]|\\.)*)"|'([^']*)'/g)){let s=r[1]??r[2];s!==void 0&&n.push(s)}return n}function cs(t){let e=t.trim();return e.startsWith("{")?/(?:^|[{,]\s*)version\s*=\s*"([^"]*)"/.exec(e)?.[1]??null:/^"([^"]*)"$/.exec(e)?.[1]??/^'([^']*)'$/.exec(e)?.[1]??null}function PD(t){return t.replace(/^["']|["']$/g,"")}function Qw(t){let e=!1,n=!1;for(let r=0;r<=!]*\s*\d[^"']*)["']/g)].map(f=>f[1].trim()).filter(f=>!/^https?:/.test(f)),d=/:(path|git|podspec|svn|hg)\s*(?:=>|:)/.test(c)||l.length===0?null:l.join(", "),p=n.some(f=>/test|spec|uitest/i.test(f))?"dev":"runtime";e.set(a,{version:d,kind:p})}return e}function FD(t){let e=new Map,n=!1;for(let r of t.split(` -`)){let s=r.replace(/\r$/,"");if(!s.trim())continue;if(/^[A-Z][A-Z ]*:\s*$/.test(s.trim())&&!/^\s/.test(s)){n=s.trim()==="PODS:";continue}if(!n)continue;let i=/^ {2}- "?([\w.+/-]+)"? \(([^)]+)\)/.exec(s);i&&e.set(i[1],{version:i[2],kind:"transitive"})}return e}function qD(t){let e=new Map,n=/\.dependency\s+["']([^"']+)["'](?:\s*,\s*["']([^"']+)["'])?/g;for(let r of t.matchAll(n))e.set(r[1],{version:r[2]??null,kind:"runtime"});return e}function UD(t){let e=!1,n=!1;for(let r=0;ru.includes("indirect")?u:"").trim(),o=s.trim();if(/^require\s*\($/.test(o)){n=!0;continue}if(/^replace\s*\($/.test(o)||/^exclude\s*\($/.test(o)){r=!0;continue}if(o===")"){n=!1,r=!1;continue}if(r||o.startsWith("replace ")||o.startsWith("exclude "))continue;let a=/^require\s+(\S+)\s+(\S+)/.exec(o);if(a){e.set(a[1],{version:a[2],kind:"runtime"});continue}if(!n)continue;let c=/^(\S+)\s+(v\S+)/.exec(i||o);if(!c)continue;let l=o.includes("// indirect");e.set(c[1],{version:c[2],kind:l?"transitive":"runtime"})}return e}function zD(t){let e=new Map;for(let n of t.split(` -`)){let r=n.trim().split(/\s+/);if(r.length<3)continue;let[s,i]=r;i.endsWith("/go.mod")||e.set(s,{version:i,kind:"transitive"})}return e}var lv={ecosystem:"hex",name:"Mix",handles(t){let e=D(t);return e==="mix.exs"||e==="mix.lock"||e==="rebar.config"},isLockfile(t){return D(t)==="mix.lock"},parse(t,e){let n=D(e);return n==="mix.lock"?KD(t):n==="rebar.config"?JD(t):HD(t)}};function HD(t){let e=new Map;for(let n of t.matchAll(/\{\s*:([a-z_][a-zA-Z0-9_]*)\s*(,[^}]*)?\}/g)){let r=n[1],s=n[2]??"",i=/^,\s*"([^"]+)"/.exec(s)?.[1]??null,o=/\b(path|git|github|hg|svn):\s*/.test(s),a=o?null:i;if(!i&&!o&&!/\b(only|runtime|optional|app|manager):/.test(s))continue;let c=/\bonly:\s*(\[[^\]]*\]|:[a-z_]+)/.exec(s)?.[1]??"",l=/:(dev|test)\b/.test(c)?"dev":"runtime";e.set(r,{version:a,kind:l})}return e}function KD(t){let e=new Map,n=/"([a-z_][a-zA-Z0-9_]*)"\s*:\s*\{\s*:hex\s*,\s*:[a-zA-Z0-9_]+\s*,\s*"([^"]+)"/g;for(let r of t.matchAll(n))e.set(r[1],{version:r[2],kind:"transitive"});return e}function JD(t){let e=new Map,n=/\{\s*deps\s*,\s*\[/.exec(t);if(!n)return e;let r=1,s=n.index+n[0].length;for(;s0;s++)t[s]==="["?r+=1:t[s]==="]"&&(r-=1);let i=t.slice(n.index+n[0].length,s-1);for(let o of i.matchAll(/\{\s*([a-z_][a-zA-Z0-9_]*)\s*,\s*"([^"]+)"/g))e.set(o[1],{version:o[2],kind:"runtime"});for(let o of i.matchAll(/(?:^|[[,])\s*([a-z_][a-zA-Z0-9_]*)\s*(?=[,\]]|$)/g))e.has(o[1])||e.set(o[1],{version:null,kind:"runtime"});return e}var uv={ecosystem:"maven",name:"maven/gradle",handles(t){let e=D(t);return e==="pom.xml"||e==="build.gradle"||e==="build.gradle.kts"||e==="libs.versions.toml"||e==="gradle.lockfile"},isLockfile(t){return D(t)==="gradle.lockfile"},parse(t,e){let n=D(e);return n==="pom.xml"?YD(t):n==="gradle.lockfile"?tM(t):n==="libs.versions.toml"?eM(t):QD(t)}};function YD(t){let e=new Map,n=ZD(t);for(let r of t.matchAll(/([\s\S]*?)<\/dependency>/g)){let s=r[1],i=Di(s,"groupId"),o=Di(s,"artifactId");if(!i||!o)continue;let a=XD(Di(s,"version"),n),c=Di(s,"scope"),u=Di(s,"optional")==="true"?"optional":c==="test"||c==="provided"?"dev":"runtime";e.set(`${i}:${o}`,{version:a,kind:u})}return e}function ZD(t){let e=new Map;for(let n of t.matchAll(/([\s\S]*?)<\/properties>/g))for(let r of n[1].matchAll(/<([\w.-]+)>([^<]*)<\/\1>/g))e.set(r[1],r[2].trim());return e}function XD(t,e){if(!t)return null;let n=t;for(let r=0;r<2;r++)n=n.replace(/\$\{([^}]+)\}/g,(s,i)=>e.get(i)??s);return n.includes("${")?null:n.trim()||null}function Di(t,e){return new RegExp(`<${e}>([^<]*)`).exec(t)?.[1]?.trim()??null}function QD(t){let e=new Map,n="(?:implementation|api|compileOnly|runtimeOnly|testImplementation|testCompileOnly|annotationProcessor|kapt|ksp)";for(let r of t.matchAll(new RegExp(`${n}\\s*\\(?\\s*["']([^"']+:[^"']+)["']`,"g"))){let s=r[1].split(":");if(s.length<2)continue;let[i,o,a]=s,c=/test|androidTest/i.test(r[0]);e.set(`${i}:${o}`,{version:a??null,kind:c?"dev":"runtime"})}for(let r of t.matchAll(new RegExp(`${n}\\s*\\(?\\s*group:\\s*["']([^"']+)["'],\\s*name:\\s*["']([^"']+)["'](?:,\\s*version:\\s*["']([^"']+)["'])?`,"g")))e.set(`${r[1]}:${r[2]}`,{version:r[3]??null,kind:/test/i.test(r[0])?"dev":"runtime"});return e}function eM(t){let e=new Map,n=new Map,r="";for(let s of t.split(` -`)){let i=s.split("#")[0].trim();if(!i)continue;let o=/^\[([^\]]+)\]$/.exec(i)?.[1];if(o){r=o;continue}if(r==="versions"){let m=/^([\w.-]+)\s*=\s*["']([^"']+)["']/.exec(i);m&&n.set(m[1],m[2]);continue}if(r!=="libraries")continue;let a=/module\s*=\s*["']([^"']+)["']/.exec(i)?.[1],c=/group\s*=\s*["']([^"']+)["']/.exec(i)?.[1],l=/name\s*=\s*["']([^"']+)["']/.exec(i)?.[1],u=a??(c&&l?`${c}:${l}`:null);if(!u)continue;let d=/version\s*=\s*["']([^"']+)["']/.exec(i)?.[1],p=/version\.ref\s*=\s*["']([^"']+)["']/.exec(i)?.[1],f=d??(p?n.get(p)??null:null);e.set(u,{version:f,kind:"runtime"})}return e}function tM(t){let e=new Map;for(let n of t.split(` -`)){let r=n.trim();if(!r||r.startsWith("#"))continue;let i=r.split("=")[0].split(":");i.length<3||e.set(`${i[0]}:${i[1]}`,{version:i[2],kind:"transitive"})}return e}var pv=vt(vi(),1);var nM=new Set(["package.json"]),dv=new Set(["package-lock.json","npm-shrinkwrap.json","yarn.lock","pnpm-lock.yaml","bun.lock"]),fv={ecosystem:"npm",name:"npm/yarn/pnpm",handles(t){let e=D(t);return t.includes("node_modules/")?!1:nM.has(e)||dv.has(e)},isLockfile(t){return dv.has(D(t))},parse(t,e){let n=D(e);return n==="package.json"?iM(t):n==="yarn.lock"?lM(t):n==="pnpm-lock.yaml"?uM(t):n==="bun.lock"?rM(t):oM(t)}};function rM(t){let e=new Map,n=Se(sM(t));if(!n?.packages)return e;for(let r of Object.values(n.packages)){let s=Array.isArray(r)?r[0]:r;if(typeof s!="string")continue;let i=s.lastIndexOf("@");if(i<=0)continue;let o=s.slice(0,i),a=s.slice(i+1);/^\d/.test(a)&&e.set(o,{version:a,kind:"transitive"})}return e}function sM(t){let e="",n=!1;for(let r=0;rVI.includes(a)?(o[a]=r[a],o):(o.variables||(o.variables={}),o.variables[a]=r[a],o),{}),i=r.baseUrl||t.endpoint.DEFAULTS.baseUrl;return vb.test(i)&&(s.url=i.replace(vb,"/api/graphql")),t(s).then(o=>{if(o.data.errors){let a={};for(let c of Object.keys(o.headers))a[c]=o.headers[c];throw new BI(s,a,o.data)}return o.data.data})}function $d(t,e){let n=t.defaults(e);return Object.assign((s,i)=>zI(n,s,i),{defaults:$d.bind(null,n),endpoint:n.endpoint})}var nK=$d(Ii,{headers:{"user-agent":`octokit-graphql.js/${qI} ${gn()}`},method:"POST",url:"/graphql"});function kb(t){return $d(t,{method:"POST",url:"/graphql"})}var Rd="(?:[a-zA-Z0-9_-]+)",Eb="\\.",Sb=new RegExp(`^${Rd}${Eb}${Rd}${Eb}${Rd}$`),HI=Sb.test.bind(Sb);async function KI(t){let e=HI(t),n=t.startsWith("v1.")||t.startsWith("ghs_"),r=t.startsWith("ghu_");return{type:"token",token:t,tokenType:e?"app":n?"installation":r?"user-to-server":"oauth"}}function JI(t){return t.split(/\./).length===3?`bearer ${t}`:`token ${t}`}async function YI(t,e,n,r){let s=e.endpoint.merge(n,r);return s.headers.authorization=JI(t),e(s)}var xb=function(e){if(!e)throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");if(typeof e!="string")throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");return e=e.replace(/^(token|bearer) +/i,""),Object.assign(KI.bind(null,e),{hook:YI.bind(null,e)})};var Cd="7.0.7";var Tb=()=>{},ZI=console.warn.bind(console),XI=console.error.bind(console);function QI(t={}){return typeof t.debug!="function"&&(t.debug=Tb),typeof t.info!="function"&&(t.info=Tb),typeof t.warn!="function"&&(t.warn=ZI),typeof t.error!="function"&&(t.error=XI),t}var _b=`octokit-core.js/${Cd} ${gn()}`,Ha=class{static VERSION=Cd;static defaults(e){return class extends this{constructor(...r){let s=r[0]||{};if(typeof e=="function"){super(e(s));return}super(Object.assign({},e,s,s.userAgent&&e.userAgent?{userAgent:`${s.userAgent} ${e.userAgent}`}:null))}}}static plugins=[];static plugin(...e){let n=this.plugins;return class extends this{static plugins=n.concat(e.filter(s=>!n.includes(s)))}}constructor(e={}){let n=new Ky.Collection,r={baseUrl:Ii.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:n.bind(null,"request")}),mediaType:{previews:[],format:""}};if(r.headers["user-agent"]=e.userAgent?`${e.userAgent} ${_b}`:_b,e.baseUrl&&(r.baseUrl=e.baseUrl),e.previews&&(r.mediaType.previews=e.previews),e.timeZone&&(r.headers["time-zone"]=e.timeZone),this.request=Ii.defaults(r),this.graphql=kb(this.request).defaults(r),this.log=QI(e.log),this.hook=n,e.authStrategy){let{authStrategy:i,...o}=e,a=i(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:o},e.auth));n.wrap("request",a.hook),this.auth=a}else if(!e.auth)this.auth=async()=>({type:"unauthenticated"});else{let i=xb(e.auth);n.wrap("request",i.hook),this.auth=i}let s=this.constructor;for(let i=0;i{t.log.debug("request",n);let r=Date.now(),s=t.request.endpoint.parse(n),i=s.url.replace(n.baseUrl,"");return e(n).then(o=>{let a=o.headers["x-github-request-id"];return t.log.info(`${s.method} ${i} - ${o.status} with id ${a} in ${Date.now()-r}ms`),o}).catch(o=>{let a=o.response?.headers["x-github-request-id"]||"UNKNOWN";throw t.log.error(`${s.method} ${i} - ${o.status} with id ${a} in ${Date.now()-r}ms`),o})})}Ad.VERSION=$b;var eO="0.0.0-development";function tO(t){if(!t.data)return{...t,data:[]};if(!(("total_count"in t.data||"total_commits"in t.data)&&!("url"in t.data)))return t;let n=t.data.incomplete_results,r=t.data.repository_selection,s=t.data.total_count,i=t.data.total_commits;delete t.data.incomplete_results,delete t.data.repository_selection,delete t.data.total_count,delete t.data.total_commits;let o=Object.keys(t.data)[0],a=t.data[o];return t.data=a,typeof n<"u"&&(t.data.incomplete_results=n),typeof r<"u"&&(t.data.repository_selection=r),t.data.total_count=s,t.data.total_commits=i,t}function Pd(t,e,n){let r=typeof e=="function"?e.endpoint(n):t.request.endpoint(e,n),s=typeof e=="function"?e:t.request,i=r.method,o=r.headers,a=r.url;return{[Symbol.asyncIterator]:()=>({async next(){if(!a)return{done:!0};try{let c=await s({method:i,url:a,headers:o}),l=tO(c);if(a=((l.headers.link||"").match(/<([^<>]+)>;\s*rel="next"/)||[])[1],!a&&"total_commits"in l.data){let u=new URL(l.url),d=u.searchParams,p=parseInt(d.get("page")||"1",10),f=parseInt(d.get("per_page")||"250",10);p*f{if(s.done)return e;let i=!1;function o(){i=!0}return e=e.concat(r?r(s.value,o):s.value.data),i?e:Cb(t,e,n,r)})}var wK=Object.assign(Rb,{iterator:Pd});function Id(t){return{paginate:Object.assign(Rb.bind(null,t),{iterator:Pd.bind(null,t)})}}Id.VERSION=eO;var Od="17.0.0";var nO={actions:{addCustomLabelsToSelfHostedRunnerForOrg:["POST /orgs/{org}/actions/runners/{runner_id}/labels"],addCustomLabelsToSelfHostedRunnerForRepo:["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],addRepoAccessToSelfHostedRunnerGroupInOrg:["PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],approveWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"],cancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"],createEnvironmentVariable:["POST /repos/{owner}/{repo}/environments/{environment_name}/variables"],createHostedRunnerForOrg:["POST /orgs/{org}/actions/hosted-runners"],createOrUpdateEnvironmentSecret:["PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"],createOrgVariable:["POST /orgs/{org}/actions/variables"],createRegistrationTokenForOrg:["POST /orgs/{org}/actions/runners/registration-token"],createRegistrationTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/registration-token"],createRemoveTokenForOrg:["POST /orgs/{org}/actions/runners/remove-token"],createRemoveTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/remove-token"],createRepoVariable:["POST /repos/{owner}/{repo}/actions/variables"],createWorkflowDispatch:["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"],deleteActionsCacheById:["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],deleteActionsCacheByKey:["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],deleteArtifact:["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],deleteCustomImageFromOrg:["DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"],deleteCustomImageVersionFromOrg:["DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"],deleteEnvironmentSecret:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],deleteEnvironmentVariable:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],deleteHostedRunnerForOrg:["DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],deleteOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}"],deleteOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"],deleteRepoVariable:["DELETE /repos/{owner}/{repo}/actions/variables/{name}"],deleteSelfHostedRunnerFromOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}"],deleteSelfHostedRunnerFromRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"],deleteWorkflowRun:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],deleteWorkflowRunLogs:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],disableSelectedRepositoryGithubActionsOrganization:["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"],disableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"],downloadArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"],downloadJobLogsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"],downloadWorkflowRunAttemptLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"],downloadWorkflowRunLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],enableSelectedRepositoryGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"],enableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"],forceCancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"],generateRunnerJitconfigForOrg:["POST /orgs/{org}/actions/runners/generate-jitconfig"],generateRunnerJitconfigForRepo:["POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"],getActionsCacheList:["GET /repos/{owner}/{repo}/actions/caches"],getActionsCacheUsage:["GET /repos/{owner}/{repo}/actions/cache/usage"],getActionsCacheUsageByRepoForOrg:["GET /orgs/{org}/actions/cache/usage-by-repository"],getActionsCacheUsageForOrg:["GET /orgs/{org}/actions/cache/usage"],getAllowedActionsOrganization:["GET /orgs/{org}/actions/permissions/selected-actions"],getAllowedActionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"],getArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],getCustomImageForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}"],getCustomImageVersionForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}"],getCustomOidcSubClaimForRepo:["GET /repos/{owner}/{repo}/actions/oidc/customization/sub"],getEnvironmentPublicKey:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key"],getEnvironmentSecret:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],getEnvironmentVariable:["GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],getGithubActionsDefaultWorkflowPermissionsOrganization:["GET /orgs/{org}/actions/permissions/workflow"],getGithubActionsDefaultWorkflowPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/workflow"],getGithubActionsPermissionsOrganization:["GET /orgs/{org}/actions/permissions"],getGithubActionsPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions"],getHostedRunnerForOrg:["GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],getHostedRunnersGithubOwnedImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/github-owned"],getHostedRunnersLimitsForOrg:["GET /orgs/{org}/actions/hosted-runners/limits"],getHostedRunnersMachineSpecsForOrg:["GET /orgs/{org}/actions/hosted-runners/machine-sizes"],getHostedRunnersPartnerImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/partner"],getHostedRunnersPlatformsForOrg:["GET /orgs/{org}/actions/hosted-runners/platforms"],getJobForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],getOrgPublicKey:["GET /orgs/{org}/actions/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}"],getOrgVariable:["GET /orgs/{org}/actions/variables/{name}"],getPendingDeploymentsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],getRepoPermissions:["GET /repos/{owner}/{repo}/actions/permissions",{},{renamed:["actions","getGithubActionsPermissionsRepository"]}],getRepoPublicKey:["GET /repos/{owner}/{repo}/actions/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],getRepoVariable:["GET /repos/{owner}/{repo}/actions/variables/{name}"],getReviewsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"],getSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}"],getSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"],getWorkflow:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],getWorkflowAccessToRepository:["GET /repos/{owner}/{repo}/actions/permissions/access"],getWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],getWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],getWorkflowRunUsage:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"],getWorkflowUsage:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"],listArtifactsForRepo:["GET /repos/{owner}/{repo}/actions/artifacts"],listCustomImageVersionsForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions"],listCustomImagesForOrg:["GET /orgs/{org}/actions/hosted-runners/images/custom"],listEnvironmentSecrets:["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets"],listEnvironmentVariables:["GET /repos/{owner}/{repo}/environments/{environment_name}/variables"],listGithubHostedRunnersInGroupForOrg:["GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners"],listHostedRunnersForOrg:["GET /orgs/{org}/actions/hosted-runners"],listJobsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"],listJobsForWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],listLabelsForSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}/labels"],listLabelsForSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],listOrgSecrets:["GET /orgs/{org}/actions/secrets"],listOrgVariables:["GET /orgs/{org}/actions/variables"],listRepoOrganizationSecrets:["GET /repos/{owner}/{repo}/actions/organization-secrets"],listRepoOrganizationVariables:["GET /repos/{owner}/{repo}/actions/organization-variables"],listRepoSecrets:["GET /repos/{owner}/{repo}/actions/secrets"],listRepoVariables:["GET /repos/{owner}/{repo}/actions/variables"],listRepoWorkflows:["GET /repos/{owner}/{repo}/actions/workflows"],listRunnerApplicationsForOrg:["GET /orgs/{org}/actions/runners/downloads"],listRunnerApplicationsForRepo:["GET /repos/{owner}/{repo}/actions/runners/downloads"],listSelectedReposForOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"],listSelectedReposForOrgVariable:["GET /orgs/{org}/actions/variables/{name}/repositories"],listSelectedRepositoriesEnabledGithubActionsOrganization:["GET /orgs/{org}/actions/permissions/repositories"],listSelfHostedRunnersForOrg:["GET /orgs/{org}/actions/runners"],listSelfHostedRunnersForRepo:["GET /repos/{owner}/{repo}/actions/runners"],listWorkflowRunArtifacts:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"],listWorkflowRuns:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"],listWorkflowRunsForRepo:["GET /repos/{owner}/{repo}/actions/runs"],reRunJobForWorkflowRun:["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],reRunWorkflow:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],reRunWorkflowFailedJobs:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],removeAllCustomLabelsFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],removeAllCustomLabelsFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],removeCustomLabelFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],removeCustomLabelFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],reviewCustomGatesForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"],reviewPendingDeploymentsForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],setAllowedActionsOrganization:["PUT /orgs/{org}/actions/permissions/selected-actions"],setAllowedActionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"],setCustomLabelsForSelfHostedRunnerForOrg:["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],setCustomLabelsForSelfHostedRunnerForRepo:["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],setCustomOidcSubClaimForRepo:["PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"],setGithubActionsDefaultWorkflowPermissionsOrganization:["PUT /orgs/{org}/actions/permissions/workflow"],setGithubActionsDefaultWorkflowPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],setGithubActionsPermissionsOrganization:["PUT /orgs/{org}/actions/permissions"],setGithubActionsPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"],setSelectedReposForOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories"],setSelectedRepositoriesEnabledGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories"],setWorkflowAccessToRepository:["PUT /repos/{owner}/{repo}/actions/permissions/access"],updateEnvironmentVariable:["PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"],updateHostedRunnerForOrg:["PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"],updateOrgVariable:["PATCH /orgs/{org}/actions/variables/{name}"],updateRepoVariable:["PATCH /repos/{owner}/{repo}/actions/variables/{name}"]},activity:{checkRepoIsStarredByAuthenticatedUser:["GET /user/starred/{owner}/{repo}"],deleteRepoSubscription:["DELETE /repos/{owner}/{repo}/subscription"],deleteThreadSubscription:["DELETE /notifications/threads/{thread_id}/subscription"],getFeeds:["GET /feeds"],getRepoSubscription:["GET /repos/{owner}/{repo}/subscription"],getThread:["GET /notifications/threads/{thread_id}"],getThreadSubscriptionForAuthenticatedUser:["GET /notifications/threads/{thread_id}/subscription"],listEventsForAuthenticatedUser:["GET /users/{username}/events"],listNotificationsForAuthenticatedUser:["GET /notifications"],listOrgEventsForAuthenticatedUser:["GET /users/{username}/events/orgs/{org}"],listPublicEvents:["GET /events"],listPublicEventsForRepoNetwork:["GET /networks/{owner}/{repo}/events"],listPublicEventsForUser:["GET /users/{username}/events/public"],listPublicOrgEvents:["GET /orgs/{org}/events"],listReceivedEventsForUser:["GET /users/{username}/received_events"],listReceivedPublicEventsForUser:["GET /users/{username}/received_events/public"],listRepoEvents:["GET /repos/{owner}/{repo}/events"],listRepoNotificationsForAuthenticatedUser:["GET /repos/{owner}/{repo}/notifications"],listReposStarredByAuthenticatedUser:["GET /user/starred"],listReposStarredByUser:["GET /users/{username}/starred"],listReposWatchedByUser:["GET /users/{username}/subscriptions"],listStargazersForRepo:["GET /repos/{owner}/{repo}/stargazers"],listWatchedReposForAuthenticatedUser:["GET /user/subscriptions"],listWatchersForRepo:["GET /repos/{owner}/{repo}/subscribers"],markNotificationsAsRead:["PUT /notifications"],markRepoNotificationsAsRead:["PUT /repos/{owner}/{repo}/notifications"],markThreadAsDone:["DELETE /notifications/threads/{thread_id}"],markThreadAsRead:["PATCH /notifications/threads/{thread_id}"],setRepoSubscription:["PUT /repos/{owner}/{repo}/subscription"],setThreadSubscription:["PUT /notifications/threads/{thread_id}/subscription"],starRepoForAuthenticatedUser:["PUT /user/starred/{owner}/{repo}"],unstarRepoForAuthenticatedUser:["DELETE /user/starred/{owner}/{repo}"]},apps:{addRepoToInstallation:["PUT /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","addRepoToInstallationForAuthenticatedUser"]}],addRepoToInstallationForAuthenticatedUser:["PUT /user/installations/{installation_id}/repositories/{repository_id}"],checkToken:["POST /applications/{client_id}/token"],createFromManifest:["POST /app-manifests/{code}/conversions"],createInstallationAccessToken:["POST /app/installations/{installation_id}/access_tokens"],deleteAuthorization:["DELETE /applications/{client_id}/grant"],deleteInstallation:["DELETE /app/installations/{installation_id}"],deleteToken:["DELETE /applications/{client_id}/token"],getAuthenticated:["GET /app"],getBySlug:["GET /apps/{app_slug}"],getInstallation:["GET /app/installations/{installation_id}"],getOrgInstallation:["GET /orgs/{org}/installation"],getRepoInstallation:["GET /repos/{owner}/{repo}/installation"],getSubscriptionPlanForAccount:["GET /marketplace_listing/accounts/{account_id}"],getSubscriptionPlanForAccountStubbed:["GET /marketplace_listing/stubbed/accounts/{account_id}"],getUserInstallation:["GET /users/{username}/installation"],getWebhookConfigForApp:["GET /app/hook/config"],getWebhookDelivery:["GET /app/hook/deliveries/{delivery_id}"],listAccountsForPlan:["GET /marketplace_listing/plans/{plan_id}/accounts"],listAccountsForPlanStubbed:["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"],listInstallationReposForAuthenticatedUser:["GET /user/installations/{installation_id}/repositories"],listInstallationRequestsForAuthenticatedApp:["GET /app/installation-requests"],listInstallations:["GET /app/installations"],listInstallationsForAuthenticatedUser:["GET /user/installations"],listPlans:["GET /marketplace_listing/plans"],listPlansStubbed:["GET /marketplace_listing/stubbed/plans"],listReposAccessibleToInstallation:["GET /installation/repositories"],listSubscriptionsForAuthenticatedUser:["GET /user/marketplace_purchases"],listSubscriptionsForAuthenticatedUserStubbed:["GET /user/marketplace_purchases/stubbed"],listWebhookDeliveries:["GET /app/hook/deliveries"],redeliverWebhookDelivery:["POST /app/hook/deliveries/{delivery_id}/attempts"],removeRepoFromInstallation:["DELETE /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","removeRepoFromInstallationForAuthenticatedUser"]}],removeRepoFromInstallationForAuthenticatedUser:["DELETE /user/installations/{installation_id}/repositories/{repository_id}"],resetToken:["PATCH /applications/{client_id}/token"],revokeInstallationAccessToken:["DELETE /installation/token"],scopeToken:["POST /applications/{client_id}/token/scoped"],suspendInstallation:["PUT /app/installations/{installation_id}/suspended"],unsuspendInstallation:["DELETE /app/installations/{installation_id}/suspended"],updateWebhookConfigForApp:["PATCH /app/hook/config"]},billing:{getGithubActionsBillingOrg:["GET /orgs/{org}/settings/billing/actions"],getGithubActionsBillingUser:["GET /users/{username}/settings/billing/actions"],getGithubBillingPremiumRequestUsageReportOrg:["GET /organizations/{org}/settings/billing/premium_request/usage"],getGithubBillingPremiumRequestUsageReportUser:["GET /users/{username}/settings/billing/premium_request/usage"],getGithubBillingUsageReportOrg:["GET /organizations/{org}/settings/billing/usage"],getGithubBillingUsageReportUser:["GET /users/{username}/settings/billing/usage"],getGithubPackagesBillingOrg:["GET /orgs/{org}/settings/billing/packages"],getGithubPackagesBillingUser:["GET /users/{username}/settings/billing/packages"],getSharedStorageBillingOrg:["GET /orgs/{org}/settings/billing/shared-storage"],getSharedStorageBillingUser:["GET /users/{username}/settings/billing/shared-storage"]},campaigns:{createCampaign:["POST /orgs/{org}/campaigns"],deleteCampaign:["DELETE /orgs/{org}/campaigns/{campaign_number}"],getCampaignSummary:["GET /orgs/{org}/campaigns/{campaign_number}"],listOrgCampaigns:["GET /orgs/{org}/campaigns"],updateCampaign:["PATCH /orgs/{org}/campaigns/{campaign_number}"]},checks:{create:["POST /repos/{owner}/{repo}/check-runs"],createSuite:["POST /repos/{owner}/{repo}/check-suites"],get:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],getSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],listAnnotations:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"],listForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],listForSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"],listSuitesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],rerequestRun:["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],rerequestSuite:["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"],setSuitesPreferences:["PATCH /repos/{owner}/{repo}/check-suites/preferences"],update:["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]},codeScanning:{commitAutofix:["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits"],createAutofix:["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"],createVariantAnalysis:["POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses"],deleteAnalysis:["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"],deleteCodeqlDatabase:["DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],getAlert:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",{},{renamedParameters:{alert_id:"alert_number"}}],getAnalysis:["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"],getAutofix:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"],getCodeqlDatabase:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],getDefaultSetup:["GET /repos/{owner}/{repo}/code-scanning/default-setup"],getSarif:["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],getVariantAnalysis:["GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}"],getVariantAnalysisRepoTask:["GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}"],listAlertInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"],listAlertsForOrg:["GET /orgs/{org}/code-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/code-scanning/alerts"],listAlertsInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",{},{renamed:["codeScanning","listAlertInstances"]}],listCodeqlDatabases:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"],listRecentAnalyses:["GET /repos/{owner}/{repo}/code-scanning/analyses"],updateAlert:["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"],updateDefaultSetup:["PATCH /repos/{owner}/{repo}/code-scanning/default-setup"],uploadSarif:["POST /repos/{owner}/{repo}/code-scanning/sarifs"]},codeSecurity:{attachConfiguration:["POST /orgs/{org}/code-security/configurations/{configuration_id}/attach"],attachEnterpriseConfiguration:["POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach"],createConfiguration:["POST /orgs/{org}/code-security/configurations"],createConfigurationForEnterprise:["POST /enterprises/{enterprise}/code-security/configurations"],deleteConfiguration:["DELETE /orgs/{org}/code-security/configurations/{configuration_id}"],deleteConfigurationForEnterprise:["DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}"],detachConfiguration:["DELETE /orgs/{org}/code-security/configurations/detach"],getConfiguration:["GET /orgs/{org}/code-security/configurations/{configuration_id}"],getConfigurationForRepository:["GET /repos/{owner}/{repo}/code-security-configuration"],getConfigurationsForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations"],getConfigurationsForOrg:["GET /orgs/{org}/code-security/configurations"],getDefaultConfigurations:["GET /orgs/{org}/code-security/configurations/defaults"],getDefaultConfigurationsForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations/defaults"],getRepositoriesForConfiguration:["GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories"],getRepositoriesForEnterpriseConfiguration:["GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories"],getSingleConfigurationForEnterprise:["GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}"],setConfigurationAsDefault:["PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults"],setConfigurationAsDefaultForEnterprise:["PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults"],updateConfiguration:["PATCH /orgs/{org}/code-security/configurations/{configuration_id}"],updateEnterpriseConfiguration:["PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}"]},codesOfConduct:{getAllCodesOfConduct:["GET /codes_of_conduct"],getConductCode:["GET /codes_of_conduct/{key}"]},codespaces:{addRepositoryForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],checkPermissionsForDevcontainer:["GET /repos/{owner}/{repo}/codespaces/permissions_check"],codespaceMachinesForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/machines"],createForAuthenticatedUser:["POST /user/codespaces"],createOrUpdateOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],createOrUpdateSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}"],createWithPrForAuthenticatedUser:["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],createWithRepoForAuthenticatedUser:["POST /repos/{owner}/{repo}/codespaces"],deleteForAuthenticatedUser:["DELETE /user/codespaces/{codespace_name}"],deleteFromOrganization:["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],deleteOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],deleteSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}"],exportForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/exports"],getCodespacesForUserInOrg:["GET /orgs/{org}/members/{username}/codespaces"],getExportDetailsForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/exports/{export_id}"],getForAuthenticatedUser:["GET /user/codespaces/{codespace_name}"],getOrgPublicKey:["GET /orgs/{org}/codespaces/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}"],getPublicKeyForAuthenticatedUser:["GET /user/codespaces/secrets/public-key"],getRepoPublicKey:["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],getSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}"],listDevcontainersInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/devcontainers"],listForAuthenticatedUser:["GET /user/codespaces"],listInOrganization:["GET /orgs/{org}/codespaces",{},{renamedParameters:{org_id:"org"}}],listInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces"],listOrgSecrets:["GET /orgs/{org}/codespaces/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/codespaces/secrets"],listRepositoriesForSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}/repositories"],listSecretsForAuthenticatedUser:["GET /user/codespaces/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],preFlightWithRepoForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/new"],publishForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/publish"],removeRepositoryForSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],repoMachinesForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/machines"],setRepositoriesForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],startForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/start"],stopForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/stop"],stopInOrganization:["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],updateForAuthenticatedUser:["PATCH /user/codespaces/{codespace_name}"]},copilot:{addCopilotSeatsForTeams:["POST /orgs/{org}/copilot/billing/selected_teams"],addCopilotSeatsForUsers:["POST /orgs/{org}/copilot/billing/selected_users"],cancelCopilotSeatAssignmentForTeams:["DELETE /orgs/{org}/copilot/billing/selected_teams"],cancelCopilotSeatAssignmentForUsers:["DELETE /orgs/{org}/copilot/billing/selected_users"],copilotMetricsForOrganization:["GET /orgs/{org}/copilot/metrics"],copilotMetricsForTeam:["GET /orgs/{org}/team/{team_slug}/copilot/metrics"],getCopilotOrganizationDetails:["GET /orgs/{org}/copilot/billing"],getCopilotSeatDetailsForUser:["GET /orgs/{org}/members/{username}/copilot"],listCopilotSeats:["GET /orgs/{org}/copilot/billing/seats"]},credentials:{revoke:["POST /credentials/revoke"]},dependabot:{addSelectedRepoToOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],deleteOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],getAlert:["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],getOrgPublicKey:["GET /orgs/{org}/dependabot/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}"],getRepoPublicKey:["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],listAlertsForEnterprise:["GET /enterprises/{enterprise}/dependabot/alerts"],listAlertsForOrg:["GET /orgs/{org}/dependabot/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/dependabot/alerts"],listOrgSecrets:["GET /orgs/{org}/dependabot/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/dependabot/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],repositoryAccessForOrg:["GET /organizations/{org}/dependabot/repository-access"],setRepositoryAccessDefaultLevel:["PUT /organizations/{org}/dependabot/repository-access/default-level"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],updateAlert:["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],updateRepositoryAccessForOrg:["PATCH /organizations/{org}/dependabot/repository-access"]},dependencyGraph:{createRepositorySnapshot:["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],diffRange:["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"],exportSbom:["GET /repos/{owner}/{repo}/dependency-graph/sbom"]},emojis:{get:["GET /emojis"]},enterpriseTeamMemberships:{add:["PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"],bulkAdd:["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add"],bulkRemove:["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove"],get:["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"],list:["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"],remove:["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"]},enterpriseTeamOrganizations:{add:["PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],bulkAdd:["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add"],bulkRemove:["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove"],delete:["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],getAssignment:["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"],getAssignments:["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations"]},enterpriseTeams:{create:["POST /enterprises/{enterprise}/teams"],delete:["DELETE /enterprises/{enterprise}/teams/{team_slug}"],get:["GET /enterprises/{enterprise}/teams/{team_slug}"],list:["GET /enterprises/{enterprise}/teams"],update:["PATCH /enterprises/{enterprise}/teams/{team_slug}"]},gists:{checkIsStarred:["GET /gists/{gist_id}/star"],create:["POST /gists"],createComment:["POST /gists/{gist_id}/comments"],delete:["DELETE /gists/{gist_id}"],deleteComment:["DELETE /gists/{gist_id}/comments/{comment_id}"],fork:["POST /gists/{gist_id}/forks"],get:["GET /gists/{gist_id}"],getComment:["GET /gists/{gist_id}/comments/{comment_id}"],getRevision:["GET /gists/{gist_id}/{sha}"],list:["GET /gists"],listComments:["GET /gists/{gist_id}/comments"],listCommits:["GET /gists/{gist_id}/commits"],listForUser:["GET /users/{username}/gists"],listForks:["GET /gists/{gist_id}/forks"],listPublic:["GET /gists/public"],listStarred:["GET /gists/starred"],star:["PUT /gists/{gist_id}/star"],unstar:["DELETE /gists/{gist_id}/star"],update:["PATCH /gists/{gist_id}"],updateComment:["PATCH /gists/{gist_id}/comments/{comment_id}"]},git:{createBlob:["POST /repos/{owner}/{repo}/git/blobs"],createCommit:["POST /repos/{owner}/{repo}/git/commits"],createRef:["POST /repos/{owner}/{repo}/git/refs"],createTag:["POST /repos/{owner}/{repo}/git/tags"],createTree:["POST /repos/{owner}/{repo}/git/trees"],deleteRef:["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],getBlob:["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],getCommit:["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],getRef:["GET /repos/{owner}/{repo}/git/ref/{ref}"],getTag:["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],getTree:["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],listMatchingRefs:["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],updateRef:["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]},gitignore:{getAllTemplates:["GET /gitignore/templates"],getTemplate:["GET /gitignore/templates/{name}"]},hostedCompute:{createNetworkConfigurationForOrg:["POST /orgs/{org}/settings/network-configurations"],deleteNetworkConfigurationFromOrg:["DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}"],getNetworkConfigurationForOrg:["GET /orgs/{org}/settings/network-configurations/{network_configuration_id}"],getNetworkSettingsForOrg:["GET /orgs/{org}/settings/network-settings/{network_settings_id}"],listNetworkConfigurationsForOrg:["GET /orgs/{org}/settings/network-configurations"],updateNetworkConfigurationForOrg:["PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}"]},interactions:{getRestrictionsForAuthenticatedUser:["GET /user/interaction-limits"],getRestrictionsForOrg:["GET /orgs/{org}/interaction-limits"],getRestrictionsForRepo:["GET /repos/{owner}/{repo}/interaction-limits"],getRestrictionsForYourPublicRepos:["GET /user/interaction-limits",{},{renamed:["interactions","getRestrictionsForAuthenticatedUser"]}],removeRestrictionsForAuthenticatedUser:["DELETE /user/interaction-limits"],removeRestrictionsForOrg:["DELETE /orgs/{org}/interaction-limits"],removeRestrictionsForRepo:["DELETE /repos/{owner}/{repo}/interaction-limits"],removeRestrictionsForYourPublicRepos:["DELETE /user/interaction-limits",{},{renamed:["interactions","removeRestrictionsForAuthenticatedUser"]}],setRestrictionsForAuthenticatedUser:["PUT /user/interaction-limits"],setRestrictionsForOrg:["PUT /orgs/{org}/interaction-limits"],setRestrictionsForRepo:["PUT /repos/{owner}/{repo}/interaction-limits"],setRestrictionsForYourPublicRepos:["PUT /user/interaction-limits",{},{renamed:["interactions","setRestrictionsForAuthenticatedUser"]}]},issues:{addAssignees:["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"],addBlockedByDependency:["POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"],addLabels:["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],addSubIssue:["POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"],checkUserCanBeAssigned:["GET /repos/{owner}/{repo}/assignees/{assignee}"],checkUserCanBeAssignedToIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"],create:["POST /repos/{owner}/{repo}/issues"],createComment:["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"],createLabel:["POST /repos/{owner}/{repo}/labels"],createMilestone:["POST /repos/{owner}/{repo}/milestones"],deleteComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"],deleteLabel:["DELETE /repos/{owner}/{repo}/labels/{name}"],deleteMilestone:["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"],get:["GET /repos/{owner}/{repo}/issues/{issue_number}"],getComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],getEvent:["GET /repos/{owner}/{repo}/issues/events/{event_id}"],getLabel:["GET /repos/{owner}/{repo}/labels/{name}"],getMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],getParent:["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"],list:["GET /issues"],listAssignees:["GET /repos/{owner}/{repo}/assignees"],listComments:["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],listCommentsForRepo:["GET /repos/{owner}/{repo}/issues/comments"],listDependenciesBlockedBy:["GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"],listDependenciesBlocking:["GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking"],listEvents:["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],listEventsForRepo:["GET /repos/{owner}/{repo}/issues/events"],listEventsForTimeline:["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"],listForAuthenticatedUser:["GET /user/issues"],listForOrg:["GET /orgs/{org}/issues"],listForRepo:["GET /repos/{owner}/{repo}/issues"],listLabelsForMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"],listLabelsForRepo:["GET /repos/{owner}/{repo}/labels"],listLabelsOnIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"],listMilestones:["GET /repos/{owner}/{repo}/milestones"],listSubIssues:["GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"],lock:["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],removeAllLabels:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"],removeAssignees:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"],removeDependencyBlockedBy:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}"],removeLabel:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"],removeSubIssue:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue"],reprioritizeSubIssue:["PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority"],setLabels:["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],unlock:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],update:["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],updateComment:["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],updateLabel:["PATCH /repos/{owner}/{repo}/labels/{name}"],updateMilestone:["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"]},licenses:{get:["GET /licenses/{license}"],getAllCommonlyUsed:["GET /licenses"],getForRepo:["GET /repos/{owner}/{repo}/license"]},markdown:{render:["POST /markdown"],renderRaw:["POST /markdown/raw",{headers:{"content-type":"text/plain; charset=utf-8"}}]},meta:{get:["GET /meta"],getAllVersions:["GET /versions"],getOctocat:["GET /octocat"],getZen:["GET /zen"],root:["GET /"]},migrations:{deleteArchiveForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/archive"],deleteArchiveForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/archive"],downloadArchiveForOrg:["GET /orgs/{org}/migrations/{migration_id}/archive"],getArchiveForAuthenticatedUser:["GET /user/migrations/{migration_id}/archive"],getStatusForAuthenticatedUser:["GET /user/migrations/{migration_id}"],getStatusForOrg:["GET /orgs/{org}/migrations/{migration_id}"],listForAuthenticatedUser:["GET /user/migrations"],listForOrg:["GET /orgs/{org}/migrations"],listReposForAuthenticatedUser:["GET /user/migrations/{migration_id}/repositories"],listReposForOrg:["GET /orgs/{org}/migrations/{migration_id}/repositories"],listReposForUser:["GET /user/migrations/{migration_id}/repositories",{},{renamed:["migrations","listReposForAuthenticatedUser"]}],startForAuthenticatedUser:["POST /user/migrations"],startForOrg:["POST /orgs/{org}/migrations"],unlockRepoForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"],unlockRepoForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"]},oidc:{getOidcCustomSubTemplateForOrg:["GET /orgs/{org}/actions/oidc/customization/sub"],updateOidcCustomSubTemplateForOrg:["PUT /orgs/{org}/actions/oidc/customization/sub"]},orgs:{addSecurityManagerTeam:["PUT /orgs/{org}/security-managers/teams/{team_slug}",{},{deprecated:"octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team"}],assignTeamToOrgRole:["PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],assignUserToOrgRole:["PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"],blockUser:["PUT /orgs/{org}/blocks/{username}"],cancelInvitation:["DELETE /orgs/{org}/invitations/{invitation_id}"],checkBlockedUser:["GET /orgs/{org}/blocks/{username}"],checkMembershipForUser:["GET /orgs/{org}/members/{username}"],checkPublicMembershipForUser:["GET /orgs/{org}/public_members/{username}"],convertMemberToOutsideCollaborator:["PUT /orgs/{org}/outside_collaborators/{username}"],createArtifactStorageRecord:["POST /orgs/{org}/artifacts/metadata/storage-record"],createInvitation:["POST /orgs/{org}/invitations"],createIssueType:["POST /orgs/{org}/issue-types"],createWebhook:["POST /orgs/{org}/hooks"],customPropertiesForOrgsCreateOrUpdateOrganizationValues:["PATCH /organizations/{org}/org-properties/values"],customPropertiesForOrgsGetOrganizationValues:["GET /organizations/{org}/org-properties/values"],customPropertiesForReposCreateOrUpdateOrganizationDefinition:["PUT /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposCreateOrUpdateOrganizationDefinitions:["PATCH /orgs/{org}/properties/schema"],customPropertiesForReposCreateOrUpdateOrganizationValues:["PATCH /orgs/{org}/properties/values"],customPropertiesForReposDeleteOrganizationDefinition:["DELETE /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposGetOrganizationDefinition:["GET /orgs/{org}/properties/schema/{custom_property_name}"],customPropertiesForReposGetOrganizationDefinitions:["GET /orgs/{org}/properties/schema"],customPropertiesForReposGetOrganizationValues:["GET /orgs/{org}/properties/values"],delete:["DELETE /orgs/{org}"],deleteAttestationsBulk:["POST /orgs/{org}/attestations/delete-request"],deleteAttestationsById:["DELETE /orgs/{org}/attestations/{attestation_id}"],deleteAttestationsBySubjectDigest:["DELETE /orgs/{org}/attestations/digest/{subject_digest}"],deleteIssueType:["DELETE /orgs/{org}/issue-types/{issue_type_id}"],deleteWebhook:["DELETE /orgs/{org}/hooks/{hook_id}"],disableSelectedRepositoryImmutableReleasesOrganization:["DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"],enableSelectedRepositoryImmutableReleasesOrganization:["PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}"],get:["GET /orgs/{org}"],getImmutableReleasesSettings:["GET /orgs/{org}/settings/immutable-releases"],getImmutableReleasesSettingsRepositories:["GET /orgs/{org}/settings/immutable-releases/repositories"],getMembershipForAuthenticatedUser:["GET /user/memberships/orgs/{org}"],getMembershipForUser:["GET /orgs/{org}/memberships/{username}"],getOrgRole:["GET /orgs/{org}/organization-roles/{role_id}"],getOrgRulesetHistory:["GET /orgs/{org}/rulesets/{ruleset_id}/history"],getOrgRulesetVersion:["GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"],getWebhook:["GET /orgs/{org}/hooks/{hook_id}"],getWebhookConfigForOrg:["GET /orgs/{org}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],list:["GET /organizations"],listAppInstallations:["GET /orgs/{org}/installations"],listArtifactStorageRecords:["GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records"],listAttestationRepositories:["GET /orgs/{org}/attestations/repositories"],listAttestations:["GET /orgs/{org}/attestations/{subject_digest}"],listAttestationsBulk:["POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"],listBlockedUsers:["GET /orgs/{org}/blocks"],listFailedInvitations:["GET /orgs/{org}/failed_invitations"],listForAuthenticatedUser:["GET /user/orgs"],listForUser:["GET /users/{username}/orgs"],listInvitationTeams:["GET /orgs/{org}/invitations/{invitation_id}/teams"],listIssueTypes:["GET /orgs/{org}/issue-types"],listMembers:["GET /orgs/{org}/members"],listMembershipsForAuthenticatedUser:["GET /user/memberships/orgs"],listOrgRoleTeams:["GET /orgs/{org}/organization-roles/{role_id}/teams"],listOrgRoleUsers:["GET /orgs/{org}/organization-roles/{role_id}/users"],listOrgRoles:["GET /orgs/{org}/organization-roles"],listOrganizationFineGrainedPermissions:["GET /orgs/{org}/organization-fine-grained-permissions"],listOutsideCollaborators:["GET /orgs/{org}/outside_collaborators"],listPatGrantRepositories:["GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"],listPatGrantRequestRepositories:["GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"],listPatGrantRequests:["GET /orgs/{org}/personal-access-token-requests"],listPatGrants:["GET /orgs/{org}/personal-access-tokens"],listPendingInvitations:["GET /orgs/{org}/invitations"],listPublicMembers:["GET /orgs/{org}/public_members"],listSecurityManagerTeams:["GET /orgs/{org}/security-managers",{},{deprecated:"octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams"}],listWebhookDeliveries:["GET /orgs/{org}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /orgs/{org}/hooks"],pingWebhook:["POST /orgs/{org}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeMember:["DELETE /orgs/{org}/members/{username}"],removeMembershipForUser:["DELETE /orgs/{org}/memberships/{username}"],removeOutsideCollaborator:["DELETE /orgs/{org}/outside_collaborators/{username}"],removePublicMembershipForAuthenticatedUser:["DELETE /orgs/{org}/public_members/{username}"],removeSecurityManagerTeam:["DELETE /orgs/{org}/security-managers/teams/{team_slug}",{},{deprecated:"octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team"}],reviewPatGrantRequest:["POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"],reviewPatGrantRequestsInBulk:["POST /orgs/{org}/personal-access-token-requests"],revokeAllOrgRolesTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}"],revokeAllOrgRolesUser:["DELETE /orgs/{org}/organization-roles/users/{username}"],revokeOrgRoleTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],revokeOrgRoleUser:["DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"],setImmutableReleasesSettings:["PUT /orgs/{org}/settings/immutable-releases"],setImmutableReleasesSettingsRepositories:["PUT /orgs/{org}/settings/immutable-releases/repositories"],setMembershipForUser:["PUT /orgs/{org}/memberships/{username}"],setPublicMembershipForAuthenticatedUser:["PUT /orgs/{org}/public_members/{username}"],unblockUser:["DELETE /orgs/{org}/blocks/{username}"],update:["PATCH /orgs/{org}"],updateIssueType:["PUT /orgs/{org}/issue-types/{issue_type_id}"],updateMembershipForAuthenticatedUser:["PATCH /user/memberships/orgs/{org}"],updatePatAccess:["POST /orgs/{org}/personal-access-tokens/{pat_id}"],updatePatAccesses:["POST /orgs/{org}/personal-access-tokens"],updateWebhook:["PATCH /orgs/{org}/hooks/{hook_id}"],updateWebhookConfigForOrg:["PATCH /orgs/{org}/hooks/{hook_id}/config"]},packages:{deletePackageForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}"],deletePackageForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}"],deletePackageForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}"],deletePackageVersionForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getAllPackageVersionsForAPackageOwnedByAnOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByOrg"]}],getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByAuthenticatedUser"]}],getAllPackageVersionsForPackageOwnedByAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions"],getPackageForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}"],getPackageForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}"],getPackageForUser:["GET /users/{username}/packages/{package_type}/{package_name}"],getPackageVersionForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],listDockerMigrationConflictingPackagesForAuthenticatedUser:["GET /user/docker/conflicts"],listDockerMigrationConflictingPackagesForOrganization:["GET /orgs/{org}/docker/conflicts"],listDockerMigrationConflictingPackagesForUser:["GET /users/{username}/docker/conflicts"],listPackagesForAuthenticatedUser:["GET /user/packages"],listPackagesForOrganization:["GET /orgs/{org}/packages"],listPackagesForUser:["GET /users/{username}/packages"],restorePackageForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForUser:["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageVersionForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForUser:["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]},privateRegistries:{createOrgPrivateRegistry:["POST /orgs/{org}/private-registries"],deleteOrgPrivateRegistry:["DELETE /orgs/{org}/private-registries/{secret_name}"],getOrgPrivateRegistry:["GET /orgs/{org}/private-registries/{secret_name}"],getOrgPublicKey:["GET /orgs/{org}/private-registries/public-key"],listOrgPrivateRegistries:["GET /orgs/{org}/private-registries"],updateOrgPrivateRegistry:["PATCH /orgs/{org}/private-registries/{secret_name}"]},projects:{addItemForOrg:["POST /orgs/{org}/projectsV2/{project_number}/items"],addItemForUser:["POST /users/{username}/projectsV2/{project_number}/items"],deleteItemForOrg:["DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],deleteItemForUser:["DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}"],getFieldForOrg:["GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"],getFieldForUser:["GET /users/{username}/projectsV2/{project_number}/fields/{field_id}"],getForOrg:["GET /orgs/{org}/projectsV2/{project_number}"],getForUser:["GET /users/{username}/projectsV2/{project_number}"],getOrgItem:["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],getUserItem:["GET /users/{username}/projectsV2/{project_number}/items/{item_id}"],listFieldsForOrg:["GET /orgs/{org}/projectsV2/{project_number}/fields"],listFieldsForUser:["GET /users/{username}/projectsV2/{project_number}/fields"],listForOrg:["GET /orgs/{org}/projectsV2"],listForUser:["GET /users/{username}/projectsV2"],listItemsForOrg:["GET /orgs/{org}/projectsV2/{project_number}/items"],listItemsForUser:["GET /users/{username}/projectsV2/{project_number}/items"],updateItemForOrg:["PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],updateItemForUser:["PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}"]},pulls:{checkIfMerged:["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],create:["POST /repos/{owner}/{repo}/pulls"],createReplyForReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"],createReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],createReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"],deletePendingReview:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],deleteReviewComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"],dismissReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"],get:["GET /repos/{owner}/{repo}/pulls/{pull_number}"],getReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],getReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],list:["GET /repos/{owner}/{repo}/pulls"],listCommentsForReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"],listCommits:["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],listFiles:["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],listRequestedReviewers:["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],listReviewComments:["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"],listReviewCommentsForRepo:["GET /repos/{owner}/{repo}/pulls/comments"],listReviews:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],merge:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],removeRequestedReviewers:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],requestReviewers:["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],submitReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"],update:["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],updateBranch:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"],updateReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],updateReviewComment:["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"]},rateLimit:{get:["GET /rate_limit"]},reactions:{createForCommitComment:["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"],createForIssue:["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],createForIssueComment:["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],createForPullRequestReviewComment:["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],createForRelease:["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],createForTeamDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],createForTeamDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],deleteForCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],deleteForIssue:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],deleteForIssueComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],deleteForPullRequestComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],deleteForRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],deleteForTeamDiscussion:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],deleteForTeamDiscussionComment:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],listForCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],listForIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],listForIssueComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],listForPullRequestReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],listForRelease:["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],listForTeamDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],listForTeamDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]},repos:{acceptInvitation:["PATCH /user/repository_invitations/{invitation_id}",{},{renamed:["repos","acceptInvitationForAuthenticatedUser"]}],acceptInvitationForAuthenticatedUser:["PATCH /user/repository_invitations/{invitation_id}"],addAppAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],addCollaborator:["PUT /repos/{owner}/{repo}/collaborators/{username}"],addStatusCheckContexts:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],addTeamAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],addUserAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],cancelPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"],checkAutomatedSecurityFixes:["GET /repos/{owner}/{repo}/automated-security-fixes"],checkCollaborator:["GET /repos/{owner}/{repo}/collaborators/{username}"],checkImmutableReleases:["GET /repos/{owner}/{repo}/immutable-releases"],checkPrivateVulnerabilityReporting:["GET /repos/{owner}/{repo}/private-vulnerability-reporting"],checkVulnerabilityAlerts:["GET /repos/{owner}/{repo}/vulnerability-alerts"],codeownersErrors:["GET /repos/{owner}/{repo}/codeowners/errors"],compareCommits:["GET /repos/{owner}/{repo}/compare/{base}...{head}"],compareCommitsWithBasehead:["GET /repos/{owner}/{repo}/compare/{basehead}"],createAttestation:["POST /repos/{owner}/{repo}/attestations"],createAutolink:["POST /repos/{owner}/{repo}/autolinks"],createCommitComment:["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],createCommitSignatureProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],createCommitStatus:["POST /repos/{owner}/{repo}/statuses/{sha}"],createDeployKey:["POST /repos/{owner}/{repo}/keys"],createDeployment:["POST /repos/{owner}/{repo}/deployments"],createDeploymentBranchPolicy:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],createDeploymentProtectionRule:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],createDeploymentStatus:["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],createDispatchEvent:["POST /repos/{owner}/{repo}/dispatches"],createForAuthenticatedUser:["POST /user/repos"],createFork:["POST /repos/{owner}/{repo}/forks"],createInOrg:["POST /orgs/{org}/repos"],createOrUpdateEnvironment:["PUT /repos/{owner}/{repo}/environments/{environment_name}"],createOrUpdateFileContents:["PUT /repos/{owner}/{repo}/contents/{path}"],createOrgRuleset:["POST /orgs/{org}/rulesets"],createPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments"],createPagesSite:["POST /repos/{owner}/{repo}/pages"],createRelease:["POST /repos/{owner}/{repo}/releases"],createRepoRuleset:["POST /repos/{owner}/{repo}/rulesets"],createUsingTemplate:["POST /repos/{template_owner}/{template_repo}/generate"],createWebhook:["POST /repos/{owner}/{repo}/hooks"],customPropertiesForReposCreateOrUpdateRepositoryValues:["PATCH /repos/{owner}/{repo}/properties/values"],customPropertiesForReposGetRepositoryValues:["GET /repos/{owner}/{repo}/properties/values"],declineInvitation:["DELETE /user/repository_invitations/{invitation_id}",{},{renamed:["repos","declineInvitationForAuthenticatedUser"]}],declineInvitationForAuthenticatedUser:["DELETE /user/repository_invitations/{invitation_id}"],delete:["DELETE /repos/{owner}/{repo}"],deleteAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],deleteAdminBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],deleteAnEnvironment:["DELETE /repos/{owner}/{repo}/environments/{environment_name}"],deleteAutolink:["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],deleteBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"],deleteCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],deleteCommitSignatureProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],deleteDeployKey:["DELETE /repos/{owner}/{repo}/keys/{key_id}"],deleteDeployment:["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"],deleteDeploymentBranchPolicy:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],deleteFile:["DELETE /repos/{owner}/{repo}/contents/{path}"],deleteInvitation:["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"],deleteOrgRuleset:["DELETE /orgs/{org}/rulesets/{ruleset_id}"],deletePagesSite:["DELETE /repos/{owner}/{repo}/pages"],deletePullRequestReviewProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],deleteRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}"],deleteReleaseAsset:["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"],deleteRepoRuleset:["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],deleteWebhook:["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],disableAutomatedSecurityFixes:["DELETE /repos/{owner}/{repo}/automated-security-fixes"],disableDeploymentProtectionRule:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],disableImmutableReleases:["DELETE /repos/{owner}/{repo}/immutable-releases"],disablePrivateVulnerabilityReporting:["DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"],disableVulnerabilityAlerts:["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],downloadArchive:["GET /repos/{owner}/{repo}/zipball/{ref}",{},{renamed:["repos","downloadZipballArchive"]}],downloadTarballArchive:["GET /repos/{owner}/{repo}/tarball/{ref}"],downloadZipballArchive:["GET /repos/{owner}/{repo}/zipball/{ref}"],enableAutomatedSecurityFixes:["PUT /repos/{owner}/{repo}/automated-security-fixes"],enableImmutableReleases:["PUT /repos/{owner}/{repo}/immutable-releases"],enablePrivateVulnerabilityReporting:["PUT /repos/{owner}/{repo}/private-vulnerability-reporting"],enableVulnerabilityAlerts:["PUT /repos/{owner}/{repo}/vulnerability-alerts"],generateReleaseNotes:["POST /repos/{owner}/{repo}/releases/generate-notes"],get:["GET /repos/{owner}/{repo}"],getAccessRestrictions:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],getAdminBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],getAllDeploymentProtectionRules:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],getAllEnvironments:["GET /repos/{owner}/{repo}/environments"],getAllStatusCheckContexts:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"],getAllTopics:["GET /repos/{owner}/{repo}/topics"],getAppsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],getAutolink:["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],getBranch:["GET /repos/{owner}/{repo}/branches/{branch}"],getBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection"],getBranchRules:["GET /repos/{owner}/{repo}/rules/branches/{branch}"],getClones:["GET /repos/{owner}/{repo}/traffic/clones"],getCodeFrequencyStats:["GET /repos/{owner}/{repo}/stats/code_frequency"],getCollaboratorPermissionLevel:["GET /repos/{owner}/{repo}/collaborators/{username}/permission"],getCombinedStatusForRef:["GET /repos/{owner}/{repo}/commits/{ref}/status"],getCommit:["GET /repos/{owner}/{repo}/commits/{ref}"],getCommitActivityStats:["GET /repos/{owner}/{repo}/stats/commit_activity"],getCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}"],getCommitSignatureProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],getCommunityProfileMetrics:["GET /repos/{owner}/{repo}/community/profile"],getContent:["GET /repos/{owner}/{repo}/contents/{path}"],getContributorsStats:["GET /repos/{owner}/{repo}/stats/contributors"],getCustomDeploymentProtectionRule:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],getDeployKey:["GET /repos/{owner}/{repo}/keys/{key_id}"],getDeployment:["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],getDeploymentBranchPolicy:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],getDeploymentStatus:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"],getEnvironment:["GET /repos/{owner}/{repo}/environments/{environment_name}"],getLatestPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/latest"],getLatestRelease:["GET /repos/{owner}/{repo}/releases/latest"],getOrgRuleSuite:["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],getOrgRuleSuites:["GET /orgs/{org}/rulesets/rule-suites"],getOrgRuleset:["GET /orgs/{org}/rulesets/{ruleset_id}"],getOrgRulesets:["GET /orgs/{org}/rulesets"],getPages:["GET /repos/{owner}/{repo}/pages"],getPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],getPagesDeployment:["GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"],getPagesHealthCheck:["GET /repos/{owner}/{repo}/pages/health"],getParticipationStats:["GET /repos/{owner}/{repo}/stats/participation"],getPullRequestReviewProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],getPunchCardStats:["GET /repos/{owner}/{repo}/stats/punch_card"],getReadme:["GET /repos/{owner}/{repo}/readme"],getReadmeInDirectory:["GET /repos/{owner}/{repo}/readme/{dir}"],getRelease:["GET /repos/{owner}/{repo}/releases/{release_id}"],getReleaseAsset:["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],getReleaseByTag:["GET /repos/{owner}/{repo}/releases/tags/{tag}"],getRepoRuleSuite:["GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"],getRepoRuleSuites:["GET /repos/{owner}/{repo}/rulesets/rule-suites"],getRepoRuleset:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],getRepoRulesetHistory:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"],getRepoRulesetVersion:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"],getRepoRulesets:["GET /repos/{owner}/{repo}/rulesets"],getStatusChecksProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],getTeamsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"],getTopPaths:["GET /repos/{owner}/{repo}/traffic/popular/paths"],getTopReferrers:["GET /repos/{owner}/{repo}/traffic/popular/referrers"],getUsersWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"],getViews:["GET /repos/{owner}/{repo}/traffic/views"],getWebhook:["GET /repos/{owner}/{repo}/hooks/{hook_id}"],getWebhookConfigForRepo:["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],listActivities:["GET /repos/{owner}/{repo}/activity"],listAttestations:["GET /repos/{owner}/{repo}/attestations/{subject_digest}"],listAutolinks:["GET /repos/{owner}/{repo}/autolinks"],listBranches:["GET /repos/{owner}/{repo}/branches"],listBranchesForHeadCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],listCollaborators:["GET /repos/{owner}/{repo}/collaborators"],listCommentsForCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"],listCommitCommentsForRepo:["GET /repos/{owner}/{repo}/comments"],listCommitStatusesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/statuses"],listCommits:["GET /repos/{owner}/{repo}/commits"],listContributors:["GET /repos/{owner}/{repo}/contributors"],listCustomDeploymentRuleIntegrations:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"],listDeployKeys:["GET /repos/{owner}/{repo}/keys"],listDeploymentBranchPolicies:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],listDeploymentStatuses:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],listDeployments:["GET /repos/{owner}/{repo}/deployments"],listForAuthenticatedUser:["GET /user/repos"],listForOrg:["GET /orgs/{org}/repos"],listForUser:["GET /users/{username}/repos"],listForks:["GET /repos/{owner}/{repo}/forks"],listInvitations:["GET /repos/{owner}/{repo}/invitations"],listInvitationsForAuthenticatedUser:["GET /user/repository_invitations"],listLanguages:["GET /repos/{owner}/{repo}/languages"],listPagesBuilds:["GET /repos/{owner}/{repo}/pages/builds"],listPublic:["GET /repositories"],listPullRequestsAssociatedWithCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"],listReleaseAssets:["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],listReleases:["GET /repos/{owner}/{repo}/releases"],listTags:["GET /repos/{owner}/{repo}/tags"],listTeams:["GET /repos/{owner}/{repo}/teams"],listWebhookDeliveries:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /repos/{owner}/{repo}/hooks"],merge:["POST /repos/{owner}/{repo}/merges"],mergeUpstream:["POST /repos/{owner}/{repo}/merge-upstream"],pingWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeAppAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],removeCollaborator:["DELETE /repos/{owner}/{repo}/collaborators/{username}"],removeStatusCheckContexts:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],removeStatusCheckProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],removeTeamAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],removeUserAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],renameBranch:["POST /repos/{owner}/{repo}/branches/{branch}/rename"],replaceAllTopics:["PUT /repos/{owner}/{repo}/topics"],requestPagesBuild:["POST /repos/{owner}/{repo}/pages/builds"],setAdminBranchProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],setAppAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],setStatusCheckContexts:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],setTeamAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],setUserAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],testPushWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],transfer:["POST /repos/{owner}/{repo}/transfer"],update:["PATCH /repos/{owner}/{repo}"],updateBranchProtection:["PUT /repos/{owner}/{repo}/branches/{branch}/protection"],updateCommitComment:["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],updateDeploymentBranchPolicy:["PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],updateInformationAboutPagesSite:["PUT /repos/{owner}/{repo}/pages"],updateInvitation:["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"],updateOrgRuleset:["PUT /orgs/{org}/rulesets/{ruleset_id}"],updatePullRequestReviewProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],updateRelease:["PATCH /repos/{owner}/{repo}/releases/{release_id}"],updateReleaseAsset:["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"],updateRepoRuleset:["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],updateStatusCheckPotection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",{},{renamed:["repos","updateStatusCheckProtection"]}],updateStatusCheckProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],updateWebhook:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],updateWebhookConfigForRepo:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"],uploadReleaseAsset:["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",{baseUrl:"https://uploads.github.com"}]},search:{code:["GET /search/code"],commits:["GET /search/commits"],issuesAndPullRequests:["GET /search/issues"],labels:["GET /search/labels"],repos:["GET /search/repositories"],topics:["GET /search/topics"],users:["GET /search/users"]},secretScanning:{createPushProtectionBypass:["POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses"],getAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],getScanHistory:["GET /repos/{owner}/{repo}/secret-scanning/scan-history"],listAlertsForOrg:["GET /orgs/{org}/secret-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/secret-scanning/alerts"],listLocationsForAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],listOrgPatternConfigs:["GET /orgs/{org}/secret-scanning/pattern-configurations"],updateAlert:["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],updateOrgPatternConfigs:["PATCH /orgs/{org}/secret-scanning/pattern-configurations"]},securityAdvisories:{createFork:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"],createPrivateVulnerabilityReport:["POST /repos/{owner}/{repo}/security-advisories/reports"],createRepositoryAdvisory:["POST /repos/{owner}/{repo}/security-advisories"],createRepositoryAdvisoryCveRequest:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"],getGlobalAdvisory:["GET /advisories/{ghsa_id}"],getRepositoryAdvisory:["GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"],listGlobalAdvisories:["GET /advisories"],listOrgRepositoryAdvisories:["GET /orgs/{org}/security-advisories"],listRepositoryAdvisories:["GET /repos/{owner}/{repo}/security-advisories"],updateRepositoryAdvisory:["PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"]},teams:{addOrUpdateMembershipForUserInOrg:["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"],addOrUpdateRepoPermissionsInOrg:["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],checkPermissionsForRepoInOrg:["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],create:["POST /orgs/{org}/teams"],createDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],createDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions"],deleteDiscussionCommentInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],deleteDiscussionInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],deleteInOrg:["DELETE /orgs/{org}/teams/{team_slug}"],getByName:["GET /orgs/{org}/teams/{team_slug}"],getDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],getDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],getMembershipForUserInOrg:["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"],list:["GET /orgs/{org}/teams"],listChildInOrg:["GET /orgs/{org}/teams/{team_slug}/teams"],listDiscussionCommentsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],listDiscussionsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions"],listForAuthenticatedUser:["GET /user/teams"],listMembersInOrg:["GET /orgs/{org}/teams/{team_slug}/members"],listPendingInvitationsInOrg:["GET /orgs/{org}/teams/{team_slug}/invitations"],listReposInOrg:["GET /orgs/{org}/teams/{team_slug}/repos"],removeMembershipForUserInOrg:["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"],removeRepoInOrg:["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],updateDiscussionCommentInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],updateDiscussionInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],updateInOrg:["PATCH /orgs/{org}/teams/{team_slug}"]},users:{addEmailForAuthenticated:["POST /user/emails",{},{renamed:["users","addEmailForAuthenticatedUser"]}],addEmailForAuthenticatedUser:["POST /user/emails"],addSocialAccountForAuthenticatedUser:["POST /user/social_accounts"],block:["PUT /user/blocks/{username}"],checkBlocked:["GET /user/blocks/{username}"],checkFollowingForUser:["GET /users/{username}/following/{target_user}"],checkPersonIsFollowedByAuthenticated:["GET /user/following/{username}"],createGpgKeyForAuthenticated:["POST /user/gpg_keys",{},{renamed:["users","createGpgKeyForAuthenticatedUser"]}],createGpgKeyForAuthenticatedUser:["POST /user/gpg_keys"],createPublicSshKeyForAuthenticated:["POST /user/keys",{},{renamed:["users","createPublicSshKeyForAuthenticatedUser"]}],createPublicSshKeyForAuthenticatedUser:["POST /user/keys"],createSshSigningKeyForAuthenticatedUser:["POST /user/ssh_signing_keys"],deleteAttestationsBulk:["POST /users/{username}/attestations/delete-request"],deleteAttestationsById:["DELETE /users/{username}/attestations/{attestation_id}"],deleteAttestationsBySubjectDigest:["DELETE /users/{username}/attestations/digest/{subject_digest}"],deleteEmailForAuthenticated:["DELETE /user/emails",{},{renamed:["users","deleteEmailForAuthenticatedUser"]}],deleteEmailForAuthenticatedUser:["DELETE /user/emails"],deleteGpgKeyForAuthenticated:["DELETE /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","deleteGpgKeyForAuthenticatedUser"]}],deleteGpgKeyForAuthenticatedUser:["DELETE /user/gpg_keys/{gpg_key_id}"],deletePublicSshKeyForAuthenticated:["DELETE /user/keys/{key_id}",{},{renamed:["users","deletePublicSshKeyForAuthenticatedUser"]}],deletePublicSshKeyForAuthenticatedUser:["DELETE /user/keys/{key_id}"],deleteSocialAccountForAuthenticatedUser:["DELETE /user/social_accounts"],deleteSshSigningKeyForAuthenticatedUser:["DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"],follow:["PUT /user/following/{username}"],getAuthenticated:["GET /user"],getById:["GET /user/{account_id}"],getByUsername:["GET /users/{username}"],getContextForUser:["GET /users/{username}/hovercard"],getGpgKeyForAuthenticated:["GET /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","getGpgKeyForAuthenticatedUser"]}],getGpgKeyForAuthenticatedUser:["GET /user/gpg_keys/{gpg_key_id}"],getPublicSshKeyForAuthenticated:["GET /user/keys/{key_id}",{},{renamed:["users","getPublicSshKeyForAuthenticatedUser"]}],getPublicSshKeyForAuthenticatedUser:["GET /user/keys/{key_id}"],getSshSigningKeyForAuthenticatedUser:["GET /user/ssh_signing_keys/{ssh_signing_key_id}"],list:["GET /users"],listAttestations:["GET /users/{username}/attestations/{subject_digest}"],listAttestationsBulk:["POST /users/{username}/attestations/bulk-list{?per_page,before,after}"],listBlockedByAuthenticated:["GET /user/blocks",{},{renamed:["users","listBlockedByAuthenticatedUser"]}],listBlockedByAuthenticatedUser:["GET /user/blocks"],listEmailsForAuthenticated:["GET /user/emails",{},{renamed:["users","listEmailsForAuthenticatedUser"]}],listEmailsForAuthenticatedUser:["GET /user/emails"],listFollowedByAuthenticated:["GET /user/following",{},{renamed:["users","listFollowedByAuthenticatedUser"]}],listFollowedByAuthenticatedUser:["GET /user/following"],listFollowersForAuthenticatedUser:["GET /user/followers"],listFollowersForUser:["GET /users/{username}/followers"],listFollowingForUser:["GET /users/{username}/following"],listGpgKeysForAuthenticated:["GET /user/gpg_keys",{},{renamed:["users","listGpgKeysForAuthenticatedUser"]}],listGpgKeysForAuthenticatedUser:["GET /user/gpg_keys"],listGpgKeysForUser:["GET /users/{username}/gpg_keys"],listPublicEmailsForAuthenticated:["GET /user/public_emails",{},{renamed:["users","listPublicEmailsForAuthenticatedUser"]}],listPublicEmailsForAuthenticatedUser:["GET /user/public_emails"],listPublicKeysForUser:["GET /users/{username}/keys"],listPublicSshKeysForAuthenticated:["GET /user/keys",{},{renamed:["users","listPublicSshKeysForAuthenticatedUser"]}],listPublicSshKeysForAuthenticatedUser:["GET /user/keys"],listSocialAccountsForAuthenticatedUser:["GET /user/social_accounts"],listSocialAccountsForUser:["GET /users/{username}/social_accounts"],listSshSigningKeysForAuthenticatedUser:["GET /user/ssh_signing_keys"],listSshSigningKeysForUser:["GET /users/{username}/ssh_signing_keys"],setPrimaryEmailVisibilityForAuthenticated:["PATCH /user/email/visibility",{},{renamed:["users","setPrimaryEmailVisibilityForAuthenticatedUser"]}],setPrimaryEmailVisibilityForAuthenticatedUser:["PATCH /user/email/visibility"],unblock:["DELETE /user/blocks/{username}"],unfollow:["DELETE /user/following/{username}"],updateAuthenticated:["PATCH /user"]}},Ab=nO;var cr=new Map;for(let[t,e]of Object.entries(Ab))for(let[n,r]of Object.entries(e)){let[s,i,o]=r,[a,c]=s.split(/ /),l=Object.assign({method:a,url:c},i);cr.has(t)||cr.set(t,new Map),cr.get(t).set(n,{scope:t,methodName:n,endpointDefaults:l,decorations:o})}var rO={has({scope:t},e){return cr.get(t).has(e)},getOwnPropertyDescriptor(t,e){return{value:this.get(t,e),configurable:!0,writable:!0,enumerable:!0}},defineProperty(t,e,n){return Object.defineProperty(t.cache,e,n),!0},deleteProperty(t,e){return delete t.cache[e],!0},ownKeys({scope:t}){return[...cr.get(t).keys()]},set(t,e,n){return t.cache[e]=n},get({octokit:t,scope:e,cache:n},r){if(n[r])return n[r];let s=cr.get(e).get(r);if(!s)return;let{endpointDefaults:i,decorations:o}=s;return o?n[r]=sO(t,e,r,i,o):n[r]=t.request.defaults(i),n[r]}};function Dd(t){let e={};for(let n of cr.keys())e[n]=new Proxy({octokit:t,scope:n,cache:{}},rO);return e}function sO(t,e,n,r,s){let i=t.request.defaults(r);function o(...a){let c=i.endpoint.merge(...a);if(s.mapToData)return c=Object.assign({},c,{data:c[s.mapToData],[s.mapToData]:void 0}),i(c);if(s.renamed){let[l,u]=s.renamed;t.log.warn(`octokit.${e}.${n}() has been renamed to octokit.${l}.${u}()`)}if(s.deprecated&&t.log.warn(s.deprecated),s.renamedParameters){let l=i.endpoint.merge(...a);for(let[u,d]of Object.entries(s.renamedParameters))u in l&&(t.log.warn(`"${u}" parameter is deprecated for "octokit.${e}.${n}()". Use "${d}" instead`),d in l||(l[d]=l[u]),delete l[u]);return i(l)}return i(...a)}return Object.assign(o,i)}function iO(t){return{rest:Dd(t)}}iO.VERSION=Od;function Md(t){let e=Dd(t);return{...e,rest:e}}Md.VERSION=Od;var Pb="22.0.1";var Ib=Ha.plugin(Ad,Md,Id).defaults({userAgent:`octokit-rest.js/${Pb}`});var Ka=class{octokit;logger;selfLogin;constructor(e){this.octokit=new Ib({auth:e.repoToken,baseUrl:e.baseUrl??"https://api.github.com",userAgent:"drift-bot/0.1"}),this.logger=e.logger}async readFile(e,n,r){try{let i=(await this.octokit.repos.getContent({owner:e.owner,repo:e.repo,path:n,ref:r})).data;return Array.isArray(i)||i.type!=="file"||!("content"in i)?null:Buffer.from(i.content,"base64").toString("utf8")}catch(s){if(Ob(s))return null;throw this.logger.debug(`Failed to read ${n}@${r}: ${s.message}`),s}}async changedFiles(e){try{let n=await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${e.beforeSha}...${e.afterSha}`}),r=n.data.files??[],s=n.data.commits??[];return r.length>=300||s.lengtho.filename)}catch(n){throw this.logger.warn(`Could not compare ${e.beforeSha}...${e.afterSha}: ${n.message}`),n}}async changedFilesByCommit(e){let n=new Set;for await(let s of this.octokit.paginate.iterator(this.octokit.repos.compareCommitsWithBasehead,{owner:e.owner,repo:e.repo,basehead:`${e.beforeSha}...${e.afterSha}`,per_page:250})){let i=s.data;for(let o of i.commits??[])n.add(o.sha)}let r=new Set;for(let s of n)for await(let i of this.octokit.paginate.iterator(this.octokit.repos.getCommit,{owner:e.owner,repo:e.repo,ref:s,per_page:300})){let o=i.data;for(let a of o.files??[])r.add(a.filename)}return[...r]}async createBranch(e,n,r){try{return await this.octokit.git.createRef({owner:e.owner,repo:e.repo,ref:`refs/heads/${n}`,sha:r}),this.logger.info(`Created branch ${n} at ${r.slice(0,7)}`),!0}catch(s){if(oO(s)){let i=await this.getBranchHead(e,n);return i===r?(this.logger.info(`Branch ${n} already exists at ${r.slice(0,7)}; reusing it`),!0):i&&await this.isAncestor(e,r,i)?await this.commitsAreAllBots(e,r,i)?(this.logger.info(`Branch ${n} already exists ahead of ${r.slice(0,7)}; reusing it`),!0):(this.logger.error(`Branch ${n} already exists ahead of ${r.slice(0,7)} with commit(s) not made by Drift; refusing to reuse a branch that may carry manual changes`),!1):(this.logger.error(`Branch ${n} already exists but is not based on ${r.slice(0,7)} (current head: ${i??"unknown"}); refusing to reuse a stale branch`),!1)}return this.logger.error(`Could not create branch ${n}: ${s.message}`),!1}}async isAncestor(e,n,r){if(n===r)return!0;try{let s=await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${n}...${r}`});return s.data.status==="ahead"||s.data.status==="identical"}catch{return!1}}async commitsAreAllBots(e,n,r){try{let i=(await this.octokit.repos.compareCommitsWithBasehead({owner:e.owner,repo:e.repo,basehead:`${n}...${r}`})).data.commits??[];return i.length===0?!0:i.every(o=>(o.author?.login??o.committer?.login??"").endsWith("[bot]"))}catch{return!1}}async commitFiles(e,n,r,s){if(r.length===0)return null;try{let o=(await this.octokit.git.getRef({owner:e.owner,repo:e.repo,ref:`heads/${n}`})).data.object.sha,a=await this.octokit.git.getCommit({owner:e.owner,repo:e.repo,commit_sha:o}),c=await Promise.all(r.map(async d=>{let p=await this.octokit.git.createBlob({owner:e.owner,repo:e.repo,content:Buffer.from(d.content,"utf8").toString("base64"),encoding:"base64"});return{path:d.path,mode:"100644",type:"blob",sha:p.data.sha}})),l=await this.octokit.git.createTree({owner:e.owner,repo:e.repo,base_tree:a.data.tree.sha,tree:c}),u=await this.octokit.git.createCommit({owner:e.owner,repo:e.repo,message:s,tree:l.data.sha,parents:[o]});return await this.octokit.git.updateRef({owner:e.owner,repo:e.repo,ref:`heads/${n}`,sha:u.data.sha}),this.logger.info(`Committed ${r.length} file(s) to ${n}: ${u.data.sha.slice(0,7)}`),{sha:u.data.sha}}catch(i){return this.logger.error(`Could not commit to ${n}: ${i.message}`),null}}async createIssue(e,n){try{let r=await this.octokit.issues.create({owner:e.owner,repo:e.repo,title:n.title,body:n.body,labels:n.labels,assignees:n.assignees});return{number:r.data.number,url:r.data.html_url}}catch(r){return this.logger.error(`Could not create issue: ${r.message}`),null}}async getCollaboratorPermission(e,n){try{let r=await this.octokit.repos.getCollaboratorPermissionLevel({owner:e.owner,repo:e.repo,username:n}),s=r.data.permission,o=(r.data.role_name??s??"").toLowerCase();switch(o){case"admin":case"maintain":case"write":case"triage":case"read":case"none":return o;case"push":return"write";case"pull":return"read";default:return this.logger.warn(`Unrecognised permission \`${o}\` for ${n}; treating it as unknown and refusing.`),null}}catch(r){return Ob(r)?"none":(this.logger.warn(`Could not determine ${n}'s permission on ${e.owner}/${e.repo}: ${r.message}`),null)}}async getAuthenticatedLogin(){if(this.selfLogin!==void 0)return this.selfLogin;try{let e=await this.octokit.users.getAuthenticated();this.selfLogin=e.data.login}catch{this.selfLogin=null}return this.selfLogin}async getIssue(e,n){try{let r=await this.octokit.issues.get({owner:e.owner,repo:e.repo,issue_number:n});return{number:r.data.number,body:r.data.body??null,state:r.data.state,labels:r.data.labels.map(s=>typeof s=="string"?s:s.name??"").filter(Boolean),pullRequest:!!r.data.pull_request}}catch(r){return this.logger.warn(`Could not read issue #${n}: ${r.message}`),null}}async listIssueComments(e,n){try{return(await this.octokit.issues.listComments({owner:e.owner,repo:e.repo,issue_number:n,per_page:100})).data.map(s=>({body:s.body??null,authorLogin:s.user?.login??null}))}catch(r){throw this.logger.warn(`Could not list comments on #${n}: ${r.message}`),r}}async commitExists(e,n){try{return await this.octokit.repos.getCommit({owner:e.owner,repo:e.repo,ref:n}),!0}catch{return!1}}async getBranchHead(e,n){try{return(await this.octokit.repos.getBranch({owner:e.owner,repo:e.repo,branch:n})).data.commit.sha}catch{return null}}async commentOnIssue(e,n,r){try{return await this.octokit.issues.createComment({owner:e.owner,repo:e.repo,issue_number:n,body:r}),!0}catch(s){return this.logger.warn(`Could not comment on #${n}: ${s.message}`),!1}}async findOpenPlanIssue(e,n){try{return(await this.octokit.search.issuesAndPullRequests({q:`repo:${e.owner}/${e.repo} is:issue is:open in:body "${n}"`,per_page:1})).data.items[0]?.number??null}catch{return null}}async createCheckRun(e,n){try{await this.octokit.checks.create({owner:e.owner,repo:e.repo,name:n.name,head_sha:e.afterSha,status:"completed",conclusion:n.conclusion,output:{title:n.title,summary:n.summary,text:n.text}})}catch(r){this.logger.debug(`Could not create check run: ${r.message}`)}}async uploadSarif(e,n){try{let r=(0,Db.gzipSync)(Buffer.from(JSON.stringify(n.sarif),"utf8"));return await this.octokit.codeScanning.uploadSarif({owner:e.owner,repo:e.repo,commit_sha:n.commitSha,ref:n.ref,sarif:r.toString("base64")}),this.logger.info("Uploaded SARIF results to code scanning."),!0}catch(r){return r?.status===403?this.logger.warn("Could not upload code scanning results: the token is missing `security-events: write`. Add it to the workflow job's `permissions` to enable Drift's code scanning alerts."):this.logger.warn(`Could not upload code scanning results: ${r.message}`),!1}}async findPullRequestForBranch(e,n){try{let s=(await this.octokit.pulls.list({owner:e.owner,repo:e.repo,head:`${e.owner}:${n}`,state:"all",per_page:1})).data[0];return s?{number:s.number,url:s.html_url}:null}catch{return null}}async createPullRequest(e,n){try{let r=await this.octokit.pulls.create({owner:e.owner,repo:e.repo,head:n.head,base:n.base,title:n.title,body:n.body,draft:n.draft??!1}),s=r.data.number;return await this.decoratePullRequest(e,s,n),this.logger.info(`Opened pull request #${s}: ${n.head} \u2192 ${n.base}`),{number:s,url:r.data.html_url,existing:!1}}catch(r){let s=await this.findPullRequestForBranch(e,n.head);return s?(this.logger.info(`Pull request #${s.number} already open for ${n.head}`),{...s,existing:!0}):(this.logger.error(`Could not open a pull request: ${r.message}`),null)}}async decoratePullRequest(e,n,r){if(r.labels?.length)try{await this.octokit.issues.addLabels({owner:e.owner,repo:e.repo,issue_number:n,labels:[...r.labels]})}catch(s){this.logger.warn(`Could not label #${n}: ${s.message}`)}if(r.reviewers?.length)try{let s=r.reviewers.filter(o=>o.includes("/")).map(o=>o.split("/").pop()),i=r.reviewers.filter(o=>!o.includes("/"));await this.octokit.pulls.requestReviewers({owner:e.owner,repo:e.repo,pull_number:n,reviewers:i,team_reviewers:s})}catch(s){this.logger.warn(`Could not request reviewers on #${n}: ${s.message}`)}}async updatePullRequestBody(e,n,r){try{await this.octokit.pulls.update({owner:e.owner,repo:e.repo,pull_number:n,body:r})}catch(s){this.logger.warn(`Could not update PR #${n}: ${s.message}`)}}async getDefaultBranch(e,n){try{return(await this.octokit.repos.get({owner:e,repo:n})).data.default_branch}catch{return null}}asRepoProvider(e){return{changedFiles:()=>this.changedFiles(e),readFile:(n,r)=>this.readFile(e,n,r)}}get rest(){return this.octokit}};function Ob(t){return t?.status===404}function oO(t){let e=t?.status,n=t?.message??"";return e===422&&/already exists/i.test(n)}function aO(t,e){return cO(t).test(e)}function lr(t,e){return t.some(n=>aO(n,e))}var Mb=new Map;function cO(t){let e=Mb.get(t);if(e)return e;let n="^";for(let s=0;s<=!]+\s*/,"").replace(/^[[(]\s*/,""),e=e.split(/\s+/)[0].trim(),e=e.replace(/^v/i,"").replace(/[\])]$/,""),e=e.replace(/\+incompatible$/,""),e||null)}function te(t){let e=_v(t);return e?it.default.valid(e)??it.default.valid(it.default.coerce(e)??"")??null:null}function np(t){let e=_v(t);return e?it.default.valid(e)??null:null}function ac(t,e){if(t===null&&e!==null)return"added";if(t!==null&&e===null)return"removed";if(t===null||e===null)return"unknown";let n=te(t),r=te(e);if(!n||!r||it.default.eq(n,r))return"unknown";switch(it.default.diff(n,r)){case"major":case"premajor":return"major";case"minor":case"preminor":return"minor";case"patch":case"prepatch":return"patch";case"prerelease":return"prerelease";default:return"unknown"}}function Gi(t,e){let n=te(t),r=te(e);return!n||!r?!1:it.default.lt(r,n)}function Fi(t,e){let n=te(t),r=te(e);return!n||!r||it.default.major(n)!==0||it.default.major(r)!==0?!1:it.default.minor(n)!==it.default.minor(r)}function M(t){let e=t.split("/");return(e[e.length-1]??"").toLowerCase()}function Re(t){try{return JSON.parse(t)}catch{return null}}var Rv={ecosystem:"arduino",name:"arduino",handles(t){let e=M(t);return e==="library.properties"||e==="platformio.ini"},isLockfile(){return!1},parse(t,e){return M(e)==="platformio.ini"?bM(t):hM(t)}};function hM(t){let e=new Map;for(let n of t.split(` +`)){let r=n.trim();if(r.startsWith("#"))continue;let s=/^depends\s*=\s*(.*)$/i.exec(r);if(s)for(let i of s[1].split(",")){let o=yM(i);o&&e.set(o.name,{version:o.version,kind:"runtime"})}}return e}function yM(t){let e=t.trim();if(!e)return null;let n=/^(.*?)\s*\(([^)]*)\)\s*$/.exec(e);if(n){let r=n[1].trim(),s=n[2].trim();return r?{name:r,version:s||null}:null}return{name:e,version:null}}function bM(t){let e=new Map,n=t.split(` +`),r=!1;for(let s of n){let i=s.split(/\s+[;#]/)[0],o=i.trim();if(/^\[/.test(o)){r=!1;continue}let a=/^(lib_deps[\w.]*|lib_extra_dirs|lib_ignore)\s*=\s*(.*)$/.exec(o);if(a){r=a[1].startsWith("lib_deps"),r&&a[2]&&$v(e,a[2],"runtime");continue}if(r&&/^\s/.test(i)&&o!==""){$v(e,o,"runtime");continue}o!==""&&(r=!1)}return e}function $v(t,e,n){let r=e.trim();if(!r||/^[a-z+]+:\/\//i.test(r)||r.startsWith("file://")||r.startsWith(".")||r.includes("${")||/\.(git|zip|tar\.gz)$/i.test(r))return;let s=r.lastIndexOf("@"),i=s>0,o=i?r.slice(0,s):r,a=i?r.slice(s+1).trim():null,c=o.lastIndexOf("/"),l=(c===-1?o:o.slice(c+1)).trim();l&&t.set(l,{version:a||null,kind:n})}function At(t){let e=[],n={header:"",entries:new Map,lines:[]};e.push(n);let r=t.split(` +`);for(let s=0;sfs(u,"]")){let d=fs(u,"[")-fs(u,"]");for(;d>0&&s+1n.header===e)}function ji(t){let e=t.trim().replace(/^\[/,"").replace(/\]$/,""),n=[];for(let r of e.matchAll(/"((?:[^"\\]|\\.)*)"|'([^']*)'/g)){let s=r[1]??r[2];s!==void 0&&n.push(s)}return n}function ms(t){let e=t.trim();return e.startsWith("{")?/(?:^|[{,]\s*)version\s*=\s*"([^"]*)"/.exec(e)?.[1]??null:/^"([^"]*)"$/.exec(e)?.[1]??/^'([^']*)'$/.exec(e)?.[1]??null}function wM(t){return t.replace(/^["']|["']$/g,"")}function Cv(t){let e=!1,n=!1;for(let r=0;r<=!]*\s*\d[^"']*)["']/g)].map(f=>f[1].trim()).filter(f=>!/^https?:/.test(f)),d=/:(path|git|podspec|svn|hg)\s*(?:=>|:)/.test(c)||l.length===0?null:l.join(", "),p=n.some(f=>/test|spec|uitest/i.test(f))?"dev":"runtime";e.set(a,{version:d,kind:p})}return e}function RM(t){let e=new Map,n=!1;for(let r of t.split(` +`)){let s=r.replace(/\r$/,"");if(!s.trim())continue;if(/^[A-Z][A-Z ]*:\s*$/.test(s.trim())&&!/^\s/.test(s)){n=s.trim()==="PODS:";continue}if(!n)continue;let i=/^ {2}- "?([\w.+/-]+)"? \(([^)]+)\)/.exec(s);i&&e.set(i[1],{version:i[2],kind:"transitive"})}return e}function CM(t){let e=new Map,n=/\.dependency\s+["']([^"']+)["'](?:\s*,\s*["']([^"']+)["'])?/g;for(let r of t.matchAll(n))e.set(r[1],{version:r[2]??null,kind:"runtime"});return e}function AM(t){let e=!1,n=!1;for(let r=0;ru.includes("indirect")?u:"").trim(),o=s.trim();if(/^require\s*\($/.test(o)){n=!0;continue}if(/^replace\s*\($/.test(o)||/^exclude\s*\($/.test(o)){r=!0;continue}if(o===")"){n=!1,r=!1;continue}if(r||o.startsWith("replace ")||o.startsWith("exclude "))continue;let a=/^require\s+(\S+)\s+(\S+)/.exec(o);if(a){e.set(a[1],{version:a[2],kind:"runtime"});continue}if(!n)continue;let c=/^(\S+)\s+(v\S+)/.exec(i||o);if(!c)continue;let l=o.includes("// indirect");e.set(c[1],{version:c[2],kind:l?"transitive":"runtime"})}return e}function DM(t){let e=new Map;for(let n of t.split(` +`)){let r=n.trim().split(/\s+/);if(r.length<3)continue;let[s,i]=r;i.endsWith("/go.mod")||e.set(s,{version:i,kind:"transitive"})}return e}var Fv={ecosystem:"hex",name:"Mix",handles(t){let e=M(t);return e==="mix.exs"||e==="mix.lock"||e==="rebar.config"},isLockfile(t){return M(t)==="mix.lock"},parse(t,e){let n=M(e);return n==="mix.lock"?NM(t):n==="rebar.config"?LM(t):MM(t)}};function MM(t){let e=new Map;for(let n of t.matchAll(/\{\s*:([a-z_][a-zA-Z0-9_]*)\s*(,[^}]*)?\}/g)){let r=n[1],s=n[2]??"",i=/^,\s*"([^"]+)"/.exec(s)?.[1]??null,o=/\b(path|git|github|hg|svn):\s*/.test(s),a=o?null:i;if(!i&&!o&&!/\b(only|runtime|optional|app|manager):/.test(s))continue;let c=/\bonly:\s*(\[[^\]]*\]|:[a-z_]+)/.exec(s)?.[1]??"",l=/:(dev|test)\b/.test(c)?"dev":"runtime";e.set(r,{version:a,kind:l})}return e}function NM(t){let e=new Map,n=/"([a-z_][a-zA-Z0-9_]*)"\s*:\s*\{\s*:hex\s*,\s*:[a-zA-Z0-9_]+\s*,\s*"([^"]+)"/g;for(let r of t.matchAll(n))e.set(r[1],{version:r[2],kind:"transitive"});return e}function LM(t){let e=new Map,n=/\{\s*deps\s*,\s*\[/.exec(t);if(!n)return e;let r=1,s=n.index+n[0].length;for(;s0;s++)t[s]==="["?r+=1:t[s]==="]"&&(r-=1);let i=t.slice(n.index+n[0].length,s-1);for(let o of i.matchAll(/\{\s*([a-z_][a-zA-Z0-9_]*)\s*,\s*"([^"]+)"/g))e.set(o[1],{version:o[2],kind:"runtime"});for(let o of i.matchAll(/(?:^|[[,])\s*([a-z_][a-zA-Z0-9_]*)\s*(?=[,\]]|$)/g))e.has(o[1])||e.set(o[1],{version:null,kind:"runtime"});return e}var jv={ecosystem:"maven",name:"maven/gradle",handles(t){let e=M(t);return e==="pom.xml"||e==="build.gradle"||e==="build.gradle.kts"||e==="libs.versions.toml"||e==="gradle.lockfile"},isLockfile(t){return M(t)==="gradle.lockfile"},parse(t,e){let n=M(e);return n==="pom.xml"?GM(t):n==="gradle.lockfile"?BM(t):n==="libs.versions.toml"?UM(t):qM(t)}};function GM(t){let e=new Map,n=FM(t);for(let r of t.matchAll(/([\s\S]*?)<\/dependency>/g)){let s=r[1],i=qi(s,"groupId"),o=qi(s,"artifactId");if(!i||!o)continue;let a=jM(qi(s,"version"),n),c=qi(s,"scope"),u=qi(s,"optional")==="true"?"optional":c==="test"||c==="provided"?"dev":"runtime";e.set(`${i}:${o}`,{version:a,kind:u})}return e}function FM(t){let e=new Map;for(let n of t.matchAll(/([\s\S]*?)<\/properties>/g))for(let r of n[1].matchAll(/<([\w.-]+)>([^<]*)<\/\1>/g))e.set(r[1],r[2].trim());return e}function jM(t,e){if(!t)return null;let n=t;for(let r=0;r<2;r++)n=n.replace(/\$\{([^}]+)\}/g,(s,i)=>e.get(i)??s);return n.includes("${")?null:n.trim()||null}function qi(t,e){return new RegExp(`<${e}>([^<]*)`).exec(t)?.[1]?.trim()??null}function qM(t){let e=new Map,n="(?:implementation|api|compileOnly|runtimeOnly|testImplementation|testCompileOnly|annotationProcessor|kapt|ksp)";for(let r of t.matchAll(new RegExp(`${n}\\s*\\(?\\s*["']([^"']+:[^"']+)["']`,"g"))){let s=r[1].split(":");if(s.length<2)continue;let[i,o,a]=s,c=/test|androidTest/i.test(r[0]);e.set(`${i}:${o}`,{version:a??null,kind:c?"dev":"runtime"})}for(let r of t.matchAll(new RegExp(`${n}\\s*\\(?\\s*group:\\s*["']([^"']+)["'],\\s*name:\\s*["']([^"']+)["'](?:,\\s*version:\\s*["']([^"']+)["'])?`,"g")))e.set(`${r[1]}:${r[2]}`,{version:r[3]??null,kind:/test/i.test(r[0])?"dev":"runtime"});return e}function UM(t){let e=new Map,n=new Map,r="";for(let s of t.split(` +`)){let i=s.split("#")[0].trim();if(!i)continue;let o=/^\[([^\]]+)\]$/.exec(i)?.[1];if(o){r=o;continue}if(r==="versions"){let m=/^([\w.-]+)\s*=\s*["']([^"']+)["']/.exec(i);m&&n.set(m[1],m[2]);continue}if(r!=="libraries")continue;let a=/module\s*=\s*["']([^"']+)["']/.exec(i)?.[1],c=/group\s*=\s*["']([^"']+)["']/.exec(i)?.[1],l=/name\s*=\s*["']([^"']+)["']/.exec(i)?.[1],u=a??(c&&l?`${c}:${l}`:null);if(!u)continue;let d=/version\s*=\s*["']([^"']+)["']/.exec(i)?.[1],p=/version\.ref\s*=\s*["']([^"']+)["']/.exec(i)?.[1],f=d??(p?n.get(p)??null:null);e.set(u,{version:f,kind:"runtime"})}return e}function BM(t){let e=new Map;for(let n of t.split(` +`)){let r=n.trim();if(!r||r.startsWith("#"))continue;let i=r.split("=")[0].split(":");i.length<3||e.set(`${i[0]}:${i[1]}`,{version:i[2],kind:"transitive"})}return e}var Uv=mt($i(),1);var VM=new Set(["package.json"]),qv=new Set(["package-lock.json","npm-shrinkwrap.json","yarn.lock","pnpm-lock.yaml","bun.lock"]),Bv={ecosystem:"npm",name:"npm/yarn/pnpm",handles(t){let e=M(t);return t.includes("node_modules/")?!1:VM.has(e)||qv.has(e)},isLockfile(t){return qv.has(M(t))},parse(t,e){let n=M(e);return n==="package.json"?HM(t):n==="yarn.lock"?ZM(t):n==="pnpm-lock.yaml"?XM(t):n==="bun.lock"?WM(t):KM(t)}};function WM(t){let e=new Map,n=Re(zM(t));if(!n?.packages)return e;for(let r of Object.values(n.packages)){let s=Array.isArray(r)?r[0]:r;if(typeof s!="string")continue;let i=s.lastIndexOf("@");if(i<=0)continue;let o=s.slice(0,i),a=s.slice(i+1);/^\d/.test(a)&&e.set(o,{version:a,kind:"transitive"})}return e}function zM(t){let e="",n=!1;for(let r=0;ri.split(/[.+-]/).map(o=>Number.parseInt(o,10)),r=n(t),s=n(e);for(let i=0;ia}return!1}function lM(t){let e=new Map,n=null;for(let r of t.split(` -`)){let s=r.replace(/\r$/,"");if(!s.trim()||s.startsWith("#"))continue;if(!/^\s/.test(s)){let o=s.replace(/:\s*$/,"").split(",")[0].trim().replace(/^"|"$/g,"");n=gv(o);continue}let i=/^\s+version:?\s+"?([^"\s]+)"?/.exec(s)?.[1];if(i&&n){let o=e.get(n);(!o||mv(i,o.version??""))&&e.set(n,{version:i,kind:"transitive"}),n=null}}return e}function uM(t){let e=new Map,n;try{n=(0,pv.parse)(t)}catch{return e}let r=n?.packages;if(!r||typeof r!="object")return e;for(let s of Object.keys(r)){let i=s.startsWith("/")?s.slice(1):s,o=gv(i),a=dM(i);if(!o||!a)continue;let c=e.get(o);(!c||mv(a,c.version??""))&&e.set(o,{version:a,kind:"transitive"})}return e}function gv(t){let e=t.lastIndexOf("@");return e<=0?t||null:t.slice(0,e)||null}function dM(t){let e=t.lastIndexOf("@");return e<=0?null:t.slice(e+1).split("(")[0]||null}var yv={ecosystem:"nuget",name:"NuGet",handles(t){let e=D(t);return/\.(cs|fs|vb)proj$/.test(e)||e==="directory.packages.props"||e==="directory.build.props"||e==="packages.lock.json"||e==="packages.config"||e.endsWith(".nuspec")},isLockfile(t){return D(t)==="packages.lock.json"},parse(t,e){let n=D(e);return n==="packages.lock.json"?fM(t):n==="packages.config"?mM(t):n.endsWith(".nuspec")?gM(t):pM(t)}};function pM(t){let e=new Map,n=/<(PackageReference|PackageVersion|GlobalPackageReference)\b([^>]*?)(\/>|>([\s\S]*?)<\/\1>)/g;for(let r of t.matchAll(n)){let s=r[2]??"",i=r[4]??"",o=Rt(s,"Include")??Rt(s,"Update");if(!o)continue;let a=Rt(s,"Version")??Rt(s,"VersionOverride")??hv(i,"Version"),c=a&&!a.includes("$(")?a:null,u=(Rt(s,"PrivateAssets")??hv(i,"PrivateAssets"))?.toLowerCase()==="all"?"dev":"runtime";e.set(o,{version:c,kind:u})}return e}function fM(t){let e=new Map,n=Se(t);if(!n?.dependencies)return e;for(let r of Object.values(n.dependencies))if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r)){let o=i?.resolved??null;if(!o)continue;let a=i.type==="Direct"?"runtime":"transitive";e.get(s)?.kind==="runtime"&&a==="transitive"||e.set(s,{version:o,kind:a})}return e}function mM(t){let e=new Map;for(let n of t.matchAll(/]*?)\/?>/g)){let r=n[1]??"",s=Rt(r,"id");if(!s)continue;let i=Rt(r,"developmentDependency");e.set(s,{version:Rt(r,"version"),kind:i?.toLowerCase()==="true"?"dev":"runtime"})}return e}function gM(t){let e=new Map;for(let n of t.matchAll(/]*?)\/?>/g)){let r=n[1]??"",s=Rt(r,"id");s&&e.set(s,{version:Rt(r,"version"),kind:"runtime"})}return e}function Rt(t,e){let n=new RegExp(`\\b${e}\\s*=\\s*("([^"]*)"|'([^']*)')`,"i").exec(t);return(n?.[2]??n?.[3])?.trim()||null}function hv(t,e){return new RegExp(`<${e}\\s*>([^<]*)`,"i").exec(t)?.[1]?.trim()||null}var bv={ecosystem:"opam",name:"opam",handles(t){let e=D(t);return e.endsWith(".opam")||e.endsWith(".opam.locked")||e==="dune-project"},isLockfile(t){return D(t).endsWith(".opam.locked")},parse(t,e){if(D(e)==="dune-project")return hM(t);let n=D(e).endsWith(".opam.locked");return kM(t,n)}};function hM(t){let e=new Map;for(let n of bM(t,"depends"))for(let r of wM(n)){let s=/^\(\s*([\w.+-]+)([\s\S]*)\)$/.exec(r),i=s?.[1]??(/^[\w.+-]+$/.test(r)?r:void 0);if(!i)continue;let o=s?.[2]??"",a=/:with-test|:with-doc|:dev/.test(o)?"dev":"runtime";e.set(i,{version:yM(o),kind:a})}return e}function yM(t){let e=[...t.matchAll(/([<>=]+)\s*([\w.~+-]+)/g)].map(n=>`${n[1]} ${n[2]}`);return e.length===0?null:e.length===1&&e[0].startsWith("= ")?e[0].slice(2):e.join(" & ")}function bM(t,e){let n=[],r=new RegExp(`\\(\\s*${e}\\b`,"g");for(let s of t.matchAll(r)){let i=1,o=s.index+s[0].length,a=o;for(;o0;o++){let c=t[o];c==="("?i+=1:c===")"&&(i-=1)}n.push(t.slice(a,o-1))}return n}function wM(t){let e=[],n="",r=0;for(let s of t){if(s==="("?r+=1:s===")"&&(r-=1),r===0&&/\s/.test(s)){n.trim()&&e.push(n.trim()),n="";continue}n+=s}return n.trim()&&e.push(n.trim()),e}var vM={depends:"runtime",depopts:"optional"};function kM(t,e){let n=new Map;for(let[r,s]of Object.entries(vM))for(let i of SM(t,r))for(let o of _M(i)){let a=/^"([^"]+)"/.exec(o)?.[1];if(!a)continue;let c=/\{([\s\S]*)\}/.exec(o)?.[1]??"",l=/\bwith-test\b|\bwith-doc\b|\bdev\b/.test(c)?"dev":s;n.set(a,{version:EM(c),kind:e?"transitive":l})}return n}function EM(t){if(!t.trim())return null;let e=[...t.matchAll(/([<>=!]+)\s*"([^"]+)"/g)].map(r=>`${r[1]} ${r[2]}`);return e.length===0?null:/^=\s/.exec(e[0])&&e.length===1?e[0].slice(2):e.join(" & ")}function SM(t,e){let n=[],r=new RegExp(`(?:^|\\n)\\s*${e}\\s*:\\s*\\[`,"g");for(let s of t.matchAll(r)){let i=1,o=s.index+s[0].length,a=o;for(;o0;o++){let c=t[o];if(c==='"'){for(o+=1;or))continue;if(c")return Za(t);for(let s=n+1;s{s&&i&&e.set(s,{version:i,kind:o}),s=null,i=null,o="transitive"};for(let c of n){let l=Dd(c.replace(/\r$/,""));if(!l.trim())continue;let u=l.length-l.trimStart().length;if(u===0){a(),r=/^packages\s*:/.test(l.trim());continue}if(!r)continue;if(u===2){a(),s=/^\s*"?([A-Za-z_][\w.-]*)"?\s*:/.exec(l)?.[1]??null;continue}if(!s)continue;let d=/^\s*([A-Za-z_][\w-]*)\s*:(.*)$/.exec(l);if(d){if(d[1]==="version")i=Za(d[2].trim())||null;else if(d[1]==="dependency"){let p=Za(d[2].trim());o=p.startsWith("direct dev")?"dev":p.startsWith("direct")?"runtime":"transitive"}}}return a(),e}function Dd(t){let e=!1,n=!1;for(let r=0;r<=!]*\s*[\d][^"']*)["']/g)].map(m=>m[1].trim()),u=l.length?l.join(", "):null,d=/\bgroups?:\s*\[?\s*:?([\w,\s:]+)/.exec(c)?.[1]??"",p=`${n.join(" ")} ${d}`,f=/development|test/.test(p)?"dev":"runtime";e.set(a,{version:u,kind:f})}return e}function MM(t){let e=new Map,n=!1;for(let r of t.split(` -`)){let s=r.replace(/\r$/,"");if(/^\s*specs:\s*$/.test(s)){n=!0;continue}if(s.trim()&&!/^\s/.test(s)){n=!1;continue}if(!n)continue;let i=/^ {4}([A-Za-z0-9_.-]+) \(([^)]+)\)$/.exec(s);i&&e.set(i[1],{version:i[2],kind:"transitive"})}return e}function NM(t){let e=new Map,n=/add_(development_|runtime_)?dependency[\s(]+["']([^"']+)["'](?:\s*,\s*["']([^"']+)["'])?/g;for(let r of t.matchAll(n))e.set(r[2],{version:r[3]??null,kind:r[1]==="development_"?"dev":"runtime"});return e}var Tv={ecosystem:"maven",name:"sbt",handles(t){return D(t).endsWith(".sbt")?!0:/(^|\/)project\/[\w-]+\.scala$/.test(t.toLowerCase())},isLockfile(){return!1},parse(t){return GM(t)}};function LM(t){let e=t.trim().split(".");return e[0]==="3"?"3":e.length>=2?`${e[0]}.${e[1]}`:t.trim()}function GM(t){let e=new Map,n=/\bscalaVersion\s*(?::=|\+=)\s*"([^"]+)"/.exec(t)?.[1],r=n?`_${LM(n)}`:"",s=new Map;for(let o of t.matchAll(/\bval\s+([A-Za-z_]\w*)\s*=\s*"([^"]+)"/g))s.set(o[1],o[2]);let i=/"([\w.-]+)"\s*(%%%|%%|%)\s*"([\w.-]+)"\s*%\s*(?:"([^"]+)"|([A-Za-z_]\w*))((?:\s*%\s*"[A-Za-z]+")?)/g;for(let o of t.matchAll(i)){let a=o[1],c=o[2],l=o[3],u=o[4],d=o[5],p=o[6]??"",f=c==="%%"?`${a}:${l}${r}`:`${a}:${l}`,m=u??(d?s.get(d)??null:null),g=/"(test|it)"/i.test(p)||/"provided"/i.test(p)?"dev":/"optional"/i.test(p)?"optional":"runtime";e.set(f,{version:m,kind:g})}for(let o of t.matchAll(/addSbtPlugin\s*\(\s*"([\w.-]+)"\s*%\s*"([\w.-]+)"\s*%\s*"([^"]+)"/g))e.set(`${o[1]}:${o[2]}`,{version:o[3],kind:"dev"});return e}var xv={ecosystem:"swift",name:"Swift Package Manager",handles(t){let e=D(t);return e==="package.resolved"||/^package(@swift-[\d.]+)?\.swift$/.test(e)},isLockfile(t){return D(t)==="package.resolved"},parse(t,e){return D(e)==="package.resolved"?qM(t):jM(t)}};function jM(t){let e=new Map;for(let n of t.matchAll(/\.package\s*\(([\s\S]*?)\)\s*[,\]]/g)){let r=n[1]??"",s=/\burl\s*:\s*"([^"]+)"/.exec(r)?.[1],i=/\bpath\s*:\s*"([^"]+)"/.exec(r)?.[1];if(!s&&i)continue;let o=/\bid\s*:\s*"([^"]+)"/.exec(r)?.[1],a=s?$v(s):o;a&&e.set(a,{version:FM(r),kind:"runtime"})}return e}function FM(t){let e=/\bexact\s*:\s*"([^"]+)"/.exec(t)?.[1];if(e)return e;let n=/\bfrom\s*:\s*"([^"]+)"/.exec(t)?.[1];if(n)return`^${n}`;let r=/\.upToNextMajor\s*\(\s*from\s*:\s*"([^"]+)"/.exec(t)?.[1];if(r)return`^${r}`;let s=/\.upToNextMinor\s*\(\s*from\s*:\s*"([^"]+)"/.exec(t)?.[1];if(s)return`~${s}`;let i=/"([^"]+)"\s*\.\.[.<]\s*"([^"]+)"/.exec(t);return i?`>=${i[1]} <${i[2]}`:null}function qM(t){let e=new Map,n=Se(t);if(!n)return e;for(let r of n.pins??n.object?.pins??[]){let s=r.location??r.repositoryURL,i=s?$v(s):r.identity??r.package;if(!i)continue;let o=r.state?.version??null;e.set(i,{version:o,kind:"transitive"})}return e}function $v(t){let e=t.trim().replace(/\.git$/,"").replace(/\/+$/,"");if(!e)return null;let n=/github\.com[/:]([\w.-]+)\/([\w.-]+)$/.exec(e);return n?`${n[1]}/${n[2]}`:e.split("/").pop()||null}var Rv={ecosystem:"vcpkg",name:"vcpkg",handles(t){let e=D(t);return e==="vcpkg.json"||e==="vcpkg-configuration.json"},isLockfile(){return!1},parse(t){let e=new Map,n=Se(t);if(!n)return e;for(let s of n.dependencies??[]){if(typeof s=="string"){e.set(s,{version:null,kind:"runtime"});continue}s.name&&e.set(s.name,{version:s["version>="]??null,kind:s.host?"dev":"runtime"})}for(let s of n.overrides??[]){if(!s.name)continue;let i=s.version??s["version-string"]??s["version-semver"]??null,o=e.get(s.name);e.set(s.name,{version:i,kind:o?.kind??"runtime"})}let r=n["builtin-baseline"]??n.registries?.find(s=>s.baseline)?.baseline;return r&&e.set(UM,{version:r,kind:"transitive"}),e}},UM="vcpkg-baseline";var Av=[fv,Sv,cv,rv,Tv,uv,_v,yv,ov,lv,vv,xv,iv,bv,sv,Rv,Xw];function Cv(t){return Av.some(e=>e.handles(t))}function BM(t){return Av.find(e=>e.handles(t))}function Pv(t){let e=new Map;for(let n of t){let r=BM(n.path);if(!r)continue;let s=n.before?r.parse(n.before,n.path):new Map,i=n.after?r.parse(n.after,n.path):new Map,o=r.isLockfile(n.path);for(let a of new Set([...s.keys(),...i.keys()])){let c=s.get(a),l=i.get(a),u=c?.version??null,d=l?.version??null;if(u===d)continue;let p=te(u),f=te(d),m=Od(u),g=Od(d);if(m&&g&&m===g)continue;let h=l?.kind??c?.kind??"runtime",y=o&&h==="runtime"?"transitive":h,w={name:a,ecosystem:r.ecosystem,from:p,to:f,kind:y,bump:Yw(u,d),manifestPath:n.path,rawFrom:u,rawTo:d,source:o?"lockfile":"manifest"},S=`${r.ecosystem}:${VM(n.path)}:${a}`,v=e.get(S);(!v||WM(v,w,o))&&e.set(S,w)}}return[...e.values()].sort((n,r)=>n.ecosystem.localeCompare(r.ecosystem)||n.name.localeCompare(r.name))}function VM(t){let e=t.lastIndexOf("/");return e===-1?"":t.slice(0,e)}function WM(t,e,n){let r=t.source==="lockfile";return r&&!n?!0:!r&&n?!1:e.from!==null&&e.to!==null&&(t.from===null||t.to===null)}function Ov(t,e){let n=[],r=[],s=new Set(e.ecosystems);for(let i of t){let o=zM(i,e,s);o?r.push({change:i,reason:o}):n.push(i)}return{actionable:n,skipped:r}}function zM(t,e,n){if(!n.has(t.ecosystem))return`ecosystem "${t.ecosystem}" is not enabled in drift.yml`;if(ir(e.ignore,t.name))return"matched an `ignore` pattern in drift.yml";if(t.to===null)return"dependency was removed; removals need no compatibility fix";if(t.kind==="dev"&&!e.triggerOn.dev)return"dev dependency (enable `triggerOn.dev` to analyse these)";if(t.kind==="transitive"&&!e.triggerOn.transitive)return"transitive dependency (enable `triggerOn.transitive` to analyse these)";if(t.from===null)return"newly added dependency; there is no prior version to break against";let r=Oi(t.from,t.to);return t.bump==="major"&&!e.triggerOn.major?"major bumps are disabled in drift.yml (enable `triggerOn.major` to include these)":t.bump==="minor"&&!e.triggerOn.minor&&!r?"minor bumps are disabled in drift.yml (enable `triggerOn.minor` to include these)":t.bump==="patch"&&!e.triggerOn.patch?"patch bumps are disabled in drift.yml (enable `triggerOn.patch` to include these)":t.bump==="prerelease"&&!e.triggerOn.patch?"prerelease moves are disabled in drift.yml (enable `triggerOn.patch`)":null}var us=require("node:fs"),Dv=vt(vi(),1);function Md(){return{async readFile(t){try{return(0,us.readFileSync)(t,"utf8")}catch{return null}},async readDirectory(t){try{return(0,us.readdirSync)(t)}catch{return[]}},async isDirectory(t){try{return(0,us.statSync)(t).isDirectory()}catch{return!1}}}}async function Mv(t,e){let r=(await Promise.all([HM(t,e),KM(t,e),JM(t,e),YM(t,e),ZM(t,e),XM(t,e)])).filter(i=>i!==null);return r.find(i=>i.kind==="pnpm-workspace")?r.filter(i=>i.kind!=="npm-workspaces"):r}function Qa(t){let e=new Set;for(let n of t)for(let r of n.members)e.add(r.dir);return e.size===0?[""]:[...e].sort()}function Nd(t,e){let n=null;for(let r of e){if(r===""){n===null&&(n="");continue}(t===r||t.startsWith(`${r}/`))&&(n===null||r.length>n.length)&&(n=r)}return n}function Ld(t,e){return e===""||t===e||t.startsWith(`${e}/`)}function Nv(t,e){if(e.length===0)return[...t];let n=Qa(e),r=new Map;for(let s of e)for(let i of s.members)i.name&&r.set(i.dir,i.name);return t.map(s=>{let i=Nd(s.manifestPath,n);if(i===null)return s;let o=r.get(i);return{...s,workspace:i,...o?{workspaceName:o}:{}}})}function Lv(t){return t.workspace===void 0?null:t.workspaceName??(t.workspace===""?"the repository root":t.workspace)}async function HM(t,e){let n=await e.readFile(We(t,"package.json"));if(!n)return null;let r=Se(n),s=Array.isArray(r?.workspaces)?r.workspaces:r?.workspaces?.packages;return!s||s.length===0?null:{kind:"npm-workspaces",ecosystem:"npm",declaredIn:"package.json",members:await ds(t,e,s,"npm","package.json",r?.name??null)}}async function KM(t,e){let n=await e.readFile(We(t,"pnpm-workspace.yaml"));if(!n)return null;let r=[];try{let i=(0,Dv.parse)(n);Array.isArray(i?.packages)&&(r=i.packages.filter(o=>typeof o=="string"))}catch{return null}if(r.length===0)return null;let s=Se(await e.readFile(We(t,"package.json"))??"")?.name??null;return{kind:"pnpm-workspace",ecosystem:"npm",declaredIn:"pnpm-workspace.yaml",members:await ds(t,e,r,"npm","package.json",s)}}async function JM(t,e){let n=await e.readFile(We(t,"Cargo.toml"));if(!n)return null;let r=$t(n),s=r.find(c=>c.header==="workspace");if(!s)return null;let i=Ii(s.entries.get("members")??""),o=r.some(c=>c.header==="package"),a=o?Gv(r.find(c=>c.header==="package")?.entries.get("name")??""):null;return{kind:"cargo-workspace",ecosystem:"cargo",declaredIn:"Cargo.toml",members:await ds(t,e,i,"cargo","Cargo.toml",a,!o)}}async function YM(t,e){let n=await e.readFile(We(t,"go.work"));if(!n)return null;let r=[],s=!1;for(let i of n.split(` -`)){let o=i.split("//")[0].trim();if(!o)continue;if(/^use\s*\($/.test(o)){s=!0;continue}if(s&&o===")"){s=!1;continue}let a=/^use\s+(\S+)$/.exec(o);a?r.push(a[1]):s&&r.push(o)}return{kind:"go-work",ecosystem:"go",declaredIn:"go.work",members:await ds(t,e,r,"go","go.mod",null,!0)}}async function ZM(t,e){let n=await e.readFile(We(t,"pom.xml"));if(!n)return null;let r=/([\s\S]*?)<\/modules>/.exec(n);if(!r)return null;let s=[...r[1].matchAll(/\s*([^<]+?)\s*<\/module>/g)].map(o=>o[1]);if(s.length===0)return null;let i=/\s*([^<]+?)\s*<\/artifactId>/.exec(n)?.[1]??null;return{kind:"maven-modules",ecosystem:"maven",declaredIn:"pom.xml",members:await ds(t,e,s,"maven","pom.xml",i)}}async function XM(t,e){let n=await e.readFile(We(t,"settings.gradle.kts"))?"settings.gradle.kts":await e.readFile(We(t,"settings.gradle"))?"settings.gradle":null;if(!n)return null;let s=[...(await e.readFile(We(t,n))??"").matchAll(/include\s*\(?\s*((?:['"][^'"]+['"]\s*,?\s*)+)/g)].flatMap(i=>[...i[1].matchAll(/['"]([^'"]+)['"]/g)].map(o=>o[1])).map(i=>i.replace(/^:/,"").replace(/:/g,"/"));return s.length===0?null:{kind:"gradle-settings",ecosystem:"maven",declaredIn:n,members:await ds(t,e,s,"maven","build.gradle",null,!0)}}async function ds(t,e,n,r,s,i,o=!1){let a=new Set,c=new Set;for(let u of n){let d=u.trim();if(d.startsWith("!"))for(let p of await Iv(t,e,d.slice(1),s))c.add(p);else for(let p of await Iv(t,e,d,s))a.add(p)}for(let u of c)a.delete(u);let l=[];o||l.push({dir:"",name:i,ecosystem:r});for(let u of[...a].sort())u!==""&&l.push({dir:u,name:await QM(t,e,u,s,r),ecosystem:r});return l}async function Iv(t,e,n,r){let s=n.replace(/^\.\//,"").replace(/\/+$/,"");if(s.startsWith("!"))return[];if(!s.includes("*"))return[s];let i=s.split("/"),o=i.findIndex(p=>p.includes("*")),a=i.slice(0,o).join("/"),c=i[o]==="**",l=i.slice(o+1).join("/"),u=[],d=async(p,f)=>{if(!(f>4))for(let m of await e.readDirectory(We(t,p))){if(m.startsWith(".")||m==="node_modules"||m==="target")continue;let g=p?`${p}/${m}`:m;if(!await e.isDirectory(We(t,g)))continue;let h=l?`${g}/${l}`:g;(!r||await e.readFile(We(t,h,r))!==null)&&u.push(h),c&&await d(g,f+1)}};return await d(a,0),u}async function QM(t,e,n,r,s){let i=await e.readFile(We(t,n,r));if(!i)return null;switch(s){case"npm":return Se(i)?.name??null;case"cargo":{let o=$t(i).find(a=>a.header==="package");return Gv(o?.entries.get("name")??"")||null}case"go":return/^\s*module\s+(\S+)/m.exec(i)?.[1]??null;case"maven":return/\s*([^<]+?)\s*<\/artifactId>/.exec(i)?.[1]??null;default:return null}}function Gv(t){return t.trim().replace(/^["']|["']$/g,"")}function We(...t){return t.filter(Boolean).join("/")}var jv=require("node:path"),Gd=(t,e,n)=>t==="dev"?[e]:t==="optional"?[n]:[],eN=[{id:"npm",ecosystem:"npm",label:"npm",manifests:["package.json"],lockfiles:["package-lock.json","npm-shrinkwrap.json"],outdated:{command:"npm",args:["outdated","--json"]},upgrade:({name:t,version:e,kind:n})=>({command:"npm",args:["install",`${t}@${e}`,...Gd(n,"--save-dev","--save-optional")]})},{id:"pnpm",ecosystem:"npm",label:"pnpm",manifests:["package.json"],lockfiles:["pnpm-lock.yaml"],outdated:{command:"pnpm",args:["outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"pnpm",args:["add",`${t}@${e}`,...Gd(n,"--save-dev","--save-optional")]})},{id:"yarn-berry",ecosystem:"npm",label:"Yarn (berry)",manifests:["package.json"],lockfiles:["yarn.lock"],outdated:null,upgrade:({name:t,version:e})=>({command:"yarn",args:["up",`${t}@${e}`]})},{id:"yarn",ecosystem:"npm",label:"Yarn (classic)",manifests:["package.json"],lockfiles:["yarn.lock"],outdated:{command:"yarn",args:["outdated","--json"]},upgrade:({name:t,version:e})=>({command:"yarn",args:["upgrade",`${t}@${e}`]})},{id:"bun",ecosystem:"npm",label:"Bun",manifests:["package.json"],lockfiles:["bun.lock","bun.lockb"],outdated:{command:"bun",args:["outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"bun",args:["add",`${t}@${e}`,...Gd(n,"--dev","--optional")]})},{id:"uv",ecosystem:"pypi",label:"uv",manifests:["pyproject.toml"],lockfiles:["uv.lock"],outdated:{command:"uv",args:["pip","list","--outdated","--format","json"]},upgrade:({name:t,version:e,kind:n})=>({command:"uv",args:["add",`${t}==${e}`,...n==="dev"?["--dev"]:[]]})},{id:"poetry",ecosystem:"pypi",label:"Poetry",manifests:["pyproject.toml"],lockfiles:["poetry.lock"],outdated:{command:"poetry",args:["show","--outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"poetry",args:["add",`${t}==${e}`,...n==="dev"?["--group","dev"]:[]]})},{id:"pip",ecosystem:"pypi",label:"pip",manifests:["requirements.txt","pyproject.toml","setup.py"],lockfiles:[],outdated:{command:"pip",args:["list","--outdated","--format=json"]},upgrade:({name:t,version:e})=>({command:"pip",args:["install","--upgrade",`${t}==${e}`]}),rewriteManifest:(t,{name:e,version:n},r)=>(0,jv.basename)(r).toLowerCase().endsWith(".txt")?tN(t,e,n):nN(t,e,n)},{id:"go",ecosystem:"go",label:"Go modules",manifests:["go.mod"],lockfiles:["go.sum"],outdated:{command:"go",args:["list","-u","-m","all"]},upgrade:({name:t,version:e})=>({command:"go",args:["get",`${t}@${e.startsWith("v")?e:`v${e}`}`]})},{id:"cargo",ecosystem:"cargo",label:"Cargo",manifests:["Cargo.toml"],lockfiles:["Cargo.lock"],outdated:{command:"cargo",args:["update","--dry-run"]},upgrade:({name:t,version:e})=>({command:"cargo",args:["add",`${t}@=${e}`]})},{id:"bundler",ecosystem:"rubygems",label:"Bundler",manifests:["Gemfile"],lockfiles:["Gemfile.lock"],outdated:{command:"bundle",args:["outdated"]},upgrade:({name:t})=>({command:"bundle",args:["update",t,"--conservative"]}),rewriteManifest:(t,{name:e,version:n})=>rN(t,e,n)},{id:"maven",ecosystem:"maven",label:"Maven",manifests:["pom.xml"],lockfiles:[],outdated:{command:"mvn",args:["versions:display-dependency-updates"]},upgrade:({name:t,version:e})=>({command:"mvn",args:["versions:use-dep-version",`-Dincludes=${t}`,`-DdepVersion=${e}`,"-DforceVersion=true"]})},{id:"gradle",ecosystem:"maven",label:"Gradle",manifests:["gradle/libs.versions.toml","build.gradle","build.gradle.kts"],lockfiles:["gradle.lockfile"],outdated:{command:"gradle",args:["dependencyUpdates"]},upgrade:()=>null},{id:"sbt",ecosystem:"maven",label:"sbt",manifests:["build.sbt"],lockfiles:[],outdated:{command:"sbt",args:["dependencyUpdates"]},upgrade:()=>null},{id:"dotnet",ecosystem:"nuget",label:"NuGet",manifests:["Directory.Packages.props"],manifestPattern:/\.(cs|fs|vb)proj$/i,lockfiles:["packages.lock.json"],outdated:{command:"dotnet",args:["list","package","--outdated"]},upgrade:({name:t,version:e})=>({command:"dotnet",args:["add","package",t,"--version",e]})},{id:"composer",ecosystem:"packagist",label:"Composer",manifests:["composer.json"],lockfiles:["composer.lock"],outdated:{command:"composer",args:["outdated","--format=json"]},upgrade:({name:t,version:e,kind:n})=>({command:"composer",args:["require",`${t}:${e}`,...n==="dev"?["--dev"]:[]]})},{id:"mix",ecosystem:"hex",label:"Mix",manifests:["mix.exs"],lockfiles:["mix.lock"],outdated:{command:"mix",args:["hex.outdated"]},upgrade:({name:t})=>({command:"mix",args:["deps.update",t]}),rewriteManifest:(t,{name:e,version:n})=>sN(t,e,n)},{id:"rebar",ecosystem:"hex",label:"Rebar3",manifests:["rebar.config"],lockfiles:["rebar.lock"],outdated:null,upgrade:({name:t})=>({command:"rebar3",args:["upgrade",t]}),rewriteManifest:(t,{name:e,version:n})=>iN(t,e,n)},{id:"flutter",ecosystem:"pub",label:"Flutter",manifests:["pubspec.yaml"],lockfiles:["pubspec.lock"],outdated:{command:"flutter",args:["pub","outdated"]},upgrade:({name:t,version:e})=>({command:"flutter",args:["pub","add",`${t}:${e}`]})},{id:"dart",ecosystem:"pub",label:"Dart pub",manifests:["pubspec.yaml"],lockfiles:["pubspec.lock"],outdated:{command:"dart",args:["pub","outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"dart",args:["pub","add",...n==="dev"?["dev:"]:[],`${t}:${e}`]})},{id:"swiftpm",ecosystem:"swift",label:"Swift Package Manager",manifests:["Package.swift"],lockfiles:["Package.resolved"],outdated:null,upgrade:()=>null},{id:"cocoapods",ecosystem:"cocoapods",label:"CocoaPods",manifests:["Podfile"],lockfiles:["Podfile.lock"],outdated:{command:"pod",args:["outdated"]},upgrade:({name:t})=>({command:"pod",args:["update",t]}),rewriteManifest:(t,{name:e,version:n})=>oN(t,e,n)},{id:"opam",ecosystem:"opam",label:"opam",manifests:["dune-project"],manifestPattern:/\.opam$/,lockfiles:[],outdated:null,upgrade:({name:t,version:e})=>({command:"opam",args:["install",`${t}.${e}`,"--yes"]})},{id:"conan",ecosystem:"conan",label:"Conan",manifests:["conanfile.txt","conanfile.py"],lockfiles:["conan.lock"],outdated:null,upgrade:()=>({command:"conan",args:["install",".","--build=missing"]}),rewriteManifest:(t,{name:e,version:n})=>aN(t,e,n)},{id:"vcpkg",ecosystem:"vcpkg",label:"vcpkg",manifests:["vcpkg.json"],lockfiles:[],outdated:null,upgrade:()=>({command:"vcpkg",args:["install"]}),rewriteManifest:(t,{name:e,version:n})=>cN(t,e,n)},{id:"arduino-cli",ecosystem:"arduino",label:"Arduino CLI",manifests:["library.properties"],lockfiles:[],outdated:{command:"arduino-cli",args:["lib","upgrade","--dry-run"]},upgrade:({name:t,version:e})=>({command:"arduino-cli",args:["lib","install",`${t}@${e}`]}),rewriteManifest:(t,{name:e,version:n})=>lN(t,e,n)},{id:"platformio",ecosystem:"arduino",label:"PlatformIO",manifests:["platformio.ini"],lockfiles:[],outdated:{command:"pio",args:["pkg","outdated"]},upgrade:({name:t,version:e})=>({command:"pio",args:["pkg","install","--library",`${t}@${e}`]}),rewriteManifest:(t,{name:e,version:n})=>uN(t,e,n)}];function hn(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tN(t,e,n){let r=hn(e).replace(/[-_.]/g,"[-_.]"),s=new RegExp(`^([ \\t]*${r})(\\[[^\\]]*\\])?[ \\t]*(?:[=<>!~]=?\\s*[^\\s;#,]+(?:\\s*,\\s*[=<>!~]=?\\s*[^\\s;#,]+)*)?`,"im");return s.test(t)?t.replace(s,(i,o,a)=>`${o}${a??""}==${n}`):t}function nN(t,e,n){let r=hn(e).replace(/[-_.]/g,"[-_.]"),s=new RegExp(`(["'])${r}(\\[[^\\]]*\\])?(?:\\s*[=<>!~]=?\\s*[^"',;]+(?:\\s*,\\s*[=<>!~]=?\\s*[^"',;]+)*)?\\1`,"i");return s.test(t)?t.replace(s,(i,o,a)=>`${o}${e}${a??""}==${n}${o}`):t}function rN(t,e,n){let r=hn(e),s=new RegExp(`(gem\\s+["']${r}["'])\\s*,\\s*["'][^"']*["']`);if(s.test(t))return t.replace(s,`$1, '${n}'`);let i=new RegExp(`(gem\\s+["']${r}["'])(?!\\s*,\\s*["'])`);return t.replace(i,`$1, '${n}'`)}function sN(t,e,n){let r=hn(e),s=new RegExp(`(\\{\\s*:${r}\\s*,\\s*)"[^"]*"`);return s.test(t)?t.replace(s,`$1"== ${n}"`):t}function iN(t,e,n){let r=hn(e),s=new RegExp(`(\\{\\s*${r}\\s*,\\s*)"[^"]*"`);return s.test(t)?t.replace(s,`$1"${n}"`):t}function oN(t,e,n){let r=hn(e),s=new RegExp(`(pod\\s+["']${r}["'])\\s*,\\s*["'][^"']*["']`);if(s.test(t))return t.replace(s,`$1, '${n}'`);let i=new RegExp(`(pod\\s+["']${r}["'])(?!\\s*,\\s*["'])`);return t.replace(i,`$1, '${n}'`)}function aN(t,e,n){let r=hn(e),s=new RegExp(`\\b${r}/[^\\s"'#@]+`,"g");return t.replace(s,`${e}/${n}`)}function cN(t,e,n){let r;try{r=JSON.parse(t)}catch{return t}let s=Array.isArray(r.overrides)?r.overrides:[],i=s.find(o=>o.name===e);return i?i.version=n:s.push({name:e,version:n}),r.overrides=s,`${JSON.stringify(r,null,2)} -`}function lN(t,e,n){return t.split(` +`;continue}if(s==="/"&&t[r+1]==="*"){for(r+=2;ri.split(/[.+-]/).map(o=>Number.parseInt(o,10)),r=n(t),s=n(e);for(let i=0;ia}return!1}function ZM(t){let e=new Map,n=null;for(let r of t.split(` +`)){let s=r.replace(/\r$/,"");if(!s.trim()||s.startsWith("#"))continue;if(!/^\s/.test(s)){let o=s.replace(/:\s*$/,"").split(",")[0].trim().replace(/^"|"$/g,"");n=Wv(o);continue}let i=/^\s+version:?\s+"?([^"\s]+)"?/.exec(s)?.[1];if(i&&n){let o=e.get(n);(!o||Vv(i,o.version??""))&&e.set(n,{version:i,kind:"transitive"}),n=null}}return e}function XM(t){let e=new Map,n;try{n=(0,Uv.parse)(t)}catch{return e}let r=n?.packages;if(!r||typeof r!="object")return e;for(let s of Object.keys(r)){let i=s.startsWith("/")?s.slice(1):s,o=Wv(i),a=QM(i);if(!o||!a)continue;let c=e.get(o);(!c||Vv(a,c.version??""))&&e.set(o,{version:a,kind:"transitive"})}return e}function Wv(t){let e=t.lastIndexOf("@");return e<=0?t||null:t.slice(0,e)||null}function QM(t){let e=t.lastIndexOf("@");return e<=0?null:t.slice(e+1).split("(")[0]||null}var Hv={ecosystem:"nuget",name:"NuGet",handles(t){let e=M(t);return/\.(cs|fs|vb)proj$/.test(e)||e==="directory.packages.props"||e==="directory.build.props"||e==="packages.lock.json"||e==="packages.config"||e.endsWith(".nuspec")},isLockfile(t){return M(t)==="packages.lock.json"},parse(t,e){let n=M(e);return n==="packages.lock.json"?tN(t):n==="packages.config"?nN(t):n.endsWith(".nuspec")?rN(t):eN(t)}};function eN(t){let e=new Map,n=/<(PackageReference|PackageVersion|GlobalPackageReference)\b([^>]*?)(\/>|>([\s\S]*?)<\/\1>)/g;for(let r of t.matchAll(n)){let s=r[2]??"",i=r[4]??"",o=Pt(s,"Include")??Pt(s,"Update");if(!o)continue;let a=Pt(s,"Version")??Pt(s,"VersionOverride")??zv(i,"Version"),c=a&&!a.includes("$(")?a:null,u=(Pt(s,"PrivateAssets")??zv(i,"PrivateAssets"))?.toLowerCase()==="all"?"dev":"runtime";e.set(o,{version:c,kind:u})}return e}function tN(t){let e=new Map,n=Re(t);if(!n?.dependencies)return e;for(let r of Object.values(n.dependencies))if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r)){let o=i?.resolved??null;if(!o)continue;let a=i.type==="Direct"?"runtime":"transitive";e.get(s)?.kind==="runtime"&&a==="transitive"||e.set(s,{version:o,kind:a})}return e}function nN(t){let e=new Map;for(let n of t.matchAll(/]*?)\/?>/g)){let r=n[1]??"",s=Pt(r,"id");if(!s)continue;let i=Pt(r,"developmentDependency");e.set(s,{version:Pt(r,"version"),kind:i?.toLowerCase()==="true"?"dev":"runtime"})}return e}function rN(t){let e=new Map;for(let n of t.matchAll(/]*?)\/?>/g)){let r=n[1]??"",s=Pt(r,"id");s&&e.set(s,{version:Pt(r,"version"),kind:"runtime"})}return e}function Pt(t,e){let n=new RegExp(`\\b${e}\\s*=\\s*("([^"]*)"|'([^']*)')`,"i").exec(t);return(n?.[2]??n?.[3])?.trim()||null}function zv(t,e){return new RegExp(`<${e}\\s*>([^<]*)`,"i").exec(t)?.[1]?.trim()||null}var Kv={ecosystem:"opam",name:"opam",handles(t){let e=M(t);return e.endsWith(".opam")||e.endsWith(".opam.locked")||e==="dune-project"},isLockfile(t){return M(t).endsWith(".opam.locked")},parse(t,e){if(M(e)==="dune-project")return sN(t);let n=M(e).endsWith(".opam.locked");return lN(t,n)}};function sN(t){let e=new Map;for(let n of oN(t,"depends"))for(let r of aN(n)){let s=/^\(\s*([\w.+-]+)([\s\S]*)\)$/.exec(r),i=s?.[1]??(/^[\w.+-]+$/.test(r)?r:void 0);if(!i)continue;let o=s?.[2]??"",a=/:with-test|:with-doc|:dev/.test(o)?"dev":"runtime";e.set(i,{version:iN(o),kind:a})}return e}function iN(t){let e=[...t.matchAll(/([<>=]+)\s*([\w.~+-]+)/g)].map(n=>`${n[1]} ${n[2]}`);return e.length===0?null:e.length===1&&e[0].startsWith("= ")?e[0].slice(2):e.join(" & ")}function oN(t,e){let n=[],r=new RegExp(`\\(\\s*${e}\\b`,"g");for(let s of t.matchAll(r)){let i=1,o=s.index+s[0].length,a=o;for(;o0;o++){let c=t[o];c==="("?i+=1:c===")"&&(i-=1)}n.push(t.slice(a,o-1))}return n}function aN(t){let e=[],n="",r=0;for(let s of t){if(s==="("?r+=1:s===")"&&(r-=1),r===0&&/\s/.test(s)){n.trim()&&e.push(n.trim()),n="";continue}n+=s}return n.trim()&&e.push(n.trim()),e}var cN={depends:"runtime",depopts:"optional"};function lN(t,e){let n=new Map;for(let[r,s]of Object.entries(cN))for(let i of dN(t,r))for(let o of pN(i)){let a=/^"([^"]+)"/.exec(o)?.[1];if(!a)continue;let c=/\{([\s\S]*)\}/.exec(o)?.[1]??"",l=/\bwith-test\b|\bwith-doc\b|\bdev\b/.test(c)?"dev":s;n.set(a,{version:uN(c),kind:e?"transitive":l})}return n}function uN(t){if(!t.trim())return null;let e=[...t.matchAll(/([<>=!]+)\s*"([^"]+)"/g)].map(r=>`${r[1]} ${r[2]}`);return e.length===0?null:/^=\s/.exec(e[0])&&e.length===1?e[0].slice(2):e.join(" & ")}function dN(t,e){let n=[],r=new RegExp(`(?:^|\\n)\\s*${e}\\s*:\\s*\\[`,"g");for(let s of t.matchAll(r)){let i=1,o=s.index+s[0].length,a=o;for(;o0;o++){let c=t[o];if(c==='"'){for(o+=1;or))continue;if(c")return cc(t);for(let s=n+1;s{s&&i&&e.set(s,{version:i,kind:o}),s=null,i=null,o="transitive"};for(let c of n){let l=sp(c.replace(/\r$/,""));if(!l.trim())continue;let u=l.length-l.trimStart().length;if(u===0){a(),r=/^packages\s*:/.test(l.trim());continue}if(!r)continue;if(u===2){a(),s=/^\s*"?([A-Za-z_][\w.-]*)"?\s*:/.exec(l)?.[1]??null;continue}if(!s)continue;let d=/^\s*([A-Za-z_][\w-]*)\s*:(.*)$/.exec(l);if(d){if(d[1]==="version")i=cc(d[2].trim())||null;else if(d[1]==="dependency"){let p=cc(d[2].trim());o=p.startsWith("direct dev")?"dev":p.startsWith("direct")?"runtime":"transitive"}}}return a(),e}function sp(t){let e=!1,n=!1;for(let r=0;r<=!]*\s*[\d][^"']*)["']/g)].map(m=>m[1].trim()),u=l.length?l.join(", "):null,d=/\bgroups?:\s*\[?\s*:?([\w,\s:]+)/.exec(c)?.[1]??"",p=`${n.join(" ")} ${d}`,f=/development|test/.test(p)?"dev":"runtime";e.set(a,{version:u,kind:f})}return e}function SN(t){let e=new Map,n=!1;for(let r of t.split(` +`)){let s=r.replace(/\r$/,"");if(/^\s*specs:\s*$/.test(s)){n=!0;continue}if(s.trim()&&!/^\s/.test(s)){n=!1;continue}if(!n)continue;let i=/^ {4}([A-Za-z0-9_.-]+) \(([^)]+)\)$/.exec(s);i&&e.set(i[1],{version:i[2],kind:"transitive"})}return e}function xN(t){let e=new Map,n=/add_(development_|runtime_)?dependency[\s(]+["']([^"']+)["'](?:\s*,\s*["']([^"']+)["'])?/g;for(let r of t.matchAll(n))e.set(r[2],{version:r[3]??null,kind:r[1]==="development_"?"dev":"runtime"});return e}var tk={ecosystem:"maven",name:"sbt",handles(t){return M(t).endsWith(".sbt")?!0:/(^|\/)project\/[\w-]+\.scala$/.test(t.toLowerCase())},isLockfile(){return!1},parse(t){return _N(t)}};function TN(t){let e=t.trim().split(".");return e[0]==="3"?"3":e.length>=2?`${e[0]}.${e[1]}`:t.trim()}function _N(t){let e=new Map,n=/\bscalaVersion\s*(?::=|\+=)\s*"([^"]+)"/.exec(t)?.[1],r=n?`_${TN(n)}`:"",s=new Map;for(let o of t.matchAll(/\bval\s+([A-Za-z_]\w*)\s*=\s*"([^"]+)"/g))s.set(o[1],o[2]);let i=/"([\w.-]+)"\s*(%%%|%%|%)\s*"([\w.-]+)"\s*%\s*(?:"([^"]+)"|([A-Za-z_]\w*))((?:\s*%\s*"[A-Za-z]+")?)/g;for(let o of t.matchAll(i)){let a=o[1],c=o[2],l=o[3],u=o[4],d=o[5],p=o[6]??"",f=c==="%%"?`${a}:${l}${r}`:`${a}:${l}`,m=u??(d?s.get(d)??null:null),g=/"(test|it)"/i.test(p)||/"provided"/i.test(p)?"dev":/"optional"/i.test(p)?"optional":"runtime";e.set(f,{version:m,kind:g})}for(let o of t.matchAll(/addSbtPlugin\s*\(\s*"([\w.-]+)"\s*%\s*"([\w.-]+)"\s*%\s*"([^"]+)"/g))e.set(`${o[1]}:${o[2]}`,{version:o[3],kind:"dev"});return e}var nk={ecosystem:"swift",name:"Swift Package Manager",handles(t){let e=M(t);return e==="package.resolved"||/^package(@swift-[\d.]+)?\.swift$/.test(e)},isLockfile(t){return M(t)==="package.resolved"},parse(t,e){return M(e)==="package.resolved"?CN(t):$N(t)}};function $N(t){let e=new Map;for(let n of t.matchAll(/\.package\s*\(([\s\S]*?)\)\s*[,\]]/g)){let r=n[1]??"",s=/\burl\s*:\s*"([^"]+)"/.exec(r)?.[1],i=/\bpath\s*:\s*"([^"]+)"/.exec(r)?.[1];if(!s&&i)continue;let o=/\bid\s*:\s*"([^"]+)"/.exec(r)?.[1],a=s?rk(s):o;a&&e.set(a,{version:RN(r),kind:"runtime"})}return e}function RN(t){let e=/\bexact\s*:\s*"([^"]+)"/.exec(t)?.[1];if(e)return e;let n=/\bfrom\s*:\s*"([^"]+)"/.exec(t)?.[1];if(n)return`^${n}`;let r=/\.upToNextMajor\s*\(\s*from\s*:\s*"([^"]+)"/.exec(t)?.[1];if(r)return`^${r}`;let s=/\.upToNextMinor\s*\(\s*from\s*:\s*"([^"]+)"/.exec(t)?.[1];if(s)return`~${s}`;let i=/"([^"]+)"\s*\.\.[.<]\s*"([^"]+)"/.exec(t);return i?`>=${i[1]} <${i[2]}`:null}function CN(t){let e=new Map,n=Re(t);if(!n)return e;for(let r of n.pins??n.object?.pins??[]){let s=r.location??r.repositoryURL,i=s?rk(s):r.identity??r.package;if(!i)continue;let o=r.state?.version??null;e.set(i,{version:o,kind:"transitive"})}return e}function rk(t){let e=t.trim().replace(/\.git$/,"").replace(/\/+$/,"");if(!e)return null;let n=/github\.com[/:]([\w.-]+)\/([\w.-]+)$/.exec(e);return n?`${n[1]}/${n[2]}`:e.split("/").pop()||null}var sk={ecosystem:"vcpkg",name:"vcpkg",handles(t){let e=M(t);return e==="vcpkg.json"||e==="vcpkg-configuration.json"},isLockfile(){return!1},parse(t){let e=new Map,n=Re(t);if(!n)return e;for(let s of n.dependencies??[]){if(typeof s=="string"){e.set(s,{version:null,kind:"runtime"});continue}s.name&&e.set(s.name,{version:s["version>="]??null,kind:s.host?"dev":"runtime"})}for(let s of n.overrides??[]){if(!s.name)continue;let i=s.version??s["version-string"]??s["version-semver"]??null,o=e.get(s.name);e.set(s.name,{version:i,kind:o?.kind??"runtime"})}let r=n["builtin-baseline"]??n.registries?.find(s=>s.baseline)?.baseline;return r&&e.set(AN,{version:r,kind:"transitive"}),e}},AN="vcpkg-baseline";var ik=[Bv,Qv,Gv,Ov,tk,jv,ek,Hv,Nv,Fv,Yv,nk,Mv,Kv,Dv,sk,Rv];function ok(t){return ik.some(e=>e.handles(t))}function uc(t){return ik.find(e=>e.handles(t))}function ak(t){let e=new Map;for(let n of t){let r=uc(n.path);if(!r)continue;let s=n.before?r.parse(n.before,n.path):new Map,i=n.after?r.parse(n.after,n.path):new Map,o=r.isLockfile(n.path);for(let a of new Set([...s.keys(),...i.keys()])){let c=s.get(a),l=i.get(a),u=c?.version??null,d=l?.version??null;if(u===d)continue;let p=te(u),f=te(d),m=np(u),g=np(d);if(m&&g&&m===g)continue;let h=l?.kind??c?.kind??"runtime",y=o&&h==="runtime"?"transitive":h,w={name:a,ecosystem:r.ecosystem,from:p,to:f,kind:y,bump:ac(u,d),manifestPath:n.path,rawFrom:u,rawTo:d,source:o?"lockfile":"manifest"},S=`${r.ecosystem}:${PN(n.path)}:${a}`,b=e.get(S);(!b||IN(b,w,o))&&e.set(S,w)}}return[...e.values()].sort((n,r)=>n.ecosystem.localeCompare(r.ecosystem)||n.name.localeCompare(r.name))}function PN(t){let e=t.lastIndexOf("/");return e===-1?"":t.slice(0,e)}function IN(t,e,n){let r=t.source==="lockfile";return r&&!n?!0:!r&&n?!1:e.from!==null&&e.to!==null&&(t.from===null||t.to===null)}function ck(t,e){let n=[],r=[],s=new Set(e.ecosystems);for(let i of t){let o=ON(i,e,s);o?r.push({change:i,reason:o}):n.push(i)}return{actionable:n,skipped:r}}function ON(t,e,n){if(!n.has(t.ecosystem))return`ecosystem "${t.ecosystem}" is not enabled in drift.yml`;if(lr(e.ignore,t.name))return"matched an `ignore` pattern in drift.yml";if(t.to===null)return"dependency was removed; removals need no compatibility fix";if(t.kind==="dev"&&!e.triggerOn.dev)return"dev dependency (enable `triggerOn.dev` to analyse these)";if(t.kind==="transitive"&&!e.triggerOn.transitive)return"transitive dependency (enable `triggerOn.transitive` to analyse these)";if(t.from===null)return"newly added dependency; there is no prior version to break against";let r=Fi(t.from,t.to);return t.bump==="major"&&!e.triggerOn.major?"major bumps are disabled in drift.yml (enable `triggerOn.major` to include these)":t.bump==="minor"&&!e.triggerOn.minor&&!r?"minor bumps are disabled in drift.yml (enable `triggerOn.minor` to include these)":t.bump==="patch"&&!e.triggerOn.patch?"patch bumps are disabled in drift.yml (enable `triggerOn.patch` to include these)":t.bump==="prerelease"&&!e.triggerOn.patch?"prerelease moves are disabled in drift.yml (enable `triggerOn.patch`)":null}var hs=require("node:fs"),uk=mt($i(),1);function ys(){return{async readFile(t){try{return(0,hs.readFileSync)(t,"utf8")}catch{return null}},async readDirectory(t){try{return(0,hs.readdirSync)(t)}catch{return[]}},async isDirectory(t){try{return(0,hs.statSync)(t).isDirectory()}catch{return!1}}}}async function dc(t,e){let r=(await Promise.all([DN(t,e),MN(t,e),NN(t,e),LN(t,e),GN(t,e),FN(t,e)])).filter(i=>i!==null);return r.find(i=>i.kind==="pnpm-workspace")?r.filter(i=>i.kind!=="npm-workspaces"):r}function bs(t){let e=new Set;for(let n of t)for(let r of n.members)e.add(r.dir);return e.size===0?[""]:[...e].sort()}function ip(t,e){let n=null;for(let r of e){if(r===""){n===null&&(n="");continue}(t===r||t.startsWith(`${r}/`))&&(n===null||r.length>n.length)&&(n=r)}return n}function op(t,e){return e===""||t===e||t.startsWith(`${e}/`)}function dk(t,e){if(e.length===0)return[...t];let n=bs(e),r=new Map;for(let s of e)for(let i of s.members)i.name&&r.set(i.dir,i.name);return t.map(s=>{let i=ip(s.manifestPath,n);if(i===null)return s;let o=r.get(i);return{...s,workspace:i,...o?{workspaceName:o}:{}}})}function pc(t){return t.workspace===void 0?null:t.workspaceName??(t.workspace===""?"the repository root":t.workspace)}async function DN(t,e){let n=await e.readFile(He(t,"package.json"));if(!n)return null;let r=Re(n),s=Array.isArray(r?.workspaces)?r.workspaces:r?.workspaces?.packages;return!s||s.length===0?null:{kind:"npm-workspaces",ecosystem:"npm",declaredIn:"package.json",members:await ws(t,e,s,"npm","package.json",r?.name??null)}}async function MN(t,e){let n=await e.readFile(He(t,"pnpm-workspace.yaml"));if(!n)return null;let r=[];try{let i=(0,uk.parse)(n);Array.isArray(i?.packages)&&(r=i.packages.filter(o=>typeof o=="string"))}catch{return null}if(r.length===0)return null;let s=Re(await e.readFile(He(t,"package.json"))??"")?.name??null;return{kind:"pnpm-workspace",ecosystem:"npm",declaredIn:"pnpm-workspace.yaml",members:await ws(t,e,r,"npm","package.json",s)}}async function NN(t,e){let n=await e.readFile(He(t,"Cargo.toml"));if(!n)return null;let r=At(n),s=r.find(c=>c.header==="workspace");if(!s)return null;let i=ji(s.entries.get("members")??""),o=r.some(c=>c.header==="package"),a=o?pk(r.find(c=>c.header==="package")?.entries.get("name")??""):null;return{kind:"cargo-workspace",ecosystem:"cargo",declaredIn:"Cargo.toml",members:await ws(t,e,i,"cargo","Cargo.toml",a,!o)}}async function LN(t,e){let n=await e.readFile(He(t,"go.work"));if(!n)return null;let r=[],s=!1;for(let i of n.split(` +`)){let o=i.split("//")[0].trim();if(!o)continue;if(/^use\s*\($/.test(o)){s=!0;continue}if(s&&o===")"){s=!1;continue}let a=/^use\s+(\S+)$/.exec(o);a?r.push(a[1]):s&&r.push(o)}return{kind:"go-work",ecosystem:"go",declaredIn:"go.work",members:await ws(t,e,r,"go","go.mod",null,!0)}}async function GN(t,e){let n=await e.readFile(He(t,"pom.xml"));if(!n)return null;let r=/([\s\S]*?)<\/modules>/.exec(n);if(!r)return null;let s=[...r[1].matchAll(/\s*([^<]+?)\s*<\/module>/g)].map(o=>o[1]);if(s.length===0)return null;let i=/\s*([^<]+?)\s*<\/artifactId>/.exec(n)?.[1]??null;return{kind:"maven-modules",ecosystem:"maven",declaredIn:"pom.xml",members:await ws(t,e,s,"maven","pom.xml",i)}}async function FN(t,e){let n=await e.readFile(He(t,"settings.gradle.kts"))?"settings.gradle.kts":await e.readFile(He(t,"settings.gradle"))?"settings.gradle":null;if(!n)return null;let s=[...(await e.readFile(He(t,n))??"").matchAll(/include\s*\(?\s*((?:['"][^'"]+['"]\s*,?\s*)+)/g)].flatMap(i=>[...i[1].matchAll(/['"]([^'"]+)['"]/g)].map(o=>o[1])).map(i=>i.replace(/^:/,"").replace(/:/g,"/"));return s.length===0?null:{kind:"gradle-settings",ecosystem:"maven",declaredIn:n,members:await ws(t,e,s,"maven","build.gradle",null,!0)}}async function ws(t,e,n,r,s,i,o=!1){let a=new Set,c=new Set;for(let u of n){let d=u.trim();if(d.startsWith("!"))for(let p of await lk(t,e,d.slice(1),s))c.add(p);else for(let p of await lk(t,e,d,s))a.add(p)}for(let u of c)a.delete(u);let l=[];o||l.push({dir:"",name:i,ecosystem:r});for(let u of[...a].sort())u!==""&&l.push({dir:u,name:await jN(t,e,u,s,r),ecosystem:r});return l}async function lk(t,e,n,r){let s=n.replace(/^\.\//,"").replace(/\/+$/,"");if(s.startsWith("!"))return[];if(!s.includes("*"))return[s];let i=s.split("/"),o=i.findIndex(p=>p.includes("*")),a=i.slice(0,o).join("/"),c=i[o]==="**",l=i.slice(o+1).join("/"),u=[],d=async(p,f)=>{if(!(f>4))for(let m of await e.readDirectory(He(t,p))){if(m.startsWith(".")||m==="node_modules"||m==="target")continue;let g=p?`${p}/${m}`:m;if(!await e.isDirectory(He(t,g)))continue;let h=l?`${g}/${l}`:g;(!r||await e.readFile(He(t,h,r))!==null)&&u.push(h),c&&await d(g,f+1)}};return await d(a,0),u}async function jN(t,e,n,r,s){let i=await e.readFile(He(t,n,r));if(!i)return null;switch(s){case"npm":return Re(i)?.name??null;case"cargo":{let o=At(i).find(a=>a.header==="package");return pk(o?.entries.get("name")??"")||null}case"go":return/^\s*module\s+(\S+)/m.exec(i)?.[1]??null;case"maven":return/\s*([^<]+?)\s*<\/artifactId>/.exec(i)?.[1]??null;default:return null}}function pk(t){return t.trim().replace(/^["']|["']$/g,"")}function He(...t){return t.filter(Boolean).join("/")}var fk=require("node:path"),ap=(t,e,n)=>t==="dev"?[e]:t==="optional"?[n]:[],cp=[{id:"npm",ecosystem:"npm",label:"npm",manifests:["package.json"],lockfiles:["package-lock.json","npm-shrinkwrap.json"],outdated:{command:"npm",args:["outdated","--json"]},upgrade:({name:t,version:e,kind:n})=>({command:"npm",args:["install",`${t}@${e}`,...ap(n,"--save-dev","--save-optional")]})},{id:"pnpm",ecosystem:"npm",label:"pnpm",manifests:["package.json"],lockfiles:["pnpm-lock.yaml"],outdated:{command:"pnpm",args:["outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"pnpm",args:["add",`${t}@${e}`,...ap(n,"--save-dev","--save-optional")]})},{id:"yarn-berry",ecosystem:"npm",label:"Yarn (berry)",manifests:["package.json"],lockfiles:["yarn.lock"],outdated:null,upgrade:({name:t,version:e})=>({command:"yarn",args:["up",`${t}@${e}`]})},{id:"yarn",ecosystem:"npm",label:"Yarn (classic)",manifests:["package.json"],lockfiles:["yarn.lock"],outdated:{command:"yarn",args:["outdated","--json"]},upgrade:({name:t,version:e})=>({command:"yarn",args:["upgrade",`${t}@${e}`]})},{id:"bun",ecosystem:"npm",label:"Bun",manifests:["package.json"],lockfiles:["bun.lock","bun.lockb"],outdated:{command:"bun",args:["outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"bun",args:["add",`${t}@${e}`,...ap(n,"--dev","--optional")]})},{id:"uv",ecosystem:"pypi",label:"uv",manifests:["pyproject.toml"],lockfiles:["uv.lock"],outdated:{command:"uv",args:["pip","list","--outdated","--format","json"]},upgrade:({name:t,version:e,kind:n})=>({command:"uv",args:["add",`${t}==${e}`,...n==="dev"?["--dev"]:[]]})},{id:"poetry",ecosystem:"pypi",label:"Poetry",manifests:["pyproject.toml"],lockfiles:["poetry.lock"],outdated:{command:"poetry",args:["show","--outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"poetry",args:["add",`${t}==${e}`,...n==="dev"?["--group","dev"]:[]]})},{id:"pip",ecosystem:"pypi",label:"pip",manifests:["requirements.txt","pyproject.toml","setup.py"],lockfiles:[],outdated:{command:"pip",args:["list","--outdated","--format=json"]},upgrade:({name:t,version:e})=>({command:"pip",args:["install","--upgrade",`${t}==${e}`]}),rewriteManifest:(t,{name:e,version:n},r)=>(0,fk.basename)(r).toLowerCase().endsWith(".txt")?qN(t,e,n):UN(t,e,n)},{id:"go",ecosystem:"go",label:"Go modules",manifests:["go.mod"],lockfiles:["go.sum"],outdated:{command:"go",args:["list","-u","-m","all"]},upgrade:({name:t,version:e})=>({command:"go",args:["get",`${t}@${e.startsWith("v")?e:`v${e}`}`]})},{id:"cargo",ecosystem:"cargo",label:"Cargo",manifests:["Cargo.toml"],lockfiles:["Cargo.lock"],outdated:{command:"cargo",args:["update","--dry-run"]},upgrade:({name:t,version:e})=>({command:"cargo",args:["add",`${t}@=${e}`]})},{id:"bundler",ecosystem:"rubygems",label:"Bundler",manifests:["Gemfile"],lockfiles:["Gemfile.lock"],outdated:{command:"bundle",args:["outdated"]},upgrade:({name:t})=>({command:"bundle",args:["update",t,"--conservative"]}),rewriteManifest:(t,{name:e,version:n})=>BN(t,e,n)},{id:"maven",ecosystem:"maven",label:"Maven",manifests:["pom.xml"],lockfiles:[],outdated:{command:"mvn",args:["versions:display-dependency-updates"]},upgrade:({name:t,version:e})=>({command:"mvn",args:["versions:use-dep-version",`-Dincludes=${t}`,`-DdepVersion=${e}`,"-DforceVersion=true"]})},{id:"gradle",ecosystem:"maven",label:"Gradle",manifests:["gradle/libs.versions.toml","build.gradle","build.gradle.kts"],lockfiles:["gradle.lockfile"],outdated:{command:"gradle",args:["dependencyUpdates"]},upgrade:()=>null},{id:"sbt",ecosystem:"maven",label:"sbt",manifests:["build.sbt"],lockfiles:[],outdated:{command:"sbt",args:["dependencyUpdates"]},upgrade:()=>null},{id:"dotnet",ecosystem:"nuget",label:"NuGet",manifests:["Directory.Packages.props"],manifestPattern:/\.(cs|fs|vb)proj$/i,lockfiles:["packages.lock.json"],outdated:{command:"dotnet",args:["list","package","--outdated"]},upgrade:({name:t,version:e})=>({command:"dotnet",args:["add","package",t,"--version",e]})},{id:"composer",ecosystem:"packagist",label:"Composer",manifests:["composer.json"],lockfiles:["composer.lock"],outdated:{command:"composer",args:["outdated","--format=json"]},upgrade:({name:t,version:e,kind:n})=>({command:"composer",args:["require",`${t}:${e}`,...n==="dev"?["--dev"]:[]]})},{id:"mix",ecosystem:"hex",label:"Mix",manifests:["mix.exs"],lockfiles:["mix.lock"],outdated:{command:"mix",args:["hex.outdated"]},upgrade:({name:t})=>({command:"mix",args:["deps.update",t]}),rewriteManifest:(t,{name:e,version:n})=>VN(t,e,n)},{id:"rebar",ecosystem:"hex",label:"Rebar3",manifests:["rebar.config"],lockfiles:["rebar.lock"],outdated:null,upgrade:({name:t})=>({command:"rebar3",args:["upgrade",t]}),rewriteManifest:(t,{name:e,version:n})=>WN(t,e,n)},{id:"flutter",ecosystem:"pub",label:"Flutter",manifests:["pubspec.yaml"],lockfiles:["pubspec.lock"],outdated:{command:"flutter",args:["pub","outdated"]},upgrade:({name:t,version:e})=>({command:"flutter",args:["pub","add",`${t}:${e}`]})},{id:"dart",ecosystem:"pub",label:"Dart pub",manifests:["pubspec.yaml"],lockfiles:["pubspec.lock"],outdated:{command:"dart",args:["pub","outdated"]},upgrade:({name:t,version:e,kind:n})=>({command:"dart",args:["pub","add",...n==="dev"?["dev:"]:[],`${t}:${e}`]})},{id:"swiftpm",ecosystem:"swift",label:"Swift Package Manager",manifests:["Package.swift"],lockfiles:["Package.resolved"],outdated:null,upgrade:()=>null},{id:"cocoapods",ecosystem:"cocoapods",label:"CocoaPods",manifests:["Podfile"],lockfiles:["Podfile.lock"],outdated:{command:"pod",args:["outdated"]},upgrade:({name:t})=>({command:"pod",args:["update",t]}),rewriteManifest:(t,{name:e,version:n})=>zN(t,e,n)},{id:"opam",ecosystem:"opam",label:"opam",manifests:["dune-project"],manifestPattern:/\.opam$/,lockfiles:[],outdated:null,upgrade:({name:t,version:e})=>({command:"opam",args:["install",`${t}.${e}`,"--yes"]})},{id:"conan",ecosystem:"conan",label:"Conan",manifests:["conanfile.txt","conanfile.py"],lockfiles:["conan.lock"],outdated:null,upgrade:()=>({command:"conan",args:["install",".","--build=missing"]}),rewriteManifest:(t,{name:e,version:n})=>HN(t,e,n)},{id:"vcpkg",ecosystem:"vcpkg",label:"vcpkg",manifests:["vcpkg.json"],lockfiles:[],outdated:null,upgrade:()=>({command:"vcpkg",args:["install"]}),rewriteManifest:(t,{name:e,version:n})=>KN(t,e,n)},{id:"arduino-cli",ecosystem:"arduino",label:"Arduino CLI",manifests:["library.properties"],lockfiles:[],outdated:{command:"arduino-cli",args:["lib","upgrade","--dry-run"]},upgrade:({name:t,version:e})=>({command:"arduino-cli",args:["lib","install",`${t}@${e}`]}),rewriteManifest:(t,{name:e,version:n})=>JN(t,e,n)},{id:"platformio",ecosystem:"arduino",label:"PlatformIO",manifests:["platformio.ini"],lockfiles:[],outdated:{command:"pio",args:["pkg","outdated"]},upgrade:({name:t,version:e})=>({command:"pio",args:["pkg","install","--library",`${t}@${e}`]}),rewriteManifest:(t,{name:e,version:n})=>YN(t,e,n)}];function bn(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qN(t,e,n){let r=bn(e).replace(/[-_.]/g,"[-_.]"),s=new RegExp(`^([ \\t]*${r})(\\[[^\\]]*\\])?[ \\t]*(?:[=<>!~]=?\\s*[^\\s;#,]+(?:\\s*,\\s*[=<>!~]=?\\s*[^\\s;#,]+)*)?`,"im");return s.test(t)?t.replace(s,(i,o,a)=>`${o}${a??""}==${n}`):t}function UN(t,e,n){let r=bn(e).replace(/[-_.]/g,"[-_.]"),s=new RegExp(`(["'])${r}(\\[[^\\]]*\\])?(?:\\s*[=<>!~]=?\\s*[^"',;]+(?:\\s*,\\s*[=<>!~]=?\\s*[^"',;]+)*)?\\1`,"i");return s.test(t)?t.replace(s,(i,o,a)=>`${o}${e}${a??""}==${n}${o}`):t}function BN(t,e,n){let r=bn(e),s=new RegExp(`(gem\\s+["']${r}["'])\\s*,\\s*["'][^"']*["']`);if(s.test(t))return t.replace(s,`$1, '${n}'`);let i=new RegExp(`(gem\\s+["']${r}["'])(?!\\s*,\\s*["'])`);return t.replace(i,`$1, '${n}'`)}function VN(t,e,n){let r=bn(e),s=new RegExp(`(\\{\\s*:${r}\\s*,\\s*)"[^"]*"`);return s.test(t)?t.replace(s,`$1"== ${n}"`):t}function WN(t,e,n){let r=bn(e),s=new RegExp(`(\\{\\s*${r}\\s*,\\s*)"[^"]*"`);return s.test(t)?t.replace(s,`$1"${n}"`):t}function zN(t,e,n){let r=bn(e),s=new RegExp(`(pod\\s+["']${r}["'])\\s*,\\s*["'][^"']*["']`);if(s.test(t))return t.replace(s,`$1, '${n}'`);let i=new RegExp(`(pod\\s+["']${r}["'])(?!\\s*,\\s*["'])`);return t.replace(i,`$1, '${n}'`)}function HN(t,e,n){let r=bn(e),s=new RegExp(`\\b${r}/[^\\s"'#@]+`,"g");return t.replace(s,`${e}/${n}`)}function KN(t,e,n){let r;try{r=JSON.parse(t)}catch{return t}let s=Array.isArray(r.overrides)?r.overrides:[],i=s.find(o=>o.name===e);return i?i.version=n:s.push({name:e,version:n}),r.overrides=s,`${JSON.stringify(r,null,2)} +`}function JN(t,e,n){return t.split(` `).map(r=>{let s=/^(\s*depends\s*=\s*)(.*)$/i.exec(r);if(!s)return r;let i=s[2].split(",").map(o=>o.replace(/\s*\([^)]*\)\s*$/,"").trim()!==e?o:` ${e} (${n})`);return`${s[1]}${i.join(",").replace(/^\s+/,"")}`}).join(` -`)}function uN(t,e,n){let r=hn(e),s=new RegExp(`^(\\s*)((?:[\\w.-]+/)?${r})(@[^\\s;#]*)?\\s*$`,"gm");return t.replace(s,(i,o,a)=>/^\s+/.test(o)?`${o}${a}@${n}`:i)}var Ni=eN;var ps=require("node:fs/promises"),or=require("node:path");var jd=new Set([".git",".hg",".svn","node_modules","vendor","bower_components",".venv","venv","env","__pycache__",".tox","site-packages","target","build","dist","out",".next",".nuxt",".svelte-kit","coverage",".pytest_cache",".mypy_cache",".gradle",".idea",".vscode",".terraform","Pods","DerivedData",".pio","third_party","thirdparty","cmake-build-debug","cmake-build-release"]),dN=new Set(["package.json",".nvmrc",".node-version",".ruby-version",".python-version",".tool-versions","dockerfile","go.mod","pyproject.toml","setup.py","setup.cfg","runtime.txt",".ruby-gemset"]);function Fd(t){let e=(t.split("/").pop()??"").toLowerCase();return dN.has(e)||e.startsWith("dockerfile")?!0:/^\.github\/workflows\/.+\.ya?ml$/.test(t)||/^\.(gitlab-ci|circleci)/.test(t)}var pN={".ts":"typescript",".tsx":"typescript",".mts":"typescript",".cts":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".pyi":"python",".go":"go",".rs":"rust",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cxx":"cpp",".c++":"cpp",".hpp":"cpp",".hh":"cpp",".hxx":"cpp",".h++":"cpp",".inl":"cpp",".tpp":"cpp",".ino":"cpp",".pde":"cpp",".java":"java",".kt":"java",".kts":"java",".scala":"java",".rb":"ruby",".rake":"ruby",".cs":"dotnet",".fs":"dotnet",".vb":"dotnet",".php":"php",".ex":"elixir",".exs":"elixir",".erl":"erlang",".dart":"dart",".swift":"swift",".ml":"ocaml",".mli":"ocaml"};function Fv(t){let e=t.lastIndexOf(".");return e===-1?"other":pN[t.slice(e).toLowerCase()]??"other"}async function qv(t,e={}){let{maxFileBytes:n=512*1024,maxFiles:r=5e3,extraIgnores:s=[],members:i}=e,o=new Set([...jd,...s]),a=[],c=async l=>{if(a.length>=r)return;let u;try{u=await(0,ps.readdir)(l,{withFileTypes:!0})}catch{return}for(let d of u){if(a.length>=r)return;let p=(0,or.join)(l,d.name);if(d.isDirectory()){if(o.has(d.name)||d.name.startsWith(".")&&d.name!==".github"&&d.name!==".circleci")continue;await c(p);continue}if(!d.isFile())continue;let f=fN((0,or.relative)(t,p)),m=Fd(f)?"config":Fv(d.name);if(m!=="other"&&!(/\.min\.(js|ts)$/.test(d.name)||/\.d\.ts\.map$/.test(d.name)))try{if((await(0,ps.stat)(p)).size>n)continue;let h=await(0,ps.readFile)(p,"utf8");a.push({path:f,language:m,content:h,lineCount:mN(h),...i?{member:Nd(f,i)}:{}})}catch{continue}}};return await c(t),a.sort((l,u)=>l.path.localeCompare(u.path))}function fN(t){return or.sep==="/"?t:t.split(or.sep).join("/")}function mN(t){let e=1;for(let n=0;nt.manifests)),qd=new Map;for(let t of Ni)for(let e of t.manifests)qd.has(e)||qd.set(e,t.ecosystem);async function Uv(t,e,n=[],r=8){let s=new Set(n),i=[],o=async(a,c)=>{if(c>r)return;let l=await e.readDirectory(ec(t,a));if(l.length===0)return;let u=!1;if(a!==""&&!s.has(a)){u=l.includes(".git");let d=l.find(p=>gN.has(p));d&&i.push({dir:a,ecosystem:qd.get(d),manifestPath:ec(a,d),hasOwnGit:u})}if(!u)for(let d of l){if(jd.has(d)||d.startsWith(".")&&d!==".github")continue;let p=ec(a,d);s.has(p)||await e.isDirectory(ec(t,p))&&await o(p,c+1)}};return await o("",0),i}function ec(...t){return t.filter(Boolean).join("/")}var Bd=require("node:crypto"),fs=require("node:fs/promises"),zv=require("node:path"),hN=1e4,yN=1440*60*1e3,bN=6e4,wN="drift-bot/0.1 (+https://github.com/trydrift/drift)",Ud=new Map,Li=null;function Hv(t){let e=Ud.get(t);return e?Date.now()>=e.expiresAt?(Ud.delete(t),{hit:!1}):{hit:!0,value:e.value}:{hit:!1}}function yn(t,e){let n=e===null?Date.now()+bN:1/0;Ud.set(t,{value:e,expiresAt:n})}function Kv(t){if(!t)return"noauth";let e=Object.entries(t).filter(([r])=>/auth|token/i.test(r)).sort(([r],[s])=>r.localeCompare(s));if(e.length===0)return"noauth";let n=e.map(([r,s])=>`${r.toLowerCase()}=${s}`).join("&");return(0,Bd.createHash)("sha256").update(n).digest("hex").slice(0,16)}function Jv(){return Li}async function J(t,e={}){let n=`json:${Kv(e.headers)}:${t}`,r=Hv(n);if(r.hit)return r.value;let s=await fe(t,{...e,headers:{Accept:"application/json",...e.headers}});if(s===null)return yn(n,null),null;try{let i=JSON.parse(s);return yn(n,i),i}catch{return yn(n,null),null}}async function fe(t,e={}){let n=`text:${Kv(e.headers)}:${t}`,r=Hv(n);if(r.hit)return r.value;let{timeoutMs:s=hN,headers:i={},retries:o=2}=e,a=await vN(t),c=e.cacheTtlMs??yN,l=Date.now();if(a&&a.body!==null&&(a.immutable||e.immutable||l-a.fetchedAtp.abort(),s);try{let m=await fetch(t,{signal:p.signal,headers:{"User-Agent":wN,...u,...i},redirect:"follow"});if(m.status===304&&a)return await Bv(t,{...a,fetchedAt:l,immutable:a.immutable||e.immutable}),yn(n,a.body),a.body;if(m.ok){let h=await m.text();return yn(n,h),await Bv(t,{url:t,body:h,etag:m.headers.get("etag")??void 0,fetchedAt:l,immutable:e.immutable}),h}if(m.status===404||m.status===403||!(m.status===429||m.status>=500)||d===o)break;await Wv(Vv(d,m.headers.get("retry-after")))}catch{if(d===o)break;await Wv(Vv(d,null))}finally{clearTimeout(f)}}return yn(n,null),a?.body!==void 0?(yn(n,a.body),a.body):null}async function vN(t){if(!Li)return null;try{let e=await(0,fs.readFile)(Yv(t),"utf8"),n=JSON.parse(e);return n.url===t?n:null}catch{return null}}async function Bv(t,e){if(Li)try{await(0,fs.mkdir)(Li,{recursive:!0}),await(0,fs.writeFile)(Yv(t),JSON.stringify(e),"utf8")}catch{}}function Yv(t){let e=(0,Bd.createHash)("sha256").update(t).digest("hex");return(0,zv.join)(Li,`${e}.json`)}function Vv(t,e){if(e){let r=Number(e);if(Number.isFinite(r)&&r>0)return Math.min(r*1e3,3e4)}return 400*2**t+Math.random()*200}function Wv(t){return new Promise(e=>setTimeout(e,t))}async function bn(t,e,n){let r=new Array(t.length),s=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let o=s++;if(o>=t.length)return;r[o]=await n(t[o],o)}});return await Promise.all(i),r}var Xv=require("node:crypto");function we(t,...e){let n=(0,Xv.createHash)("sha256").update(e.map(r=>String(r??"")).join(" ")).digest("hex");return`${t}_${n.slice(0,10)}`}function ar(t){return t.workspace===void 0?t.name:`${t.workspace} ${t.name}`}function cr(t){return`${t.ecosystem} ${ar(t)}`}function Zv(t){let e=0,n=t.length;for(;ee&&t.charCodeAt(n-1)===45;)n--;return t.slice(e,n)}function Qv(t,e=40){let n=Zv(t.toLowerCase().replace(/[^a-z0-9]+/g,"-"));return Zv(n.slice(0,e))||"change"}var Ut=vt(os(),1);var kN=["CHANGELOG.md","CHANGELOG.markdown","CHANGELOG","CHANGES.md","HISTORY.md","NEWS.md","RELEASES.md","RELEASE-NOTES.md","RELEASE_NOTES.md","CHANGELOG.rst","CHANGES.rst","CHANGELOG.txt","docs/CHANGELOG.md","docs/changelog.md","changelog.md"],EN=["MIGRATING.md","MIGRATION.md","UPGRADING.md","UPGRADE.md","docs/migration.md","docs/migrating.md","docs/upgrading.md","docs/MIGRATION.md","docs/UPGRADE.md"];async function tk(t,e=["main","master"]){return nk(t,kN,e)}async function SN(t,e=["main","master"]){return nk(t,EN,e)}async function nk(t,e,n){for(let r of n)for(let s of e){let i=`https://raw.githubusercontent.com/${t}/${r}/${s}`,o=await fe(i,{retries:0});if(o&&o.trim())return{path:s,url:`https://github.com/${t}/blob/${r}/${s}`,content:o,branch:r}}return null}function _N(t){let e=[],n=new Set;for(let r of t.matchAll(/\[([^\]]+)\]\(([^)\s]+)\)/g)){let s=r[1],i=r[2];if(/^[a-z]+:/i.test(i)||i.startsWith("#")||!/\.(md|markdown|rst|txt)$/i.test(i))continue;let o=Vd(s)??Vd(i.replace(/[/\\]/g," "));if(!o)continue;let a=i.replace(/^\.?\//,"").split("#")[0];n.has(a)||(n.add(a),e.push({path:a,version:o}))}return e}async function rk(t,e,n,r={}){let{branches:s=["main","master"],maxDocuments:i=12}=r,o=await tk(t,s);if(!o)return[];if(zd(Wd(o.content),e,n).length>0)return[o];let a=_N(o.content).filter(u=>TN(u.version,e,n));if(a.length===0)return[o];let l=(await Promise.all([...a].sort((u,d)=>Ut.default.rcompare(u.version,d.version)).slice(0,i).map(async u=>{let d=await fe(`https://raw.githubusercontent.com/${t}/${o.branch}/${u.path}`,{retries:0});return!d||!d.trim()?null:{path:u.path,url:`https://github.com/${t}/blob/${o.branch}/${u.path}`,content:d,branch:o.branch}}))).filter(u=>u!==null);return l.length>0?l:[o]}async function sk(t,e=["main","master"]){let[n,r]=await Promise.all([SN(t,e),tk(t,e)]),s=n?[n]:[];if(!r)return s;let i=[...r.content.matchAll(/\[([^\]]+)\]\(([^)\s]+)\)/g)].filter(([,o,a])=>ek.test(o)||ek.test(a)).map(([,,o])=>o.replace(/^\.?\//,"").split("#")[0]).filter(o=>/\.(md|markdown|rst|txt)$/i.test(o)&&!/^[a-z]+:/i.test(o));for(let o of[...new Set(i)].slice(0,4)){if(s.some(c=>c.path===o))continue;let a=await fe(`https://raw.githubusercontent.com/${t}/${r.branch}/${o}`,{retries:0});!a||!a.trim()||s.push({path:o,url:`https://github.com/${t}/blob/${r.branch}/${o}`,content:a,branch:r.branch})}return s}var ek=/migrat|upgrad/i;function TN(t,e,n){let r=te(e),s=te(n),i=te(t);if(!r||!s||!i)return!1;let[o,a]=Ut.default.gt(s,r)?[r,s]:[s,r];return Ut.default.gt(i,o)&&Ut.default.lte(i,a)}function Wd(t){let e=[],n=t.split(` -`),r=null;for(let s=0;s/^\s+/.test(o)?`${o}${a}@${n}`:i)}function mk(t){return cp.find(e=>e.id===t)}var dr=cp;function gk(t){let e=new Set(t.entries),n=[];for(let s of cp){let i=s.lockfiles.filter(a=>e.has(a)),o=[...s.manifests.filter(a=>e.has(a)),...s.manifestPattern?t.entries.filter(a=>s.manifestPattern.test(a)):[]];i.length===0&&o.length===0||ZN(s,t,e)&&n.push({manager:s,evidence:[...i,...o],fromLockfile:i.length>0})}let r=new Set(n.filter(s=>s.fromLockfile).map(s=>s.manager.ecosystem));return n.filter(s=>s.fromLockfile||!r.has(s.manager.ecosystem))}function ZN(t,e,n){if(t.id==="yarn"||t.id==="yarn-berry"){let r=n.has(".yarnrc.yml")||(e.read?.("yarn.lock")??"").includes("__metadata");return t.id==="yarn-berry"?r:!r}if(t.id==="dart"||t.id==="flutter"){let r=e.read?.("pubspec.yaml")??"",s=/^\s*(flutter|flutter_test)\s*:/m.test(r)||/sdk:\s*flutter/.test(r);return t.id==="flutter"?s:!s}return!0}function hk(t){let e=new Map;for(let n of t){let r=e.get(n.manager.ecosystem)??[];r.push(n),e.set(n.manager.ecosystem,r)}return[...e.entries()].filter(([,n])=>n.length>1).map(([n,r])=>({ecosystem:n,candidates:r}))}function yk(t){return[t.command,...t.args].join(" ")}var vs=require("node:fs/promises"),pr=require("node:path");var lp=new Set([".git",".hg",".svn","node_modules","vendor","bower_components",".venv","venv","env","__pycache__",".tox","site-packages","target","build","dist","out",".next",".nuxt",".svelte-kit","coverage",".pytest_cache",".mypy_cache",".gradle",".idea",".vscode",".terraform","Pods","DerivedData",".pio","third_party","thirdparty","cmake-build-debug","cmake-build-release"]),XN=new Set(["package.json",".nvmrc",".node-version",".ruby-version",".python-version",".tool-versions","dockerfile","go.mod","pyproject.toml","setup.py","setup.cfg","runtime.txt",".ruby-gemset"]);function up(t){let e=(t.split("/").pop()??"").toLowerCase();return XN.has(e)||e.startsWith("dockerfile")?!0:/^\.github\/workflows\/.+\.ya?ml$/.test(t)||/^\.(gitlab-ci|circleci)/.test(t)}var QN={".ts":"typescript",".tsx":"typescript",".mts":"typescript",".cts":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".pyi":"python",".go":"go",".rs":"rust",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cxx":"cpp",".c++":"cpp",".hpp":"cpp",".hh":"cpp",".hxx":"cpp",".h++":"cpp",".inl":"cpp",".tpp":"cpp",".ino":"cpp",".pde":"cpp",".java":"java",".kt":"java",".kts":"java",".scala":"java",".rb":"ruby",".rake":"ruby",".cs":"dotnet",".fs":"dotnet",".vb":"dotnet",".php":"php",".ex":"elixir",".exs":"elixir",".erl":"erlang",".dart":"dart",".swift":"swift",".ml":"ocaml",".mli":"ocaml"};function bk(t){let e=t.lastIndexOf(".");return e===-1?"other":QN[t.slice(e).toLowerCase()]??"other"}async function fc(t,e={}){let{maxFileBytes:n=512*1024,maxFiles:r=5e3,extraIgnores:s=[],members:i}=e,o=new Set([...lp,...s]),a=[],c=async l=>{if(a.length>=r)return;let u;try{u=await(0,vs.readdir)(l,{withFileTypes:!0})}catch{return}for(let d of u){if(a.length>=r)return;let p=(0,pr.join)(l,d.name);if(d.isDirectory()){if(o.has(d.name)||d.name.startsWith(".")&&d.name!==".github"&&d.name!==".circleci")continue;await c(p);continue}if(!d.isFile())continue;let f=eL((0,pr.relative)(t,p)),m=up(f)?"config":bk(d.name);if(m!=="other"&&!(/\.min\.(js|ts)$/.test(d.name)||/\.d\.ts\.map$/.test(d.name)))try{if((await(0,vs.stat)(p)).size>n)continue;let h=await(0,vs.readFile)(p,"utf8");a.push({path:f,language:m,content:h,lineCount:tL(h),...i?{member:ip(f,i)}:{}})}catch{continue}}};return await c(t),a.sort((l,u)=>l.path.localeCompare(u.path))}function eL(t){return pr.sep==="/"?t:t.split(pr.sep).join("/")}function tL(t){let e=1;for(let n=0;nt.manifests)),dp=new Map;for(let t of dr)for(let e of t.manifests)dp.has(e)||dp.set(e,t.ecosystem);async function gc(t,e,n=[],r=8){let s=new Set(n),i=[],o=async(a,c)=>{if(c>r)return;let l=await e.readDirectory(mc(t,a));if(l.length===0)return;let u=!1;if(a!==""&&!s.has(a)){u=l.includes(".git");let d=l.find(p=>nL.has(p));d&&i.push({dir:a,ecosystem:dp.get(d),manifestPath:mc(a,d),hasOwnGit:u})}if(!u)for(let d of l){if(lp.has(d)||d.startsWith(".")&&d!==".github")continue;let p=mc(a,d);s.has(p)||await e.isDirectory(mc(t,p))&&await o(p,c+1)}};return await o("",0),i}function mc(...t){return t.filter(Boolean).join("/")}var fp=require("node:crypto"),ks=require("node:fs/promises"),Ek=require("node:path"),rL=1e4,sL=1440*60*1e3,iL=6e4,oL="drift-bot/0.1 (+https://github.com/trydrift/drift)",pp=new Map,Bi=null;function Sk(t){let e=pp.get(t);return e?Date.now()>=e.expiresAt?(pp.delete(t),{hit:!1}):{hit:!0,value:e.value}:{hit:!1}}function wn(t,e){let n=e===null?Date.now()+iL:1/0;pp.set(t,{value:e,expiresAt:n})}function xk(t){if(!t)return"noauth";let e=Object.entries(t).filter(([r])=>/auth|token/i.test(r)).sort(([r],[s])=>r.localeCompare(s));if(e.length===0)return"noauth";let n=e.map(([r,s])=>`${r.toLowerCase()}=${s}`).join("&");return(0,fp.createHash)("sha256").update(n).digest("hex").slice(0,16)}function Tk(){return Bi}async function H(t,e={}){let n=`json:${xk(e.headers)}:${t}`,r=Sk(n);if(r.hit)return r.value;let s=await ge(t,{...e,headers:{Accept:"application/json",...e.headers}});if(s===null)return wn(n,null),null;try{let i=JSON.parse(s);return wn(n,i),i}catch{return wn(n,null),null}}async function ge(t,e={}){let n=`text:${xk(e.headers)}:${t}`,r=Sk(n);if(r.hit)return r.value;let{timeoutMs:s=rL,headers:i={},retries:o=2}=e,a=await aL(t),c=e.cacheTtlMs??sL,l=Date.now();if(a&&a.body!==null&&(a.immutable||e.immutable||l-a.fetchedAtp.abort(),s);try{let m=await fetch(t,{signal:p.signal,headers:{"User-Agent":oL,...u,...i},redirect:"follow"});if(m.status===304&&a)return await wk(t,{...a,fetchedAt:l,immutable:a.immutable||e.immutable}),wn(n,a.body),a.body;if(m.ok){let h=await m.text();return wn(n,h),await wk(t,{url:t,body:h,etag:m.headers.get("etag")??void 0,fetchedAt:l,immutable:e.immutable}),h}if(m.status===404||m.status===403||!(m.status===429||m.status>=500)||d===o)break;await kk(vk(d,m.headers.get("retry-after")))}catch{if(d===o)break;await kk(vk(d,null))}finally{clearTimeout(f)}}return wn(n,null),a?.body!==void 0?(wn(n,a.body),a.body):null}async function aL(t){if(!Bi)return null;try{let e=await(0,ks.readFile)(_k(t),"utf8"),n=JSON.parse(e);return n.url===t?n:null}catch{return null}}async function wk(t,e){if(Bi)try{await(0,ks.mkdir)(Bi,{recursive:!0}),await(0,ks.writeFile)(_k(t),JSON.stringify(e),"utf8")}catch{}}function _k(t){let e=(0,fp.createHash)("sha256").update(t).digest("hex");return(0,Ek.join)(Bi,`${e}.json`)}function vk(t,e){if(e){let r=Number(e);if(Number.isFinite(r)&&r>0)return Math.min(r*1e3,3e4)}return 400*2**t+Math.random()*200}function kk(t){return new Promise(e=>setTimeout(e,t))}async function vn(t,e,n){let r=new Array(t.length),s=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let o=s++;if(o>=t.length)return;r[o]=await n(t[o],o)}});return await Promise.all(i),r}var Rk=require("node:crypto");function Ee(t,...e){let n=(0,Rk.createHash)("sha256").update(e.map(r=>String(r??"")).join(" ")).digest("hex");return`${t}_${n.slice(0,10)}`}function fr(t){return t.workspace===void 0?t.name:`${t.workspace} ${t.name}`}function bt(t){return`${t.ecosystem} ${fr(t)}`}function $k(t){let e=0,n=t.length;for(;ee&&t.charCodeAt(n-1)===45;)n--;return t.slice(e,n)}function Ck(t,e=40){let n=$k(t.toLowerCase().replace(/[^a-z0-9]+/g,"-"));return $k(n.slice(0,e))||"change"}var Vt=mt(ur(),1);var cL=["CHANGELOG.md","CHANGELOG.markdown","CHANGELOG","CHANGES.md","HISTORY.md","NEWS.md","RELEASES.md","RELEASE-NOTES.md","RELEASE_NOTES.md","CHANGELOG.rst","CHANGES.rst","CHANGELOG.txt","docs/CHANGELOG.md","docs/changelog.md","changelog.md"],lL=["MIGRATING.md","MIGRATION.md","UPGRADING.md","UPGRADE.md","docs/migration.md","docs/migrating.md","docs/upgrading.md","docs/MIGRATION.md","docs/UPGRADE.md"];async function Pk(t,e=["main","master"]){return Ik(t,cL,e)}async function uL(t,e=["main","master"]){return Ik(t,lL,e)}async function Ik(t,e,n){for(let r of n)for(let s of e){let i=`https://raw.githubusercontent.com/${t}/${r}/${s}`,o=await ge(i,{retries:0});if(o&&o.trim())return{path:s,url:`https://github.com/${t}/blob/${r}/${s}`,content:o,branch:r}}return null}function dL(t){let e=[],n=new Set;for(let r of t.matchAll(/\[([^\]]+)\]\(([^)\s]+)\)/g)){let s=r[1],i=r[2];if(/^[a-z]+:/i.test(i)||i.startsWith("#")||!/\.(md|markdown|rst|txt)$/i.test(i))continue;let o=mp(s)??mp(i.replace(/[/\\]/g," "));if(!o)continue;let a=i.replace(/^\.?\//,"").split("#")[0];n.has(a)||(n.add(a),e.push({path:a,version:o}))}return e}async function Ok(t,e,n,r={}){let{branches:s=["main","master"],maxDocuments:i=12}=r,o=await Pk(t,s);if(!o)return[];if(hp(gp(o.content),e,n).length>0)return[o];let a=dL(o.content).filter(u=>pL(u.version,e,n));if(a.length===0)return[o];let l=(await Promise.all([...a].sort((u,d)=>Vt.default.rcompare(u.version,d.version)).slice(0,i).map(async u=>{let d=await ge(`https://raw.githubusercontent.com/${t}/${o.branch}/${u.path}`,{retries:0});return!d||!d.trim()?null:{path:u.path,url:`https://github.com/${t}/blob/${o.branch}/${u.path}`,content:d,branch:o.branch}}))).filter(u=>u!==null);return l.length>0?l:[o]}async function Dk(t,e=["main","master"]){let[n,r]=await Promise.all([uL(t,e),Pk(t,e)]),s=n?[n]:[];if(!r)return s;let i=[...r.content.matchAll(/\[([^\]]+)\]\(([^)\s]+)\)/g)].filter(([,o,a])=>Ak.test(o)||Ak.test(a)).map(([,,o])=>o.replace(/^\.?\//,"").split("#")[0]).filter(o=>/\.(md|markdown|rst|txt)$/i.test(o)&&!/^[a-z]+:/i.test(o));for(let o of[...new Set(i)].slice(0,4)){if(s.some(c=>c.path===o))continue;let a=await ge(`https://raw.githubusercontent.com/${t}/${r.branch}/${o}`,{retries:0});!a||!a.trim()||s.push({path:o,url:`https://github.com/${t}/blob/${r.branch}/${o}`,content:a,branch:r.branch})}return s}var Ak=/migrat|upgrad/i;function pL(t,e,n){let r=te(e),s=te(n),i=te(t);if(!r||!s||!i)return!1;let[o,a]=Vt.default.gt(s,r)?[r,s]:[s,r];return Vt.default.gt(i,o)&&Vt.default.lte(i,a)}function gp(t){let e=[],n=t.split(` +`),r=null;for(let s=0;s{let c=te(a.version);return c!==null&&Ut.default.gt(c,i)&&Ut.default.lte(c,o)}).sort((a,c)=>Ut.default.rcompare(te(a.version),te(c.version)))}function Gi(t){let e=[],n=t.split(` -`),r=!1,s=0;for(let i of n){let o=/^(#{1,6})\s(.*)$/.exec(i);if(o){let c=o[1].length,l=o[2].trimStart();if(xN.test(l)){r=!0,s=c,e.push(i.trim());continue}r&&c<=s&&(r=!1)}let a=i.trim();if(a){if(r){e.push(a);continue}$N.test(a)&&e.push(a)}}return RN(e)}var xN=/breaking|incompatib|removed|migration|upgrade\s+guide|deprecat|pure esm|esm[\s-]only|commonjs/i,$N=/\b(BREAKING(\s+CHANGE)?|breaking change|no longer|has been removed|have been removed|was removed|were removed|is removed|renamed to|renamed from|replaced by|replaced with|now requires?|required\s+node|must now|dropped support|drop support|removed support|is now required|are now required|moved to|deprecated in favou?r of|pure ESM|ESM[\s-]only|now ESM|dropped CommonJS|no longer (?:supports|provides) CommonJS|minimum\s+(?:supported\s+)?(?:node|python|go|ruby|java|rust))\b/i;function RN(t){return[...new Set(t.map(e=>e.trim()).filter(Boolean))]}var ak=require("node:crypto"),ck=require("node:zlib"),ms=require("node:fs/promises"),Kd=require("node:path");var lk="https://downloads.arduino.cc/libraries/library_index.json.gz",AN=1440*60*1e3,CN=12e4,ik=null;async function PN(){return ik??=ON(),ik}async function tc(t){return(await PN())?.get(t.toLowerCase())??null}async function ON(){let t=await ok();if(t)return Hd(t);let e=await IN();if(!e){let r=await ok({ignoreAge:!0});return r?Hd(r):null}let n=DN(e);return await NN(n),Hd(n)}async function IN(){try{let t=await fetch(lk,{signal:AbortSignal.timeout(CN),headers:{"User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"}});if(!t.ok)return null;let e=Buffer.from(await t.arrayBuffer()),n=e[0]===31&&e[1]===139?(0,ck.gunzipSync)(e):e;return JSON.parse(n.toString("utf8"))}catch{return null}}function DN(t){let e=new Map;for(let n of t.libraries??[]){if(!n.name||!n.version)continue;let r=n.name.toLowerCase(),s=e.get(r);s||(s={name:n.name,versions:[],githubRepo:null,website:null,description:null,archives:{}},e.set(r,s)),s.versions.includes(n.version)||s.versions.push(n.version),n.url&&(s.archives[n.version]=n.url),s.githubRepo=MN(n.repository)??s.githubRepo,s.website=n.website??s.website,s.description=n.sentence??s.description}return[...e.values()]}function MN(t){if(!t)return null;let e=/github\.com[/:]([\w.-]+)\/([\w.-]+?)(?:\.git)?\/?$/.exec(t);return e?`${e[1]}/${e[2]}`:null}function Hd(t){return new Map(t.map(e=>[e.name.toLowerCase(),e]))}function uk(){let t=Jv();if(!t)return null;let e=(0,ak.createHash)("sha256").update(lk).digest("hex");return(0,Kd.join)(t,`arduino-index-${e.slice(0,16)}.json`)}async function ok(t={}){let e=uk();if(!e)return null;try{let n=JSON.parse(await(0,ms.readFile)(e,"utf8"));return!Array.isArray(n.libraries)||!t.ignoreAge&&Date.now()-n.fetchedAt>=AN?null:n.libraries}catch{return null}}async function NN(t){let e=uk();if(e)try{await(0,ms.mkdir)((0,Kd.join)(e,".."),{recursive:!0});let n={fetchedAt:Date.now(),libraries:[...t]};await(0,ms.writeFile)(e,JSON.stringify(n),"utf8")}catch{}}async function gs(t,e,n){switch(e){case"npm":return tL(t,n);case"pypi":return nL(t,n);case"cargo":return rL(t);case"go":return sL(t);case"maven":return aL(t);case"rubygems":return cL(t);case"nuget":return LN(t);case"packagist":return GN(t);case"hex":return jN(t);case"pub":return FN(t);case"swift":return qN(t);case"cocoapods":return UN(t);case"conan":return BN(t);case"vcpkg":return zN(t);case"arduino":return HN(t);case"opam":return null;default:return null}}async function LN(t){let e=t.toLowerCase(),[n,r]=await Promise.all([J(`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(e)}/index.json`),J(`https://api.nuget.org/v3/registration5-gz-semver2/${encodeURIComponent(e)}/index.json`)]);if(!n&&!r)return null;let s=(r?.items??[]).flatMap(o=>o.items??[]),i=s[s.length-1]?.catalogEntry;return{name:t,ecosystem:"nuget",githubRepo:me(i?.repository?.url??null)??me(i?.projectUrl??null),homepage:i?.projectUrl??`https://www.nuget.org/packages/${t}`,versions:n?.versions??[],deprecated:i?.deprecation?.message??null,description:i?.description??null}}async function GN(t){let n=(await J(`https://repo.packagist.org/p2/${t}.json`))?.packages?.[t];if(!n||n.length===0)return null;let r=n[0],s=r.abandoned,i=s===void 0||s===!1?null:typeof s=="string"?`This package is abandoned; the author suggests using ${s} instead.`:"This package is abandoned and is no longer maintained.";return{name:t,ecosystem:"packagist",githubRepo:me(r.source?.url??null)??me(r.homepage??null),homepage:r.homepage??`https://packagist.org/packages/${t}`,versions:n.map(o=>o.version).filter(o=>!!o),deprecated:i,description:r.description??null}}async function jN(t){let e=await J(`https://hex.pm/api/packages/${encodeURIComponent(t)}`);if(!e)return null;let n=e.meta?.links??{},r=Object.entries(n).map(([o,a])=>({key:o.toLowerCase(),value:a})),s=r.find(o=>o.key==="github")?.value??r.find(o=>o.key==="source")?.value,i=Object.values(e.retirements??{})[0];return{name:t,ecosystem:"hex",githubRepo:me(s??null)??r.map(o=>me(o.value)).find(Boolean)??null,homepage:e.html_url??`https://hex.pm/packages/${t}`,versions:(e.releases??[]).map(o=>o.version).filter(o=>!!o),deprecated:i?i.message??i.reason??"This release is retired.":null,description:e.meta?.description??null}}async function FN(t){let e=await J(`https://pub.dev/api/packages/${encodeURIComponent(t)}`);if(!e)return null;let n=e.latest?.pubspec,r=n?.repository??n?.homepage??n?.issue_tracker;return{name:t,ecosystem:"pub",githubRepo:me(r??null),homepage:n?.homepage??`https://pub.dev/packages/${t}`,versions:(e.versions??[]).map(s=>s.version).filter(s=>!!s),deprecated:e.latest?.retracted?"The latest version of this package has been retracted.":null,description:n?.description??null}}function qN(t){return/^[\w.-]+\/[\w.-]+$/.test(t)?{name:t,ecosystem:"swift",githubRepo:t,homepage:`https://github.com/${t}`,versions:[],deprecated:null,description:null}:null}async function UN(t){let e=await J(`https://trunk.cocoapods.org/api/v1/pods/${encodeURIComponent(t)}`);return e?{name:t,ecosystem:"cocoapods",githubRepo:null,homepage:`https://cocoapods.org/pods/${t}`,versions:(e.versions??[]).map(n=>n.name).filter(n=>!!n),deprecated:null,description:null}:null}async function BN(t){let e=`https://raw.githubusercontent.com/conan-io/conan-center-index/master/recipes/${encodeURIComponent(t)}`,n=await fe(`${e}/config.yml`);if(!n)return null;let{versions:r,folders:s}=VN(n);if(r.length===0)return null;let i=s[r[r.length-1]]??s[r[0]]??"all",o=await fe(`${e}/${i}/conandata.yml`);return{name:t,ecosystem:"conan",githubRepo:o?WN(o):null,homepage:`https://conan.io/center/recipes/${t}`,versions:r,deprecated:null,description:null}}function VN(t){let e=[],n={},r=!1,s=null;for(let i of t.split(` -`)){let o=i.split("#")[0].replace(/\s+$/,"");if(!o.trim())continue;if(/^versions\s*:/.test(o)){r=!0;continue}if(!/^\s/.test(o)){r=!1;continue}if(!r)continue;let a=/^\s{2,}["']?([^"':\s]+)["']?\s*:\s*$/.exec(o);if(a){s=a[1].trim(),s&&!e.includes(s)&&e.push(s);continue}let c=/^\s{4,}folder\s*:\s*["']?([^"'\s]+)["']?/.exec(o);c&&s&&(n[s]=c[1])}return{versions:e,folders:n}}function WN(t){for(let e of t.matchAll(/https?:\/\/github\.com\/[\w.-]+\/[\w.-]+/g)){let n=me(e[0]);if(n)return n}return null}async function zN(t){let e=t[0]?.toLowerCase();if(!e||!/[a-z0-9]/.test(e))return null;let[n,r]=await Promise.all([J(`https://raw.githubusercontent.com/microsoft/vcpkg/master/versions/${e}-/${encodeURIComponent(t)}.json`),J(`https://raw.githubusercontent.com/microsoft/vcpkg/master/ports/${encodeURIComponent(t)}/vcpkg.json`)]);if(!n)return null;let s=[];for(let o of n.versions??[]){let a=o.version??o["version-semver"]??o["version-string"]??o["version-date"];a&&!s.includes(a)&&s.push(a)}if(s.length===0)return null;let i=Array.isArray(r?.description)?r.description.join(" "):r?.description??null;return{name:t,ecosystem:"vcpkg",githubRepo:me(r?.homepage??null),homepage:r?.homepage??`https://vcpkg.io/en/package/${t}`,versions:s,deprecated:null,description:i}}async function HN(t){let e=await tc(t);if(e)return{name:e.name,ecosystem:"arduino",githubRepo:e.githubRepo,homepage:e.website??`https://www.arduino.cc/reference/en/libraries/${JN(t)}/`,versions:e.versions,deprecated:null,description:e.description};let n=await KN(t);return n?{name:n.name??t,ecosystem:"arduino",githubRepo:me(n.repository_url??null),homepage:n.homepage??null,versions:n.version?.name?[n.version.name]:[],deprecated:null,description:n.description??null}:null}async function KN(t){let n=((await J(`https://api.registry.platformio.org/v3/search?query=${encodeURIComponent(t)}`))?.items??[]).find(r=>r.name?.toLowerCase()===t.toLowerCase()&&r.owner?.username);return n?J(`https://api.registry.platformio.org/v3/packages/${encodeURIComponent(n.owner.username)}/library/${encodeURIComponent(n.name)}`):null}function JN(t){return t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}async function ji(t,e,n){switch(e){case"npm":return YN(t,n);case"pypi":return ZN(t,n);case"go":return XN(t,n);case"cargo":return eL(t,n);default:return null}}function nc(t){return{version:t,license:null,releasedAt:null,runtime:null,dependencies:[],withdrawn:null}}async function YN(t,e){let n=await J(`https://registry.npmjs.org/${encodeURIComponent(t).replaceAll("%40","@")}`),r=n?.versions?.[e];if(!r)return null;let s=r.engines?.node;return{...nc(e),license:typeof r.license=="string"?r.license:r.license?.type??null,releasedAt:n?.time?.[e]??null,runtime:s?{name:"Node.js",requirement:s}:null,dependencies:Object.keys(r.dependencies??{}),withdrawn:r.deprecated??null}}async function ZN(t,e){let n=await J(`https://pypi.org/pypi/${encodeURIComponent(t)}/${encodeURIComponent(e)}/json`,{immutable:!0});if(!n?.info)return null;let r=n.info.requires_python;return{...nc(e),license:n.info.license||null,releasedAt:n.urls?.[0]?.upload_time_iso_8601??null,runtime:r?{name:"Python",requirement:r}:null,dependencies:(n.info.requires_dist??[]).map(s=>/^\s*([A-Za-z0-9._-]+)/.exec(s)?.[1]).filter(s=>!!s),withdrawn:n.info.yanked?`Release yanked: ${n.info.yanked_reason??"no reason given"}`:null}}async function XN(t,e){let n=e.startsWith("v")?e:`v${e}`,r=`https://proxy.golang.org/${encodeURI(t.toLowerCase())}/@v/${encodeURIComponent(n)}`,[s,i]=await Promise.all([fe(`${r}.mod`,{immutable:!0}),J(`${r}.info`,{immutable:!0})]);if(!s&&!i)return null;let o=s?/^\s*go\s+(\d+\.\d+(?:\.\d+)?)/m.exec(s)?.[1]:null;return{...nc(n),releasedAt:i?.Time??null,runtime:o?{name:"Go",requirement:`>=${o}`}:null,withdrawn:s?QN(s,n):null}}function QN(t,e){let n=e.replace(/^v/,"");for(let s of t.matchAll(/^\s*retract\s+(.+)$/gm)){let i=s[1].trim(),o=/\/\/\s*(.+)$/.exec(i)?.[1]?.trim(),a=o?`Retracted by the maintainer: ${o}`:"Retracted by the maintainer.",c=/^v?([\w.+-]+)/.exec(i.replace(/\/\/.*$/,"").trim())?.[1];if(c&&c===n)return a;let l=/\[\s*v?([\w.+-]+)\s*,\s*v?([\w.+-]+)\s*\]/.exec(i);if(l&&dk(n,l[1],l[2]))return a}let r=/^\s*retract\s*\(([\s\S]*?)^\s*\)/m.exec(t)?.[1];if(r)for(let s of r.split(` -`)){let i=s.replace(/\/\/.*$/,"").trim();if(!i)continue;let o=/\/\/\s*(.+)$/.exec(s)?.[1]?.trim(),a=o?`Retracted by the maintainer: ${o}`:"Retracted by the maintainer.";if(/^v?([\w.+-]+)$/.exec(i)?.[1]===n)return a;let c=/\[\s*v?([\w.+-]+)\s*,\s*v?([\w.+-]+)\s*\]/.exec(i);if(c&&dk(n,c[1],c[2]))return a}return null}function dk(t,e,n){return pk(t,e)>=0&&pk(t,n)<=0}function pk(t,e){let n=t.split(/[.+-]/).map(s=>Number.parseInt(s,10)),r=e.split(/[.+-]/).map(s=>Number.parseInt(s,10));for(let s=0;s=${r}`}:null,withdrawn:n.version.yanked?"This release was yanked from crates.io.":null}}async function gk(t,e){let n={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"};e&&(n.Authorization=`Bearer ${e}`);let r=await J(`https://api.github.com/repos/${t}`,{headers:n});if(!r)return null;let s=r.license?.spdx_id;return{archived:r.archived===!0,pushedAt:r.pushed_at??null,license:s&&s!=="NOASSERTION"?s:null,url:r.html_url??`https://github.com/${t}`}}async function tL(t,e){let n=await J(`https://registry.npmjs.org/${encodeURIComponent(t).replaceAll("%40","@")}`);if(!n)return null;let r=Object.keys(n.versions??{}),s=e?n.versions?.[e]:void 0;return{name:t,ecosystem:"npm",githubRepo:me(fk(n.repository))??me(fk(s?.repository))??me(n.homepage),homepage:n.homepage??null,versions:r,deprecated:s?.deprecated??null,description:n.description??null}}async function nL(t,e){let n=await J(`https://pypi.org/pypi/${encodeURIComponent(t)}/json`);if(!n)return null;let i=[...Object.values(n.info?.project_urls??{}),n.info?.home_page??""].map(me).find(c=>c!==null)??null,a=(e?n.releases?.[e]??[]:[]).find(c=>c.yanked);return{name:t,ecosystem:"pypi",githubRepo:i,homepage:n.info?.home_page??null,versions:Object.keys(n.releases??{}),deprecated:a?`Release yanked: ${a.yanked_reason??"no reason given"}`:null,description:n.info?.summary??null}}async function rL(t){let e=await J(`https://crates.io/api/v1/crates/${encodeURIComponent(t)}`);return e?{name:t,ecosystem:"cargo",githubRepo:me(e.crate?.repository)??me(e.crate?.homepage),homepage:e.crate?.homepage??null,versions:(e.versions??[]).map(n=>n.num),deprecated:null,description:e.crate?.description??null}:null}async function sL(t){let e=await fe(`https://proxy.golang.org/${encodeURI(t.toLowerCase())}/@v/list`);return{name:t,ecosystem:"go",githubRepo:oL(t),homepage:`https://pkg.go.dev/${t}`,versions:e?e.split(` -`).map(n=>n.trim()).filter(Boolean):[],deprecated:null,description:null}}var iL={grpc:"grpc/grpc-go",protobuf:"protocolbuffers/protobuf-go",api:"googleapis/google-api-go-client",genproto:"googleapis/go-genproto",appengine:"golang/appengine"};function oL(t){let e=t.replace(/\/v[2-9]\d*$/,""),n=[[/^golang\.org\/x\/([\w.-]+)/,r=>`golang/${r[1]}`],[/^google\.golang\.org\/(\w+)/,r=>iL[r[1]]??`googleapis/go-${r[1]}`],[/^go\.uber\.org\/([\w.-]+)/,r=>`uber-go/${r[1]}`],[/^sigs\.k8s\.io\/([\w.-]+)/,r=>`kubernetes-sigs/${r[1]}`],[/^k8s\.io\/([\w.-]+)/,r=>`kubernetes/${r[1]}`],[/^gopkg\.in\/([\w.-]+)\/([\w.-]+?)\.v\d+$/,r=>`${r[1]}/${r[2]}`],[/^gopkg\.in\/([\w.-]+?)\.v\d+$/,r=>`go-${r[1]}/${r[1]}`]];for(let[r,s]of n){let i=r.exec(e);if(i)return s(i)}return me(`https://${e}`)}async function aL(t){let[e,n]=t.split(":");if(!e||!n)return null;let r=await J(`https://search.maven.org/solrsearch/select?q=g:%22${encodeURIComponent(e)}%22+AND+a:%22${encodeURIComponent(n)}%22&core=gav&rows=100&wt=json`);return{name:t,ecosystem:"maven",githubRepo:null,homepage:`https://central.sonatype.com/artifact/${e}/${n}`,versions:(r?.response?.docs??[]).map(s=>s.v),deprecated:null,description:null}}async function cL(t){let e=await J(`https://rubygems.org/api/v1/gems/${encodeURIComponent(t)}.json`);if(!e)return null;let n=await J(`https://rubygems.org/api/v1/versions/${encodeURIComponent(t)}.json`);return{name:t,ecosystem:"rubygems",githubRepo:me(e.source_code_uri)??me(e.homepage_uri)??me(e.changelog_uri),homepage:e.homepage_uri??null,versions:(n??[]).map(r=>r.number),deprecated:null,description:e.info??null}}function fk(t){if(t)return typeof t=="string"?t:t.url}function me(t){if(!t)return null;let e=/^github:([\w.-]+)\/([\w.-]+)$/.exec(t.trim());if(e)return`${e[1]}/${mk(e[2])}`;let n=/github\.com[/:]([\w.-]+)\/([\w.-]+)/.exec(t);if(!n)return null;let r=n[1],s=mk(n[2]);return!r||!s||r==="sponsors"?null:`${r}/${s}`}function mk(t){return t.replace(/\.git$/,"")}var wn=vt(os(),1);async function hk(t,e,n,r={}){let{token:s,maxReleases:i=25}=r,o={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"};s&&(o.Authorization=`Bearer ${s}`);let a=te(e),c=te(n);if(!a||!c)return[];let[l,u]=wn.default.gt(c,a)?[a,c]:[c,a],d=[],p=100,f=5;for(let m=1;m<=f;m++){let g=await J(`https://api.github.com/repos/${t}/releases?per_page=${p}&page=${m}`,{headers:o});if(!g||g.length===0)break;let h=!1;for(let y of g){if(y.draft)continue;let w=te(y.tag_name);if(w){if(wn.default.lte(w,l)){h=!0;continue}wn.default.gt(w,u)||d.push({tag:y.tag_name,version:w,name:y.name,body:y.body??"",url:y.html_url,publishedAt:y.published_at})}}if(h||g.lengthwn.default.rcompare(i.version,o.version));if(n.length<=e)return n;let r=n.filter(i=>{let o=wn.default.parse(i.version);return o!==null&&o.patch===0&&!o.prerelease.length}).sort((i,o)=>wn.default.compare(i.version,o.version)),s=new Map;for(let i of r){if(s.size>=e)break;s.set(i.version,i)}for(let i of n){if(s.size>=e)break;s.set(i.version,i)}return[...s.values()].sort((i,o)=>wn.default.rcompare(i.version,o.version))}var kk=vt(vi(),1),uL=["get","put","post","delete","options","head","patch","trace"];function rc(t){let e;try{e=t.trim().startsWith("{")?JSON.parse(t):(0,kk.parse)(t)}catch{return null}if(!e||typeof e!="object")return null;let n=e;return!n.openapi&&!n.swagger?null:n}function Ek(t,e){let n=rc(t),r=rc(e);if(!n||!r)return[];let s=[],i=n.paths??{},o=r.paths??{};for(let[a,c]of Object.entries(i)){let l=o[a];if(!l){s.push({kind:"path-removed",location:a,pointer:`#/paths/${vk(a)}`,detail:`Path \`${a}\` no longer exists. Every request to it will 404.`});continue}for(let u of uL){let d=c[u];if(!d)continue;let p=l[u],f=`${u.toUpperCase()} ${a}`,m=`#/paths/${vk(a)}/${u}`;if(!p){s.push({kind:"operation-removed",location:f,pointer:m,detail:`Operation \`${f}\` was removed.`});continue}dL(d,p,n,r,f,m,s),pL(d,p,n,r,f,m,s),fL(d,p,n,r,f,m,s),mL(d,p,f,m,s)}}return s}function dL(t,e,n,r,s,i,o){let a=yk(t.parameters,n),c=yk(e.parameters,r);for(let[l,u]of a){let d=c.get(l);if(!d){u.required&&o.push({kind:"parameter-removed",location:s,pointer:`${i}/parameters/${l}`,detail:`Required parameter \`${u.name}\` (in: ${u.in}) was removed.`});continue}!u.required&&d.required&&o.push({kind:"parameter-now-required",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` (in: ${d.in}) is now required. Calls omitting it will be rejected.`});let p=ic(u.schema??{type:u.type}),f=ic(d.schema??{type:d.type});p&&f&&p!==f&&o.push({kind:"parameter-type-changed",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` changed type from \`${p}\` to \`${f}\`.`});let m=oc(u.schema),g=oc(d.schema),h=m.filter(y=>!g.includes(y));m.length&&g.length&&h.length&&o.push({kind:"request-enum-narrowed",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` no longer accepts: ${h.map(y=>`\`${y}\``).join(", ")}.`})}}function pL(t,e,n,r,s,i,o){let a=vn(bk(t),n),c=vn(bk(e),r);if(!a||!c)return;let l=new Set(wk(a)),u=wk(c);for(let d of u)l.has(d)||o.push({kind:"request-field-now-required",location:s,pointer:`${i}/requestBody/${d}`,detail:`Request body field \`${d}\` is now required.`});for(let[d,p,f]of Sk(a,c,n,r))o.push({kind:"request-field-type-changed",location:s,pointer:`${i}/requestBody/${d}`,detail:`Request body field \`${d}\` changed type from \`${p}\` to \`${f}\`.`})}function fL(t,e,n,r,s,i,o){let a=t.responses??{},c=e.responses??{};for(let[l,u]of Object.entries(a)){if(!/^2\d\d$/.test(l))continue;let d=c[l];if(!d){o.push({kind:"response-status-removed",location:s,pointer:`${i}/responses/${l}`,detail:`Success response \`${l}\` was removed from \`${s}\`.`});continue}let p=vn(Jd(u),n),f=vn(Jd(d),r);if(!p||!f)continue;let m=sc(p),g=sc(f);for(let h of Object.keys(m))h in g||o.push({kind:"response-field-removed",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` is no longer returned by \`${s}\`.`});for(let[h,y,w]of Sk(p,f,n,r))o.push({kind:"response-field-type-changed",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` changed type from \`${y}\` to \`${w}\`.`});for(let[h,y]of Object.entries(m)){let w=g[h];if(!w)continue;let S=oc(y),k=oc(w).filter($=>!S.includes($));S.length&&k.length&&o.push({kind:"response-enum-widened",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` can now return new values: ${k.map($=>`\`${$}\``).join(", ")}. Exhaustive handling of this field must be updated.`})}}}function mL(t,e,n,r,s){let i=t.security??[],o=e.security??[],a=i.length===0||i.some(l=>Object.keys(l).length===0),c=o.length===0||o.some(l=>Object.keys(l).length===0);if(a&&!c&&o.length>0){let l=[...new Set(o.flatMap(u=>Object.keys(u)))];s.push({kind:"security-added",location:n,pointer:`${r}/security`,detail:`\`${n}\` now requires authentication (${l.join(", ")}).`})}}function yk(t,e){let n=new Map;if(!Array.isArray(t))return n;for(let r of t){let s=vn(r,e);s?.name&&n.set(`${s.in??"query"}:${s.name}`,s)}return n}function bk(t){let e=t.requestBody;return e?Jd(e):null}function Jd(t){let e=t.content;if(!e)return t.schema??null;let n=Object.keys(e).find(r=>r.includes("json"))??Object.keys(e)[0];return n?e[n]?.schema??null:null}function vn(t,e,n=0){if(!t)return null;if(n>10)return t;let r=t.$ref;if(typeof r!="string")return t;if(!r.startsWith("#/"))return null;let s=r.slice(2).split("/").map(gL),i=e;for(let o of s){if(!i||typeof i!="object")return null;i=i[o]}return!i||typeof i!="object"?null:vn(i,e,n+1)}function sc(t){let e=t.properties??{},n=t.allOf;if(!Array.isArray(n))return e;let r={...e};for(let s of n)s&&typeof s=="object"&&Object.assign(r,s.properties??{});return r}function wk(t){let e=Array.isArray(t.required)?t.required:[],r=(Array.isArray(t.allOf)?t.allOf:[]).flatMap(s=>{let i=s?.required;return Array.isArray(i)?i:[]});return[...new Set([...e,...r])]}function Sk(t,e,n,r){let s=[],i=sc(t),o=sc(e);for(let[a,c]of Object.entries(i)){let l=o[a];if(!l)continue;let u=ic(vn(c,n)),d=ic(vn(l,r));u&&d&&u!==d&&s.push([a,u,d])}return s}function ic(t){if(!t)return null;let e=t.type;if(typeof e=="string"){if(e==="array"){let n=t.items;return`array<${typeof n?.type=="string"?n.type:"unknown"}>`}return e}return Array.isArray(e)?e.join("|"):null}function oc(t){let e=t?.enum;return Array.isArray(e)?e.map(n=>String(n)):[]}function vk(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}function gL(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}var hL="https://data.jsdelivr.com/v1/packages/npm",cc="https://cdn.jsdelivr.net/npm";async function lc(t,e,n={}){let r=await yL(t,e),s=await TL(t,e,r);if(!r&&!s)throw new Fi(t,e);if(!s)return null;let i=await AL(t,e,s);if(i.length===0)return null;let o=new Map,a=[];for(let u of i)OL(u.content,u.path,o,a);DL(o,a);let c=o.size,l=!r||n.followDependencies===!1?[]:await wL(r,i,o);return o.size>0?{api:o,entryPath:s,viaDependencies:l,ownSymbols:c,subpaths:_L(r?.exports)}:null}var Fi=class extends Error{constructor(n,r){super(`${n}@${r} could not be fetched`);this.packageName=n;this.version=r;this.name="VersionUnavailableError"}packageName;version};function yL(t,e){return J(`${cc}/${t}@${e}/package.json`)}var bL=8;async function wL(t,e,n){let r={...t?.dependencies,...t?.peerDependencies};if(Object.keys(r).length===0)return[];let s=vL(e,n),i=[];for(let[o,a]of s){if(i.length>=bL)break;let c=r[o];if(!c)continue;let l=await SL(o,c);if(!l)continue;let u=await lc(o,l,{followDependencies:!1}).catch(()=>null);if(!u)continue;let d=0;for(let[p,f]of a.names(u.api)){let m=u.api.get(f);if(!m)continue;let g=a.reExported.has(p)?p:`${o}#${p}`;n.has(g)||(n.set(g,{...ep(m,p),via:o}),d+=1)}d>0&&i.push(`${o}@${l}`)}return i}function vL(t,e){let n=new Map,r=o=>{let a=n.get(o);if(a)return a;let c={named:new Map,star:!1,reExported:new Set,names(l){if(!this.star)return[...this.named];let u=[...l.keys()].map(d=>[d,d]);return[...this.named,...u.filter(([d])=>!this.named.has(d))]}};return n.set(o,c),c},s=[...e.values()].map(o=>o.signature).join(` -`),i=o=>new RegExp(`\\b${uc(o)}\\b`).test(s);for(let o of t)for(let a of kL(o.content)){if(EL(a.specifier))continue;let c=r(a.specifier);if(a.kind==="export"&&a.star){c.star=!0;continue}for(let l of a.bindings)a.kind==="export"?(c.named.set(l.local,l.imported),c.reExported.add(l.local)):i(l.local)&&c.named.set(l.imported,l.imported)}return n}function kL(t){let e=[],n=/\b(import|export)\s+(?:type\s+)?(?:(\*(?:\s+as\s+\w+)?)|(\{[^}]*\})|(\w+))\s+from\s+['"]([^'"]+)['"]/g;for(let r of t.matchAll(n)){let[,s="",i,o,a,c=""]=r,l=s==="export"?"export":"import";if(i){e.push({kind:l,specifier:c,star:!0,bindings:[]});continue}if(a){e.push({kind:l,specifier:c,star:!1,bindings:[{imported:"default",local:a}]});continue}let u=[];for(let d of(o??"").replace(/[{}]/g,"").split(",")){let p=d.replace(/\btype\s+/g,"").trim();if(!p)continue;let[f,m]=p.split(/\s+as\s+/).map(g=>g.trim());f&&u.push({imported:f,local:m||f})}u.length>0&&e.push({kind:l,specifier:c,star:!1,bindings:u})}return e}function EL(t){return t.startsWith(".")||t.startsWith("/")}async function SL(t,e){return(await J(`${hL}/${t}/resolved?specifier=${encodeURIComponent(e)}`))?.version??null}function _L(t){return!t||typeof t!="object"?[]:Object.keys(t).filter(e=>e.startsWith("./")&&!e.endsWith("package.json")).slice(0,20)}async function TL(t,e,n){if(n){let s=n.types??n.typings??RL(n.exports);if(s){for(let i of $L(Xd(s)))if(await ac(t,e,i))return i}if(n.main){let i=Xd(n.main).replace(/\.(c|m)?js$/,".d.ts");if(await ac(t,e,i))return i}}for(let s of xL(t))if(await ac(t,e,s))return s;let r=t.startsWith("@")?`@types/${t.slice(1).replace("/","__")}`:`@types/${t}`;return await ac(r,"latest","index.d.ts")?`@types:${r}`:null}function xL(t){return["index.d.ts","dist/index.d.ts","lib/index.d.ts","types/index.d.ts",`types/${t.split("/").pop()?.replace(/^@/,"")||t}.d.ts`]}function $L(t){if(/\.d\.(c|m)?ts$/.test(t))return[t,t.replace(/\.d\.(c|m)?ts$/,".d.ts")];let e=t.replace(/\.(c|m)?[jt]s$/,"").replace(/\/$/,"");return[`${e}.d.ts`,`${e}.d.cts`,`${e}.d.mts`,`${e}/index.d.ts`,t]}function RL(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return null;let e=(n,r)=>{if(r>6||!n)return null;if(typeof n=="string")return r>0?n:null;if(typeof n!="object")return null;let s=n,i=s.types??s.typings;if(typeof i=="string")return i;let o=[".","import","require","default","node"];for(let a of[...o,...Object.keys(s)]){if(!(a in s))continue;let c=e(s[a],r+1);if(c)return c}return null};return e(t,0)}async function AL(t,e,n){if(n.startsWith("@types:")){let a=n.slice(7),c=await fe(`${cc}/${a}@latest/index.d.ts`);return c?[{path:"index.d.ts",content:c}]:[]}let r=25,s=[],i=new Set,o=[[n]];for(;o.length>0&&s.length!i.has(l));if(a.length===0)continue;let c=null;for(let l of a){i.add(l);let u=await fe(`${cc}/${t}@${e}/${l}`,{retries:0});if(u){c={path:l,content:u};break}}if(c){s.push(c);for(let l of CL(c.content))o.push(PL(c.path,l))}}return s}function CL(t){let e=new Set,n=/\bexport\s+(?:type\s+)?(?:\*(?:\s+as\s+\w+)?|\{[^}]*\})\s+from\s+['"](\.[^'"]+)['"]/g;for(let r of t.matchAll(n))e.add(r[1]);return[...e]}function PL(t,e){let n=t.includes("/")?t.slice(0,t.lastIndexOf("/")):"",s=Xd(n?`${n}/${e}`:e).replace(/\.(d\.(c|m)?ts|(c|m)?js|(c|m)?ts)$/,"");return[`${s}.d.ts`,`${s}.d.cts`,`${s}.d.mts`,`${s}/index.d.ts`,`${s}/index.d.cts`]}function Xd(t){let e=[];for(let n of t.replace(/^\.\//,"").split("/"))!n||n==="."||(n===".."?e.pop():e.push(n));return e.join("/")}async function ac(t,e,n){return await fe(`${cc}/${t}@${e}/${n}`,{retries:0})!==null}function OL(t,e,n=new Map,r=[]){let s=new Map,i=(o,a)=>{let c=o.get(a.name);c&&c.kind===a.kind?(c.signature=`${c.signature} | ${a.signature}`,c.members=[...new Set([...c.members,...a.members])],c.requiredMembers=[...new Set([...c.requiredMembers,...a.requiredMembers])]):c||o.set(a.name,a)};for(let o of NL(t))i(s,o.entry),o.exported&&i(n,o.entry);return IL(t,s,n,r),ML(t,s,n),n}function IL(t,e,n,r){let s=/\bexport\s+(?:type\s+)?\{([^}]+)\}(?:\s+from\s+['"][^'"]+['"])?\s*;/g;for(let i of t.matchAll(s))for(let{exported:o,local:a}of jL(i[1]??"")){if(n.has(o))continue;let c=e.get(a);c?n.set(o,ep(c,o)):r.push({exported:o,local:a})}}function DL(t,e){for(let n of e){if(t.has(n.exported))continue;let r=t.get(n.local);r&&t.set(n.exported,ep(r,n.exported))}}function ML(t,e,n){for(let r of t.matchAll(/\bexport\s*=\s*([A-Za-z_$][\w$]*)\s*;/g)){let s=r[1];for(let i of e.values())i.name!==s&&!i.name.startsWith(`${s}.`)||n.has(i.name)||n.set(i.name,i)}}function ep(t,e){return{...t,name:e,signature:t.signature.replace(new RegExp(`\\b${uc(t.name)}\\b`,"g"),e)}}function uc(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tp(t){return t.replace(/\/\*(?:[^*]|\*(?!\/))*\*\//g,"").replace(/\/\/[^\n]*/g,"").replace(/\s+/g," ").trim()}function NL(t){let e=[];return Yd(t,/\b(export\s+)?(?:declare\s+)?function\s+([A-Za-z_$][\w$]*)(?:<[^>{}]*>)?\s*\(/g,"function",e),Yd(t,/\b(export\s+)?(?:declare\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\b/g,"variable",e),Yd(t,/\b(export\s+)?(?:declare\s+)?type\s+([A-Za-z_$][\w$]*)\b/g,"type",e),Zd(t,/\b(export\s+)?(?:declare\s+)?class\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"class",e),Zd(t,/\b(export\s+)?(?:declare\s+)?interface\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"interface",e),Zd(t,/\b(export\s+)?(?:declare\s+)?enum\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"enum",e),Tk(t,"",!1,e),e}function Tk(t,e,n,r){let s=/\b(export\s+)?(?:declare\s+)?(?:namespace|module)\s+([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\{/g;for(let i=s.exec(t);i;i=s.exec(t)){let o=t.indexOf("{",i.index),a=lr(t,o);if(o<0||a<0)continue;let c=n||!!i[1],l=e?`${e}.${i[2]}`:i[2],u=t.slice(o+1,a);r.push({exported:c,entry:{name:l,kind:"namespace",signature:`namespace ${l}`,members:GL(u),requiredMembers:[]}}),LL(u,l,c,r),Tk(u,l,c,r),s.lastIndex=a+1}}function LL(t,e,n,r){let s=xk(t),i=(o,a,c,l=[],u=[])=>{r.push({exported:n,entry:{name:`${e}.${o}`,kind:a,signature:tp(c.replace(new RegExp(`\\b${uc(o)}\\b`),`${e}.${o}`)),members:l,requiredMembers:u}})};for(let o of s.matchAll(/\b(?:declare\s+)?function\s+([A-Za-z_$][\w$]*)(?:<[^>{}]*>)?\s*\(/g)){let a=o.index??0;i(o[1],"function",s.slice(a,kn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\b/g)){let a=o.index??0;i(o[1],"variable",s.slice(a,kn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?type\s+([A-Za-z_$][\w$]*)\b/g)){let a=o.index??0;i(o[1],"type",s.slice(a,kn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?class\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=lr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"",d=Qd(u,!0);i(o[1],"class",s.slice(a,c>=0?c:kn(s,a)),d.map(p=>p.name),d.filter(p=>p.required).map(p=>p.name))}for(let o of s.matchAll(/\b(?:declare\s+)?interface\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=lr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"",d=Qd(u,!1);i(o[1],"interface",s.slice(a,c>=0?c:kn(s,a)),d.map(p=>p.name),d.filter(p=>p.required).map(p=>p.name))}for(let o of s.matchAll(/\b(?:declare\s+)?enum\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=lr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"";i(o[1],"enum",s.slice(a,c>=0?c:kn(s,a)),$k(u).map(d=>d.name))}}function xk(t){let e=[],n=/\b(?:export\s+)?(?:declare\s+)?(?:namespace|module)\s+[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\s*\{/g;for(let s of t.matchAll(n)){let i=t.indexOf("{",s.index),o=lr(t,i);i>=0&&o>=0&&e.push([s.index??0,o+1])}if(e.length===0)return t;let r=[...t];for(let[s,i]of e)for(let o=s;o=0?a+1:kn(t,i),l=o>=0&&a>o?t.slice(o+1,a):"",u=n==="enum"?$k(l):Qd(l,n==="class");r.push({exported:!!s[1],entry:{name:s[2],kind:n,signature:tp(t.slice(i,o>=0?o:c)),members:u.map(d=>d.name),requiredMembers:u.filter(d=>d.required).map(d=>d.name)}})}}function kn(t,e){let n=t.indexOf(";",e),r=t.indexOf("{",e);if(r>=0&&(n<0||r=0?s+1:t.length}return n>=0?n+1:t.length}function lr(t,e){if(e<0)return-1;let n=0;for(let r=e;r/^[\s\n]*([A-Za-z_$][\w$]*)/.exec(e)?.[1]).filter(e=>!!e).map(e=>({name:e,required:!1}))}function Qd(t,e){let n=[],r=/(?:^|[;\n])\s*((?:public|protected|private|readonly|static|abstract|declare|override)\s+)*(#?[A-Za-z_$][\w$]*)(\?)?\s*(\(|:)/g;for(let s of t.matchAll(r)){let i=s[1]??"",o=s[2];o==="constructor"||i.includes("private")||o.startsWith("#")||n.push({name:o,required:e?s[4]===":"&&!s[3]:!s[3]})}return n}function jL(t){let e=[];for(let n of t.split(",")){let r=n.replace(/\btype\s+/g,"").trim();if(!r)continue;let[s,i]=r.split(/\s+as\s+/).map(o=>o.trim());s&&e.push({local:s,exported:i||s})}return e}function FL(t,e){let n=r=>r==="variable"||r==="function";return n(t)&&n(e)}function Rk(t,e,n){if(e.api.size<20)return null;let s=0;for(let a of e.api.keys())n.api.has(a)&&(s+=1);if(s>e.api.size*.1||n.api.size>e.api.size*.1)return null;let i=n.subpaths.filter(a=>a!=="."),o=i.length>0?` The new version publishes ${i.length} other entry point${i.length===1?"":"s"}: ${i.join(", ")}. Import from the one that carries the API you use, rather than replacing the symbols individually.`:" Nothing in the new version publishes the old symbols under the old import path.";return{kind:"entry-point-moved",symbol:t,detail:`Importing \`${t}\` no longer gives you its API: the root entry point went from ${e.api.size} exported symbols to ${n.api.size}.${o}`,before:`${e.entryPath} \u2014 ${e.api.size} exports`,after:`${n.entryPath} \u2014 ${n.api.size} exports`}}function Be(t,e){let n=[];for(let[r,s]of t){let i=e.get(r),o=s.name,a=s.via?` (declared in ${s.via})`:"";if(!i){n.push({kind:"export-removed",symbol:o,detail:`\`${o}\` is no longer exported (was a ${s.kind})${a}.`,before:s.signature});continue}if(s.kind!==i.kind&&!FL(s.kind,i.kind)){n.push({kind:"kind-changed",symbol:o,detail:`\`${o}\` changed from a ${s.kind} to a ${i.kind}${a}.`,before:s.signature,after:i.signature});continue}for(let l of s.members)i.members.includes(l)||n.push({kind:"member-removed",symbol:`${o}.${l}`,detail:`\`${o}.${l}\` was removed${a}.`});let c=new Set(s.requiredMembers);for(let l of i.requiredMembers)!c.has(l)&&s.members.includes(l)&&n.push({kind:"member-now-required",symbol:`${o}.${l}`,detail:`\`${o}.${l}\` is now required; it was previously optional${a}.`});s.signature!==i.signature&&s.kind!=="interface"&&s.kind!=="class"&&!qL(s.signature,i.signature)&&n.push({kind:"signature-changed",symbol:o,detail:`The signature of \`${o}\` changed${a}.`,before:s.signature,after:i.signature})}return n}function qL(t,e){if(t===e)return!0;let n=_k(t);return n===_k(e)&&n!==null}function _k(t){let e=UL(t);if(e.length===0)return null;let n=t;return e.forEach((r,s)=>{n=n.replace(new RegExp(`\\b${uc(r)}\\b`,"g"),`\0T${s}`)}),n}function UL(t){let e=[];for(let n=0;n"&&(n-=1,n===0))return r;return-1}function VL(t){let e=[],n=0,r="";for(let s of t){if("<([{".includes(s)?n+=1:">)]}".includes(s)&&(n-=1),s===","&&n===0){e.push(r),r="";continue}r+=s}return r.trim()&&e.push(r),e}var bc=require("node:fs/promises"),VE=require("node:os"),WE=require("node:path");var Ak=require("node:child_process"),WL=18e4,zL=32*1024*1024,At=(t,e,n={})=>new Promise(r=>{(0,Ak.execFile)(t,[...e],{cwd:n.cwd,timeout:n.timeoutMs??WL,maxBuffer:n.maxBuffer??zL,env:n.env??process.env,windowsHide:!0,encoding:"utf8"},(s,i,o)=>{if(!s){r({code:0,stdout:i,stderr:o});return}let a=s;r({code:typeof a.code=="number"?a.code:1,stdout:i??"",stderr:o??String(s.message??""),failure:a.code==="ENOENT"?"not-found":a.killed?"timeout":"error"})})});async function dc(t,e,n=["--version"]){let r=await t(e,n,{timeoutMs:2e4});return r.failure!=="not-found"&&r.code===0}var Ui=require("node:fs/promises"),qi=require("node:path");function G(t,e,n,r,s){return{available:!1,reason:e,detail:n,...r?{remedy:r}:{},...s?{install:s}:{},tool:t}}var ur="cargo public-api",HL="Install Rust and Cargo with rustup, or make sure `cargo` is on PATH.",KL={id:"cargo-public-api",label:"Install cargo-public-api",command:"cargo",args:["install","cargo-public-api"]},JL="Drift can install the missing `cargo-public-api` helper for you after approval.",Ik={ecosystem:"cargo",tool:ur,weight:1,async compute(t){if(!await Ok(t.exec,"cargo",["--version"],t.env))return G(ur,"tool-missing",`The Rust Cargo toolchain is not installed or is not on PATH, so ${t.name}'s public API could not be compared directly.`,HL);if(!await Ok(t.exec,"cargo",["public-api","--version"],t.env))return G(ur,"tool-missing",`Rust and Cargo are installed, but Drift's Rust API helper is missing. ${t.name}'s public API could not be compared directly.`,JL,KL);let e=await Ck(t,t.from);if(!e.ok)return e.failure;let n=await Ck(t,t.to);return n.ok?{available:!0,changes:Be(e.api,n.api),tool:ur,weight:1,locator:`${t.name} ${t.from} \u2192 ${t.to} (rustdoc JSON)`}:n.failure}};async function Ck(t,e){let n=(0,qi.join)(t.workdir,`probe-${e}`);try{await(0,Ui.mkdir)((0,qi.join)(n,"src"),{recursive:!0}),await(0,Ui.writeFile)((0,qi.join)(n,"Cargo.toml"),YL(t.name,e),"utf8"),await(0,Ui.writeFile)((0,qi.join)(n,"src","lib.rs"),"","utf8")}catch(i){return{ok:!1,failure:G(ur,"toolchain-failed",`Could not prepare a scratch crate: ${i.message}`)}}let r=await t.exec("cargo",["public-api","--simplified","--package",t.name],{cwd:n,timeoutMs:t.timeoutMs,env:t.env});if(r.code!==0){let i=/could not find|no matching package|failed to select a version/i.test(r.stderr);return{ok:!1,failure:G(ur,i?"version-unavailable":"toolchain-failed",i?`crates.io has no ${t.name} ${e}; it may have been yanked, or the crate may be private.`:`\`cargo public-api\` failed on ${t.name} ${e}: ${eG(r.stderr)}`)}}let s=Dk(r.stdout);return s.size===0?{ok:!1,failure:G(ur,"no-public-surface",`${t.name} ${e} exposes no public items that \`cargo public-api\` could read.`)}:{ok:!0,api:s}}function YL(t,e){return["[package]",'name = "drift-surface-probe"','version = "0.0.0"','edition = "2021"',"","[dependencies]",`${Pk(t)} = "=${Pk(e)}"`,"","[workspace]"].join(` -`)}var ZL={fn:"function",struct:"class",enum:"enum",trait:"interface",type:"type",const:"variable",static:"variable",mod:"namespace",union:"class",macro:"function"};function Dk(t,e=new Map){for(let n of t.split(` -`)){let r=n.trim();if(!r||!r.startsWith("pub "))continue;let s=/^pub\s+(?:unsafe\s+|async\s+|extern\s+"[^"]*"\s+)*([a-z]+)\s+(.+)$/.exec(r);if(!s)continue;let i=ZL[s[1]];if(!i)continue;let o=XL(s[2]);if(!o)continue;let a=e.get(QL(o)??"");if(a&&a.kind!=="namespace"){let l=o.slice(a.name.length+2);a.members.includes(l)||a.members.push(l);continue}let c=e.get(o);if(c){c.signature=`${c.signature} | ${r}`;continue}e.set(o,{name:o,kind:i,signature:r,members:[],requiredMembers:[]})}return e}function XL(t){return/^[A-Za-z_]\w*(?:::[A-Za-z_]\w*)*/.exec(t)?.[0]??null}function QL(t){let e=t.lastIndexOf("::");return e===-1?null:t.slice(0,e)}function Pk(t){return t.replace(/["\\]/g,"")}function eG(t){return t.split(` -`).find(e=>e.trim().length>0)?.trim()??"no output"}async function Ok(t,e,n,r){let s=await t(e,n,{timeoutMs:2e4,env:r});return s.failure!=="not-found"&&s.code===0}var pr=require("node:fs/promises"),Yk=require("node:os"),Vi=require("node:path");var Mk=`// Drift's Go exported-API extractor. +`).trim(),line:r.line}),e}function mp(t){let e=t.replace(/\[([^\]]{0,300})\]\([^)]{0,2000}\)/g,"$1"),n=/\bv?(\d+\.\d+(?:\.\d+)?(?:[-+][\w.-]+)?)\b/.exec(e);return n?te(n[1]):null}function hp(t,e,n){let r=te(e),s=te(n);if(!r||!s)return[];let[i,o]=Vt.default.gt(s,r)?[r,s]:[s,r];return t.filter(a=>{let c=te(a.version);return c!==null&&Vt.default.gt(c,i)&&Vt.default.lte(c,o)}).sort((a,c)=>Vt.default.rcompare(te(a.version),te(c.version)))}function Vi(t){let e=[],n=t.split(` +`),r=!1,s=0;for(let i of n){let o=/^(#{1,6})\s(.*)$/.exec(i);if(o){let c=o[1].length,l=o[2].trimStart();if(fL.test(l)){r=!0,s=c,e.push(i.trim());continue}r&&c<=s&&(r=!1)}let a=i.trim();if(a){if(r){e.push(a);continue}mL.test(a)&&e.push(a)}}return gL(e)}var fL=/breaking|incompatib|removed|migration|upgrade\s+guide|deprecat|pure esm|esm[\s-]only|commonjs/i,mL=/\b(BREAKING(\s+CHANGE)?|breaking change|no longer|has been removed|have been removed|was removed|were removed|is removed|renamed to|renamed from|replaced by|replaced with|now requires?|required\s+node|must now|dropped support|drop support|removed support|is now required|are now required|moved to|deprecated in favou?r of|pure ESM|ESM[\s-]only|now ESM|dropped CommonJS|no longer (?:supports|provides) CommonJS|minimum\s+(?:supported\s+)?(?:node|python|go|ruby|java|rust))\b/i;function gL(t){return[...new Set(t.map(e=>e.trim()).filter(Boolean))]}var Lk=require("node:crypto"),Gk=require("node:zlib"),Es=require("node:fs/promises"),bp=require("node:path");var Fk="https://downloads.arduino.cc/libraries/library_index.json.gz",hL=1440*60*1e3,yL=12e4,Mk=null;async function bL(){return Mk??=wL(),Mk}async function hc(t){return(await bL())?.get(t.toLowerCase())??null}async function wL(){let t=await Nk();if(t)return yp(t);let e=await vL();if(!e){let r=await Nk({ignoreAge:!0});return r?yp(r):null}let n=kL(e);return await SL(n),yp(n)}async function vL(){try{let t=await fetch(Fk,{signal:AbortSignal.timeout(yL),headers:{"User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"}});if(!t.ok)return null;let e=Buffer.from(await t.arrayBuffer()),n=e[0]===31&&e[1]===139?(0,Gk.gunzipSync)(e):e;return JSON.parse(n.toString("utf8"))}catch{return null}}function kL(t){let e=new Map;for(let n of t.libraries??[]){if(!n.name||!n.version)continue;let r=n.name.toLowerCase(),s=e.get(r);s||(s={name:n.name,versions:[],githubRepo:null,website:null,description:null,archives:{}},e.set(r,s)),s.versions.includes(n.version)||s.versions.push(n.version),n.url&&(s.archives[n.version]=n.url),s.githubRepo=EL(n.repository)??s.githubRepo,s.website=n.website??s.website,s.description=n.sentence??s.description}return[...e.values()]}function EL(t){if(!t)return null;let e=/github\.com[/:]([\w.-]+)\/([\w.-]+?)(?:\.git)?\/?$/.exec(t);return e?`${e[1]}/${e[2]}`:null}function yp(t){return new Map(t.map(e=>[e.name.toLowerCase(),e]))}function jk(){let t=Tk();if(!t)return null;let e=(0,Lk.createHash)("sha256").update(Fk).digest("hex");return(0,bp.join)(t,`arduino-index-${e.slice(0,16)}.json`)}async function Nk(t={}){let e=jk();if(!e)return null;try{let n=JSON.parse(await(0,Es.readFile)(e,"utf8"));return!Array.isArray(n.libraries)||!t.ignoreAge&&Date.now()-n.fetchedAt>=hL?null:n.libraries}catch{return null}}async function SL(t){let e=jk();if(e)try{await(0,Es.mkdir)((0,bp.join)(e,".."),{recursive:!0});let n={fetchedAt:Date.now(),libraries:[...t]};await(0,Es.writeFile)(e,JSON.stringify(n),"utf8")}catch{}}async function kn(t,e,n){switch(e){case"npm":return UL(t,n);case"pypi":return BL(t,n);case"cargo":return VL(t);case"go":return WL(t);case"maven":return KL(t);case"rubygems":return JL(t);case"nuget":return xL(t);case"packagist":return TL(t);case"hex":return _L(t);case"pub":return $L(t);case"swift":return RL(t);case"cocoapods":return CL(t);case"conan":return AL(t);case"vcpkg":return OL(t);case"arduino":return DL(t);case"opam":return null;default:return null}}async function xL(t){let e=t.toLowerCase(),[n,r]=await Promise.all([H(`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(e)}/index.json`),H(`https://api.nuget.org/v3/registration5-gz-semver2/${encodeURIComponent(e)}/index.json`)]);if(!n&&!r)return null;let s=(r?.items??[]).flatMap(o=>o.items??[]),i=s[s.length-1]?.catalogEntry;return{name:t,ecosystem:"nuget",githubRepo:he(i?.repository?.url??null)??he(i?.projectUrl??null),homepage:i?.projectUrl??`https://www.nuget.org/packages/${t}`,versions:n?.versions??[],deprecated:i?.deprecation?.message??null,description:i?.description??null}}async function TL(t){let n=(await H(`https://repo.packagist.org/p2/${t}.json`))?.packages?.[t];if(!n||n.length===0)return null;let r=n[0],s=r.abandoned,i=s===void 0||s===!1?null:typeof s=="string"?`This package is abandoned; the author suggests using ${s} instead.`:"This package is abandoned and is no longer maintained.";return{name:t,ecosystem:"packagist",githubRepo:he(r.source?.url??null)??he(r.homepage??null),homepage:r.homepage??`https://packagist.org/packages/${t}`,versions:n.map(o=>o.version).filter(o=>!!o),deprecated:i,description:r.description??null}}async function _L(t){let e=await H(`https://hex.pm/api/packages/${encodeURIComponent(t)}`);if(!e)return null;let n=e.meta?.links??{},r=Object.entries(n).map(([o,a])=>({key:o.toLowerCase(),value:a})),s=r.find(o=>o.key==="github")?.value??r.find(o=>o.key==="source")?.value,i=Object.values(e.retirements??{})[0];return{name:t,ecosystem:"hex",githubRepo:he(s??null)??r.map(o=>he(o.value)).find(Boolean)??null,homepage:e.html_url??`https://hex.pm/packages/${t}`,versions:(e.releases??[]).map(o=>o.version).filter(o=>!!o),deprecated:i?i.message??i.reason??"This release is retired.":null,description:e.meta?.description??null}}async function $L(t){let e=await H(`https://pub.dev/api/packages/${encodeURIComponent(t)}`);if(!e)return null;let n=e.latest?.pubspec,r=n?.repository??n?.homepage??n?.issue_tracker;return{name:t,ecosystem:"pub",githubRepo:he(r??null),homepage:n?.homepage??`https://pub.dev/packages/${t}`,versions:(e.versions??[]).map(s=>s.version).filter(s=>!!s),deprecated:e.latest?.retracted?"The latest version of this package has been retracted.":null,description:n?.description??null}}function RL(t){return/^[\w.-]+\/[\w.-]+$/.test(t)?{name:t,ecosystem:"swift",githubRepo:t,homepage:`https://github.com/${t}`,versions:[],deprecated:null,description:null}:null}async function CL(t){let e=await H(`https://trunk.cocoapods.org/api/v1/pods/${encodeURIComponent(t)}`);return e?{name:t,ecosystem:"cocoapods",githubRepo:null,homepage:`https://cocoapods.org/pods/${t}`,versions:(e.versions??[]).map(n=>n.name).filter(n=>!!n),deprecated:null,description:null}:null}async function AL(t){let e=`https://raw.githubusercontent.com/conan-io/conan-center-index/master/recipes/${encodeURIComponent(t)}`,n=await ge(`${e}/config.yml`);if(!n)return null;let{versions:r,folders:s}=PL(n);if(r.length===0)return null;let i=s[r[r.length-1]]??s[r[0]]??"all",o=await ge(`${e}/${i}/conandata.yml`);return{name:t,ecosystem:"conan",githubRepo:o?IL(o):null,homepage:`https://conan.io/center/recipes/${t}`,versions:r,deprecated:null,description:null}}function PL(t){let e=[],n={},r=!1,s=null;for(let i of t.split(` +`)){let o=i.split("#")[0].replace(/\s+$/,"");if(!o.trim())continue;if(/^versions\s*:/.test(o)){r=!0;continue}if(!/^\s/.test(o)){r=!1;continue}if(!r)continue;let a=/^\s{2,}["']?([^"':\s]+)["']?\s*:\s*$/.exec(o);if(a){s=a[1].trim(),s&&!e.includes(s)&&e.push(s);continue}let c=/^\s{4,}folder\s*:\s*["']?([^"'\s]+)["']?/.exec(o);c&&s&&(n[s]=c[1])}return{versions:e,folders:n}}function IL(t){for(let e of t.matchAll(/https?:\/\/github\.com\/[\w.-]+\/[\w.-]+/g)){let n=he(e[0]);if(n)return n}return null}async function OL(t){let e=t[0]?.toLowerCase();if(!e||!/[a-z0-9]/.test(e))return null;let[n,r]=await Promise.all([H(`https://raw.githubusercontent.com/microsoft/vcpkg/master/versions/${e}-/${encodeURIComponent(t)}.json`),H(`https://raw.githubusercontent.com/microsoft/vcpkg/master/ports/${encodeURIComponent(t)}/vcpkg.json`)]);if(!n)return null;let s=[];for(let o of n.versions??[]){let a=o.version??o["version-semver"]??o["version-string"]??o["version-date"];a&&!s.includes(a)&&s.push(a)}if(s.length===0)return null;let i=Array.isArray(r?.description)?r.description.join(" "):r?.description??null;return{name:t,ecosystem:"vcpkg",githubRepo:he(r?.homepage??null),homepage:r?.homepage??`https://vcpkg.io/en/package/${t}`,versions:s,deprecated:null,description:i}}async function DL(t){let e=await hc(t);if(e)return{name:e.name,ecosystem:"arduino",githubRepo:e.githubRepo,homepage:e.website??`https://www.arduino.cc/reference/en/libraries/${NL(t)}/`,versions:e.versions,deprecated:null,description:e.description};let n=await ML(t);return n?{name:n.name??t,ecosystem:"arduino",githubRepo:he(n.repository_url??null),homepage:n.homepage??null,versions:n.version?.name?[n.version.name]:[],deprecated:null,description:n.description??null}:null}async function ML(t){let n=((await H(`https://api.registry.platformio.org/v3/search?query=${encodeURIComponent(t)}`))?.items??[]).find(r=>r.name?.toLowerCase()===t.toLowerCase()&&r.owner?.username);return n?H(`https://api.registry.platformio.org/v3/packages/${encodeURIComponent(n.owner.username)}/library/${encodeURIComponent(n.name)}`):null}function NL(t){return t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}async function Wi(t,e,n){switch(e){case"npm":return LL(t,n);case"pypi":return GL(t,n);case"go":return FL(t,n);case"cargo":return qL(t,n);default:return null}}function yc(t){return{version:t,license:null,releasedAt:null,runtime:null,dependencies:[],withdrawn:null}}async function LL(t,e){let n=await H(`https://registry.npmjs.org/${encodeURIComponent(t).replaceAll("%40","@")}`),r=n?.versions?.[e];if(!r)return null;let s=r.engines?.node;return{...yc(e),license:typeof r.license=="string"?r.license:r.license?.type??null,releasedAt:n?.time?.[e]??null,runtime:s?{name:"Node.js",requirement:s}:null,dependencies:Object.keys(r.dependencies??{}),withdrawn:r.deprecated??null}}async function GL(t,e){let n=await H(`https://pypi.org/pypi/${encodeURIComponent(t)}/${encodeURIComponent(e)}/json`,{immutable:!0});if(!n?.info)return null;let r=n.info.requires_python;return{...yc(e),license:n.info.license||null,releasedAt:n.urls?.[0]?.upload_time_iso_8601??null,runtime:r?{name:"Python",requirement:r}:null,dependencies:(n.info.requires_dist??[]).map(s=>/^\s*([A-Za-z0-9._-]+)/.exec(s)?.[1]).filter(s=>!!s),withdrawn:n.info.yanked?`Release yanked: ${n.info.yanked_reason??"no reason given"}`:null}}async function FL(t,e){let n=e.startsWith("v")?e:`v${e}`,r=`https://proxy.golang.org/${encodeURI(t.toLowerCase())}/@v/${encodeURIComponent(n)}`,[s,i]=await Promise.all([ge(`${r}.mod`,{immutable:!0}),H(`${r}.info`,{immutable:!0})]);if(!s&&!i)return null;let o=s?/^\s*go\s+(\d+\.\d+(?:\.\d+)?)/m.exec(s)?.[1]:null;return{...yc(n),releasedAt:i?.Time??null,runtime:o?{name:"Go",requirement:`>=${o}`}:null,withdrawn:s?jL(s,n):null}}function jL(t,e){let n=e.replace(/^v/,"");for(let s of t.matchAll(/^\s*retract\s+(.+)$/gm)){let i=s[1].trim(),o=/\/\/\s*(.+)$/.exec(i)?.[1]?.trim(),a=o?`Retracted by the maintainer: ${o}`:"Retracted by the maintainer.",c=/^v?([\w.+-]+)/.exec(i.replace(/\/\/.*$/,"").trim())?.[1];if(c&&c===n)return a;let l=/\[\s*v?([\w.+-]+)\s*,\s*v?([\w.+-]+)\s*\]/.exec(i);if(l&&qk(n,l[1],l[2]))return a}let r=/^\s*retract\s*\(([\s\S]*?)^\s*\)/m.exec(t)?.[1];if(r)for(let s of r.split(` +`)){let i=s.replace(/\/\/.*$/,"").trim();if(!i)continue;let o=/\/\/\s*(.+)$/.exec(s)?.[1]?.trim(),a=o?`Retracted by the maintainer: ${o}`:"Retracted by the maintainer.";if(/^v?([\w.+-]+)$/.exec(i)?.[1]===n)return a;let c=/\[\s*v?([\w.+-]+)\s*,\s*v?([\w.+-]+)\s*\]/.exec(i);if(c&&qk(n,c[1],c[2]))return a}return null}function qk(t,e,n){return Uk(t,e)>=0&&Uk(t,n)<=0}function Uk(t,e){let n=t.split(/[.+-]/).map(s=>Number.parseInt(s,10)),r=e.split(/[.+-]/).map(s=>Number.parseInt(s,10));for(let s=0;s=${r}`}:null,withdrawn:n.version.yanked?"This release was yanked from crates.io.":null}}async function Wk(t,e){let n={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"};e&&(n.Authorization=`Bearer ${e}`);let r=await H(`https://api.github.com/repos/${t}`,{headers:n});if(!r)return null;let s=r.license?.spdx_id;return{archived:r.archived===!0,pushedAt:r.pushed_at??null,license:s&&s!=="NOASSERTION"?s:null,url:r.html_url??`https://github.com/${t}`}}async function UL(t,e){let n=await H(`https://registry.npmjs.org/${encodeURIComponent(t).replaceAll("%40","@")}`);if(!n)return null;let r=Object.keys(n.versions??{}),s=e?n.versions?.[e]:void 0;return{name:t,ecosystem:"npm",githubRepo:he(Bk(n.repository))??he(Bk(s?.repository))??he(n.homepage),homepage:n.homepage??null,versions:r,deprecated:s?.deprecated??null,description:n.description??null}}async function BL(t,e){let n=await H(`https://pypi.org/pypi/${encodeURIComponent(t)}/json`);if(!n)return null;let i=[...Object.values(n.info?.project_urls??{}),n.info?.home_page??""].map(he).find(c=>c!==null)??null,a=(e?n.releases?.[e]??[]:[]).find(c=>c.yanked);return{name:t,ecosystem:"pypi",githubRepo:i,homepage:n.info?.home_page??null,versions:Object.keys(n.releases??{}),deprecated:a?`Release yanked: ${a.yanked_reason??"no reason given"}`:null,description:n.info?.summary??null}}async function VL(t){let e=await H(`https://crates.io/api/v1/crates/${encodeURIComponent(t)}`);return e?{name:t,ecosystem:"cargo",githubRepo:he(e.crate?.repository)??he(e.crate?.homepage),homepage:e.crate?.homepage??null,versions:(e.versions??[]).map(n=>n.num),deprecated:null,description:e.crate?.description??null}:null}async function WL(t){let e=await ge(`https://proxy.golang.org/${encodeURI(t.toLowerCase())}/@v/list`);return{name:t,ecosystem:"go",githubRepo:HL(t),homepage:`https://pkg.go.dev/${t}`,versions:e?e.split(` +`).map(n=>n.trim()).filter(Boolean):[],deprecated:null,description:null}}var zL={grpc:"grpc/grpc-go",protobuf:"protocolbuffers/protobuf-go",api:"googleapis/google-api-go-client",genproto:"googleapis/go-genproto",appengine:"golang/appengine"};function HL(t){let e=t.replace(/\/v[2-9]\d*$/,""),n=[[/^golang\.org\/x\/([\w.-]+)/,r=>`golang/${r[1]}`],[/^google\.golang\.org\/(\w+)/,r=>zL[r[1]]??`googleapis/go-${r[1]}`],[/^go\.uber\.org\/([\w.-]+)/,r=>`uber-go/${r[1]}`],[/^sigs\.k8s\.io\/([\w.-]+)/,r=>`kubernetes-sigs/${r[1]}`],[/^k8s\.io\/([\w.-]+)/,r=>`kubernetes/${r[1]}`],[/^gopkg\.in\/([\w.-]+)\/([\w.-]+?)\.v\d+$/,r=>`${r[1]}/${r[2]}`],[/^gopkg\.in\/([\w.-]+?)\.v\d+$/,r=>`go-${r[1]}/${r[1]}`]];for(let[r,s]of n){let i=r.exec(e);if(i)return s(i)}return he(`https://${e}`)}async function KL(t){let[e,n]=t.split(":");if(!e||!n)return null;let r=await H(`https://search.maven.org/solrsearch/select?q=g:%22${encodeURIComponent(e)}%22+AND+a:%22${encodeURIComponent(n)}%22&core=gav&rows=100&wt=json`);return{name:t,ecosystem:"maven",githubRepo:null,homepage:`https://central.sonatype.com/artifact/${e}/${n}`,versions:(r?.response?.docs??[]).map(s=>s.v),deprecated:null,description:null}}async function JL(t){let e=await H(`https://rubygems.org/api/v1/gems/${encodeURIComponent(t)}.json`);if(!e)return null;let n=await H(`https://rubygems.org/api/v1/versions/${encodeURIComponent(t)}.json`);return{name:t,ecosystem:"rubygems",githubRepo:he(e.source_code_uri)??he(e.homepage_uri)??he(e.changelog_uri),homepage:e.homepage_uri??null,versions:(n??[]).map(r=>r.number),deprecated:null,description:e.info??null}}function Bk(t){if(t)return typeof t=="string"?t:t.url}function he(t){if(!t)return null;let e=/^github:([\w.-]+)\/([\w.-]+)$/.exec(t.trim());if(e)return`${e[1]}/${Vk(e[2])}`;let n=/github\.com[/:]([\w.-]+)\/([\w.-]+)/.exec(t);if(!n)return null;let r=n[1],s=Vk(n[2]);return!r||!s||r==="sponsors"?null:`${r}/${s}`}function Vk(t){return t.replace(/\.git$/,"")}var En=mt(ur(),1);async function zk(t,e,n,r={}){let{token:s,maxReleases:i=25}=r,o={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"};s&&(o.Authorization=`Bearer ${s}`);let a=te(e),c=te(n);if(!a||!c)return[];let[l,u]=En.default.gt(c,a)?[a,c]:[c,a],d=[],p=100,f=5;for(let m=1;m<=f;m++){let g=await H(`https://api.github.com/repos/${t}/releases?per_page=${p}&page=${m}`,{headers:o});if(!g||g.length===0)break;let h=!1;for(let y of g){if(y.draft)continue;let w=te(y.tag_name);if(w){if(En.default.lte(w,l)){h=!0;continue}En.default.gt(w,u)||d.push({tag:y.tag_name,version:w,name:y.name,body:y.body??"",url:y.html_url,publishedAt:y.published_at})}}if(h||g.lengthEn.default.rcompare(i.version,o.version));if(n.length<=e)return n;let r=n.filter(i=>{let o=En.default.parse(i.version);return o!==null&&o.patch===0&&!o.prerelease.length}).sort((i,o)=>En.default.compare(i.version,o.version)),s=new Map;for(let i of r){if(s.size>=e)break;s.set(i.version,i)}for(let i of n){if(s.size>=e)break;s.set(i.version,i)}return[...s.values()].sort((i,o)=>En.default.rcompare(i.version,o.version))}var Zk=mt($i(),1),ZL=["get","put","post","delete","options","head","patch","trace"];function bc(t){let e;try{e=t.trim().startsWith("{")?JSON.parse(t):(0,Zk.parse)(t)}catch{return null}if(!e||typeof e!="object")return null;let n=e;return!n.openapi&&!n.swagger?null:n}function Xk(t,e){let n=bc(t),r=bc(e);if(!n||!r)return[];let s=[],i=n.paths??{},o=r.paths??{};for(let[a,c]of Object.entries(i)){let l=o[a];if(!l){s.push({kind:"path-removed",location:a,pointer:`#/paths/${Yk(a)}`,detail:`Path \`${a}\` no longer exists. Every request to it will 404.`});continue}for(let u of ZL){let d=c[u];if(!d)continue;let p=l[u],f=`${u.toUpperCase()} ${a}`,m=`#/paths/${Yk(a)}/${u}`;if(!p){s.push({kind:"operation-removed",location:f,pointer:m,detail:`Operation \`${f}\` was removed.`});continue}XL(d,p,n,r,f,m,s),QL(d,p,n,r,f,m,s),eG(d,p,n,r,f,m,s),tG(d,p,f,m,s)}}return s}function XL(t,e,n,r,s,i,o){let a=Hk(t.parameters,n),c=Hk(e.parameters,r);for(let[l,u]of a){let d=c.get(l);if(!d){u.required&&o.push({kind:"parameter-removed",location:s,pointer:`${i}/parameters/${l}`,detail:`Required parameter \`${u.name}\` (in: ${u.in}) was removed.`});continue}!u.required&&d.required&&o.push({kind:"parameter-now-required",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` (in: ${d.in}) is now required. Calls omitting it will be rejected.`});let p=vc(u.schema??{type:u.type}),f=vc(d.schema??{type:d.type});p&&f&&p!==f&&o.push({kind:"parameter-type-changed",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` changed type from \`${p}\` to \`${f}\`.`});let m=kc(u.schema),g=kc(d.schema),h=m.filter(y=>!g.includes(y));m.length&&g.length&&h.length&&o.push({kind:"request-enum-narrowed",location:s,pointer:`${i}/parameters/${l}`,detail:`Parameter \`${d.name}\` no longer accepts: ${h.map(y=>`\`${y}\``).join(", ")}.`})}}function QL(t,e,n,r,s,i,o){let a=Sn(Kk(t),n),c=Sn(Kk(e),r);if(!a||!c)return;let l=new Set(Jk(a)),u=Jk(c);for(let d of u)l.has(d)||o.push({kind:"request-field-now-required",location:s,pointer:`${i}/requestBody/${d}`,detail:`Request body field \`${d}\` is now required.`});for(let[d,p,f]of Qk(a,c,n,r))o.push({kind:"request-field-type-changed",location:s,pointer:`${i}/requestBody/${d}`,detail:`Request body field \`${d}\` changed type from \`${p}\` to \`${f}\`.`})}function eG(t,e,n,r,s,i,o){let a=t.responses??{},c=e.responses??{};for(let[l,u]of Object.entries(a)){if(!/^2\d\d$/.test(l))continue;let d=c[l];if(!d){o.push({kind:"response-status-removed",location:s,pointer:`${i}/responses/${l}`,detail:`Success response \`${l}\` was removed from \`${s}\`.`});continue}let p=Sn(wp(u),n),f=Sn(wp(d),r);if(!p||!f)continue;let m=wc(p),g=wc(f);for(let h of Object.keys(m))h in g||o.push({kind:"response-field-removed",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` is no longer returned by \`${s}\`.`});for(let[h,y,w]of Qk(p,f,n,r))o.push({kind:"response-field-type-changed",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` changed type from \`${y}\` to \`${w}\`.`});for(let[h,y]of Object.entries(m)){let w=g[h];if(!w)continue;let S=kc(y),k=kc(w).filter(_=>!S.includes(_));S.length&&k.length&&o.push({kind:"response-enum-widened",location:s,pointer:`${i}/responses/${l}/${h}`,detail:`Response field \`${h}\` can now return new values: ${k.map(_=>`\`${_}\``).join(", ")}. Exhaustive handling of this field must be updated.`})}}}function tG(t,e,n,r,s){let i=t.security??[],o=e.security??[],a=i.length===0||i.some(l=>Object.keys(l).length===0),c=o.length===0||o.some(l=>Object.keys(l).length===0);if(a&&!c&&o.length>0){let l=[...new Set(o.flatMap(u=>Object.keys(u)))];s.push({kind:"security-added",location:n,pointer:`${r}/security`,detail:`\`${n}\` now requires authentication (${l.join(", ")}).`})}}function Hk(t,e){let n=new Map;if(!Array.isArray(t))return n;for(let r of t){let s=Sn(r,e);s?.name&&n.set(`${s.in??"query"}:${s.name}`,s)}return n}function Kk(t){let e=t.requestBody;return e?wp(e):null}function wp(t){let e=t.content;if(!e)return t.schema??null;let n=Object.keys(e).find(r=>r.includes("json"))??Object.keys(e)[0];return n?e[n]?.schema??null:null}function Sn(t,e,n=0){if(!t)return null;if(n>10)return t;let r=t.$ref;if(typeof r!="string")return t;if(!r.startsWith("#/"))return null;let s=r.slice(2).split("/").map(nG),i=e;for(let o of s){if(!i||typeof i!="object")return null;i=i[o]}return!i||typeof i!="object"?null:Sn(i,e,n+1)}function wc(t){let e=t.properties??{},n=t.allOf;if(!Array.isArray(n))return e;let r={...e};for(let s of n)s&&typeof s=="object"&&Object.assign(r,s.properties??{});return r}function Jk(t){let e=Array.isArray(t.required)?t.required:[],r=(Array.isArray(t.allOf)?t.allOf:[]).flatMap(s=>{let i=s?.required;return Array.isArray(i)?i:[]});return[...new Set([...e,...r])]}function Qk(t,e,n,r){let s=[],i=wc(t),o=wc(e);for(let[a,c]of Object.entries(i)){let l=o[a];if(!l)continue;let u=vc(Sn(c,n)),d=vc(Sn(l,r));u&&d&&u!==d&&s.push([a,u,d])}return s}function vc(t){if(!t)return null;let e=t.type;if(typeof e=="string"){if(e==="array"){let n=t.items;return`array<${typeof n?.type=="string"?n.type:"unknown"}>`}return e}return Array.isArray(e)?e.join("|"):null}function kc(t){let e=t?.enum;return Array.isArray(e)?e.map(n=>String(n)):[]}function Yk(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}function nG(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}var rG="https://data.jsdelivr.com/v1/packages/npm",Sc="https://cdn.jsdelivr.net/npm";async function xc(t,e,n={}){let r=await sG(t,e),s=await pG(t,e,r);if(!r&&!s)throw new zi(t,e);if(!s)return null;let i=await hG(t,e,s);if(i.length===0)return null;let o=new Map,a=[];for(let u of i)wG(u.content,u.path,o,a);kG(o,a);let c=o.size,l=!r||n.followDependencies===!1?[]:await oG(r,i,o);return o.size>0?{api:o,entryPath:s,viaDependencies:l,ownSymbols:c,subpaths:dG(r?.exports)}:null}var zi=class extends Error{constructor(n,r){super(`${n}@${r} could not be fetched`);this.packageName=n;this.version=r;this.name="VersionUnavailableError"}packageName;version};function sG(t,e){return H(`${Sc}/${t}@${e}/package.json`)}var iG=8;async function oG(t,e,n){let r={...t?.dependencies,...t?.peerDependencies};if(Object.keys(r).length===0)return[];let s=aG(e,n),i=[];for(let[o,a]of s){if(i.length>=iG)break;let c=r[o];if(!c)continue;let l=await uG(o,c);if(!l)continue;let u=await xc(o,l,{followDependencies:!1}).catch(()=>null);if(!u)continue;let d=0;for(let[p,f]of a.names(u.api)){let m=u.api.get(f);if(!m)continue;let g=a.reExported.has(p)?p:`${o}#${p}`;n.has(g)||(n.set(g,{...xp(m,p),via:o}),d+=1)}d>0&&i.push(`${o}@${l}`)}return i}function aG(t,e){let n=new Map,r=o=>{let a=n.get(o);if(a)return a;let c={named:new Map,star:!1,reExported:new Set,names(l){if(!this.star)return[...this.named];let u=[...l.keys()].map(d=>[d,d]);return[...this.named,...u.filter(([d])=>!this.named.has(d))]}};return n.set(o,c),c},s=[...e.values()].map(o=>o.signature).join(` +`),i=o=>new RegExp(`\\b${Tc(o)}\\b`).test(s);for(let o of t)for(let a of cG(o.content)){if(lG(a.specifier))continue;let c=r(a.specifier);if(a.kind==="export"&&a.star){c.star=!0;continue}for(let l of a.bindings)a.kind==="export"?(c.named.set(l.local,l.imported),c.reExported.add(l.local)):i(l.local)&&c.named.set(l.imported,l.imported)}return n}function cG(t){let e=[],n=/\b(import|export)\s+(?:type\s+)?(?:(\*(?:\s+as\s+\w+)?)|(\{[^}]*\})|(\w+))\s+from\s+['"]([^'"]+)['"]/g;for(let r of t.matchAll(n)){let[,s="",i,o,a,c=""]=r,l=s==="export"?"export":"import";if(i){e.push({kind:l,specifier:c,star:!0,bindings:[]});continue}if(a){e.push({kind:l,specifier:c,star:!1,bindings:[{imported:"default",local:a}]});continue}let u=[];for(let d of(o??"").replace(/[{}]/g,"").split(",")){let p=d.replace(/\btype\s+/g,"").trim();if(!p)continue;let[f,m]=p.split(/\s+as\s+/).map(g=>g.trim());f&&u.push({imported:f,local:m||f})}u.length>0&&e.push({kind:l,specifier:c,star:!1,bindings:u})}return e}function lG(t){return t.startsWith(".")||t.startsWith("/")}async function uG(t,e){return(await H(`${rG}/${t}/resolved?specifier=${encodeURIComponent(e)}`))?.version??null}function dG(t){return!t||typeof t!="object"?[]:Object.keys(t).filter(e=>e.startsWith("./")&&!e.endsWith("package.json")).slice(0,20)}async function pG(t,e,n){if(n){let s=n.types??n.typings??gG(n.exports);if(s){for(let i of mG(Ep(s)))if(await Ec(t,e,i))return i}if(n.main){let i=Ep(n.main).replace(/\.(c|m)?js$/,".d.ts");if(await Ec(t,e,i))return i}}for(let s of fG(t))if(await Ec(t,e,s))return s;let r=t.startsWith("@")?`@types/${t.slice(1).replace("/","__")}`:`@types/${t}`;return await Ec(r,"latest","index.d.ts")?`@types:${r}`:null}function fG(t){return["index.d.ts","dist/index.d.ts","lib/index.d.ts","types/index.d.ts",`types/${t.split("/").pop()?.replace(/^@/,"")||t}.d.ts`]}function mG(t){if(/\.d\.(c|m)?ts$/.test(t))return[t,t.replace(/\.d\.(c|m)?ts$/,".d.ts")];let e=t.replace(/\.(c|m)?[jt]s$/,"").replace(/\/$/,"");return[`${e}.d.ts`,`${e}.d.cts`,`${e}.d.mts`,`${e}/index.d.ts`,t]}function gG(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return null;let e=(n,r)=>{if(r>6||!n)return null;if(typeof n=="string")return r>0?n:null;if(typeof n!="object")return null;let s=n,i=s.types??s.typings;if(typeof i=="string")return i;let o=[".","import","require","default","node"];for(let a of[...o,...Object.keys(s)]){if(!(a in s))continue;let c=e(s[a],r+1);if(c)return c}return null};return e(t,0)}async function hG(t,e,n){if(n.startsWith("@types:")){let a=n.slice(7),c=await ge(`${Sc}/${a}@latest/index.d.ts`);return c?[{path:"index.d.ts",content:c}]:[]}let r=25,s=[],i=new Set,o=[[n]];for(;o.length>0&&s.length!i.has(l));if(a.length===0)continue;let c=null;for(let l of a){i.add(l);let u=await ge(`${Sc}/${t}@${e}/${l}`,{retries:0});if(u){c={path:l,content:u};break}}if(c){s.push(c);for(let l of yG(c.content))o.push(bG(c.path,l))}}return s}function yG(t){let e=new Set,n=/\bexport\s+(?:type\s+)?(?:\*(?:\s+as\s+\w+)?|\{[^}]*\})\s+from\s+['"](\.[^'"]+)['"]/g;for(let r of t.matchAll(n))e.add(r[1]);return[...e]}function bG(t,e){let n=t.includes("/")?t.slice(0,t.lastIndexOf("/")):"",s=Ep(n?`${n}/${e}`:e).replace(/\.(d\.(c|m)?ts|(c|m)?js|(c|m)?ts)$/,"");return[`${s}.d.ts`,`${s}.d.cts`,`${s}.d.mts`,`${s}/index.d.ts`,`${s}/index.d.cts`]}function Ep(t){let e=[];for(let n of t.replace(/^\.\//,"").split("/"))!n||n==="."||(n===".."?e.pop():e.push(n));return e.join("/")}async function Ec(t,e,n){return await ge(`${Sc}/${t}@${e}/${n}`,{retries:0})!==null}function wG(t,e,n=new Map,r=[]){let s=new Map,i=(o,a)=>{let c=o.get(a.name);c&&c.kind===a.kind?(c.signature=`${c.signature} | ${a.signature}`,c.members=[...new Set([...c.members,...a.members])],c.requiredMembers=[...new Set([...c.requiredMembers,...a.requiredMembers])]):c||o.set(a.name,a)};for(let o of SG(t))i(s,o.entry),o.exported&&i(n,o.entry);return vG(t,s,n,r),EG(t,s,n),n}function vG(t,e,n,r){let s=/\bexport\s+(?:type\s+)?\{([^}]+)\}(?:\s+from\s+['"][^'"]+['"])?\s*;/g;for(let i of t.matchAll(s))for(let{exported:o,local:a}of _G(i[1]??"")){if(n.has(o))continue;let c=e.get(a);c?n.set(o,xp(c,o)):r.push({exported:o,local:a})}}function kG(t,e){for(let n of e){if(t.has(n.exported))continue;let r=t.get(n.local);r&&t.set(n.exported,xp(r,n.exported))}}function EG(t,e,n){for(let r of t.matchAll(/\bexport\s*=\s*([A-Za-z_$][\w$]*)\s*;/g)){let s=r[1];for(let i of e.values())i.name!==s&&!i.name.startsWith(`${s}.`)||n.has(i.name)||n.set(i.name,i)}}function xp(t,e){return{...t,name:e,signature:t.signature.replace(new RegExp(`\\b${Tc(t.name)}\\b`,"g"),e)}}function Tc(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Tp(t){return t.replace(/\/\*(?:[^*]|\*(?!\/))*\*\//g,"").replace(/\/\/[^\n]*/g,"").replace(/\s+/g," ").trim()}function SG(t){let e=[];return vp(t,/\b(export\s+)?(?:declare\s+)?function\s+([A-Za-z_$][\w$]*)(?:<[^>{}]*>)?\s*\(/g,"function",e),vp(t,/\b(export\s+)?(?:declare\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\b/g,"variable",e),vp(t,/\b(export\s+)?(?:declare\s+)?type\s+([A-Za-z_$][\w$]*)\b/g,"type",e),kp(t,/\b(export\s+)?(?:declare\s+)?class\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"class",e),kp(t,/\b(export\s+)?(?:declare\s+)?interface\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"interface",e),kp(t,/\b(export\s+)?(?:declare\s+)?enum\s+([A-Za-z_$][\w$]*)(?![\w$])[^{;]*\{/g,"enum",e),tE(t,"",!1,e),e}function tE(t,e,n,r){let s=/\b(export\s+)?(?:declare\s+)?(?:namespace|module)\s+([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\{/g;for(let i=s.exec(t);i;i=s.exec(t)){let o=t.indexOf("{",i.index),a=mr(t,o);if(o<0||a<0)continue;let c=n||!!i[1],l=e?`${e}.${i[2]}`:i[2],u=t.slice(o+1,a);r.push({exported:c,entry:{name:l,kind:"namespace",signature:`namespace ${l}`,members:TG(u),requiredMembers:[]}}),xG(u,l,c,r),tE(u,l,c,r),s.lastIndex=a+1}}function xG(t,e,n,r){let s=nE(t),i=(o,a,c,l=[],u=[])=>{r.push({exported:n,entry:{name:`${e}.${o}`,kind:a,signature:Tp(c.replace(new RegExp(`\\b${Tc(o)}\\b`),`${e}.${o}`)),members:l,requiredMembers:u}})};for(let o of s.matchAll(/\b(?:declare\s+)?function\s+([A-Za-z_$][\w$]*)(?:<[^>{}]*>)?\s*\(/g)){let a=o.index??0;i(o[1],"function",s.slice(a,xn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\b/g)){let a=o.index??0;i(o[1],"variable",s.slice(a,xn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?type\s+([A-Za-z_$][\w$]*)\b/g)){let a=o.index??0;i(o[1],"type",s.slice(a,xn(s,a)))}for(let o of s.matchAll(/\b(?:declare\s+)?class\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=mr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"",d=Sp(u,!0);i(o[1],"class",s.slice(a,c>=0?c:xn(s,a)),d.map(p=>p.name),d.filter(p=>p.required).map(p=>p.name))}for(let o of s.matchAll(/\b(?:declare\s+)?interface\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=mr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"",d=Sp(u,!1);i(o[1],"interface",s.slice(a,c>=0?c:xn(s,a)),d.map(p=>p.name),d.filter(p=>p.required).map(p=>p.name))}for(let o of s.matchAll(/\b(?:declare\s+)?enum\s+([A-Za-z_$][\w$]*)[^{;]*\{/g)){let a=o.index??0,c=s.indexOf("{",a),l=mr(s,c),u=c>=0&&l>c?s.slice(c+1,l):"";i(o[1],"enum",s.slice(a,c>=0?c:xn(s,a)),rE(u).map(d=>d.name))}}function nE(t){let e=[],n=/\b(?:export\s+)?(?:declare\s+)?(?:namespace|module)\s+[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\s*\{/g;for(let s of t.matchAll(n)){let i=t.indexOf("{",s.index),o=mr(t,i);i>=0&&o>=0&&e.push([s.index??0,o+1])}if(e.length===0)return t;let r=[...t];for(let[s,i]of e)for(let o=s;o=0?a+1:xn(t,i),l=o>=0&&a>o?t.slice(o+1,a):"",u=n==="enum"?rE(l):Sp(l,n==="class");r.push({exported:!!s[1],entry:{name:s[2],kind:n,signature:Tp(t.slice(i,o>=0?o:c)),members:u.map(d=>d.name),requiredMembers:u.filter(d=>d.required).map(d=>d.name)}})}}function xn(t,e){let n=t.indexOf(";",e),r=t.indexOf("{",e);if(r>=0&&(n<0||r=0?s+1:t.length}return n>=0?n+1:t.length}function mr(t,e){if(e<0)return-1;let n=0;for(let r=e;r/^[\s\n]*([A-Za-z_$][\w$]*)/.exec(e)?.[1]).filter(e=>!!e).map(e=>({name:e,required:!1}))}function Sp(t,e){let n=[],r=/(?:^|[;\n])\s*((?:public|protected|private|readonly|static|abstract|declare|override)\s+)*(#?[A-Za-z_$][\w$]*)(\?)?\s*(\(|:)/g;for(let s of t.matchAll(r)){let i=s[1]??"",o=s[2];o==="constructor"||i.includes("private")||o.startsWith("#")||n.push({name:o,required:e?s[4]===":"&&!s[3]:!s[3]})}return n}function _G(t){let e=[];for(let n of t.split(",")){let r=n.replace(/\btype\s+/g,"").trim();if(!r)continue;let[s,i]=r.split(/\s+as\s+/).map(o=>o.trim());s&&e.push({local:s,exported:i||s})}return e}function $G(t,e){let n=r=>r==="variable"||r==="function";return n(t)&&n(e)}function sE(t,e,n){if(e.api.size<20)return null;let s=0;for(let a of e.api.keys())n.api.has(a)&&(s+=1);if(s>e.api.size*.1||n.api.size>e.api.size*.1)return null;let i=n.subpaths.filter(a=>a!=="."),o=i.length>0?` The new version publishes ${i.length} other entry point${i.length===1?"":"s"}: ${i.join(", ")}. Import from the one that carries the API you use, rather than replacing the symbols individually.`:" Nothing in the new version publishes the old symbols under the old import path.";return{kind:"entry-point-moved",symbol:t,detail:`Importing \`${t}\` no longer gives you its API: the root entry point went from ${e.api.size} exported symbols to ${n.api.size}.${o}`,before:`${e.entryPath} \u2014 ${e.api.size} exports`,after:`${n.entryPath} \u2014 ${n.api.size} exports`}}function We(t,e){let n=[];for(let[r,s]of t){let i=e.get(r),o=s.name,a=s.via?` (declared in ${s.via})`:"";if(!i){n.push({kind:"export-removed",symbol:o,detail:`\`${o}\` is no longer exported (was a ${s.kind})${a}.`,before:s.signature});continue}if(s.kind!==i.kind&&!$G(s.kind,i.kind)){n.push({kind:"kind-changed",symbol:o,detail:`\`${o}\` changed from a ${s.kind} to a ${i.kind}${a}.`,before:s.signature,after:i.signature});continue}for(let l of s.members)i.members.includes(l)||n.push({kind:"member-removed",symbol:`${o}.${l}`,detail:`\`${o}.${l}\` was removed${a}.`});let c=new Set(s.requiredMembers);for(let l of i.requiredMembers)!c.has(l)&&s.members.includes(l)&&n.push({kind:"member-now-required",symbol:`${o}.${l}`,detail:`\`${o}.${l}\` is now required; it was previously optional${a}.`});s.signature!==i.signature&&s.kind!=="interface"&&s.kind!=="class"&&!RG(s.signature,i.signature)&&n.push({kind:"signature-changed",symbol:o,detail:`The signature of \`${o}\` changed${a}.`,before:s.signature,after:i.signature})}return n}function RG(t,e){if(t===e)return!0;let n=eE(t);return n===eE(e)&&n!==null}function eE(t){let e=CG(t);if(e.length===0)return null;let n=t;return e.forEach((r,s)=>{n=n.replace(new RegExp(`\\b${Tc(r)}\\b`,"g"),`\0T${s}`)}),n}function CG(t){let e=[];for(let n=0;n"&&(n-=1,n===0))return r;return-1}function PG(t){let e=[],n=0,r="";for(let s of t){if("<([{".includes(s)?n+=1:">)]}".includes(s)&&(n-=1),s===","&&n===0){e.push(r),r="";continue}r+=s}return r.trim()&&e.push(r),e}var Oc=require("node:fs/promises"),vS=require("node:os"),kS=require("node:path");var iE=require("node:child_process"),IG=18e4,OG=32*1024*1024,It=(t,e,n={})=>new Promise(r=>{(0,iE.execFile)(t,[...e],{cwd:n.cwd,timeout:n.timeoutMs??IG,maxBuffer:n.maxBuffer??OG,env:n.env??process.env,windowsHide:!0,encoding:"utf8"},(s,i,o)=>{if(!s){r({code:0,stdout:i,stderr:o});return}let a=s;r({code:typeof a.code=="number"?a.code:1,stdout:i??"",stderr:o??String(s.message??""),failure:a.code==="ENOENT"?"not-found":a.killed?"timeout":"error"})})});async function _c(t,e,n=["--version"]){let r=await t(e,n,{timeoutMs:2e4});return r.failure!=="not-found"&&r.code===0}var Ki=require("node:fs/promises"),Hi=require("node:path");function j(t,e,n,r,s){return{available:!1,reason:e,detail:n,...r?{remedy:r}:{},...s?{install:s}:{},tool:t}}var gr="cargo public-api",DG="Install Rust and Cargo with rustup, or make sure `cargo` is on PATH.",MG={id:"cargo-public-api",label:"Install cargo-public-api",command:"cargo",args:["install","cargo-public-api"]},NG="Drift can install the missing `cargo-public-api` helper for you after approval.",lE={ecosystem:"cargo",tool:gr,weight:1,async compute(t){if(!await cE(t.exec,"cargo",["--version"],t.env))return j(gr,"tool-missing",`The Rust Cargo toolchain is not installed or is not on PATH, so ${t.name}'s public API could not be compared directly.`,DG);if(!await cE(t.exec,"cargo",["public-api","--version"],t.env))return j(gr,"tool-missing",`Rust and Cargo are installed, but Drift's Rust API helper is missing. ${t.name}'s public API could not be compared directly.`,NG,MG);let e=await oE(t,t.from);if(!e.ok)return e.failure;let n=await oE(t,t.to);return n.ok?{available:!0,changes:We(e.api,n.api),tool:gr,weight:1,locator:`${t.name} ${t.from} \u2192 ${t.to} (rustdoc JSON)`}:n.failure}};async function oE(t,e){let n=(0,Hi.join)(t.workdir,`probe-${e}`);try{await(0,Ki.mkdir)((0,Hi.join)(n,"src"),{recursive:!0}),await(0,Ki.writeFile)((0,Hi.join)(n,"Cargo.toml"),LG(t.name,e),"utf8"),await(0,Ki.writeFile)((0,Hi.join)(n,"src","lib.rs"),"","utf8")}catch(i){return{ok:!1,failure:j(gr,"toolchain-failed",`Could not prepare a scratch crate: ${i.message}`)}}let r=await t.exec("cargo",["public-api","--simplified","--package",t.name],{cwd:n,timeoutMs:t.timeoutMs,env:t.env});if(r.code!==0){let i=/could not find|no matching package|failed to select a version/i.test(r.stderr);return{ok:!1,failure:j(gr,i?"version-unavailable":"toolchain-failed",i?`crates.io has no ${t.name} ${e}; it may have been yanked, or the crate may be private.`:`\`cargo public-api\` failed on ${t.name} ${e}: ${qG(r.stderr)}`)}}let s=uE(r.stdout);return s.size===0?{ok:!1,failure:j(gr,"no-public-surface",`${t.name} ${e} exposes no public items that \`cargo public-api\` could read.`)}:{ok:!0,api:s}}function LG(t,e){return["[package]",'name = "drift-surface-probe"','version = "0.0.0"','edition = "2021"',"","[dependencies]",`${aE(t)} = "=${aE(e)}"`,"","[workspace]"].join(` +`)}var GG={fn:"function",struct:"class",enum:"enum",trait:"interface",type:"type",const:"variable",static:"variable",mod:"namespace",union:"class",macro:"function"};function uE(t,e=new Map){for(let n of t.split(` +`)){let r=n.trim();if(!r||!r.startsWith("pub "))continue;let s=/^pub\s+(?:unsafe\s+|async\s+|extern\s+"[^"]*"\s+)*([a-z]+)\s+(.+)$/.exec(r);if(!s)continue;let i=GG[s[1]];if(!i)continue;let o=FG(s[2]);if(!o)continue;let a=e.get(jG(o)??"");if(a&&a.kind!=="namespace"){let l=o.slice(a.name.length+2);a.members.includes(l)||a.members.push(l);continue}let c=e.get(o);if(c){c.signature=`${c.signature} | ${r}`;continue}e.set(o,{name:o,kind:i,signature:r,members:[],requiredMembers:[]})}return e}function FG(t){return/^[A-Za-z_]\w*(?:::[A-Za-z_]\w*)*/.exec(t)?.[0]??null}function jG(t){let e=t.lastIndexOf("::");return e===-1?null:t.slice(0,e)}function aE(t){return t.replace(/["\\]/g,"")}function qG(t){return t.split(` +`).find(e=>e.trim().length>0)?.trim()??"no output"}async function cE(t,e,n,r){let s=await t(e,n,{timeoutMs:2e4,env:r});return s.failure!=="not-found"&&s.code===0}var yr=require("node:fs/promises"),_E=require("node:os"),Yi=require("node:path");var dE=`// Drift's Go exported-API extractor. // // Reads one module version out of the Go module cache and prints its exported // API as JSON. Standard library only, on purpose: this runs inside a scratch @@ -711,14 +711,14 @@ func addUnique(list []string, value string) []string { } return append(list, value) } -`;function Fk(t){let e;try{e=JSON.parse(t.trim())}catch{return null}if(!e||typeof e!="object")return null;let n=e;if(!Array.isArray(n.Symbols)||!Array.isArray(n.Packages))return null;let r=new Map;for(let s of n.Symbols){let i=typeof s.Key=="string"?s.Key:null;i&&r.set(i,{key:i,name:dr(s.Name),pkg:dr(s.Pkg),pkgName:dr(s.PkgName),kind:dr(s.Kind)||"variable",signatures:hs(s.Signatures),members:hs(s.Members),requiredMembers:hs(s.RequiredMembers),platforms:hs(s.Platforms)})}return{module:dr(n.Module),packages:hs(n.Packages),symbols:r,failures:Array.isArray(n.Failures)?n.Failures.map(s=>({pkg:dr(s.Pkg),error:dr(s.Error)})):[],platforms:hs(n.Platforms)}}function dr(t){return typeof t=="string"?t:""}function hs(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}var Nk=8,Lk=200,Gk={"package-removed":0,"export-removed":1,"kind-changed":2,"member-removed":3,"member-now-required":4,"signature-changed":5,"constant-value-changed":6};function qk(t,e){let n=[],r=[],s=new Set(t.packages),i=new Set(e.packages),o=t.packages.filter(u=>!i.has(u));for(let u of o)n.push({kind:"package-removed",symbol:u,detail:`The package \`${u}\` no longer exists. Every import of it must move to its replacement \u2014 do not re-implement the symbols it exported.`});for(let u of e.packages)s.has(u)||r.push({kind:"package-added",symbol:u});let a=new Set(o),c=[];for(let[u,d]of t.symbols){if(a.has(d.pkg))continue;let p=e.symbols.get(u),f=jk(d);if(!p){if(tG(d,t,e))continue;n.push({kind:"export-removed",symbol:f,detail:`\`${f}\` is no longer exported (was a ${np(d.kind)}).`,before:d.signatures[0]});continue}if(d.kind!==p.kind){n.push({kind:"kind-changed",symbol:f,detail:`\`${f}\` changed from a ${np(d.kind)} to a ${np(p.kind)}.`,before:d.signatures[0],after:p.signatures[0]});continue}let m=d.platforms.filter(y=>!p.platforms.includes(y));m.length>0&&p.platforms.length>0&&n.push({kind:"export-removed",symbol:f,detail:`\`${f}\` is no longer available on ${m.join(", ")}; it remains on ${p.platforms.join(", ")}.`,before:d.signatures[0]});for(let y of d.members)p.members.includes(y)||n.push({kind:"member-removed",symbol:`${f}.${y}`,detail:d.kind==="interface"?`The method \`${y}\` was removed from the interface \`${f}\`.`:`\`${f}.${y}\` was removed.`});if(d.kind==="interface")for(let y of p.requiredMembers)d.requiredMembers.includes(y)||n.push({kind:"member-now-required",symbol:`${f}.${y}`,detail:`The interface \`${f}\` now requires a \`${y}\` method. Any type in this repository that implements \`${f}\` must gain one.`,after:e.symbols.get(`${p.pkg}.${p.name}.${y}`)?.signatures[0]});let g=d.signatures.join(" | "),h=p.signatures.join(" | ");if(g!==h){if(nG(d.signatures,p.signatures)){c.push(`${f}: ${g} \u2192 ${h}`);continue}n.push({kind:"signature-changed",symbol:f,detail:`The signature of \`${f}\` changed.`,before:g,after:h})}}for(let[u,d]of e.symbols)t.symbols.has(u)||!s.has(d.pkg)||r.push({kind:"export-added",symbol:jk(d)});if(c.length>0&&c.length<=Nk)for(let u of c){let[d,p]=Bi(u,": ");n.push({kind:"constant-value-changed",symbol:d,detail:`The constant \`${d}\` changed value.`,before:Bi(p," \u2192 ")[0],after:Bi(p," \u2192 ")[1]})}else c.length>Nk&&n.push({kind:"constant-value-changed",symbol:`${t.module} constants`,detail:`${c.length} exported constants changed value. This is usually a regenerated platform header rather than a deliberate API change, but code that compares against a literal copy of one of these values will now disagree.`,after:c.slice(0,10).join("; ")});n.sort((u,d)=>(Gk[u.kind]??9)-(Gk[d.kind]??9));let l=Math.max(0,n.length-Lk);return{changes:n.slice(0,Lk),additions:r,omitted:l}}function tG(t,e,n){let r=t.name.lastIndexOf(".");if(r<=0)return!1;let s=`${t.pkg}.${t.name.slice(0,r)}`;return e.symbols.has(s)&&n.symbols.has(s)}function jk(t){return t.pkgName?`${t.pkgName}.${t.name}`:t.name}function np(t){switch(t){case"class":return"struct";case"function":return"function";case"interface":return"interface";case"variable":return"constant or variable";default:return"type"}}function nG(t,e){if(t.length!==1||e.length!==1)return!1;let[n,r]=[t[0],e[0]];return!n.startsWith("const ")||!r.startsWith("const ")?!1:Bi(n," = ")[0]===Bi(r," = ")[0]}function Bi(t,e){let n=t.indexOf(e);return n<0?[t,""]:[t.slice(0,n),t.slice(n+e.length)]}var rG="1.24",sG=["linux/amd64","darwin/arm64","windows/amd64"];function Uk(){let t=[...sG],e=`${iG()}/${oG()}`;return t.includes(e)?t:[...t,e]}function iG(){switch(process.platform){case"win32":return"windows";case"darwin":return"darwin";default:return"linux"}}function oG(){switch(process.arch){case"x64":return"amd64";case"arm64":return"arm64";case"arm":return"arm";default:return"amd64"}}async function Bk(t,e){let n=await t("go",["version"],{timeoutMs:2e4,...e?{env:e}:{}});if(n.failure==="not-found"||n.code!==0)return{available:!1};let r=/go(\d+\.\d+(?:\.\d+)?)/.exec(n.stdout)?.[1],s=await t("go",["env","GOMODCACHE"],{timeoutMs:2e4,...e?{env:e}:{}}),i=s.code===0?s.stdout.trim():"";return{available:!0,...r?{version:r}:{},...i?{moduleCache:i}:{}}}async function Vk(t,e=aG){if(t)for(let n of e){let r=await t(n).catch(()=>null);if(!r)continue;let s=n.endsWith(".yml")||n.endsWith(".yaml")?lG(r):cG(r);if(s)return{version:s,source:n}}return{version:rG,source:"Drift default"}}var aG=["go.work","go.mod",".github/workflows/go.yml",".github/workflows/ci.yml",".github/workflows/test.yml",".github/workflows/build.yml"];function cG(t){let e=/^\s*toolchain\s+go(\d+\.\d+(?:\.\d+)?)/m.exec(t)?.[1];return e||(/^\s*go\s+(\d+\.\d+(?:\.\d+)?)/m.exec(t)?.[1]??null)}function lG(t){let e=/go-version(?:-file)?\s*:\s*['"]?(\d+\.\d+(?:\.\d+|\.x)?)/.exec(t)?.[1];return e?e.replace(/\.x$/,""):null}function Wk(t,e){let n=t.version;return e?`Add \`actions/setup-go\` with \`go-version: '${n}'\` to the Drift workflow, before the Drift step, to install Go ${n} and enable exported-API comparison.`:`Install Go ${n} and make \`go\` available on PATH, or configure \`go-version\` in the Drift workflow, to enable exported-API comparison.`}function zk(){return process.env.GITHUB_ACTIONS==="true"}var En="go (go/build + go/parser)",Zk={ecosystem:"go",tool:En,weight:1,async compute(t){let e=await Vk(t.readRepoFile);if(!(await Bk(t.exec,t.env)).available)return G(En,"tool-missing",`The Go toolchain is not installed, so ${t.name}'s exported API could not be compared.`,Wk(e,zk()));let r=await dG(t.exec,t.logger,t.env);if(!r)return G(En,"toolchain-failed",`Drift could not prepare a scratch Go module to run its API extractor in, so ${t.name} could not be compared.`);let s=Uk(),i=await Kk(t,r,t.from,s,e);if("failure"in i)return i.failure;let o=await Kk(t,r,t.to,s,e);if("failure"in o)return o.failure;let{changes:a,additions:c,omitted:l}=qk(i.api,o.api),u=new Set([...i.api.failures,...o.api.failures].map(d=>d.pkg));return u.size>0&&t.logger.debug(`${t.name}: ${u.size} package(s) could not be parsed and were skipped`),{available:!0,changes:a,tool:En,weight:1,locator:uG(t,i.api,o.api,s,u.size,l),additions:c}}};function uG(t,e,n,r,s,i){let o=[`${t.name} ${t.from} \u2192 ${t.to}`,`${n.packages.length} package(s), ${n.symbols.size} exported symbol(s)`,`platforms: ${r.join(", ")}`];return e.packages.length!==n.packages.length&&o.push(`${e.packages.length} package(s) before`),s>0&&o.push(`${s} package(s) unparseable and skipped`),i>0&&o.push(`${i} further finding(s) not listed`),o.join(" \xB7 ")}var Hk=new Map;async function Kk(t,e,n,r,s){let i=n.startsWith("v")?n:`v${n}`,o=`${t.name}@${i}|${r.join(",")}`,a=Hk.get(o);if(a)return{api:a};let c=await t.exec("go",["mod","download","-json",`${t.name}@${i}`],{cwd:e,timeoutMs:t.timeoutMs,env:rp(t.env)}),l=Xk(c.stdout);if(!l){let p=`${c.stderr} -${c.stdout}`,f=/unknown revision|invalid version|no matching versions|404 Not Found|does not contain package/i.test(p);return{failure:G(En,f?"version-unavailable":"toolchain-failed",f?`The Go module proxy has no ${t.name} ${i}, so there was nothing to compare against. It may be retracted, or the module may be private.`:`\`go mod download ${t.name}@${i}\` failed: ${sp(p)}`)}}let u=await t.exec("go",["run","apidump.go","-dir",l,"-module",t.name,"-platforms",r.join(",")],{cwd:e,timeoutMs:t.timeoutMs,env:rp(t.env)});if(u.code!==0)return{failure:G(En,"toolchain-failed",`Drift's API extractor could not run under the installed Go toolchain (${s.source} asks for Go ${s.version}): ${sp(u.stderr)}`)};let d=Fk(u.stdout);return d?d.symbols.size===0?{failure:G(En,"no-public-surface",`${t.name} ${i} exports nothing from any importable package on ${r.join(", ")}, so there is no API to compare.`)}:(Hk.set(o,d),{api:d}):{failure:G(En,"parse-failed",`Drift could not read its own API extractor's output for ${t.name} ${i}.`)}}function Xk(t){let e=t.indexOf("{");if(e<0)return null;try{let n=JSON.parse(t.slice(e,t.lastIndexOf("}")+1));return n.Dir&&!n.Error?n.Dir:null}catch{return/"Dir":\s*"((?:[^"\\]|\\.)*)"/.exec(t)?.[1]?.replace(/\\(.)/g,"$1")??null}}var Jk=new Map;function dG(t,e,n){let r=n?.PATH??process.env.PATH??"",s=Jk.get(r);return s??=(async()=>{try{let i=await(0,pr.mkdtemp)((0,Vi.join)((0,Yk.tmpdir)(),"drift-go-apidump-"));await(0,pr.mkdir)(i,{recursive:!0}),await(0,pr.writeFile)((0,Vi.join)(i,"go.mod"),`module driftapidump +`;function hE(t){let e;try{e=JSON.parse(t.trim())}catch{return null}if(!e||typeof e!="object")return null;let n=e;if(!Array.isArray(n.Symbols)||!Array.isArray(n.Packages))return null;let r=new Map;for(let s of n.Symbols){let i=typeof s.Key=="string"?s.Key:null;i&&r.set(i,{key:i,name:hr(s.Name),pkg:hr(s.Pkg),pkgName:hr(s.PkgName),kind:hr(s.Kind)||"variable",signatures:Ss(s.Signatures),members:Ss(s.Members),requiredMembers:Ss(s.RequiredMembers),platforms:Ss(s.Platforms)})}return{module:hr(n.Module),packages:Ss(n.Packages),symbols:r,failures:Array.isArray(n.Failures)?n.Failures.map(s=>({pkg:hr(s.Pkg),error:hr(s.Error)})):[],platforms:Ss(n.Platforms)}}function hr(t){return typeof t=="string"?t:""}function Ss(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}var pE=8,fE=200,mE={"package-removed":0,"export-removed":1,"kind-changed":2,"member-removed":3,"member-now-required":4,"signature-changed":5,"constant-value-changed":6};function yE(t,e){let n=[],r=[],s=new Set(t.packages),i=new Set(e.packages),o=t.packages.filter(u=>!i.has(u));for(let u of o)n.push({kind:"package-removed",symbol:u,detail:`The package \`${u}\` no longer exists. Every import of it must move to its replacement \u2014 do not re-implement the symbols it exported.`});for(let u of e.packages)s.has(u)||r.push({kind:"package-added",symbol:u});let a=new Set(o),c=[];for(let[u,d]of t.symbols){if(a.has(d.pkg))continue;let p=e.symbols.get(u),f=gE(d);if(!p){if(UG(d,t,e))continue;n.push({kind:"export-removed",symbol:f,detail:`\`${f}\` is no longer exported (was a ${_p(d.kind)}).`,before:d.signatures[0]});continue}if(d.kind!==p.kind){n.push({kind:"kind-changed",symbol:f,detail:`\`${f}\` changed from a ${_p(d.kind)} to a ${_p(p.kind)}.`,before:d.signatures[0],after:p.signatures[0]});continue}let m=d.platforms.filter(y=>!p.platforms.includes(y));m.length>0&&p.platforms.length>0&&n.push({kind:"export-removed",symbol:f,detail:`\`${f}\` is no longer available on ${m.join(", ")}; it remains on ${p.platforms.join(", ")}.`,before:d.signatures[0]});for(let y of d.members)p.members.includes(y)||n.push({kind:"member-removed",symbol:`${f}.${y}`,detail:d.kind==="interface"?`The method \`${y}\` was removed from the interface \`${f}\`.`:`\`${f}.${y}\` was removed.`});if(d.kind==="interface")for(let y of p.requiredMembers)d.requiredMembers.includes(y)||n.push({kind:"member-now-required",symbol:`${f}.${y}`,detail:`The interface \`${f}\` now requires a \`${y}\` method. Any type in this repository that implements \`${f}\` must gain one.`,after:e.symbols.get(`${p.pkg}.${p.name}.${y}`)?.signatures[0]});let g=d.signatures.join(" | "),h=p.signatures.join(" | ");if(g!==h){if(BG(d.signatures,p.signatures)){c.push(`${f}: ${g} \u2192 ${h}`);continue}n.push({kind:"signature-changed",symbol:f,detail:`The signature of \`${f}\` changed.`,before:g,after:h})}}for(let[u,d]of e.symbols)t.symbols.has(u)||!s.has(d.pkg)||r.push({kind:"export-added",symbol:gE(d)});if(c.length>0&&c.length<=pE)for(let u of c){let[d,p]=Ji(u,": ");n.push({kind:"constant-value-changed",symbol:d,detail:`The constant \`${d}\` changed value.`,before:Ji(p," \u2192 ")[0],after:Ji(p," \u2192 ")[1]})}else c.length>pE&&n.push({kind:"constant-value-changed",symbol:`${t.module} constants`,detail:`${c.length} exported constants changed value. This is usually a regenerated platform header rather than a deliberate API change, but code that compares against a literal copy of one of these values will now disagree.`,after:c.slice(0,10).join("; ")});n.sort((u,d)=>(mE[u.kind]??9)-(mE[d.kind]??9));let l=Math.max(0,n.length-fE);return{changes:n.slice(0,fE),additions:r,omitted:l}}function UG(t,e,n){let r=t.name.lastIndexOf(".");if(r<=0)return!1;let s=`${t.pkg}.${t.name.slice(0,r)}`;return e.symbols.has(s)&&n.symbols.has(s)}function gE(t){return t.pkgName?`${t.pkgName}.${t.name}`:t.name}function _p(t){switch(t){case"class":return"struct";case"function":return"function";case"interface":return"interface";case"variable":return"constant or variable";default:return"type"}}function BG(t,e){if(t.length!==1||e.length!==1)return!1;let[n,r]=[t[0],e[0]];return!n.startsWith("const ")||!r.startsWith("const ")?!1:Ji(n," = ")[0]===Ji(r," = ")[0]}function Ji(t,e){let n=t.indexOf(e);return n<0?[t,""]:[t.slice(0,n),t.slice(n+e.length)]}var VG="1.24",WG=["linux/amd64","darwin/arm64","windows/amd64"];function bE(){let t=[...WG],e=`${zG()}/${HG()}`;return t.includes(e)?t:[...t,e]}function zG(){switch(process.platform){case"win32":return"windows";case"darwin":return"darwin";default:return"linux"}}function HG(){switch(process.arch){case"x64":return"amd64";case"arm64":return"arm64";case"arm":return"arm";default:return"amd64"}}async function wE(t,e){let n=await t("go",["version"],{timeoutMs:2e4,...e?{env:e}:{}});if(n.failure==="not-found"||n.code!==0)return{available:!1};let r=/go(\d+\.\d+(?:\.\d+)?)/.exec(n.stdout)?.[1],s=await t("go",["env","GOMODCACHE"],{timeoutMs:2e4,...e?{env:e}:{}}),i=s.code===0?s.stdout.trim():"";return{available:!0,...r?{version:r}:{},...i?{moduleCache:i}:{}}}async function vE(t,e=KG){if(t)for(let n of e){let r=await t(n).catch(()=>null);if(!r)continue;let s=n.endsWith(".yml")||n.endsWith(".yaml")?YG(r):JG(r);if(s)return{version:s,source:n}}return{version:VG,source:"Drift default"}}var KG=["go.work","go.mod",".github/workflows/go.yml",".github/workflows/ci.yml",".github/workflows/test.yml",".github/workflows/build.yml"];function JG(t){let e=/^\s*toolchain\s+go(\d+\.\d+(?:\.\d+)?)/m.exec(t)?.[1];return e||(/^\s*go\s+(\d+\.\d+(?:\.\d+)?)/m.exec(t)?.[1]??null)}function YG(t){let e=/go-version(?:-file)?\s*:\s*['"]?(\d+\.\d+(?:\.\d+|\.x)?)/.exec(t)?.[1];return e?e.replace(/\.x$/,""):null}function kE(t,e){let n=t.version;return e?`Add \`actions/setup-go\` with \`go-version: '${n}'\` to the Drift workflow, before the Drift step, to install Go ${n} and enable exported-API comparison.`:`Install Go ${n} and make \`go\` available on PATH, or configure \`go-version\` in the Drift workflow, to enable exported-API comparison.`}function EE(){return process.env.GITHUB_ACTIONS==="true"}var Tn="go (go/build + go/parser)",$E={ecosystem:"go",tool:Tn,weight:1,async compute(t){let e=await vE(t.readRepoFile);if(!(await wE(t.exec,t.env)).available)return j(Tn,"tool-missing",`The Go toolchain is not installed, so ${t.name}'s exported API could not be compared.`,kE(e,EE()));let r=await XG(t.exec,t.logger,t.env);if(!r)return j(Tn,"toolchain-failed",`Drift could not prepare a scratch Go module to run its API extractor in, so ${t.name} could not be compared.`);let s=bE(),i=await xE(t,r,t.from,s,e);if("failure"in i)return i.failure;let o=await xE(t,r,t.to,s,e);if("failure"in o)return o.failure;let{changes:a,additions:c,omitted:l}=yE(i.api,o.api),u=new Set([...i.api.failures,...o.api.failures].map(d=>d.pkg));return u.size>0&&t.logger.debug(`${t.name}: ${u.size} package(s) could not be parsed and were skipped`),{available:!0,changes:a,tool:Tn,weight:1,locator:ZG(t,i.api,o.api,s,u.size,l),additions:c}}};function ZG(t,e,n,r,s,i){let o=[`${t.name} ${t.from} \u2192 ${t.to}`,`${n.packages.length} package(s), ${n.symbols.size} exported symbol(s)`,`platforms: ${r.join(", ")}`];return e.packages.length!==n.packages.length&&o.push(`${e.packages.length} package(s) before`),s>0&&o.push(`${s} package(s) unparseable and skipped`),i>0&&o.push(`${i} further finding(s) not listed`),o.join(" \xB7 ")}var SE=new Map;async function xE(t,e,n,r,s){let i=n.startsWith("v")?n:`v${n}`,o=`${t.name}@${i}|${r.join(",")}`,a=SE.get(o);if(a)return{api:a};let c=await t.exec("go",["mod","download","-json",`${t.name}@${i}`],{cwd:e,timeoutMs:t.timeoutMs,env:$p(t.env)}),l=RE(c.stdout);if(!l){let p=`${c.stderr} +${c.stdout}`,f=/unknown revision|invalid version|no matching versions|404 Not Found|does not contain package/i.test(p);return{failure:j(Tn,f?"version-unavailable":"toolchain-failed",f?`The Go module proxy has no ${t.name} ${i}, so there was nothing to compare against. It may be retracted, or the module may be private.`:`\`go mod download ${t.name}@${i}\` failed: ${Rp(p)}`)}}let u=await t.exec("go",["run","apidump.go","-dir",l,"-module",t.name,"-platforms",r.join(",")],{cwd:e,timeoutMs:t.timeoutMs,env:$p(t.env)});if(u.code!==0)return{failure:j(Tn,"toolchain-failed",`Drift's API extractor could not run under the installed Go toolchain (${s.source} asks for Go ${s.version}): ${Rp(u.stderr)}`)};let d=hE(u.stdout);return d?d.symbols.size===0?{failure:j(Tn,"no-public-surface",`${t.name} ${i} exports nothing from any importable package on ${r.join(", ")}, so there is no API to compare.`)}:(SE.set(o,d),{api:d}):{failure:j(Tn,"parse-failed",`Drift could not read its own API extractor's output for ${t.name} ${i}.`)}}function RE(t){let e=t.indexOf("{");if(e<0)return null;try{let n=JSON.parse(t.slice(e,t.lastIndexOf("}")+1));return n.Dir&&!n.Error?n.Dir:null}catch{return/"Dir":\s*"((?:[^"\\]|\\.)*)"/.exec(t)?.[1]?.replace(/\\(.)/g,"$1")??null}}var TE=new Map;function XG(t,e,n){let r=n?.PATH??process.env.PATH??"",s=TE.get(r);return s??=(async()=>{try{let i=await(0,yr.mkdtemp)((0,Yi.join)((0,_E.tmpdir)(),"drift-go-apidump-"));await(0,yr.mkdir)(i,{recursive:!0}),await(0,yr.writeFile)((0,Yi.join)(i,"go.mod"),`module driftapidump go 1.21 -`,"utf8"),await(0,pr.writeFile)((0,Vi.join)(i,"apidump.go"),Mk,"utf8");let o=await t("go",["build","-o",(0,Vi.join)(i,"apidump-check"),"."],{cwd:i,timeoutMs:12e4,env:rp(n)});return o.code!==0?(e.debug(`Drift's Go API extractor failed to build: ${sp(o.stderr)}`),null):i}catch(i){return e.debug(`Could not create the Go scratch module: ${i.message}`),null}})(),Jk.set(r,s),s}function rp(t=process.env){return{...t,GOFLAGS:"-mod=mod"}}function sp(t){return t.split(` -`).find(e=>e.trim().length>0)?.trim()??"no output"}var pc=require("node:fs/promises"),eE=require("node:path");var fr="japicmp",pG={id:"japicmp",label:"Install japicmp",command:"brew",args:["install","japicmp"]},fG="Drift can install the missing `japicmp` helper for you after approval.",mG="https://repo1.maven.org/maven2",tE={ecosystem:"maven",tool:fr,weight:1,async compute(t){let e=nE(t.name);if(!e)return G(fr,"unsupported-ecosystem",`\`${t.name}\` is not a \`groupId:artifactId\` coordinate, so Drift could not locate it on Maven Central.`);if(!await dc(t.exec,"japicmp",["--help"]))return G(fr,"tool-missing",`Drift's Java API helper is missing, so ${t.name}'s classfile API could not be compared directly.`,fG,pG);await(0,pc.mkdir)(t.workdir,{recursive:!0});let n=await Qk(e,t.from,t.workdir);if(!n.ok)return n.failure;let r=await Qk(e,t.to,t.workdir);if(!r.ok)return r.failure;let s=await t.exec("japicmp",["-o",n.path,"-n",r.path,"--only-modified","--ignore-missing-classes"],{cwd:t.workdir,timeoutMs:t.timeoutMs});return s.stdout.trim().length===0?G(fr,s.code===0?"no-public-surface":"toolchain-failed",s.code===0?`japicmp found no differences it could read between ${t.name} ${t.from} and ${t.to}.`:`japicmp failed on ${t.name}: ${hG(s.stderr)}`):{available:!0,changes:sE(s.stdout),tool:fr,weight:1,locator:`${t.name} ${t.from} \u2192 ${t.to} (classfiles)`}}};function nE(t){let[e,n]=t.split(":");return!e||!n?null:{groupId:e,artifactId:n}}function rE(t,e){let n=t.groupId.replace(/\./g,"/");return`${mG}/${n}/${t.artifactId}/${e}/${t.artifactId}-${e}.jar`}async function Qk(t,e,n){let r=rE(t,e),s=(0,eE.join)(n,`${t.artifactId}-${e}.jar`);try{let i=await fetch(r,{signal:AbortSignal.timeout(6e4)});return i.ok?(await(0,pc.writeFile)(s,Buffer.from(await i.arrayBuffer())),{ok:!0,path:s}):{ok:!1,failure:G(fr,i.status===404?"version-unavailable":"toolchain-failed",i.status===404?`Maven Central has no jar for ${t.groupId}:${t.artifactId}:${e}. It may be an internal artefact, or published only as a POM or a BOM.`:`Maven Central returned ${i.status} for ${r}.`)}}catch(i){return{ok:!1,failure:G(fr,"toolchain-failed",`Could not download ${r}: ${i.message}`)}}}function sE(t){let e=[],n=null;for(let r of t.split(` -`)){let s=r.trim(),i=/^(\*\*\*!|---!|\+\+\+)\s*(\w+)\s+(CLASS|METHOD|FIELD|CONSTRUCTOR|INTERFACE|ANNOTATION|SUPERCLASS):\s*(.+)$/.exec(s);if(!i)continue;let[,,o,a,c]=i,l=a==="CLASS"||a==="INTERFACE"||a==="ANNOTATION",u=gG(c);if(!u||(l&&(n=u),o==="NEW"))continue;let d=l||!n?u:`${n}.${u}`;o==="REMOVED"?e.push({kind:l?"export-removed":"member-removed",symbol:d,detail:l?`\`${d}\` is no longer published (was a ${a.toLowerCase()}).`:`\`${d}\` was removed.`}):o==="MODIFIED"&&!l&&e.push({kind:"signature-changed",symbol:d,detail:`The signature of \`${d}\` changed.`,after:c.trim()})}return e}function gG(t){let e=(t.split("(")[0].trim().split(/\s+/).pop()??"").trim();return/^[\w.$]+$/.test(e)?e:null}function hG(t){return t.split(` -`).find(e=>e.trim().length>0)?.trim()??"no output"}var ys=require("node:fs/promises"),fc=require("node:path");var Ct="python ast",yG="Install Python 3 and make `python3` available on PATH.",iE=.9,cE={ecosystem:"pypi",tool:Ct,weight:iE,async compute(t){if(!await dc(t.exec,"python3",["--version"]))return G(Ct,"tool-missing",`Python 3 is not installed, so ${t.name}'s public symbols could not be compared.`,yG);await(0,ys.mkdir)(t.workdir,{recursive:!0});let e=(0,fc.join)(t.workdir,"surface.py");await(0,ys.writeFile)(e,vG,"utf8");let n=await oE(t,t.from,e);if(!n.ok)return n.failure;let r=await oE(t,t.to,e);return r.ok?{available:!0,changes:Be(n.api,r.api),tool:Ct,weight:iE,locator:`${t.name} ${t.from} \u2192 ${t.to} (public symbols, best-effort)`}:r.failure}};async function oE(t,e,n){let r=await bG(t.name,e);if(!r)return{ok:!1,failure:G(Ct,"version-unavailable",`PyPI has no source archive for ${t.name} ${e}. It may be private, yanked, or published only as a built wheel Drift cannot open.`)};let s=(0,fc.join)(t.workdir,`probe-${e.replace(/[^\w.-]/g,"_")}`),i=(0,fc.join)(s,r.filename);try{await(0,ys.mkdir)(s,{recursive:!0});let l=await fetch(r.url,{signal:AbortSignal.timeout(6e4)});if(!l.ok)return{ok:!1,failure:G(Ct,"version-unavailable",`PyPI returned ${l.status} for ${r.url}.`)};await(0,ys.writeFile)(i,Buffer.from(await l.arrayBuffer()))}catch(l){return{ok:!1,failure:G(Ct,"toolchain-failed",`Could not download ${r.url}: ${l.message}`)}}let o=await t.exec("tar",["-xf",i,"-C",s],{timeoutMs:t.timeoutMs});if(o.code!==0)return{ok:!1,failure:G(Ct,"toolchain-failed",`Could not unpack ${r.filename}: ${aE(o.stderr)}`)};let a=await t.exec("python3",[n,s],{timeoutMs:t.timeoutMs});if(a.code!==0)return{ok:!1,failure:G(Ct,"parse-failed",`Could not read ${t.name} ${e}'s public symbols: ${aE(a.stderr)}`)};let c=lE(a.stdout);return c?c.size===0?{ok:!1,failure:G(Ct,"no-public-surface",`${t.name} ${e} declares no public symbols Drift could read statically.`)}:{ok:!0,api:c}:{ok:!1,failure:G(Ct,"parse-failed",`Unreadable symbol listing for ${t.name} ${e}.`)}}async function bG(t,e){let r=(await J(`https://pypi.org/pypi/${encodeURIComponent(t)}/json`))?.releases?.[e]??[],s=r.find(a=>a.packagetype==="sdist"),i=r.find(a=>a.packagetype==="bdist_wheel"),o=s??i;return o?{url:o.url,filename:o.filename}:null}var wG={function:"function",class:"class",variable:"variable"};function lE(t){let e;try{e=JSON.parse(t)}catch{return null}if(!Array.isArray(e))return null;let n=new Map;for(let r of e)r?.name&&n.set(r.name,{name:r.name,kind:wG[r.kind]??"variable",signature:r.signature??r.name,members:r.members??[],requiredMembers:[]});return n}var vG=`import ast, json, os, sys +`,"utf8"),await(0,yr.writeFile)((0,Yi.join)(i,"apidump.go"),dE,"utf8");let o=await t("go",["build","-o",(0,Yi.join)(i,"apidump-check"),"."],{cwd:i,timeoutMs:12e4,env:$p(n)});return o.code!==0?(e.debug(`Drift's Go API extractor failed to build: ${Rp(o.stderr)}`),null):i}catch(i){return e.debug(`Could not create the Go scratch module: ${i.message}`),null}})(),TE.set(r,s),s}function $p(t=process.env){return{...t,GOFLAGS:"-mod=mod"}}function Rp(t){return t.split(` +`).find(e=>e.trim().length>0)?.trim()??"no output"}var $c=require("node:fs/promises"),AE=require("node:path");var br="japicmp",QG={id:"japicmp",label:"Install japicmp",command:"brew",args:["install","japicmp"]},eF="Drift can install the missing `japicmp` helper for you after approval.",tF="https://repo1.maven.org/maven2",PE={ecosystem:"maven",tool:br,weight:1,async compute(t){let e=IE(t.name);if(!e)return j(br,"unsupported-ecosystem",`\`${t.name}\` is not a \`groupId:artifactId\` coordinate, so Drift could not locate it on Maven Central.`);if(!await _c(t.exec,"japicmp",["--help"]))return j(br,"tool-missing",`Drift's Java API helper is missing, so ${t.name}'s classfile API could not be compared directly.`,eF,QG);await(0,$c.mkdir)(t.workdir,{recursive:!0});let n=await CE(e,t.from,t.workdir);if(!n.ok)return n.failure;let r=await CE(e,t.to,t.workdir);if(!r.ok)return r.failure;let s=await t.exec("japicmp",["-o",n.path,"-n",r.path,"--only-modified","--ignore-missing-classes"],{cwd:t.workdir,timeoutMs:t.timeoutMs});return s.stdout.trim().length===0?j(br,s.code===0?"no-public-surface":"toolchain-failed",s.code===0?`japicmp found no differences it could read between ${t.name} ${t.from} and ${t.to}.`:`japicmp failed on ${t.name}: ${rF(s.stderr)}`):{available:!0,changes:DE(s.stdout),tool:br,weight:1,locator:`${t.name} ${t.from} \u2192 ${t.to} (classfiles)`}}};function IE(t){let[e,n]=t.split(":");return!e||!n?null:{groupId:e,artifactId:n}}function OE(t,e){let n=t.groupId.replace(/\./g,"/");return`${tF}/${n}/${t.artifactId}/${e}/${t.artifactId}-${e}.jar`}async function CE(t,e,n){let r=OE(t,e),s=(0,AE.join)(n,`${t.artifactId}-${e}.jar`);try{let i=await fetch(r,{signal:AbortSignal.timeout(6e4)});return i.ok?(await(0,$c.writeFile)(s,Buffer.from(await i.arrayBuffer())),{ok:!0,path:s}):{ok:!1,failure:j(br,i.status===404?"version-unavailable":"toolchain-failed",i.status===404?`Maven Central has no jar for ${t.groupId}:${t.artifactId}:${e}. It may be an internal artefact, or published only as a POM or a BOM.`:`Maven Central returned ${i.status} for ${r}.`)}}catch(i){return{ok:!1,failure:j(br,"toolchain-failed",`Could not download ${r}: ${i.message}`)}}}function DE(t){let e=[],n=null;for(let r of t.split(` +`)){let s=r.trim(),i=/^(\*\*\*!|---!|\+\+\+)\s*(\w+)\s+(CLASS|METHOD|FIELD|CONSTRUCTOR|INTERFACE|ANNOTATION|SUPERCLASS):\s*(.+)$/.exec(s);if(!i)continue;let[,,o,a,c]=i,l=a==="CLASS"||a==="INTERFACE"||a==="ANNOTATION",u=nF(c);if(!u||(l&&(n=u),o==="NEW"))continue;let d=l||!n?u:`${n}.${u}`;o==="REMOVED"?e.push({kind:l?"export-removed":"member-removed",symbol:d,detail:l?`\`${d}\` is no longer published (was a ${a.toLowerCase()}).`:`\`${d}\` was removed.`}):o==="MODIFIED"&&!l&&e.push({kind:"signature-changed",symbol:d,detail:`The signature of \`${d}\` changed.`,after:c.trim()})}return e}function nF(t){let e=(t.split("(")[0].trim().split(/\s+/).pop()??"").trim();return/^[\w.$]+$/.test(e)?e:null}function rF(t){return t.split(` +`).find(e=>e.trim().length>0)?.trim()??"no output"}var xs=require("node:fs/promises"),Rc=require("node:path");var Ot="python ast",sF="Install Python 3 and make `python3` available on PATH.",ME=.9,GE={ecosystem:"pypi",tool:Ot,weight:ME,async compute(t){if(!await _c(t.exec,"python3",["--version"]))return j(Ot,"tool-missing",`Python 3 is not installed, so ${t.name}'s public symbols could not be compared.`,sF);await(0,xs.mkdir)(t.workdir,{recursive:!0});let e=(0,Rc.join)(t.workdir,"surface.py");await(0,xs.writeFile)(e,aF,"utf8");let n=await NE(t,t.from,e);if(!n.ok)return n.failure;let r=await NE(t,t.to,e);return r.ok?{available:!0,changes:We(n.api,r.api),tool:Ot,weight:ME,locator:`${t.name} ${t.from} \u2192 ${t.to} (public symbols, best-effort)`}:r.failure}};async function NE(t,e,n){let r=await iF(t.name,e);if(!r)return{ok:!1,failure:j(Ot,"version-unavailable",`PyPI has no source archive for ${t.name} ${e}. It may be private, yanked, or published only as a built wheel Drift cannot open.`)};let s=(0,Rc.join)(t.workdir,`probe-${e.replace(/[^\w.-]/g,"_")}`),i=(0,Rc.join)(s,r.filename);try{await(0,xs.mkdir)(s,{recursive:!0});let l=await fetch(r.url,{signal:AbortSignal.timeout(6e4)});if(!l.ok)return{ok:!1,failure:j(Ot,"version-unavailable",`PyPI returned ${l.status} for ${r.url}.`)};await(0,xs.writeFile)(i,Buffer.from(await l.arrayBuffer()))}catch(l){return{ok:!1,failure:j(Ot,"toolchain-failed",`Could not download ${r.url}: ${l.message}`)}}let o=await t.exec("tar",["-xf",i,"-C",s],{timeoutMs:t.timeoutMs});if(o.code!==0)return{ok:!1,failure:j(Ot,"toolchain-failed",`Could not unpack ${r.filename}: ${LE(o.stderr)}`)};let a=await t.exec("python3",[n,s],{timeoutMs:t.timeoutMs});if(a.code!==0)return{ok:!1,failure:j(Ot,"parse-failed",`Could not read ${t.name} ${e}'s public symbols: ${LE(a.stderr)}`)};let c=FE(a.stdout);return c?c.size===0?{ok:!1,failure:j(Ot,"no-public-surface",`${t.name} ${e} declares no public symbols Drift could read statically.`)}:{ok:!0,api:c}:{ok:!1,failure:j(Ot,"parse-failed",`Unreadable symbol listing for ${t.name} ${e}.`)}}async function iF(t,e){let r=(await H(`https://pypi.org/pypi/${encodeURIComponent(t)}/json`))?.releases?.[e]??[],s=r.find(a=>a.packagetype==="sdist"),i=r.find(a=>a.packagetype==="bdist_wheel"),o=s??i;return o?{url:o.url,filename:o.filename}:null}var oF={function:"function",class:"class",variable:"variable"};function FE(t){let e;try{e=JSON.parse(t)}catch{return null}if(!Array.isArray(e))return null;let n=new Map;for(let r of e)r?.name&&n.set(r.name,{name:r.name,kind:oF[r.kind]??"variable",signature:r.signature??r.name,members:r.members??[],requiredMembers:[]});return n}var aF=`import ast, json, os, sys def public(name): return not name.startswith('_') or (name.startswith('__') and name.endswith('__')) @@ -806,30 +806,30 @@ for path in sorted(sources.values()): symbols[key] = {'name': key, 'kind': kind, 'signature': signature(node) if kind != 'variable' else name, 'members': sorted(body)} json.dump(sorted(symbols.values(), key=lambda s: s['name']), sys.stdout) -`;function aE(t){return t.split(` -`).find(e=>e.trim().length>0)?.trim()??"no output"}var gc=require("node:zlib");function kG(t){return t.length>2&&t[0]===31&&t[1]===139}function EG(t){return t.length>4&&t[0]===80&&t[1]===75}function ze(t){return EG(t)?TG(t):RG(kG(t)?(0,gc.gunzipSync)(t):t)}var SG=101010256,_G=33639248;function TG(t){let e=$G(t);if(e===-1)return[];let n=t.readUInt16LE(e+10),r=t.readUInt32LE(e+16),s=[];for(let i=0;it.length||t.readUInt32LE(r)!==_G);i++){let o=t.readUInt16LE(r+10),a=t.readUInt32LE(r+20),c=t.readUInt32LE(r+24),l=t.readUInt16LE(r+28),u=t.readUInt16LE(r+30),d=t.readUInt16LE(r+32),p=t.readUInt32LE(r+42),f=t.toString("utf8",r+46,r+46+l);r+=46+l+u+d,!f.endsWith("/")&&s.push({path:f,size:c,read:()=>xG(t,p,o,a)})}return s}function xG(t,e,n,r){let s=t.readUInt16LE(e+26),i=t.readUInt16LE(e+28),o=e+30+s+i,a=t.subarray(o,o+r);if(n===0)return Buffer.from(a);if(n===8)return(0,gc.inflateRawSync)(a);throw new Error(`Unsupported zip compression method ${n}`)}function $G(t){let e=Math.max(0,t.length-65535-22);for(let n=t.length-22;n>=e;n--)if(t.readUInt32LE(n)===SG)return n;return-1}var Wi=512;function RG(t){let e=[],n=0,r=null;for(;n+Wi<=t.length;){let s=t.subarray(n,n+Wi);if(s[0]===0)break;let i=mc(s.subarray(0,100)),o=AG(s.subarray(124,136)),a=String.fromCharCode(s[156]??0),c=mc(s.subarray(345,500)),l=n+Wi,u=l+o;if(n=l+Math.ceil(o/Wi)*Wi,a==="L"){r=mc(t.subarray(l,u));continue}if(a==="x"||a==="X"){r=CG(t.subarray(l,u))??r;continue}if(a!=="0"&&a!=="\0"&&a!=="7"){r=null;continue}let d=r??(c?`${c}/${i}`:i);if(r=null,!d)continue;let p=t.subarray(l,u);e.push({path:d,size:o,read:()=>Buffer.from(p)})}return e}function mc(t){let e=t.indexOf(0);return t.toString("utf8",0,e===-1?t.length:e).trim()}function AG(t){let e=mc(t).replace(/[^0-7]/g,"");return e?Number.parseInt(e,8):0}function CG(t){for(let e of t.toString("utf8").split(` -`)){let n=/^\d+\s+path=(.*)$/.exec(e);if(n)return n[1]}return null}var PG=/(^|\/)(detail|details|internal|impl|private|priv|test|tests|examples?|demos?|sketch(es)?|dev|sandbox|tools?|scripts?|fuzz|contrib|bench|benchmarks?|docs?|third[_-]?party|extern(al)?|deps?)(\/|$)/i,OG=/(^|\/)(_|.*[-_](inl|impl|internal|private|guts)\.)|(^|\/)[\w-]*guts\.h$/i,IG=/\.(h|hpp|hh|hxx|h\+\+|inl|tpp)$/i,DG=/(^|_)(VERSION|VERNUM|VER)(_?(MAJOR|MINOR|PATCH|REVISION|SUBREVISION|BUILD|STRING|NUM|TEXT|CODE))?$/i,MG=["include/","inc/","src/",""];function ip(t){let e=NG(t);return t.map(n=>({path:n.slice(e.length),original:n})).filter(n=>IG.test(n.path)).filter(n=>!PG.test(n.path)).filter(n=>!OG.test(n.path)).filter(n=>MG.some(r=>n.path.startsWith(r)))}function NG(t){let e=t[0];if(!e)return"";let n=e.indexOf("/");if(n===-1)return"";let r=e.slice(0,n+1);return t.every(s=>s.startsWith(r))?r:""}function op(t){let e=new Map;for(let n of t)for(let r of uE(n.content)){let s=e.get(r.name);s&&s.members.length>=r.members.length||e.set(r.name,r)}return e}function uE(t){let e=[],r=JG(t).split(` -`),s=0,i=null,o=!1,a=(c,l)=>{for(let u=c;u<=l&&u]*>\s*)?(struct|class|union|enum)(?:\s+class|\s+struct)?\s+(?:\w+_(?:API|EXPORT)\s+)?(\w+)?\s*(?::[^{]*)?\s*\{/.exec(n);if(!r)return null;let s=r[1],i=0,o=e,a=[];for(let d=e;de&&a.push(p),i<=0&&d>=e){o=d;break}o=d}let c=t[o],l=/\}\s*(\w+)\s*;/.exec(c),u=r[2]??l?.[1];return u?{entry:{name:u,kind:BG(s),signature:zi(`${s} ${u}`),members:VG(a.join(` -`),s),requiredMembers:[]},endLine:o}:null}function BG(t){return t==="enum"?"enum":t==="class"?"class":"interface"}function VG(t,e){if(e==="enum")return[...new Set(t.replace(/\{|\}[^}]*$/g,"").split(",").map(i=>/^\s*(\w+)/.exec(i)?.[1]).filter(i=>!!i))];let n=[],r=e!=="class",s=0;for(let i of t.split(` -`)){let o=i.trim(),a=/^(public|private|protected)\s*:/.exec(o);if(a){r=a[1]==="public";continue}let c=s;for(let d of o)d==="{"?s++:d==="}"&&s--;if(c>0||!r)continue;let l=/(\w+)\s*\([^)]*\)\s*(?:const\s*)?(?:noexcept\s*)?[;{=]/.exec(o);if(l?.[1]&&!Hi.has(l[1])){n.push(l[1]);continue}if(l?.[1])continue;let u=/^[\w:<>,\s*&[\]]+?(\w+)\s*(?:\[[^\]]*\]\s*)?(?:=\s*[^;]+)?;/.exec(o);u?.[1]&&!Hi.has(u[1])&&!YG.test(u[1])&&n.push(u[1])}return[...new Set(n)]}function WG(t){let e=t.trim().replace(/\s+/g," ");if(!e||e.startsWith("#"))return null;let n=/^typedef\s+(.+?)\s*;$/.exec(e);if(n){let o=/\(\s*\*\s*(\w+)\s*\)/.exec(n[1])?.[1]??/(\w+)\s*(?:\[[^\]]*\])?$/.exec(n[1])?.[1];return!o||Hi.has(o)?null:{name:o,kind:"type",signature:zi(e),members:[],requiredMembers:[]}}let r=/^(?:(?:extern|static|inline|constexpr|virtual|explicit|friend|\w+_API|\w+_EXPORT|EXTERN_C|__declspec\([^)]*\))\s+)*((?:const\s+|unsigned\s+|signed\s+|struct\s+|enum\s+|class\s+)*[\w:]+(?:\s*<[^>]*>)?[\s*&]+)(\w+)\s*\(([^)]*)\)\s*(const)?\s*(?:noexcept)?\s*[;{]$/.exec(e);if(r){let i=zi(r[1]),o=r[2];return Hi.has(o)?null:{name:o,kind:"function",signature:`${i} ${o}(${zG(r[3])})${r[4]?" const":""}`,members:[],requiredMembers:[]}}let s=/^extern\s+((?:const\s+)?[\w:]+[\s*&]+)(\w+)\s*(?:\[[^\]]*\])?\s*;$/.exec(e);if(s){let i=s[2];return Hi.has(i)?null:{name:i,kind:"variable",signature:zi(e.replace(/;$/,"")),members:[],requiredMembers:[]}}return null}function zG(t){let e=t.trim();return!e||e==="void"?e:HG(e).map(n=>{let s=n.split("=")[0].trim().replace(/\s*\[[^\]]*\]\s*$/,"");return s.split(/(?<=[\s*&])/).length<2?s:s.replace(/\b\w+\s*$/,"").trim()||s}).join(", ")}function HG(t){let e=[],n=0,r="";for(let s of t){if(s==="<"||s==="("||s==="["?n++:(s===">"||s===")"||s==="]")&&n--,s===","&&n===0){e.push(r),r="";continue}r+=s}return r.trim()&&e.push(r),e}function KG(t,e){let n="";for(let r=e;rXG(t,e)}}var fE=ap("arduino"),mE=ap("conan"),gE=ap("vcpkg");async function XG(t,e){let n=ZG[t];if(!n)return G(mr,"unsupported-ecosystem",`No source resolver for ${t}.`);let r=await dE(t,n,e,e.from);if(!r.ok)return r.failure;let s=await dE(t,n,e,e.to);return s.ok?r.api.size===0&&s.api.size===0?G(mr,"no-public-surface",`No declarations could be read from ${e.name}'s headers in either version. A library whose API is generated by macros, or shipped as a prebuilt binary, has no header text to compare.`):{available:!0,changes:Be(r.api,s.api),tool:mr,weight:pE,locator:`${e.name} ${e.from} \u2192 ${e.to} (public headers)`}:s.failure}async function dE(t,e,n,r){let s=await e(n.name,r);if(!s)return{ok:!1,failure:G(mr,"version-unavailable",`No source archive is published for ${n.name} ${r} in ${QG(t)}, so its headers could not be read.`)};let i;try{let o=await fetch(s,{signal:AbortSignal.timeout(n.timeoutMs)});if(!o.ok)return{ok:!1,failure:G(mr,"version-unavailable",`${s} returned ${o.status}.`)};let a=ze(Buffer.from(await o.arrayBuffer())),c=new Map(a.map(l=>[l.path,l]));i=ip([...c.keys()]).map(l=>({path:l.path,content:c.get(l.original).read().toString("utf8")})).filter(l=>l.content.length>0)}catch(o){return{ok:!1,failure:G(mr,"toolchain-failed",`Could not read ${n.name} ${r} from ${s}: ${o.message}`)}}return n.logger.debug(`${n.name} ${r}: ${i.length} public header(s)`),{ok:!0,api:op(i)}}function QG(t){return t==="conan"?"ConanCenter":t==="vcpkg"?"the vcpkg registry":"the Arduino Library Manager"}async function ej(t,e){let n=await tc(t),r=n?.archives[e];if(r)return r;let s=n?.githubRepo??await tj(t);return s?cp(s,e):null}async function tj(t){return(await gs(t,"arduino",null))?.githubRepo??null}async function nj(t,e){let n=`https://raw.githubusercontent.com/conan-io/conan-center-index/master/recipes/${encodeURIComponent(t)}`,r=await fe(`${n}/config.yml`);if(!r)return null;let s=hE(r,e)??rj(r);if(!s)return null;let i=await fe(`${n}/${s}/conandata.yml`);if(!i)return null;let o=yE(i,e);if(o)return o;let a=sj(i);return a?cp(a,e):null}function rj(t){return/folder\s*:\s*["']?([^"'\s]+)["']?/.exec(t)?.[1]??null}function sj(t){for(let e of t.matchAll(/https?:\/\/github\.com\/[\w.-]+\/[\w.-]+/g)){let n=me(e[0]);if(n)return n}return null}async function cp(t,e){let r=(await J(`https://api.github.com/repos/${t}/tags?per_page=100`)??[]).map(s=>s.name).find(s=>!!s&&bE(s,e));return r?`https://codeload.github.com/${t}/tar.gz/refs/tags/${encodeURIComponent(r)}`:null}function hE(t,e){let n=t.split(` -`),r=null;for(let s of n){let i=/^\s{2,}["']?([^"':\s]+)["']?\s*:\s*$/.exec(s.replace(/\s+$/,""));if(i){r=i[1].trim();continue}let o=/^\s{4,}folder\s*:\s*["']?([^"'\s]+)["']?/.exec(s);if(o&&r===e)return o[1]}return null}function yE(t,e){let n=t.split(` -`),r=!1,s=!1;for(let i of n){let o=i.replace(/\s+$/,"");if(!o.trim())continue;if(/^sources\s*:/.test(o)){r=!0;continue}if(!/^\s/.test(o)){r=!1,s=!1;continue}if(!r)continue;let a=/^ {2}["']?([^"':\s]+)["']?\s*:\s*$/.exec(o);if(a){s=a[1].trim()===e;continue}if(!s)continue;let c=/https?:\/\/\S+/.exec(o);if(c&&!c[0].endsWith(".git"))return c[0].replace(/["',]+$/,"")}return null}async function ij(t,e){let n=await J(`https://raw.githubusercontent.com/microsoft/vcpkg/master/ports/${encodeURIComponent(t)}/vcpkg.json`),r=me(n?.homepage??null);return r?cp(r,e):null}function bE(t,e){let n=r=>r.replace(/^[^\d]*/,"").replace(/_/g,".");return t===e||n(t)===n(e)}dp();var bs="assembly metadata",$E=1,CE={ecosystem:"nuget",tool:bs,weight:$E,async compute(t){let e=await RE(t,t.from);if(!e.ok)return e.failure;let n=await RE(t,t.to);return n.ok?{available:!0,changes:Be(e.api,n.api),tool:bs,weight:$E,locator:`${t.name} ${t.from} \u2192 ${t.to} (${e.framework} assembly metadata)`}:n.failure}};async function RE(t,e){let n=t.name.toLowerCase(),r=e.toLowerCase(),s=`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(n)}.${encodeURIComponent(r)}.nupkg`,i;try{let l=await fetch(s,{signal:AbortSignal.timeout(t.timeoutMs)});if(!l.ok)return{ok:!1,failure:G(bs,"version-unavailable",l.status===404?`NuGet has no package for ${t.name} ${e}. It may be unlisted, delisted, or published to a private feed.`:`NuGet returned ${l.status} for ${t.name} ${e}.`)};i=ze(Buffer.from(await l.arrayBuffer()))}catch(l){return{ok:!1,failure:G(bs,"toolchain-failed",`Could not read ${t.name} ${e} from NuGet: ${l.message}`)}}let o=Tj(i.map(l=>l.path));if(!o)return{ok:!1,failure:G(bs,"no-public-surface",`${t.name} ${e} publishes no managed assembly under lib/ or ref/. Meta-packages, analyzers, and native-only packages have no API surface to compare.`)};let a=i.find(l=>l.path===o.path),c=hc(a.read());return c?{ok:!0,api:_j(c),framework:o.framework}:{ok:!1,failure:G(bs,"parse-failed",`${o.path} in ${t.name} ${e} is not a managed assembly Drift could read.`)}}function _j(t){let e=new Map;for(let n of t)e.set(n.fullName,{name:n.fullName,kind:n.kind==="struct"||n.kind==="delegate"?"type":n.kind,signature:`${n.kind} ${n.fullName}`,members:[...n.members,...n.signatures],requiredMembers:[]});return e}function Tj(t){let e=t.map(s=>{let i=/^(lib|ref)\/([^/]+)\/([^/]+\.dll)$/i.exec(s);if(!i)return null;let o=i[3];return/\.resources\.dll$/i.test(o)?null:{path:s,area:i[1].toLowerCase(),framework:i[2].toLowerCase(),name:o}}).filter(s=>s!==null);if(e.length===0)return null;let r=[...e].sort((s,i)=>{if(s.area!==i.area)return s.area==="ref"?-1:1;let o=AE(i.framework)-AE(s.framework);return o!==0?o:s.name.length-i.name.length||s.name.localeCompare(i.name)})[0];return{path:r.path,framework:r.framework}}function AE(t){if(t.startsWith("netstandard2.0"))return 1e3;if(t.startsWith("netstandard"))return 900;let e=/^net(\d+)\.(\d+)/.exec(t);if(e)return 500+Number(e[1])*10+Number(e[2]);let n=/^net(\d+)$/.exec(t);return n?100+Number(n[1]):0}var Ki="pub source",PE=.8,IE={ecosystem:"pub",tool:Ki,weight:PE,async compute(t){let e=await OE(t,t.from);if(!e.ok)return e.failure;let n=await OE(t,t.to);return n.ok?e.api.size===0&&n.api.size===0?G(Ki,"no-public-surface",`${t.name} publishes no public Dart library Drift could read, so this upgrade rests on prose evidence.`):{available:!0,changes:Be(e.api,n.api),tool:Ki,weight:PE,locator:`${t.name} ${t.from} \u2192 ${t.to} (published lib/)`}:n.failure}};async function OE(t,e){let n=`https://pub.dev/api/archives/${encodeURIComponent(t.name)}-${encodeURIComponent(e)}.tar.gz`,r;try{let s=await fetch(n,{signal:AbortSignal.timeout(t.timeoutMs)});if(!s.ok)return{ok:!1,failure:G(Ki,"version-unavailable",s.status===404?`pub.dev has no archive for ${t.name} ${e}. It may be retracted, or published to a private pub server.`:`pub.dev returned ${s.status} for ${t.name} ${e}.`)};r=ze(Buffer.from(await s.arrayBuffer()))}catch(s){return{ok:!1,failure:G(Ki,"toolchain-failed",`Could not read ${t.name} ${e} from pub.dev: ${s.message}`)}}return{ok:!0,api:DE(r)}}function DE(t){let e=t.some(o=>o.path.startsWith("lib/")),n=new Map;for(let o of t){let a=e?o.path:o.path.replace(/^[^/]+\//,"");a.startsWith("lib/")&&a.endsWith(".dart")&&n.set(a,o)}let r=new Map,s=new Set,i=[...n.keys()].filter(o=>!o.startsWith("lib/src/"));for(;i.length>0;){let o=i.shift();if(s.has(o))continue;s.add(o);let a=n.get(o);if(!a)continue;let c;try{c=a.read().toString("utf8")}catch{continue}for(let l of ME(c))r.has(l.name)||r.set(l.name,l);for(let l of xj(c)){let u=$j(o,l);u&&n.has(u)&&i.push(u)}}return r}function xj(t){let e=[];for(let n of t.matchAll(/^\s*export\s+['"]([^'"]+)['"]/gm)){let r=n[1];r.startsWith("package:")||r.startsWith("dart:")||e.push(r)}return e}function $j(t,e){let n=[...t.split("/").slice(0,-1),...e.split("/")],r=[];for(let s of n)if(!(s===""||s===".")){if(s===".."){if(r.length===0)return;r.pop();continue}r.push(s)}return r.join("/")}function ME(t){let e=[],n=Aj(t).split(` -`);for(let r=0;r,\s?[\]]+\s+)?([A-Za-z_$][\w$]*)\s*(?:<[^>]*>)?\s*\(([^)]*)\)\s*(?:async\s*\*?|sync\s*\*)?\s*[{=;]/.exec(s);if(a?.[1]&&!a[1].startsWith("_")&&!NE.has(a[1])){e.push({name:a[1],kind:"function",signature:yc(s),members:[],requiredMembers:[]});continue}let c=/^(?:const|final|var|late\s+final|late\s+var)\s+(?:[\w$<>,\s?[\]]+\s+)?([A-Za-z_$][\w$]*)\s*=/.exec(s);c?.[1]&&!c[1].startsWith("_")&&e.push({name:c[1],kind:"variable",signature:yc(s),members:[],requiredMembers:[]})}return e}function Rj(t,e){let n=[],r;for(let s=e+1;s,\s?[\]]+\s+)?(?:get\s+|set\s+)?([A-Za-z_$][\w$]*)\s*(?:<[^>]*>)?\s*[({=;]/.exec(i);a?.[1]&&!a[1].startsWith("_")&&!NE.has(a[1])&&n.push(a[1])}return[...new Set(n)]}var NE=new Set(["if","for","while","switch","catch","return","assert","super","this","new","await","yield","throw","else","do","try","case","with","is","as","in","on","of","when","get","set","factory","operator","part","import","export","library","typedef","class","enum","mixin","extension","const","final","var","void","late","required","covariant","abstract","static","external"]);function Aj(t){return t.replace(/\/\*[\s\S]*?\*\//g,"").split(` +`;function LE(t){return t.split(` +`).find(e=>e.trim().length>0)?.trim()??"no output"}var Ac=require("node:zlib");function cF(t){return t.length>2&&t[0]===31&&t[1]===139}function lF(t){return t.length>4&&t[0]===80&&t[1]===75}function Ke(t){return lF(t)?pF(t):gF(cF(t)?(0,Ac.gunzipSync)(t):t)}var uF=101010256,dF=33639248;function pF(t){let e=mF(t);if(e===-1)return[];let n=t.readUInt16LE(e+10),r=t.readUInt32LE(e+16),s=[];for(let i=0;it.length||t.readUInt32LE(r)!==dF);i++){let o=t.readUInt16LE(r+10),a=t.readUInt32LE(r+20),c=t.readUInt32LE(r+24),l=t.readUInt16LE(r+28),u=t.readUInt16LE(r+30),d=t.readUInt16LE(r+32),p=t.readUInt32LE(r+42),f=t.toString("utf8",r+46,r+46+l);r+=46+l+u+d,!f.endsWith("/")&&s.push({path:f,size:c,read:()=>fF(t,p,o,a)})}return s}function fF(t,e,n,r){let s=t.readUInt16LE(e+26),i=t.readUInt16LE(e+28),o=e+30+s+i,a=t.subarray(o,o+r);if(n===0)return Buffer.from(a);if(n===8)return(0,Ac.inflateRawSync)(a);throw new Error(`Unsupported zip compression method ${n}`)}function mF(t){let e=Math.max(0,t.length-65535-22);for(let n=t.length-22;n>=e;n--)if(t.readUInt32LE(n)===uF)return n;return-1}var Zi=512;function gF(t){let e=[],n=0,r=null;for(;n+Zi<=t.length;){let s=t.subarray(n,n+Zi);if(s[0]===0)break;let i=Cc(s.subarray(0,100)),o=hF(s.subarray(124,136)),a=String.fromCharCode(s[156]??0),c=Cc(s.subarray(345,500)),l=n+Zi,u=l+o;if(n=l+Math.ceil(o/Zi)*Zi,a==="L"){r=Cc(t.subarray(l,u));continue}if(a==="x"||a==="X"){r=yF(t.subarray(l,u))??r;continue}if(a!=="0"&&a!=="\0"&&a!=="7"){r=null;continue}let d=r??(c?`${c}/${i}`:i);if(r=null,!d)continue;let p=t.subarray(l,u);e.push({path:d,size:o,read:()=>Buffer.from(p)})}return e}function Cc(t){let e=t.indexOf(0);return t.toString("utf8",0,e===-1?t.length:e).trim()}function hF(t){let e=Cc(t).replace(/[^0-7]/g,"");return e?Number.parseInt(e,8):0}function yF(t){for(let e of t.toString("utf8").split(` +`)){let n=/^\d+\s+path=(.*)$/.exec(e);if(n)return n[1]}return null}var bF=/(^|\/)(detail|details|internal|impl|private|priv|test|tests|examples?|demos?|sketch(es)?|dev|sandbox|tools?|scripts?|fuzz|contrib|bench|benchmarks?|docs?|third[_-]?party|extern(al)?|deps?)(\/|$)/i,wF=/(^|\/)(_|.*[-_](inl|impl|internal|private|guts)\.)|(^|\/)[\w-]*guts\.h$/i,vF=/\.(h|hpp|hh|hxx|h\+\+|inl|tpp)$/i,kF=/(^|_)(VERSION|VERNUM|VER)(_?(MAJOR|MINOR|PATCH|REVISION|SUBREVISION|BUILD|STRING|NUM|TEXT|CODE))?$/i,EF=["include/","inc/","src/",""];function Cp(t){let e=SF(t);return t.map(n=>({path:n.slice(e.length),original:n})).filter(n=>vF.test(n.path)).filter(n=>!bF.test(n.path)).filter(n=>!wF.test(n.path)).filter(n=>EF.some(r=>n.path.startsWith(r)))}function SF(t){let e=t[0];if(!e)return"";let n=e.indexOf("/");if(n===-1)return"";let r=e.slice(0,n+1);return t.every(s=>s.startsWith(r))?r:""}function Ap(t){let e=new Map;for(let n of t)for(let r of jE(n.content)){let s=e.get(r.name);s&&s.members.length>=r.members.length||e.set(r.name,r)}return e}function jE(t){let e=[],r=NF(t).split(` +`),s=0,i=null,o=!1,a=(c,l)=>{for(let u=c;u<=l&&u]*>\s*)?(struct|class|union|enum)(?:\s+class|\s+struct)?\s+(?:\w+_(?:API|EXPORT)\s+)?(\w+)?\s*(?::[^{]*)?\s*\{/.exec(n);if(!r)return null;let s=r[1],i=0,o=e,a=[];for(let d=e;de&&a.push(p),i<=0&&d>=e){o=d;break}o=d}let c=t[o],l=/\}\s*(\w+)\s*;/.exec(c),u=r[2]??l?.[1];return u?{entry:{name:u,kind:AF(s),signature:Xi(`${s} ${u}`),members:PF(a.join(` +`),s),requiredMembers:[]},endLine:o}:null}function AF(t){return t==="enum"?"enum":t==="class"?"class":"interface"}function PF(t,e){if(e==="enum")return[...new Set(t.replace(/\{|\}[^}]*$/g,"").split(",").map(i=>/^\s*(\w+)/.exec(i)?.[1]).filter(i=>!!i))];let n=[],r=e!=="class",s=0;for(let i of t.split(` +`)){let o=i.trim(),a=/^(public|private|protected)\s*:/.exec(o);if(a){r=a[1]==="public";continue}let c=s;for(let d of o)d==="{"?s++:d==="}"&&s--;if(c>0||!r)continue;let l=/(\w+)\s*\([^)]*\)\s*(?:const\s*)?(?:noexcept\s*)?[;{=]/.exec(o);if(l?.[1]&&!Qi.has(l[1])){n.push(l[1]);continue}if(l?.[1])continue;let u=/^[\w:<>,\s*&[\]]+?(\w+)\s*(?:\[[^\]]*\]\s*)?(?:=\s*[^;]+)?;/.exec(o);u?.[1]&&!Qi.has(u[1])&&!LF.test(u[1])&&n.push(u[1])}return[...new Set(n)]}function IF(t){let e=t.trim().replace(/\s+/g," ");if(!e||e.startsWith("#"))return null;let n=/^typedef\s+(.+?)\s*;$/.exec(e);if(n){let o=/\(\s*\*\s*(\w+)\s*\)/.exec(n[1])?.[1]??/(\w+)\s*(?:\[[^\]]*\])?$/.exec(n[1])?.[1];return!o||Qi.has(o)?null:{name:o,kind:"type",signature:Xi(e),members:[],requiredMembers:[]}}let r=/^(?:(?:extern|static|inline|constexpr|virtual|explicit|friend|\w+_API|\w+_EXPORT|EXTERN_C|__declspec\([^)]*\))\s+)*((?:const\s+|unsigned\s+|signed\s+|struct\s+|enum\s+|class\s+)*[\w:]+(?:\s*<[^>]*>)?[\s*&]+)(\w+)\s*\(([^)]*)\)\s*(const)?\s*(?:noexcept)?\s*[;{]$/.exec(e);if(r){let i=Xi(r[1]),o=r[2];return Qi.has(o)?null:{name:o,kind:"function",signature:`${i} ${o}(${OF(r[3])})${r[4]?" const":""}`,members:[],requiredMembers:[]}}let s=/^extern\s+((?:const\s+)?[\w:]+[\s*&]+)(\w+)\s*(?:\[[^\]]*\])?\s*;$/.exec(e);if(s){let i=s[2];return Qi.has(i)?null:{name:i,kind:"variable",signature:Xi(e.replace(/;$/,"")),members:[],requiredMembers:[]}}return null}function OF(t){let e=t.trim();return!e||e==="void"?e:DF(e).map(n=>{let s=n.split("=")[0].trim().replace(/\s*\[[^\]]*\]\s*$/,"");return s.split(/(?<=[\s*&])/).length<2?s:s.replace(/\b\w+\s*$/,"").trim()||s}).join(", ")}function DF(t){let e=[],n=0,r="";for(let s of t){if(s==="<"||s==="("||s==="["?n++:(s===">"||s===")"||s==="]")&&n--,s===","&&n===0){e.push(r),r="";continue}r+=s}return r.trim()&&e.push(r),e}function MF(t,e){let n="";for(let r=e;rFF(t,e)}}var BE=Pp("arduino"),VE=Pp("conan"),WE=Pp("vcpkg");async function FF(t,e){let n=GF[t];if(!n)return j(wr,"unsupported-ecosystem",`No source resolver for ${t}.`);let r=await qE(t,n,e,e.from);if(!r.ok)return r.failure;let s=await qE(t,n,e,e.to);return s.ok?r.api.size===0&&s.api.size===0?j(wr,"no-public-surface",`No declarations could be read from ${e.name}'s headers in either version. A library whose API is generated by macros, or shipped as a prebuilt binary, has no header text to compare.`):{available:!0,changes:We(r.api,s.api),tool:wr,weight:UE,locator:`${e.name} ${e.from} \u2192 ${e.to} (public headers)`}:s.failure}async function qE(t,e,n,r){let s=await e(n.name,r);if(!s)return{ok:!1,failure:j(wr,"version-unavailable",`No source archive is published for ${n.name} ${r} in ${jF(t)}, so its headers could not be read.`)};let i;try{let o=await fetch(s,{signal:AbortSignal.timeout(n.timeoutMs)});if(!o.ok)return{ok:!1,failure:j(wr,"version-unavailable",`${s} returned ${o.status}.`)};let a=Ke(Buffer.from(await o.arrayBuffer())),c=new Map(a.map(l=>[l.path,l]));i=Cp([...c.keys()]).map(l=>({path:l.path,content:c.get(l.original).read().toString("utf8")})).filter(l=>l.content.length>0)}catch(o){return{ok:!1,failure:j(wr,"toolchain-failed",`Could not read ${n.name} ${r} from ${s}: ${o.message}`)}}return n.logger.debug(`${n.name} ${r}: ${i.length} public header(s)`),{ok:!0,api:Ap(i)}}function jF(t){return t==="conan"?"ConanCenter":t==="vcpkg"?"the vcpkg registry":"the Arduino Library Manager"}async function qF(t,e){let n=await hc(t),r=n?.archives[e];if(r)return r;let s=n?.githubRepo??await UF(t);return s?Ip(s,e):null}async function UF(t){return(await kn(t,"arduino",null))?.githubRepo??null}async function BF(t,e){let n=`https://raw.githubusercontent.com/conan-io/conan-center-index/master/recipes/${encodeURIComponent(t)}`,r=await ge(`${n}/config.yml`);if(!r)return null;let s=zE(r,e)??VF(r);if(!s)return null;let i=await ge(`${n}/${s}/conandata.yml`);if(!i)return null;let o=HE(i,e);if(o)return o;let a=WF(i);return a?Ip(a,e):null}function VF(t){return/folder\s*:\s*["']?([^"'\s]+)["']?/.exec(t)?.[1]??null}function WF(t){for(let e of t.matchAll(/https?:\/\/github\.com\/[\w.-]+\/[\w.-]+/g)){let n=he(e[0]);if(n)return n}return null}async function Ip(t,e){let r=(await H(`https://api.github.com/repos/${t}/tags?per_page=100`)??[]).map(s=>s.name).find(s=>!!s&&KE(s,e));return r?`https://codeload.github.com/${t}/tar.gz/refs/tags/${encodeURIComponent(r)}`:null}function zE(t,e){let n=t.split(` +`),r=null;for(let s of n){let i=/^\s{2,}["']?([^"':\s]+)["']?\s*:\s*$/.exec(s.replace(/\s+$/,""));if(i){r=i[1].trim();continue}let o=/^\s{4,}folder\s*:\s*["']?([^"'\s]+)["']?/.exec(s);if(o&&r===e)return o[1]}return null}function HE(t,e){let n=t.split(` +`),r=!1,s=!1;for(let i of n){let o=i.replace(/\s+$/,"");if(!o.trim())continue;if(/^sources\s*:/.test(o)){r=!0;continue}if(!/^\s/.test(o)){r=!1,s=!1;continue}if(!r)continue;let a=/^ {2}["']?([^"':\s]+)["']?\s*:\s*$/.exec(o);if(a){s=a[1].trim()===e;continue}if(!s)continue;let c=/https?:\/\/\S+/.exec(o);if(c&&!c[0].endsWith(".git"))return c[0].replace(/["',]+$/,"")}return null}async function zF(t,e){let n=await H(`https://raw.githubusercontent.com/microsoft/vcpkg/master/ports/${encodeURIComponent(t)}/vcpkg.json`),r=he(n?.homepage??null);return r?Ip(r,e):null}function KE(t,e){let n=r=>r.replace(/^[^\d]*/,"").replace(/_/g,".");return t===e||n(t)===n(e)}Mp();var Ts="assembly metadata",rS=1,oS={ecosystem:"nuget",tool:Ts,weight:rS,async compute(t){let e=await sS(t,t.from);if(!e.ok)return e.failure;let n=await sS(t,t.to);return n.ok?{available:!0,changes:We(e.api,n.api),tool:Ts,weight:rS,locator:`${t.name} ${t.from} \u2192 ${t.to} (${e.framework} assembly metadata)`}:n.failure}};async function sS(t,e){let n=t.name.toLowerCase(),r=e.toLowerCase(),s=`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(n)}.${encodeURIComponent(r)}.nupkg`,i;try{let l=await fetch(s,{signal:AbortSignal.timeout(t.timeoutMs)});if(!l.ok)return{ok:!1,failure:j(Ts,"version-unavailable",l.status===404?`NuGet has no package for ${t.name} ${e}. It may be unlisted, delisted, or published to a private feed.`:`NuGet returned ${l.status} for ${t.name} ${e}.`)};i=Ke(Buffer.from(await l.arrayBuffer()))}catch(l){return{ok:!1,failure:j(Ts,"toolchain-failed",`Could not read ${t.name} ${e} from NuGet: ${l.message}`)}}let o=pj(i.map(l=>l.path));if(!o)return{ok:!1,failure:j(Ts,"no-public-surface",`${t.name} ${e} publishes no managed assembly under lib/ or ref/. Meta-packages, analyzers, and native-only packages have no API surface to compare.`)};let a=i.find(l=>l.path===o.path),c=Pc(a.read());return c?{ok:!0,api:dj(c),framework:o.framework}:{ok:!1,failure:j(Ts,"parse-failed",`${o.path} in ${t.name} ${e} is not a managed assembly Drift could read.`)}}function dj(t){let e=new Map;for(let n of t)e.set(n.fullName,{name:n.fullName,kind:n.kind==="struct"||n.kind==="delegate"?"type":n.kind,signature:`${n.kind} ${n.fullName}`,members:[...n.members,...n.signatures],requiredMembers:[]});return e}function pj(t){let e=t.map(s=>{let i=/^(lib|ref)\/([^/]+)\/([^/]+\.dll)$/i.exec(s);if(!i)return null;let o=i[3];return/\.resources\.dll$/i.test(o)?null:{path:s,area:i[1].toLowerCase(),framework:i[2].toLowerCase(),name:o}}).filter(s=>s!==null);if(e.length===0)return null;let r=[...e].sort((s,i)=>{if(s.area!==i.area)return s.area==="ref"?-1:1;let o=iS(i.framework)-iS(s.framework);return o!==0?o:s.name.length-i.name.length||s.name.localeCompare(i.name)})[0];return{path:r.path,framework:r.framework}}function iS(t){if(t.startsWith("netstandard2.0"))return 1e3;if(t.startsWith("netstandard"))return 900;let e=/^net(\d+)\.(\d+)/.exec(t);if(e)return 500+Number(e[1])*10+Number(e[2]);let n=/^net(\d+)$/.exec(t);return n?100+Number(n[1]):0}var eo="pub source",aS=.8,lS={ecosystem:"pub",tool:eo,weight:aS,async compute(t){let e=await cS(t,t.from);if(!e.ok)return e.failure;let n=await cS(t,t.to);return n.ok?e.api.size===0&&n.api.size===0?j(eo,"no-public-surface",`${t.name} publishes no public Dart library Drift could read, so this upgrade rests on prose evidence.`):{available:!0,changes:We(e.api,n.api),tool:eo,weight:aS,locator:`${t.name} ${t.from} \u2192 ${t.to} (published lib/)`}:n.failure}};async function cS(t,e){let n=`https://pub.dev/api/archives/${encodeURIComponent(t.name)}-${encodeURIComponent(e)}.tar.gz`,r;try{let s=await fetch(n,{signal:AbortSignal.timeout(t.timeoutMs)});if(!s.ok)return{ok:!1,failure:j(eo,"version-unavailable",s.status===404?`pub.dev has no archive for ${t.name} ${e}. It may be retracted, or published to a private pub server.`:`pub.dev returned ${s.status} for ${t.name} ${e}.`)};r=Ke(Buffer.from(await s.arrayBuffer()))}catch(s){return{ok:!1,failure:j(eo,"toolchain-failed",`Could not read ${t.name} ${e} from pub.dev: ${s.message}`)}}return{ok:!0,api:uS(r)}}function uS(t){let e=t.some(o=>o.path.startsWith("lib/")),n=new Map;for(let o of t){let a=e?o.path:o.path.replace(/^[^/]+\//,"");a.startsWith("lib/")&&a.endsWith(".dart")&&n.set(a,o)}let r=new Map,s=new Set,i=[...n.keys()].filter(o=>!o.startsWith("lib/src/"));for(;i.length>0;){let o=i.shift();if(s.has(o))continue;s.add(o);let a=n.get(o);if(!a)continue;let c;try{c=a.read().toString("utf8")}catch{continue}for(let l of dS(c))r.has(l.name)||r.set(l.name,l);for(let l of fj(c)){let u=mj(o,l);u&&n.has(u)&&i.push(u)}}return r}function fj(t){let e=[];for(let n of t.matchAll(/^\s*export\s+['"]([^'"]+)['"]/gm)){let r=n[1];r.startsWith("package:")||r.startsWith("dart:")||e.push(r)}return e}function mj(t,e){let n=[...t.split("/").slice(0,-1),...e.split("/")],r=[];for(let s of n)if(!(s===""||s===".")){if(s===".."){if(r.length===0)return;r.pop();continue}r.push(s)}return r.join("/")}function dS(t){let e=[],n=hj(t).split(` +`);for(let r=0;r,\s?[\]]+\s+)?([A-Za-z_$][\w$]*)\s*(?:<[^>]*>)?\s*\(([^)]*)\)\s*(?:async\s*\*?|sync\s*\*)?\s*[{=;]/.exec(s);if(a?.[1]&&!a[1].startsWith("_")&&!pS.has(a[1])){e.push({name:a[1],kind:"function",signature:Ic(s),members:[],requiredMembers:[]});continue}let c=/^(?:const|final|var|late\s+final|late\s+var)\s+(?:[\w$<>,\s?[\]]+\s+)?([A-Za-z_$][\w$]*)\s*=/.exec(s);c?.[1]&&!c[1].startsWith("_")&&e.push({name:c[1],kind:"variable",signature:Ic(s),members:[],requiredMembers:[]})}return e}function gj(t,e){let n=[],r;for(let s=e+1;s,\s?[\]]+\s+)?(?:get\s+|set\s+)?([A-Za-z_$][\w$]*)\s*(?:<[^>]*>)?\s*[({=;]/.exec(i);a?.[1]&&!a[1].startsWith("_")&&!pS.has(a[1])&&n.push(a[1])}return[...new Set(n)]}var pS=new Set(["if","for","while","switch","catch","return","assert","super","this","new","await","yield","throw","else","do","try","case","with","is","as","in","on","of","when","get","set","factory","operator","part","import","export","library","typedef","class","enum","mixin","extension","const","final","var","void","late","required","covariant","abstract","static","external"]);function hj(t){return t.replace(/\/\*[\s\S]*?\*\//g,"").split(` `).map(e=>/^\s*\/\//.test(e)?"":e).join(` -`)}function yc(t){return t.replace(/\s+/g," ").replace(/\s*[{=;]\s*$/,"").trim()}var gr="hex sources",LE=.8,FE={ecosystem:"hex",tool:gr,weight:LE,async compute(t){let e=await GE(t,t.from);if(!e.ok)return e.failure;let n=await GE(t,t.to);return n.ok?e.api.size===0&&n.api.size===0?G(gr,"no-public-surface",`${t.name} ships no Elixir or Erlang source Drift could read, so this upgrade rests on prose evidence.`):{available:!0,changes:Be(e.api,n.api),tool:gr,weight:LE,locator:`${t.name} ${t.from} \u2192 ${t.to} (published sources)`}:n.failure}};async function GE(t,e){let n=`https://repo.hex.pm/tarballs/${encodeURIComponent(t.name)}-${encodeURIComponent(e)}.tar`,r;try{let i=await fetch(n,{signal:AbortSignal.timeout(t.timeoutMs)});if(!i.ok)return{ok:!1,failure:G(gr,"version-unavailable",i.status===404?`Hex has no release for ${t.name} ${e}. It may have been retired, or published to a private repository.`:`Hex returned ${i.status} for ${t.name} ${e}.`)};r=ze(Buffer.from(await i.arrayBuffer()))}catch(i){return{ok:!1,failure:G(gr,"toolchain-failed",`Could not read ${t.name} ${e} from Hex: ${i.message}`)}}let s=r.find(i=>i.path==="contents.tar.gz"||i.path.endsWith("/contents.tar.gz"));if(!s)return{ok:!1,failure:G(gr,"parse-failed",`${t.name} ${e} is not in the layout Hex tarballs use, so Drift could not read its sources.`)};try{return{ok:!0,api:qE(ze(s.read()))}}catch(i){return{ok:!1,failure:G(gr,"parse-failed",`Could not unpack ${t.name} ${e}: ${i.message}`)}}}function qE(t){let e=new Map;for(let n of t){if(!/^(lib|src)\//.test(n.path))continue;let r;try{r=n.read().toString("utf8")}catch{continue}if(/\.ex$/.test(n.path)){for(let[s,i]of UE(r))jE(e,s,i,`defmodule ${s}`);continue}if(/\.erl$/.test(n.path)){let s=/^\s*-module\(\s*'?([a-z][\w]*)'?\s*\)/m.exec(r)?.[1];s&&jE(e,s,BE(r),`-module(${s})`)}}return e}function jE(t,e,n,r){let s=t.get(e);if(s){s.members=[...new Set([...s.members,...n])];return}t.set(e,{name:e,kind:"class",signature:r,members:n,requiredMembers:[]})}function UE(t){let e=new Map,n=[],r=t.split(` -`),s=!1,i=(o,a)=>{for(;n.length>0&&n[n.length-1].indent>=o;)n.pop();n.push({indent:o,name:a})};for(let o=0;o0&&n[n.length-1].indent>=m;)n.pop();let g=n[n.length-1]?.name,h=g?`${g}.${l[2]}`:l[2];i(m,h),e.has(h)||e.set(h,[]);continue}let u=/^(\s*)defimpl\s+/.exec(a);if(u){i(u[1].length,null);continue}let d=/^(\s*)(?:def|defmacro|defguard|defdelegate)\s+([a-z_][\w]*[!?]?)\s*(\(|,|\s+when\b|\s+do\b|\s*$)/.exec(a);if(!d)continue;let p=d[1].length;for(;n.length>0&&n[n.length-1].indent>=p;)n.pop();let f=n[n.length-1]?.name;if(f)for(let m of Cj(r,o,d[3]==="("))e.get(f)?.push(`${d[2]}/${m}`)}for(let[o,a]of e)e.set(o,[...new Set(a)]);return e}function Cj(t,e,n){if(!n)return[0];let r=t[e].indexOf("("),s="",i=0,o=!1;e:for(let u=e;u=1&&(s+=f)}s+=" "}if(!o)return[0];let a=Pj(s);if(a.length===0)return[0];let c=a.filter(u=>!u.includes("\\\\")).length,l=a.length;return Array.from({length:l-c+1},(u,d)=>c+d)}function Pj(t){let e=t.trim();if(e==="")return[];let n=[],r=0,s="";for(let i of e){if(i==="("||i==="["||i==="{"||i==="<"?r+=1:(i===")"||i==="]"||i==="}"||i===">")&&(r-=1),i===","&&r===0){n.push(s),s="";continue}s+=i}return n.push(s),n.map(i=>i.trim()).filter(i=>i!=="")}function BE(t){let e=[];for(let n of t.matchAll(/-export\(\s*\[([\s\S]*?)\]\s*\)/g))for(let r of n[1].split(",")){let s=/([a-z_][\w]*)\s*\/\s*(\d+)/.exec(r);s&&e.push(`${s[1]}/${s[2]}`)}return[...new Set(e)]}var Oj=[Ik,Zk,tE,cE,mE,gE,fE,CE,IE,FE];function Ij(t){return Oj.find(e=>e.ecosystem===t)}var Dj=18e4;async function zE(t,e){let n=Ij(t.ecosystem);if(!n)return G("none","unsupported-ecosystem",`Drift has no computed API-surface diff for ${t.ecosystem}; this upgrade rests on prose evidence alone.`);if(!t.from||!t.to)return G(n.tool,"version-unavailable",`${t.name} has no pair of versions to compare.`);let r=await(0,bc.mkdtemp)((0,WE.join)((0,VE.tmpdir)(),"drift-surface-"));try{return await n.compute({name:t.name,from:t.from,to:t.to,exec:e.exec??At,workdir:r,logger:e.logger,...e.env?{env:e.env}:{},timeoutMs:e.timeoutMs??Dj,...e.readRepoFile?{readRepoFile:e.readRepoFile}:{}})}catch(s){return e.logger.debug(`Surface diff crashed for ${t.name}: ${s.message}`),G(n.tool,"toolchain-failed",`Drift could not compare ${t.name}: ${s.message}`)}finally{await(0,bc.rm)(r,{recursive:!0,force:!0}).catch(()=>{})}}var YE=require("node:fs/promises"),ZE=require("node:path"),Sn={"type-surface-diff":1,"openapi-diff":1,"migration-guide":.8,"github-release":.7,changelog:.65,"registry-metadata":.4,"semver-heuristic":.25};async function XE(t,e){let n=await bn(t,4,s=>Mj(s,e)),r=await Fj(e);return[...n.flat(),...r]}async function Mj(t,e){let{config:n,logger:r}=e,s=[],i=l=>t.workspace===void 0?l:l.map(u=>({...u,workspace:t.workspace})),o=Bj(t);if(o&&s.push({id:we("ev",t.name,"semver",t.from,t.to),source:"semver-heuristic",dependency:t.name,url:Uj(t),title:`${t.name} ${t.from} \u2192 ${t.to} (${t.bump})`,content:o,weight:Sn["semver-heuristic"]}),!t.from||!t.to)return i(s);let a=await gs(t.name,t.ecosystem,t.to);if(a?.deprecated&&s.push({id:we("ev",t.name,"deprecated",t.to),source:"registry-metadata",dependency:t.name,url:a.homepage??void 0,title:`${t.name}@${t.to} is deprecated`,content:a.deprecated,weight:Sn["registry-metadata"]}),n.evidence.typeSurface){let l=await Nj(t,e);l&&s.push(l)}let c=a?.githubRepo;if(!c)return r.debug(`No source repository resolved for ${t.name}; prose evidence unavailable`),i(s);if(n.evidence.githubReleases){let l=await hk(c,t.from,t.to,{token:e.githubToken,maxReleases:n.evidence.maxReleases});for(let u of l){let d=Gi(u.body);e.onProseConsulted?.(t,{kind:"github-release",label:`${u.name??u.tag} release notes`,url:u.url,breaking:d.length>0}),d.length!==0&&s.push({id:we("ev",t.name,"release",u.tag),source:"github-release",dependency:t.name,url:u.url,title:`${t.name} ${u.name??u.tag} release notes`,content:d.join(` -`),weight:Sn["github-release"]})}}if(n.evidence.changelog){let l=await rk(c,t.from,t.to);for(let u of l){let d=zd(Wd(u.content),t.from,t.to),p=d.some(f=>Gi(f.body).length>0);e.onProseConsulted?.(t,{kind:"changelog",label:u.path,url:u.url,breaking:p});for(let f of d){let m=Gi(f.body);m.length!==0&&s.push({id:we("ev",t.name,"changelog",u.path,f.version),source:"changelog",dependency:t.name,url:`${u.url}#L${f.line}`,locator:`${u.path}:${f.line}`,title:`${t.name} CHANGELOG \xA7 ${f.version}`,content:m.join(` -`),weight:Sn.changelog})}}for(let u of await sk(c)){let d=Gi(u.content);e.onProseConsulted?.(t,{kind:"migration-guide",label:u.path,url:u.url,breaking:d.length>0}),d.length!==0&&s.push({id:we("ev",t.name,"migration",u.path),source:"migration-guide",dependency:t.name,url:u.url,locator:u.path,title:`${t.name} migration guide (${u.path})`,content:d.slice(0,200).join(` -`),weight:Sn["migration-guide"]})}}return i(s)}async function Nj(t,e){let{logger:n}=e,r=t.from,s=t.to;if(t.ecosystem==="npm"){let o=await Gj(t.name,r,s,n);return o?o.unreachable?(e.onUnavailableSurface?.(t,G("TypeScript declarations","version-unavailable",`${o.unreachable} could not be fetched, so nothing was compared. That version may have been unpublished, or the CDN may not carry it.`)),null):o.definitelyTyped?(e.onUnavailableSurface?.(t,G("TypeScript declarations","no-public-surface",`${t.name} ships no declarations of its own; its types live in @types/${t.name.replace(/^@/,"").replace("/","__")}, which versions separately and does not move with this upgrade. Nothing was compared.`)),null):o.changes.length===0?(o.comparable?e.onSurfaceComputed?.(t,{available:!0,changes:[],tool:"jsdelivr-dts-diff",weight:Sn["type-surface-diff"],locator:`${t.name}@${r}:${o.beforeEntryPath} \u2192 ${t.name}@${s}:${o.afterEntryPath}`}):e.onUnavailableSurface?.(t,G("TypeScript declarations","no-public-surface",`${t.name}'s public API is neither in its own declarations nor in any dependency Drift could follow, so comparing its declarations proves nothing about this upgrade.`)),null):HE(t,{changes:o.changes,weight:Sn["type-surface-diff"],locator:`${t.name}@${r}:${o.beforeEntryPath} \u2192 ${t.name}@${s}:${o.afterEntryPath}`,url:pp(t.name,s,o.afterEntryPath),beforeUrl:pp(t.name,r,o.beforeEntryPath),afterUrl:pp(t.name,s,o.afterEntryPath)}):(e.onUnavailableSurface?.(t,G("TypeScript declarations","no-public-surface",`${t.name} publishes no TypeScript declarations Drift could compare, so this upgrade rests on prose evidence.`)),null)}let i=await zE(t,{logger:n,exec:e.exec,env:e.env,readRepoFile:Lj(e)});return i.available?(e.onSurfaceComputed?.(t,i),i.changes.length===0?null:HE(t,{changes:i.changes,weight:i.weight,locator:`${i.locator} \xB7 computed by ${i.tool}`})):(n.debug(`No computed surface for ${t.name}: ${i.detail}`),e.onUnavailableSurface?.(t,i),null)}function Lj(t){let{workspaceRoot:e,readRepoFile:n,afterSha:r}=t;if(e)return async s=>(0,YE.readFile)((0,ZE.join)(e,s),"utf8").catch(()=>null);if(n&&r)return s=>n(s,r).catch(()=>null)}function HE(t,e){let n=e.beforeUrl||e.afterUrl?["Declaration sources:",e.beforeUrl?`- before: ${e.beforeUrl}`:"",e.afterUrl?`- after: ${e.afterUrl}`:"",""].filter(Boolean).join(` -`):"";return{id:we("ev",t.name,"surface",t.from??"",t.to??""),source:"type-surface-diff",dependency:t.name,url:e.url,locator:e.locator,title:`${e.changes.length} API surface change(s) in ${t.name}`,content:`${n}${jj(e.changes)}`,findings:e.changes.map(r=>({code:r.kind,symbol:r.symbol,detail:r.detail,before:r.before,after:r.after})),weight:e.weight}}var KE=3;async function Gj(t,e,n,r){try{let[s,i]=await Promise.all([lc(t,e),lc(t,n)]);if(!s||!i)return null;(s.viaDependencies.length>0||i.viaDependencies.length>0)&&r.debug(`${t} surface includes ${[...new Set([...s.viaDependencies,...i.viaDependencies])].join(", ")}`);let o=Rk(t,s,i),a=Be(s.api,i.api),c=s.entryPath.startsWith("@types:")&&i.entryPath.startsWith("@types:");return{changes:o?[o,...a]:a,comparable:s.api.size>=KE&&i.api.size>=KE,beforeEntryPath:s.entryPath,afterEntryPath:i.entryPath,...c?{definitelyTyped:c}:{}}}catch(s){return r.debug(`Type surface diff failed for ${t}: ${s.message}`),s instanceof Fi?{changes:[],comparable:!1,beforeEntryPath:"",afterEntryPath:"",unreachable:`${s.packageName}@${s.version}`}:null}}function pp(t,e,n){if(!(!n||n.startsWith("@types:")))return`https://cdn.jsdelivr.net/npm/${t}@${e}/${n}`}function jj(t){let n=t.slice(0,60).map(r=>{let s=[`- [${r.kind}] ${r.detail}`];return r.before&&r.after&&(s.push(` before: ${JE(r.before,200)}`),s.push(` after: ${JE(r.after,200)}`)),s.join(` +`)}function Ic(t){return t.replace(/\s+/g," ").replace(/\s*[{=;]\s*$/,"").trim()}var vr="hex sources",fS=.8,hS={ecosystem:"hex",tool:vr,weight:fS,async compute(t){let e=await mS(t,t.from);if(!e.ok)return e.failure;let n=await mS(t,t.to);return n.ok?e.api.size===0&&n.api.size===0?j(vr,"no-public-surface",`${t.name} ships no Elixir or Erlang source Drift could read, so this upgrade rests on prose evidence.`):{available:!0,changes:We(e.api,n.api),tool:vr,weight:fS,locator:`${t.name} ${t.from} \u2192 ${t.to} (published sources)`}:n.failure}};async function mS(t,e){let n=`https://repo.hex.pm/tarballs/${encodeURIComponent(t.name)}-${encodeURIComponent(e)}.tar`,r;try{let i=await fetch(n,{signal:AbortSignal.timeout(t.timeoutMs)});if(!i.ok)return{ok:!1,failure:j(vr,"version-unavailable",i.status===404?`Hex has no release for ${t.name} ${e}. It may have been retired, or published to a private repository.`:`Hex returned ${i.status} for ${t.name} ${e}.`)};r=Ke(Buffer.from(await i.arrayBuffer()))}catch(i){return{ok:!1,failure:j(vr,"toolchain-failed",`Could not read ${t.name} ${e} from Hex: ${i.message}`)}}let s=r.find(i=>i.path==="contents.tar.gz"||i.path.endsWith("/contents.tar.gz"));if(!s)return{ok:!1,failure:j(vr,"parse-failed",`${t.name} ${e} is not in the layout Hex tarballs use, so Drift could not read its sources.`)};try{return{ok:!0,api:yS(Ke(s.read()))}}catch(i){return{ok:!1,failure:j(vr,"parse-failed",`Could not unpack ${t.name} ${e}: ${i.message}`)}}}function yS(t){let e=new Map;for(let n of t){if(!/^(lib|src)\//.test(n.path))continue;let r;try{r=n.read().toString("utf8")}catch{continue}if(/\.ex$/.test(n.path)){for(let[s,i]of bS(r))gS(e,s,i,`defmodule ${s}`);continue}if(/\.erl$/.test(n.path)){let s=/^\s*-module\(\s*'?([a-z][\w]*)'?\s*\)/m.exec(r)?.[1];s&&gS(e,s,wS(r),`-module(${s})`)}}return e}function gS(t,e,n,r){let s=t.get(e);if(s){s.members=[...new Set([...s.members,...n])];return}t.set(e,{name:e,kind:"class",signature:r,members:n,requiredMembers:[]})}function bS(t){let e=new Map,n=[],r=t.split(` +`),s=!1,i=(o,a)=>{for(;n.length>0&&n[n.length-1].indent>=o;)n.pop();n.push({indent:o,name:a})};for(let o=0;o0&&n[n.length-1].indent>=m;)n.pop();let g=n[n.length-1]?.name,h=g?`${g}.${l[2]}`:l[2];i(m,h),e.has(h)||e.set(h,[]);continue}let u=/^(\s*)defimpl\s+/.exec(a);if(u){i(u[1].length,null);continue}let d=/^(\s*)(?:def|defmacro|defguard|defdelegate)\s+([a-z_][\w]*[!?]?)\s*(\(|,|\s+when\b|\s+do\b|\s*$)/.exec(a);if(!d)continue;let p=d[1].length;for(;n.length>0&&n[n.length-1].indent>=p;)n.pop();let f=n[n.length-1]?.name;if(f)for(let m of yj(r,o,d[3]==="("))e.get(f)?.push(`${d[2]}/${m}`)}for(let[o,a]of e)e.set(o,[...new Set(a)]);return e}function yj(t,e,n){if(!n)return[0];let r=t[e].indexOf("("),s="",i=0,o=!1;e:for(let u=e;u=1&&(s+=f)}s+=" "}if(!o)return[0];let a=bj(s);if(a.length===0)return[0];let c=a.filter(u=>!u.includes("\\\\")).length,l=a.length;return Array.from({length:l-c+1},(u,d)=>c+d)}function bj(t){let e=t.trim();if(e==="")return[];let n=[],r=0,s="";for(let i of e){if(i==="("||i==="["||i==="{"||i==="<"?r+=1:(i===")"||i==="]"||i==="}"||i===">")&&(r-=1),i===","&&r===0){n.push(s),s="";continue}s+=i}return n.push(s),n.map(i=>i.trim()).filter(i=>i!=="")}function wS(t){let e=[];for(let n of t.matchAll(/-export\(\s*\[([\s\S]*?)\]\s*\)/g))for(let r of n[1].split(",")){let s=/([a-z_][\w]*)\s*\/\s*(\d+)/.exec(r);s&&e.push(`${s[1]}/${s[2]}`)}return[...new Set(e)]}var wj=[lE,$E,PE,GE,VE,WE,BE,oS,lS,hS];function vj(t){return wj.find(e=>e.ecosystem===t)}var kj=18e4;async function ES(t,e){let n=vj(t.ecosystem);if(!n)return j("none","unsupported-ecosystem",`Drift has no computed API-surface diff for ${t.ecosystem}; this upgrade rests on prose evidence alone.`);if(!t.from||!t.to)return j(n.tool,"version-unavailable",`${t.name} has no pair of versions to compare.`);let r=await(0,Oc.mkdtemp)((0,kS.join)((0,vS.tmpdir)(),"drift-surface-"));try{return await n.compute({name:t.name,from:t.from,to:t.to,exec:e.exec??It,workdir:r,logger:e.logger,...e.env?{env:e.env}:{},timeoutMs:e.timeoutMs??kj,...e.readRepoFile?{readRepoFile:e.readRepoFile}:{}})}catch(s){return e.logger.debug(`Surface diff crashed for ${t.name}: ${s.message}`),j(n.tool,"toolchain-failed",`Drift could not compare ${t.name}: ${s.message}`)}finally{await(0,Oc.rm)(r,{recursive:!0,force:!0}).catch(()=>{})}}var _S=require("node:fs/promises"),$S=require("node:path"),_n={"type-surface-diff":1,"openapi-diff":1,"migration-guide":.8,"github-release":.7,changelog:.65,"registry-metadata":.4,"semver-heuristic":.25};async function Dc(t,e){let n=await vn(t,4,s=>Ej(s,e)),r=await $j(e);return[...n.flat(),...r]}async function Ej(t,e){let{config:n,logger:r}=e,s=[],i=l=>t.workspace===void 0?l:l.map(u=>({...u,workspace:t.workspace})),o=Aj(t);if(o&&s.push({id:Ee("ev",t.name,"semver",t.from,t.to),source:"semver-heuristic",dependency:t.name,url:Cj(t),title:`${t.name} ${t.from} \u2192 ${t.to} (${t.bump})`,content:o,weight:_n["semver-heuristic"]}),!t.from||!t.to)return i(s);let a=await kn(t.name,t.ecosystem,t.to);if(a?.deprecated&&s.push({id:Ee("ev",t.name,"deprecated",t.to),source:"registry-metadata",dependency:t.name,url:a.homepage??void 0,title:`${t.name}@${t.to} is deprecated`,content:a.deprecated,weight:_n["registry-metadata"]}),n.evidence.typeSurface){let l=await Sj(t,e);l&&s.push(l)}let c=a?.githubRepo;if(!c)return r.debug(`No source repository resolved for ${t.name}; prose evidence unavailable`),i(s);if(n.evidence.githubReleases){let l=await zk(c,t.from,t.to,{token:e.githubToken,maxReleases:n.evidence.maxReleases});for(let u of l){let d=Vi(u.body);e.onProseConsulted?.(t,{kind:"github-release",label:`${u.name??u.tag} release notes`,url:u.url,breaking:d.length>0}),d.length!==0&&s.push({id:Ee("ev",t.name,"release",u.tag),source:"github-release",dependency:t.name,url:u.url,title:`${t.name} ${u.name??u.tag} release notes`,content:d.join(` +`),weight:_n["github-release"]})}}if(n.evidence.changelog){let l=await Ok(c,t.from,t.to);for(let u of l){let d=hp(gp(u.content),t.from,t.to),p=d.some(f=>Vi(f.body).length>0);e.onProseConsulted?.(t,{kind:"changelog",label:u.path,url:u.url,breaking:p});for(let f of d){let m=Vi(f.body);m.length!==0&&s.push({id:Ee("ev",t.name,"changelog",u.path,f.version),source:"changelog",dependency:t.name,url:`${u.url}#L${f.line}`,locator:`${u.path}:${f.line}`,title:`${t.name} CHANGELOG \xA7 ${f.version}`,content:m.join(` +`),weight:_n.changelog})}}for(let u of await Dk(c)){let d=Vi(u.content);e.onProseConsulted?.(t,{kind:"migration-guide",label:u.path,url:u.url,breaking:d.length>0}),d.length!==0&&s.push({id:Ee("ev",t.name,"migration",u.path),source:"migration-guide",dependency:t.name,url:u.url,locator:u.path,title:`${t.name} migration guide (${u.path})`,content:d.slice(0,200).join(` +`),weight:_n["migration-guide"]})}}return i(s)}async function Sj(t,e){let{logger:n}=e,r=t.from,s=t.to;if(t.ecosystem==="npm"){let o=await Tj(t.name,r,s,n);return o?o.unreachable?(e.onUnavailableSurface?.(t,j("TypeScript declarations","version-unavailable",`${o.unreachable} could not be fetched, so nothing was compared. That version may have been unpublished, or the CDN may not carry it.`)),null):o.definitelyTyped?(e.onUnavailableSurface?.(t,j("TypeScript declarations","no-public-surface",`${t.name} ships no declarations of its own; its types live in @types/${t.name.replace(/^@/,"").replace("/","__")}, which versions separately and does not move with this upgrade. Nothing was compared.`)),null):o.changes.length===0?(o.comparable?e.onSurfaceComputed?.(t,{available:!0,changes:[],tool:"jsdelivr-dts-diff",weight:_n["type-surface-diff"],locator:`${t.name}@${r}:${o.beforeEntryPath} \u2192 ${t.name}@${s}:${o.afterEntryPath}`}):e.onUnavailableSurface?.(t,j("TypeScript declarations","no-public-surface",`${t.name}'s public API is neither in its own declarations nor in any dependency Drift could follow, so comparing its declarations proves nothing about this upgrade.`)),null):SS(t,{changes:o.changes,weight:_n["type-surface-diff"],locator:`${t.name}@${r}:${o.beforeEntryPath} \u2192 ${t.name}@${s}:${o.afterEntryPath}`,url:Np(t.name,s,o.afterEntryPath),beforeUrl:Np(t.name,r,o.beforeEntryPath),afterUrl:Np(t.name,s,o.afterEntryPath)}):(e.onUnavailableSurface?.(t,j("TypeScript declarations","no-public-surface",`${t.name} publishes no TypeScript declarations Drift could compare, so this upgrade rests on prose evidence.`)),null)}let i=await ES(t,{logger:n,exec:e.exec,env:e.env,readRepoFile:xj(e)});return i.available?(e.onSurfaceComputed?.(t,i),i.changes.length===0?null:SS(t,{changes:i.changes,weight:i.weight,locator:`${i.locator} \xB7 computed by ${i.tool}`})):(n.debug(`No computed surface for ${t.name}: ${i.detail}`),e.onUnavailableSurface?.(t,i),null)}function xj(t){let{workspaceRoot:e,readRepoFile:n,afterSha:r}=t;if(e)return async s=>(0,_S.readFile)((0,$S.join)(e,s),"utf8").catch(()=>null);if(n&&r)return s=>n(s,r).catch(()=>null)}function SS(t,e){let n=e.beforeUrl||e.afterUrl?["Declaration sources:",e.beforeUrl?`- before: ${e.beforeUrl}`:"",e.afterUrl?`- after: ${e.afterUrl}`:"",""].filter(Boolean).join(` +`):"";return{id:Ee("ev",t.name,"surface",t.from??"",t.to??""),source:"type-surface-diff",dependency:t.name,url:e.url,locator:e.locator,title:`${e.changes.length} API surface change(s) in ${t.name}`,content:`${n}${_j(e.changes)}`,findings:e.changes.map(r=>({code:r.kind,symbol:r.symbol,detail:r.detail,before:r.before,after:r.after})),weight:e.weight}}var xS=3;async function Tj(t,e,n,r){try{let[s,i]=await Promise.all([xc(t,e),xc(t,n)]);if(!s||!i)return null;(s.viaDependencies.length>0||i.viaDependencies.length>0)&&r.debug(`${t} surface includes ${[...new Set([...s.viaDependencies,...i.viaDependencies])].join(", ")}`);let o=sE(t,s,i),a=We(s.api,i.api),c=s.entryPath.startsWith("@types:")&&i.entryPath.startsWith("@types:");return{changes:o?[o,...a]:a,comparable:s.api.size>=xS&&i.api.size>=xS,beforeEntryPath:s.entryPath,afterEntryPath:i.entryPath,...c?{definitelyTyped:c}:{}}}catch(s){return r.debug(`Type surface diff failed for ${t}: ${s.message}`),s instanceof zi?{changes:[],comparable:!1,beforeEntryPath:"",afterEntryPath:"",unreachable:`${s.packageName}@${s.version}`}:null}}function Np(t,e,n){if(!(!n||n.startsWith("@types:")))return`https://cdn.jsdelivr.net/npm/${t}@${e}/${n}`}function _j(t){let n=t.slice(0,60).map(r=>{let s=[`- [${r.kind}] ${r.detail}`];return r.before&&r.after&&(s.push(` before: ${TS(r.before,200)}`),s.push(` after: ${TS(r.after,200)}`)),s.join(` `)});return t.length>60&&n.push(`- \u2026and ${t.length-60} more`),n.join(` -`)}async function Fj(t){let{config:e,readRepoFile:n,beforeSha:r,afterSha:s}=t;if(!e.evidence.openapi)return[];if(!n||!r||!s)return[];if(e.evidence.openapiSpecs.length===0)return[];let i=[];for(let o of e.evidence.openapiSpecs){if(o.includes("*"))continue;let[a,c]=await Promise.all([n(o,r),n(o,s)]);if(!a||!c||a===c||!rc(c))continue;let l=Ek(a,c);l.length!==0&&i.push({id:we("ev",o,"openapi",s),source:"openapi-diff",dependency:o,locator:o,title:`${l.length} breaking change(s) in ${o}`,content:qj(l),findings:l.map(u=>({code:u.kind,symbol:u.location,detail:u.detail})),weight:Sn["openapi-diff"]})}return i}function qj(t){return t.map(e=>`- [${e.kind}] ${e.location} \u2014 ${e.detail}`).join(` -`)}function Uj(t){return t.from&&t.to&&Oi(t.from,t.to)?"https://semver.org/#spec-item-4":t.bump==="major"?"https://semver.org/#spec-item-8":"https://semver.org/"}function Bj(t){if(!t.from||!t.to)return null;let e=[];return t.bump==="major"?e.push(`Major version bump ${t.from} \u2192 ${t.to}. Semver permits arbitrary breaking changes across a major boundary.`):Oi(t.from,t.to)?e.push(`0.x minor bump ${t.from} \u2192 ${t.to}. Under semver \xA74 the minor position carries breaking changes while the major version is 0.`):t.bump==="minor"?e.push(`Minor bump ${t.from} \u2192 ${t.to}. Semver says this should be additive, which is a convention rather than a guarantee \u2014 minor releases do break consumers, so the version number alone is not evidence either way.`):t.bump==="patch"&&e.push(`Patch bump ${t.from} \u2192 ${t.to}. Breakage here is usually accidental.`),Pi(t.from,t.to)&&e.push(`This is a DOWNGRADE. Code written against ${t.from} may rely on APIs that do not exist in ${t.to}.`),e.length>0?e.join(" "):null}function JE(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function fp(t){switch(t){case"export-removed":return"removed-export";case"member-removed":return"removed-export";case"signature-changed":return"signature-change";case"constant-value-changed":return"signature-change";case"kind-changed":return"type-change";case"member-now-required":return"required-field-added";case"entry-point-moved":case"package-removed":return"moved-export";case"path-removed":case"operation-removed":case"response-status-removed":return"removed-endpoint";case"parameter-removed":case"parameter-type-changed":case"response-field-removed":case"response-field-type-changed":case"request-field-type-changed":case"request-enum-narrowed":case"response-enum-widened":return"changed-endpoint";case"parameter-now-required":case"request-field-now-required":return"required-field-added";case"security-added":return"config-change";default:return"unknown"}}function QE(t,e){let{code:n,symbol:r}=t;switch(n){case"export-removed":return`Every use of \`${r}\` from \`${e}\` must be replaced. Find the supported replacement in the new version's exports and migrate each call site. Do not stub \`${r}\` out or re-implement it locally unless no replacement exists \u2014 if none exists, say so in the PR description rather than inventing one.`;case"member-removed":return`The member \`${r}\` no longer exists in \`${e}\`. Update each access to use the replacement member, or restructure the calling code if the capability was removed outright.`;case"signature-changed":return`The signature of \`${r}\` changed. Update every call site to match the new signature exactly. Pay attention to argument order, argument count, and whether an options object replaced positional arguments. +`)}async function $j(t){let{config:e,readRepoFile:n,beforeSha:r,afterSha:s}=t;if(!e.evidence.openapi)return[];if(!n||!r||!s)return[];if(e.evidence.openapiSpecs.length===0)return[];let i=[];for(let o of e.evidence.openapiSpecs){if(o.includes("*"))continue;let[a,c]=await Promise.all([n(o,r),n(o,s)]);if(!a||!c||a===c||!bc(c))continue;let l=Xk(a,c);l.length!==0&&i.push({id:Ee("ev",o,"openapi",s),source:"openapi-diff",dependency:o,locator:o,title:`${l.length} breaking change(s) in ${o}`,content:Rj(l),findings:l.map(u=>({code:u.kind,symbol:u.location,detail:u.detail})),weight:_n["openapi-diff"]})}return i}function Rj(t){return t.map(e=>`- [${e.kind}] ${e.location} \u2014 ${e.detail}`).join(` +`)}function Cj(t){return t.from&&t.to&&Fi(t.from,t.to)?"https://semver.org/#spec-item-4":t.bump==="major"?"https://semver.org/#spec-item-8":"https://semver.org/"}function Aj(t){if(!t.from||!t.to)return null;let e=[];return t.bump==="major"?e.push(`Major version bump ${t.from} \u2192 ${t.to}. Semver permits arbitrary breaking changes across a major boundary.`):Fi(t.from,t.to)?e.push(`0.x minor bump ${t.from} \u2192 ${t.to}. Under semver \xA74 the minor position carries breaking changes while the major version is 0.`):t.bump==="minor"?e.push(`Minor bump ${t.from} \u2192 ${t.to}. Semver says this should be additive, which is a convention rather than a guarantee \u2014 minor releases do break consumers, so the version number alone is not evidence either way.`):t.bump==="patch"&&e.push(`Patch bump ${t.from} \u2192 ${t.to}. Breakage here is usually accidental.`),Gi(t.from,t.to)&&e.push(`This is a DOWNGRADE. Code written against ${t.from} may rely on APIs that do not exist in ${t.to}.`),e.length>0?e.join(" "):null}function TS(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function Lp(t){switch(t){case"export-removed":return"removed-export";case"member-removed":return"removed-export";case"signature-changed":return"signature-change";case"constant-value-changed":return"signature-change";case"kind-changed":return"type-change";case"member-now-required":return"required-field-added";case"entry-point-moved":case"package-removed":return"moved-export";case"path-removed":case"operation-removed":case"response-status-removed":return"removed-endpoint";case"parameter-removed":case"parameter-type-changed":case"response-field-removed":case"response-field-type-changed":case"request-field-type-changed":case"request-enum-narrowed":case"response-enum-widened":return"changed-endpoint";case"parameter-now-required":case"request-field-now-required":return"required-field-added";case"security-added":return"config-change";default:return"unknown"}}function RS(t,e){let{code:n,symbol:r}=t;switch(n){case"export-removed":return`Every use of \`${r}\` from \`${e}\` must be replaced. Find the supported replacement in the new version's exports and migrate each call site. Do not stub \`${r}\` out or re-implement it locally unless no replacement exists \u2014 if none exists, say so in the PR description rather than inventing one.`;case"member-removed":return`The member \`${r}\` no longer exists in \`${e}\`. Update each access to use the replacement member, or restructure the calling code if the capability was removed outright.`;case"signature-changed":return`The signature of \`${r}\` changed. Update every call site to match the new signature exactly. Pay attention to argument order, argument count, and whether an options object replaced positional arguments. before: ${t.before??"(unknown)"} after: ${t.after??"(unknown)"}`;case"constant-value-changed":return`\`${r}\` changed underlying value. before: ${t.before??"(unknown)"} after: ${t.after??"(unknown)"} -This does not necessarily require a source change \u2014 most code that only refers to \`${r}\` by name keeps working. Review code in this repository that depends on the concrete value: a hard-coded copy of the old number, a value persisted or sent over the wire, or a comparison against zero or another literal.`;case"kind-changed":return`\`${r}\` changed form (for example class to function, or interface to type alias). Update declarations, \`new\` expressions, and type positions accordingly.`;case"entry-point-moved":return`The import path changed, not the API. ${t.detail} Update the import specifier in every file that imports from \`${e}\`, and do not replace, stub, or re-implement the individual symbols \u2014 they still exist under the new entry point. If you cannot determine which entry point carries a symbol this repository uses, leave that import alone with a \`TODO(drift):\` comment naming the symbol.`;case"package-removed":return`The package \`${r}\` no longer exists in \`${e}\`. Update the import path in every file that imports it to whichever package now provides the same API. Do not re-implement or stub the symbols it exported \u2014 if you cannot determine the replacement package, leave the import in place with a \`TODO(drift):\` comment naming it rather than guessing.`;case"member-now-required":return`\`${r}\` is now required. Supply an explicit value at every construction site. Choose the value that preserves the previous default behaviour; if the previous default is not documented, leave a TODO and flag it in the PR description rather than guessing.`;case"path-removed":case"operation-removed":return`The endpoint \`${r}\` no longer exists. Locate the client code that calls it and migrate to the replacement endpoint. If there is no replacement, do not delete the feature \u2014 leave the call site intact with a clearly-marked TODO and explain it in the PR description.`;case"response-status-removed":return`\`${r}\` no longer returns this success status. Update response handling so the removed status is no longer treated as a success path.`;case"parameter-removed":return`A required parameter was removed from \`${r}\`. Remove it from client calls; sending it may now be rejected as an unexpected parameter.`;case"parameter-now-required":case"request-field-now-required":return`\`${r}\` now requires this field. Add it to every request built in this repo, using a value consistent with the surrounding code's intent.`;case"parameter-type-changed":case"request-field-type-changed":return`The request type for \`${r}\` changed. Update serialisation at each call site so the value sent matches the new type.`;case"response-field-removed":return`\`${r}\` no longer returns this field. Update every reader of that field. If the value is genuinely no longer available, propagate the absence properly rather than substituting a placeholder that could be mistaken for real data.`;case"response-field-type-changed":return`The response type for \`${r}\` changed. Update parsing and any downstream type declarations.`;case"request-enum-narrowed":return`\`${r}\` no longer accepts some previously-valid values. Find code that sends the removed values and map them onto still-supported ones.`;case"response-enum-widened":return`\`${r}\` can now return values this code has never seen. Add explicit handling; make sure exhaustive switches and mapping tables have a safe default rather than falling through silently.`;case"security-added":return`\`${r}\` now requires authentication. Ensure the client attaches credentials for this call, reusing the repo's existing auth mechanism \u2014 never introduce a new credential source or hard-code a token.`;default:return`Review usages of \`${r}\` from \`${e}\` and update them for the new version.`}}var Vj=[{id:"prose-removed",kind:"removed-export",pattern:/`([\w$.]+)`(?:\(\))?\s+(?:has been|have been|was|were|is|are)\s+removed\b/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` was removed`},{id:"prose-removed-passive",kind:"removed-export",pattern:/\bremoved\s+(?:the\s+)?`([\w$.]+)`/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` was removed`},{id:"prose-renamed",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has been |was |is )?renamed\s+to\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` was renamed to \`${t[2]}\``},{id:"prose-replaced",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has been |was |is )?replaced\s+(?:by|with)\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` was replaced by \`${t[2]}\``},{id:"prose-deprecated-in-favour",kind:"renamed-export",pattern:/`([\w$.]+)`\s+is\s+deprecated\s+in\s+favou?r\s+of\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` is deprecated in favour of \`${t[2]}\``},{id:"prose-no-longer",kind:"behaviour-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+no\s+longer\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` no longer ${t[2]?.trim()}`},{id:"prose-now-requires",kind:"signature-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+now\s+(?:requires|takes|accepts|expects)\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` now requires ${t[2]?.trim()}`},{id:"prose-now-returns",kind:"type-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+now\s+returns\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` now returns ${t[2]?.trim()}`},{id:"prose-is-now",kind:"behaviour-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+(?:is|are|must)\s+now\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` is now ${t[2]?.trim()}`},{id:"prose-moved",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has\s+)?moved\s+to\s+`([\w$./@-]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` moved to \`${t[2]}\``},{id:"prose-min-runtime",kind:"runtime-requirement",pattern:/\b(?:requires?|required|now requires?|minimum(?: supported)?)\s+(node(?:\.js)?|python|go|ruby|java|rust)\s*(?:version\s*)?([>=^~]*\s*[\d.]+)/i,symbolGroup:1,summarize:t=>`Minimum ${t[1]} version raised to ${t[2]?.trim()}`},{id:"prose-esm-only",kind:"config-change",pattern:/\b(?:is now |now )?(?:pure ESM|ESM[\s-]only|ESM package)\b/i,symbolGroup:0,summarize:()=>"The package is now ESM-only and no longer supports `require()`"},{id:"prose-dropped-commonjs",kind:"config-change",pattern:/\b(?:dropped|removed|no longer (?:supports|provides))\s+CommonJS\b/i,symbolGroup:0,summarize:()=>"CommonJS support was dropped"},{id:"prose-dropped-support",kind:"runtime-requirement",pattern:/\b(?:dropped|drops|removed)\s+support\s+for\s+(.{3,60}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`Dropped support for ${t[1]?.trim()}`}];function eS(t){let e=[],n=t.replace(/^[-*+]\s+/,"").trim();if(!n)return e;for(let r of Vj){let s=r.pattern.exec(n);if(!s)continue;let i=r.symbolGroup===0?null:s[r.symbolGroup];if(r.symbolGroup!==0&&!i)continue;let o=r.replacementGroup?s[r.replacementGroup]:void 0;e.push({ruleId:r.id,kind:r.kind,summary:r.summarize(s),symbols:i?[i]:[],replacementSymbols:o?[o]:[],passage:n})}return e}function tS(t,e){let n=t.symbols[0]??"the affected API",r=t.replacementSymbols[0];switch(t.kind){case"removed-export":return`\`${n}\` was removed from \`${e}\`. Replace every usage. Verify against the installed version's actual exports before choosing a replacement \u2014 the changelog may be incomplete.`;case"renamed-export":return r?`Replace every usage of \`${n}\` with \`${r}\`, checking that the new API's signature matches before assuming it is a drop-in rename.`:`\`${n}\` was replaced. Migrate every usage to the documented successor.`;case"signature-change":return`The way \`${n}\` is called changed: ${t.summary}. Update every call site and confirm against the installed type declarations.`;case"type-change":return`The type produced by \`${n}\` changed: ${t.summary}. Update consumers of its return value, including any local type declarations.`;case"behaviour-change":return`Behaviour changed: ${t.summary}. Review call sites for assumptions that no longer hold. Prefer making the assumption explicit over silently adapting to the new behaviour.`;case"runtime-requirement":return`${t.summary}. Update the runtime version declared in CI workflows, engine fields, and container images. Do not change application logic for this.`;case"config-change":return t.ruleId==="prose-esm-only"||t.ruleId==="prose-dropped-commonjs"?`\`${e}\` is now ESM-only. Every \`require('${e}')\` must become a static \`import\`, and the importing files must themselves be ESM. If this repository is CommonJS, the smallest correct change is usually a dynamic \`await import('${e}')\` at the call site \u2014 do NOT downgrade the dependency, and do NOT convert the whole repository to ESM as part of this fix. If neither option works cleanly, stop and explain the situation in the pull request description rather than forcing it.`:`Configuration must change: ${t.summary}.`;default:return`Review usages of \`${n}\` and update them: ${t.summary}`}}var Wj=["api-shape","type-contract","behaviour","data-schema","configuration","runtime-environment","protocol","packaging"],zj=["manifest","link-or-import","compile-time","static-semantic","test-time","runtime-only","external-observation"],Hj=["symbol","type","module","package","dependency-cohort","runtime","ecosystem"],Kj=["direct","transitive","wrapper-mediated","re-exported","reflection-or-dynamic","generated","unknown"];var Jj={"export-removed":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["direct"]},"member-removed":{nature:"api-shape",detectability:["compile-time"],scope:"symbol",visibility:["direct"]},"signature-changed":{nature:"type-contract",detectability:["compile-time","static-semantic"],scope:"symbol",visibility:["direct"]},"kind-changed":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["direct"]},"member-now-required":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["direct"]},"entry-point-moved":{nature:"packaging",detectability:["manifest","link-or-import"],scope:"package",visibility:["direct"]},"package-removed":{nature:"packaging",detectability:["manifest","link-or-import"],scope:"package",visibility:["direct"]},"constant-value-changed":{nature:"behaviour",detectability:["static-semantic","runtime-only"],scope:"symbol",visibility:["direct"]},"path-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"module",visibility:["unknown"]},"operation-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"response-status-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"parameter-removed":{nature:"protocol",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"parameter-type-changed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"parameter-now-required":{nature:"protocol",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"response-field-removed":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"response-field-type-changed":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"request-field-type-changed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"request-field-now-required":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"request-enum-narrowed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"response-enum-widened":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"security-added":{nature:"configuration",detectability:["runtime-only"],scope:"module",visibility:["unknown"]}},Yj={"removed-export":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["unknown"]},"renamed-export":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["unknown"]},"moved-export":{nature:"packaging",detectability:["link-or-import","compile-time"],scope:"module",visibility:["unknown"]},"signature-change":{nature:"type-contract",detectability:["compile-time","static-semantic"],scope:"symbol",visibility:["unknown"]},"type-change":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["unknown"]},"behaviour-change":{nature:"behaviour",detectability:["test-time","runtime-only"],scope:"symbol",visibility:["unknown"]},"default-change":{nature:"behaviour",detectability:["test-time","runtime-only"],scope:"symbol",visibility:["unknown"]},"removed-endpoint":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"module",visibility:["unknown"]},"changed-endpoint":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"required-field-added":{nature:"data-schema",detectability:["compile-time","runtime-only"],scope:"type",visibility:["unknown"]},"config-change":{nature:"configuration",detectability:["static-semantic","runtime-only"],scope:"module",visibility:["unknown"]},"runtime-requirement":{nature:"runtime-environment",detectability:["manifest","runtime-only"],scope:"runtime",visibility:["direct"]},unknown:{nature:"behaviour",detectability:["runtime-only"],scope:"module",visibility:["unknown"]}};function ws(t,e){let n=e?Jj[e]:void 0;if(n)return{...nS(n),origin:"computed"};let r=Yj[t];return{...nS(r),origin:t==="unknown"?"default":"rule"}}function nS(t){return{nature:t.nature,detectability:[...t.detectability],scope:t.scope,visibility:[...t.visibility]}}function rt(t){return t.taxonomy??ws(t.kind)}function iS(t,e){if(!t||typeof t!="object")return e;let n=t,r=rS(n.nature,Wj),s=rS(n.scope,Hj),i=sS(n.detectability,zj),o=sS(n.visibility,Kj);return!r||!s?e:{nature:r,scope:s,detectability:i.length>0?i:[...e.detectability],visibility:o.length>0?o:["unknown"],origin:"llm-normalized"}}function rS(t,e){return typeof t=="string"&&e.includes(t)?t:null}function sS(t,e){if(!Array.isArray(t))return[];let n=new Set;for(let r of t)typeof r=="string"&&e.includes(r)&&n.add(r);return e.filter(r=>n.has(r))}function wc(t){let e=["manifest","link-or-import","compile-time","static-semantic"];return!t.detectability.some(n=>e.includes(n))}var PF={type:"object",properties:{changes:{type:"array",items:{type:"object",properties:{summary:{type:"string",description:"One sentence stating what changed upstream and why it breaks consumers."},remediation:{type:"string",description:"Imperative instructions for fixing affected call sites."},symbols:{type:"array",items:{type:"string"},description:"Exact identifiers to search for in consumer code: export names, method names, option keys, endpoint paths. Empty if the evidence names none."},kind:{type:"string",enum:["removed-export","renamed-export","signature-change","type-change","behaviour-change","removed-endpoint","changed-endpoint","required-field-added","default-change","config-change","runtime-requirement","unknown"]},evidenceId:{type:"string",description:"The id of the evidence excerpt this was extracted from."},taxonomy:{type:"object",properties:{nature:{type:"string",enum:["api-shape","type-contract","behaviour","data-schema","configuration","runtime-environment","protocol","packaging"]},detectability:{type:"array",items:{type:"string",enum:["manifest","link-or-import","compile-time","static-semantic","test-time","runtime-only","external-observation"]},description:"What would have to run to notice this. Be honest: a change that only shows up at runtime must not be listed as compile-time."},scope:{type:"string",enum:["symbol","type","module","package","dependency-cohort","runtime","ecosystem"]},visibility:{type:"array",items:{type:"string",enum:["direct","transitive","wrapper-mediated","re-exported","reflection-or-dynamic","generated","unknown"]},description:"Use `unknown` when the evidence does not say. Do not guess `direct`."}},required:["nature","detectability","scope","visibility"],additionalProperties:!1}},required:["summary","remediation","symbols","kind","evidenceId"],additionalProperties:!1}}},required:["changes"],additionalProperties:!1},OF=`You extract breaking changes from dependency release notes for an automated refactoring tool. +This does not necessarily require a source change \u2014 most code that only refers to \`${r}\` by name keeps working. Review code in this repository that depends on the concrete value: a hard-coded copy of the old number, a value persisted or sent over the wire, or a comparison against zero or another literal.`;case"kind-changed":return`\`${r}\` changed form (for example class to function, or interface to type alias). Update declarations, \`new\` expressions, and type positions accordingly.`;case"entry-point-moved":return`The import path changed, not the API. ${t.detail} Update the import specifier in every file that imports from \`${e}\`, and do not replace, stub, or re-implement the individual symbols \u2014 they still exist under the new entry point. If you cannot determine which entry point carries a symbol this repository uses, leave that import alone with a \`TODO(drift):\` comment naming the symbol.`;case"package-removed":return`The package \`${r}\` no longer exists in \`${e}\`. Update the import path in every file that imports it to whichever package now provides the same API. Do not re-implement or stub the symbols it exported \u2014 if you cannot determine the replacement package, leave the import in place with a \`TODO(drift):\` comment naming it rather than guessing.`;case"member-now-required":return`\`${r}\` is now required. Supply an explicit value at every construction site. Choose the value that preserves the previous default behaviour; if the previous default is not documented, leave a TODO and flag it in the PR description rather than guessing.`;case"path-removed":case"operation-removed":return`The endpoint \`${r}\` no longer exists. Locate the client code that calls it and migrate to the replacement endpoint. If there is no replacement, do not delete the feature \u2014 leave the call site intact with a clearly-marked TODO and explain it in the PR description.`;case"response-status-removed":return`\`${r}\` no longer returns this success status. Update response handling so the removed status is no longer treated as a success path.`;case"parameter-removed":return`A required parameter was removed from \`${r}\`. Remove it from client calls; sending it may now be rejected as an unexpected parameter.`;case"parameter-now-required":case"request-field-now-required":return`\`${r}\` now requires this field. Add it to every request built in this repo, using a value consistent with the surrounding code's intent.`;case"parameter-type-changed":case"request-field-type-changed":return`The request type for \`${r}\` changed. Update serialisation at each call site so the value sent matches the new type.`;case"response-field-removed":return`\`${r}\` no longer returns this field. Update every reader of that field. If the value is genuinely no longer available, propagate the absence properly rather than substituting a placeholder that could be mistaken for real data.`;case"response-field-type-changed":return`The response type for \`${r}\` changed. Update parsing and any downstream type declarations.`;case"request-enum-narrowed":return`\`${r}\` no longer accepts some previously-valid values. Find code that sends the removed values and map them onto still-supported ones.`;case"response-enum-widened":return`\`${r}\` can now return values this code has never seen. Add explicit handling; make sure exhaustive switches and mapping tables have a safe default rather than falling through silently.`;case"security-added":return`\`${r}\` now requires authentication. Ensure the client attaches credentials for this call, reusing the repo's existing auth mechanism \u2014 never introduce a new credential source or hard-code a token.`;default:return`Review usages of \`${r}\` from \`${e}\` and update them for the new version.`}}var Pj=[{id:"prose-removed",kind:"removed-export",pattern:/`([\w$.]+)`(?:\(\))?\s+(?:has been|have been|was|were|is|are)\s+removed\b/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` was removed`},{id:"prose-removed-passive",kind:"removed-export",pattern:/\bremoved\s+(?:the\s+)?`([\w$.]+)`/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` was removed`},{id:"prose-renamed",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has been |was |is )?renamed\s+to\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` was renamed to \`${t[2]}\``},{id:"prose-replaced",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has been |was |is )?replaced\s+(?:by|with)\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` was replaced by \`${t[2]}\``},{id:"prose-deprecated-in-favour",kind:"renamed-export",pattern:/`([\w$.]+)`\s+is\s+deprecated\s+in\s+favou?r\s+of\s+`([\w$.]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` is deprecated in favour of \`${t[2]}\``},{id:"prose-no-longer",kind:"behaviour-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+no\s+longer\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` no longer ${t[2]?.trim()}`},{id:"prose-now-requires",kind:"signature-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+now\s+(?:requires|takes|accepts|expects)\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` now requires ${t[2]?.trim()}`},{id:"prose-now-returns",kind:"type-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+now\s+returns\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` now returns ${t[2]?.trim()}`},{id:"prose-is-now",kind:"behaviour-change",pattern:/`([\w$.]+)(?:\([^`]*\))?`(?:\(\))?(?:[\w\s,`()[\]{}$.]{0,40}?)\s+(?:is|are|must)\s+now\s+(.{3,90}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`\`${t[1]}\` is now ${t[2]?.trim()}`},{id:"prose-moved",kind:"renamed-export",pattern:/`([\w$.]+)`\s+(?:has\s+)?moved\s+to\s+`([\w$./@-]+)`/i,symbolGroup:1,replacementGroup:2,summarize:t=>`\`${t[1]}\` moved to \`${t[2]}\``},{id:"prose-min-runtime",kind:"runtime-requirement",pattern:/\b(?:requires?|required|now requires?|minimum(?: supported)?)\s+(node(?:\.js)?|python|go|ruby|java|rust)\s*(?:version\s*)?([>=^~]*\s*[\d.]+)/i,symbolGroup:1,summarize:t=>`Minimum ${t[1]} version raised to ${t[2]?.trim()}`},{id:"prose-esm-only",kind:"config-change",pattern:/\b(?:is now |now )?(?:pure ESM|ESM[\s-]only|ESM package)\b/i,symbolGroup:0,summarize:()=>"The package is now ESM-only and no longer supports `require()`"},{id:"prose-dropped-commonjs",kind:"config-change",pattern:/\b(?:dropped|removed|no longer (?:supports|provides))\s+CommonJS\b/i,symbolGroup:0,summarize:()=>"CommonJS support was dropped"},{id:"prose-dropped-support",kind:"runtime-requirement",pattern:/\b(?:dropped|drops|removed)\s+support\s+for\s+(.{3,60}?)(?:[.;]|$)/i,symbolGroup:1,summarize:t=>`Dropped support for ${t[1]?.trim()}`}];function CS(t){let e=[],n=t.replace(/^[-*+]\s+/,"").trim();if(!n)return e;for(let r of Pj){let s=r.pattern.exec(n);if(!s)continue;let i=r.symbolGroup===0?null:s[r.symbolGroup];if(r.symbolGroup!==0&&!i)continue;let o=r.replacementGroup?s[r.replacementGroup]:void 0;e.push({ruleId:r.id,kind:r.kind,summary:r.summarize(s),symbols:i?[i]:[],replacementSymbols:o?[o]:[],passage:n})}return e}function AS(t,e){let n=t.symbols[0]??"the affected API",r=t.replacementSymbols[0];switch(t.kind){case"removed-export":return`\`${n}\` was removed from \`${e}\`. Replace every usage. Verify against the installed version's actual exports before choosing a replacement \u2014 the changelog may be incomplete.`;case"renamed-export":return r?`Replace every usage of \`${n}\` with \`${r}\`, checking that the new API's signature matches before assuming it is a drop-in rename.`:`\`${n}\` was replaced. Migrate every usage to the documented successor.`;case"signature-change":return`The way \`${n}\` is called changed: ${t.summary}. Update every call site and confirm against the installed type declarations.`;case"type-change":return`The type produced by \`${n}\` changed: ${t.summary}. Update consumers of its return value, including any local type declarations.`;case"behaviour-change":return`Behaviour changed: ${t.summary}. Review call sites for assumptions that no longer hold. Prefer making the assumption explicit over silently adapting to the new behaviour.`;case"runtime-requirement":return`${t.summary}. Update the runtime version declared in CI workflows, engine fields, and container images. Do not change application logic for this.`;case"config-change":return t.ruleId==="prose-esm-only"||t.ruleId==="prose-dropped-commonjs"?`\`${e}\` is now ESM-only. Every \`require('${e}')\` must become a static \`import\`, and the importing files must themselves be ESM. If this repository is CommonJS, the smallest correct change is usually a dynamic \`await import('${e}')\` at the call site \u2014 do NOT downgrade the dependency, and do NOT convert the whole repository to ESM as part of this fix. If neither option works cleanly, stop and explain the situation in the pull request description rather than forcing it.`:`Configuration must change: ${t.summary}.`;default:return`Review usages of \`${n}\` and update them: ${t.summary}`}}var Ij=["api-shape","type-contract","behaviour","data-schema","configuration","runtime-environment","protocol","packaging"],Oj=["manifest","link-or-import","compile-time","static-semantic","test-time","runtime-only","external-observation"],Dj=["symbol","type","module","package","dependency-cohort","runtime","ecosystem"],Mj=["direct","transitive","wrapper-mediated","re-exported","reflection-or-dynamic","generated","unknown"];var Nj={"export-removed":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["direct"]},"member-removed":{nature:"api-shape",detectability:["compile-time"],scope:"symbol",visibility:["direct"]},"signature-changed":{nature:"type-contract",detectability:["compile-time","static-semantic"],scope:"symbol",visibility:["direct"]},"kind-changed":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["direct"]},"member-now-required":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["direct"]},"entry-point-moved":{nature:"packaging",detectability:["manifest","link-or-import"],scope:"package",visibility:["direct"]},"package-removed":{nature:"packaging",detectability:["manifest","link-or-import"],scope:"package",visibility:["direct"]},"constant-value-changed":{nature:"behaviour",detectability:["static-semantic","runtime-only"],scope:"symbol",visibility:["direct"]},"path-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"module",visibility:["unknown"]},"operation-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"response-status-removed":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"parameter-removed":{nature:"protocol",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"parameter-type-changed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"parameter-now-required":{nature:"protocol",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"response-field-removed":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"response-field-type-changed":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"request-field-type-changed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"request-field-now-required":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"request-enum-narrowed":{nature:"data-schema",detectability:["runtime-only"],scope:"symbol",visibility:["unknown"]},"response-enum-widened":{nature:"data-schema",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"security-added":{nature:"configuration",detectability:["runtime-only"],scope:"module",visibility:["unknown"]}},Lj={"removed-export":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["unknown"]},"renamed-export":{nature:"api-shape",detectability:["link-or-import","compile-time"],scope:"symbol",visibility:["unknown"]},"moved-export":{nature:"packaging",detectability:["link-or-import","compile-time"],scope:"module",visibility:["unknown"]},"signature-change":{nature:"type-contract",detectability:["compile-time","static-semantic"],scope:"symbol",visibility:["unknown"]},"type-change":{nature:"type-contract",detectability:["compile-time"],scope:"type",visibility:["unknown"]},"behaviour-change":{nature:"behaviour",detectability:["test-time","runtime-only"],scope:"symbol",visibility:["unknown"]},"default-change":{nature:"behaviour",detectability:["test-time","runtime-only"],scope:"symbol",visibility:["unknown"]},"removed-endpoint":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"module",visibility:["unknown"]},"changed-endpoint":{nature:"protocol",detectability:["runtime-only","external-observation"],scope:"symbol",visibility:["unknown"]},"required-field-added":{nature:"data-schema",detectability:["compile-time","runtime-only"],scope:"type",visibility:["unknown"]},"config-change":{nature:"configuration",detectability:["static-semantic","runtime-only"],scope:"module",visibility:["unknown"]},"runtime-requirement":{nature:"runtime-environment",detectability:["manifest","runtime-only"],scope:"runtime",visibility:["direct"]},unknown:{nature:"behaviour",detectability:["runtime-only"],scope:"module",visibility:["unknown"]}};function _s(t,e){let n=e?Nj[e]:void 0;if(n)return{...PS(n),origin:"computed"};let r=Lj[t];return{...PS(r),origin:t==="unknown"?"default":"rule"}}function PS(t){return{nature:t.nature,detectability:[...t.detectability],scope:t.scope,visibility:[...t.visibility]}}function ot(t){return t.taxonomy??_s(t.kind)}function DS(t,e){if(!t||typeof t!="object")return e;let n=t,r=IS(n.nature,Ij),s=IS(n.scope,Dj),i=OS(n.detectability,Oj),o=OS(n.visibility,Mj);return!r||!s?e:{nature:r,scope:s,detectability:i.length>0?i:[...e.detectability],visibility:o.length>0?o:["unknown"],origin:"llm-normalized"}}function IS(t,e){return typeof t=="string"&&e.includes(t)?t:null}function OS(t,e){if(!Array.isArray(t))return[];let n=new Set;for(let r of t)typeof r=="string"&&e.includes(r)&&n.add(r);return e.filter(r=>n.has(r))}function Mc(t){let e=["manifest","link-or-import","compile-time","static-semantic"];return!t.detectability.some(n=>e.includes(n))}var bq={type:"object",properties:{changes:{type:"array",items:{type:"object",properties:{summary:{type:"string",description:"One sentence stating what changed upstream and why it breaks consumers."},remediation:{type:"string",description:"Imperative instructions for fixing affected call sites."},symbols:{type:"array",items:{type:"string"},description:"Exact identifiers to search for in consumer code: export names, method names, option keys, endpoint paths. Empty if the evidence names none."},kind:{type:"string",enum:["removed-export","renamed-export","signature-change","type-change","behaviour-change","removed-endpoint","changed-endpoint","required-field-added","default-change","config-change","runtime-requirement","unknown"]},evidenceId:{type:"string",description:"The id of the evidence excerpt this was extracted from."},taxonomy:{type:"object",properties:{nature:{type:"string",enum:["api-shape","type-contract","behaviour","data-schema","configuration","runtime-environment","protocol","packaging"]},detectability:{type:"array",items:{type:"string",enum:["manifest","link-or-import","compile-time","static-semantic","test-time","runtime-only","external-observation"]},description:"What would have to run to notice this. Be honest: a change that only shows up at runtime must not be listed as compile-time."},scope:{type:"string",enum:["symbol","type","module","package","dependency-cohort","runtime","ecosystem"]},visibility:{type:"array",items:{type:"string",enum:["direct","transitive","wrapper-mediated","re-exported","reflection-or-dynamic","generated","unknown"]},description:"Use `unknown` when the evidence does not say. Do not guess `direct`."}},required:["nature","detectability","scope","visibility"],additionalProperties:!1}},required:["summary","remediation","symbols","kind","evidenceId"],additionalProperties:!1}}},required:["changes"],additionalProperties:!1},wq=`You extract breaking changes from dependency release notes for an automated refactoring tool. Rules you must follow: @@ -838,127 +838,148 @@ Rules you must follow: 3. \`symbols\` must be identifiers that would literally appear in consumer source code. Never put prose, descriptions, or package names there. If the evidence describes a change without naming an identifier, return an empty \`symbols\` array rather than inventing one. 4. \`evidenceId\` must be copied exactly from the evidence block the finding came from. 5. Do not restate a change that is already listed under "Already found" \u2014 those are handled. -6. Write \`remediation\` as instructions to an engineer, describing what to change. Do not speculate about replacements the evidence does not mention; say the replacement is unknown instead.`;async function QS(t,e,n,r){let{config:s,logger:i}=r,o=process.env[s.llm.apiKeyEnv];if(!o)return i.warn(`llm.enabled is true but ${s.llm.apiKeyEnv} is not set; skipping LLM extraction. The rule-based analyser still ran.`),[];let a=await IF(o,i);if(!a)return[];let c=e.filter(u=>!u.findings?.length&&u.source!=="semver-heuristic"&&u.source!=="registry-metadata");if(c.length===0)return[];let l=[];for(let u of t){let d=c.filter(p=>p.dependency===u.name&&p.workspace===u.workspace);if(d.length!==0)try{let p=await DF(a,s,u,d,n);l.push(...MF(p,u.name,u.workspace,d))}catch(p){i.warn(`LLM extraction failed for ${u.name}: ${p.message}`)}}return l}async function IF(t,e){try{let n=await Promise.resolve().then(()=>(ZS(),YS));return new n.default({apiKey:t})}catch{return e.warn("llm.enabled is true but @anthropic-ai/sdk is not installed. Run `npm install @anthropic-ai/sdk` or set llm.enabled: false."),null}}async function DF(t,e,n,r,s){let i=s.filter(u=>u.dependency===n.name&&u.workspace===n.workspace).map(u=>`- ${u.summary}`).join(` -`),o=r.map(u=>` -${GF(u.content,6e3)} +6. Write \`remediation\` as instructions to an engineer, describing what to change. Do not speculate about replacements the evidence does not mention; say the replacement is unknown instead.`;async function Rx(t,e,n,r){let{config:s,logger:i}=r,o=process.env[s.llm.apiKeyEnv];if(!o)return i.warn(`llm.enabled is true but ${s.llm.apiKeyEnv} is not set; skipping LLM extraction. The rule-based analyser still ran.`),[];let a=await vq(o,i);if(!a)return[];let c=e.filter(u=>!u.findings?.length&&u.source!=="semver-heuristic"&&u.source!=="registry-metadata");if(c.length===0)return[];let l=[];for(let u of t){let d=c.filter(p=>p.dependency===u.name&&p.workspace===u.workspace);if(d.length!==0)try{let p=await kq(a,s,u,d,n);l.push(...Eq(p,u.name,u.workspace,d))}catch(p){i.warn(`LLM extraction failed for ${u.name}: ${p.message}`)}}return l}async function vq(t,e){try{let n=await Promise.resolve().then(()=>(_x(),Tx));return new n.default({apiKey:t})}catch{return e.warn("llm.enabled is true but @anthropic-ai/sdk is not installed. Run `npm install @anthropic-ai/sdk` or set llm.enabled: false."),null}}async function kq(t,e,n,r,s){let i=s.filter(u=>u.dependency===n.name&&u.workspace===n.workspace).map(u=>`- ${u.summary}`).join(` +`),o=r.map(u=>` +${Tq(u.content,6e3)} `).join(` `),a=[`Dependency: ${n.name} (${n.ecosystem})`,`Version change: ${n.from} \u2192 ${n.to} (${n.bump})`,"",i?`Already found by deterministic rules \u2014 do not repeat these: ${i} `:"","Evidence:",o].filter(Boolean).join(` -`),c=await t.messages.create({model:e.llm.model,max_tokens:16e3,system:OF,thinking:{type:"adaptive"},output_config:{effort:e.llm.effort,format:{type:"json_schema",schema:PF}},messages:[{role:"user",content:a}]});if(c.stop_reason==="refusal")return[];let l=c.content.find(u=>u.type==="text")?.text;if(!l)return[];try{let u=JSON.parse(l);return Array.isArray(u.changes)?u.changes:[]}catch{return[]}}function MF(t,e,n,r){let s=new Set(r.map(i=>i.id));return t.filter(i=>s.has(i.evidenceId)).filter(i=>i.summary?.trim()).map(i=>({id:we("bc",e,n,"llm",i.summary),dependency:e,workspace:n,kind:XS(i.kind),summary:i.summary.trim(),remediation:i.remediation?.trim()||`Review usages of ${e} and update them.`,symbols:(i.symbols??[]).filter(NF),confidence:"medium",taxonomy:iS(i.taxonomy,ws(XS(i.kind))),citations:[i.evidenceId]}))}function NF(t){let e=t.trim();return!e||e.length>80||/\s/.test(e)&&!e.startsWith("/")?!1:/^[/@]?[\w$][\w$./{}-]*$/.test(e)}var LF=new Set(["removed-export","renamed-export","signature-change","type-change","behaviour-change","removed-endpoint","changed-endpoint","required-field-added","default-change","config-change","runtime-requirement"]);function XS(t){return LF.has(t)?t:"unknown"}function GF(t,e){return t.length<=e?t:`${t.slice(0,e)} -\u2026(truncated)`}function jF(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}var r_=require("node:crypto");var FF=[{band:"high",min:.8},{band:"medium",min:.5},{band:"low",min:.2},{band:"none",min:0}];function e_(t){for(let e of FF)if(t>=e.min)return e.band;return"none"}var Ls="drift-confidence-1",qF={"type-surface-diff":"computed-artifact","openapi-diff":"computed-artifact",changelog:"maintainer-narrative","github-release":"maintainer-narrative","migration-guide":"maintainer-guide","behavioural-diff":"dynamic-observation","registry-metadata":"registry","semver-heuristic":"heuristic"},UF={"computed-artifact":.9,"maintainer-guide":.7,"maintainer-narrative":.6,"dynamic-observation":.5,registry:.4,heuristic:.2};function pf(t){let{change:e,evidence:n}=t,r=n.filter(d=>e.citations.includes(d.id)),s=[],i=[];if(r.length===0)return{score:0,band:"none",evidence:[],penalties:[{code:"no-citations",detail:"No evidence record backs this finding.",delta:0}],calibration:Ls};let o=BF(r),a=0,c="";for(let d of o.keys()){let p=UF[d]??.3;p>a&&(a=p,c=d)}s.push({code:`origin:${c}`,detail:`Strongest evidence class is ${df(c)}.`,delta:a});let l=a,u=o.size-1;if(u>0){let d=Math.min(.15,.08*u);l+=d,s.push({code:"corroborated",detail:`Corroborated by ${u} other independent source class(es): ${[...o.keys()].filter(p=>p!==c).map(df).join(", ")}.`,delta:d})}else r.length>1&&i.push({code:"single-origin",detail:`All ${r.length} citations trace to one source class (${df(c)}), so they do not corroborate each other.`,delta:0});return o.size===1&&c==="heuristic"&&(l+=-.1,i.push({code:"heuristic-only",detail:"Only a semver heuristic supports this; no changelog, release note, or API diff was retrieved.",delta:-.1})),ff(l,s,i)}function BF(t){let e=new Map,n=new Set;for(let r of t){let s=(0,r_.createHash)("sha256").update(r.content.replace(/\s+/g," ").trim().toLowerCase()).digest("hex");if(n.has(s))continue;n.add(s);let i=qF[r.source]??"unknown",o=e.get(i);o?o.push(r):e.set(i,[r])}return e}function df(t){switch(t){case"computed-artifact":return"a computed diff of the shipped artifact";case"maintainer-guide":return"a migration guide";case"maintainer-narrative":return"release notes or a changelog";case"registry":return"registry metadata";case"heuristic":return"a semver heuristic";default:return t}}function VF(t){let{taxonomy:e,sites:n,localizationRan:r}=t,s=[],i=[];if(!r)return{score:0,band:"none",evidence:[],penalties:[{code:"localization-unavailable",detail:"No checkout was available, so Drift could not search this repository. This is not evidence that the change is unused.",delta:0}],calibration:Ls};if(n.length===0){let d=wc(e);return{score:0,band:"none",evidence:[],penalties:[{code:d?"not-locally-checkable":"no-usage-found",detail:d?"This change is only observable at runtime, so a source search cannot establish whether this repository is affected.":"Drift searched the files that import this dependency and found no usage of the affected symbols.",delta:0}],calibration:Ls}}let o=n.reduce((d,p)=>n_(p.confidence)>n_(d.confidence)?p:d),a=o.confidence==="high"?.85:o.confidence==="medium"?.6:.3;s.push({code:`site:${o.confidence}`,detail:o.confidence==="high"?`\`${o.matchedSymbol}\` is bound from an import of this dependency in ${o.file}.`:o.confidence==="medium"?`${o.file} imports this dependency and uses \`${o.matchedSymbol}\`, but the symbol was not traced to the import.`:`\`${o.matchedSymbol}\` appears in ${o.file}, but no import of this dependency was established \u2014 the match may be coincidental.`,delta:a});let c=a;if(n.length>1){let d=Math.min(.05,.01*(n.length-1));c+=d,s.push({code:"multiple-sites",detail:`${n.length} affected locations across ${new Set(n.map(p=>p.file)).size} file(s).`,delta:d})}let l=n.filter(d=>WF(d.file));return l.length===n.length?(c+=-.25,i.push({code:"generated-only",detail:`Every affected location is in generated code (${l[0].file}). Editing it is usually wrong; the generator is the real site.`,delta:-.25})):l.length>0&&(c+=-.05,i.push({code:"some-generated",detail:`${l.length} affected location(s) are in generated code.`,delta:-.05})),e.visibility.includes("reflection-or-dynamic")&&(c+=-.2,i.push({code:"dynamic-access",detail:"Dynamic or reflective access was detected, so the affected set cannot be enumerated by search.",delta:-.2})),e.visibility.includes("wrapper-mediated")&&(c+=-.1,i.push({code:"wrapper-mediated",detail:"Usage is mediated by a local wrapper, so downstream callers of the wrapper are not enumerated here.",delta:-.1})),n.every(d=>d.confidence==="low")&&(c+=-.1,i.push({code:"textual-only",detail:"Every match is textual \u2014 no import edge was established for any of them.",delta:-.1})),ff(c,s,i)}function WF(t){let e=t.toLowerCase();return/(^|\/)(generated|__generated__|gen|dist|build|out|vendor|node_modules)\//.test(e)||/\.(g|generated)\.[a-z]+$/.test(e)||/\.pb\.(go|ts|js|py)$/.test(e)||/_pb2?\.py$/.test(e)||/\.d\.ts$/.test(e)}function zF(t){let{outcomes:e,affectedFiles:n,taxonomy:r}=t;if(e.length===0)return{score:0,band:"none",evidence:[],penalties:[{code:"nothing-ran",detail:"No checks were run against this finding, so nothing confirms the change was understood correctly.",delta:0}],calibration:Ls};let s=[],i=[],o=e.filter(p=>p.status==="passed"),a=e.filter(p=>p.status==="failed"),c=e.filter(p=>p.status==="skipped"||p.status==="unavailable"||p.status==="timed-out");if(a.length>0)return{score:0,band:"none",evidence:[],penalties:[{code:"checks-failed",detail:`${a.length} check(s) failed: ${a.map(p=>p.name).join(", ")}.`,delta:0}],calibration:Ls};let l=0,u=r.detectability.some(p=>p==="compile-time"||p==="link-or-import"||p==="manifest");for(let p of o){let f=/type|compile|build|lint/i.test(p.name),g=/test|spec/i.test(p.name)?.45:f?u?.4:.15:.1;l+=g,s.push({code:`passed:${p.name}`,detail:f&&!u?`\`${p.name}\` passed, but this change is not detectable at compile time \u2014 it does not confirm the behaviour is right.`:`\`${p.name}\` passed.`,delta:g})}for(let p of c)i.push({code:`did-not-run:${p.name}`,detail:`\`${p.name}\` was ${p.status} and proves nothing.`,delta:0});let d=new Set(o.flatMap(p=>p.covers??[]));return d.size>0&&n.length>0?n.filter(f=>d.has(f)).length===0&&(l+=-.2,i.push({code:"no-coverage",detail:"The checks that passed do not cover any of the affected files.",delta:-.2})):n.length>0&&i.push({code:"coverage-unknown",detail:"Which code paths the passing checks cover could not be established.",delta:0}),ff(l,s,i)}function s_(t){let e=pf({change:t.change,evidence:t.evidence}),n=VF({change:t.change,taxonomy:t.taxonomy,sites:t.sites,localizationRan:t.localizationRan}),r=zF({outcomes:t.outcomes??[],affectedFiles:[...new Set(t.sites.map(a=>a.file))],taxonomy:t.taxonomy}),s=[...t.gaps??[]],i=[];e.band==="high"&&n.band==="none"&&i.push({code:"upstream-only",detail:"The upstream change is well established, but nothing in this repository was shown to be affected. High upstream confidence is not a reason to edit code.",delta:0});let o=e.band==="high"&&(n.band==="high"||n.band==="medium")&&!s.some(a=>a.automaticExecution==="blocks");return{upstream:e,localImpact:n,verification:r,automaticExecutionEligible:o,reasons:i,checkedSurfaces:[...t.checkedSurfaces??[]],gaps:s}}function i_(t){let e=t.upstream.band,n=t.localImpact.band;return n==="none"?e==="high"?"medium":t_(e):t_(HF(e,n))}function t_(t){return t==="high"?"high":t==="medium"?"medium":"low"}function HF(t,e){let n=["none","low","medium","high"];return n.indexOf(t)<=n.indexOf(e)?t:e}function n_(t){return t==="high"?2:t==="medium"?1:0}function ff(t,e,n){let r=Math.round(Math.max(0,Math.min(1,t))*100)/100;return{score:r,band:e_(r),evidence:e,penalties:n,calibration:Ls}}async function o_(t,e,n){let{config:r,logger:s}=n,i=KF(e),o=[];for(let a of t){let c=i.get(ar(a))??[];o.push(...JF(a.name,a.workspace,c))}for(let a of e)a.source==="openapi-diff"&&o.push(...a_(a));if(r.llm.enabled){let a=await QS(t,e,o,{config:r,logger:s});o.push(...a)}return tq(rq(o),e)}function KF(t){let e=new Map;for(let n of t){let r=ar({name:n.dependency,workspace:n.workspace}),s=e.get(r);s?s.push(n):e.set(r,[n])}return e}function JF(t,e,n){let r=[];for(let s of n){if(s.findings?.length){r.push(...a_(s));continue}s.source==="semver-heuristic"||s.source==="registry-metadata"||r.push(...QF(s,t,e))}return r}function a_(t){return(t.findings??[]).map(e=>({id:we("bc",t.dependency,t.workspace,e.code,e.symbol),dependency:t.dependency,workspace:t.workspace,kind:fp(e.code),summary:e.detail,remediation:QE(e,t.dependency),symbols:YF(e),confidence:"high",taxonomy:ws(fp(e.code),e.code),citations:[t.id]}))}function YF(t){let e=new Set([t.symbol]);if(t.symbol.includes(".")&&!/\s/.test(t.symbol)){let r=t.symbol.split("."),s=r[r.length-1];if(s&&!ZF(s)&&e.add(s),r.length>2){let i=r[r.length-2];i&&e.add(`${i}.${s}`)}}let n=/^[A-Z]+\s+(\/\S*)$/.exec(t.symbol);if(n?.[1]){e.add(n[1]);let r=n[1].split("{")[0]?.replace(/\/$/,"");r&&r.length>1&&e.add(r)}return[...e]}function ZF(t){return/^__\w+__$/.test(t)?!0:XF.has(t.toLowerCase())}var XF=new Set(["add","all","any","append","apply","build","call","check","clear","clone","close","connect","copy","count","create","define","delete","each","emit","end","execute","exists","extend","fetch","filter","find","first","flush","format","get","handle","has","index","init","insert","is","items","iter","join","keys","last","length","list","load","log","main","map","match","new","next","open","parse","pop","push","put","query","read","remove","render","reset","resolve","run","save","send","set","size","sort","split","start","stop","update","wait","write","args","body","config","content","context","data","error","file","header","headers","host","id","key","name","options","params","path","port","result","root","status","text","type","url","value","values"]);function QF(t,e,n){let r=[],s=new Set;for(let i of t.content.split(` -`))for(let o of eS(i)){let a=`${o.kind}:${o.symbols.join(",")}`;if(s.has(a))continue;s.add(a);let c=o.symbols.length>0?o.symbols:[e];r.push({id:we("bc",e,n,o.ruleId,o.symbols.join(",")),dependency:e,workspace:n,kind:o.kind,summary:o.summary,remediation:tS(o,e),symbols:c,replacementSymbols:o.replacementSymbols.length?o.replacementSymbols:void 0,confidence:eq(t),taxonomy:ws(o.kind),citations:[t.id]})}return r}function eq(t){return t.weight>=.95?"high":t.weight>=.6?"medium":"low"}function tq(t,e){return t.map(n=>{let r=pf({change:n,evidence:e});return{...n,confidence:nq(r.band)}})}function nq(t){return t==="high"?"high":t==="medium"?"medium":"low"}function rq(t){let e=new Map;for(let r of t){let s=`${ar({name:r.dependency,workspace:r.workspace})}|${r.kind}|${[...r.symbols].sort().join(",")}`,i=e.get(s);if(!i){e.set(s,{...r,citations:[...new Set(r.citations)]});continue}e.set(s,{...i,summary:i.summary.length>=r.summary.length?i.summary:r.summary,symbols:[...new Set([...i.symbols,...r.symbols])],replacementSymbols:[...new Set([...i.replacementSymbols??[],...r.replacementSymbols??[]])].filter(Boolean).length?[...new Set([...i.replacementSymbols??[],...r.replacementSymbols??[]])]:void 0,confidence:iq(i.confidence,r.confidence),taxonomy:sq(rt(i),rt(r)),citations:[...new Set([...i.citations,...r.citations])]})}let n={high:0,medium:1,low:2};return[...e.values()].sort((r,s)=>n[r.confidence]-n[s.confidence]||r.dependency.localeCompare(s.dependency))}function sq(t,e){let n={computed:3,rule:2,"llm-normalized":1,default:0};return n[t.origin]>=n[e.origin]?t:e}function iq(t,e){let n={low:0,medium:1,high:2};return n[t]>=n[e]?t:e}function mf(t,e){let n={low:0,medium:1,high:2};return n[t]>=n[e]}function hf(t){return t.keys??[t.packageName]}function f_(t){let e=[],n=new Map,r=new Set(t.map(o=>o.path));for(let o of t){let a=oq(o),c=Gq(o);e.push({path:o.path,language:o.language,lineCount:o.lineCount,imports:a,localImports:aq(o),units:c,summary:Vq(o,c,a)});for(let l of new Set(a.flatMap(hf))){let u=n.get(l);u?u.push(o.path):n.set(l,[o.path])}}let s=new Map,i=dq(r);for(let o of e)for(let a of o.localImports){let c=pq(o.path,a.specifier,r,i);if(!c||c===o.path)continue;let l=s.get(c),u={from:o.path,bindings:a.bindings,reExport:a.reExport,line:a.line};l?l.push(u):s.set(c,[u])}return{files:e,importers:n,localImporters:s,stats:{fileCount:e.length,unitCount:e.reduce((o,a)=>o+a.units.length,0),totalLines:e.reduce((o,a)=>o+a.lineCount,0)}}}function m_(t,e){let n;for(let r of t.units)er.endLine||(!n||r.endLine-r.startLine]+)>|"([^"]+)")/.exec(n[r]),i=s?.[1]??s?.[2];i&&e.push({specifier:i,line:r+1,bindings:[],reExport:!0})}return e}function dq(t){let e=new Map,n=(r,s)=>{let i=e.get(r);i?i.push(s):e.set(r,[s])};for(let r of t){let s=r.split("/").pop()??r;n(s.toLowerCase(),r)}return e}var c_=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".py"];function pq(t,e,n,r){if(e.startsWith(".")){let o=t.split("/").slice(0,-1),a=fq([...o,...e.split("/")]);if(a===void 0)return;let l=/^\.+$/.test(e)||!e.includes("/")&&e.startsWith(".")?[`${l_(t,e)}.py`,`${l_(t,e)}/__init__.py`]:[a,...c_.map(u=>a+u),...c_.map(u=>`${a}/index${u}`),`${a}/__init__.py`];for(let u of l)if(u&&n.has(u))return u;return}let s=(e.split("/").pop()??e).toLowerCase(),i=(r.get(s)??[]).filter(o=>o.toLowerCase().endsWith(e.toLowerCase()));return i.length===1?i[0]:void 0}function fq(t){let e=[];for(let n of t)if(!(n===""||n===".")){if(n===".."){if(e.length===0)return;e.pop();continue}e.push(n)}return e.join("/")}function l_(t,e){let n=/^\.+/.exec(e)?.[0].length??1,r=e.slice(n).split(".").filter(Boolean);return[...t.split("/").slice(0,-n),...r].join("/")}function mq(t){let e=[],n=t.split(` -`);for(let r=0;r]+)>|"([^"]+)")/.exec(n[r]),i=s?.[1]??s?.[2];i&&(i.startsWith(".")||e.push({specifier:i,packageName:gq(i),bindings:[],line:r+1,reExport:!0}))}return e}function gq(t){return(t.split("/")[0]??t).replace(/\.(h|hpp|hh|hxx|inl|tpp|h\+\+)$/i,"").toLowerCase()}function hq(t){let e=[],n=h_(t),r=u=>y_(n,u),s=/\bimport\s+(?!\()(?:(?:type\s+)?([\w$]+)\s*,\s*)?(?:type\s+)?(?:\{([^}]+)\}|\*\s+as\s+([\w$]+)|([\w$]+))\s+from\s+['"]([^'"]+)['"]|\bimport\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(s)){let d=u[5]??u[6];if(!d||Gs(d))continue;let p=gf(u[1],u[2],u[3],u[4]);e.push({specifier:d,packageName:js(d),bindings:p,line:r(u.index??0)})}let i=/\b(?:const|let|var)\s+(\{[^}]+\}|[\w$]+)\s*=\s*require\(\s*['"]([^'"]+)['"]\s*\)/g;for(let u of t.matchAll(i)){let d=u[2];Gs(d)||e.push({specifier:d,packageName:js(d),bindings:yq(u[1]),line:r(u.index??0)})}let o=/\bimport\(\s*['"]([^'"]+)['"]\s*\)/g;for(let u of t.matchAll(o)){let d=u[1];Gs(d)||e.push({specifier:d,packageName:js(d),bindings:[],line:r(u.index??0)})}let a=/\bexport\s+(?:type\s+)?\{([^}]*)\}\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(a)){let d=u[2];Gs(d)||e.push({specifier:d,packageName:js(d),bindings:gf(void 0,u[1],void 0,void 0),line:r(u.index??0),reExport:!0})}let c=/\bexport\s+\*\s+as\s+([\w$]+)\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(c)){let d=u[2];Gs(d)||e.push({specifier:d,packageName:js(d),bindings:["*",u[1]],line:r(u.index??0),reExport:!0})}let l=/\bexport\s+\*\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(l)){let d=u[1];Gs(d)||e.push({specifier:d,packageName:js(d),bindings:["*"],line:r(u.index??0),reExport:!0})}return e.sort((u,d)=>u.line-d.line||u.specifier.localeCompare(d.specifier))}function gf(t,e,n,r){let s=[];if(t&&s.push(t),r&&s.push(r),n&&s.push("*",n),e)for(let i of e.split(",")){let o=i.replace(/\btype\s+/g,"").trim();if(!o)continue;let[a,c]=o.split(/\s+as\s+/).map(l=>l.trim());a&&s.push(c||a,a)}return[...new Set(s)]}function yq(t){let e=t.trim();return e.startsWith("{")?e.replace(/[{}]/g,"").split(",").flatMap(n=>{let[r,s]=n.split(":").map(i=>i.trim());return[r,s].filter(i=>!!i)}):[e]}function bq(t,e){let n=[],r=t.split(` -`),s=e.endsWith("/__init__.py")||e==="__init__.py";for(let i=0;i{let n=/^\s*(\w+)(?:\s+as\s+(\w+))?/.exec(e);return n?[n[1],n[2]].filter(Boolean):[]}).flat()}function wq(t){let e=[],n=t.split(` -`),r=!1;for(let s=0;s{let s=r.trim();if(!s)return;let i=s.indexOf("{");if(i!==-1){let c=s.lastIndexOf("}"),l=s.slice(i+1,c===-1?void 0:c);for(let u of Eq(l))n(u);return}let o=/\bas\s+([\w*]+)\s*$/.exec(s);if(o?.[1]){e.push(o[1]);return}let a=s.split("::").pop()?.trim();if(a&&(e.push(a==="*"?"*":a),a==="self")){let c=s.split("::").slice(-2,-1)[0]?.trim();c&&e.push(c)}};return n(t),[...new Set(e.filter(r=>r!=="self"))]}function Eq(t){let e=[],n=0,r="";for(let s of t){if(s==="{"?n+=1:s==="}"&&(n-=1),s===","&&n===0){e.push(r),r="";continue}r+=s}return e.push(r),e}function Sq(t){let e=[],n=t.split(` -`);for(let r=0;ri.slice(0,a+1).join("\\")).reverse()}}function Aq(t){let e=[],n=new Set,r=t.split(` -`),s=(o,a,c,l=!1)=>{let u=o.split(".")[0];if(!/^[A-Z]/.test(u)||Cq.has(u)||n.has(o))return;n.add(o);let d=o.split(".");e.push({specifier:o,packageName:u,bindings:[...new Set([a,o])],line:c,keys:d.map((p,f)=>d.slice(0,f+1).join(".")).reverse(),...l?{synthetic:!0}:{}})},i=!1;for(let o=0;o{Nq.has(l)||n.has(l)||(n.add(l),e.push({specifier:l,packageName:l,bindings:[l],line:s+1,...u?{synthetic:!0}:{}}))},a=/^\s*open\s+([A-Z][\w']*)/.exec(i);if(a?.[1]){o(a[1]);continue}let c=/^\s*module\s+[A-Z][\w']*\s*=\s*([A-Z][\w']*)/.exec(i);if(c?.[1]){o(c[1]);continue}for(let l of i.matchAll(/\b([A-Z][\w']*)\.[a-z_]/g))o(l[1],!0)}return e}var Nq=new Set(["Stdlib","List","Array","String","Bytes","Char","Int","Int32","Int64","Float","Bool","Option","Result","Hashtbl","Map","Set","Buffer","Printf","Format","Sys","Unix","Filename","Sort","Queue","Stack","Lazy","Seq","Fun","Either","Printexc","Random","Digest","Obj"]);function Lq(t){let e=t.trim();if(!e)return["*"];let n=[],r=/\bshow\s+([\w\s,]+)/.exec(e);r?.[1]&&n.push(...r[1].split(",").map(i=>i.trim()).filter(Boolean));let s=/\bas\s+(\w+)/.exec(e);return s?.[1]&&n.push(s[1]),n.length===0&&n.push("*"),[...new Set(n)]}function Gs(t){return t.startsWith(".")||t.startsWith("/")||t.startsWith("#")}function js(t){let e=t.split("/");return t.startsWith("@")?e.slice(0,2).join("/"):e[0]??t}function Gq(t){return t.language==="typescript"||t.language==="javascript"?jq(t.content,t.path):Uq(t.content,t.language)}function jq(t,e){let n=[],r=t.split(` -`),s=qq(r),i=(o,a,c,l,u,d)=>{n.push({name:o,kind:a,startLine:c,endLine:l,summary:v_(u),exported:d})};for(let o=0;o|^\s*=\s*(?:async\s*)?function\b/.test(h);i(m[1],y?"function":"variable",o+1,d_(r,o)+1,`${y?"const fn":"const"} ${m[1]}`,l);continue}let g=/^(?:export\s+)?(?:declare\s+)?(?:namespace|module)\s+([\w$]+)/.exec(c);g&&i(g[1],"module",o+1,Fs(r,o)+1,`module ${g[1]}`,l)}return n}function Fq(t,e,n,r,s){let i=0;for(let o=e;o{let a=s.slice(o+1).find(c=>c.indent<=i.indent);return{name:i.name,kind:i.kind,startLine:i.line,endLine:a?a.line-1:r.length,summary:i.summary,exported:!0}})}var Bq={python:[{pattern:/^(?:async\s+)?def\s+(\w+)\s*\(/,kind:"function"},{pattern:/^class\s+(\w+)\s*[(:]/,kind:"class"}],go:[{pattern:/^func\s+(?:\([^)]*\)\s*)?(\w+)\s*[[(]/,kind:"function"},{pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/,kind:"type"}],rust:[{pattern:/^(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(\w+)/,kind:"function"},{pattern:/^(?:pub(?:\([^)]*\))?\s+)?struct\s+(\w+)/,kind:"class"},{pattern:/^(?:pub(?:\([^)]*\))?\s+)?(?:enum|trait)\s+(\w+)/,kind:"type"},{pattern:/^impl(?:<[^>]*>)?\s+(?:\w+\s+for\s+)?(\w+)/,kind:"class"}],java:[{pattern:/^(?:public|private|protected|abstract|final|static|\s)*(?:class|interface|enum|record)\s+(\w+)/,kind:"class"},{pattern:/^(?:public|private|protected|static|final|synchronized|abstract|\s)+[\w<>[\],.?\s]+\s+(\w+)\s*\(/,kind:"method"}],ruby:[{pattern:/^def\s+(?:self\.)?(\w+[?!=]?)/,kind:"method"},{pattern:/^(?:class|module)\s+([\w:]+)/,kind:"class"}],dotnet:[{pattern:/^(?:public|private|protected|internal|sealed|abstract|static|partial|\s)*(?:class|interface|struct|record|enum)\s+(\w+)/,kind:"class"},{pattern:/^(?:public|private|protected|internal|static|virtual|override|async|sealed|\s)+[\w<>[\],.?\s]+\s+(\w+)\s*\(/,kind:"method"}],php:[{pattern:/^(?:abstract\s+|final\s+|readonly\s+)*(?:class|interface|trait|enum)\s+(\w+)/,kind:"class"},{pattern:/^(?:public\s+|private\s+|protected\s+|static\s+|abstract\s+|final\s+)*function\s+&?(\w+)\s*\(/,kind:"function"}],elixir:[{pattern:/^\s*defmodule\s+([A-Z][\w.]*)/,kind:"module"},{pattern:/^\s*(?:def|defp|defmacro|defmacrop|defguard|defdelegate)\s+([a-z_]\w*[!?]?)/,kind:"function"},{pattern:/^\s*(?:defstruct|defexception|defprotocol|defimpl)\s+([A-Z][\w.]*)?/,kind:"type"}],erlang:[{pattern:/^([a-z]\w*)\s*\(.*\)\s*(?:when\b.*)?->/,kind:"function"},{pattern:/^-record\(\s*(\w+)/,kind:"type"}],swift:[{pattern:/^(?:public\s+|internal\s+|private\s+|fileprivate\s+|open\s+|final\s+|@\w+\s+)*(?:class|struct|enum|protocol|actor|extension)\s+(\w+)/,kind:"class"},{pattern:/^(?:public\s+|internal\s+|private\s+|fileprivate\s+|open\s+|static\s+|final\s+|override\s+|mutating\s+|@\w+\s+)*func\s+(\w+)/,kind:"function"}],dart:[{pattern:/^(?:abstract\s+|base\s+|final\s+|sealed\s+|interface\s+)*(?:class|mixin|enum|extension)\s+(\w+)/,kind:"class"},{pattern:/^typedef\s+(\w+)/,kind:"type"}],ocaml:[{pattern:/^let\s+(?:rec\s+)?([a-z_]\w*)/,kind:"function"},{pattern:/^(?:module|module\s+type)\s+([A-Z]\w*)/,kind:"module"},{pattern:/^type\s+(?:'\w+\s+)?([a-z_]\w*)/,kind:"type"}],c:p_(),cpp:[{pattern:/^(?:template\s*<[^>]*>\s*)?(?:class|struct)\s+(?:\w+_API\s+|\w+_EXPORT\s+)?(\w+)\s*(?::|\{|$)/,kind:"class"},{pattern:/^namespace\s+(\w+)/,kind:"module"},...p_()]};function p_(){return[{pattern:/^typedef\s+(?:struct|union|enum)?\s*[\w\s*]*?(\w+)\s*;/,kind:"type"},{pattern:/^(?:typedef\s+)?(?:struct|union|enum)\s+(\w+)\s*\{?\s*$/,kind:"class"},{pattern:/^(?!(?:return|if|while|for|switch|case|else|do|sizeof|typeof|delete|throw|catch|assert)\b)(?:(?:static|extern|inline|const|constexpr|virtual|explicit|friend|unsigned|signed|struct|enum|class|\w+_API|\w+_EXPORT)\s+)*[\w:<>,\s]*?[\w>]\s*[*&\s]\s*(\w+)\s*\([^;]*\)\s*(?:const\s*)?(?:noexcept\s*)?[{;]?\s*$/,kind:"function"},{pattern:/^#\s*define\s+(\w+)\s*\(/,kind:"function"}]}function Vq(t,e,n){let r=e.filter(a=>a.exported).map(a=>a.name),s=r.slice(0,8),i=[...new Set(n.map(a=>a.packageName))].slice(0,6),o=[`${t.path} (${t.language}, ${t.lineCount} lines)`];return s.length&&o.push(`defines ${s.join(", ")}${r.length>s.length?`, +${r.length-s.length} more`:""}`),i.length&&o.push(`imports ${i.join(", ")}`),o.join(" \u2014 ")}function v_(t){return t.replace(/\s+/g," ").trim().slice(0,200)}var E_=require("node:crypto");function vf(t,e){return`${t}|${e}`}var Wq=2e4;async function S_(t,e){let n=new Map;for(let o of t){if(!wf[o.ecosystem])continue;let a=vf(o.ecosystem,o.name);n.has(a)||n.set(a,o)}let r=new Map;if(n.size===0)return r;let s=[...n.entries()],i=await bn(s,e.concurrency??6,async([o,a])=>{let c=a.to??a.from;if(!c)return[o,void 0];try{let l=await tU(`${o}|${c}`,()=>wf[a.ecosystem](a.name,c,{timeoutMs:e.timeoutMs??Wq}));return[o,l]}catch(l){return e.logger.debug(`Module map failed for ${o}: ${l.message}`),[o,void 0]}});for(let[o,a]of i)a&&a.names.length>0&&r.set(o,a);return e.logger.debug(`Resolved ${r.size} of ${n.size} module map(s) from published artefacts`),r}var zq=async(t,e,{timeoutMs:n})=>{let s=(await J(`https://pypi.org/pypi/${encodeURIComponent(t)}/${encodeURIComponent(e)}/json`,{timeoutMs:n,immutable:!0}))?.urls?.find(l=>l.packagetype==="bdist_wheel"&&l.url);if(!s?.url)return;let i=await wo(s.url,n);if(!i)return;let o=i.find(l=>/(^|\/)[^/]+\.dist-info\/top_level\.txt$/.test(l.path));if(o){let l=bo(o).split(` -`).map(u=>u.trim()).filter(u=>u.length>0&&!u.startsWith("#"));if(l.length>0)return{names:[...new Set(l)],source:`${s.filename??"wheel"} top_level.txt`}}let a=i.find(l=>/(^|\/)[^/]+\.dist-info\/RECORD$/.test(l.path));if(!a)return;let c=new Set;for(let l of bo(a).split(` -`)){let u=l.split(",")[0]?.trim();if(!u)continue;let d=u.split("/")[0];!d||d.startsWith(".")||/\.(dist-info|data)$/.test(d)||c.add(d.endsWith(".py")?d.slice(0,-3):d)}return c.delete(""),c.size>0?{names:[...c],source:`${s.filename??"wheel"} RECORD`}:void 0},Hq=async(t,e,{timeoutMs:n})=>{let[r,s]=t.split(":");if(!r||!s)return;let o=`https://repo1.maven.org/maven2/${r.replace(/\./g,"/")}/${s}/${e}/${s}-${e}.jar`,a=await wo(o,n);if(!a)return;let c=new Set;for(let l of a){if(!l.path.endsWith(".class")||l.path.startsWith("META-INF/"))continue;let u=l.path.split("/").slice(0,-1);u.length!==0&&c.add(u.join("."))}return c.size>0?{names:[...c],source:`${s}-${e}.jar`}:void 0},Kq=async(t,e,{timeoutMs:n})=>{let r=t.toLowerCase(),s=e.toLowerCase(),i=`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(r)}/${encodeURIComponent(s)}/${encodeURIComponent(r)}.${encodeURIComponent(s)}.nupkg`,o=await wo(i,n);if(!o)return;let{readAssembly:a}=await Promise.resolve().then(()=>(dp(),xE)),c=new Set;for(let l of o){if(!/^lib\/.+\.dll$/i.test(l.path)&&!/^ref\/.+\.dll$/i.test(l.path))continue;let u;try{u=a(l.read())}catch{continue}for(let d of u??[]){let p=d.fullName.lastIndexOf(".");p>0&&c.add(d.fullName.slice(0,p))}if(c.size>0)break}return c.size>0?{names:[...c],source:`${t} ${e} assembly metadata`}:void 0},Jq=async(t,e,{timeoutMs:n})=>{let s=(await J(`https://repo.packagist.org/p2/${t.toLowerCase()}.json`,{timeoutMs:n}))?.packages?.[t.toLowerCase()];if(!s?.length)return;let i=e.replace(/^v/,""),o,a=!1;for(let l of s)if(l.autoload!==void 0&&(o=l.autoload??void 0),(l.version??"").replace(/^v/,"")===i){a=!0;break}a||(o=s[0].autoload??void 0);let c=new Set;for(let l of[o?.["psr-4"],o?.["psr-0"]])for(let u of Object.keys(l??{})){let d=u.replace(/\\+$/,"");d&&c.add(d)}return c.size>0?{names:[...c],source:`${t} composer.json autoload`}:void 0},Yq=async(t,e,{timeoutMs:n})=>{let r=await wo(`https://repo.hex.pm/tarballs/${encodeURIComponent(t)}-${encodeURIComponent(e)}.tar`,n);if(!r)return;let s=r.find(c=>c.path==="contents.tar.gz"||c.path.endsWith("/contents.tar.gz"));if(!s)return;let i;try{i=ze(s.read())}catch{return}let o=new Set;for(let c of i)if(/^(lib|src)\//.test(c.path)){if(/\.(ex|exs)$/.test(c.path)){for(let l of Zq(bo(c)))o.add(l);continue}if(/\.erl$/.test(c.path)){let l=/^\s*-module\(\s*'?([a-z][\w]*)'?\s*\)/m.exec(bo(c));l?.[1]&&o.add(l[1])}}if(o.size===0)return;let a=new Set;for(let c of o)a.add(c.split(".")[0]);return{names:[...new Set([...o,...a])],source:`${t} ${e} hex tarball`}};function Zq(t){let e=[],n=[],r=!1;for(let s of t.split(` -`)){let i=(s.match(/"""/g)??[]).length;if(r){i%2===1&&(r=!1);continue}if(i%2===1){r=!0;continue}let o=/^(\s*)defmodule\s+([A-Z][\w.]*)/.exec(s);if(!o)continue;let a=o[1].length;for(;n.length>0&&n[n.length-1].indent>=a;)n.pop();let c=n[n.length-1]?.name,l=c?`${c}.${o[2]}`:o[2];n.push({indent:a,name:l}),e.push(l)}return e}var Xq=async(t,e,{timeoutMs:n})=>{let r=await wo(`https://rubygems.org/downloads/${encodeURIComponent(t)}-${encodeURIComponent(e)}.gem`,n);if(!r)return;let s=r.find(c=>c.path==="data.tar.gz"||c.path.endsWith("/data.tar.gz"));if(!s)return;let i;try{i=ze(s.read())}catch{return}let o=new Set,a=new Set;for(let c of i){let l=/^lib\/(.+)\.rb$/.exec(c.path);if(l?.[1]&&(o.add(l[1]),o.add(l[1].split("/")[0]),!(l[1].split("/").length>2)))for(let u of bo(c).matchAll(/^(?:module|class)\s+([A-Z][\w:]*)/gm))a.add(u[1].split("::")[0])}if(!(o.size===0&&a.size===0))return{names:[...new Set([...o,...a])],source:`${t}-${e}.gem`}},Qq=async(t,e,{timeoutMs:n})=>{let[r,s]=t.split("/");if(!(!r||!s))for(let i of[e,`v${e}`]){let o=await fe(`https://raw.githubusercontent.com/${r}/${s}/${encodeURIComponent(i)}/Package.swift`,{timeoutMs:n,immutable:!0});if(!o)continue;let a=new Set;for(let c of o.matchAll(/\.(?:library|target|executableTarget)\s*\(\s*name:\s*"([^"]+)"/g))a.add(c[1]);for(let c of o.matchAll(/targets:\s*\[([^\]]*)\]/g))for(let l of c[1].matchAll(/"([^"]+)"/g))a.add(l[1]);if(a.size>0)return{names:[...a],source:`${t}@${i} Package.swift`}}},eU=async(t,e,{timeoutMs:n})=>{let r=(0,E_.createHash)("md5").update(t).digest("hex"),s=`${r[0]}/${r[1]}/${r[2]}`,i=await J(`https://cdn.cocoapods.org/Specs/${s}/${encodeURIComponent(t)}/${encodeURIComponent(e)}/${encodeURIComponent(t)}.podspec.json`,{timeoutMs:n,immutable:!0});if(!i)return;let o=i.module_name??(i.name??t).replace(/[-.]/g,"_");return{names:[...new Set([o,t])],source:`${t} ${e} podspec`}},wf={pypi:zq,maven:Hq,nuget:Kq,packagist:Jq,hex:Yq,rubygems:Xq,swift:Qq,cocoapods:eU},OY=Object.keys(wf),k_=64*1024*1024;async function wo(t,e){try{let n=await fetch(t,{signal:AbortSignal.timeout(e),headers:{"User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"}});if(!n.ok)return;if(Number(n.headers.get("content-length")??"0")>k_){n.body?.cancel();return}let s=Buffer.from(await n.arrayBuffer());return s.byteLength>k_?void 0:ze(s)}catch{return}}var yf=new Map,bf=new Map;function tU(t,e){let n=yf.get(t);if(n!==void 0)return Promise.resolve(n??void 0);let r=bf.get(t);if(r)return r;let s=e().then(i=>(yf.set(t,i??null),i)).catch(()=>{yf.set(t,null)}).finally(()=>bf.delete(t));return bf.set(t,s),s}function bo(t){try{return t.read().toString("utf8")}catch{return""}}function A_(t,e,n,r,s){let{logger:i,maxSitesPerChange:o=100,member:a,moduleMaps:c,maxReExportDepth:l=3}=s,u=new Map(r.map(m=>[m.path,m.content])),d=new Map(n.files.map(m=>[m.path,m])),p=new Map;for(let m of e){let g=p.get(m.name);g?g.includes(m.ecosystem)||g.push(m.ecosystem):p.set(m.name,[m.ecosystem])}let f=[];for(let m of t){if(m.kind==="runtime-requirement"){f.push(...nU(rU(m,u),a));continue}let{files:g,names:h,reach:y}=sU(m,n,p.get(m.dependency)??[],c,l,d),w=g.filter(v=>a===void 0||Ld(v.path,a));if(w.length===0){i.debug(`No importers found for ${m.dependency}; ${m.id} has no impact sites`);continue}let S=dU(m,w,u,d,o,h,y);f.push(...S),S.length>=o&&i.warn(`${m.dependency}: ${m.summary} matched at least ${o} locations; the plan lists the first ${o}.`)}return f}function nU(t,e){return e===void 0?[...t]:t.filter(n=>Ld(n.file,e))}function rU(t,e){let n=(t.symbols[0]??"node").toLowerCase().replace(".js",""),r=__[n]??__.node,s=[];for(let[i,o]of e){if(!Fd(i))continue;if(/(^|\/)\.(nvmrc|node-version|ruby-version|python-version|tool-versions)$/.test(i)){s.push({breakingChangeId:t.id,file:i,line:1,excerpt:o.trim().split(` +`),c=await t.messages.create({model:e.llm.model,max_tokens:16e3,system:wq,thinking:{type:"adaptive"},output_config:{effort:e.llm.effort,format:{type:"json_schema",schema:bq}},messages:[{role:"user",content:a}]});if(c.stop_reason==="refusal")return[];let l=c.content.find(u=>u.type==="text")?.text;if(!l)return[];try{let u=JSON.parse(l);return Array.isArray(u.changes)?u.changes:[]}catch{return[]}}function Eq(t,e,n,r){let s=new Set(r.map(i=>i.id));return t.filter(i=>s.has(i.evidenceId)).filter(i=>i.summary?.trim()).map(i=>({id:Ee("bc",e,n,"llm",i.summary),dependency:e,workspace:n,kind:$x(i.kind),summary:i.summary.trim(),remediation:i.remediation?.trim()||`Review usages of ${e} and update them.`,symbols:(i.symbols??[]).filter(Sq),confidence:"medium",taxonomy:DS(i.taxonomy,_s($x(i.kind))),citations:[i.evidenceId]}))}function Sq(t){let e=t.trim();return!e||e.length>80||/\s/.test(e)&&!e.startsWith("/")?!1:/^[/@]?[\w$][\w$./{}-]*$/.test(e)}var xq=new Set(["removed-export","renamed-export","signature-change","type-change","behaviour-change","removed-endpoint","changed-endpoint","required-field-added","default-change","config-change","runtime-requirement"]);function $x(t){return xq.has(t)?t:"unknown"}function Tq(t,e){return t.length<=e?t:`${t.slice(0,e)} +\u2026(truncated)`}function _q(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}var Ix=require("node:crypto");var $q=[{band:"high",min:.8},{band:"medium",min:.5},{band:"low",min:.2},{band:"none",min:0}];function Cx(t){for(let e of $q)if(t>=e.min)return e.band;return"none"}var Vs="drift-confidence-1",Rq={"type-surface-diff":"computed-artifact","openapi-diff":"computed-artifact",changelog:"maintainer-narrative","github-release":"maintainer-narrative","migration-guide":"maintainer-guide","behavioural-diff":"dynamic-observation","registry-metadata":"registry","semver-heuristic":"heuristic"},Cq={"computed-artifact":.9,"maintainer-guide":.7,"maintainer-narrative":.6,"dynamic-observation":.5,registry:.4,heuristic:.2};function Nf(t){let{change:e,evidence:n}=t,r=n.filter(d=>e.citations.includes(d.id)),s=[],i=[];if(r.length===0)return{score:0,band:"none",evidence:[],penalties:[{code:"no-citations",detail:"No evidence record backs this finding.",delta:0}],calibration:Vs};let o=Aq(r),a=0,c="";for(let d of o.keys()){let p=Cq[d]??.3;p>a&&(a=p,c=d)}s.push({code:`origin:${c}`,detail:`Strongest evidence class is ${Mf(c)}.`,delta:a});let l=a,u=o.size-1;if(u>0){let d=Math.min(.15,.08*u);l+=d,s.push({code:"corroborated",detail:`Corroborated by ${u} other independent source class(es): ${[...o.keys()].filter(p=>p!==c).map(Mf).join(", ")}.`,delta:d})}else r.length>1&&i.push({code:"single-origin",detail:`All ${r.length} citations trace to one source class (${Mf(c)}), so they do not corroborate each other.`,delta:0});return o.size===1&&c==="heuristic"&&(l+=-.1,i.push({code:"heuristic-only",detail:"Only a semver heuristic supports this; no changelog, release note, or API diff was retrieved.",delta:-.1})),Lf(l,s,i)}function Aq(t){let e=new Map,n=new Set;for(let r of t){let s=(0,Ix.createHash)("sha256").update(r.content.replace(/\s+/g," ").trim().toLowerCase()).digest("hex");if(n.has(s))continue;n.add(s);let i=Rq[r.source]??"unknown",o=e.get(i);o?o.push(r):e.set(i,[r])}return e}function Mf(t){switch(t){case"computed-artifact":return"a computed diff of the shipped artifact";case"maintainer-guide":return"a migration guide";case"maintainer-narrative":return"release notes or a changelog";case"registry":return"registry metadata";case"heuristic":return"a semver heuristic";default:return t}}function Pq(t){let{taxonomy:e,sites:n,localizationRan:r}=t,s=[],i=[];if(!r)return{score:0,band:"none",evidence:[],penalties:[{code:"localization-unavailable",detail:"No checkout was available, so Drift could not search this repository. This is not evidence that the change is unused.",delta:0}],calibration:Vs};if(n.length===0){let d=Mc(e);return{score:0,band:"none",evidence:[],penalties:[{code:d?"not-locally-checkable":"no-usage-found",detail:d?"This change is only observable at runtime, so a source search cannot establish whether this repository is affected.":"Drift searched the files that import this dependency and found no usage of the affected symbols.",delta:0}],calibration:Vs}}let o=n.reduce((d,p)=>Px(p.confidence)>Px(d.confidence)?p:d),a=o.confidence==="high"?.85:o.confidence==="medium"?.6:.3;s.push({code:`site:${o.confidence}`,detail:o.confidence==="high"?`\`${o.matchedSymbol}\` is bound from an import of this dependency in ${o.file}.`:o.confidence==="medium"?`${o.file} imports this dependency and uses \`${o.matchedSymbol}\`, but the symbol was not traced to the import.`:`\`${o.matchedSymbol}\` appears in ${o.file}, but no import of this dependency was established \u2014 the match may be coincidental.`,delta:a});let c=a;if(n.length>1){let d=Math.min(.05,.01*(n.length-1));c+=d,s.push({code:"multiple-sites",detail:`${n.length} affected locations across ${new Set(n.map(p=>p.file)).size} file(s).`,delta:d})}let l=n.filter(d=>Iq(d.file));return l.length===n.length?(c+=-.25,i.push({code:"generated-only",detail:`Every affected location is in generated code (${l[0].file}). Editing it is usually wrong; the generator is the real site.`,delta:-.25})):l.length>0&&(c+=-.05,i.push({code:"some-generated",detail:`${l.length} affected location(s) are in generated code.`,delta:-.05})),e.visibility.includes("reflection-or-dynamic")&&(c+=-.2,i.push({code:"dynamic-access",detail:"Dynamic or reflective access was detected, so the affected set cannot be enumerated by search.",delta:-.2})),e.visibility.includes("wrapper-mediated")&&(c+=-.1,i.push({code:"wrapper-mediated",detail:"Usage is mediated by a local wrapper, so downstream callers of the wrapper are not enumerated here.",delta:-.1})),n.every(d=>d.confidence==="low")&&(c+=-.1,i.push({code:"textual-only",detail:"Every match is textual \u2014 no import edge was established for any of them.",delta:-.1})),Lf(c,s,i)}function Iq(t){let e=t.toLowerCase();return/(^|\/)(generated|__generated__|gen|dist|build|out|vendor|node_modules)\//.test(e)||/\.(g|generated)\.[a-z]+$/.test(e)||/\.pb\.(go|ts|js|py)$/.test(e)||/_pb2?\.py$/.test(e)||/\.d\.ts$/.test(e)}function Oq(t){let{outcomes:e,affectedFiles:n,taxonomy:r}=t;if(e.length===0)return{score:0,band:"none",evidence:[],penalties:[{code:"nothing-ran",detail:"No checks were run against this finding, so nothing confirms the change was understood correctly.",delta:0}],calibration:Vs};let s=[],i=[],o=e.filter(p=>p.status==="passed"),a=e.filter(p=>p.status==="failed"),c=e.filter(p=>p.status==="skipped"||p.status==="unavailable"||p.status==="timed-out");if(a.length>0)return{score:0,band:"none",evidence:[],penalties:[{code:"checks-failed",detail:`${a.length} check(s) failed: ${a.map(p=>p.name).join(", ")}.`,delta:0}],calibration:Vs};let l=0,u=r.detectability.some(p=>p==="compile-time"||p==="link-or-import"||p==="manifest");for(let p of o){let f=/type|compile|build|lint/i.test(p.name),g=/test|spec/i.test(p.name)?.45:f?u?.4:.15:.1;l+=g,s.push({code:`passed:${p.name}`,detail:f&&!u?`\`${p.name}\` passed, but this change is not detectable at compile time \u2014 it does not confirm the behaviour is right.`:`\`${p.name}\` passed.`,delta:g})}for(let p of c)i.push({code:`did-not-run:${p.name}`,detail:`\`${p.name}\` was ${p.status} and proves nothing.`,delta:0});let d=new Set(o.flatMap(p=>p.covers??[]));return d.size>0&&n.length>0?n.filter(f=>d.has(f)).length===0&&(l+=-.2,i.push({code:"no-coverage",detail:"The checks that passed do not cover any of the affected files.",delta:-.2})):n.length>0&&i.push({code:"coverage-unknown",detail:"Which code paths the passing checks cover could not be established.",delta:0}),Lf(l,s,i)}function Ox(t){let e=Nf({change:t.change,evidence:t.evidence}),n=Pq({change:t.change,taxonomy:t.taxonomy,sites:t.sites,localizationRan:t.localizationRan}),r=Oq({outcomes:t.outcomes??[],affectedFiles:[...new Set(t.sites.map(a=>a.file))],taxonomy:t.taxonomy}),s=[...t.gaps??[]],i=[];e.band==="high"&&n.band==="none"&&i.push({code:"upstream-only",detail:"The upstream change is well established, but nothing in this repository was shown to be affected. High upstream confidence is not a reason to edit code.",delta:0});let o=e.band==="high"&&(n.band==="high"||n.band==="medium")&&!s.some(a=>a.automaticExecution==="blocks");return{upstream:e,localImpact:n,verification:r,automaticExecutionEligible:o,reasons:i,checkedSurfaces:[...t.checkedSurfaces??[]],gaps:s}}function Dx(t){let e=t.upstream.band,n=t.localImpact.band;return n==="none"?e==="high"?"medium":Ax(e):Ax(Dq(e,n))}function Ax(t){return t==="high"?"high":t==="medium"?"medium":"low"}function Dq(t,e){let n=["none","low","medium","high"];return n.indexOf(t)<=n.indexOf(e)?t:e}function Px(t){return t==="high"?2:t==="medium"?1:0}function Lf(t,e,n){let r=Math.round(Math.max(0,Math.min(1,t))*100)/100;return{score:r,band:Cx(r),evidence:e,penalties:n,calibration:Vs}}async function dl(t,e,n){let{config:r,logger:s}=n,i=Mq(e),o=[];for(let a of t){let c=i.get(fr(a))??[];o.push(...Nq(a.name,a.workspace,c))}for(let a of e)a.source==="openapi-diff"&&o.push(...Mx(a));if(r.llm.enabled){let a=await Rx(t,e,o,{config:r,logger:s});o.push(...a)}return Uq(Vq(o),e)}function Mq(t){let e=new Map;for(let n of t){let r=fr({name:n.dependency,workspace:n.workspace}),s=e.get(r);s?s.push(n):e.set(r,[n])}return e}function Nq(t,e,n){let r=[];for(let s of n){if(s.findings?.length){r.push(...Mx(s));continue}s.source==="semver-heuristic"||s.source==="registry-metadata"||r.push(...jq(s,t,e))}return r}function Mx(t){return(t.findings??[]).map(e=>({id:Ee("bc",t.dependency,t.workspace,e.code,e.symbol),dependency:t.dependency,workspace:t.workspace,kind:Lp(e.code),summary:e.detail,before:e.before,after:e.after,remediation:RS(e,t.dependency),symbols:Lq(e),confidence:"high",taxonomy:_s(Lp(e.code),e.code),citations:[t.id]}))}function Lq(t){let e=new Set([t.symbol]);if(t.symbol.includes(".")&&!/\s/.test(t.symbol)){let r=t.symbol.split("."),s=r[r.length-1];if(s&&!Gq(s)&&e.add(s),r.length>2){let i=r[r.length-2];i&&e.add(`${i}.${s}`)}}let n=/^[A-Z]+\s+(\/\S*)$/.exec(t.symbol);if(n?.[1]){e.add(n[1]);let r=n[1].split("{")[0]?.replace(/\/$/,"");r&&r.length>1&&e.add(r)}return[...e]}function Gq(t){return/^__\w+__$/.test(t)?!0:Fq.has(t.toLowerCase())}var Fq=new Set(["add","all","any","append","apply","build","call","check","clear","clone","close","connect","copy","count","create","define","delete","each","emit","end","execute","exists","extend","fetch","filter","find","first","flush","format","get","handle","has","index","init","insert","is","items","iter","join","keys","last","length","list","load","log","main","map","match","new","next","open","parse","pop","push","put","query","read","remove","render","reset","resolve","run","save","send","set","size","sort","split","start","stop","update","wait","write","args","body","config","content","context","data","error","file","header","headers","host","id","key","name","options","params","path","port","result","root","status","text","type","url","value","values"]);function jq(t,e,n){let r=[],s=new Set;for(let i of t.content.split(` +`))for(let o of CS(i)){let a=`${o.kind}:${o.symbols.join(",")}`;if(s.has(a))continue;s.add(a);let c=o.symbols.length>0?o.symbols:[e];r.push({id:Ee("bc",e,n,o.ruleId,o.symbols.join(",")),dependency:e,workspace:n,kind:o.kind,summary:o.summary,remediation:AS(o,e),symbols:c,replacementSymbols:o.replacementSymbols.length?o.replacementSymbols:void 0,confidence:qq(t),taxonomy:_s(o.kind),citations:[t.id]})}return r}function qq(t){return t.weight>=.95?"high":t.weight>=.6?"medium":"low"}function Uq(t,e){return t.map(n=>{let r=Nf({change:n,evidence:e});return{...n,confidence:Bq(r.band)}})}function Bq(t){return t==="high"?"high":t==="medium"?"medium":"low"}function Vq(t){let e=new Map;for(let r of t){let s=`${fr({name:r.dependency,workspace:r.workspace})}|${r.kind}|${[...r.symbols].sort().join(",")}`,i=e.get(s);if(!i){e.set(s,{...r,citations:[...new Set(r.citations)]});continue}e.set(s,{...i,summary:i.summary.length>=r.summary.length?i.summary:r.summary,symbols:[...new Set([...i.symbols,...r.symbols])],replacementSymbols:[...new Set([...i.replacementSymbols??[],...r.replacementSymbols??[]])].filter(Boolean).length?[...new Set([...i.replacementSymbols??[],...r.replacementSymbols??[]])]:void 0,confidence:zq(i.confidence,r.confidence),taxonomy:Wq(ot(i),ot(r)),citations:[...new Set([...i.citations,...r.citations])]})}let n={high:0,medium:1,low:2};return[...e.values()].sort((r,s)=>n[r.confidence]-n[s.confidence]||r.dependency.localeCompare(s.dependency))}function Wq(t,e){let n={computed:3,rule:2,"llm-normalized":1,default:0};return n[t.origin]>=n[e.origin]?t:e}function zq(t,e){let n={low:0,medium:1,high:2};return n[t]>=n[e]?t:e}function Gf(t,e){let n={low:0,medium:1,high:2};return n[t]>=n[e]}function jf(t){return t.keys??[t.packageName]}function pl(t){let e=[],n=new Map,r=new Set(t.map(o=>o.path));for(let o of t){let a=Hq(o),c=TU(o);e.push({path:o.path,language:o.language,lineCount:o.lineCount,imports:a,localImports:Kq(o),units:c,summary:PU(o,c,a)});for(let l of new Set(a.flatMap(jf))){let u=n.get(l);u?u.push(o.path):n.set(l,[o.path])}}let s=new Map,i=Xq(r);for(let o of e)for(let a of o.localImports){let c=Qq(o.path,a.specifier,r,i);if(!c||c===o.path)continue;let l=s.get(c),u={from:o.path,bindings:a.bindings,reExport:a.reExport,line:a.line};l?l.push(u):s.set(c,[u])}return{files:e,importers:n,localImporters:s,stats:{fileCount:e.length,unitCount:e.reduce((o,a)=>o+a.units.length,0),totalLines:e.reduce((o,a)=>o+a.lineCount,0)}}}function qx(t,e){let n;for(let r of t.units)er.endLine||(!n||r.endLine-r.startLine]+)>|"([^"]+)")/.exec(n[r]),i=s?.[1]??s?.[2];i&&e.push({specifier:i,line:r+1,bindings:[],reExport:!0})}return e}function Xq(t){let e=new Map,n=(r,s)=>{let i=e.get(r);i?i.push(s):e.set(r,[s])};for(let r of t){let s=r.split("/").pop()??r;n(s.toLowerCase(),r)}return e}var Nx=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".py"];function Qq(t,e,n,r){if(e.startsWith(".")){let o=t.split("/").slice(0,-1),a=eU([...o,...e.split("/")]);if(a===void 0)return;let l=/^\.+$/.test(e)||!e.includes("/")&&e.startsWith(".")?[`${Lx(t,e)}.py`,`${Lx(t,e)}/__init__.py`]:[a,...Nx.map(u=>a+u),...Nx.map(u=>`${a}/index${u}`),`${a}/__init__.py`];for(let u of l)if(u&&n.has(u))return u;return}let s=(e.split("/").pop()??e).toLowerCase(),i=(r.get(s)??[]).filter(o=>o.toLowerCase().endsWith(e.toLowerCase()));return i.length===1?i[0]:void 0}function eU(t){let e=[];for(let n of t)if(!(n===""||n===".")){if(n===".."){if(e.length===0)return;e.pop();continue}e.push(n)}return e.join("/")}function Lx(t,e){let n=/^\.+/.exec(e)?.[0].length??1,r=e.slice(n).split(".").filter(Boolean);return[...t.split("/").slice(0,-n),...r].join("/")}function tU(t){let e=[],n=t.split(` +`);for(let r=0;r]+)>|"([^"]+)")/.exec(n[r]),i=s?.[1]??s?.[2];i&&(i.startsWith(".")||e.push({specifier:i,packageName:nU(i),bindings:[],line:r+1,reExport:!0}))}return e}function nU(t){return(t.split("/")[0]??t).replace(/\.(h|hpp|hh|hxx|inl|tpp|h\+\+)$/i,"").toLowerCase()}function rU(t){let e=[],n=Bx(t),r=u=>Vx(n,u),s=/\bimport\s+(?!\()(?:(?:type\s+)?([\w$]+)\s*,\s*)?(?:type\s+)?(?:\{([^}]+)\}|\*\s+as\s+([\w$]+)|([\w$]+))\s+from\s+['"]([^'"]+)['"]|\bimport\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(s)){let d=u[5]??u[6];if(!d||Ws(d))continue;let p=Ff(u[1],u[2],u[3],u[4]);e.push({specifier:d,packageName:zs(d),bindings:p,line:r(u.index??0)})}let i=/\b(?:const|let|var)\s+(\{[^}]+\}|[\w$]+)\s*=\s*require\(\s*['"]([^'"]+)['"]\s*\)/g;for(let u of t.matchAll(i)){let d=u[2];Ws(d)||e.push({specifier:d,packageName:zs(d),bindings:sU(u[1]),line:r(u.index??0)})}let o=/\bimport\(\s*['"]([^'"]+)['"]\s*\)/g;for(let u of t.matchAll(o)){let d=u[1];Ws(d)||e.push({specifier:d,packageName:zs(d),bindings:[],line:r(u.index??0)})}let a=/\bexport\s+(?:type\s+)?\{([^}]*)\}\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(a)){let d=u[2];Ws(d)||e.push({specifier:d,packageName:zs(d),bindings:Ff(void 0,u[1],void 0,void 0),line:r(u.index??0),reExport:!0})}let c=/\bexport\s+\*\s+as\s+([\w$]+)\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(c)){let d=u[2];Ws(d)||e.push({specifier:d,packageName:zs(d),bindings:["*",u[1]],line:r(u.index??0),reExport:!0})}let l=/\bexport\s+\*\s+from\s+['"]([^'"]+)['"]/g;for(let u of t.matchAll(l)){let d=u[1];Ws(d)||e.push({specifier:d,packageName:zs(d),bindings:["*"],line:r(u.index??0),reExport:!0})}return e.sort((u,d)=>u.line-d.line||u.specifier.localeCompare(d.specifier))}function Ff(t,e,n,r){let s=[];if(t&&s.push(t),r&&s.push(r),n&&s.push("*",n),e)for(let i of e.split(",")){let o=i.replace(/\btype\s+/g,"").trim();if(!o)continue;let[a,c]=o.split(/\s+as\s+/).map(l=>l.trim());a&&s.push(c||a,a)}return[...new Set(s)]}function sU(t){let e=t.trim();return e.startsWith("{")?e.replace(/[{}]/g,"").split(",").flatMap(n=>{let[r,s]=n.split(":").map(i=>i.trim());return[r,s].filter(i=>!!i)}):[e]}function iU(t,e){let n=[],r=t.split(` +`),s=e.endsWith("/__init__.py")||e==="__init__.py";for(let i=0;i{let n=/^\s*(\w+)(?:\s+as\s+(\w+))?/.exec(e);return n?[n[1],n[2]].filter(Boolean):[]}).flat()}function oU(t){let e=[],n=t.split(` +`),r=!1;for(let s=0;s{let s=r.trim();if(!s)return;let i=s.indexOf("{");if(i!==-1){let c=s.lastIndexOf("}"),l=s.slice(i+1,c===-1?void 0:c);for(let u of lU(l))n(u);return}let o=/\bas\s+([\w*]+)\s*$/.exec(s);if(o?.[1]){e.push(o[1]);return}let a=s.split("::").pop()?.trim();if(a&&(e.push(a==="*"?"*":a),a==="self")){let c=s.split("::").slice(-2,-1)[0]?.trim();c&&e.push(c)}};return n(t),[...new Set(e.filter(r=>r!=="self"))]}function lU(t){let e=[],n=0,r="";for(let s of t){if(s==="{"?n+=1:s==="}"&&(n-=1),s===","&&n===0){e.push(r),r="";continue}r+=s}return e.push(r),e}function uU(t){let e=[],n=t.split(` +`);for(let r=0;ri.slice(0,a+1).join("\\")).reverse()}}function hU(t){let e=[],n=new Set,r=t.split(` +`),s=(o,a,c,l=!1)=>{let u=o.split(".")[0];if(!/^[A-Z]/.test(u)||yU.has(u)||n.has(o))return;n.add(o);let d=o.split(".");e.push({specifier:o,packageName:u,bindings:[...new Set([a,o])],line:c,keys:d.map((p,f)=>d.slice(0,f+1).join(".")).reverse(),...l?{synthetic:!0}:{}})},i=!1;for(let o=0;o{SU.has(l)||n.has(l)||(n.add(l),e.push({specifier:l,packageName:l,bindings:[l],line:s+1,...u?{synthetic:!0}:{}}))},a=/^\s*open\s+([A-Z][\w']*)/.exec(i);if(a?.[1]){o(a[1]);continue}let c=/^\s*module\s+[A-Z][\w']*\s*=\s*([A-Z][\w']*)/.exec(i);if(c?.[1]){o(c[1]);continue}for(let l of i.matchAll(/\b([A-Z][\w']*)\.[a-z_]/g))o(l[1],!0)}return e}var SU=new Set(["Stdlib","List","Array","String","Bytes","Char","Int","Int32","Int64","Float","Bool","Option","Result","Hashtbl","Map","Set","Buffer","Printf","Format","Sys","Unix","Filename","Sort","Queue","Stack","Lazy","Seq","Fun","Either","Printexc","Random","Digest","Obj"]);function xU(t){let e=t.trim();if(!e)return["*"];let n=[],r=/\bshow\s+([\w\s,]+)/.exec(e);r?.[1]&&n.push(...r[1].split(",").map(i=>i.trim()).filter(Boolean));let s=/\bas\s+(\w+)/.exec(e);return s?.[1]&&n.push(s[1]),n.length===0&&n.push("*"),[...new Set(n)]}function Ws(t){return t.startsWith(".")||t.startsWith("/")||t.startsWith("#")}function zs(t){let e=t.split("/");return t.startsWith("@")?e.slice(0,2).join("/"):e[0]??t}function TU(t){return t.language==="typescript"||t.language==="javascript"?_U(t.content,t.path):CU(t.content,t.language)}function _U(t,e){let n=[],r=t.split(` +`),s=RU(r),i=(o,a,c,l,u,d)=>{n.push({name:o,kind:a,startLine:c,endLine:l,summary:Hx(u),exported:d})};for(let o=0;o|^\s*=\s*(?:async\s*)?function\b/.test(h);i(m[1],y?"function":"variable",o+1,Fx(r,o)+1,`${y?"const fn":"const"} ${m[1]}`,l);continue}let g=/^(?:export\s+)?(?:declare\s+)?(?:namespace|module)\s+([\w$]+)/.exec(c);g&&i(g[1],"module",o+1,Hs(r,o)+1,`module ${g[1]}`,l)}return n}function $U(t,e,n,r,s){let i=0;for(let o=e;o{let a=s.slice(o+1).find(c=>c.indent<=i.indent);return{name:i.name,kind:i.kind,startLine:i.line,endLine:a?a.line-1:r.length,summary:i.summary,exported:!0}})}var AU={python:[{pattern:/^(?:async\s+)?def\s+(\w+)\s*\(/,kind:"function"},{pattern:/^class\s+(\w+)\s*[(:]/,kind:"class"}],go:[{pattern:/^func\s+(?:\([^)]*\)\s*)?(\w+)\s*[[(]/,kind:"function"},{pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/,kind:"type"}],rust:[{pattern:/^(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(\w+)/,kind:"function"},{pattern:/^(?:pub(?:\([^)]*\))?\s+)?struct\s+(\w+)/,kind:"class"},{pattern:/^(?:pub(?:\([^)]*\))?\s+)?(?:enum|trait)\s+(\w+)/,kind:"type"},{pattern:/^impl(?:<[^>]*>)?\s+(?:\w+\s+for\s+)?(\w+)/,kind:"class"}],java:[{pattern:/^(?:public|private|protected|abstract|final|static|\s)*(?:class|interface|enum|record)\s+(\w+)/,kind:"class"},{pattern:/^(?:public|private|protected|static|final|synchronized|abstract|\s)+[\w<>[\],.?\s]+\s+(\w+)\s*\(/,kind:"method"}],ruby:[{pattern:/^def\s+(?:self\.)?(\w+[?!=]?)/,kind:"method"},{pattern:/^(?:class|module)\s+([\w:]+)/,kind:"class"}],dotnet:[{pattern:/^(?:public|private|protected|internal|sealed|abstract|static|partial|\s)*(?:class|interface|struct|record|enum)\s+(\w+)/,kind:"class"},{pattern:/^(?:public|private|protected|internal|static|virtual|override|async|sealed|\s)+[\w<>[\],.?\s]+\s+(\w+)\s*\(/,kind:"method"}],php:[{pattern:/^(?:abstract\s+|final\s+|readonly\s+)*(?:class|interface|trait|enum)\s+(\w+)/,kind:"class"},{pattern:/^(?:public\s+|private\s+|protected\s+|static\s+|abstract\s+|final\s+)*function\s+&?(\w+)\s*\(/,kind:"function"}],elixir:[{pattern:/^\s*defmodule\s+([A-Z][\w.]*)/,kind:"module"},{pattern:/^\s*(?:def|defp|defmacro|defmacrop|defguard|defdelegate)\s+([a-z_]\w*[!?]?)/,kind:"function"},{pattern:/^\s*(?:defstruct|defexception|defprotocol|defimpl)\s+([A-Z][\w.]*)?/,kind:"type"}],erlang:[{pattern:/^([a-z]\w*)\s*\(.*\)\s*(?:when\b.*)?->/,kind:"function"},{pattern:/^-record\(\s*(\w+)/,kind:"type"}],swift:[{pattern:/^(?:public\s+|internal\s+|private\s+|fileprivate\s+|open\s+|final\s+|@\w+\s+)*(?:class|struct|enum|protocol|actor|extension)\s+(\w+)/,kind:"class"},{pattern:/^(?:public\s+|internal\s+|private\s+|fileprivate\s+|open\s+|static\s+|final\s+|override\s+|mutating\s+|@\w+\s+)*func\s+(\w+)/,kind:"function"}],dart:[{pattern:/^(?:abstract\s+|base\s+|final\s+|sealed\s+|interface\s+)*(?:class|mixin|enum|extension)\s+(\w+)/,kind:"class"},{pattern:/^typedef\s+(\w+)/,kind:"type"}],ocaml:[{pattern:/^let\s+(?:rec\s+)?([a-z_]\w*)/,kind:"function"},{pattern:/^(?:module|module\s+type)\s+([A-Z]\w*)/,kind:"module"},{pattern:/^type\s+(?:'\w+\s+)?([a-z_]\w*)/,kind:"type"}],c:jx(),cpp:[{pattern:/^(?:template\s*<[^>]*>\s*)?(?:class|struct)\s+(?:\w+_API\s+|\w+_EXPORT\s+)?(\w+)\s*(?::|\{|$)/,kind:"class"},{pattern:/^namespace\s+(\w+)/,kind:"module"},...jx()]};function jx(){return[{pattern:/^typedef\s+(?:struct|union|enum)?\s*[\w\s*]*?(\w+)\s*;/,kind:"type"},{pattern:/^(?:typedef\s+)?(?:struct|union|enum)\s+(\w+)\s*\{?\s*$/,kind:"class"},{pattern:/^(?!(?:return|if|while|for|switch|case|else|do|sizeof|typeof|delete|throw|catch|assert)\b)(?:(?:static|extern|inline|const|constexpr|virtual|explicit|friend|unsigned|signed|struct|enum|class|\w+_API|\w+_EXPORT)\s+)*[\w:<>,\s]*?[\w>]\s*[*&\s]\s*(\w+)\s*\([^;]*\)\s*(?:const\s*)?(?:noexcept\s*)?[{;]?\s*$/,kind:"function"},{pattern:/^#\s*define\s+(\w+)\s*\(/,kind:"function"}]}function PU(t,e,n){let r=e.filter(a=>a.exported).map(a=>a.name),s=r.slice(0,8),i=[...new Set(n.map(a=>a.packageName))].slice(0,6),o=[`${t.path} (${t.language}, ${t.lineCount} lines)`];return s.length&&o.push(`defines ${s.join(", ")}${r.length>s.length?`, +${r.length-s.length} more`:""}`),i.length&&o.push(`imports ${i.join(", ")}`),o.join(" \u2014 ")}function Hx(t){return t.replace(/\s+/g," ").trim().slice(0,200)}var Jx=require("node:crypto");function Vf(t,e){return`${t}|${e}`}var IU=2e4;async function fl(t,e){let n=new Map;for(let o of t){if(!Bf[o.ecosystem])continue;let a=Vf(o.ecosystem,o.name);n.has(a)||n.set(a,o)}let r=new Map;if(n.size===0)return r;let s=[...n.entries()],i=await vn(s,e.concurrency??6,async([o,a])=>{let c=a.to??a.from;if(!c)return[o,void 0];try{let l=await UU(`${o}|${c}`,()=>Bf[a.ecosystem](a.name,c,{timeoutMs:e.timeoutMs??IU}));return[o,l]}catch(l){return e.logger.debug(`Module map failed for ${o}: ${l.message}`),[o,void 0]}});for(let[o,a]of i)a&&a.names.length>0&&r.set(o,a);return e.logger.debug(`Resolved ${r.size} of ${n.size} module map(s) from published artefacts`),r}var OU=async(t,e,{timeoutMs:n})=>{let s=(await H(`https://pypi.org/pypi/${encodeURIComponent(t)}/${encodeURIComponent(e)}/json`,{timeoutMs:n,immutable:!0}))?.urls?.find(l=>l.packagetype==="bdist_wheel"&&l.url);if(!s?.url)return;let i=await To(s.url,n);if(!i)return;let o=i.find(l=>/(^|\/)[^/]+\.dist-info\/top_level\.txt$/.test(l.path));if(o){let l=xo(o).split(` +`).map(u=>u.trim()).filter(u=>u.length>0&&!u.startsWith("#"));if(l.length>0)return{names:[...new Set(l)],source:`${s.filename??"wheel"} top_level.txt`}}let a=i.find(l=>/(^|\/)[^/]+\.dist-info\/RECORD$/.test(l.path));if(!a)return;let c=new Set;for(let l of xo(a).split(` +`)){let u=l.split(",")[0]?.trim();if(!u)continue;let d=u.split("/")[0];!d||d.startsWith(".")||/\.(dist-info|data)$/.test(d)||c.add(d.endsWith(".py")?d.slice(0,-3):d)}return c.delete(""),c.size>0?{names:[...c],source:`${s.filename??"wheel"} RECORD`}:void 0},DU=async(t,e,{timeoutMs:n})=>{let[r,s]=t.split(":");if(!r||!s)return;let o=`https://repo1.maven.org/maven2/${r.replace(/\./g,"/")}/${s}/${e}/${s}-${e}.jar`,a=await To(o,n);if(!a)return;let c=new Set;for(let l of a){if(!l.path.endsWith(".class")||l.path.startsWith("META-INF/"))continue;let u=l.path.split("/").slice(0,-1);u.length!==0&&c.add(u.join("."))}return c.size>0?{names:[...c],source:`${s}-${e}.jar`}:void 0},MU=async(t,e,{timeoutMs:n})=>{let r=t.toLowerCase(),s=e.toLowerCase(),i=`https://api.nuget.org/v3-flatcontainer/${encodeURIComponent(r)}/${encodeURIComponent(s)}/${encodeURIComponent(r)}.${encodeURIComponent(s)}.nupkg`,o=await To(i,n);if(!o)return;let{readAssembly:a}=await Promise.resolve().then(()=>(Mp(),nS)),c=new Set;for(let l of o){if(!/^lib\/.+\.dll$/i.test(l.path)&&!/^ref\/.+\.dll$/i.test(l.path))continue;let u;try{u=a(l.read())}catch{continue}for(let d of u??[]){let p=d.fullName.lastIndexOf(".");p>0&&c.add(d.fullName.slice(0,p))}if(c.size>0)break}return c.size>0?{names:[...c],source:`${t} ${e} assembly metadata`}:void 0},NU=async(t,e,{timeoutMs:n})=>{let s=(await H(`https://repo.packagist.org/p2/${t.toLowerCase()}.json`,{timeoutMs:n}))?.packages?.[t.toLowerCase()];if(!s?.length)return;let i=e.replace(/^v/,""),o,a=!1;for(let l of s)if(l.autoload!==void 0&&(o=l.autoload??void 0),(l.version??"").replace(/^v/,"")===i){a=!0;break}a||(o=s[0].autoload??void 0);let c=new Set;for(let l of[o?.["psr-4"],o?.["psr-0"]])for(let u of Object.keys(l??{})){let d=u.replace(/\\+$/,"");d&&c.add(d)}return c.size>0?{names:[...c],source:`${t} composer.json autoload`}:void 0},LU=async(t,e,{timeoutMs:n})=>{let r=await To(`https://repo.hex.pm/tarballs/${encodeURIComponent(t)}-${encodeURIComponent(e)}.tar`,n);if(!r)return;let s=r.find(c=>c.path==="contents.tar.gz"||c.path.endsWith("/contents.tar.gz"));if(!s)return;let i;try{i=Ke(s.read())}catch{return}let o=new Set;for(let c of i)if(/^(lib|src)\//.test(c.path)){if(/\.(ex|exs)$/.test(c.path)){for(let l of GU(xo(c)))o.add(l);continue}if(/\.erl$/.test(c.path)){let l=/^\s*-module\(\s*'?([a-z][\w]*)'?\s*\)/m.exec(xo(c));l?.[1]&&o.add(l[1])}}if(o.size===0)return;let a=new Set;for(let c of o)a.add(c.split(".")[0]);return{names:[...new Set([...o,...a])],source:`${t} ${e} hex tarball`}};function GU(t){let e=[],n=[],r=!1;for(let s of t.split(` +`)){let i=(s.match(/"""/g)??[]).length;if(r){i%2===1&&(r=!1);continue}if(i%2===1){r=!0;continue}let o=/^(\s*)defmodule\s+([A-Z][\w.]*)/.exec(s);if(!o)continue;let a=o[1].length;for(;n.length>0&&n[n.length-1].indent>=a;)n.pop();let c=n[n.length-1]?.name,l=c?`${c}.${o[2]}`:o[2];n.push({indent:a,name:l}),e.push(l)}return e}var FU=async(t,e,{timeoutMs:n})=>{let r=await To(`https://rubygems.org/downloads/${encodeURIComponent(t)}-${encodeURIComponent(e)}.gem`,n);if(!r)return;let s=r.find(c=>c.path==="data.tar.gz"||c.path.endsWith("/data.tar.gz"));if(!s)return;let i;try{i=Ke(s.read())}catch{return}let o=new Set,a=new Set;for(let c of i){let l=/^lib\/(.+)\.rb$/.exec(c.path);if(l?.[1]&&(o.add(l[1]),o.add(l[1].split("/")[0]),!(l[1].split("/").length>2)))for(let u of xo(c).matchAll(/^(?:module|class)\s+([A-Z][\w:]*)/gm))a.add(u[1].split("::")[0])}if(!(o.size===0&&a.size===0))return{names:[...new Set([...o,...a])],source:`${t}-${e}.gem`}},jU=async(t,e,{timeoutMs:n})=>{let[r,s]=t.split("/");if(!(!r||!s))for(let i of[e,`v${e}`]){let o=await ge(`https://raw.githubusercontent.com/${r}/${s}/${encodeURIComponent(i)}/Package.swift`,{timeoutMs:n,immutable:!0});if(!o)continue;let a=new Set;for(let c of o.matchAll(/\.(?:library|target|executableTarget)\s*\(\s*name:\s*"([^"]+)"/g))a.add(c[1]);for(let c of o.matchAll(/targets:\s*\[([^\]]*)\]/g))for(let l of c[1].matchAll(/"([^"]+)"/g))a.add(l[1]);if(a.size>0)return{names:[...a],source:`${t}@${i} Package.swift`}}},qU=async(t,e,{timeoutMs:n})=>{let r=(0,Jx.createHash)("md5").update(t).digest("hex"),s=`${r[0]}/${r[1]}/${r[2]}`,i=await H(`https://cdn.cocoapods.org/Specs/${s}/${encodeURIComponent(t)}/${encodeURIComponent(e)}/${encodeURIComponent(t)}.podspec.json`,{timeoutMs:n,immutable:!0});if(!i)return;let o=i.module_name??(i.name??t).replace(/[-.]/g,"_");return{names:[...new Set([o,t])],source:`${t} ${e} podspec`}},Bf={pypi:OU,maven:DU,nuget:MU,packagist:NU,hex:LU,rubygems:FU,swift:jU,cocoapods:qU},r8=Object.keys(Bf),Kx=64*1024*1024;async function To(t,e){try{let n=await fetch(t,{signal:AbortSignal.timeout(e),headers:{"User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"}});if(!n.ok)return;if(Number(n.headers.get("content-length")??"0")>Kx){n.body?.cancel();return}let s=Buffer.from(await n.arrayBuffer());return s.byteLength>Kx?void 0:Ke(s)}catch{return}}var qf=new Map,Uf=new Map;function UU(t,e){let n=qf.get(t);if(n!==void 0)return Promise.resolve(n??void 0);let r=Uf.get(t);if(r)return r;let s=e().then(i=>(qf.set(t,i??null),i)).catch(()=>{qf.set(t,null)}).finally(()=>Uf.delete(t));return Uf.set(t,s),s}function xo(t){try{return t.read().toString("utf8")}catch{return""}}function gl(t,e,n,r,s){let{logger:i,maxSitesPerChange:o=100,member:a,moduleMaps:c,maxReExportDepth:l=3}=s,u=new Map(r.map(m=>[m.path,m.content])),d=new Map(n.files.map(m=>[m.path,m])),p=new Map;for(let m of e){let g=p.get(m.name);g?g.includes(m.ecosystem)||g.push(m.ecosystem):p.set(m.name,[m.ecosystem])}let f=[];for(let m of t){if(m.kind==="runtime-requirement"){f.push(...BU(VU(m,u),a));continue}let{files:g,names:h,reach:y}=WU(m,n,p.get(m.dependency)??[],c,l,d),w=g.filter(b=>a===void 0||op(b.path,a));if(w.length===0){i.debug(`No importers found for ${m.dependency}; ${m.id} has no impact sites`);continue}let S=XU(m,w,u,d,o,h,y);f.push(...S),S.length>=o&&i.warn(`${m.dependency}: ${m.summary} matched at least ${o} locations; the plan lists the first ${o}.`)}return f}function BU(t,e){return e===void 0?[...t]:t.filter(n=>op(n.file,e))}function VU(t,e){let n=(t.symbols[0]??"node").toLowerCase().replace(".js",""),r=Yx[n]??Yx.node,s=[];for(let[i,o]of e){if(!up(i))continue;if(/(^|\/)\.(nvmrc|node-version|ruby-version|python-version|tool-versions)$/.test(i)){s.push({breakingChangeId:t.id,file:i,line:1,excerpt:o.trim().split(` `)[0]?.slice(0,200)??"",matchedSymbol:t.symbols[0]??n,confidence:"high"});continue}let c=o.split(` -`);for(let l=0;l0&&oU(e,a,u,s,i),{files:e.files.filter(d=>u.has(d.path)),names:a,reach:u}}function iU(t,e,n){let r=new Set;for(let i of e){let o=n?.get(vf(i,t));for(let a of o?.names??[])r.add(a)}return r.size>0?{names:[...new Set([...r,t])],exact:!0}:{names:e.length>0?[...new Set(e.flatMap(i=>x_(t,i)))]:x_(t,void 0),exact:!1}}function oU(t,e,n,r,s){let i=[...n.keys()].filter(o=>cU(s.get(o),e));for(let o=0;o0;o++){let a=[];for(let c of i)for(let l of t.localImporters.get(c)??[]){if(n.size>=aU)return;let u=n.get(l.from);if(u){for(let d of l.bindings)u.inherited.add(d);continue}n.set(l.from,{direct:!1,inherited:new Set(l.bindings)}),l.reExport&&a.push(l.from)}i=a}}var aU=400;function cU(t,e){return t?t.imports.some(n=>n.reExport===!0&&(e.length===0||Jc(n,e))):!1}function Jc(t,e){return(typeof t=="string"?[t]:hf(t)).some(r=>e.some(s=>T_(r,s)||T_(s,r)))}function T_(t,e){if(t===e)return!0;if(!t.startsWith(e))return!1;let n=t[e.length];return n==="/"||n==="."||n===":"||n==="\\"}function x_(t,e){let n=new Set([t]);switch(e){case"pypi":{let r=t.toLowerCase().replace(/-/g,"_");n.add(r);let s=uU[t.toLowerCase()];s&&n.add(s);break}case"maven":{let[r]=t.split(":");r&&n.add(r);break}case"cargo":n.add(t.replace(/-/g,"_"));break;case"conan":case"vcpkg":case"arduino":{let r=t.toLowerCase();n.add(r),n.add(r.replace(/[-_]/g,"")),n.add(r.replace(/[-_]/g,"/"));let s=lU[r];s&&n.add(s),r.startsWith("lib")&&r.length>4&&n.add(r.slice(3));break}case"packagist":{let[r,s]=t.split("/");r&&s&&(n.add(`${Pr(r)}\\${Pr(s)}`),n.add(Pr(r)));break}case"hex":{n.add(Pr(t)),n.add(t.toLowerCase());break}case"swift":{let r=t.split("/").pop()??t;n.add(r),n.add(Pr(r)),r.toLowerCase().startsWith("swift-")&&n.add(Pr(r.slice(6)));break}case"cocoapods":n.add(t.replace(/[-.]/g,"_"));break;case"opam":n.add(Pr(t.replace(/\./g,"_"))),n.add(C_(t.replace(/\./g,"_")));break;default:break}return[...n]}function Pr(t){return t.split(/[-_.]/).filter(Boolean).map(e=>C_(e)).join("")}function C_(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}var lU={nlohmann_json:"nlohmann","libjpeg-turbo":"jpeglib",libxml2:"libxml",sdl:"sdl2",protobuf:"google",grpc:"grpcpp",abseil:"absl","ms-gsl":"gsl",gtest:"gtest"},uU={beautifulsoup4:"bs4",pillow:"PIL",pyyaml:"yaml","python-dateutil":"dateutil","msgpack-python":"msgpack",attrs:"attr","scikit-learn":"sklearn","opencv-python":"cv2","python-dotenv":"dotenv",protobuf:"google","google-cloud-storage":"google","psycopg2-binary":"psycopg2",mysqlclient:"MySQLdb","django-cors-headers":"corsheaders",djangorestframework:"rest_framework","pytest-cov":"pytest_cov","typing-extensions":"typing_extensions"};function dU(t,e,n,r,s,i,o){let a=[];for(let c of e){if(a.length>=s)break;let l=n.get(c.path);if(!l)continue;let u=r.get(c.path),d=i.length===0?c.imports:c.imports.filter(_=>Jc(_,i)),p=new Set(d.flatMap(_=>_.bindings)),f=d.length>0,m=o.get(c.path),g=m!==void 0&&!m.direct,h=new Set(c.imports.filter(_=>!Jc(_,i)).flatMap(_=>_.bindings).filter(_=>_!=="*")),y=new Set(c.units.filter(_=>_.kind!=="method").map(_=>_.name)),w=new Set(c.imports.filter(_=>_.synthetic!==!0).map(_=>_.line)),S=pU(t.kind),v=fU(t.kind)&&mU(c.language),k=l.split(` -`),$=R_(k,{blankStrings:!1}),F=R_(k,{blankStrings:!0});for(let _ of t.symbols){let ne=v?hU(_):P_(_);if(!ne||EU(_,p,h)||_U(_,p,y))continue;let ie=SU(_),Me=ie?$:F,re=S||ie;for(let X=0;X)?";return new RegExp(`(?:new\\s+)?${r}${n}${s}\\s*\\(|(?$_(s.confidence))&&e.set(r,n)}return[...e.values()].sort((n,r)=>n.file.localeCompare(r.file)||n.line-r.line)}function $_(t){return t==="high"?2:t==="medium"?1:0}function $U(t){let e=t.trim();return e.startsWith("#")?!RU.test(e):e.startsWith("%")||e.startsWith("(*")?!0:e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var RU=/^#\s*(include|define|undef|if|ifdef|ifndef|elif|else|endif|pragma|error|warning|line)\b/;function R_(t,e){let n=[],r=!1,s=null;for(let i of t){let o="",a=0,c=null;for(;ag.has(h.line-1)).length)}return a.length===0?null:{transform:{ruleId:"rename-identifier",from:r,to:s,anchors:c},edits:a,sitesResolved:l}}function D_(t,e,n){return e.ruleId==="rename-identifier"?AU(t,e.from,e.to,e.anchors,n):t}function AU(t,e,n,r,s){let i=r.filter(u=>u.file===s);if(i.length===0)return t;let o=t.split(` -`),a=new Map;for(let u of o)a.set(u,(a.get(u)??0)+1);let c=new Set;for(let u of i){let d=u.lineNumber-1;if(o[d]===u.line){c.add(d);continue}if((a.get(u.line)??0)===1){let p=o.indexOf(u.line);p!==-1&&c.add(p)}}if(c.size===0)return t;let l=new RegExp(`(?c.has(d)?M_(u,l,n):u).join(` -`)}function M_(t,e,n){let r=CU(t);e.lastIndex=0;let s="",i=0,o;for(;o=e.exec(r);){let a=o.index,c=a+o[0].length;s+=t.slice(i,a)+n,i=c}return s+=t.slice(i),s}function CU(t){let e="",n=null;for(let r=0;r({entry:p,confidence:IU(p,r,n)})).filter(p=>p.confidence!=="none");if(a.length===0)return null;let c={exact:2,"base-name":1,text:0};a.sort((p,f)=>c[f.confidence]-c[p.confidence]||Number(kf(f.entry))-Number(kf(p.entry)));let l=a[0].entry,u=l.slug??l.name,d=l.version??l.latestVersion;return!u||!d?null:{provider:"codemod.com",name:u,version:d,publisher:l.owner?.name??l.author??l.publisher??"Codemod.com",source:`https://app.codemod.com/registry/${encodeURIComponent(l.slug??u)}`,migration:l.description??l.summary??`Migrates ${e.name} usages.`,official:kf(l)}}function IU(t,e,n){let r=t.applicability?.flatMap(o=>o.packages??[])??[];if(r.some(o=>o.toLowerCase()===e))return"exact";if(r.some(o=>!o.includes("/")&&o.toLowerCase()===n))return"base-name";let s=`${t.slug??""} ${t.name??""} ${t.description??""} ${t.summary??""}`.toLowerCase(),i=new RegExp(`(?:^|[^a-z0-9])${DU(n)}(?:$|[^a-z0-9])`);return n&&i.test(s)?"text":"none"}function DU(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kf(t){if(t.verified||t.official)return!0;let e=(t.owner?.name??t.owner?.slug??t.author??t.publisher??"").toLowerCase();return e==="codemod"||e==="codemod.com"}var MU=/\borg\.openrewrite\.[a-zA-Z0-9_.]*[A-Z][a-zA-Z0-9_]*\b/;async function j_(t,e){if(!e||e.ecosystem!=="maven")return null;let n=F_(e.name).replace(/[^a-z0-9]/g,"-"),r=await L_(`rewrite-${n}`)??await L_(n);if(!r?.latestVersion)return null;let s=await NU(r.g,r.a,r.latestVersion),i=s?MU.exec(s)?.[0]:void 0;return i?{provider:"openrewrite",name:i,version:r.latestVersion,publisher:"OpenRewrite",source:`${Ef}/artifact/${r.g}/${r.a}/${r.latestVersion}`,migration:s??`Runs ${i} from ${r.g}:${r.a}.`,official:!0}:null}async function L_(t){let e=encodeURIComponent(`g:org.openrewrite.recipe AND a:${t}`),n=`${Ef}/solrsearch/select?q=${e}&core=gav&rows=1&wt=json`,s=(await J(n,{timeoutMs:Sf,cacheTtlMs:3600*1e3}))?.response?.docs?.[0];return s?.g==="org.openrewrite.recipe"?s:null}async function NU(t,e,n){let r=t.replace(/\./g,"/"),s=`${Ef}/remotecontent?filepath=${r}/${e}/${n}/${e}-${n}.pom`,i=await fe(s,{timeoutMs:Sf,cacheTtlMs:1440*60*1e3,immutable:!0});if(!i)return null;let o=/([\s\S]*?)<\/description>/.exec(i);return o?o[1].trim():null}function F_(t){return t.replace(/^@[^/]+\//,"").toLowerCase()}var LU=[G_,j_];async function q_(t,e,n=LU){let s=(await Promise.all(n.map(i=>i(t,e).catch(()=>null)))).filter(i=>i!==null);return s.length===0?null:(s.sort((i,o)=>Number(o.official)-Number(i.official)),s[0])}var B_={branch:"{prefix}upgrade-{summary}-{date}",title:"chore(deps): upgrade {summary}",prefix:"drift/"};function V_(t,e){let{changes:n}=t,r=t.now??new Date,s=n[0],i=s?n.length===1?`${s.name}-${s.from??"unknown"}-to-${s.to??"unknown"}`:`${n.length}-packages`:"dependencies",o=s?n.length===1?`${s.name} to ${s.to??"a new version"}`:`${n.length} packages`:"dependencies";return{prefix:e,summary:i,"summary-text":o,name:s?.name??"dependencies",from:s?.from??"",to:s?.to??"",count:String(n.length),date:r.toISOString().slice(0,10)}}function W_(t,e){return t.replace(/\{([a-z-]+)\}/g,(n,r)=>e[r]??n)}function U_(t){return(t.toLowerCase().replace(/[^a-z0-9/_.-]+/g,"-").replace(/(?<=[^/])\/(?=[^/])/g,"-").replace(/\.{2,}/g,".").replace(/-{2,}/g,"-").replace(/^[-./]+|[-./]+$/g,"").replace(/\.lock$/,"-lock")||"drift-upgrade").slice(0,200).replace(/[-./]+$/,"")}function z_(t,e={}){let n={...B_,...e},r=n.prefix?`${n.prefix.replace(/\/+$/,"")}/`:"",s=W_(n.branch,V_(t,r));return s.startsWith(r)&&r?`${r}${U_(s.slice(r.length))}`:U_(s)}function H_(t,e={}){let n={...B_,...e},r=V_(t,n.prefix);return W_(n.title,{...r,summary:r["summary-text"]}).trim()}var K_={"runtime-requirement":0,"config-change":1,"moved-export":1,"removed-export":2,"renamed-export":2,"removed-endpoint":3,"changed-endpoint":3,"signature-change":4,"type-change":4,"required-field-added":5,"default-change":5,"behaviour-change":6,unknown:7};function GU(t){switch(t){case"runtime-requirement":case"config-change":return"build";case"behaviour-change":case"default-change":return"fix";default:return"refactor"}}function Q_({breakingChanges:t,impactSites:e,config:n,changes:r=[],codemods:s,recipes:i}){let o=jU(e),a=t.filter(h=>(o.get(h.id)?.length??0)>0);if(a.length===0)return{commits:[],edges:[],cohorts:Z_(r),blockers:[]};let l=[...n.remediation.commitGranularity==="single"?[a]:n.remediation.commitGranularity==="per-dependency"?FU(a):a.map(h=>[h])].sort(qU),u=Z_(r),d=new Map;for(let h of u)for(let y of h.dependencies)d.set(y,h);let p=l.map((h,y)=>UU(h,y+1,o,l.length,s,i)),f=WU(p,t,e,d),m=JU(p,f),g=m.cycle.length>0?YU(m.cycle,f):void 0;return{commits:m.commits,edges:f,cohorts:u,blockers:g?[g]:[]}}function jU(t){let e=new Map;for(let n of t){let r=e.get(n.breakingChangeId);r?r.push(n):e.set(n.breakingChangeId,[n])}return e}function FU(t){let e=new Map;for(let n of t){let r=e.get(n.dependency);r?r.push(n):e.set(n.dependency,[n])}return[...e.values()]}function qU(t,e){let n=Math.min(...t.map(o=>K_[o.kind])),r=Math.min(...e.map(o=>K_[o.kind]));if(n!==r)return n-r;let s=t[0]?.dependency??"",i=e[0]?.dependency??"";return s.localeCompare(i)}function UU(t,e,n,r,s,i){let o=t.flatMap(d=>n.get(d.id)??[]),a=[...new Set(o.map(d=>d.file))].sort(),c=t[0],l=s?VU(t,n,s):void 0,u=!l&&i?BU(t,i):void 0;return{id:we("unit",t.map(d=>d.id).sort().join(","),a.join(","),c.dependency,c.kind),order:e,message:tB(t,a.length),body:sB(t,o,l,u),breakingChangeIds:t.map(d=>d.id),files:a,allowedFiles:a,allowedSymbols:[...new Set(t.flatMap(d=>d.symbols))].sort(),instructions:iB(t,o,e,r),dependsOn:[],dependencyReasons:[],executionLayer:0,expectedChecks:ZU(t,a),invalidationTriggers:XU(t,a),...l?{codemod:l}:{},...u?{recipe:u}:{}}}function BU(t,e){let n=[];for(let r of t){let s=e.get(r.id);if(!s)return;n.push(s)}return n.length>0?n:void 0}function VU(t,e,n){let r=new Set,s=[];for(let i of t){let o=e.get(i.id)??[],a=n.get(i.id);if(!a||a.sitesResolvedl.file))];if(c.some(l=>r.has(l)))return;for(let l of c)r.add(l);s.push({...a.transform,files:c})}return s.length>0?s:void 0}function WU(t,e,n,r){let s=new Map,i=new Map(e.map(c=>[c.id,c])),o=new Map;for(let c of n){let l=o.get(c.file);l?l.push(c):o.set(c.file,[c])}let a=(c,l,u,d)=>{if(c.id===l.id)return;let p=`${c.id}\0${l.id}\0${u}`;s.has(p)||s.set(p,{from:c.id,to:l.id,reason:u,evidence:[...new Set(d)].sort()})};for(let c=0;cf.dependency)),p=new Set(l.allowedFiles);for(let f=c+1;fv.dependency)),y=m.allowedFiles.filter(v=>p.has(v));y.length>0&&a(l,m,"same-file-conflict",y),u.some(v=>v.kind==="runtime-requirement")&&a(l,m,"runtime-prerequisite",u.map(v=>v.summary)),u.some(v=>v.kind==="config-change")&&g.some(v=>d.has(v.dependency))&&a(l,m,"configuration-prerequisite",u.map(v=>v.summary)),u.some(v=>v.kind==="moved-export")&&HU(u,g)&&a(l,m,"import-prerequisite",u.flatMap(v=>v.symbols)),l.allowedFiles.some(_f)&&!m.allowedFiles.every(_f)&&zU(d,h)&&a(l,m,"generated-output",l.allowedFiles.filter(_f));let w=[...d].map(v=>r.get(v)).filter(v=>!!v).filter(v=>g.some(k=>v.dependencies.includes(k.dependency)));for(let v of w)a(l,m,"package-cohort",[`${v.id}: ${v.reason}`]);let S=KU(l,m,o);S.length>0&&a(l,m,"symbol-dependency",S)}}return[...s.values()].sort(eT)}function J_(t,e){return t.breakingChangeIds.map(n=>e.get(n)).filter(n=>!!n)}function zU(t,e){for(let n of t)if(e.has(n))return!0;return!1}function HU(t,e){let n=t.filter(r=>r.kind==="moved-export");if(n.length===0)return!1;for(let r of n){let s=new Set([...r.symbols,...r.replacementSymbols??[]]);if(e.some(i=>i.dependency===r.dependency&&i.symbols.some(o=>s.has(o))))return!0}return!1}function _f(t){return/(^|\/)(__generated__|generated|gen)\//i.test(t)||/\.(generated|gen)\./i.test(t)}function KU(t,e,n){let r=new Set(t.allowedSymbols??[]);if(r.size===0)return[];let s=[];for(let i of e.allowedFiles)for(let o of n.get(i)??[])o.enclosingSymbol&&r.has(o.enclosingSymbol)&&s.push(`${i}:${o.line} is inside ${o.enclosingSymbol}`);return s}function eT(t,e){return t.from.localeCompare(e.from)||t.to.localeCompare(e.to)||t.reason.localeCompare(e.reason)||t.evidence.join("\0").localeCompare(e.evidence.join("\0"))}function JU(t,e){let n=new Map(t.map(a=>[a.id,a])),r=new Map;for(let a of t)r.set(a.id,new Set);for(let a of e)!n.has(a.from)||!n.has(a.to)||r.get(a.to).add(a.from);let s=new Set(t.map(a=>a.id)),i=new Map,o=0;for(;s.size>0;){let a=[...s].filter(c=>[...r.get(c)??[]].every(l=>!s.has(l))).map(c=>n.get(c)).sort((c,l)=>c.order-l.order||c.id.localeCompare(l.id));if(a.length===0)return{commits:Y_(t,e,i),cycle:[...s].sort()};for(let c of a)i.set(c.id,o),s.delete(c.id);o+=1}return{commits:Y_(t,e,i),cycle:[]}}function Y_(t,e,n){let r=new Map;for(let s of e){let i=r.get(s.to);i?i.push(s):r.set(s.to,[s])}return t.map(s=>{let i=[...r.get(s.id)??[]].sort(eT);return{...s,dependsOn:i.map(o=>o.from).sort(),dependencyReasons:i,executionLayer:n.get(s.id)??0}}).sort((s,i)=>s.executionLayer-i.executionLayer||s.order-i.order||s.id.localeCompare(i.id)).map((s,i)=>({...s,order:i+1}))}function YU(t,e){let n=e.filter(r=>t.includes(r.from)&&t.includes(r.to)).slice(0,5).map(r=>`${r.from} -> ${r.to} (${r.reason})`).join("; ");return`The remediation graph contains a dependency cycle across ${t.length} commit unit(s): ${n}. Drift cannot automatically execute this plan until the inseparable work is combined or reviewed manually.`}function ZU(t,e){let n=[];return t.some(r=>r.kind==="signature-change"||r.kind==="type-change"||r.kind==="removed-export"||r.kind==="renamed-export"||r.kind==="moved-export")&&n.push({id:we("check","typecheck",t.map(r=>r.id).sort().join(",")),kind:"typecheck",reason:"API-shape and type-contract migrations should be checked by the repository type checker when available."}),t.some(r=>r.kind==="behaviour-change"||r.kind==="default-change")&&n.push({id:we("check","test",t.map(r=>r.id).sort().join(",")),kind:"test",reason:"Behavioural and default changes need tests because compilation can still succeed with wrong behaviour."}),e.some(r=>/(^|\/)(package\.json|tsconfig\.json|vite\.config|webpack\.config|rollup\.config)/.test(r))&&n.push({id:we("check","build",e.join(",")),kind:"build",reason:"Configuration and package-entry changes can alter the build graph."}),n}function XU(t,e){let n=[...e.map(r=>`file:${r}`),...t.flatMap(r=>r.symbols.map(s=>`symbol:${s}`)),...t.map(r=>`dependency:${r.dependency}`)];return[...new Set(n)].sort()}function Z_(t){let e=[],n=new Map;for(let r of t){let s=n.get(r.ecosystem);s?s.push(r):n.set(r.ecosystem,[r])}for(let[r,s]of n)for(let i of QU(s)){if(i.length<2)continue;let o=i.map(a=>a.name).sort();e.push({id:we("cohort",r,o.join(",")),ecosystem:i[0].ecosystem,dependencies:o,constraints:i.map(a=>({dependency:a.name,ecosystem:a.ecosystem,range:a.rawTo??a.to??"*",source:"workspace-family"})),candidatePaths:[...new Set(i.map(a=>a.manifestPath))].sort(),reason:`These ${r} packages appear to be part of the same ${eB(i[0].name)} upgrade family and should be reviewed together.`})}return e.sort((r,s)=>r.id.localeCompare(s.id))}function QU(t){let e=new Map;for(let n of t){let r=tT(n.name);if(!r)continue;let s=e.get(r);s?s.push(n):e.set(r,[n])}return[...e.values()]}function tT(t){let e=[/^(@angular)\//,/^(@babel)\//,/^(@nestjs)\//,/^(@types)\//,/^(@vue)\//,/^(react)(?:$|-)/,/^(next)(?:$|-)/,/^(eslint)(?:$|-)/,/^(jest)(?:$|-)/,/^(webpack)(?:$|-)/,/^(vite)(?:$|-)/];for(let n of e){let r=n.exec(t);if(r?.[1])return r[1]}if(t.startsWith("@")){let n=t.split("/")[0];return n&&n!==t?n:null}return null}function eB(t){return Qv(tT(t)??t,32)}function tB(t,e){let n=t[0],r=GU(n.kind),s=rB(t);return t.length===1?X_(`${r}(${s}): ${nB(n)}`):X_(`${r}(${s}): update ${t.length} usages for the new ${n.dependency} API`)}function nB(t){let e=t.symbols[0],n=t.replacementSymbols?.[0];switch(t.kind){case"removed-export":return e?`replace removed \`${e}\``:"replace removed API";case"renamed-export":return e&&n?`migrate \`${e}\` to \`${n}\``:`migrate renamed \`${e??"API"}\``;case"moved-export":return`import ${e?`\`${e}\``:"the API"} from its new entry point`;case"signature-change":return e?`update \`${e}\` call sites for the new signature`:"update call sites for new signatures";case"type-change":return e?`adapt to the new \`${e}\` type`:"adapt to changed types";case"removed-endpoint":return e?`migrate calls to removed endpoint \`${e}\``:"migrate removed endpoint calls";case"changed-endpoint":return e?`update requests to \`${e}\``:"update API requests";case"required-field-added":return e?`supply now-required \`${e}\``:"supply newly-required fields";case"default-change":return e?`pin previous default for \`${e}\``:"account for changed defaults";case"runtime-requirement":return t.summary.toLowerCase().startsWith("minimum")?t.summary.charAt(0).toLowerCase()+t.summary.slice(1):"raise the minimum runtime version";case"config-change":return/\bESM\b/i.test(t.summary)?"migrate to ESM imports":/commonjs/i.test(t.summary)?"replace dropped CommonJS usage":"update configuration for the new version";case"behaviour-change":return e?`handle changed \`${e}\` behaviour`:"handle changed behaviour";default:return`update usage of \`${t.dependency}\``}}function rB(t){let e=[...new Set(t.map(n=>n.dependency))];if(e.length===1){let n=e[0];return n.startsWith("@")?n.split("/")[1]??n:n.split(":").pop()??n}return"deps"}function X_(t){return t.length<=72?t:`${t.slice(0,69)}...`}function sB(t,e,n,r){let s=[];for(let o of t)s.push(o.summary),s.push(""),s.push(o.remediation),s.push("");let i=[...new Set(e.map(o=>o.file))];if(s.push(`Affects ${e.length} location(s) across ${i.length} file(s).`),s.push(""),n){let o=new Set(n.flatMap(a=>a.files)).size;s.push(`Resolved deterministically by Drift's codemod engine across ${o} file(s) \u2014 no model call was made for this commit.`)}else if(r&&r.length>0){let o=[...new Map(r.map(c=>[`${c.provider}:${c.name}@${c.version}`,c])).values()],a=o.map(c=>`${c.name}@${c.version} (${c.provider}, published by ${c.publisher})`).join(", ");s.push(`Community recipe available: ${a}. Not applied without an explicit choice \u2014 see ${o[0].source}.`)}else s.push("Identified by Drift from upstream evidence; see the pull request"),s.push("description for the citations behind this change.");return s.join(` -`).trim()}function iB(t,e,n,r){let s=[];s.push(`## Commit ${n} of ${r}`),s.push("");for(let i of t){s.push(`### ${i.summary}`),s.push(""),s.push(`- Dependency: \`${i.dependency}\``),s.push(`- Change type: ${i.kind}`),s.push(`- Confidence: ${i.confidence}`),s.push(""),s.push(i.remediation),s.push("");let o=e.filter(a=>a.breakingChangeId===i.id);if(o.length>0){s.push("Known locations (verify each; there may be others):"),s.push("");for(let a of o.slice(0,40)){let c=a.enclosingSymbol?` in \`${a.enclosingSymbol}\``:"";s.push(`- \`${a.file}:${a.line}\`${c} \u2014 \`${a.excerpt}\``)}o.length>40&&s.push(`- \u2026and ${o.length-40} more matches of the same symbols`),s.push("")}}return s.join(` -`).trim()}var nT=["detect","evidence","surface","static-analysis","upgrade-discovery","upgrade-install","verify","fix","pull-request"],$f={detect:"Detect",evidence:"Evidence",surface:"API surface","static-analysis":"Static analysis","upgrade-discovery":"Find upgrades","upgrade-install":"Install a version",verify:"Verify",fix:"Fix","pull-request":"Automated PR"},M=()=>({level:"full"}),L=(t,e)=>({level:"partial",note:t,...e?{requires:e}:{}}),Or=t=>({level:"none",note:t}),On="Resolves imports against the module names the published package declares, follows re-exports inside your repository, and matches references to symbols named in the evidence. Cannot see through reflection, dynamic dispatch, or generated code.",oB="Matches imports and references to symbols named in the evidence, using the ecosystem's own module-naming convention where no published module list exists. Cannot see through reflection, dynamic dispatch, or generated code.",Tf="Compares the declarations in both versions' public headers, which is what a consumer compiles against. Declarations behind preprocessor conditionals are read as written, not per build configuration.",xf="Matches `#include` directives and references to symbols named in the evidence, following includes through your own headers so a library reached indirectly still counts. A macro-generated call site is invisible.",aB={npm:{ecosystem:"npm",localizationBasis:"declared",label:"JavaScript / TypeScript",files:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","npm-shrinkwrap.json"],managers:["npm","pnpm","Yarn (classic)","Yarn (berry)","Bun"],support:{detect:M(),evidence:M(),surface:L("Diffs published TypeScript declarations. A package that ships no declarations of its own falls back to prose evidence rather than reporting a clean comparison."),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs the typecheck, test, and build scripts the project's package.json actually declares."),fix:M(),"pull-request":M()}},pypi:{ecosystem:"pypi",localizationBasis:"published",label:"Python",files:["pyproject.toml","requirements.txt","setup.py","poetry.lock","uv.lock","Pipfile"],managers:["pip","Poetry","uv"],support:{detect:M(),evidence:M(),surface:L("Compares the public surface reconstructed from published type stubs. Packages without stubs fall back to prose evidence.","a local Python interpreter"),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs mypy/pyright and pytest when the project declares them."),fix:M(),"pull-request":M()}},go:{ecosystem:"go",localizationBasis:"declared",label:"Go",files:["go.mod","go.sum"],managers:["Go modules"],support:{detect:M(),evidence:M(),surface:L("Compares the exported API of both module versions.","the Go toolchain"),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs `go vet`, `go test`, and `go build`.","the Go toolchain"),fix:M(),"pull-request":M()}},cargo:{ecosystem:"cargo",localizationBasis:"declared",label:"Rust",files:["Cargo.toml","Cargo.lock"],managers:["Cargo"],support:{detect:M(),evidence:M(),surface:L("Compares the public API of both crate versions.","cargo-public-api"),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs `cargo check`, `cargo test`, and `cargo build`.","the Rust toolchain"),fix:M(),"pull-request":M()}},maven:{ecosystem:"maven",localizationBasis:"published",label:"Java / Kotlin / Scala",files:["pom.xml","build.gradle","build.gradle.kts","gradle/libs.versions.toml","build.sbt"],managers:["Maven","Gradle","sbt"],support:{detect:L("Reads pom.xml, Gradle build files and version catalogs, and sbt coordinates. Gradle versions computed at configuration time are not visible without running Gradle."),evidence:M(),surface:L("Compares both published JARs.","japicmp"),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs Maven or Gradle. sbt projects verify through sbt when it is installed."),fix:L("Maven and sbt are edited through the build file; Gradle versions declared outside a version catalog may need a manual edit."),"pull-request":M()}},rubygems:{ecosystem:"rubygems",localizationBasis:"published",label:"Ruby",files:["Gemfile","Gemfile.lock","*.gemspec"],managers:["Bundler"],support:{detect:M(),evidence:M(),surface:Or("Ruby has no static public API surface to compare, so upgrades rest on release notes, changelogs, and advisories."),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs RSpec or Rake when the Gemfile declares them.","Bundler"),fix:M(),"pull-request":M()}},nuget:{ecosystem:"nuget",localizationBasis:"published",label:".NET",files:["*.csproj","*.fsproj","*.vbproj","Directory.Packages.props","packages.lock.json"],managers:["NuGet"],support:{detect:M(),evidence:L("Registry metadata, published versions, deprecation, and OSV advisories. Release notes depend on the package declaring a GitHub repository."),surface:L("Compares the public types and member signatures in both versions' published assemblies, preferring the reference assembly and a common target framework. A package that ships only native binaries, analyzers, or nothing at all has no surface to compare."),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs `dotnet build` and `dotnet test`.","the .NET SDK"),fix:M(),"pull-request":M()}},packagist:{ecosystem:"packagist",localizationBasis:"published",label:"PHP",files:["composer.json","composer.lock"],managers:["Composer"],support:{detect:M(),evidence:L("Registry metadata, published versions, abandonment notices, and OSV advisories. Release notes depend on the package declaring a source repository."),surface:Or("PHP publishes no machine-comparable API artefact; upgrades rest on release notes, changelogs, and advisories."),"static-analysis":L("Resolves `use` statements against the PSR-4 and PSR-0 roots the package declares in its own composer.json, read from Packagist. A package that autoloads only by classmap declares no namespace root and is not localized."),"upgrade-discovery":M(),verify:L("Runs PHPUnit when composer.json declares it.","Composer"),fix:M(),"pull-request":M()}},hex:{ecosystem:"hex",localizationBasis:"published",label:"Elixir / Erlang",files:["mix.exs","mix.lock"],managers:["Mix"],support:{detect:M(),evidence:L("Registry metadata, published versions, retirement notices, and OSV advisories."),surface:L("Compares the public modules and their functions, by name and arity, in both versions' published sources \u2014 `def` and `defmacro` in Elixir, `-export` in Erlang. A function a macro generates at compile time is not visible without compiling."),"static-analysis":L("Resolves module references against every module the released tarball defines, so a fully qualified call needs no `alias` to be found. Cannot see through `apply/3` or a module name computed at runtime."),"upgrade-discovery":M(),verify:L("Runs `mix compile --warnings-as-errors` and `mix test`.","Elixir and Mix"),fix:M(),"pull-request":M()}},pub:{ecosystem:"pub",localizationBasis:"declared",label:"Dart / Flutter",files:["pubspec.yaml","pubspec.lock"],managers:["Dart pub","Flutter"],support:{detect:M(),evidence:L("Registry metadata, published versions, retraction, and OSV advisories. Release notes depend on the package declaring a repository."),surface:L("Compares the public declarations of both versions' published libraries, following each `export` out of the private `lib/src` tree the way a consumer's import does. Read from source rather than from a compiled artefact."),"static-analysis":L(On),"upgrade-discovery":M(),verify:L("Runs `dart analyze` and `dart test`, or their Flutter equivalents.","the Dart or Flutter SDK"),fix:M(),"pull-request":M()}},swift:{ecosystem:"swift",localizationBasis:"published",label:"Swift",files:["Package.swift","Package.resolved"],managers:["Swift Package Manager"],support:{detect:L("Reads literal `.package(...)` declarations and Package.resolved. Versions computed by Swift code at manifest-evaluation time are not visible without running SwiftPM."),evidence:L("Source repository, releases, and changelogs, because SwiftPM identifies packages by git URL. There is no central registry to query for deprecation."),surface:Or("Comparing two Swift module interfaces needs a local toolchain and a built artefact Drift does not produce; upgrades rest on prose evidence."),"static-analysis":L("Resolves `import` statements against the library and target names declared in the dependency's own Package.swift at the resolved version. A module name a manifest computes at evaluation time is not visible without running SwiftPM."),"upgrade-discovery":L("Versions are git tags, since SwiftPM has no package registry to ask. Drift lists them for packages hosted on GitHub; anything on another git host is reported as unchecked rather than up to date."),verify:L("Runs `swift build` and `swift test`.","the Swift toolchain"),fix:M(),"pull-request":M()}},cocoapods:{ecosystem:"cocoapods",localizationBasis:"published",label:"CocoaPods",files:["Podfile","Podfile.lock","*.podspec"],managers:["CocoaPods"],support:{detect:M(),evidence:L("Release notes and changelogs when the pod declares a GitHub source. CocoaPods publishes no queryable metadata API, so there is no deprecation or advisory signal."),surface:Or("Drift does not compare compiled iOS frameworks; upgrades rest on prose evidence."),"static-analysis":L("Resolves `import` statements against the `module_name` the pod declares in its podspec, read from the CocoaPods CDN. A pod that builds its module name in Ruby at podspec-evaluation time is not visible without running CocoaPods."),"upgrade-discovery":M(),verify:Or("Building an iOS target needs Xcode and a scheme Drift cannot infer; verification stays with the developer."),fix:M(),"pull-request":M()}},opam:{ecosystem:"opam",localizationBasis:"convention",label:"OCaml",files:["*.opam","dune-project","*.opam.locked"],managers:["opam"],support:{detect:M(),evidence:L("Release notes and changelogs when the package declares a GitHub source. opam has no JSON metadata API, so there is no registry deprecation signal."),surface:Or("Comparing two OCaml module interfaces needs a built switch Drift does not create; upgrades rest on prose evidence."),"static-analysis":L(oB),"upgrade-discovery":L("opam publishes no version API, so releases are read from the package directories in the opam-repository index. A package published only in a custom repository is reported as unchecked rather than up to date."),verify:L("Runs `dune build` and `dune runtest`.","opam and dune"),fix:M(),"pull-request":M()}},conan:{ecosystem:"conan",localizationBasis:"convention",label:"C / C++ (Conan)",files:["conanfile.txt","conanfile.py","conan.lock"],managers:["Conan"],support:{detect:L("Reads conanfile.txt, conan.lock, and the literal `requires` declarations in conanfile.py. A reference a recipe builds at evaluation time is not visible without running Python."),evidence:L("Versions from the ConanCenter recipe index, and releases and changelogs from the upstream project the recipe builds \u2014 not from the recipe itself. ConanCenter publishes no deprecation signal, and OSV has no Conan ecosystem."),surface:L(Tf),"static-analysis":L(xf),"upgrade-discovery":M(),verify:L("Runs `conan build`, which is the compiler \u2014 in C and C++ an incompatible header change is a build failure rather than a runtime surprise.","Conan"),fix:M(),"pull-request":M()}},vcpkg:{ecosystem:"vcpkg",localizationBasis:"convention",label:"C / C++ (vcpkg)",files:["vcpkg.json","vcpkg-configuration.json"],managers:["vcpkg"],support:{detect:L("Reads declared dependencies, `version>=` floors, and `overrides`. A registry baseline moving changes every unpinned version at once; Drift reports the baseline move rather than resolving it to versions."),evidence:L("Versions from the vcpkg versions database, and releases and changelogs from the port's upstream project. vcpkg publishes no deprecation signal, and OSV has no vcpkg ecosystem."),surface:L(Tf),"static-analysis":L(xf),"upgrade-discovery":M(),verify:L("Runs the project's CMake build, which is where an incompatible header change surfaces.","CMake"),fix:M(),"pull-request":M()}},arduino:{ecosystem:"arduino",localizationBasis:"convention",label:"Arduino / PlatformIO",files:["library.properties","platformio.ini"],managers:["Arduino CLI","PlatformIO"],support:{detect:M(),evidence:L("Versions and repositories from the Arduino Library Manager index, plus releases and changelogs from the library's own repository. A library published only to PlatformIO has metadata but no version history, because that registry serves only the current release."),surface:L(Tf),"static-analysis":L(xf),"upgrade-discovery":M(),verify:L("Runs `arduino-cli compile` or `pio run`, and `pio test` where the project has tests.","Arduino CLI or PlatformIO"),fix:M(),"pull-request":M()}}};function cB(t){let e=Ni.filter(o=>o.ecosystem===t),n={name:"example",version:"1.0.0",kind:"runtime"},r=e.filter(o=>o.upgrade(n)!==null),s=e.filter(o=>o.upgrade(n)===null);if(s.length===0)return M();let i=o=>o.map(a=>a.label).join(", ");return r.length===0?Or(`${i(s)} ${s.length===1?"has":"have"} no command that pins a version \u2014 the coordinate lives in a build file the tool will not rewrite. Drift reports the version to set and where, and leaves the edit to you.`):L(`${i(r)} can install a chosen version directly. ${i(s)} cannot: the version lives in a build file the tool will not rewrite, so Drift tells you what to change instead of running something that silently changes nothing.`)}var lB=Object.values(aB).map(t=>({...t,support:{...t.support,"upgrade-install":cB(t.ecosystem)}})),uB=Object.fromEntries(lB.map(t=>[t.ecosystem,t]));function rT(t){return uB[t]}var Rf=require("node:crypto");var qs=3,Af=[qs];function Je(t){return t===null||typeof t!="object"?JSON.stringify(t??null)??"null":Array.isArray(t)?`[${t.map(n=>Je(n)).join(",")}]`:`{${Object.entries(t).filter(([,n])=>n!==void 0).sort(([n],[r])=>nr?1:0).map(([n,r])=>`${JSON.stringify(n)}:${Je(r)}`).join(",")}}`}function dB(t){return{id:t.id,source:t.source,dependency:t.dependency,url:t.url??null,locator:t.locator??null,title:t.title,contentHash:(0,Rf.createHash)("sha256").update(t.content).digest("hex"),weight:t.weight,findings:(t.findings??[]).map(e=>({code:e.code,symbol:e.symbol,detail:e.detail,before:e.before??null,after:e.after??null}))}}function pB(t){return{nature:t.nature,detectability:[...t.detectability].sort(),scope:t.scope,visibility:[...t.visibility].sort(),origin:t.origin}}function fB(t){return{schemaVersion:qs,id:t.id,baseBranch:t.baseBranch,headSha:t.headSha,risk:t.risk,blockers:[...t.blockers],warnings:[...t.warnings],changes:t.changes.map(e=>({name:e.name,ecosystem:e.ecosystem,from:e.from,to:e.to,kind:e.kind,bump:e.bump,manifestPath:e.manifestPath,workspace:e.workspace??null})),breakingChanges:t.breakingChanges.map(e=>({id:e.id,dependency:e.dependency,kind:e.kind,summary:e.summary,remediation:e.remediation,symbols:[...e.symbols].sort(),replacementSymbols:[...e.replacementSymbols??[]].sort(),confidence:e.confidence,taxonomy:pB(rt(e)),assessment:e.assessment?{upstream:e.assessment.upstream.score,localImpact:e.assessment.localImpact.score,verification:e.assessment.verification.score,automaticExecutionEligible:e.assessment.automaticExecutionEligible,calibration:e.assessment.upstream.calibration}:null,citations:[...e.citations].sort()})),impactSites:t.impactSites.map(e=>({breakingChangeId:e.breakingChangeId,file:e.file,line:e.line,matchedSymbol:e.matchedSymbol,enclosingSymbol:e.enclosingSymbol??null,confidence:e.confidence})),commits:t.commits.map(e=>({id:e.id,order:e.order,message:e.message,body:e.body,breakingChangeIds:[...e.breakingChangeIds].sort(),files:[...e.files].sort(),allowedFiles:[...e.allowedFiles].sort(),allowedSymbols:[...e.allowedSymbols??[]].sort(),instructions:e.instructions,dependsOn:[...e.dependsOn].sort(),dependencyReasons:[...e.dependencyReasons].map(n=>({from:n.from,to:n.to,reason:n.reason,evidence:[...n.evidence].sort()})).sort((n,r)=>Je(n).localeCompare(Je(r))),executionLayer:e.executionLayer,expectedChecks:[...e.expectedChecks].map(n=>({id:n.id,kind:n.kind,command:n.command??null,reason:n.reason})).sort((n,r)=>Je(n).localeCompare(Je(r))),invalidationTriggers:[...e.invalidationTriggers].sort()})),planEdges:[...t.planEdges].map(e=>({from:e.from,to:e.to,reason:e.reason,evidence:[...e.evidence].sort()})).sort((e,n)=>Je(e).localeCompare(Je(n))),upgradeCohorts:[...t.upgradeCohorts].map(e=>({id:e.id,ecosystem:e.ecosystem,dependencies:[...e.dependencies].sort(),constraints:[...e.constraints].map(n=>({dependency:n.dependency,ecosystem:n.ecosystem,range:n.range,source:n.source})).sort((n,r)=>Je(n).localeCompare(Je(r))),candidatePaths:[...e.candidatePaths].sort(),reason:e.reason})).sort((e,n)=>e.id.localeCompare(n.id)),evidence:t.evidence.map(dB),gaps:[...t.gaps].map(e=>({stage:e.stage,dependency:e.dependency??null,ecosystem:e.ecosystem??null,surface:e.surface,severity:e.severity,automaticExecution:e.automaticExecution})).sort((e,n)=>Je(e).localeCompare(Je(n)))}}function Yc(t){return(0,Rf.createHash)("sha256").update(Je(fB(t))).digest("hex")}function sT(t){return t.assessment?i_(t.assessment):t.confidence}function iT(t){let{repo:e,config:n,changes:r,evidence:s,impactSites:i}=t,o=mB(t),a=Q_({breakingChanges:o,impactSites:i,config:n,changes:r,codemods:t.codemods,recipes:t.recipes}),c=a.commits,l=bB(r,o,i),u=gB(t,o,c),{blockers:d,warnings:p}=wB(t,o,c,l,u);return{schemaVersion:qs,id:we("plan",e.owner,e.repo,e.afterSha),branchName:yB(n,r,e.afterSha),baseBranch:e.baseBranch,headSha:e.afterSha,changes:[...r],evidence:[...s],breakingChanges:o,impactSites:[...i],commits:c,planEdges:a.edges,upgradeCohorts:a.cohorts,...t.rationale?{rationale:[...t.rationale]}:{},risk:l,gaps:u,checkedSurfaces:[...t.checkedSurfaces??[]],blockers:[...a.blockers,...d],warnings:p,createdAt:new Date().toISOString()}}function mB(t){let{evidence:e,breakingChanges:n,impactSites:r}=t,s=t.localizationRan??!0;return n.map(i=>{let o=r.filter(u=>u.breakingChangeId===i.id),a=rt(i),c=(t.verification??[]).filter(u=>u.breakingChangeIds!==void 0?u.breakingChangeIds.includes(i.id):u.dependency===void 0?!0:u.dependency===i.dependency&&u.workspace===i.workspace),l=s_({change:i,taxonomy:a,evidence:e,sites:o,localizationRan:s,outcomes:c,checkedSurfaces:t.checkedSurfaces??[],gaps:[]});return{...i,taxonomy:a,assessment:l}})}function gB(t,e,n){let{changes:r,evidence:s,impactSites:i,config:o}=t,a=[];!(t.localizationRan??!0)&&e.length>0&&a.push({stage:"localize",surface:"repository source",reason:'No checkout was available, so Drift could not search this repository for affected code. Zero impact sites here means "not searched", not "not affected".',severity:"blocking",automaticExecution:"blocks",remediation:"Run Drift as a GitHub Action or from the CLI in a checkout. The webhook runner cannot localize \u2014 see docs/deployment.md."});for(let u of r)s.filter(f=>f.dependency===u.name&&f.workspace===u.workspace).filter(f=>f.source!=="semver-heuristic"&&f.source!=="registry-metadata").length===0&&a.push({stage:"evidence",ecosystem:u.ecosystem,dependency:u.name,surface:"upstream release evidence",reason:`No changelog, release notes, migration guide, or API diff could be retrieved for ${u.name}. Drift will not dispatch a fix based on a version number alone.`,severity:"significant",automaticExecution:o.guardrails.requireEvidence&&e.length>0?"blocks":"degrades",remediation:"Check the package publishes release notes Drift can reach, or review this upgrade by hand."});for(let u of e)i.filter(p=>p.breakingChangeId===u.id).length>0||wc(rt(u))&&a.push({stage:"localize",dependency:u.dependency,surface:`reachability of ${u.symbols.slice(0,3).join(", ")||u.dependency}`,reason:`${u.summary} is only observable at runtime, so searching the source cannot establish whether this repository is affected.`,severity:"significant",automaticExecution:"degrades",remediation:"Confirm by exercising the affected paths, or review the upstream notes directly."});(t.verification??[]).filter(u=>!u.name.startsWith("behavioural:")).length===0&&n.length>0&&a.push({stage:"verify",surface:"build, typecheck, and test",reason:"No checks were run against this plan, so nothing confirms the findings were understood correctly or that a fix would compile.",severity:"significant",automaticExecution:"degrades",remediation:"Configure the repository checks Drift should run, or review the resulting pull request against CI before merging."});for(let u of[...new Set(r.map(d=>d.ecosystem))].sort()){let d=rT(u);for(let p of nT)d.support[p].level==="none"&&a.push({stage:hB(p),ecosystem:u,surface:$f[p],reason:d.support[p].note??`${$f[p]} does not run for ${u}.`,severity:"significant",automaticExecution:"degrades",remediation:`Drift cannot run this stage for ${u}; review this surface by hand.`})}return a}function hB(t){switch(t){case"detect":return"detect";case"evidence":case"surface":return"evidence";case"static-analysis":return"localize";case"verify":return"verify";default:return"plan"}}function yB(t,e,n){return z_({changes:e},{branch:t.pullRequest.branchTemplate,prefix:t.remediation.branchPrefix})}function bB(t,e,n){if(e.length===0||n.length===0)return"none";let r="low",s=o=>{dy(o,r)>0&&(r=o)},i=new Set(n.map(o=>o.file)).size;(i>5||n.length>20)&&s("medium"),(i>20||n.length>75)&&s("high");for(let o of e)(o.kind==="behaviour-change"||o.kind==="default-change")&&s("high"),o.kind==="unknown"&&s("medium"),o.confidence==="low"&&s("medium");for(let o of t)o.bump==="major"&&s("medium"),Pi(o.from,o.to)&&s("high");return n.some(o=>oT(o.file))&&s("medium"),r}function wB(t,e,n,r,s){let{config:i,changes:o,impactSites:a,skipped:c=[]}=t,l=i.guardrails,u=[],d=[],p=[...new Set(n.flatMap(k=>k.files))];p.length>l.maxFilesChanged&&u.push(`This plan would touch ${p.length} files, above the \`maxFilesChanged\` limit of ${l.maxFilesChanged}. A change this wide should be read by a person before an agent starts editing.`),o.length>l.maxDependenciesPerRun&&u.push(`${o.length} dependencies moved in one commit, above the \`maxDependenciesPerRun\` limit of ${l.maxDependenciesPerRun}. Batched upgrades make it hard to attribute a regression to the dependency that caused it.`);let f=p.filter(k=>ir(l.protectedPaths,k));f.length>0&&u.push(`Impact sites fall inside protected paths: ${f.slice(0,5).join(", ")}${f.length>5?`, +${f.length-5} more`:""}. Drift will not direct an agent to edit these.`);let m=o.filter(k=>ir(i.alwaysApprove,k.name));m.length>0&&u.push(`${m.map(k=>k.name).join(", ")} matched \`alwaysApprove\` in drift.yml.`);let g=new Set(n.flatMap(k=>k.breakingChangeIds)),h=e.filter(k=>g.has(k.id)&&!mf(sT(k),l.minConfidence));if(h.length>0){let k=h.slice(0,3).map($=>`\`${$.dependency}\`: ${$.summary}`).join("; ");l.experimentalDispatchBelowMinConfidence?d.push(`${h.length} finding(s) are below the \`minConfidence\` threshold of \`${l.minConfidence}\` but \`experimentalDispatchBelowMinConfidence\` is on, so Drift will dispatch anyway. ${k}.`):u.push(`${h.length} finding(s) Drift planned commits for are below the \`minConfidence\` threshold of \`${l.minConfidence}\`: ${k}. The plan is filed for review rather than dispatched.`)}let y=e.filter(k=>!g.has(k.id)&&!mf(sT(k),l.minConfidence));y.length>0&&d.push(`${y.length} finding(s) are below the \`minConfidence\` threshold and no commit was planned for them. They are listed for awareness.`);let w=s.filter(k=>k.automaticExecution==="blocks");for(let k of w)u.push(`${k.reason} ${k.remediation}`);zu(r,i.maxAutoRisk)||u.push(`Assessed risk is \`${r}\`, above the \`maxAutoRisk\` ceiling of \`${i.maxAutoRisk}\`.`);let S=a.filter(k=>oT(k.file));S.length>0&&d.push(`${S.length} impact site(s) are in test files. Confirm the fix updates tests to match the new API rather than weakening what they assert.`);let v=e.filter(k=>!a.some($=>$.breakingChangeId===k.id));v.length>0&&d.push(`${v.length} breaking change(s) were identified upstream but no usage was found in this repository. They are listed for awareness and no commit was planned for them.`);for(let k of c)d.push(`Skipped \`${k.change.name}\`: ${k.reason}.`);return{blockers:u,warnings:d}}function oT(t){let e=t.toLowerCase();return/(^|\/)(tests?|__tests__|spec|specs|e2e|integration_tests)\//.test(e)||/\.(test|spec)\.[jt]sx?$/.test(e)||/(^|\/)test_[^/]+\.py$/.test(e)||/_test\.(py|go|rb)$/.test(e)||/_spec\.rb$/.test(e)||/Test\.java$/.test(t)||/Tests?\.kt$/.test(t)}function aT(t,e){return e.mode!=="auto"||t.blockers.length>0||t.commits.length===0?!1:zu(t.risk,e.maxAutoRisk)}var vo=vt(os(),1);var cT="https://api.osv.dev/v1/query",vB={npm:"npm",pypi:"PyPI",go:"Go",cargo:"crates.io",maven:"Maven",rubygems:"RubyGems",nuget:"NuGet",packagist:"Packagist",hex:"Hex",pub:"Pub",swift:"SwiftURL",cocoapods:null,opam:null,conan:null,vcpkg:null,arduino:null};async function Pf(t,e,n,r,s={}){let i=vB[e];if(!i)return lT();let o=s.fetch??$B,[a,c]=await Promise.all([o(cT,{version:n,package:{name:t,ecosystem:i}}),o(cT,{version:r,package:{name:t,ecosystem:i}})]);if(a===null||c===null)return lT();let l=uT(a,n),u=uT(c,r),d=l.filter(m=>!Cf(m,u)),p=u.filter(m=>!Cf(m,l)),f=l.filter(m=>Cf(m,u));return{checked:!0,current:l,target:u,resolved:d,introduced:p,carried:f,direction:kB(d,p)}}function Cf(t,e){let n=new Set([t.id,...t.aliases]);return e.some(r=>n.has(r.id)||r.aliases.some(s=>n.has(s)))}function kB(t,e){return t.length>0&&e.length>0?"mixed":t.length>0?"improves":e.length>0?"worsens":"preserves"}function lT(){return{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"}}function uT(t,e){let n=t?.vulns;if(!Array.isArray(n))return[];let r=[];for(let s of n)!s.id||s.withdrawn||r.push({id:s.id,aliases:(s.aliases??[]).filter(i=>typeof i=="string"),summary:xB(s.summary||s.details||"No summary published."),severity:SB(s),url:TB(s),fixedIn:_B(s,e)});return pT(r).sort((s,i)=>dT[s.severity]-dT[i.severity])}function pT(t){let e=new Map,n=[];for(let r of t){let s=[r.id,...r.aliases],o=s.map(a=>e.get(a)).find(a=>a!==void 0)??n.push([])-1;n[o].push(r);for(let a of s)e.set(a,o)}return n.filter(r=>r.length>0).map(r=>{let s=r.find(o=>o.severity!=="unknown")??r[0],i=new Set(r.flatMap(o=>[o.id,...o.aliases]));return i.delete(s.id),{...s,aliases:[...i].sort(),fixedIn:EB(r.map(o=>o.fixedIn)),summary:r.find(o=>o.summary!=="No summary published.")?.summary??s.summary}})}function EB(t){return t.filter(n=>!!n).map(n=>({raw:n,parsed:te(n)})).filter(n=>n.parsed!==null).sort((n,r)=>vo.default.compare(n.parsed,r.parsed))[0]?.raw??t.find(n=>!!n)??null}var dT={critical:0,high:1,medium:2,low:3,unknown:4};function SB(t){let e=t.database_specific?.severity??t.affected?.find(s=>s.database_specific?.severity)?.database_specific?.severity??t.affected?.find(s=>s.ecosystem_specific?.severity)?.ecosystem_specific?.severity;if(e){let s=e.toLowerCase();if(s==="critical")return"critical";if(s==="high")return"high";if(s==="moderate"||s==="medium")return"medium";if(s==="low")return"low"}let n=t.severity?.find(s=>s.score)?.score,r=n?fT(n):null;return r===null?"unknown":r>=9?"critical":r>=7?"high":r>=4?"medium":"low"}function fT(t){if(!/^CVSS:3\.[01]\//.test(t))return null;let e=new Map;for(let S of t.split("/").slice(1)){let[v,k]=S.split(":");v&&k&&e.set(v,k)}let n={N:.85,A:.62,L:.55,P:.2},r={L:.77,H:.44},s={N:.85,R:.62},i={H:.56,L:.22,N:0},o=e.get("S")==="C",a=o?{N:.85,L:.68,H:.5}:{N:.85,L:.62,H:.27},c=n[e.get("AV")??""],l=r[e.get("AC")??""],u=a[e.get("PR")??""],d=s[e.get("UI")??""],p=i[e.get("C")??""],f=i[e.get("I")??""],m=i[e.get("A")??""];if([c,l,u,d,p,f,m].some(S=>S===void 0))return null;let g=1-(1-p)*(1-f)*(1-m),h=o?7.52*(g-.029)-3.25*(g-.02)**15:6.42*g;if(h<=0)return 0;let y=8.22*c*l*u*d,w=Math.min(o?1.08*(h+y):h+y,10);return Math.ceil(w*10)/10}function _B(t,e){let n=te(e),r=[];for(let o of t.affected??[])for(let a of o.ranges??[])for(let c of a.events??[])c.fixed&&r.push(c.fixed);if(r.length===0)return null;let s=r.map(o=>({raw:o,parsed:te(o)})).filter(o=>o.parsed!==null);return!n||s.length===0?r[0]??null:(s.filter(o=>vo.default.gt(o.parsed,n)).sort((o,a)=>vo.default.compare(o.parsed,a.parsed))[0]??s.sort((o,a)=>vo.default.compare(o.parsed,a.parsed))[0])?.raw??null}function TB(t){return t.references?.find(n=>n.type==="ADVISORY"&&n.url)?.url??`https://osv.dev/vulnerability/${t.id}`}function xB(t){let e=t.replace(/\s+/g," ").trim(),n=e.search(/\.\s|\.$/),r=n>0?e.slice(0,n+1):e;return r.length>300?`${r.slice(0,299)}\u2026`:r}var $B=async(t,e)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),1e4);try{let s=await fetch(t,{method:"POST",signal:n.signal,headers:{"Content-Type":"application/json","User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"},body:JSON.stringify(e)});return s.ok?await s.json():null}catch{return null}finally{clearTimeout(r)}};var In=vt(os(),1);function If(t){let{name:e,registry:n,repository:r,currentVersion:s,targetVersion:i}=t,o=t.now??new Date,a=[],c=i?.withdrawn??n?.deprecated??void 0;c&&a.push({statement:`The maintainer has withdrawn ${e} ${t.to}: ${c}`,url:n?.homepage??void 0,concerning:!0}),r?.archived?a.push({statement:"The upstream repository is archived. It will not receive further fixes.",url:r.url,concerning:!0}):r?.pushedAt&&a.push({statement:`The repository was last pushed to ${Of(r.pushedAt,o)}.`,url:r.url}),s?.withdrawn&&!c&&a.push({statement:`The version currently installed, ${t.from}, has been withdrawn: ${s.withdrawn}`,concerning:!0});let l=CB(n?.versions??[]);if(l){let p=te(t.to);p&&In.default.eq(l,p)?a.push({statement:`${t.to} is the latest stable release.`}):p&&In.default.gt(l,p)&&a.push({statement:`${t.to} is not the latest release; ${l} is also available.`})}i?.releasedAt&&a.push({statement:`The target version was released ${Of(i.releasedAt,o)}.`});let u=RB(s,i);u&&a.push(u);let d=AB(t,l);return d&&a.push(d),{facts:a,...c?{deprecated:c}:{},...r?.archived?{archived:!0}:{},...l?{latestStable:l}:{},...i?.releasedAt?{targetReleasedAt:i.releasedAt}:{}}}function RB(t,e){let n=t?.runtime,r=e?.runtime;return r?n?n.requirement===r.requirement?null:{statement:`The required ${r.name} version changed from ${n.requirement} to ${r.requirement}. Check this against the runtimes this repository builds and deploys on.`,concerning:mT(n.requirement,r.requirement)}:{statement:`The target version requires ${r.name} ${r.requirement}.`}:null}function mT(t,e){let n=i=>te(/(\d+(?:\.\d+)*)/.exec(i)?.[1]??""),[r,s]=[n(t),n(e)];return!!(r&&s&&In.default.gt(s,r))}function AB(t,e){let n=te(t.from);if(!n||!e)return null;let r=In.default.major(e)-In.default.major(n);return r<1?null:{statement:`The installed version ${t.from} is ${r} major version${r===1?"":"s"} behind the latest release, ${e}. Maintainers rarely backport fixes that far.`}}function CB(t){return t.map(n=>te(n)).filter(n=>n!==null&&!In.default.prerelease(n)).sort(In.default.rcompare)[0]??null}function Of(t,e){let n=new Date(t);if(Number.isNaN(n.getTime()))return`on ${t}`;let r=Math.floor((e.getTime()-n.getTime())/864e5);if(r<0)return`on ${n.toISOString().slice(0,10)}`;if(r===0)return"today";if(r===1)return"yesterday";if(r<60)return`${r} days ago`;let s=Math.round(r/30.44);return s<24?`about ${s} months ago`:`about ${Math.round(r/365.25)} years ago`}var PB=12;async function Nf(t){let{name:e,currentVersion:n,targetVersion:r,repository:s,policy:i}=t,o=n?.license??null,a=r?.license??s?.license??null,c=i.enabled?await OB(t):[];if(!a&&!o)return{verdict:i.enabled?"unknown":"ok",statement:i.enabled?`Neither ${e} ${t.from} nor ${t.to} declares a license Drift could read, so this upgrade's licensing position could not be checked.`:"No license metadata was published for either version.",introduced:c};let l=d=>Lf(d,i),u=c.filter(d=>!d.allowed);if(o&&a&&!DB(o,a)){let d=l(a)?`The declared license changed from ${o} to ${a}. It remains within this repository's configured policy.`:`The declared license changed from ${o} to ${a}. This conflicts with the repository policy, which permits ${Mf(i)}.`;return{verdict:l(a)?"changed":"policy-violation",from:o,to:a,statement:d,introduced:c}}return l(a)?u.length>0?{verdict:"policy-violation",...o?{from:o}:{},...a?{to:a}:{},statement:`This upgrade newly introduces ${u.map(d=>`${d.name} (${d.license??"no declared license"})`).join(", ")}, which the repository policy does not permit. The policy permits ${Mf(i)}.`,introduced:c}:a?{verdict:"ok",...o?{from:o}:{},to:a,statement:`The license is unchanged at ${a}.`,introduced:c}:{verdict:"unknown",...o?{from:o}:{},statement:`${e} ${t.to} declares no license Drift could read, though ${t.from} declared ${o}.`,introduced:c}:{verdict:"policy-violation",...o?{from:o}:{},...a?{to:a}:{},statement:`${e} is licensed ${a}, which the repository policy does not permit. The policy permits ${Mf(i)}.`,introduced:c}}async function OB(t){let{currentVersion:e,targetVersion:n,ecosystem:r,policy:s}=t;if(!e||!n)return[];let i=new Set(e.dependencies),o=n.dependencies.filter(c=>!i.has(c)).slice(0,PB);return o.length===0?[]:await Promise.all(o.map(async c=>{let u=(await ji(c,r,"latest").catch(()=>null))?.license??null;return{name:c,license:u,allowed:Lf(u,s)}}))}function Lf(t,e){if(!e.enabled)return!0;if(!t)return!e.requireDeclared;let n=IB(t);return e.deny.length>0&&n.some(r=>Df(r,e.deny))?!1:e.allow.length===0?!0:t.includes(" OR ")?n.some(r=>Df(r,e.allow)):n.every(r=>Df(r,e.allow))}function IB(t){return t.replace(/[()]/g," ").split(/\s+(?:OR|AND|WITH)\s+/i).map(e=>e.trim()).filter(Boolean)}function Df(t,e){let n=t.toLowerCase().replace(/\+$/,"");return e.some(r=>r.toLowerCase().replace(/\+$/,"")===n)}function DB(t,e){let n=r=>r.toLowerCase().replace(/[\s._]/g,"-").replace(/-+/g,"-");return n(t)===n(e)}function Mf(t){return t.allow.length>0?t.allow.join(", "):t.deny.length>0?`anything except ${t.deny.join(", ")}`:"no licenses in particular"}var MB=[{category:"security",pattern:/\b(CVE-\d{4}-\d+|GHSA-[\w-]+|GO-\d{4}-\d+|security fix|vulnerabilit|XSS|CSRF|SSRF|remote code execution|prototype pollution|path traversal|SQL injection|denial of service|ReDoS)\b/i},{category:"breaking",pattern:/\b(BREAKING|breaking change|no longer|has been removed|was removed|is removed|removed entirely|removed support|dropped support|drop support|renamed to|has been renamed|is now required|must now|now (?:requires?|returns?|expects?|accepts?|takes?)|migrate to|migration guide|incompatible)\b/i},{category:"performance",pattern:/\b(faster|speed ?up|sped up|reduces? (?:the )?(?:allocation|memory|latency)|allocation|throughput|optimi[sz]|performance (?:improvement|gain|boost|work|regression)|improv(?:e|es|ed|ing) performance)\b/i},{category:"fix",pattern:/^\s*(?:fix(?:e[sd])?|bugfix|resolve[sd]?|correct(?:s|ed)?)\b/i}];function Gf(t){let{dependency:e,evidence:n,breakingChanges:r,impactSites:s}=t,i=new Map;for(let u of s)i.set(u.breakingChangeId,(i.get(u.breakingChangeId)??0)+1);let o=[],a=new Set;for(let u of r){if(u.dependency!==e)continue;let d=i.get(u.id)??0,p=yT(u.summary);a.has(p)||(a.add(p),o.push({category:"breaking",text:u.summary,...d>0?{affectedSites:d}:{},...hT(u,n)?{url:hT(u,n)}:{},...u.citations[0]?{citation:u.citations[0]}:{}}))}let c=0,l=new Map;for(let u of n)if(u.dependency===e&&!(u.source==="semver-heuristic"||u.source==="type-surface-diff"))for(let d of bT(u.content)){let p=yT(d);if(!p||a.has(p))continue;a.add(p);let f=qf(d);if(f==="breaking"&&o.some(g=>LB(g.text,d)))continue;let m=l.get(f)??0;if(m>=6){c++;continue}l.set(f,m+1),o.push({category:f,text:d,...u.url?{url:u.url}:{},citation:u.id})}return{changes:NB(o),unrelated:c}}function jf(t){return t.changes.filter(e=>e.category==="performance").map(e=>({statement:e.text,...e.url?{url:e.url}:{},...e.citation?{citation:e.citation}:{}}))}function Ff(t,e){if(t.length===0)return null;let n=t.filter(i=>i.kind==="package-added").length,r=t.length-n,s=[];return n>0&&s.push(`${n} new package${n===1?"":"s"}`),r>0&&s.push(`${r} new exported symbol${r===1?"":"s"}`),s.length===0?null:{statement:`The target version adds ${s.join(" and ")}, none of which can break existing code. Computed from ${e}.`}}function qf(t){for(let{category:e,pattern:n}of MB)if(n.test(t))return e;return"improvement"}var gT={breaking:0,security:1,fix:2,performance:3,improvement:4};function NB(t){return[...t].sort((e,n)=>{let r=gT[e.category]-gT[n.category];return r!==0?r:(n.affectedSites??0)-(e.affectedSites??0)})}function bT(t){let e=[],n=null;for(let r of t.split(` -`)){let s=r.trim();if(!s||/^[-=]{3,}$/.test(s))continue;if(s.startsWith("#")){n=null;continue}let i=/^[-*+]\s+/.test(s)||/^\d+\.\s+/.test(s),o=s.replace(/^[-*+]\s+/,"").replace(/^\d+\.\s+/,"").trim();if(!(o.length<12)&&!/^(?:by\s+@|thanks|co-authored-by|https?:\/\/\S+$)/i.test(o)){if(!i&&/:\s*$/.test(o)&&qf(o)==="breaking"){n=o;continue}e.push(GB(n&&i?`${n} ${o}`:o,240)),!i&&!/:\s*$/.test(o)&&(n=null)}}return e}function hT(t,e){for(let n of t.citations){let r=e.find(s=>s.id===n)?.url;if(r)return r}}function LB(t,e){let n=s=>new Set(s.match(/`([^`]+)`/g)??[]),r=n(t);return r.size===0?!1:[...n(e)].some(s=>r.has(s))}function yT(t){return t.toLowerCase().replace(/[^a-z0-9]+/g," ").trim()}function GB(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var wT={critical:0,high:1,medium:2,low:3,unknown:4};function jB(t,e){return wT[t]-wT[e]}function Uf(t){return t.reduce((e,n)=>jB(n.severity,e)<0?n.severity:e,"unknown")}var FB=new Set(["behaviour-change","signature-change","default-change","moved-export","runtime-requirement"]);function Bf(t){let e=[],{security:n,maintenance:r,license:s,impactSites:i}=t,o=i.length,a=new Set(i.map(p=>p.file)).size,c=t.breakingChanges.filter(p=>FB.has(p.kind)),l=t.breakingChanges.length-c.length;n.checked&&(n.resolved.length>0&&e.push(`Fixes ${n.resolved.length} known ${Dn(n.resolved.length,"vulnerability","vulnerabilities")} (worst: ${Uf(n.resolved)}).`),n.introduced.length>0&&e.push(`Introduces ${n.introduced.length} known ${Dn(n.introduced.length,"vulnerability","vulnerabilities")} not present in the installed version (worst: ${Uf(n.introduced)}).`),n.carried.length>0&&e.push(`${n.carried.length} known ${Dn(n.carried.length,"vulnerability affects","vulnerabilities affect")} both versions; this upgrade does not address ${n.carried.length===1?"it":"them"}.`),n.resolved.length===0&&n.target.length===0&&e.push("No known vulnerabilities were found for the target version.")),o>0?(e.push(`${o} ${Dn(o,"place","places")} in ${a} ${Dn(a,"file","files")} ${Dn(o,"uses","use")} an API this upgrade changes.`),l>0&&e.push(`${l} of the changes can be applied mechanically.`),c.length>0&&e.push(`${c.length} ${Dn(c.length,"change requires","changes require")} a developer decision rather than a substitution.`)):t.breakingChanges.length>0&&e.push(`${t.breakingChanges.length} upstream breaking ${Dn(t.breakingChanges.length,"change","changes")}, none of which this repository uses.`);for(let p of r.facts)p.concerning&&e.push(p.statement);(s.verdict==="policy-violation"||s.verdict==="changed")&&e.push(s.statement);let u=qB(t,{affected:o,decisions:c.length}),d=BB(t);return t.gaps.length>0&&e.push(...t.gaps),{recommendation:u,reasons:e,confidence:d.level,confidenceBasis:d.basis}}function qB(t,e){let{security:n,maintenance:r,license:s}=t;return n.checked&&n.introduced.length>0||r.deprecated||s.verdict==="policy-violation"?"do-not-upgrade-yet":e.affected>0?e.decisions>0?"manual-migration-required":"upgrade-after-review":t.gaps.length>0&&t.breakingChanges.length===0&&!UB(t)?"insufficient-evidence":n.checked&&n.resolved.length>0||r.facts.some(i=>i.concerning)?"upgrade-recommended":"safe-to-upgrade"}function UB(t){return t.surfaceCompared||t.security.checked||(t.proseRead??0)>0||vT(t).length>0}function vT(t){return t.evidence.filter(e=>e.dependency===t.dependency&&e.workspace===t.workspace&&(e.source==="github-release"||e.source==="changelog"||e.source==="migration-guide"))}function BB(t){let e=Math.max(vT(t).length,t.proseRead??0),n=[];return t.surfaceCompared&&n.push("the computed API diff"),e>0&&n.push(e===1?"release notes":"release notes and changelog"),t.security.checked&&n.push("the OSV advisory database"),n.length===0?{level:"low",basis:"Nothing but the version numbers could be read for this dependency."}:{level:t.surfaceCompared||n.length>=2?"high":"medium",basis:`${WB(VB(n))} agree.`}}function VB(t){return t.length<=1?t[0]??"":`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`}function WB(t){return t.charAt(0).toUpperCase()+t.slice(1)}function Dn(t,e,n){return t===1?e:n}var Vf={"safe-to-upgrade":"Safe to upgrade","upgrade-recommended":"Upgrade recommended","upgrade-after-review":"Upgrade after review","manual-migration-required":"Manual migration required","insufficient-evidence":"Insufficient evidence","do-not-upgrade-yet":"Do not upgrade yet"};async function ET(t,e){let n=t.changes.filter(r=>r.from&&r.to);return bn(n,4,async r=>{try{return await zB(r,t,e)}catch(s){return e.logger.debug(`Rationale failed for ${r.name}: ${s.message}`),YB(r,`Drift could not assemble an upgrade rationale for ${r.name}.`)}})}async function zB(t,e,n){let{config:r,logger:s}=n,i=t.from,o=t.to,a=await gs(t.name,t.ecosystem,o),[c,l,u]=await Promise.all([ji(t.name,t.ecosystem,i).catch(()=>null),ji(t.name,t.ecosystem,o).catch(()=>null),a?.githubRepo?gk(a.githubRepo,n.githubToken).catch(()=>null):Promise.resolve(null)]),d=r.rationale.security?await Pf(t.name,t.ecosystem,i,o,n.osv??{}):{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"},p=r.rationale.maintenance?If({name:t.name,ecosystem:t.ecosystem,from:i,to:o,registry:a,repository:u,currentVersion:c,targetVersion:l}):{facts:[]},f=await Nf({name:t.name,ecosystem:t.ecosystem,from:i,to:o,currentVersion:c,targetVersion:l,repository:u,policy:r.licenses}),m=e.breakingChanges.filter(ie=>ie.dependency===t.name&&ie.workspace===t.workspace),g=new Set(m.map(ie=>ie.id)),h=e.impactSites.filter(ie=>g.has(ie.breakingChangeId)),y=cr(t),w=n.additions?.get(y),S=n.surfaceCompared?.has(y)??w!==void 0,v=r.rationale.summary?Gf({dependency:t.name,evidence:e.evidence,breakingChanges:m,impactSites:h,additions:w?.additions}):{changes:[],unrelated:0},k=[...jf(v)],$=w?Ff(w.additions,w.locator):null;$&&k.push($);let F=n.prose?.get(y)??n.prose?.get(t.name)??[],_=HB(t,{surfaceCompared:S,surfaceGap:n.surfaceGaps?.get(y),security:d,registry:a,evidence:e.evidence,prose:F,licenseUnknown:f.verdict==="unknown"}),ne=Bf({dependency:t.name,workspace:t.workspace,breakingChanges:m,impactSites:h,evidence:e.evidence,security:d,maintenance:p,license:f,gaps:_,surfaceCompared:S,proseRead:F.length});return s.debug(`${t.name} ${i} \u2192 ${o}: ${ne.recommendation}`),{dependency:t.name,from:i,to:o,security:d,maintenance:p,improvements:k,license:f,summary:v,assessment:ne,gaps:_}}function HB(t,e){let n=[],r=e.evidence.filter(o=>o.dependency===t.name&&o.workspace===t.workspace&&(o.source==="github-release"||o.source==="changelog"||o.source==="migration-guide")),s=e.surfaceGap,i=r.length>0?null:e.prose.length>0?e.surfaceCompared?null:`Drift read ${KB(e.prose)} for ${t.name} ${t.to} and found nothing in ${e.prose.length===1?"it":"them"} that announces a breaking change. That is weaker than a clean API comparison: it means nothing was flagged, not that nothing broke.`:`No release notes, changelog, or migration guide was reachable for ${t.name} ${t.to}${e.registry?.githubRepo?"":", and no source repository could be resolved for it"}.`;return s&&i?n.push(`${kT(s.detail)}. ${i}${s.remedy?` ${s.remedy}`:""}`):s?n.push(`${kT(s.detail)}.${s.remedy?` ${s.remedy}`:""}`):i&&n.push(i),e.security.checked||n.push("The OSV advisory database could not be reached, so this upgrade's effect on known vulnerabilities is unknown."),JB(n)}function KB(t){let e=o=>t.filter(a=>a.kind===o).length,n=[],r=e("github-release"),s=e("changelog"),i=e("migration-guide");return r>0&&n.push(r===1?"the release notes":`${r} sets of release notes`),s>0&&n.push(s===1?"the changelog":`${s} changelog files`),i>0&&n.push(i===1?"the migration guide":`${i} migration guides`),n.length===0?"the published release prose":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.at(-1)}`}function JB(t){let e=new Set,n=[];for(let r of t){let s=r.toLowerCase().replace(/[^a-z0-9]+/g," ").trim();e.has(s)||(e.add(s),n.push(r))}return n}function kT(t){return t.replace(/\.\s*$/,"")}function YB(t,e){return{dependency:t.name,from:t.from??"",to:t.to??"",security:{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"},maintenance:{facts:[]},improvements:[],license:{verdict:"unknown",statement:"Not checked.",introduced:[]},summary:{changes:[],unrelated:0},assessment:{recommendation:"insufficient-evidence",reasons:[e],confidence:"low",confidenceBasis:e},gaps:[e]}}var TT=require("node:crypto"),lt=require("node:fs/promises"),Xc=require("node:os"),Ir=require("node:path"),xT=require("node:url"),$T=require("node:child_process");var a2={},RT="behavioural-diff-npm-ts-v1",ZB=new Set(["behaviour-change","default-change","type-change","signature-change","required-field-added"]);function XB(t,e){let n=e.verification.behavioural;if(!n.enabled)return[];let r=[];for(let s of t.breakingChanges){if(!ZB.has(s.kind))continue;let i=t.impactSites.filter(a=>a.breakingChangeId===s.id);if(i.length===0)continue;let o=rt(s);if(!(!o.nature.includes("behaviour")&&o.nature!=="type-contract"&&s.kind!=="default-change"))for(let a of s.symbols.slice(0,n.maxSymbols-r.length)){let c=t2(s),l=[{id:"default",args:[],contracts:c}],u=new Set;for(let d of i){if(l.length>=n.maxCasesPerSymbol)break;if(d.matchedSymbol!==a)continue;let p=QB(d.excerpt,a);if(!p)continue;let f=JSON.stringify(p);u.has(f)||(u.add(f),l.push({id:`site-${l.length}`,args:p,contracts:c}))}if(r.push({dependency:s.dependency,workspace:s.workspace,symbol:a,modulePath:"",exportName:a,cases:l}),r.length>=n.maxSymbols)return r}}return r}function QB(t,e){let r=new RegExp(`\\b${e2(e)}\\s*\\(([^;]*)\\)`).exec(t);if(!r)return null;let s=r[1].trim();if(s==="")return[];let i=`[${s}]`.replace(/'/g,'"').replace(/([{,]\s*)([A-Za-z_$][\w$]*)\s*:/g,'$1"$2":');try{let o=JSON.parse(i);return Array.isArray(o)?o:null}catch{return null}}function e2(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function t2(t){switch(t.kind){case"default-change":return["configured-defaults","return-shape"];case"type-change":case"signature-change":case"required-field-added":return["return-shape","thrown-error","argument-mutation","promise-state"];case"behaviour-change":return["return-shape","thrown-error","argument-mutation","promise-state","serialization-output"];default:return["return-shape"]}}async function n2(t){let{config:e,oldEnvironment:n,newEnvironment:r}=t,s=t.probes.slice(0,e.maxSymbols),i=[],o=[];if(!e.enabled)return{evidence:[],observations:[],gaps:["behavioural probing disabled"]};if(e.sandbox!=="required")return{evidence:[],observations:[],gaps:["behavioural probing requires a sandbox"]};for(let a of s){let c=a.cases.slice(0,e.maxCasesPerSymbol);for(let l of c){let u=await Zc(e,n,a,l),d=await Zc(e,n,a,l),p=await Zc(e,r,a,l),f=await Zc(e,r,a,l),m=!Wf(u,d)||!Wf(p,f);i.push({dependency:a.dependency,workspace:a.workspace,symbol:a.symbol,caseId:l.id,generatedInput:l.args,oldResult:u,newResult:p,observedDifference:m?"nondeterministic result; no compatibility conclusion drawn":s2(u,p),nondeterministic:m,limitations:i2(e,l.contracts)})}}return{observations:i,gaps:o,evidence:i.map(AT)}}async function r2(){return typeof __dirname<"u"?(0,Ir.join)(__dirname,"behavioural-worker.js"):(0,xT.fileURLToPath)(new URL("./behavioural-worker.js",a2.url))}async function Zc(t,e,n,r){let s=await(0,lt.mkdtemp)((0,Ir.join)((0,Xc.tmpdir)(),"drift-behavioural-")),i=await(0,lt.realpath)(s),o=(0,Ir.join)(s,"case.json"),a=await(0,lt.realpath)(await r2()),c=(0,Ir.resolve)(e.modulePath||n.modulePath),l=await(0,lt.realpath)(c),u=(0,Ir.resolve)(e.packageRoot);await(0,lt.writeFile)(o,JSON.stringify({modulePath:l,exportName:n.exportName,args:r.args,network:t.network}));let d=[a,u,await(0,lt.realpath)(u),c,l,o,await(0,lt.realpath)(o)],p=[Number(process.versions.node.split(".")[0])>=24?"--permission":"--experimental-permission",...[...new Set(d)].map(f=>`--allow-fs-read=${f}`),`--max-old-space-size=${t.memoryMb}`,a,o];try{return await new Promise(f=>{let m=(0,$T.spawn)(process.execPath,p,{stdio:["ignore","pipe","pipe"],env:{PATH:process.env.PATH??"",HOME:i,TMPDIR:i,DRIFT_BEHAVIOURAL_SANDBOX:"1"}});if(m.pid&&t.cpuLimit<1)try{(0,Xc.setPriority)(m.pid,Math.round(10*(1-t.cpuLimit)))}catch{}let g="",h="",y=64*1024,w=setTimeout(()=>{m.kill("SIGKILL")},t.timeoutSeconds*1e3);m.stdout.on("data",S=>{g=(g+S.toString("utf8")).slice(-y)}),m.stderr.on("data",S=>{h=(h+S.toString("utf8")).slice(-y)}),m.on("close",(S,v)=>{if(clearTimeout(w),v){f({status:"timed-out",signal:v,stdoutDigest:ko(g),stderrDigest:ko(h)});return}let k=g.trim().split(` -`).at(-1)??"",$=o2(k);f($??{status:"worker-failed",stdoutDigest:ko(g),stderrDigest:ko(h)})}),m.on("error",S=>{clearTimeout(w),f({status:"worker-failed",error:{name:S.name,messageCategory:"spawn"}})})})}finally{t.retainArtifacts||await(0,lt.rm)(s,{recursive:!0,force:!0}).catch(()=>{})}}function Wf(t,e){return JSON.stringify(ST(t))===JSON.stringify(ST(e))}function ST(t){return{status:t.status,value:t.value??null,error:t.error??null,mutations:t.mutations??[]}}var _T=new Set(["worker-failed","timed-out"]);function s2(t,e){return _T.has(t.status)&&_T.has(e.status)?`probe unavailable: neither version could be observed (${t.status})`:Wf(t,e)?"no observed difference for this contract and generated input domain":t.status!==e.status?`status changed from ${t.status} to ${e.status}`:JSON.stringify(t.value??null)!==JSON.stringify(e.value??null)?"returned value changed":JSON.stringify(t.error??null)!==JSON.stringify(e.error??null)?"thrown error changed":JSON.stringify(t.mutations??[])!==JSON.stringify(e.mutations??[])?"argument mutation changed":"observable result changed"}function i2(t,e){let n=[`Harness ${RT}; bounded to ${e.join(", ")||"return-shape"} contracts.`,"No observed difference is not proof of behavioural compatibility outside these generated inputs.",`CPU limit requested: ${t.cpuLimit} (best-effort process priority; no OS-level quota). Node subprocess enforces wall-clock, memory, output, filesystem, and network policy, and cannot spawn its own children or threads \u2014 the wall-clock timeout is the actual hard bound on CPU consumption.`];return t.network||n.push("Network APIs were disabled for the probe."),n}function AT(t){let e=JSON.stringify({generatedInput:t.generatedInput,normalizedOldResult:t.oldResult,normalizedNewResult:t.newResult,observedDifference:t.observedDifference,testHarnessVersion:RT,nondeterminismHandling:t.nondeterministic?"Repeated runs disagreed, so Drift records the observation but draws no compatibility conclusion.":"Old and new observations were repeated once and matched within each version.",limitations:t.limitations},null,2);return{id:`ev_behaviour_${ko(`${t.workspace??""}:${t.dependency}:${t.symbol}:${t.caseId}`).slice(0,12)}`,source:"behavioural-diff",dependency:t.dependency,...t.workspace!==void 0?{workspace:t.workspace}:{},locator:`${t.symbol}:${t.caseId}`,title:`Behavioural differential probe for ${t.symbol}`,content:e,weight:t.observedDifference.startsWith("probe unavailable")?0:t.observedDifference.startsWith("no observed difference")?.25:.8,findings:[{code:"behavioural-observation",symbol:t.symbol,detail:t.observedDifference}]}}async function CT(t){let e=t.config.verification.behavioural,n=[],r=new Map,s=[];if(!e.enabled)return{evidence:n,citationsByChangeId:r,gaps:s};let i=XB({breakingChanges:t.breakingChanges,impactSites:t.impactSites},t.config);if(i.length===0)return{evidence:n,citationsByChangeId:r,gaps:s};let o=new Map;for(let a of i){let c=ar({name:a.dependency,workspace:a.workspace}),l=o.get(c);l?l.probes.push(a):o.set(c,{dependency:a.dependency,workspace:a.workspace,probes:[a]})}for(let{dependency:a,workspace:c,probes:l}of o.values()){let u=t.dependencyChanges.find(f=>f.name===a&&f.workspace===c&&f.ecosystem==="npm");if(!u?.from||!u.to){s.push(`${a}: behavioural probing needs both a resolved old and new version; skipped.`);continue}let d=await t.resolveEnvironments(u);if(!d){s.push(`${a}: could not resolve ${u.from} and ${u.to} to executable code for behavioural probing; skipped.`);continue}let p=await n2({config:e,probes:l,oldEnvironment:d.oldEnvironment,newEnvironment:d.newEnvironment});s.push(...p.gaps);for(let f of p.observations){let m=AT(f);n.push(m);for(let g of t.breakingChanges){if(g.dependency!==a||g.workspace!==c||!g.symbols.includes(f.symbol))continue;let h=r.get(g.id);h?h.push(m.id):r.set(g.id,[m.id])}}}return{evidence:n,citationsByChangeId:r,gaps:s}}function PT(t){return t.startsWith("probe unavailable")?"probe-unavailable":t.startsWith("no observed difference")?"no-difference":t.includes("returned value changed")?"return-value":t.startsWith("status changed")?"thrown-error":t.includes("argument mutation")?"argument-mutation":"behaviour"}function o2(t){try{return JSON.parse(t)}catch{return null}}function ko(t){return(0,TT.createHash)("sha256").update(t).digest("hex")}var bt=require("node:fs/promises"),IT=require("node:os"),Dr=require("node:path");function c2(t){return l2(t.exports)??t.module??t.main??"index.js"}function l2(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return null;let e=t,n="."in e?e["."]:e,r=(s,i)=>{if(i>6||s==null)return null;if(typeof s=="string")return s;if(typeof s!="object")return null;let o=s;for(let a of["import","require","default","node"]){if(!(a in o))continue;let c=r(o[a],i+1);if(c)return c}return null};return r(n,0)}var OT="https://cdn.jsdelivr.net/npm";async function zf(t,e,n){let r=await J(`${OT}/${e}@${n}/package.json`);if(!r)return null;let s=c2(r).replace(/^\.\//,""),i=await fe(`${OT}/${e}@${n}/${s}`);if(i===null)return null;let o=await(0,bt.mkdtemp)((0,Dr.join)((0,IT.tmpdir)(),"drift-behavioural-env-")),a=(0,Dr.join)(o,s);return await(0,bt.mkdir)((0,Dr.dirname)(a),{recursive:!0}),await(0,bt.writeFile)(a,i),await(0,bt.writeFile)((0,Dr.join)(o,"package.json"),JSON.stringify(r)),{label:t,packageRoot:await(0,bt.realpath)(o),modulePath:await(0,bt.realpath)(a)}}async function Eo(t){let{repo:e,config:n,logger:r,provider:s,githubToken:i,onProgress:o}=t,a=t.workspace??e.workspace,c=(V,ee)=>{r.debug(`${V}: ${ee}`),o?.(V,ee)};c("detect","Reading manifest changes");let l=await d2(s,e,r);if(l.length===0)return Hf("No dependency manifest changed in this range.");let u=a?await Mv(a,Md()):[],d=a?(await Uv(a,Md(),Qa(u))).map(V=>({kind:"undeclared-nested",ecosystem:V.ecosystem,declaredIn:V.manifestPath,members:[{dir:V.dir,name:null,ecosystem:V.ecosystem}]})):[],p=[...u,...d];p.length>0&&r.info(`Workspace: ${p.map(V=>`${V.kind} (${V.members.length} member(s))`).join(", ")}`);let f=Nv(Pv(l),p);if(f.length===0)return Hf("Manifests changed, but no dependency versions moved.");r.info(`Detected ${f.length} dependency change(s)`);let{actionable:m,skipped:g}=Ov(f,n);for(let V of g)r.info(` - ${V.change.name}: skipped \u2014 ${V.reason}`);if(m.length===0)return Hf(f.length===1?"The 1 dependency change found doesn't match the analysis criteria in drift.yml (see reason above).":`None of the ${f.length} dependency changes found match the analysis criteria in drift.yml (see reasons above).`);c("triage",`${m.length} change(s) to analyse`),c("evidence",`Gathering evidence for ${m.map(V=>V.name).join(", ")}`);let h=new Map,y=new Map,w=new Map,S=new Set,v=await XE(m,{config:n,logger:r,githubToken:i,...t.env?{env:t.env}:{},readRepoFile:(V,ee)=>s.readFile(V,ee),beforeSha:e.beforeSha,afterSha:e.afterSha,...a?{workspaceRoot:a}:{},onSurfaceComputed:(V,ee)=>{let oe=cr(V);S.add(oe),h.set(oe,{additions:ee.additions??[],locator:ee.locator})},onUnavailableSurface:(V,ee)=>y.set(cr(V),ee),onProseConsulted:(V,ee)=>{let oe=cr(V);w.set(oe,[...w.get(oe)??[],ee])}});r.info(`Gathered ${v.length} evidence record(s)`),c("analyze","Identifying breaking changes");let k=await o_(m,v,{config:n,logger:r});r.info(`Identified ${k.length} breaking change(s)`);let $=[],F=!!a,_=new Map,ne=new Map;if(k.length>0&&a){c("localize","Searching for affected code");let V=Qa(p),ee=await qv(a,{members:V}),oe=f_(ee),Oe=await S_(m,{logger:r});for(let[be,Ie]of u2(m)){let Mt=new Set(Ie.map($o=>$o.name)),lm=k.filter($o=>Mt.has($o.dependency)&&$o.workspace===be);lm.length!==0&&$.push(...A_(lm,Ie,oe,ee,{logger:r,member:be,moduleMaps:Oe}))}r.info(`Found ${$.length} impact site(s)`);let ut=new Map;for(let be of $){let Ie=ut.get(be.breakingChangeId);Ie?Ie.push(be):ut.set(be.breakingChangeId,[be])}let wt=new Map(ee.map(be=>[be.path,be.content])),Dt=new Map(m.map(be=>[`${be.workspace??""}::${be.name}`,be])),il=[];for(let be of k){let Ie=ut.get(be.id);if(!Ie||Ie.length===0)continue;let Mt=I_(be,Ie,wt);Mt?_.set(be.id,Mt):il.push(be)}if(n.remediation.communityRecipes&&il.length>0){let be=await bn(il,4,async Ie=>{let Mt=Dt.get(`${Ie.workspace??""}::${Ie.dependency}`);return[Ie.id,await q_(Ie,Mt)]});for(let[Ie,Mt]of be)Mt&&ne.set(Ie,Mt)}}else k.length>0&&r.warn("No local checkout available; affected code cannot be located.");let ie=[],Me=[],re=!1;if(n.verification.behavioural.enabled&&k.length>0&&$.length>0){c("verify","Probing dependency behaviour for reachable findings"),re=!0;let V=await CT({config:n,breakingChanges:k,dependencyChanges:m,impactSites:$,resolveEnvironments:async ee=>{if(!ee.from||!ee.to)return null;let[oe,Oe]=await Promise.all([zf("old",ee.name,ee.from),zf("new",ee.name,ee.to)]);return oe&&Oe?{oldEnvironment:oe,newEnvironment:Oe}:null}});for(let ee of V.gaps)ie.push({stage:"verify",surface:"behavioural-diff",reason:ee,severity:"minor",automaticExecution:"none",remediation:"Behavioural probing is experimental; see `verification.behavioural` in drift.yml."});if(V.evidence.length>0){v=[...v,...V.evidence],k=k.map(oe=>{let Oe=V.citationsByChangeId.get(oe.id);return Oe?.length?{...oe,citations:[...oe.citations,...Oe]}:oe}),r.info(`Behavioural probing added ${V.evidence.length} observation(s) of evidence`);let ee=new Map;for(let[oe,Oe]of V.citationsByChangeId)for(let ut of Oe){let wt=ee.get(ut);wt?wt.push(oe):ee.set(ut,[oe])}for(let oe of V.evidence){let Oe=oe.findings?.[0]?.detail??"",ut=PT(Oe);Me.push({name:`behavioural:${oe.dependency}`,command:"drift verify --behavioural (bounded differential probe)",status:ut==="probe-unavailable"?"unavailable":"passed",detail:Oe,dependency:oe.dependency,workspace:oe.workspace,breakingChangeIds:ee.get(oe.id)??[]})}}}let X=[];n.verification.behavioural.enabled&&X.push({surface:"behavioural-diff",status:re?"checked":"skipped",detail:re?"Old and new dependency code were run against generated and observed inputs and compared.":"No breaking change had a local impact site to probe, so behavioural probing did not run."});for(let V of m){let ee=cr(V),oe=v.filter(Dt=>Dt.dependency===V.name&&Dt.workspace===V.workspace),Oe=y.get(ee),ut=S.has(ee)||oe.some(Dt=>Dt.findings?.length);X.push({surface:"api-surface",dependency:V.name,ecosystem:V.ecosystem,status:Oe?"unavailable":ut?"checked":"unavailable",detail:Oe?Oe.reason:ut?"A computed diff of the published API surface was produced.":"No computed API diff was available for this ecosystem or version pair."});let wt=w.get(ee)?.filter(Dt=>Dt.kind==="changelog"||Dt.kind==="github-release");X.push({surface:"release-notes",dependency:V.name,ecosystem:V.ecosystem,status:wt&&wt.length>0?"checked":"unavailable",detail:wt&&wt.length>0?`${wt.length} release note or changelog section(s) retrieved.`:"No changelog or release notes could be retrieved."})}X.push({surface:"localization",status:F?"checked":"skipped",detail:F?`Searched the files importing each changed dependency; ${$.length} affected location(s).`:"No checkout was available, so this repository was not searched."}),c("rationale","Weighing what each upgrade is worth");let K=await ET({changes:m,evidence:v,breakingChanges:k,impactSites:$},{config:n,logger:r,githubToken:i,additions:h,surfaceCompared:S,surfaceGaps:y,prose:w});c("plan","Building the remediation plan");let ye=iT({repo:e,config:n,changes:m,evidence:v,breakingChanges:k,impactSites:$,rationale:K,skipped:g,localizationRan:F,verification:Me,checkedSurfaces:X,codemods:_,recipes:ne});return c("done","Analysis complete"),{plan:ie.length>0?{...ye,gaps:[...ye.gaps,...ie]}:ye,summary:ye.commits.length>0?`${ye.breakingChanges.length} breaking change(s), ${new Set(ye.impactSites.map(V=>V.file)).size} file(s) affected`:"No code in this repository is affected by these dependency changes."}}function u2(t){let e=new Map;for(let n of t){let r=n.workspace,s=e.get(r)??[];s.push(n),e.set(r,s)}return[...e.entries()]}async function d2(t,e,n){let s=(await t.changedFiles()).filter(Cv);return s.length===0?[]:(n.debug(`Changed manifests: ${s.join(", ")}`),(await Promise.all(s.map(async o=>{let[a,c]=await Promise.all([t.readFile(o,e.beforeSha),t.readFile(o,e.afterSha)]);return{path:o,before:a,after:c}}))).filter(o=>o.before!==null||o.after!==null))}function Hf(t){return{plan:null,summary:t}}var p2={critical:"\u{1F534} critical",high:"\u{1F7E0} high",medium:"\u{1F7E1} medium",low:"\u{1F535} low",unknown:"\u26AA severity not stated"},f2={high:"\u{1F7E2} High",medium:"\u{1F7E1} Medium",low:"\u{1F7E0} Low"},m2=8;function Jf(t){let e=t.rationale??[];if(e.length===0)return"";let n=e.map(g2).filter(Boolean);return n.length===0?"":["## Upgrade assessment","",n.join(` +`);for(let l=0;l0&&HU(e,a,u,s,i),{files:e.files.filter(d=>u.has(d.path)),names:a,reach:u}}function zU(t,e,n){let r=new Set;for(let i of e){let o=n?.get(Vf(i,t));for(let a of o?.names??[])r.add(a)}return r.size>0?{names:[...new Set([...r,t])],exact:!0}:{names:e.length>0?[...new Set(e.flatMap(i=>Xx(t,i)))]:Xx(t,void 0),exact:!1}}function HU(t,e,n,r,s){let i=[...n.keys()].filter(o=>JU(s.get(o),e));for(let o=0;o0;o++){let a=[];for(let c of i)for(let l of t.localImporters.get(c)??[]){if(n.size>=KU)return;let u=n.get(l.from);if(u){for(let d of l.bindings)u.inherited.add(d);continue}n.set(l.from,{direct:!1,inherited:new Set(l.bindings)}),l.reExport&&a.push(l.from)}i=a}}var KU=400;function JU(t,e){return t?t.imports.some(n=>n.reExport===!0&&(e.length===0||ml(n,e))):!1}function ml(t,e){return(typeof t=="string"?[t]:jf(t)).some(r=>e.some(s=>Zx(r,s)||Zx(s,r)))}function Zx(t,e){if(t===e)return!0;if(!t.startsWith(e))return!1;let n=t[e.length];return n==="/"||n==="."||n===":"||n==="\\"}function Xx(t,e){let n=new Set([t]);switch(e){case"pypi":{let r=t.toLowerCase().replace(/-/g,"_");n.add(r);let s=ZU[t.toLowerCase()];s&&n.add(s);break}case"maven":{let[r]=t.split(":");r&&n.add(r);break}case"cargo":n.add(t.replace(/-/g,"_"));break;case"conan":case"vcpkg":case"arduino":{let r=t.toLowerCase();n.add(r),n.add(r.replace(/[-_]/g,"")),n.add(r.replace(/[-_]/g,"/"));let s=YU[r];s&&n.add(s),r.startsWith("lib")&&r.length>4&&n.add(r.slice(3));break}case"packagist":{let[r,s]=t.split("/");r&&s&&(n.add(`${Nr(r)}\\${Nr(s)}`),n.add(Nr(r)));break}case"hex":{n.add(Nr(t)),n.add(t.toLowerCase());break}case"swift":{let r=t.split("/").pop()??t;n.add(r),n.add(Nr(r)),r.toLowerCase().startsWith("swift-")&&n.add(Nr(r.slice(6)));break}case"cocoapods":n.add(t.replace(/[-.]/g,"_"));break;case"opam":n.add(Nr(t.replace(/\./g,"_"))),n.add(tT(t.replace(/\./g,"_")));break;default:break}return[...n]}function Nr(t){return t.split(/[-_.]/).filter(Boolean).map(e=>tT(e)).join("")}function tT(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}var YU={nlohmann_json:"nlohmann","libjpeg-turbo":"jpeglib",libxml2:"libxml",sdl:"sdl2",protobuf:"google",grpc:"grpcpp",abseil:"absl","ms-gsl":"gsl",gtest:"gtest"},ZU={beautifulsoup4:"bs4",pillow:"PIL",pyyaml:"yaml","python-dateutil":"dateutil","msgpack-python":"msgpack",attrs:"attr","scikit-learn":"sklearn","opencv-python":"cv2","python-dotenv":"dotenv",protobuf:"google","google-cloud-storage":"google","psycopg2-binary":"psycopg2",mysqlclient:"MySQLdb","django-cors-headers":"corsheaders",djangorestframework:"rest_framework","pytest-cov":"pytest_cov","typing-extensions":"typing_extensions"};function XU(t,e,n,r,s,i,o){let a=[];for(let c of e){if(a.length>=s)break;let l=n.get(c.path);if(!l)continue;let u=r.get(c.path),d=i.length===0?c.imports:c.imports.filter(T=>ml(T,i)),p=new Set(d.flatMap(T=>T.bindings)),f=d.length>0,m=o.get(c.path),g=m!==void 0&&!m.direct,h=new Set(c.imports.filter(T=>!ml(T,i)).flatMap(T=>T.bindings).filter(T=>T!=="*")),y=new Set(c.units.filter(T=>T.kind!=="method").map(T=>T.name)),w=new Set(c.imports.filter(T=>T.synthetic!==!0).map(T=>T.line)),S=QU(t.kind),b=eB(t.kind)&&tB(c.language),k=l.split(` +`),_=eT(k,{blankStrings:!1}),G=eT(k,{blankStrings:!0});for(let T of t.symbols){let se=b?rB(T):rT(T);if(!se||lB(T,p,h)||dB(T,p,y))continue;let ie=uB(T),ce=ie?_:G,ne=S||ie;for(let Q=0;Q)?";return new RegExp(`(?:new\\s+)?${r}${n}${s}\\s*\\(|(?Qx(s.confidence))&&e.set(r,n)}return[...e.values()].sort((n,r)=>n.file.localeCompare(r.file)||n.line-r.line)}function Qx(t){return t==="high"?2:t==="medium"?1:0}function mB(t){let e=t.trim();return e.startsWith("#")?!gB.test(e):e.startsWith("%")||e.startsWith("(*")?!0:e.startsWith("//")||e.startsWith("*")||e.startsWith("/*")}var gB=/^#\s*(include|define|undef|if|ifdef|ifndef|elif|else|endif|pragma|error|warning|line)\b/;function eT(t,e){let n=[],r=!1,s=null;for(let i of t){let o="",a=0,c=null;for(;ag.has(h.line-1)).length)}return a.length===0?null:{transform:{ruleId:"rename-identifier",from:r,to:s,anchors:c},edits:a,sitesResolved:l}}function oT(t,e,n){return e.ruleId==="rename-identifier"?hB(t,e.from,e.to,e.anchors,n):t}function hB(t,e,n,r,s){let i=r.filter(u=>u.file===s);if(i.length===0)return t;let o=t.split(` +`),a=new Map;for(let u of o)a.set(u,(a.get(u)??0)+1);let c=new Set;for(let u of i){let d=u.lineNumber-1;if(o[d]===u.line){c.add(d);continue}if((a.get(u.line)??0)===1){let p=o.indexOf(u.line);p!==-1&&c.add(p)}}if(c.size===0)return t;let l=new RegExp(`(?c.has(d)?aT(u,l,n):u).join(` +`)}function aT(t,e,n){let r=yB(t);e.lastIndex=0;let s="",i=0,o;for(;o=e.exec(r);){let a=o.index,c=a+o[0].length;s+=t.slice(i,a)+n,i=c}return s+=t.slice(i),s}function yB(t){let e="",n=null;for(let r=0;r({entry:p,confidence:vB(p,r,n)})).filter(p=>p.confidence!=="none");if(a.length===0)return null;let c={exact:2,"base-name":1,text:0};a.sort((p,f)=>c[f.confidence]-c[p.confidence]||Number(Wf(f.entry))-Number(Wf(p.entry)));let l=a[0].entry,u=l.slug??l.name,d=l.version??l.latestVersion;return!u||!d?null:{provider:"codemod.com",name:u,version:d,publisher:l.owner?.name??l.author??l.publisher??"Codemod.com",source:`https://app.codemod.com/registry/${encodeURIComponent(l.slug??u)}`,migration:l.description??l.summary??`Migrates ${e.name} usages.`,official:Wf(l)}}function vB(t,e,n){let r=t.applicability?.flatMap(o=>o.packages??[])??[];if(r.some(o=>o.toLowerCase()===e))return"exact";if(r.some(o=>!o.includes("/")&&o.toLowerCase()===n))return"base-name";let s=`${t.slug??""} ${t.name??""} ${t.description??""} ${t.summary??""}`.toLowerCase(),i=new RegExp(`(?:^|[^a-z0-9])${kB(n)}(?:$|[^a-z0-9])`);return n&&i.test(s)?"text":"none"}function kB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wf(t){if(t.verified||t.official)return!0;let e=(t.owner?.name??t.owner?.slug??t.author??t.publisher??"").toLowerCase();return e==="codemod"||e==="codemod.com"}var EB=/\borg\.openrewrite\.[a-zA-Z0-9_.]*[A-Z][a-zA-Z0-9_]*\b/;async function dT(t,e){if(!e||e.ecosystem!=="maven")return null;let n=pT(e.name).replace(/[^a-z0-9]/g,"-"),r=await lT(`rewrite-${n}`)??await lT(n);if(!r?.latestVersion)return null;let s=await SB(r.g,r.a,r.latestVersion),i=s?EB.exec(s)?.[0]:void 0;return i?{provider:"openrewrite",name:i,version:r.latestVersion,publisher:"OpenRewrite",source:`${zf}/artifact/${r.g}/${r.a}/${r.latestVersion}`,migration:s??`Runs ${i} from ${r.g}:${r.a}.`,official:!0}:null}async function lT(t){let e=encodeURIComponent(`g:org.openrewrite.recipe AND a:${t}`),n=`${zf}/solrsearch/select?q=${e}&core=gav&rows=1&wt=json`,s=(await H(n,{timeoutMs:Hf,cacheTtlMs:3600*1e3}))?.response?.docs?.[0];return s?.g==="org.openrewrite.recipe"?s:null}async function SB(t,e,n){let r=t.replace(/\./g,"/"),s=`${zf}/remotecontent?filepath=${r}/${e}/${n}/${e}-${n}.pom`,i=await ge(s,{timeoutMs:Hf,cacheTtlMs:1440*60*1e3,immutable:!0});if(!i)return null;let o=/([\s\S]*?)<\/description>/.exec(i);return o?o[1].trim():null}function pT(t){return t.replace(/^@[^/]+\//,"").toLowerCase()}var xB=[uT,dT];async function fT(t,e,n=xB){let s=(await Promise.all(n.map(i=>i(t,e).catch(()=>null)))).filter(i=>i!==null);return s.length===0?null:(s.sort((i,o)=>Number(o.official)-Number(i.official)),s[0])}var gT={branch:"{prefix}upgrade-{summary}-{date}",title:"chore(deps): upgrade {summary}",prefix:"drift/"};function hT(t,e){let{changes:n}=t,r=t.now??new Date,s=n[0],i=s?n.length===1?`${s.name}-${s.from??"unknown"}-to-${s.to??"unknown"}`:`${n.length}-packages`:"dependencies",o=s?n.length===1?`${s.name} to ${s.to??"a new version"}`:`${n.length} packages`:"dependencies";return{prefix:e,summary:i,"summary-text":o,name:s?.name??"dependencies",from:s?.from??"",to:s?.to??"",count:String(n.length),date:r.toISOString().slice(0,10)}}function yT(t,e){return t.replace(/\{([a-z-]+)\}/g,(n,r)=>e[r]??n)}function mT(t){return(t.toLowerCase().replace(/[^a-z0-9/_.-]+/g,"-").replace(/(?<=[^/])\/(?=[^/])/g,"-").replace(/\.{2,}/g,".").replace(/-{2,}/g,"-").replace(/^[-./]+|[-./]+$/g,"").replace(/\.lock$/,"-lock")||"drift-upgrade").slice(0,200).replace(/[-./]+$/,"")}function bT(t,e={}){let n={...gT,...e},r=n.prefix?`${n.prefix.replace(/\/+$/,"")}/`:"",s=yT(n.branch,hT(t,r));return s.startsWith(r)&&r?`${r}${mT(s.slice(r.length))}`:mT(s)}function wT(t,e={}){let n={...gT,...e},r=hT(t,n.prefix);return yT(n.title,{...r,summary:r["summary-text"]}).trim()}var vT={"runtime-requirement":0,"config-change":1,"moved-export":1,"removed-export":2,"renamed-export":2,"removed-endpoint":3,"changed-endpoint":3,"signature-change":4,"type-change":4,"required-field-added":5,"default-change":5,"behaviour-change":6,unknown:7};function TB(t){switch(t){case"runtime-requirement":case"config-change":return"build";case"behaviour-change":case"default-change":return"fix";default:return"refactor"}}function TT({breakingChanges:t,impactSites:e,config:n,changes:r=[],codemods:s,recipes:i}){let o=_B(e),a=t.filter(h=>(o.get(h.id)?.length??0)>0);if(a.length===0)return{commits:[],edges:[],cohorts:ST(r),blockers:[]};let l=[...n.remediation.commitGranularity==="single"?[a]:n.remediation.commitGranularity==="per-dependency"?$B(a):a.map(h=>[h])].sort(RB),u=ST(r),d=new Map;for(let h of u)for(let y of h.dependencies)d.set(y,h);let p=l.map((h,y)=>CB(h,y+1,o,l.length,s,i)),f=IB(p,t,e,d),m=NB(p,f),g=m.cycle.length>0?LB(m.cycle,f):void 0;return{commits:m.commits,edges:f,cohorts:u,blockers:g?[g]:[]}}function _B(t){let e=new Map;for(let n of t){let r=e.get(n.breakingChangeId);r?r.push(n):e.set(n.breakingChangeId,[n])}return e}function $B(t){let e=new Map;for(let n of t){let r=e.get(n.dependency);r?r.push(n):e.set(n.dependency,[n])}return[...e.values()]}function RB(t,e){let n=Math.min(...t.map(o=>vT[o.kind])),r=Math.min(...e.map(o=>vT[o.kind]));if(n!==r)return n-r;let s=t[0]?.dependency??"",i=e[0]?.dependency??"";return s.localeCompare(i)}function CB(t,e,n,r,s,i){let o=t.flatMap(d=>n.get(d.id)??[]),a=[...new Set(o.map(d=>d.file))].sort(),c=t[0],l=s?PB(t,n,s):void 0,u=!l&&i?AB(t,i):void 0;return{id:Ee("unit",t.map(d=>d.id).sort().join(","),a.join(","),c.dependency,c.kind),order:e,message:UB(t,a.length),body:WB(t,o,l,u),breakingChangeIds:t.map(d=>d.id),files:a,allowedFiles:a,allowedSymbols:[...new Set(t.flatMap(d=>d.symbols))].sort(),instructions:zB(t,o,e,r),dependsOn:[],dependencyReasons:[],executionLayer:0,expectedChecks:GB(t,a),invalidationTriggers:FB(t,a),...l?{codemod:l}:{},...u?{recipe:u}:{}}}function AB(t,e){let n=[];for(let r of t){let s=e.get(r.id);if(!s)return;n.push(s)}return n.length>0?n:void 0}function PB(t,e,n){let r=new Set,s=[];for(let i of t){let o=e.get(i.id)??[],a=n.get(i.id);if(!a||a.sitesResolvedl.file))];if(c.some(l=>r.has(l)))return;for(let l of c)r.add(l);s.push({...a.transform,files:c})}return s.length>0?s:void 0}function IB(t,e,n,r){let s=new Map,i=new Map(e.map(c=>[c.id,c])),o=new Map;for(let c of n){let l=o.get(c.file);l?l.push(c):o.set(c.file,[c])}let a=(c,l,u,d)=>{if(c.id===l.id)return;let p=`${c.id}\0${l.id}\0${u}`;s.has(p)||s.set(p,{from:c.id,to:l.id,reason:u,evidence:[...new Set(d)].sort()})};for(let c=0;cf.dependency)),p=new Set(l.allowedFiles);for(let f=c+1;fb.dependency)),y=m.allowedFiles.filter(b=>p.has(b));y.length>0&&a(l,m,"same-file-conflict",y),u.some(b=>b.kind==="runtime-requirement")&&a(l,m,"runtime-prerequisite",u.map(b=>b.summary)),u.some(b=>b.kind==="config-change")&&g.some(b=>d.has(b.dependency))&&a(l,m,"configuration-prerequisite",u.map(b=>b.summary)),u.some(b=>b.kind==="moved-export")&&DB(u,g)&&a(l,m,"import-prerequisite",u.flatMap(b=>b.symbols)),l.allowedFiles.some(Kf)&&!m.allowedFiles.every(Kf)&&OB(d,h)&&a(l,m,"generated-output",l.allowedFiles.filter(Kf));let w=[...d].map(b=>r.get(b)).filter(b=>!!b).filter(b=>g.some(k=>b.dependencies.includes(k.dependency)));for(let b of w)a(l,m,"package-cohort",[`${b.id}: ${b.reason}`]);let S=MB(l,m,o);S.length>0&&a(l,m,"symbol-dependency",S)}}return[...s.values()].sort(_T)}function kT(t,e){return t.breakingChangeIds.map(n=>e.get(n)).filter(n=>!!n)}function OB(t,e){for(let n of t)if(e.has(n))return!0;return!1}function DB(t,e){let n=t.filter(r=>r.kind==="moved-export");if(n.length===0)return!1;for(let r of n){let s=new Set([...r.symbols,...r.replacementSymbols??[]]);if(e.some(i=>i.dependency===r.dependency&&i.symbols.some(o=>s.has(o))))return!0}return!1}function Kf(t){return/(^|\/)(__generated__|generated|gen)\//i.test(t)||/\.(generated|gen)\./i.test(t)}function MB(t,e,n){let r=new Set(t.allowedSymbols??[]);if(r.size===0)return[];let s=[];for(let i of e.allowedFiles)for(let o of n.get(i)??[])o.enclosingSymbol&&r.has(o.enclosingSymbol)&&s.push(`${i}:${o.line} is inside ${o.enclosingSymbol}`);return s}function _T(t,e){return t.from.localeCompare(e.from)||t.to.localeCompare(e.to)||t.reason.localeCompare(e.reason)||t.evidence.join("\0").localeCompare(e.evidence.join("\0"))}function NB(t,e){let n=new Map(t.map(a=>[a.id,a])),r=new Map;for(let a of t)r.set(a.id,new Set);for(let a of e)!n.has(a.from)||!n.has(a.to)||r.get(a.to).add(a.from);let s=new Set(t.map(a=>a.id)),i=new Map,o=0;for(;s.size>0;){let a=[...s].filter(c=>[...r.get(c)??[]].every(l=>!s.has(l))).map(c=>n.get(c)).sort((c,l)=>c.order-l.order||c.id.localeCompare(l.id));if(a.length===0)return{commits:ET(t,e,i),cycle:[...s].sort()};for(let c of a)i.set(c.id,o),s.delete(c.id);o+=1}return{commits:ET(t,e,i),cycle:[]}}function ET(t,e,n){let r=new Map;for(let s of e){let i=r.get(s.to);i?i.push(s):r.set(s.to,[s])}return t.map(s=>{let i=[...r.get(s.id)??[]].sort(_T);return{...s,dependsOn:i.map(o=>o.from).sort(),dependencyReasons:i,executionLayer:n.get(s.id)??0}}).sort((s,i)=>s.executionLayer-i.executionLayer||s.order-i.order||s.id.localeCompare(i.id)).map((s,i)=>({...s,order:i+1}))}function LB(t,e){let n=e.filter(r=>t.includes(r.from)&&t.includes(r.to)).slice(0,5).map(r=>`${r.from} -> ${r.to} (${r.reason})`).join("; ");return`The remediation graph contains a dependency cycle across ${t.length} commit unit(s): ${n}. Drift cannot automatically execute this plan until the inseparable work is combined or reviewed manually.`}function GB(t,e){let n=[];return t.some(r=>r.kind==="signature-change"||r.kind==="type-change"||r.kind==="removed-export"||r.kind==="renamed-export"||r.kind==="moved-export")&&n.push({id:Ee("check","typecheck",t.map(r=>r.id).sort().join(",")),kind:"typecheck",reason:"API-shape and type-contract migrations should be checked by the repository type checker when available."}),t.some(r=>r.kind==="behaviour-change"||r.kind==="default-change")&&n.push({id:Ee("check","test",t.map(r=>r.id).sort().join(",")),kind:"test",reason:"Behavioural and default changes need tests because compilation can still succeed with wrong behaviour."}),e.some(r=>/(^|\/)(package\.json|tsconfig\.json|vite\.config|webpack\.config|rollup\.config)/.test(r))&&n.push({id:Ee("check","build",e.join(",")),kind:"build",reason:"Configuration and package-entry changes can alter the build graph."}),n}function FB(t,e){let n=[...e.map(r=>`file:${r}`),...t.flatMap(r=>r.symbols.map(s=>`symbol:${s}`)),...t.map(r=>`dependency:${r.dependency}`)];return[...new Set(n)].sort()}function ST(t){let e=[],n=new Map;for(let r of t){let s=n.get(r.ecosystem);s?s.push(r):n.set(r.ecosystem,[r])}for(let[r,s]of n)for(let i of jB(s)){if(i.length<2)continue;let o=i.map(a=>a.name).sort();e.push({id:Ee("cohort",r,o.join(",")),ecosystem:i[0].ecosystem,dependencies:o,constraints:i.map(a=>({dependency:a.name,ecosystem:a.ecosystem,range:a.rawTo??a.to??"*",source:"workspace-family"})),candidatePaths:[...new Set(i.map(a=>a.manifestPath))].sort(),reason:`These ${r} packages appear to be part of the same ${qB(i[0].name)} upgrade family and should be reviewed together.`})}return e.sort((r,s)=>r.id.localeCompare(s.id))}function jB(t){let e=new Map;for(let n of t){let r=$T(n.name);if(!r)continue;let s=e.get(r);s?s.push(n):e.set(r,[n])}return[...e.values()]}function $T(t){let e=[/^(@angular)\//,/^(@babel)\//,/^(@nestjs)\//,/^(@types)\//,/^(@vue)\//,/^(react)(?:$|-)/,/^(next)(?:$|-)/,/^(eslint)(?:$|-)/,/^(jest)(?:$|-)/,/^(webpack)(?:$|-)/,/^(vite)(?:$|-)/];for(let n of e){let r=n.exec(t);if(r?.[1])return r[1]}if(t.startsWith("@")){let n=t.split("/")[0];return n&&n!==t?n:null}return null}function qB(t){return Ck($T(t)??t,32)}function UB(t,e){let n=t[0],r=TB(n.kind),s=VB(t);return t.length===1?xT(`${r}(${s}): ${BB(n)}`):xT(`${r}(${s}): update ${t.length} usages for the new ${n.dependency} API`)}function BB(t){let e=t.symbols[0],n=t.replacementSymbols?.[0];switch(t.kind){case"removed-export":return e?`replace removed \`${e}\``:"replace removed API";case"renamed-export":return e&&n?`migrate \`${e}\` to \`${n}\``:`migrate renamed \`${e??"API"}\``;case"moved-export":return`import ${e?`\`${e}\``:"the API"} from its new entry point`;case"signature-change":return e?`update \`${e}\` call sites for the new signature`:"update call sites for new signatures";case"type-change":return e?`adapt to the new \`${e}\` type`:"adapt to changed types";case"removed-endpoint":return e?`migrate calls to removed endpoint \`${e}\``:"migrate removed endpoint calls";case"changed-endpoint":return e?`update requests to \`${e}\``:"update API requests";case"required-field-added":return e?`supply now-required \`${e}\``:"supply newly-required fields";case"default-change":return e?`pin previous default for \`${e}\``:"account for changed defaults";case"runtime-requirement":return t.summary.toLowerCase().startsWith("minimum")?t.summary.charAt(0).toLowerCase()+t.summary.slice(1):"raise the minimum runtime version";case"config-change":return/\bESM\b/i.test(t.summary)?"migrate to ESM imports":/commonjs/i.test(t.summary)?"replace dropped CommonJS usage":"update configuration for the new version";case"behaviour-change":return e?`handle changed \`${e}\` behaviour`:"handle changed behaviour";default:return`update usage of \`${t.dependency}\``}}function VB(t){let e=[...new Set(t.map(n=>n.dependency))];if(e.length===1){let n=e[0];return n.startsWith("@")?n.split("/")[1]??n:n.split(":").pop()??n}return"deps"}function xT(t){return t.length<=72?t:`${t.slice(0,69)}...`}function WB(t,e,n,r){let s=[];for(let o of t)s.push(o.summary),s.push(""),s.push(o.remediation),s.push("");let i=[...new Set(e.map(o=>o.file))];if(s.push(`Affects ${e.length} location(s) across ${i.length} file(s).`),s.push(""),n){let o=new Set(n.flatMap(a=>a.files)).size;s.push(`Resolved deterministically by Drift's codemod engine across ${o} file(s) \u2014 no model call was made for this commit.`)}else if(r&&r.length>0){let o=[...new Map(r.map(c=>[`${c.provider}:${c.name}@${c.version}`,c])).values()],a=o.map(c=>`${c.name}@${c.version} (${c.provider}, published by ${c.publisher})`).join(", ");s.push(`Community recipe available: ${a}. Not applied without an explicit choice \u2014 see ${o[0].source}.`)}else s.push("Identified by Drift from upstream evidence; see the pull request"),s.push("description for the citations behind this change.");return s.join(` +`).trim()}function zB(t,e,n,r){let s=[];s.push(`## Commit ${n} of ${r}`),s.push("");for(let i of t){s.push(`### ${i.summary}`),s.push(""),s.push(`- Dependency: \`${i.dependency}\``),s.push(`- Change type: ${i.kind}`),s.push(`- Confidence: ${i.confidence}`),s.push(""),s.push(i.remediation),s.push("");let o=e.filter(a=>a.breakingChangeId===i.id);if(o.length>0){s.push("Known locations (verify each; there may be others):"),s.push("");for(let a of o.slice(0,40)){let c=a.enclosingSymbol?` in \`${a.enclosingSymbol}\``:"";s.push(`- \`${a.file}:${a.line}\`${c} \u2014 \`${a.excerpt}\``)}o.length>40&&s.push(`- \u2026and ${o.length-40} more matches of the same symbols`),s.push("")}}return s.join(` +`).trim()}var RT=["detect","evidence","surface","static-analysis","upgrade-discovery","upgrade-install","verify","fix","pull-request"],Zf={detect:"Detect",evidence:"Evidence",surface:"API surface","static-analysis":"Static analysis","upgrade-discovery":"Find upgrades","upgrade-install":"Install a version",verify:"Verify",fix:"Fix","pull-request":"Automated PR"},N=()=>({level:"full"}),F=(t,e)=>({level:"partial",note:t,...e?{requires:e}:{}}),Lr=t=>({level:"none",note:t}),Mn="Resolves imports against the module names the published package declares, follows re-exports inside your repository, and matches references to symbols named in the evidence. Cannot see through reflection, dynamic dispatch, or generated code.",HB="Matches imports and references to symbols named in the evidence, using the ecosystem's own module-naming convention where no published module list exists. Cannot see through reflection, dynamic dispatch, or generated code.",Jf="Compares the declarations in both versions' public headers, which is what a consumer compiles against. Declarations behind preprocessor conditionals are read as written, not per build configuration.",Yf="Matches `#include` directives and references to symbols named in the evidence, following includes through your own headers so a library reached indirectly still counts. A macro-generated call site is invisible.",KB={npm:{ecosystem:"npm",localizationBasis:"declared",label:"JavaScript / TypeScript",files:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lock","npm-shrinkwrap.json"],managers:["npm","pnpm","Yarn (classic)","Yarn (berry)","Bun"],support:{detect:N(),evidence:N(),surface:F("Diffs published TypeScript declarations. A package that ships no declarations of its own falls back to prose evidence rather than reporting a clean comparison."),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs the typecheck, test, and build scripts the project's package.json actually declares."),fix:N(),"pull-request":N()}},pypi:{ecosystem:"pypi",localizationBasis:"published",label:"Python",files:["pyproject.toml","requirements.txt","setup.py","poetry.lock","uv.lock","Pipfile"],managers:["pip","Poetry","uv"],support:{detect:N(),evidence:N(),surface:F("Compares the public surface reconstructed from published type stubs. Packages without stubs fall back to prose evidence.","a local Python interpreter"),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs mypy/pyright and pytest when the project declares them."),fix:N(),"pull-request":N()}},go:{ecosystem:"go",localizationBasis:"declared",label:"Go",files:["go.mod","go.sum"],managers:["Go modules"],support:{detect:N(),evidence:N(),surface:F("Compares the exported API of both module versions.","the Go toolchain"),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs `go vet`, `go test`, and `go build`.","the Go toolchain"),fix:N(),"pull-request":N()}},cargo:{ecosystem:"cargo",localizationBasis:"declared",label:"Rust",files:["Cargo.toml","Cargo.lock"],managers:["Cargo"],support:{detect:N(),evidence:N(),surface:F("Compares the public API of both crate versions.","cargo-public-api"),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs `cargo check`, `cargo test`, and `cargo build`.","the Rust toolchain"),fix:N(),"pull-request":N()}},maven:{ecosystem:"maven",localizationBasis:"published",label:"Java / Kotlin / Scala",files:["pom.xml","build.gradle","build.gradle.kts","gradle/libs.versions.toml","build.sbt"],managers:["Maven","Gradle","sbt"],support:{detect:F("Reads pom.xml, Gradle build files and version catalogs, and sbt coordinates. Gradle versions computed at configuration time are not visible without running Gradle."),evidence:N(),surface:F("Compares both published JARs.","japicmp"),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs Maven or Gradle. sbt projects verify through sbt when it is installed."),fix:F("Maven and sbt are edited through the build file; Gradle versions declared outside a version catalog may need a manual edit."),"pull-request":N()}},rubygems:{ecosystem:"rubygems",localizationBasis:"published",label:"Ruby",files:["Gemfile","Gemfile.lock","*.gemspec"],managers:["Bundler"],support:{detect:N(),evidence:N(),surface:Lr("Ruby has no static public API surface to compare, so upgrades rest on release notes, changelogs, and advisories."),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs RSpec or Rake when the Gemfile declares them.","Bundler"),fix:N(),"pull-request":N()}},nuget:{ecosystem:"nuget",localizationBasis:"published",label:".NET",files:["*.csproj","*.fsproj","*.vbproj","Directory.Packages.props","packages.lock.json"],managers:["NuGet"],support:{detect:N(),evidence:F("Registry metadata, published versions, deprecation, and OSV advisories. Release notes depend on the package declaring a GitHub repository."),surface:F("Compares the public types and member signatures in both versions' published assemblies, preferring the reference assembly and a common target framework. A package that ships only native binaries, analyzers, or nothing at all has no surface to compare."),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs `dotnet build` and `dotnet test`.","the .NET SDK"),fix:N(),"pull-request":N()}},packagist:{ecosystem:"packagist",localizationBasis:"published",label:"PHP",files:["composer.json","composer.lock"],managers:["Composer"],support:{detect:N(),evidence:F("Registry metadata, published versions, abandonment notices, and OSV advisories. Release notes depend on the package declaring a source repository."),surface:Lr("PHP publishes no machine-comparable API artefact; upgrades rest on release notes, changelogs, and advisories."),"static-analysis":F("Resolves `use` statements against the PSR-4 and PSR-0 roots the package declares in its own composer.json, read from Packagist. A package that autoloads only by classmap declares no namespace root and is not localized."),"upgrade-discovery":N(),verify:F("Runs PHPUnit when composer.json declares it.","Composer"),fix:N(),"pull-request":N()}},hex:{ecosystem:"hex",localizationBasis:"published",label:"Elixir / Erlang",files:["mix.exs","mix.lock"],managers:["Mix"],support:{detect:N(),evidence:F("Registry metadata, published versions, retirement notices, and OSV advisories."),surface:F("Compares the public modules and their functions, by name and arity, in both versions' published sources \u2014 `def` and `defmacro` in Elixir, `-export` in Erlang. A function a macro generates at compile time is not visible without compiling."),"static-analysis":F("Resolves module references against every module the released tarball defines, so a fully qualified call needs no `alias` to be found. Cannot see through `apply/3` or a module name computed at runtime."),"upgrade-discovery":N(),verify:F("Runs `mix compile --warnings-as-errors` and `mix test`.","Elixir and Mix"),fix:N(),"pull-request":N()}},pub:{ecosystem:"pub",localizationBasis:"declared",label:"Dart / Flutter",files:["pubspec.yaml","pubspec.lock"],managers:["Dart pub","Flutter"],support:{detect:N(),evidence:F("Registry metadata, published versions, retraction, and OSV advisories. Release notes depend on the package declaring a repository."),surface:F("Compares the public declarations of both versions' published libraries, following each `export` out of the private `lib/src` tree the way a consumer's import does. Read from source rather than from a compiled artefact."),"static-analysis":F(Mn),"upgrade-discovery":N(),verify:F("Runs `dart analyze` and `dart test`, or their Flutter equivalents.","the Dart or Flutter SDK"),fix:N(),"pull-request":N()}},swift:{ecosystem:"swift",localizationBasis:"published",label:"Swift",files:["Package.swift","Package.resolved"],managers:["Swift Package Manager"],support:{detect:F("Reads literal `.package(...)` declarations and Package.resolved. Versions computed by Swift code at manifest-evaluation time are not visible without running SwiftPM."),evidence:F("Source repository, releases, and changelogs, because SwiftPM identifies packages by git URL. There is no central registry to query for deprecation."),surface:Lr("Comparing two Swift module interfaces needs a local toolchain and a built artefact Drift does not produce; upgrades rest on prose evidence."),"static-analysis":F("Resolves `import` statements against the library and target names declared in the dependency's own Package.swift at the resolved version. A module name a manifest computes at evaluation time is not visible without running SwiftPM."),"upgrade-discovery":F("Versions are git tags, since SwiftPM has no package registry to ask. Drift lists them for packages hosted on GitHub; anything on another git host is reported as unchecked rather than up to date."),verify:F("Runs `swift build` and `swift test`.","the Swift toolchain"),fix:N(),"pull-request":N()}},cocoapods:{ecosystem:"cocoapods",localizationBasis:"published",label:"CocoaPods",files:["Podfile","Podfile.lock","*.podspec"],managers:["CocoaPods"],support:{detect:N(),evidence:F("Release notes and changelogs when the pod declares a GitHub source. CocoaPods publishes no queryable metadata API, so there is no deprecation or advisory signal."),surface:Lr("Drift does not compare compiled iOS frameworks; upgrades rest on prose evidence."),"static-analysis":F("Resolves `import` statements against the `module_name` the pod declares in its podspec, read from the CocoaPods CDN. A pod that builds its module name in Ruby at podspec-evaluation time is not visible without running CocoaPods."),"upgrade-discovery":N(),verify:Lr("Building an iOS target needs Xcode and a scheme Drift cannot infer; verification stays with the developer."),fix:N(),"pull-request":N()}},opam:{ecosystem:"opam",localizationBasis:"convention",label:"OCaml",files:["*.opam","dune-project","*.opam.locked"],managers:["opam"],support:{detect:N(),evidence:F("Release notes and changelogs when the package declares a GitHub source. opam has no JSON metadata API, so there is no registry deprecation signal."),surface:Lr("Comparing two OCaml module interfaces needs a built switch Drift does not create; upgrades rest on prose evidence."),"static-analysis":F(HB),"upgrade-discovery":F("opam publishes no version API, so releases are read from the package directories in the opam-repository index. A package published only in a custom repository is reported as unchecked rather than up to date."),verify:F("Runs `dune build` and `dune runtest`.","opam and dune"),fix:N(),"pull-request":N()}},conan:{ecosystem:"conan",localizationBasis:"convention",label:"C / C++ (Conan)",files:["conanfile.txt","conanfile.py","conan.lock"],managers:["Conan"],support:{detect:F("Reads conanfile.txt, conan.lock, and the literal `requires` declarations in conanfile.py. A reference a recipe builds at evaluation time is not visible without running Python."),evidence:F("Versions from the ConanCenter recipe index, and releases and changelogs from the upstream project the recipe builds \u2014 not from the recipe itself. ConanCenter publishes no deprecation signal, and OSV has no Conan ecosystem."),surface:F(Jf),"static-analysis":F(Yf),"upgrade-discovery":N(),verify:F("Runs `conan build`, which is the compiler \u2014 in C and C++ an incompatible header change is a build failure rather than a runtime surprise.","Conan"),fix:N(),"pull-request":N()}},vcpkg:{ecosystem:"vcpkg",localizationBasis:"convention",label:"C / C++ (vcpkg)",files:["vcpkg.json","vcpkg-configuration.json"],managers:["vcpkg"],support:{detect:F("Reads declared dependencies, `version>=` floors, and `overrides`. A registry baseline moving changes every unpinned version at once; Drift reports the baseline move rather than resolving it to versions."),evidence:F("Versions from the vcpkg versions database, and releases and changelogs from the port's upstream project. vcpkg publishes no deprecation signal, and OSV has no vcpkg ecosystem."),surface:F(Jf),"static-analysis":F(Yf),"upgrade-discovery":N(),verify:F("Runs the project's CMake build, which is where an incompatible header change surfaces.","CMake"),fix:N(),"pull-request":N()}},arduino:{ecosystem:"arduino",localizationBasis:"convention",label:"Arduino / PlatformIO",files:["library.properties","platformio.ini"],managers:["Arduino CLI","PlatformIO"],support:{detect:N(),evidence:F("Versions and repositories from the Arduino Library Manager index, plus releases and changelogs from the library's own repository. A library published only to PlatformIO has metadata but no version history, because that registry serves only the current release."),surface:F(Jf),"static-analysis":F(Yf),"upgrade-discovery":N(),verify:F("Runs `arduino-cli compile` or `pio run`, and `pio test` where the project has tests.","Arduino CLI or PlatformIO"),fix:N(),"pull-request":N()}}};function JB(t){let e=dr.filter(o=>o.ecosystem===t),n={name:"example",version:"1.0.0",kind:"runtime"},r=e.filter(o=>o.upgrade(n)!==null),s=e.filter(o=>o.upgrade(n)===null);if(s.length===0)return N();let i=o=>o.map(a=>a.label).join(", ");return r.length===0?Lr(`${i(s)} ${s.length===1?"has":"have"} no command that pins a version \u2014 the coordinate lives in a build file the tool will not rewrite. Drift reports the version to set and where, and leaves the edit to you.`):F(`${i(r)} can install a chosen version directly. ${i(s)} cannot: the version lives in a build file the tool will not rewrite, so Drift tells you what to change instead of running something that silently changes nothing.`)}var YB=Object.values(KB).map(t=>({...t,support:{...t.support,"upgrade-install":JB(t.ecosystem)}})),ZB=Object.fromEntries(YB.map(t=>[t.ecosystem,t]));function CT(t){return ZB[t]}var Xf=require("node:crypto");var Ks=3,Qf=[Ks];function Ze(t){return t===null||typeof t!="object"?JSON.stringify(t??null)??"null":Array.isArray(t)?`[${t.map(n=>Ze(n)).join(",")}]`:`{${Object.entries(t).filter(([,n])=>n!==void 0).sort(([n],[r])=>nr?1:0).map(([n,r])=>`${JSON.stringify(n)}:${Ze(r)}`).join(",")}}`}function XB(t){return{id:t.id,source:t.source,dependency:t.dependency,url:t.url??null,locator:t.locator??null,title:t.title,contentHash:(0,Xf.createHash)("sha256").update(t.content).digest("hex"),weight:t.weight,findings:(t.findings??[]).map(e=>({code:e.code,symbol:e.symbol,detail:e.detail,before:e.before??null,after:e.after??null}))}}function QB(t){return{nature:t.nature,detectability:[...t.detectability].sort(),scope:t.scope,visibility:[...t.visibility].sort(),origin:t.origin}}function e2(t){return{schemaVersion:Ks,id:t.id,baseBranch:t.baseBranch,headSha:t.headSha,risk:t.risk,blockers:[...t.blockers],warnings:[...t.warnings],changes:t.changes.map(e=>({name:e.name,ecosystem:e.ecosystem,from:e.from,to:e.to,kind:e.kind,bump:e.bump,manifestPath:e.manifestPath,workspace:e.workspace??null})),breakingChanges:t.breakingChanges.map(e=>({id:e.id,dependency:e.dependency,kind:e.kind,summary:e.summary,remediation:e.remediation,symbols:[...e.symbols].sort(),replacementSymbols:[...e.replacementSymbols??[]].sort(),confidence:e.confidence,taxonomy:QB(ot(e)),assessment:e.assessment?{upstream:e.assessment.upstream.score,localImpact:e.assessment.localImpact.score,verification:e.assessment.verification.score,automaticExecutionEligible:e.assessment.automaticExecutionEligible,calibration:e.assessment.upstream.calibration}:null,citations:[...e.citations].sort()})),impactSites:t.impactSites.map(e=>({breakingChangeId:e.breakingChangeId,file:e.file,line:e.line,matchedSymbol:e.matchedSymbol,enclosingSymbol:e.enclosingSymbol??null,confidence:e.confidence})),commits:t.commits.map(e=>({id:e.id,order:e.order,message:e.message,body:e.body,breakingChangeIds:[...e.breakingChangeIds].sort(),files:[...e.files].sort(),allowedFiles:[...e.allowedFiles].sort(),allowedSymbols:[...e.allowedSymbols??[]].sort(),instructions:e.instructions,dependsOn:[...e.dependsOn].sort(),dependencyReasons:[...e.dependencyReasons].map(n=>({from:n.from,to:n.to,reason:n.reason,evidence:[...n.evidence].sort()})).sort((n,r)=>Ze(n).localeCompare(Ze(r))),executionLayer:e.executionLayer,expectedChecks:[...e.expectedChecks].map(n=>({id:n.id,kind:n.kind,command:n.command??null,reason:n.reason})).sort((n,r)=>Ze(n).localeCompare(Ze(r))),invalidationTriggers:[...e.invalidationTriggers].sort()})),planEdges:[...t.planEdges].map(e=>({from:e.from,to:e.to,reason:e.reason,evidence:[...e.evidence].sort()})).sort((e,n)=>Ze(e).localeCompare(Ze(n))),upgradeCohorts:[...t.upgradeCohorts].map(e=>({id:e.id,ecosystem:e.ecosystem,dependencies:[...e.dependencies].sort(),constraints:[...e.constraints].map(n=>({dependency:n.dependency,ecosystem:n.ecosystem,range:n.range,source:n.source})).sort((n,r)=>Ze(n).localeCompare(Ze(r))),candidatePaths:[...e.candidatePaths].sort(),reason:e.reason})).sort((e,n)=>e.id.localeCompare(n.id)),evidence:t.evidence.map(XB),gaps:[...t.gaps].map(e=>({stage:e.stage,dependency:e.dependency??null,ecosystem:e.ecosystem??null,surface:e.surface,severity:e.severity,automaticExecution:e.automaticExecution})).sort((e,n)=>Ze(e).localeCompare(Ze(n)))}}function hl(t){return(0,Xf.createHash)("sha256").update(Ze(e2(t))).digest("hex")}function AT(t){return t.assessment?Dx(t.assessment):t.confidence}function yl(t){let{repo:e,config:n,changes:r,evidence:s,impactSites:i}=t,o=t2(t),a=TT({breakingChanges:o,impactSites:i,config:n,changes:r,codemods:t.codemods,recipes:t.recipes}),c=a.commits,l=i2(r,o,i),u=n2(t,o,c),{blockers:d,warnings:p}=o2(t,o,c,l,u);return{schemaVersion:Ks,id:Ee("plan",e.owner,e.repo,e.afterSha),branchName:s2(n,r,e.afterSha),baseBranch:e.baseBranch,headSha:e.afterSha,changes:[...r],evidence:[...s],breakingChanges:o,impactSites:[...i],commits:c,planEdges:a.edges,upgradeCohorts:a.cohorts,...t.rationale?{rationale:[...t.rationale]}:{},risk:l,gaps:u,checkedSurfaces:[...t.checkedSurfaces??[]],blockers:[...a.blockers,...d],warnings:p,createdAt:new Date().toISOString()}}function t2(t){let{evidence:e,breakingChanges:n,impactSites:r}=t,s=t.localizationRan??!0;return n.map(i=>{let o=r.filter(u=>u.breakingChangeId===i.id),a=ot(i),c=(t.verification??[]).filter(u=>u.breakingChangeIds!==void 0?u.breakingChangeIds.includes(i.id):u.dependency===void 0?!0:u.dependency===i.dependency&&u.workspace===i.workspace),l=Ox({change:i,taxonomy:a,evidence:e,sites:o,localizationRan:s,outcomes:c,checkedSurfaces:t.checkedSurfaces??[],gaps:[]});return{...i,taxonomy:a,assessment:l}})}function n2(t,e,n){let{changes:r,evidence:s,impactSites:i,config:o}=t,a=[];!(t.localizationRan??!0)&&e.length>0&&a.push({stage:"localize",surface:"repository source",reason:'No checkout was available, so Drift could not search this repository for affected code. Zero impact sites here means "not searched", not "not affected".',severity:"blocking",automaticExecution:"blocks",remediation:"Run Drift as a GitHub Action or from the CLI in a checkout. The webhook runner cannot localize \u2014 see docs/deployment.md."});for(let u of r)s.filter(f=>f.dependency===u.name&&f.workspace===u.workspace).filter(f=>f.source!=="semver-heuristic"&&f.source!=="registry-metadata").length===0&&a.push({stage:"evidence",ecosystem:u.ecosystem,dependency:u.name,surface:"upstream release evidence",reason:`No changelog, release notes, migration guide, or API diff could be retrieved for ${u.name}. Drift will not dispatch a fix based on a version number alone.`,severity:"significant",automaticExecution:o.guardrails.requireEvidence&&e.length>0?"blocks":"degrades",remediation:"Check the package publishes release notes Drift can reach, or review this upgrade by hand."});for(let u of e)i.filter(p=>p.breakingChangeId===u.id).length>0||Mc(ot(u))&&a.push({stage:"localize",dependency:u.dependency,surface:`reachability of ${u.symbols.slice(0,3).join(", ")||u.dependency}`,reason:`${u.summary} is only observable at runtime, so searching the source cannot establish whether this repository is affected.`,severity:"significant",automaticExecution:"degrades",remediation:"Confirm by exercising the affected paths, or review the upstream notes directly."});(t.verification??[]).filter(u=>!u.name.startsWith("behavioural:")).length===0&&n.length>0&&a.push({stage:"verify",surface:"build, typecheck, and test",reason:"No checks were run against this plan, so nothing confirms the findings were understood correctly or that a fix would compile.",severity:"significant",automaticExecution:"degrades",remediation:"Configure the repository checks Drift should run, or review the resulting pull request against CI before merging."});for(let u of[...new Set(r.map(d=>d.ecosystem))].sort()){let d=CT(u);for(let p of RT)d.support[p].level==="none"&&a.push({stage:r2(p),ecosystem:u,surface:Zf[p],reason:d.support[p].note??`${Zf[p]} does not run for ${u}.`,severity:"significant",automaticExecution:"degrades",remediation:`Drift cannot run this stage for ${u}; review this surface by hand.`})}return a}function r2(t){switch(t){case"detect":return"detect";case"evidence":case"surface":return"evidence";case"static-analysis":return"localize";case"verify":return"verify";default:return"plan"}}function s2(t,e,n){return bT({changes:e},{branch:t.pullRequest.branchTemplate,prefix:t.remediation.branchPrefix})}function i2(t,e,n){if(e.length===0||n.length===0)return"none";let r="low",s=o=>{qy(o,r)>0&&(r=o)},i=new Set(n.map(o=>o.file)).size;(i>5||n.length>20)&&s("medium"),(i>20||n.length>75)&&s("high");for(let o of e)(o.kind==="behaviour-change"||o.kind==="default-change")&&s("high"),o.kind==="unknown"&&s("medium"),o.confidence==="low"&&s("medium");for(let o of t)o.bump==="major"&&s("medium"),Gi(o.from,o.to)&&s("high");return n.some(o=>PT(o.file))&&s("medium"),r}function o2(t,e,n,r,s){let{config:i,changes:o,impactSites:a,skipped:c=[]}=t,l=i.guardrails,u=[],d=[],p=[...new Set(n.flatMap(k=>k.files))];p.length>l.maxFilesChanged&&u.push(`This plan would touch ${p.length} files, above the \`maxFilesChanged\` limit of ${l.maxFilesChanged}. A change this wide should be read by a person before an agent starts editing.`),o.length>l.maxDependenciesPerRun&&u.push(`${o.length} dependencies moved in one commit, above the \`maxDependenciesPerRun\` limit of ${l.maxDependenciesPerRun}. Batched upgrades make it hard to attribute a regression to the dependency that caused it.`);let f=p.filter(k=>lr(l.protectedPaths,k));f.length>0&&u.push(`Impact sites fall inside protected paths: ${f.slice(0,5).join(", ")}${f.length>5?`, +${f.length-5} more`:""}. Drift will not direct an agent to edit these.`);let m=o.filter(k=>lr(i.alwaysApprove,k.name));m.length>0&&u.push(`${m.map(k=>k.name).join(", ")} matched \`alwaysApprove\` in drift.yml.`);let g=new Set(n.flatMap(k=>k.breakingChangeIds)),h=e.filter(k=>g.has(k.id)&&!Gf(AT(k),l.minConfidence));if(h.length>0){let k=h.slice(0,3).map(_=>`\`${_.dependency}\`: ${_.summary}`).join("; ");l.experimentalDispatchBelowMinConfidence?d.push(`${h.length} finding(s) are below the \`minConfidence\` threshold of \`${l.minConfidence}\` but \`experimentalDispatchBelowMinConfidence\` is on, so Drift will dispatch anyway. ${k}.`):u.push(`${h.length} finding(s) Drift planned commits for are below the \`minConfidence\` threshold of \`${l.minConfidence}\`: ${k}. The plan is filed for review rather than dispatched.`)}let y=e.filter(k=>!g.has(k.id)&&!Gf(AT(k),l.minConfidence));y.length>0&&d.push(`${y.length} finding(s) are below the \`minConfidence\` threshold and no commit was planned for them. They are listed for awareness.`);let w=s.filter(k=>k.automaticExecution==="blocks");for(let k of w)u.push(`${k.reason} ${k.remediation}`);hd(r,i.maxAutoRisk)||u.push(`Assessed risk is \`${r}\`, above the \`maxAutoRisk\` ceiling of \`${i.maxAutoRisk}\`.`);let S=a.filter(k=>PT(k.file));S.length>0&&d.push(`${S.length} impact site(s) are in test files. Confirm the fix updates tests to match the new API rather than weakening what they assert.`);let b=e.filter(k=>!a.some(_=>_.breakingChangeId===k.id));b.length>0&&d.push(`${b.length} breaking change(s) were identified upstream but no usage was found in this repository. They are listed for awareness and no commit was planned for them.`);for(let k of c)d.push(`Skipped \`${k.change.name}\`: ${k.reason}.`);return{blockers:u,warnings:d}}function PT(t){let e=t.toLowerCase();return/(^|\/)(tests?|__tests__|spec|specs|e2e|integration_tests)\//.test(e)||/\.(test|spec)\.[jt]sx?$/.test(e)||/(^|\/)test_[^/]+\.py$/.test(e)||/_test\.(py|go|rb)$/.test(e)||/_spec\.rb$/.test(e)||/Test\.java$/.test(t)||/Tests?\.kt$/.test(t)}function IT(t,e){return e.mode!=="auto"||t.blockers.length>0||t.commits.length===0?!1:hd(t.risk,e.maxAutoRisk)}var _o=mt(ur(),1);var OT="https://api.osv.dev/v1/query",a2={npm:"npm",pypi:"PyPI",go:"Go",cargo:"crates.io",maven:"Maven",rubygems:"RubyGems",nuget:"NuGet",packagist:"Packagist",hex:"Hex",pub:"Pub",swift:"SwiftURL",cocoapods:null,opam:null,conan:null,vcpkg:null,arduino:null};async function tm(t,e,n,r,s={}){let i=a2[e];if(!i)return DT();let o=s.fetch??m2,[a,c]=await Promise.all([o(OT,{version:n,package:{name:t,ecosystem:i}}),o(OT,{version:r,package:{name:t,ecosystem:i}})]);if(a===null||c===null)return DT();let l=MT(a,n),u=MT(c,r),d=l.filter(m=>!em(m,u)),p=u.filter(m=>!em(m,l)),f=l.filter(m=>em(m,u));return{checked:!0,current:l,target:u,resolved:d,introduced:p,carried:f,direction:c2(d,p)}}function em(t,e){let n=new Set([t.id,...t.aliases]);return e.some(r=>n.has(r.id)||r.aliases.some(s=>n.has(s)))}function c2(t,e){return t.length>0&&e.length>0?"mixed":t.length>0?"improves":e.length>0?"worsens":"preserves"}function DT(){return{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"}}function MT(t,e){let n=t?.vulns;if(!Array.isArray(n))return[];let r=[];for(let s of n)!s.id||s.withdrawn||r.push({id:s.id,aliases:(s.aliases??[]).filter(i=>typeof i=="string"),summary:f2(s.summary||s.details||"No summary published."),severity:u2(s),url:p2(s),fixedIn:d2(s,e)});return LT(r).sort((s,i)=>NT[s.severity]-NT[i.severity])}function LT(t){let e=new Map,n=[];for(let r of t){let s=[r.id,...r.aliases],o=s.map(a=>e.get(a)).find(a=>a!==void 0)??n.push([])-1;n[o].push(r);for(let a of s)e.set(a,o)}return n.filter(r=>r.length>0).map(r=>{let s=r.find(o=>o.severity!=="unknown")??r[0],i=new Set(r.flatMap(o=>[o.id,...o.aliases]));return i.delete(s.id),{...s,aliases:[...i].sort(),fixedIn:l2(r.map(o=>o.fixedIn)),summary:r.find(o=>o.summary!=="No summary published.")?.summary??s.summary}})}function l2(t){return t.filter(n=>!!n).map(n=>({raw:n,parsed:te(n)})).filter(n=>n.parsed!==null).sort((n,r)=>_o.default.compare(n.parsed,r.parsed))[0]?.raw??t.find(n=>!!n)??null}var NT={critical:0,high:1,medium:2,low:3,unknown:4};function u2(t){let e=t.database_specific?.severity??t.affected?.find(s=>s.database_specific?.severity)?.database_specific?.severity??t.affected?.find(s=>s.ecosystem_specific?.severity)?.ecosystem_specific?.severity;if(e){let s=e.toLowerCase();if(s==="critical")return"critical";if(s==="high")return"high";if(s==="moderate"||s==="medium")return"medium";if(s==="low")return"low"}let n=t.severity?.find(s=>s.score)?.score,r=n?GT(n):null;return r===null?"unknown":r>=9?"critical":r>=7?"high":r>=4?"medium":"low"}function GT(t){if(!/^CVSS:3\.[01]\//.test(t))return null;let e=new Map;for(let S of t.split("/").slice(1)){let[b,k]=S.split(":");b&&k&&e.set(b,k)}let n={N:.85,A:.62,L:.55,P:.2},r={L:.77,H:.44},s={N:.85,R:.62},i={H:.56,L:.22,N:0},o=e.get("S")==="C",a=o?{N:.85,L:.68,H:.5}:{N:.85,L:.62,H:.27},c=n[e.get("AV")??""],l=r[e.get("AC")??""],u=a[e.get("PR")??""],d=s[e.get("UI")??""],p=i[e.get("C")??""],f=i[e.get("I")??""],m=i[e.get("A")??""];if([c,l,u,d,p,f,m].some(S=>S===void 0))return null;let g=1-(1-p)*(1-f)*(1-m),h=o?7.52*(g-.029)-3.25*(g-.02)**15:6.42*g;if(h<=0)return 0;let y=8.22*c*l*u*d,w=Math.min(o?1.08*(h+y):h+y,10);return Math.ceil(w*10)/10}function d2(t,e){let n=te(e),r=[];for(let o of t.affected??[])for(let a of o.ranges??[])for(let c of a.events??[])c.fixed&&r.push(c.fixed);if(r.length===0)return null;let s=r.map(o=>({raw:o,parsed:te(o)})).filter(o=>o.parsed!==null);return!n||s.length===0?r[0]??null:(s.filter(o=>_o.default.gt(o.parsed,n)).sort((o,a)=>_o.default.compare(o.parsed,a.parsed))[0]??s.sort((o,a)=>_o.default.compare(o.parsed,a.parsed))[0])?.raw??null}function p2(t){return t.references?.find(n=>n.type==="ADVISORY"&&n.url)?.url??`https://osv.dev/vulnerability/${t.id}`}function f2(t){let e=t.replace(/\s+/g," ").trim(),n=e.search(/\.\s|\.$/),r=n>0?e.slice(0,n+1):e;return r.length>300?`${r.slice(0,299)}\u2026`:r}var m2=async(t,e)=>{let n=new AbortController,r=setTimeout(()=>n.abort(),1e4);try{let s=await fetch(t,{method:"POST",signal:n.signal,headers:{"Content-Type":"application/json","User-Agent":"drift-bot/0.1 (+https://github.com/trydrift/drift)"},body:JSON.stringify(e)});return s.ok?await s.json():null}catch{return null}finally{clearTimeout(r)}};var Nn=mt(ur(),1);function rm(t){let{name:e,registry:n,repository:r,currentVersion:s,targetVersion:i}=t,o=t.now??new Date,a=[],c=i?.withdrawn??n?.deprecated??void 0;c&&a.push({statement:`The maintainer has withdrawn ${e} ${t.to}: ${c}`,url:n?.homepage??void 0,concerning:!0}),r?.archived?a.push({statement:"The upstream repository is archived. It will not receive further fixes.",url:r.url,concerning:!0}):r?.pushedAt&&a.push({statement:`The repository was last pushed to ${nm(r.pushedAt,o)}.`,url:r.url}),s?.withdrawn&&!c&&a.push({statement:`The version currently installed, ${t.from}, has been withdrawn: ${s.withdrawn}`,concerning:!0});let l=y2(n?.versions??[]);if(l){let p=te(t.to);p&&Nn.default.eq(l,p)?a.push({statement:`${t.to} is the latest stable release.`}):p&&Nn.default.gt(l,p)&&a.push({statement:`${t.to} is not the latest release; ${l} is also available.`})}i?.releasedAt&&a.push({statement:`The target version was released ${nm(i.releasedAt,o)}.`});let u=g2(s,i);u&&a.push(u);let d=h2(t,l);return d&&a.push(d),{facts:a,...c?{deprecated:c}:{},...r?.archived?{archived:!0}:{},...l?{latestStable:l}:{},...i?.releasedAt?{targetReleasedAt:i.releasedAt}:{}}}function g2(t,e){let n=t?.runtime,r=e?.runtime;return r?n?n.requirement===r.requirement?null:{statement:`The required ${r.name} version changed from ${n.requirement} to ${r.requirement}. Check this against the runtimes this repository builds and deploys on.`,concerning:FT(n.requirement,r.requirement)}:{statement:`The target version requires ${r.name} ${r.requirement}.`}:null}function FT(t,e){let n=i=>te(/(\d+(?:\.\d+)*)/.exec(i)?.[1]??""),[r,s]=[n(t),n(e)];return!!(r&&s&&Nn.default.gt(s,r))}function h2(t,e){let n=te(t.from);if(!n||!e)return null;let r=Nn.default.major(e)-Nn.default.major(n);return r<1?null:{statement:`The installed version ${t.from} is ${r} major version${r===1?"":"s"} behind the latest release, ${e}. Maintainers rarely backport fixes that far.`}}function y2(t){return t.map(n=>te(n)).filter(n=>n!==null&&!Nn.default.prerelease(n)).sort(Nn.default.rcompare)[0]??null}function nm(t,e){let n=new Date(t);if(Number.isNaN(n.getTime()))return`on ${t}`;let r=Math.floor((e.getTime()-n.getTime())/864e5);if(r<0)return`on ${n.toISOString().slice(0,10)}`;if(r===0)return"today";if(r===1)return"yesterday";if(r<60)return`${r} days ago`;let s=Math.round(r/30.44);return s<24?`about ${s} months ago`:`about ${Math.round(r/365.25)} years ago`}var b2=12;async function om(t){let{name:e,currentVersion:n,targetVersion:r,repository:s,policy:i}=t,o=n?.license??null,a=r?.license??s?.license??null,c=i.enabled?await w2(t):[];if(!a&&!o)return{verdict:i.enabled?"unknown":"ok",statement:i.enabled?`Neither ${e} ${t.from} nor ${t.to} declares a license Drift could read, so this upgrade's licensing position could not be checked.`:"No license metadata was published for either version.",introduced:c};let l=d=>am(d,i),u=c.filter(d=>!d.allowed);if(o&&a&&!k2(o,a)){let d=l(a)?`The declared license changed from ${o} to ${a}. It remains within this repository's configured policy.`:`The declared license changed from ${o} to ${a}. This conflicts with the repository policy, which permits ${im(i)}.`;return{verdict:l(a)?"changed":"policy-violation",from:o,to:a,statement:d,introduced:c}}return l(a)?u.length>0?{verdict:"policy-violation",...o?{from:o}:{},...a?{to:a}:{},statement:`This upgrade newly introduces ${u.map(d=>`${d.name} (${d.license??"no declared license"})`).join(", ")}, which the repository policy does not permit. The policy permits ${im(i)}.`,introduced:c}:a?{verdict:"ok",...o?{from:o}:{},to:a,statement:`The license is unchanged at ${a}.`,introduced:c}:{verdict:"unknown",...o?{from:o}:{},statement:`${e} ${t.to} declares no license Drift could read, though ${t.from} declared ${o}.`,introduced:c}:{verdict:"policy-violation",...o?{from:o}:{},...a?{to:a}:{},statement:`${e} is licensed ${a}, which the repository policy does not permit. The policy permits ${im(i)}.`,introduced:c}}async function w2(t){let{currentVersion:e,targetVersion:n,ecosystem:r,policy:s}=t;if(!e||!n)return[];let i=new Set(e.dependencies),o=n.dependencies.filter(c=>!i.has(c)).slice(0,b2);return o.length===0?[]:await Promise.all(o.map(async c=>{let u=(await Wi(c,r,"latest").catch(()=>null))?.license??null;return{name:c,license:u,allowed:am(u,s)}}))}function am(t,e){if(!e.enabled)return!0;if(!t)return!e.requireDeclared;let n=v2(t);return e.deny.length>0&&n.some(r=>sm(r,e.deny))?!1:e.allow.length===0?!0:t.includes(" OR ")?n.some(r=>sm(r,e.allow)):n.every(r=>sm(r,e.allow))}function v2(t){return t.replace(/[()]/g," ").split(/\s+(?:OR|AND|WITH)\s+/i).map(e=>e.trim()).filter(Boolean)}function sm(t,e){let n=t.toLowerCase().replace(/\+$/,"");return e.some(r=>r.toLowerCase().replace(/\+$/,"")===n)}function k2(t,e){let n=r=>r.toLowerCase().replace(/[\s._]/g,"-").replace(/-+/g,"-");return n(t)===n(e)}function im(t){return t.allow.length>0?t.allow.join(", "):t.deny.length>0?`anything except ${t.deny.join(", ")}`:"no licenses in particular"}var E2=[{category:"security",pattern:/\b(CVE-\d{4}-\d+|GHSA-[\w-]+|GO-\d{4}-\d+|security fix|vulnerabilit|XSS|CSRF|SSRF|remote code execution|prototype pollution|path traversal|SQL injection|denial of service|ReDoS)\b/i},{category:"breaking",pattern:/\b(BREAKING|breaking change|no longer|has been removed|was removed|is removed|removed entirely|removed support|dropped support|drop support|renamed to|has been renamed|is now required|must now|now (?:requires?|returns?|expects?|accepts?|takes?)|migrate to|migration guide|incompatible)\b/i},{category:"performance",pattern:/\b(faster|speed ?up|sped up|reduces? (?:the )?(?:allocation|memory|latency)|allocation|throughput|optimi[sz]|performance (?:improvement|gain|boost|work|regression)|improv(?:e|es|ed|ing) performance)\b/i},{category:"fix",pattern:/^\s*(?:fix(?:e[sd])?|bugfix|resolve[sd]?|correct(?:s|ed)?)\b/i}];function cm(t){let{dependency:e,evidence:n,breakingChanges:r,impactSites:s}=t,i=new Map;for(let u of s)i.set(u.breakingChangeId,(i.get(u.breakingChangeId)??0)+1);let o=[],a=new Set;for(let u of r){if(u.dependency!==e)continue;let d=i.get(u.id)??0,p=UT(u.summary);a.has(p)||(a.add(p),o.push({category:"breaking",text:u.summary,...d>0?{affectedSites:d}:{},...qT(u,n)?{url:qT(u,n)}:{},...u.citations[0]?{citation:u.citations[0]}:{}}))}let c=0,l=new Map;for(let u of n)if(u.dependency===e&&!(u.source==="semver-heuristic"||u.source==="type-surface-diff"))for(let d of BT(u.content)){let p=UT(d);if(!p||a.has(p))continue;a.add(p);let f=dm(d);if(f==="breaking"&&o.some(g=>x2(g.text,d)))continue;let m=l.get(f)??0;if(m>=6){c++;continue}l.set(f,m+1),o.push({category:f,text:d,...u.url?{url:u.url}:{},citation:u.id})}return{changes:S2(o),unrelated:c}}function lm(t){return t.changes.filter(e=>e.category==="performance").map(e=>({statement:e.text,...e.url?{url:e.url}:{},...e.citation?{citation:e.citation}:{}}))}function um(t,e){if(t.length===0)return null;let n=t.filter(i=>i.kind==="package-added").length,r=t.length-n,s=[];return n>0&&s.push(`${n} new package${n===1?"":"s"}`),r>0&&s.push(`${r} new exported symbol${r===1?"":"s"}`),s.length===0?null:{statement:`The target version adds ${s.join(" and ")}, none of which can break existing code. Computed from ${e}.`}}function dm(t){for(let{category:e,pattern:n}of E2)if(n.test(t))return e;return"improvement"}var jT={breaking:0,security:1,fix:2,performance:3,improvement:4};function S2(t){return[...t].sort((e,n)=>{let r=jT[e.category]-jT[n.category];return r!==0?r:(n.affectedSites??0)-(e.affectedSites??0)})}function BT(t){let e=[],n=null;for(let r of t.split(` +`)){let s=r.trim();if(!s||/^[-=]{3,}$/.test(s))continue;if(s.startsWith("#")){n=null;continue}let i=/^[-*+]\s+/.test(s)||/^\d+\.\s+/.test(s),o=s.replace(/^[-*+]\s+/,"").replace(/^\d+\.\s+/,"").trim();if(!(o.length<12)&&!/^(?:by\s+@|thanks|co-authored-by|https?:\/\/\S+$)/i.test(o)){if(!i&&/:\s*$/.test(o)&&dm(o)==="breaking"){n=o;continue}e.push(T2(n&&i?`${n} ${o}`:o,240)),!i&&!/:\s*$/.test(o)&&(n=null)}}return e}function qT(t,e){for(let n of t.citations){let r=e.find(s=>s.id===n)?.url;if(r)return r}}function x2(t,e){let n=s=>new Set(s.match(/`([^`]+)`/g)??[]),r=n(t);return r.size===0?!1:[...n(e)].some(s=>r.has(s))}function UT(t){return t.toLowerCase().replace(/[^a-z0-9]+/g," ").trim()}function T2(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var VT={critical:0,high:1,medium:2,low:3,unknown:4};function pm(t,e){return VT[t]-VT[e]}function fm(t){return t.reduce((e,n)=>pm(n.severity,e)<0?n.severity:e,"unknown")}var _2=new Set(["behaviour-change","signature-change","default-change","moved-export","runtime-requirement"]);function mm(t){let e=[],{security:n,maintenance:r,license:s,impactSites:i}=t,o=i.length,a=new Set(i.map(p=>p.file)).size,c=t.breakingChanges.filter(p=>_2.has(p.kind)),l=t.breakingChanges.length-c.length;n.checked&&(n.resolved.length>0&&e.push(`Fixes ${n.resolved.length} known ${Ln(n.resolved.length,"vulnerability","vulnerabilities")} (worst: ${fm(n.resolved)}).`),n.introduced.length>0&&e.push(`Introduces ${n.introduced.length} known ${Ln(n.introduced.length,"vulnerability","vulnerabilities")} not present in the installed version (worst: ${fm(n.introduced)}).`),n.carried.length>0&&e.push(`${n.carried.length} known ${Ln(n.carried.length,"vulnerability affects","vulnerabilities affect")} both versions; this upgrade does not address ${n.carried.length===1?"it":"them"}.`),n.resolved.length===0&&n.target.length===0&&e.push("No known vulnerabilities were found for the target version.")),o>0?(e.push(`${o} ${Ln(o,"place","places")} in ${a} ${Ln(a,"file","files")} ${Ln(o,"uses","use")} an API this upgrade changes.`),l>0&&e.push(`${l} of the changes can be applied mechanically.`),c.length>0&&e.push(`${c.length} ${Ln(c.length,"change requires","changes require")} a developer decision rather than a substitution.`)):t.breakingChanges.length>0&&e.push(`${t.breakingChanges.length} upstream breaking ${Ln(t.breakingChanges.length,"change","changes")}, none of which this repository uses.`);for(let p of r.facts)p.concerning&&e.push(p.statement);(s.verdict==="policy-violation"||s.verdict==="changed")&&e.push(s.statement);let u=$2(t,{affected:o,decisions:c.length}),d=C2(t);return t.gaps.length>0&&e.push(...t.gaps),{recommendation:u,reasons:e,confidence:d.level,confidenceBasis:d.basis}}function $2(t,e){let{security:n,maintenance:r,license:s}=t;return n.checked&&n.introduced.length>0||r.deprecated||s.verdict==="policy-violation"?"do-not-upgrade-yet":e.affected>0?e.decisions>0?"manual-migration-required":"upgrade-after-review":t.gaps.length>0&&t.breakingChanges.length===0&&!R2(t)?"insufficient-evidence":n.checked&&n.resolved.length>0||r.facts.some(i=>i.concerning)?"upgrade-recommended":"safe-to-upgrade"}function R2(t){return t.surfaceCompared||t.security.checked||(t.proseRead??0)>0||WT(t).length>0}function WT(t){return t.evidence.filter(e=>e.dependency===t.dependency&&e.workspace===t.workspace&&(e.source==="github-release"||e.source==="changelog"||e.source==="migration-guide"))}function C2(t){let e=Math.max(WT(t).length,t.proseRead??0),n=[];return t.surfaceCompared&&n.push("the computed API diff"),e>0&&n.push(e===1?"release notes":"release notes and changelog"),t.security.checked&&n.push("the OSV advisory database"),n.length===0?{level:"low",basis:"Nothing but the version numbers could be read for this dependency."}:{level:t.surfaceCompared||n.length>=2?"high":"medium",basis:`${P2(A2(n))} agree.`}}function A2(t){return t.length<=1?t[0]??"":`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`}function P2(t){return t.charAt(0).toUpperCase()+t.slice(1)}function Ln(t,e,n){return t===1?e:n}var Gr={"safe-to-upgrade":"Safe to upgrade","upgrade-recommended":"Upgrade recommended","upgrade-after-review":"Upgrade after review","manual-migration-required":"Manual migration required","insufficient-evidence":"Insufficient evidence","do-not-upgrade-yet":"Do not upgrade yet"};async function bl(t,e){let n=t.changes.filter(r=>r.from&&r.to);return vn(n,4,async r=>{try{return await I2(r,t,e)}catch(s){return e.logger.debug(`Rationale failed for ${r.name}: ${s.message}`),N2(r,`Drift could not assemble an upgrade rationale for ${r.name}.`)}})}async function I2(t,e,n){let{config:r,logger:s}=n,i=t.from,o=t.to,a=await kn(t.name,t.ecosystem,o),[c,l,u]=await Promise.all([Wi(t.name,t.ecosystem,i).catch(()=>null),Wi(t.name,t.ecosystem,o).catch(()=>null),a?.githubRepo?Wk(a.githubRepo,n.githubToken).catch(()=>null):Promise.resolve(null)]),d=r.rationale.security?await tm(t.name,t.ecosystem,i,o,n.osv??{}):{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"},p=r.rationale.maintenance?rm({name:t.name,ecosystem:t.ecosystem,from:i,to:o,registry:a,repository:u,currentVersion:c,targetVersion:l}):{facts:[]},f=await om({name:t.name,ecosystem:t.ecosystem,from:i,to:o,currentVersion:c,targetVersion:l,repository:u,policy:r.licenses}),m=e.breakingChanges.filter(ie=>ie.dependency===t.name&&ie.workspace===t.workspace),g=new Set(m.map(ie=>ie.id)),h=e.impactSites.filter(ie=>g.has(ie.breakingChangeId)),y=bt(t),w=n.additions?.get(y),S=n.surfaceCompared?.has(y)??w!==void 0,b=r.rationale.summary?cm({dependency:t.name,evidence:e.evidence,breakingChanges:m,impactSites:h,additions:w?.additions}):{changes:[],unrelated:0},k=[...lm(b)],_=w?um(w.additions,w.locator):null;_&&k.push(_);let G=n.prose?.get(y)??n.prose?.get(t.name)??[],T=O2(t,{surfaceCompared:S,surfaceGap:n.surfaceGaps?.get(y),security:d,registry:a,evidence:e.evidence,prose:G,licenseUnknown:f.verdict==="unknown"}),se=mm({dependency:t.name,workspace:t.workspace,breakingChanges:m,impactSites:h,evidence:e.evidence,security:d,maintenance:p,license:f,gaps:T,surfaceCompared:S,proseRead:G.length});return s.debug(`${t.name} ${i} \u2192 ${o}: ${se.recommendation}`),{dependency:t.name,from:i,to:o,security:d,maintenance:p,improvements:k,license:f,summary:b,assessment:se,gaps:T}}function O2(t,e){let n=[],r=e.evidence.filter(o=>o.dependency===t.name&&o.workspace===t.workspace&&(o.source==="github-release"||o.source==="changelog"||o.source==="migration-guide")),s=e.surfaceGap,i=r.length>0?null:e.prose.length>0?e.surfaceCompared?null:`Drift read ${D2(e.prose)} for ${t.name} ${t.to} and found nothing in ${e.prose.length===1?"it":"them"} that announces a breaking change. That is weaker than a clean API comparison: it means nothing was flagged, not that nothing broke.`:`No release notes, changelog, or migration guide was reachable for ${t.name} ${t.to}${e.registry?.githubRepo?"":", and no source repository could be resolved for it"}.`;return s&&i?n.push(`${zT(s.detail)}. ${i}${s.remedy?` ${s.remedy}`:""}`):s?n.push(`${zT(s.detail)}.${s.remedy?` ${s.remedy}`:""}`):i&&n.push(i),e.security.checked||n.push("The OSV advisory database could not be reached, so this upgrade's effect on known vulnerabilities is unknown."),M2(n)}function D2(t){let e=o=>t.filter(a=>a.kind===o).length,n=[],r=e("github-release"),s=e("changelog"),i=e("migration-guide");return r>0&&n.push(r===1?"the release notes":`${r} sets of release notes`),s>0&&n.push(s===1?"the changelog":`${s} changelog files`),i>0&&n.push(i===1?"the migration guide":`${i} migration guides`),n.length===0?"the published release prose":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.at(-1)}`}function M2(t){let e=new Set,n=[];for(let r of t){let s=r.toLowerCase().replace(/[^a-z0-9]+/g," ").trim();e.has(s)||(e.add(s),n.push(r))}return n}function zT(t){return t.replace(/\.\s*$/,"")}function N2(t,e){return{dependency:t.name,from:t.from??"",to:t.to??"",security:{checked:!1,current:[],target:[],resolved:[],introduced:[],carried:[],direction:"unknown"},maintenance:{facts:[]},improvements:[],license:{verdict:"unknown",statement:"Not checked.",introduced:[]},summary:{changes:[],unrelated:0},assessment:{recommendation:"insufficient-evidence",reasons:[e],confidence:"low",confidenceBasis:e},gaps:[e]}}var JT=require("node:crypto"),pt=require("node:fs/promises"),vl=require("node:os"),Fr=require("node:path"),YT=require("node:url"),ZT=require("node:child_process");var H2={},XT="behavioural-diff-npm-ts-v1",L2=new Set(["behaviour-change","default-change","type-change","signature-change","required-field-added"]);function G2(t,e){let n=e.verification.behavioural;if(!n.enabled)return[];let r=[];for(let s of t.breakingChanges){if(!L2.has(s.kind))continue;let i=t.impactSites.filter(a=>a.breakingChangeId===s.id);if(i.length===0)continue;let o=ot(s);if(!(!o.nature.includes("behaviour")&&o.nature!=="type-contract"&&s.kind!=="default-change"))for(let a of s.symbols.slice(0,n.maxSymbols-r.length)){let c=q2(s),l=[{id:"default",args:[],contracts:c}],u=new Set;for(let d of i){if(l.length>=n.maxCasesPerSymbol)break;if(d.matchedSymbol!==a)continue;let p=F2(d.excerpt,a);if(!p)continue;let f=JSON.stringify(p);u.has(f)||(u.add(f),l.push({id:`site-${l.length}`,args:p,contracts:c}))}if(r.push({dependency:s.dependency,workspace:s.workspace,symbol:a,modulePath:"",exportName:a,cases:l}),r.length>=n.maxSymbols)return r}}return r}function F2(t,e){let r=new RegExp(`\\b${j2(e)}\\s*\\(([^;]*)\\)`).exec(t);if(!r)return null;let s=r[1].trim();if(s==="")return[];let i=`[${s}]`.replace(/'/g,'"').replace(/([{,]\s*)([A-Za-z_$][\w$]*)\s*:/g,'$1"$2":');try{let o=JSON.parse(i);return Array.isArray(o)?o:null}catch{return null}}function j2(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function q2(t){switch(t.kind){case"default-change":return["configured-defaults","return-shape"];case"type-change":case"signature-change":case"required-field-added":return["return-shape","thrown-error","argument-mutation","promise-state"];case"behaviour-change":return["return-shape","thrown-error","argument-mutation","promise-state","serialization-output"];default:return["return-shape"]}}async function U2(t){let{config:e,oldEnvironment:n,newEnvironment:r}=t,s=t.probes.slice(0,e.maxSymbols),i=[],o=[];if(!e.enabled)return{evidence:[],observations:[],gaps:["behavioural probing disabled"]};if(e.sandbox!=="required")return{evidence:[],observations:[],gaps:["behavioural probing requires a sandbox"]};for(let a of s){let c=a.cases.slice(0,e.maxCasesPerSymbol);for(let l of c){let u=await wl(e,n,a,l),d=await wl(e,n,a,l),p=await wl(e,r,a,l),f=await wl(e,r,a,l),m=!gm(u,d)||!gm(p,f);i.push({dependency:a.dependency,workspace:a.workspace,symbol:a.symbol,caseId:l.id,generatedInput:l.args,oldResult:u,newResult:p,observedDifference:m?"nondeterministic result; no compatibility conclusion drawn":V2(u,p),nondeterministic:m,limitations:W2(e,l.contracts)})}}return{observations:i,gaps:o,evidence:i.map(QT)}}async function B2(){return typeof __dirname<"u"?(0,Fr.join)(__dirname,"behavioural-worker.js"):(0,YT.fileURLToPath)(new URL("./behavioural-worker.js",H2.url))}async function wl(t,e,n,r){let s=await(0,pt.mkdtemp)((0,Fr.join)((0,vl.tmpdir)(),"drift-behavioural-")),i=await(0,pt.realpath)(s),o=(0,Fr.join)(s,"case.json"),a=await(0,pt.realpath)(await B2()),c=(0,Fr.resolve)(e.modulePath||n.modulePath),l=await(0,pt.realpath)(c),u=(0,Fr.resolve)(e.packageRoot);await(0,pt.writeFile)(o,JSON.stringify({modulePath:l,exportName:n.exportName,args:r.args,network:t.network}));let d=[a,u,await(0,pt.realpath)(u),c,l,o,await(0,pt.realpath)(o)],p=[Number(process.versions.node.split(".")[0])>=24?"--permission":"--experimental-permission",...[...new Set(d)].map(f=>`--allow-fs-read=${f}`),`--max-old-space-size=${t.memoryMb}`,a,o];try{return await new Promise(f=>{let m=(0,ZT.spawn)(process.execPath,p,{stdio:["ignore","pipe","pipe"],env:{PATH:process.env.PATH??"",HOME:i,TMPDIR:i,DRIFT_BEHAVIOURAL_SANDBOX:"1"}});if(m.pid&&t.cpuLimit<1)try{(0,vl.setPriority)(m.pid,Math.round(10*(1-t.cpuLimit)))}catch{}let g="",h="",y=64*1024,w=setTimeout(()=>{m.kill("SIGKILL")},t.timeoutSeconds*1e3);m.stdout.on("data",S=>{g=(g+S.toString("utf8")).slice(-y)}),m.stderr.on("data",S=>{h=(h+S.toString("utf8")).slice(-y)}),m.on("close",(S,b)=>{if(clearTimeout(w),b){f({status:"timed-out",signal:b,stdoutDigest:$o(g),stderrDigest:$o(h)});return}let k=g.trim().split(` +`).at(-1)??"",_=z2(k);f(_??{status:"worker-failed",stdoutDigest:$o(g),stderrDigest:$o(h)})}),m.on("error",S=>{clearTimeout(w),f({status:"worker-failed",error:{name:S.name,messageCategory:"spawn"}})})})}finally{t.retainArtifacts||await(0,pt.rm)(s,{recursive:!0,force:!0}).catch(()=>{})}}function gm(t,e){return JSON.stringify(HT(t))===JSON.stringify(HT(e))}function HT(t){return{status:t.status,value:t.value??null,error:t.error??null,mutations:t.mutations??[]}}var KT=new Set(["worker-failed","timed-out"]);function V2(t,e){return KT.has(t.status)&&KT.has(e.status)?`probe unavailable: neither version could be observed (${t.status})`:gm(t,e)?"no observed difference for this contract and generated input domain":t.status!==e.status?`status changed from ${t.status} to ${e.status}`:JSON.stringify(t.value??null)!==JSON.stringify(e.value??null)?"returned value changed":JSON.stringify(t.error??null)!==JSON.stringify(e.error??null)?"thrown error changed":JSON.stringify(t.mutations??[])!==JSON.stringify(e.mutations??[])?"argument mutation changed":"observable result changed"}function W2(t,e){let n=[`Harness ${XT}; bounded to ${e.join(", ")||"return-shape"} contracts.`,"No observed difference is not proof of behavioural compatibility outside these generated inputs.",`CPU limit requested: ${t.cpuLimit} (best-effort process priority; no OS-level quota). Node subprocess enforces wall-clock, memory, output, filesystem, and network policy, and cannot spawn its own children or threads \u2014 the wall-clock timeout is the actual hard bound on CPU consumption.`];return t.network||n.push("Network APIs were disabled for the probe."),n}function QT(t){let e=JSON.stringify({generatedInput:t.generatedInput,normalizedOldResult:t.oldResult,normalizedNewResult:t.newResult,observedDifference:t.observedDifference,testHarnessVersion:XT,nondeterminismHandling:t.nondeterministic?"Repeated runs disagreed, so Drift records the observation but draws no compatibility conclusion.":"Old and new observations were repeated once and matched within each version.",limitations:t.limitations},null,2);return{id:`ev_behaviour_${$o(`${t.workspace??""}:${t.dependency}:${t.symbol}:${t.caseId}`).slice(0,12)}`,source:"behavioural-diff",dependency:t.dependency,...t.workspace!==void 0?{workspace:t.workspace}:{},locator:`${t.symbol}:${t.caseId}`,title:`Behavioural differential probe for ${t.symbol}`,content:e,weight:t.observedDifference.startsWith("probe unavailable")?0:t.observedDifference.startsWith("no observed difference")?.25:.8,findings:[{code:"behavioural-observation",symbol:t.symbol,detail:t.observedDifference}]}}async function e_(t){let e=t.config.verification.behavioural,n=[],r=new Map,s=[];if(!e.enabled)return{evidence:n,citationsByChangeId:r,gaps:s};let i=G2({breakingChanges:t.breakingChanges,impactSites:t.impactSites},t.config);if(i.length===0)return{evidence:n,citationsByChangeId:r,gaps:s};let o=new Map;for(let a of i){let c=fr({name:a.dependency,workspace:a.workspace}),l=o.get(c);l?l.probes.push(a):o.set(c,{dependency:a.dependency,workspace:a.workspace,probes:[a]})}for(let{dependency:a,workspace:c,probes:l}of o.values()){let u=t.dependencyChanges.find(f=>f.name===a&&f.workspace===c&&f.ecosystem==="npm");if(!u?.from||!u.to){s.push(`${a}: behavioural probing needs both a resolved old and new version; skipped.`);continue}let d=await t.resolveEnvironments(u);if(!d){s.push(`${a}: could not resolve ${u.from} and ${u.to} to executable code for behavioural probing; skipped.`);continue}let p=await U2({config:e,probes:l,oldEnvironment:d.oldEnvironment,newEnvironment:d.newEnvironment});s.push(...p.gaps);for(let f of p.observations){let m=QT(f);n.push(m);for(let g of t.breakingChanges){if(g.dependency!==a||g.workspace!==c||!g.symbols.includes(f.symbol))continue;let h=r.get(g.id);h?h.push(m.id):r.set(g.id,[m.id])}}}return{evidence:n,citationsByChangeId:r,gaps:s}}function t_(t){return t.startsWith("probe unavailable")?"probe-unavailable":t.startsWith("no observed difference")?"no-difference":t.includes("returned value changed")?"return-value":t.startsWith("status changed")?"thrown-error":t.includes("argument mutation")?"argument-mutation":"behaviour"}function z2(t){try{return JSON.parse(t)}catch{return null}}function $o(t){return(0,JT.createHash)("sha256").update(t).digest("hex")}var St=require("node:fs/promises"),r_=require("node:os"),jr=require("node:path");function K2(t){return J2(t.exports)??t.module??t.main??"index.js"}function J2(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return null;let e=t,n="."in e?e["."]:e,r=(s,i)=>{if(i>6||s==null)return null;if(typeof s=="string")return s;if(typeof s!="object")return null;let o=s;for(let a of["import","require","default","node"]){if(!(a in o))continue;let c=r(o[a],i+1);if(c)return c}return null};return r(n,0)}var n_="https://cdn.jsdelivr.net/npm";async function hm(t,e,n){let r=await H(`${n_}/${e}@${n}/package.json`);if(!r)return null;let s=K2(r).replace(/^\.\//,""),i=await ge(`${n_}/${e}@${n}/${s}`);if(i===null)return null;let o=await(0,St.mkdtemp)((0,jr.join)((0,r_.tmpdir)(),"drift-behavioural-env-")),a=(0,jr.join)(o,s);return await(0,St.mkdir)((0,jr.dirname)(a),{recursive:!0}),await(0,St.writeFile)(a,i),await(0,St.writeFile)((0,jr.join)(o,"package.json"),JSON.stringify(r)),{label:t,packageRoot:await(0,St.realpath)(o),modulePath:await(0,St.realpath)(a)}}async function Ro(t){let{repo:e,config:n,logger:r,provider:s,githubToken:i,onProgress:o}=t,a=t.workspace??e.workspace,c=(V,A)=>{r.debug(`${V}: ${A}`),o?.(V,A)};c("detect","Reading manifest changes");let l=await Z2(s,e,r);if(l.length===0)return ym("No dependency manifest changed in this range.");let u=a?await dc(a,ys()):[],d=a?(await gc(a,ys(),bs(u))).map(V=>({kind:"undeclared-nested",ecosystem:V.ecosystem,declaredIn:V.manifestPath,members:[{dir:V.dir,name:null,ecosystem:V.ecosystem}]})):[],p=[...u,...d];p.length>0&&r.info(`Workspace: ${p.map(V=>`${V.kind} (${V.members.length} member(s))`).join(", ")}`);let f=dk(ak(l),p);if(f.length===0)return ym("Manifests changed, but no dependency versions moved.");r.info(`Detected ${f.length} dependency change(s)`);let{actionable:m,skipped:g}=ck(f,n);for(let V of g)r.info(` - ${V.change.name}: skipped \u2014 ${V.reason}`);if(m.length===0)return ym(f.length===1?"The 1 dependency change found doesn't match the analysis criteria in drift.yml (see reason above).":`None of the ${f.length} dependency changes found match the analysis criteria in drift.yml (see reasons above).`);c("triage",`${m.length} change(s) to analyse`),c("evidence",`Gathering evidence for ${m.map(V=>V.name).join(", ")}`);let h=new Map,y=new Map,w=new Map,S=new Set,b=await Dc(m,{config:n,logger:r,githubToken:i,...t.env?{env:t.env}:{},readRepoFile:(V,A)=>s.readFile(V,A),beforeSha:e.beforeSha,afterSha:e.afterSha,...a?{workspaceRoot:a}:{},onSurfaceComputed:(V,A)=>{let z=bt(V);S.add(z),h.set(z,{additions:A.additions??[],locator:A.locator})},onUnavailableSurface:(V,A)=>y.set(bt(V),A),onProseConsulted:(V,A)=>{let z=bt(V);w.set(z,[...w.get(z)??[],A])}});r.info(`Gathered ${b.length} evidence record(s)`),c("analyze","Identifying breaking changes");let k=await dl(m,b,{config:n,logger:r});r.info(`Identified ${k.length} breaking change(s)`);let _=[],G=!!a,T=new Map,se=new Map;if(k.length>0&&a){c("localize","Searching for affected code");let V=bs(p),A=await fc(a,{members:V}),z=pl(A),Se=await fl(m,{logger:r});for(let[ke,Le]of Y2(m)){let Lt=new Set(Le.map(Lo=>Lo.name)),Fm=k.filter(Lo=>Lt.has(Lo.dependency)&&Lo.workspace===ke);Fm.length!==0&&_.push(...gl(Fm,Le,z,A,{logger:r,member:ke,moduleMaps:Se}))}r.info(`Found ${_.length} impact site(s)`);let ve=new Map;for(let ke of _){let Le=ve.get(ke.breakingChangeId);Le?Le.push(ke):ve.set(ke.breakingChangeId,[ke])}let Xe=new Map(A.map(ke=>[ke.path,ke.content])),ft=new Map(m.map(ke=>[`${ke.workspace??""}::${ke.name}`,ke])),Cl=[];for(let ke of k){let Le=ve.get(ke.id);if(!Le||Le.length===0)continue;let Lt=iT(ke,Le,Xe);Lt?T.set(ke.id,Lt):Cl.push(ke)}if(n.remediation.communityRecipes&&Cl.length>0){let ke=await vn(Cl,4,async Le=>{let Lt=ft.get(`${Le.workspace??""}::${Le.dependency}`);return[Le.id,await fT(Le,Lt)]});for(let[Le,Lt]of ke)Lt&&se.set(Le,Lt)}}else k.length>0&&r.warn("No local checkout available; affected code cannot be located.");let ie=[],ce=[],ne=!1;if(n.verification.behavioural.enabled&&k.length>0&&_.length>0){c("verify","Probing dependency behaviour for reachable findings"),ne=!0;let V=await e_({config:n,breakingChanges:k,dependencyChanges:m,impactSites:_,resolveEnvironments:async A=>{if(!A.from||!A.to)return null;let[z,Se]=await Promise.all([hm("old",A.name,A.from),hm("new",A.name,A.to)]);return z&&Se?{oldEnvironment:z,newEnvironment:Se}:null}});for(let A of V.gaps)ie.push({stage:"verify",surface:"behavioural-diff",reason:A,severity:"minor",automaticExecution:"none",remediation:"Behavioural probing is experimental; see `verification.behavioural` in drift.yml."});if(V.evidence.length>0){b=[...b,...V.evidence],k=k.map(z=>{let Se=V.citationsByChangeId.get(z.id);return Se?.length?{...z,citations:[...z.citations,...Se]}:z}),r.info(`Behavioural probing added ${V.evidence.length} observation(s) of evidence`);let A=new Map;for(let[z,Se]of V.citationsByChangeId)for(let ve of Se){let Xe=A.get(ve);Xe?Xe.push(z):A.set(ve,[z])}for(let z of V.evidence){let Se=z.findings?.[0]?.detail??"",ve=t_(Se);ce.push({name:`behavioural:${z.dependency}`,command:"drift verify --behavioural (bounded differential probe)",status:ve==="probe-unavailable"?"unavailable":"passed",detail:Se,dependency:z.dependency,workspace:z.workspace,breakingChangeIds:A.get(z.id)??[]})}}}let Q=[];n.verification.behavioural.enabled&&Q.push({surface:"behavioural-diff",status:ne?"checked":"skipped",detail:ne?"Old and new dependency code were run against generated and observed inputs and compared.":"No breaking change had a local impact site to probe, so behavioural probing did not run."});for(let V of m){let A=bt(V),z=b.filter(ft=>ft.dependency===V.name&&ft.workspace===V.workspace),Se=y.get(A),ve=S.has(A)||z.some(ft=>ft.findings?.length);Q.push({surface:"api-surface",dependency:V.name,ecosystem:V.ecosystem,status:Se?"unavailable":ve?"checked":"unavailable",detail:Se?Se.reason:ve?"A computed diff of the published API surface was produced.":"No computed API diff was available for this ecosystem or version pair."});let Xe=w.get(A)?.filter(ft=>ft.kind==="changelog"||ft.kind==="github-release");Q.push({surface:"release-notes",dependency:V.name,ecosystem:V.ecosystem,status:Xe&&Xe.length>0?"checked":"unavailable",detail:Xe&&Xe.length>0?`${Xe.length} release note or changelog section(s) retrieved.`:"No changelog or release notes could be retrieved."})}Q.push({surface:"localization",status:G?"checked":"skipped",detail:G?`Searched the files importing each changed dependency; ${_.length} affected location(s).`:"No checkout was available, so this repository was not searched."}),c("rationale","Weighing what each upgrade is worth");let K=await bl({changes:m,evidence:b,breakingChanges:k,impactSites:_},{config:n,logger:r,githubToken:i,additions:h,surfaceCompared:S,surfaceGaps:y,prose:w});c("plan","Building the remediation plan");let oe=yl({repo:e,config:n,changes:m,evidence:b,breakingChanges:k,impactSites:_,rationale:K,skipped:g,localizationRan:G,verification:ce,checkedSurfaces:Q,codemods:T,recipes:se});return c("done","Analysis complete"),{plan:ie.length>0?{...oe,gaps:[...oe.gaps,...ie]}:oe,summary:oe.commits.length>0?`${oe.breakingChanges.length} breaking change(s), ${new Set(oe.impactSites.map(V=>V.file)).size} file(s) affected`:"No code in this repository is affected by these dependency changes."}}function Y2(t){let e=new Map;for(let n of t){let r=n.workspace,s=e.get(r)??[];s.push(n),e.set(r,s)}return[...e.entries()]}async function Z2(t,e,n){let s=(await t.changedFiles()).filter(ok);return s.length===0?[]:(n.debug(`Changed manifests: ${s.join(", ")}`),(await Promise.all(s.map(async o=>{let[a,c]=await Promise.all([t.readFile(o,e.beforeSha),t.readFile(o,e.afterSha)]);return{path:o,before:a,after:c}}))).filter(o=>o.before!==null||o.after!==null))}function ym(t){return{plan:null,summary:t}}var X2={critical:"\u{1F534} critical",high:"\u{1F7E0} high",medium:"\u{1F7E1} medium",low:"\u{1F535} low",unknown:"\u26AA severity not stated"},Q2={high:"\u{1F7E2} High",medium:"\u{1F7E1} Medium",low:"\u{1F7E0} Low"},eV=8;function wm(t){let e=t.rationale??[];if(e.length===0)return"";let n=e.map(tV).filter(Boolean);return n.length===0?"":["## Upgrade assessment","",n.join(` --- `)].join(` -`)}function g2(t){let e=[`### \`${t.dependency}\` ${t.from} \u2192 ${t.to}`,"",`**Recommendation: ${Vf[t.assessment.recommendation]}**`,""],n=h2(t.security);n&&e.push(n,"");let r=y2(t.maintenance);if(r&&e.push(r,""),t.improvements.length>0){e.push("**Other improvements**","");for(let o of t.improvements)e.push(`- ${o.statement}${o.url?` ([source](${o.url}))`:""}`);e.push("")}let s=b2(t.license);s&&e.push(s,"");let i=w2(t.summary);if(i&&e.push(i,""),e.push(`**Evidence confidence:** ${f2[t.assessment.confidence]} \u2014 ${t.assessment.confidenceBasis}`,""),t.assessment.reasons.length>0){e.push("
Why Drift concluded this","");for(let o of t.assessment.reasons)e.push(`- ${o}`);e.push("","
")}return e.join(` -`).trim()}function h2(t){if(!t.checked)return`**Security** - -The OSV advisory database could not be reached, so this upgrade's effect on known vulnerabilities is unknown.`;let e=["**Security**",""];return t.resolved.length>0&&(e.push(`Upgrading resolves ${So(t.resolved.length,"known vulnerability","known vulnerabilities")}:`),e.push(...Kf(t.resolved)),e.push("")),t.introduced.length>0&&(e.push(`The target version is affected by ${So(t.introduced.length,"advisory","advisories")} that ${t.introduced.length===1?"does":"do"} not affect the installed version:`),e.push(...Kf(t.introduced)),e.push("")),t.carried.length>0&&(e.push(`${So(t.carried.length,"advisory affects","advisories affect")} both versions and ${t.carried.length===1?"is":"are"} not addressed by this upgrade:`),e.push(...Kf(t.carried)),e.push("")),t.target.length===0&&e.push("No known vulnerabilities were found for the target version."),e.join(` -`).trim()}function Kf(t){let e=t.slice(0,m2),n=e.map(r=>{let s=r.aliases.find(a=>a.startsWith("CVE-")),i=s&&s!==r.id?`${r.id} (${s})`:r.id,o=r.fixedIn?` \u2014 first fixed in ${r.fixedIn}`:" \u2014 no fixed version published";return`- [${i}](${r.url}) \u2014 ${p2[r.severity]}${o}. ${r.summary}`});return t.length>e.length&&n.push(`- \u2026and ${t.length-e.length} more.`),n}function y2(t){return t.facts.length===0?"":["**Maintenance**","",...[...t.facts].sort((n,r)=>Number(r.concerning??!1)-Number(n.concerning??!1)).map(n=>`- ${n.statement}${n.url?` ([source](${n.url}))`:""}`)].join(` -`)}function b2(t){if(t.verdict==="ok")return"";let n=[t.verdict==="policy-violation"?"**License review required**":"**License**","",t.statement],r=t.introduced.filter(s=>!s.allowed);if(r.length>0){n.push("","Newly introduced dependencies of this package:");for(let s of r)n.push(`- \`${s.name}\` \u2014 ${s.license??"no declared license"}`);n.push("","This covers the dependencies this package itself declares. Drift does not resolve the full transitive graph during analysis.")}return n.push("","_Drift reports what the metadata says and how it compares to your configured policy. It does not give legal advice._"),n.join(` -`)}function w2(t){if(t.changes.length===0)return"";let e=[["Breaking changes",t.changes.filter(r=>r.category==="breaking")],["Security",t.changes.filter(r=>r.category==="security")],["Improvements",t.changes.filter(r=>r.category==="performance"||r.category==="improvement")],["Fixes",t.changes.filter(r=>r.category==="fix")]],n=["
What changed upstream",""];for(let[r,s]of e)if(s.length!==0){n.push(`**${r}**`,"");for(let i of s){let o=i.affectedSites!==void 0?` Drift found ${So(i.affectedSites,"affected call","affected calls")} in this repository.`:"";n.push(`- ${i.text}${o}${i.url?` ([source](${i.url}))`:""}`)}n.push("")}return t.unrelated>0&&n.push("**Unrelated changes**","",`- ${So(t.unrelated,"further change","further changes")} were read and judged not to concern this repository.`,""),n.push("
"),n.join(` -`)}function So(t,e,n){return`${t} ${t===1?e:n}`}var DT={"no-incompatible-change-in-checked-surfaces":"No incompatible change detected in the surfaces that were checked","detected-not-locally-reachable":"Incompatible change detected upstream, but not reachable from this repository","locally-affected":"This repository is affected","insufficient-evidence":"Insufficient evidence to say","verification-incomplete":"Verification incomplete"};function MT(t){let e=t.assessment;return!e||e.upstream.band==="none"||e.upstream.band==="low"?"insufficient-evidence":e.localImpact.band==="none"?e.localImpact.penalties.some(r=>r.code==="localization-unavailable"||r.code==="not-locally-checkable")?"verification-incomplete":"detected-not-locally-reachable":"locally-affected"}var v2={high:"\u{1F7E2}",medium:"\u{1F7E1}",low:"\u{1F7E0}",none:"\u26AA"};function k2(t){return v2[t]??"\u26AA"}function Yf(t){return`${k2(t.band)} ${t.band} (${t.score.toFixed(2)})`}function NT(t){return["| Dimension | Confidence | Why |","|---|---|---|",`| Upstream \u2014 did this change happen? | ${Yf(t.upstream)} | ${Zf(t.upstream)} |`,`| Local impact \u2014 does it reach this repo? | ${Yf(t.localImpact)} | ${Zf(t.localImpact)} |`,`| Verification \u2014 did anything run? | ${Yf(t.verification)} | ${Zf(t.verification)} |`].join(` -`)}function Zf(t){let e=t.penalties[0];if(e)return Us(e.detail);let n=[...t.evidence].sort((r,s)=>s.delta-r.delta)[0];return n?Us(n.detail):"\u2014"}function Us(t){return t.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\n+/g," ")}function LT(t){let e=rt(t),n=[`**Nature:** ${e.nature}`,`**Scope:** ${e.scope}`,`**Detectable at:** ${e.detectability.join(", ")}`,`**Reached via:** ${e.visibility.join(", ")}`],s=!e.detectability.some(i=>["manifest","link-or-import","compile-time","static-semantic"].includes(i))?` - -> This change is only observable when the code runs. Neither a compiler nor a source search can confirm whether this repository is affected.`:"";return`${n.join(" \xB7 ")}${s}`}function Xf(t){if(t.length===0)return"";let e=["## What Drift could not check","","These are surfaces Drift did not establish. A limit of the tool is not a finding","about the upgrade \u2014 an absence here is not evidence that nothing is wrong.","","| Stage | Surface | Why it matters | What to do |","|---|---|---|---|"];for(let n of t){let r=n.automaticExecution==="blocks"?"**blocks automatic execution**":n.automaticExecution==="degrades"?"lowers confidence":"noted",s=n.dependency?`${n.surface} (\`${n.dependency}\`)`:n.surface;e.push(`| ${n.stage} | ${Us(s)} | ${Us(n.reason)} \u2014 ${r} | ${Us(n.remediation)} |`)}return e.join(` -`)}function Qf(t){if(t.checkedSurfaces.length===0)return"";let e=["## What Drift checked","","| Surface | Dependency | Result |","|---|---|---|"];for(let n of t.checkedSurfaces){let r=n.status==="checked"?"\u2705 checked":n.status==="skipped"?"\u23ED\uFE0F skipped":"\u26A0\uFE0F unavailable";e.push(`| ${n.surface} | ${n.dependency?`\`${n.dependency}\``:"\u2014"} | ${r} \u2014 ${Us(n.detail)} |`)}return e.join(` -`)}function GT(t){if(t.automaticExecutionEligible)return"**Automatic execution:** eligible \u2014 upstream evidence and local impact are both established.";let e=[];t.upstream.band!=="high"&&e.push("upstream evidence is not conclusive"),t.localImpact.band==="none"?e.push("no local impact was established"):t.localImpact.band==="low"&&e.push("local impact is weakly established");for(let n of t.gaps)n.automaticExecution==="blocks"&&e.push(n.surface);return`**Automatic execution:** not eligible \u2014 ${e.join("; ")||"insufficient evidence"}.`}var E2=["drift-schema","drift-plan","drift-plan-digest","drift-commit","drift-base-branch"],S2=/^[ \t]*[ \t]*$/gm,_2=/^[0-9a-f]{40}$/,T2=/^plan_[0-9a-f]{10}$/,x2=/^[0-9a-f]{64}$/;function $2(t){return!(!t||t.length>255||/[\x00-\x20~^:?*[\\]/.test(t)||t.includes("..")||t.includes("@{")||t.startsWith("/")||t.endsWith("/")||t.includes("//")||t.startsWith("-")||t.startsWith(".")||t.endsWith(".")||t.endsWith(".lock"))}function jT(t){return[``,``,``,``,``].join(` -`)}function FT(t){if(!t)return{ok:!1,reason:"the issue has no body"};let e=new Map;for(let l of t.matchAll(S2)){let u=l[1],d=(l[2]??"").trim(),p=e.get(u);p?p.push(d):e.set(u,[d])}if(e.size===0)return{ok:!1,reason:"the issue has no Drift plan footer, so it is not a Drift approval issue"};for(let l of E2){let u=e.get(l);if(!u)return{ok:!1,reason:`the plan footer is missing \`${l}\``};if(u.length>1)return{ok:!1,reason:`the plan footer declares \`${l}\` ${u.length} times; a Drift issue declares each key exactly once`};if(u[0]==="")return{ok:!1,reason:`the plan footer has an empty \`${l}\``}}let n=l=>e.get(l)[0],r=n("drift-schema");if(!/^\d+$/.test(r))return{ok:!1,reason:`\`drift-schema\` must be an integer, not \`${em(r)}\``};let s=Number(r);if(!Af.includes(s))return{ok:!1,reason:`this issue records plan schema v${s}, which this version of Drift cannot verify (it supports v${Af.join(", v")}). Re-run Drift to generate a current plan.`};let i=n("drift-plan");if(!T2.test(i))return{ok:!1,reason:`\`drift-plan\` is not a Drift plan id: \`${em(i)}\``};let o=n("drift-plan-digest");if(!x2.test(o))return{ok:!1,reason:"`drift-plan-digest` is not a 64-character SHA-256 digest"};let a=n("drift-commit");if(!_2.test(a))return{ok:!1,reason:"`drift-commit` must be a full 40-character commit SHA; an abbreviated SHA does not name one commit unambiguously"};let c=n("drift-base-branch");return $2(c)?{ok:!0,metadata:{schemaVersion:s,planId:i,planDigest:o,headSha:a,baseBranch:c}}:{ok:!1,reason:`\`drift-base-branch\` is not a valid branch name: \`${em(c)}\``}}function qT(t){let e=[``,``];return t.taskId&&e.push(``),t.pullRequestNumber!==void 0&&e.push(``),e.join(` -`)}function UT(t,e){for(let n of t){if(!n.authorIsDrift||!n.body)continue;let r=//.exec(n.body)?.[1];if(r!==e)continue;let s=//.exec(n.body)?.[1]?.trim(),i=//.exec(n.body)?.[1]?.trim(),o=//.exec(n.body)?.[1];return{planDigest:r,...s?{branchName:s}:{},...i?{taskId:i}:{},...o?{pullRequestNumber:Number(o)}:{}}}return null}function em(t){let e=t.replace(/[`\r\n]/g," ").trim();return e.length<=40?e:`${e.slice(0,40)}\u2026`}var BT={high:"\u{1F7E2} high",medium:"\u{1F7E1} medium",low:"\u{1F7E0} low"},R2={none:"\u26AA none",low:"\u{1F7E2} low",medium:"\u{1F7E1} medium",high:"\u{1F534} high"};function _o(t,e){let n=[];return n.push(A2(t)),n.push(WT(t)),t.blockers.length>0&&n.push(zT(t)),t.warnings.length>0&&n.push(HT(t)),n.push(KT(t)),n.push(Jf(t)),n.push(JT(t)),n.push(M2(t)),n.push(Xf(t.gaps)),n.push(Qf(t)),n.push(YT(t)),n.push(N2(t,e)),n.push(ZT(t)),n.filter(Boolean).join(` - -`)}function VT(t,e){let n=[];return n.push("## Drift found breaking changes that need your call"),n.push(t.blockers.length>0?"Drift analysed this dependency change and prepared a fix, then stopped. The reasons are listed below.":"Drift analysed this dependency change and prepared a fix. This repository runs in `approve` mode, so nothing has been changed yet."),n.push(WT(t)),t.blockers.length>0&&n.push(zT(t)),t.warnings.length>0&&n.push(HT(t)),n.push(KT(t)),n.push(Jf(t)),n.push(JT(t)),n.push(Xf(t.gaps)),n.push(Qf(t)),n.push(YT(t)),n.push(["## To proceed","","Comment `/drift apply` on this issue and Drift will create the branch and","hand the plan to GitHub Copilot, one commit at a time. You will get a pull","request to review \u2014 nothing merges automatically.","","Comment `/drift dismiss` to close this out.","","To stop being asked for changes like this, adjust `.github/drift.yml` \u2014 see the [configuration reference](https://github.com/trydrift/drift/blob/main/docs/configuration.md)."].join(` -`)),n.push(ZT(t)),n.filter(Boolean).join(` - -`)}function A2(t){let e=new Set(t.changes.map(r=>r.workspace).filter(r=>r!==void 0));return["## Drift: dependency compatibility fix","",`${t.changes.map(r=>{let s=e.size>1?Lv(r):null;return`\`${r.name}\` ${r.from??"\u2014"} \u2192 **${r.to??"\u2014"}**${s?` _(in ${s})_`:""}`}).join(", ")}`,"",t.commits.length>0?`Drift found **${t.breakingChanges.length} breaking change(s)** affecting **${new Set(t.impactSites.map(r=>r.file)).size} file(s)** in this repository, and planned **${t.commits.length} commit(s)** to fix them.`:"Drift found no code in this repository affected by this change."].join(` -`)}function WT(t){let e=new Set(t.impactSites.map(n=>n.file)).size;return["| | |","|---|---|",`| **Risk** | ${R2[t.risk]??t.risk} |`,`| **Breaking changes** | ${t.breakingChanges.length} |`,`| **Impact sites** | ${t.impactSites.length} across ${e} file(s) |`,`| **Planned commits** | ${t.commits.length} |`,`| **Evidence sources** | ${C2(t.evidence)} |`,`| **Base branch** | \`${t.baseBranch}\` |`].join(` -`)}function C2(t){let e=new Map;for(let n of t)e.set(n.source,(e.get(n.source)??0)+1);return e.size===0?"none":[...e.entries()].map(([n,r])=>`${n} (${r})`).join(", ")}function zT(t){return["## \u26D4 Why Drift stopped","","Drift did not dispatch this automatically. Each reason below is a guardrail","from `.github/drift.yml`:","",...t.blockers.map(e=>`- ${e}`)].join(` -`)}function HT(t){return["## \u26A0\uFE0F Worth checking","",...t.warnings.map(e=>`- ${e}`)].join(` -`)}function KT(t){if(t.breakingChanges.length===0)return["## Breaking changes","","None identified from the available evidence."].join(` -`);let e=new Map(t.evidence.map(r=>[r.id,r])),n=["## Breaking changes",""];for(let r of t.breakingChanges){let s=t.impactSites.filter(a=>a.breakingChangeId===r.id).length,i=MT(r);n.push(`### ${BT[r.confidence]} \xB7 \`${r.dependency}\` \xB7 ${r.kind}`),n.push(""),n.push(r.summary),n.push(""),n.push(`**Verdict:** ${DT[i]}.`),n.push(""),n.push(LT(r)),n.push(""),r.assessment&&(n.push(NT(r.assessment)),n.push(""),n.push(GT(r.assessment)),n.push("")),r.symbols.length>0&&(n.push(`**Symbols:** ${r.symbols.map(a=>`\`${a}\``).join(", ")}`),n.push("")),n.push(s>0?`**Found in this repo:** ${s} location(s)`:r.assessment?.localImpact.penalties.some(a=>a.code==="localization-unavailable")?"**Found in this repo:** not searched \u2014 no checkout was available. This is not evidence the change is unused.":"**Found in this repo:** no usages found in the files that import this dependency \u2014 no fix planned"),n.push(""),n.push(...P2(r.remediation)),n.push("");let o=r.citations.map(a=>e.get(a)).filter(a=>a!==void 0);if(o.length>0){n.push("**Evidence:**");for(let a of o)n.push(`- ${XT(a)}`);n.push("")}}return n.join(` -`).trim()}function P2(t){let e=O2(t);return e.length===1?[`**Fix:** ${e[0]}`]:["**Fix:**","",...e]}function O2(t){let e=[],n=[],r=()=>{let s=n.join(" ").trim();n.length=0,s&&e.push(s)};for(let s of t.split(/\r?\n/)){let i=s.trim(),o=/^(before|after):(.*)$/i.exec(i);if(o){r(),e.push(`**${D2(o[1])}:**`,"",I2(o[2].trimStart()),"");continue}if(!i){r();continue}n.push(i)}return r(),e.filter((s,i,o)=>s||o[i-1]&&o[i+1])}function I2(t){let e=t.match(/`+/g)?.reduce((r,s)=>Math.max(r,s.length),2)??2,n="`".repeat(e+1);return[n,t,n].join(` -`)}function D2(t){return t&&`${t[0].toUpperCase()}${t.slice(1).toLowerCase()}`}function JT(t){if(t.commits.length===0)return["## Commit plan","","No commits planned \u2014 nothing in this repository is affected."].join(` +`)}function tV(t){let e=[`### \`${t.dependency}\` ${t.from} \u2192 ${t.to}`,"",`**Recommendation: ${Gr[t.assessment.recommendation]}**`,""],n=nV(t.security);n&&e.push(n,"");let r=rV(t.maintenance);if(r&&e.push(r,""),t.improvements.length>0){e.push("**Other improvements**","");for(let o of t.improvements)e.push(`- ${o.statement}${o.url?` ([source](${o.url}))`:""}`);e.push("")}let s=sV(t.license);s&&e.push(s,"");let i=iV(t.summary);if(i&&e.push(i,""),e.push(`**Evidence confidence:** ${Q2[t.assessment.confidence]} \u2014 ${t.assessment.confidenceBasis}`,""),t.assessment.reasons.length>0){e.push("
Why Drift concluded this","");for(let o of t.assessment.reasons)e.push(`- ${o}`);e.push("","
")}return e.join(` +`).trim()}function nV(t){if(!t.checked)return`**Security** + +The OSV advisory database could not be reached, so this upgrade's effect on known vulnerabilities is unknown.`;let e=["**Security**",""];return t.resolved.length>0&&(e.push(`Upgrading resolves ${Co(t.resolved.length,"known vulnerability","known vulnerabilities")}:`),e.push(...bm(t.resolved)),e.push("")),t.introduced.length>0&&(e.push(`The target version is affected by ${Co(t.introduced.length,"advisory","advisories")} that ${t.introduced.length===1?"does":"do"} not affect the installed version:`),e.push(...bm(t.introduced)),e.push("")),t.carried.length>0&&(e.push(`${Co(t.carried.length,"advisory affects","advisories affect")} both versions and ${t.carried.length===1?"is":"are"} not addressed by this upgrade:`),e.push(...bm(t.carried)),e.push("")),t.target.length===0&&e.push("No known vulnerabilities were found for the target version."),e.join(` +`).trim()}function bm(t){let e=t.slice(0,eV),n=e.map(r=>{let s=r.aliases.find(a=>a.startsWith("CVE-")),i=s&&s!==r.id?`${r.id} (${s})`:r.id,o=r.fixedIn?` \u2014 first fixed in ${r.fixedIn}`:" \u2014 no fixed version published";return`- [${i}](${r.url}) \u2014 ${X2[r.severity]}${o}. ${r.summary}`});return t.length>e.length&&n.push(`- \u2026and ${t.length-e.length} more.`),n}function rV(t){return t.facts.length===0?"":["**Maintenance**","",...[...t.facts].sort((n,r)=>Number(r.concerning??!1)-Number(n.concerning??!1)).map(n=>`- ${n.statement}${n.url?` ([source](${n.url}))`:""}`)].join(` +`)}function sV(t){if(t.verdict==="ok")return"";let n=[t.verdict==="policy-violation"?"**License review required**":"**License**","",t.statement],r=t.introduced.filter(s=>!s.allowed);if(r.length>0){n.push("","Newly introduced dependencies of this package:");for(let s of r)n.push(`- \`${s.name}\` \u2014 ${s.license??"no declared license"}`);n.push("","This covers the dependencies this package itself declares. Drift does not resolve the full transitive graph during analysis.")}return n.push("","_Drift reports what the metadata says and how it compares to your configured policy. It does not give legal advice._"),n.join(` +`)}function iV(t){if(t.changes.length===0)return"";let e=[["Breaking changes",t.changes.filter(r=>r.category==="breaking")],["Security",t.changes.filter(r=>r.category==="security")],["Improvements",t.changes.filter(r=>r.category==="performance"||r.category==="improvement")],["Fixes",t.changes.filter(r=>r.category==="fix")]],n=["
What changed upstream",""];for(let[r,s]of e)if(s.length!==0){n.push(`**${r}**`,"");for(let i of s){let o=i.affectedSites!==void 0?` Drift found ${Co(i.affectedSites,"affected call","affected calls")} in this repository.`:"";n.push(`- ${i.text}${o}${i.url?` ([source](${i.url}))`:""}`)}n.push("")}return t.unrelated>0&&n.push("**Unrelated changes**","",`- ${Co(t.unrelated,"further change","further changes")} were read and judged not to concern this repository.`,""),n.push("
"),n.join(` +`)}function Co(t,e,n){return`${t} ${t===1?e:n}`}var s_={"no-incompatible-change-in-checked-surfaces":"No incompatible change detected in the surfaces that were checked","detected-not-locally-reachable":"Incompatible change detected upstream, but not reachable from this repository","locally-affected":"This repository is affected","insufficient-evidence":"Insufficient evidence to say","verification-incomplete":"Verification incomplete"};function i_(t){let e=t.assessment;return!e||e.upstream.band==="none"||e.upstream.band==="low"?"insufficient-evidence":e.localImpact.band==="none"?e.localImpact.penalties.some(r=>r.code==="localization-unavailable"||r.code==="not-locally-checkable")?"verification-incomplete":"detected-not-locally-reachable":"locally-affected"}var oV={high:"\u{1F7E2}",medium:"\u{1F7E1}",low:"\u{1F7E0}",none:"\u26AA"};function aV(t){return oV[t]??"\u26AA"}function vm(t){return`${aV(t.band)} ${t.band} (${t.score.toFixed(2)})`}function o_(t){return["| Dimension | Confidence | Why |","|---|---|---|",`| Upstream \u2014 did this change happen? | ${vm(t.upstream)} | ${km(t.upstream)} |`,`| Local impact \u2014 does it reach this repo? | ${vm(t.localImpact)} | ${km(t.localImpact)} |`,`| Verification \u2014 did anything run? | ${vm(t.verification)} | ${km(t.verification)} |`].join(` +`)}function km(t){let e=t.penalties[0];if(e)return Js(e.detail);let n=[...t.evidence].sort((r,s)=>s.delta-r.delta)[0];return n?Js(n.detail):"\u2014"}function Js(t){return t.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\n+/g," ")}function a_(t){let e=ot(t),n=[`**Nature:** ${e.nature}`,`**Scope:** ${e.scope}`,`**Detectable at:** ${e.detectability.join(", ")}`,`**Reached via:** ${e.visibility.join(", ")}`],s=!e.detectability.some(i=>["manifest","link-or-import","compile-time","static-semantic"].includes(i))?` + +> This change is only observable when the code runs. Neither a compiler nor a source search can confirm whether this repository is affected.`:"";return`${n.join(" \xB7 ")}${s}`}function Em(t){if(t.length===0)return"";let e=["## What Drift could not check","","These are surfaces Drift did not establish. A limit of the tool is not a finding","about the upgrade \u2014 an absence here is not evidence that nothing is wrong.","","| Stage | Surface | Why it matters | What to do |","|---|---|---|---|"];for(let n of t){let r=n.automaticExecution==="blocks"?"**blocks automatic execution**":n.automaticExecution==="degrades"?"lowers confidence":"noted",s=n.dependency?`${n.surface} (\`${n.dependency}\`)`:n.surface;e.push(`| ${n.stage} | ${Js(s)} | ${Js(n.reason)} \u2014 ${r} | ${Js(n.remediation)} |`)}return e.join(` +`)}function Sm(t){if(t.checkedSurfaces.length===0)return"";let e=["## What Drift checked","","| Surface | Dependency | Result |","|---|---|---|"];for(let n of t.checkedSurfaces){let r=n.status==="checked"?"\u2705 checked":n.status==="skipped"?"\u23ED\uFE0F skipped":"\u26A0\uFE0F unavailable";e.push(`| ${n.surface} | ${n.dependency?`\`${n.dependency}\``:"\u2014"} | ${r} \u2014 ${Js(n.detail)} |`)}return e.join(` +`)}function c_(t){if(t.automaticExecutionEligible)return"**Automatic execution:** eligible \u2014 upstream evidence and local impact are both established.";let e=[];t.upstream.band!=="high"&&e.push("upstream evidence is not conclusive"),t.localImpact.band==="none"?e.push("no local impact was established"):t.localImpact.band==="low"&&e.push("local impact is weakly established");for(let n of t.gaps)n.automaticExecution==="blocks"&&e.push(n.surface);return`**Automatic execution:** not eligible \u2014 ${e.join("; ")||"insufficient evidence"}.`}var cV=["drift-schema","drift-plan","drift-plan-digest","drift-commit","drift-base-branch"],lV=/^[ \t]*[ \t]*$/gm,uV=/^[0-9a-f]{40}$/,dV=/^plan_[0-9a-f]{10}$/,pV=/^[0-9a-f]{64}$/;function fV(t){return!(!t||t.length>255||/[\x00-\x20~^:?*[\\]/.test(t)||t.includes("..")||t.includes("@{")||t.startsWith("/")||t.endsWith("/")||t.includes("//")||t.startsWith("-")||t.startsWith(".")||t.endsWith(".")||t.endsWith(".lock"))}function l_(t){return[``,``,``,``,``].join(` +`)}function u_(t){if(!t)return{ok:!1,reason:"the issue has no body"};let e=new Map;for(let l of t.matchAll(lV)){let u=l[1],d=(l[2]??"").trim(),p=e.get(u);p?p.push(d):e.set(u,[d])}if(e.size===0)return{ok:!1,reason:"the issue has no Drift plan footer, so it is not a Drift approval issue"};for(let l of cV){let u=e.get(l);if(!u)return{ok:!1,reason:`the plan footer is missing \`${l}\``};if(u.length>1)return{ok:!1,reason:`the plan footer declares \`${l}\` ${u.length} times; a Drift issue declares each key exactly once`};if(u[0]==="")return{ok:!1,reason:`the plan footer has an empty \`${l}\``}}let n=l=>e.get(l)[0],r=n("drift-schema");if(!/^\d+$/.test(r))return{ok:!1,reason:`\`drift-schema\` must be an integer, not \`${xm(r)}\``};let s=Number(r);if(!Qf.includes(s))return{ok:!1,reason:`this issue records plan schema v${s}, which this version of Drift cannot verify (it supports v${Qf.join(", v")}). Re-run Drift to generate a current plan.`};let i=n("drift-plan");if(!dV.test(i))return{ok:!1,reason:`\`drift-plan\` is not a Drift plan id: \`${xm(i)}\``};let o=n("drift-plan-digest");if(!pV.test(o))return{ok:!1,reason:"`drift-plan-digest` is not a 64-character SHA-256 digest"};let a=n("drift-commit");if(!uV.test(a))return{ok:!1,reason:"`drift-commit` must be a full 40-character commit SHA; an abbreviated SHA does not name one commit unambiguously"};let c=n("drift-base-branch");return fV(c)?{ok:!0,metadata:{schemaVersion:s,planId:i,planDigest:o,headSha:a,baseBranch:c}}:{ok:!1,reason:`\`drift-base-branch\` is not a valid branch name: \`${xm(c)}\``}}function d_(t){let e=[``,``];return t.taskId&&e.push(``),t.pullRequestNumber!==void 0&&e.push(``),e.join(` +`)}function p_(t,e){for(let n of t){if(!n.authorIsDrift||!n.body)continue;let r=//.exec(n.body)?.[1];if(r!==e)continue;let s=//.exec(n.body)?.[1]?.trim(),i=//.exec(n.body)?.[1]?.trim(),o=//.exec(n.body)?.[1];return{planDigest:r,...s?{branchName:s}:{},...i?{taskId:i}:{},...o?{pullRequestNumber:Number(o)}:{}}}return null}function xm(t){let e=t.replace(/[`\r\n]/g," ").trim();return e.length<=40?e:`${e.slice(0,40)}\u2026`}var Rm=require("node:crypto");var qr=require("node:path"),y_=require("node:fs");var b_=require("node:child_process"),w_=require("node:util");function Ao(t){return t.status==="error"?"error":t.impactCount>0?"affected":t.breakingCount>0?"upstream-only":t.recommendation==="insufficient-evidence"?"unchecked":t.recommendation?"clean":t.gaps&&t.gaps.length>0?"unchecked":"clean"}function f_(t){switch(Ao(t)){case"error":return"Could not check";case"affected":{let e=t.impactFiles;return`Affects your code \xB7 ${t.impactCount} site${t.impactCount===1?"":"s"} in ${e} file${e===1?"":"s"}`}case"upstream-only":return`Safe for your code \xB7 ${t.breakingCount} upstream change${t.breakingCount===1?"":"s"}, none used here`;case"unchecked":return"Not verified \xB7 Drift found nothing it could check this version against";case"clean":return t.recommendation==="upgrade-recommended"?"Worth taking \xB7 no breaking changes, and it improves on what you have":"Safe for your code \xB7 no breaking changes found"}}function m_(t,e){let n={affected:0,error:1,"upstream-only":2,unchecked:3,clean:4};return n[Ao(t)]-n[Ao(e)]}var we=mt(ur(),1);function kl(t){switch(t){case"npm":return"the npm registry";case"pypi":return"PyPI";case"cargo":return"crates.io";case"go":return"the Go module proxy";case"maven":return"Maven Central";case"rubygems":return"RubyGems";case"nuget":return"NuGet";case"packagist":return"Packagist";case"hex":return"Hex";case"pub":return"pub.dev";case"cocoapods":return"CocoaPods Trunk";case"conan":return"ConanCenter";case"vcpkg":return"the vcpkg registry";case"arduino":return"the Arduino Library Manager";case"swift":return"the package\u2019s git tags";case"opam":return"the opam repository"}}async function g_(t){try{return await mV(t)}catch(e){return{outcome:"unchecked",reason:`Checking ${kl(t.ecosystem)} for ${t.name} failed: ${e.message}`}}}async function mV(t){let{name:e,ecosystem:n,current:r,range:s}=t,i=kl(n);if(!we.default.valid(r))return{outcome:"unchecked",reason:`${e} is installed at \u201C${r}\u201D, which Drift cannot compare against published versions.`};let o=await gV(t);if(!o)return{outcome:"unchecked",reason:`Drift could not reach ${i} for ${e}.`};if(o.versions.length===0)return{outcome:"unchecked",reason:`${i} returned no versions for ${e}, so Drift has nothing to compare against.`};let a=o.versions.map(g=>te(g)).filter(g=>!!g);if(a.length===0)return{outcome:"unchecked",reason:`Drift could not read any of the ${o.versions.length} version numbers ${i} published for ${e}.`};let c=a.filter(g=>we.default.gt(g,r)).sort(we.default.rcompare),l=o.latest??c.find(g=>!we.default.prerelease(g))??c[0];if(!l||!we.default.gt(l,r))return{outcome:"up-to-date"};let u=vV(c,r,s,n),d=!!we.default.prerelease(r),p=c.filter(g=>d||!we.default.prerelease(g)),f=wV(p,r),m=[...new Set([l,...u?[u]:[],...f?[f]:[],...p.slice(0,18)])].filter(g=>we.default.gt(g,r)).sort(we.default.rcompare);return{outcome:"upgrade",latest:l,safeLatest:u,latestMinor:f,versions:m}}async function gV(t){switch(t.ecosystem){case"npm":return hV(t.name);case"swift":return yV(t.name,t.githubToken);case"opam":return bV(t.name,t.githubToken);default:{let e=await kn(t.name,t.ecosystem,null);return e?{latest:null,versions:e.versions}:null}}}async function hV(t){let e=await H(`https://registry.npmjs.org/${encodeURIComponent(t).replaceAll("%40","@")}`,{timeoutMs:12e3});return e?{latest:te(e["dist-tags"]?.latest),versions:Object.keys(e.versions??{})}:null}function h_(t){return{Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",...t?{Authorization:`Bearer ${t}`}:{}}}async function yV(t,e){if(!/^[\w.-]+\/[\w.-]+$/.test(t))return null;let n=await H(`https://api.github.com/repos/${t}/tags?per_page=100`,{headers:h_(e)});return n?{latest:null,versions:n.map(r=>r.name).filter(r=>!!r)}:null}async function bV(t,e){if(!/^[\w.+-]+$/.test(t))return null;let n=await H(`https://api.github.com/repos/ocaml/opam-repository/contents/packages/${encodeURIComponent(t)}`,{headers:h_(e)});if(!Array.isArray(n))return null;let r=`${t}.`;return{latest:null,versions:n.filter(s=>s.type==="dir"&&s.name?.startsWith(r)).map(s=>s.name.slice(r.length))}}function wV(t,e){let n=we.default.parse(e);if(n)return t.filter(r=>{let s=we.default.parse(r);return s!==null&&s.major===n.major&&we.default.gt(r,e)}).sort(we.default.rcompare)[0]}function vV(t,e,n,r){let s=t.filter(c=>we.default.gt(c,e)),i=r==="rubygems"?kV(n):null;if(i){let c=s.filter(l=>we.default.lt(l,i)).sort(we.default.rcompare)[0];if(c)return c}else{let c=we.default.validRange(n);if(c){let l=we.default.maxSatisfying(s,c);if(l)return l}}let o=we.default.parse(e);if(!o)return;let a=s.filter(c=>{let l=we.default.parse(c);return l?o.major===0?l.major===0&&l.minor===o.minor:l.major===o.major:!1});return we.default.maxSatisfying(a,"*")??void 0}function kV(t){let e=/^~>\s*(\d+)\.(\d+)(?:\.(\d+))?\s*$/.exec(t.trim());if(!e)return null;let[,n,r,s]=e;return s!==void 0?`${n}.${Number(r)+1}.0`:`${Number(n)+1}.0.0`}var rX=(0,w_.promisify)(b_.execFile);function v_(t,e){return`${t}\0${e}`}var EV={includeDev:!0,maxSites:40,maxPackages:0};async function SV(t,e=[""],n=new Map,r=ys()){let s=[],i=[];for(let o of e){let a=o?(0,qr.join)(t,o):t,c=await r.readDirectory(a);if(c.length===0)continue;let l=[...c,...await xV(a,c,r)],u=gk({entries:l,read:d=>OV((0,qr.join)(a,d))});if(u.length!==0){for(let d of hk(u))n.get(v_(o,d.ecosystem))||i.push({...d,dir:o});for(let d of TV(u,o,n)){let p=d.manager.manifests.find(m=>l.includes(m))??(d.manager.manifestPattern?l.find(m=>d.manager.manifestPattern.test(m)):void 0);if(!p)continue;let f=d.manager.lockfiles.find(m=>l.includes(m))??null;s.push({manager:d.manager,dir:o,manifestPath:o?`${o}/${p}`:p,lockfilePath:f?o?`${o}/${f}`:f:null})}}}return{targets:s,ambiguities:i}}async function xV(t,e,n){let r=new Set;for(let i of dr)for(let o of[...i.manifests,...i.lockfiles])o.includes("/")&&r.add(o);let s=[];for(let i of r){if(e.includes(i))continue;let o=i.slice(0,i.indexOf("/"));e.includes(o)&&await n.readFile((0,qr.join)(t,i))!==null&&s.push(i)}return s}function TV(t,e,n){let r=new Set,s=[];for(let i of new Set(t.map(o=>o.manager.ecosystem))){let o=t.filter(l=>l.manager.ecosystem===i),a=n.get(v_(e,i)),c=o.find(l=>l.manager.id===a)??o[0];r.has(i)||(r.add(i),s.push(c))}return s}async function k_(t){let{root:e,repo:n,config:r,logger:s,githubToken:i,onProgress:o,onCandidate:a,token:c,repoLabel:l}=t,u=t.breadth??EV,d=t.fs??ys(),p=t.env??process.env,f=Math.max(1,Math.min(16,Math.floor(t.concurrency??8)||8)),m=(A,z,Se=0,ve=0)=>o?.({phase:A,detail:z,done:Se,total:ve});m("Looking for manifests",e);let g=t.dirs?[]:await dc(e,d),h=bs(g),y=t.dirs?[]:await gc(e,d,h).catch(()=>[]),w=y.filter(A=>A.hasOwnGit),S=y.filter(A=>!A.hasOwnGit).map(A=>A.dir),b=t.dirs??[...h,...S];if(g.length>0||S.length>0){let A=[...g.map(z=>z.kind),...S.length>0?["undeclared"]:[]];m("Reading the workspace",`${b.length} package${b.length===1?"":"s"} \xB7 ${A.join(", ")}`)}let{targets:k,ambiguities:_}=await SV(e,b,t.managers??new Map,d);if(k.length===0)return{candidates:[],checked:0,upToDate:0,unchecked:[],targets:k,workspaces:g,ambiguities:_,nestedGitRepos:w};let G=new Map;for(let A of g)for(let z of A.members)z.name&&G.set(z.dir,z.name);let T=new Set(r.ecosystems),se=new Set(k.map(A=>A.dir)).size>1,ie=[];for(let A of k)T.has(A.manager.ecosystem)&&(m("Reading manifest",A.manifestPath),ie.push(...await IV(e,A,u.includeDev,d)));let ce=u.maxPackages>0?ie.slice(0,u.maxPackages):ie;m("Indexing your code","Walking source files",0,ce.length);let ne=await fc(e,{members:b}),Q=pl(ne);m("Indexing your code",`${ne.length} file${ne.length===1?"":"s"} indexed \xB7 ${ce.length} direct dependenc${ce.length===1?"y":"ies"} to check`,0,ce.length);let K=0,oe=0,Te=[],V=[];return await _V(ce,f,async A=>{if(c?.isCancellationRequested)return;m(`Checking ${kl(A.target.manager.ecosystem)}`,`${A.name} (installed ${A.current})`,oe,ce.length);let z=await g_({name:A.name,ecosystem:A.target.manager.ecosystem,current:A.current,range:A.range,...i?{githubToken:i}:{}});if(z.outcome==="up-to-date"){K+=1,oe+=1,m("Up to date",`${A.name}@${A.current}`,oe,ce.length);return}if(z.outcome==="unchecked"){V.push({name:A.name,kind:A.kind,ecosystem:A.target.manager.ecosystem,packageManager:A.target.manager.id,manifestPath:A.target.manifestPath,current:A.current,reason:z.reason}),oe+=1,m("Could not check",`${A.name}@${A.current} \xB7 ${z.reason}`,oe,ce.length);return}if(c?.isCancellationRequested)return;let Se=z.safeLatest??z.latest,ve=await RV({dep:A,selected:Se,versions:z.versions,latest:z.latest,safeLatest:z.safeLatest,latestMinor:z.latestMinor,repo:n,config:r,githubToken:i,root:e,files:ne,index:Q,logger:s,env:p,maxSites:u.maxSites,member:se?A.target.dir:void 0,memberName:G.get(A.target.dir),repoRoot:l?e:void 0,repoLabel:l,onProgress:(Xe,ft)=>m(Xe,ft,oe,ce.length)});Te.push(ve),a?.(ve),oe+=1,m(Ao(ve)==="affected"?"Needs your attention":"Checked",`${ve.name} ${ve.current} \u2192 ${ve.selected} \xB7 ${f_(ve).toLowerCase()}`,oe,ce.length)}),{candidates:Te.sort(DV),checked:ce.length,upToDate:K,unchecked:V,targets:k,workspaces:g,ambiguities:_,nestedGitRepos:w}}async function _V(t,e,n){let r=0,s=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let i=r;r+=1;let o=t[i];if(o===void 0)return;await n(o)}});await Promise.all(s)}function E_(t,e="safe"){let n=$V(t,e);return n?yk(n):null}function $V(t,e){let r=mk(t.packageManager)?.upgrade({name:t.name,version:t.selected,kind:t.kind});return r?e==="force"&&t.packageManager==="npm"?{...r,args:[...r.args,"--force"]}:r:null}async function RV(t){let e=`${t.dep.name} ${t.dep.current} \u2192 ${t.selected}`,n=t.onProgress??(()=>{}),{target:r}=t.dep,s={name:t.dep.name,ecosystem:r.manager.ecosystem,from:t.dep.current,to:t.selected,kind:t.dep.kind,bump:ac(t.dep.current,t.selected),manifestPath:r.manifestPath,rawFrom:t.dep.current,rawTo:t.selected,...t.member===void 0?{}:{workspace:t.member},...t.memberName?{workspaceName:t.memberName}:{}},i={id:`${t.repoRoot?`${t.repoRoot}::`:""}${r.manifestPath}#${t.dep.name}@${t.dep.current}->${t.selected}`,name:t.dep.name,kind:t.dep.kind,ecosystem:r.manager.ecosystem,packageManager:r.manager.id,manifestPath:r.manifestPath,...t.member===void 0?{}:{workspace:t.member},...t.memberName?{workspaceName:t.memberName}:{},...t.repoRoot?{repoRoot:t.repoRoot,repoLabel:t.repoLabel}:{},current:t.dep.current,range:t.dep.range,safeLatest:t.safeLatest,latestMinor:t.latestMinor,selected:t.selected,latest:t.latest,versions:t.versions};try{n("Reading release notes and changelog",e);let o=new Map,a=new Map,c=new Set,l=new Map,u=await Dc([s],{config:t.config,logger:t.logger,githubToken:t.githubToken,env:t.env,workspaceRoot:t.root,onSurfaceComputed:(h,y)=>{let w=bt(h);c.add(w),o.set(w,{additions:y.additions??[],locator:y.locator})},onUnavailableSurface:(h,y)=>a.set(bt(h),y),onProseConsulted:(h,y)=>{let w=bt(h);l.set(w,[...l.get(w)??[],y])}});n("Comparing the public API surface",`${e} \xB7 ${u.length} evidence source${u.length===1?"":"s"}`);let d=await dl([s],u,{config:t.config,logger:t.logger});n(d.length>0?`Searching your code for ${d.length} breaking change${d.length===1?"":"s"}`:"No breaking changes to look for",e);let p=d.length>0?await fl([s],{logger:t.logger}):void 0,f=gl(d,[s],t.index,t.files,{logger:t.logger,maxSitesPerChange:t.maxSites??40,member:t.member,...p?{moduleMaps:p}:{}});n("Weighing what this upgrade is worth",e);let[m]=await bl({changes:[s],evidence:u,breakingChanges:d,impactSites:f},{config:t.config,logger:t.logger,githubToken:t.githubToken,additions:o,surfaceCompared:c,surfaceGaps:a,prose:l}),g=yl({repo:t.repo,config:t.config,changes:[s],evidence:u,breakingChanges:d,impactSites:f,...m?{rationale:[m]}:{}});return{...i,status:d.length>0?"ready":"clean",evidenceCount:u.length,breakingCount:d.length,impactCount:f.length,impactFiles:new Set(f.map(h=>h.file)).size,risk:g.risk,summary:AV(d.length,f.length,t.dep.name,m),gaps:m?.gaps??[],toolRequests:CV(a),...m?{rationale:m,recommendation:m.assessment.recommendation}:{},plan:g}}catch(o){return{...i,status:"error",evidenceCount:0,breakingCount:0,impactCount:0,impactFiles:0,risk:"unknown",summary:"Could not inspect this upgrade",gaps:[],toolRequests:[],error:o.message}}}function CV(t){let e=new Set,n=[];for(let r of t.values())!r.install||e.has(r.install.id)||(e.add(r.install.id),n.push(r.install));return n}function AV(t,e,n,r){if(!r)return t>0?`${t} breaking change${t===1?"":"s"} found in ${n}.`:`No breaking changes found for this version of ${n}.`;let{assessment:s,security:i}=r,o=Gr[s.recommendation],a=[];return e>0?a.push(`${e} place${e===1?"":"s"} in this repository use${e===1?"s":""} an API that ${n} changed`):t>0&&a.push(`${t} upstream breaking change${t===1?"":"s"}, none of which this repository uses`),i.checked&&i.resolved.length>0&&a.push(`fixes ${i.resolved.length} known ${i.resolved.length===1?"vulnerability":"vulnerabilities"}`),i.checked&&i.introduced.length>0&&a.push(`introduces ${i.introduced.length} known ${i.introduced.length===1?"vulnerability":"vulnerabilities"}`),a.length===0&&r.gaps.length>0?`${o}. ${r.gaps.join(" ")}`:a.length===0?`${o}. No breaking changes found for this version of ${n}.`:`${o}. ${PV(a.join("; "))}.`}function PV(t){return t.charAt(0).toUpperCase()+t.slice(1)}async function IV(t,e,n,r){let s=uc(e.manifestPath),i=await r.readFile((0,qr.join)(t,e.manifestPath));if(!s||i===null)return[];let o=s.parse(i,e.manifestPath),a=e.lockfilePath?await r.readFile((0,qr.join)(t,e.lockfilePath)):null,c=a!==null&&e.lockfilePath?uc(e.lockfilePath)?.parse(a,e.lockfilePath):void 0,l=n?["runtime","dev","optional","peer"]:["runtime"],u=[];for(let[d,p]of o){if(!l.includes(p.kind))continue;let f=te(c?.get(d)?.version??p.version);f&&u.push({name:d,kind:p.kind,current:f,range:p.version??f,target:e})}return u}function OV(t){try{return(0,y_.readFileSync)(t,"utf8")}catch{return null}}function DV(t,e){let n=m_(t,e);return n!==0?n:t.impactCount!==e.impactCount?e.impactCount-t.impactCount:t.name.localeCompare(e.name)}var MV="Drift",S_="https://github.com/trydrift/drift",_m=9;function R_(t,e){let n=new Map;for(let r of t)n.has(r.ruleId)||n.set(r.ruleId,{id:r.ruleId,name:r.ruleName,...r.helpUri?{helpUri:r.helpUri}:{}});return{$schema:"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",version:"2.1.0",runs:[{tool:{driver:{name:MV,informationUri:S_,rules:[...n.values()].map(r=>({id:r.id,name:r.name,shortDescription:{text:r.name},fullDescription:{text:"A Drift finding: what changed, where it's used, and the fix \u2014 see the alert body."},helpUri:r.helpUri??S_,defaultConfiguration:{level:"warning"},properties:{tags:["dependencies","drift"]}}))}},...e?{automationDetails:{id:e}}:{},results:t.map(r=>({ruleId:r.ruleId,level:r.level,message:{text:NV(r.message),markdown:r.message},locations:[x_(r.primaryLocation,r.snippetOk)],...r.relatedLocations.length>0?{relatedLocations:r.relatedLocations.map((s,i)=>({id:i+1,...x_(s)}))}:{},partialFingerprints:{primaryLocationLineHash:GV(r)}}))}]}}function NV(t){return t.replace(/\[([^\]]*)\]\(([^)]+)\)/g,"$1 ($2)").replace(/\*\*(.*?)\*\*/g,"$1").replace(/`([^`]*)`/g,"$1")}function LV(t,e,n){let r=n?`${n}/${t}#L${e}`:`${t}#L${e}`;return`[\`${t}:${e}\`](${r})`}function x_(t,e=!1){return{physicalLocation:{artifactLocation:{uri:t.file},region:{startLine:Math.max(1,t.line),...e&&t.excerpt?{snippet:{text:t.excerpt}}:{}}}}}function GV(t){let e=`${t.ruleId}|${t.primaryLocation.file}|${(t.primaryLocation.excerpt??"").trim()}`;return(0,Rm.createHash)("sha256").update(e).digest("hex").slice(0,40)}function Cm(t,e={}){let n=e.includeInformational??!1,r=e.granularity??"package",s=e.repoBlobUrl,i=[];for(let o of t.changes){let a=t.breakingChanges.filter(g=>g.dependency===o.name&&(g.workspace??"")===(o.workspace??"")),c=t.rationale?.find(g=>g.dependency===o.name),l=[],u=0,d=[...a].sort((g,h)=>Sl(h.confidence)-Sl(g.confidence));for(let g of d){let h=t.impactSites.filter(y=>y.breakingChangeId===g.id);if(h.length===0){u++;continue}l.push({breaking:g,block:VV(g,h,t.evidence)})}let p=[];if(jV(c)&&p.push(HV(c)),l.length===0&&p.length===0){if(!n||!c)continue;p.push(KV(o,c))}let f=t.commits.find(g=>a.some(h=>g.breakingChangeIds.includes(h.id))),m=e.fixOf?.(o)??YV(f,t);if(r==="package"){i.push(El({change:o,blocks:[...l.map(g=>g.block),...p],upstreamOnlyCount:u,fix:m,repoBlobUrl:s}));continue}for(let{breaking:g,block:h}of l)if(r==="affectedSite"){let y=[h.primaryCandidate,...h.relatedCandidates].filter(w=>w!==void 0);for(let w of y)i.push(El({change:o,blocks:[{...h,primaryCandidate:w,relatedCandidates:[]}],upstreamOnlyCount:0,fix:m,ruleIdSuffix:`${g.id}/${FV(w)}`,ruleName:`${o.name}: ${$m(g.kind)}`,snippetOk:!0,repoBlobUrl:s}))}else i.push(El({change:o,blocks:[h],upstreamOnlyCount:0,fix:m,ruleIdSuffix:g.id,ruleName:`${o.name}: ${$m(g.kind)}`,snippetOk:!0,repoBlobUrl:s}));for(let g of p)i.push(El({change:o,blocks:[g],upstreamOnlyCount:0,fix:m,ruleIdSuffix:"other",repoBlobUrl:s}))}return i}function FV(t){return(0,Rm.createHash)("sha256").update(`${t.file}|${(t.excerpt??"").trim()}`).digest("hex").slice(0,10)}function jV(t){if(!t)return!1;let e=t.security;return e.checked&&(e.resolved.length>0||e.introduced.length>0||e.current.length>0)}function C_(t,e={}){let n=[];for(let r of t){if(!r.plan)continue;let s=()=>{if(r.plan.commits.length>0)return;let i=E_(r);if(i)return{description:r.breakingCount>0?"The upstream API changed, but no code in this repository was found to use the affected parts. Review before upgrading.":"Safe to upgrade \u2014 no breaking changes found.",command:i}};n.push(...Cm(r.plan,{...e,fixOf:s}))}return n}var qV={"removed-export":"Removed export used in this repository","renamed-export":"Renamed export used in this repository","moved-export":"Export moved to a different module","signature-change":"Call signature changed","type-change":"Type changed in a breaking way","behaviour-change":"Runtime behaviour changed","removed-endpoint":"API endpoint removed","changed-endpoint":"API endpoint changed","required-field-added":"New required field","default-change":"Default value changed","config-change":"Configuration shape changed","runtime-requirement":"Runtime requirement changed",unknown:"Unclassified breaking change"};function $m(t){return qV[t]??"Breaking change"}var Io={runtime:"dependency",dev:"devDependency",peer:"peerDependency",optional:"optionalDependency",transitive:"transitive dependency"};function UV(t){return Io[t]??t}var T_={error:2,warning:1,note:0};function BV(t){return t.reduce((e,n)=>T_[n]>T_[e]?n:e,"note")}function VV(t,e,n){let r=[...e].sort((u,d)=>Sl(d.confidence)-Sl(u.confidence)||u.file.localeCompare(d.file)||u.line-d.line),s=r[0],i=r.slice(1,1+_m),o=s.confidence,a=new Set(e.map(u=>u.file)),c=JV(t,n),l=[`**${$m(t.kind)}:** ${WV(t.summary,c)}`,"",`Upstream confidence: ${t.confidence}. Local confidence: ${o}`+(e.length>1?` (best of ${e.length} matches across ${a.size} file(s)).`:".")];return t.before&&t.after&&t.before!==t.after&&l.push("",`- \`${__(t.before,300)}\``,`+ \`${__(t.after,300)}\``),c&&l.push("",`Declaration source: ${c}`),{level:zV(t.confidence,o),lines:l,primaryCandidate:{file:s.file,line:s.line,excerpt:s.excerpt},relatedCandidates:i.map(u=>({file:u.file,line:u.line,excerpt:u.excerpt})),helpUri:c}}function __(t,e){return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function WV(t,e){return e?t.replace(/`([^`]+)`/g,(n,r)=>`[\`${r}\`](${e})`):t}function zV(t,e){return t==="high"&&e==="high"?"error":t==="high"||e==="high"||t==="medium"&&e==="medium"?"warning":"note"}function Sl(t){return t==="high"?2:t==="medium"?1:0}function HV(t){let e=t.security,n,r,s=[];if(e.current.length>0){n=`Currently affected by ${e.current.length} known ${Po(e.current.length,"advisory","advisories")}`;let o=$_(e.current);r=o==="critical"||o==="high"?"error":"warning",s.push(["**Currently affected:**",...e.current.map(a=>`- ${Tm(a)}`)].join(` +`))}else if(e.introduced.length>0){n=`Upgrading would introduce ${e.introduced.length} new known ${Po(e.introduced.length,"advisory","advisories")}`;let o=$_(e.introduced);r=o==="critical"||o==="high"?"error":"warning"}else n=`Resolves ${e.resolved.length} known ${Po(e.resolved.length,"advisory","advisories")}`,r="note";e.introduced.length>0&&s.push(["**Would introduce:**",...e.introduced.map(o=>`- ${Tm(o)}`)].join(` +`)),e.resolved.length>0&&s.push(["**Resolves:**",...e.resolved.map(o=>`- ${Tm(o)}`)].join(` +`));let i=[`**${n}**`];for(let o of s)i.push("",o);i.push("",`Drift's assessment: **${Gr[t.assessment.recommendation]}**.`);for(let o of t.assessment.reasons)i.push(`- ${o}`);return{level:r,lines:i,relatedCandidates:[],helpUri:e.current[0]?.url??e.introduced[0]?.url??e.resolved[0]?.url}}function KV(t,e){return{level:"note",lines:[`**Update available** (${t.to?`${t.from??"none"} \u2192 ${t.to}`:"removed"}), with no breaking changes or advisories found.`],relatedCandidates:[]}}function El(t){let{change:e,blocks:n,upstreamOnlyCount:r,fix:s,ruleIdSuffix:i,ruleName:o,snippetOk:a,repoBlobUrl:c}=t,l=pc(e),u=e.to?`${e.from??"none"} \u2192 ${e.to}`:"removed",d=n.some(b=>b.primaryCandidate),p=UV(e.kind),f=[l?`**${e.name}** (${e.ecosystem} ${p}) ${u} \u2014 ${l}`:`**${e.name}** (${e.ecosystem} ${p}) ${u}`];r>0&&f.push("",`${r} additional upstream breaking ${Po(r,"change does","changes do")} not reach code in this repository and ${Po(r,"is","are")} omitted here.`);let m=a?n.find(b=>b.primaryCandidate)?.primaryCandidate??{file:e.manifestPath,line:1}:{file:e.manifestPath,line:1},g=new Set([`${m.file}:${m.line}`]),h=[];for(let b of n){let k=b.primaryCandidate?[b.primaryCandidate,...b.relatedCandidates]:b.relatedCandidates;for(let _ of k){let G=`${_.file}:${_.line}`;if(!g.has(G)&&(g.add(G),h.push(_),h.length>=_m))break}if(h.length>=_m)break}let y=new Map(h.map((b,k)=>[`${b.file}:${b.line}`,k+1])),w=b=>{let k=y.get(`${b.file}:${b.line}`);return k!==void 0?`[\`${b.file}:${b.line}\`](${k})`:LV(b.file,b.line,c)},S=[f.join(` +`),...n.map(b=>{if(!b.primaryCandidate)return b.lines.join(` +`);let k=["**Seen at:**",`- ${w(b.primaryCandidate)}`,...b.relatedCandidates.map(_=>`- ${w(_)}`)];return[...b.lines,"","",...k].join(` +`)}),ZV(s,d)].join(` + +--- + +`);return{ruleId:i?`drift/${e.ecosystem}/${e.name}/${i}`:`drift/${e.ecosystem}/${e.name}`,ruleName:o??`${e.name}: dependency finding`,dependency:e.name,ecosystem:e.ecosystem,dependencyKind:e.kind,from:e.from,to:e.to,manifestPath:e.manifestPath,workspace:e.workspace,workspaceLabel:l,level:BV(n.map(b=>b.level)),message:S,primaryLocation:m,relatedLocations:h,snippetOk:a,fix:s,helpUri:n.find(b=>b.helpUri)?.helpUri}}function Po(t,e,n){return t===1?e:n}function $_(t){return t.reduce((e,n)=>pm(n.severity,e)<0?n.severity:e,"unknown")}function Tm(t){let e=t.fixedIn?`, fixed in ${t.fixedIn}`:"";return`[${t.id}](${t.url}) (${t.severity}${e}): ${t.summary}`}function JV(t,e){for(let n of t.citations){let r=e.find(s=>s.id===n)?.url;if(r)return r}}function YV(t,e){if(!t)return;let n=(t.codemod?.length??0)>0,r=(t.recipe?.length??0)>0;return n?{description:`Deterministic fix available: "${t.message}". Drift can commit this itself once approved.`}:r?{description:`A pinned community recipe resolves this: "${t.message}". Enable \`remediation.communityRecipes\` in drift.yml to let Drift apply it.`}:{description:e.risk==="none"?"No deterministic fix; comment `/drift apply` on Drift's approval issue for this plan to dispatch GitHub Copilot.":`No deterministic fix, and this plan carries risk: \`${e.risk}\`. Review the plan Drift filed, then comment \`/drift apply\` to dispatch a fix.`}}function ZV(t,e){return t?.url?`**Fix:** ${t.description} \u2192 ${t.url}`:t?.command?`**Fix:** ${t.description} Run: \`${t.command}\``:t?`**Fix:** ${t.description}`:e?"**Fix:** Drift did not produce a plan for this finding \u2014 see the workflow run for why.":"**Fix:** No action required; this is informational."}var A_={high:"\u{1F7E2} high",medium:"\u{1F7E1} medium",low:"\u{1F7E0} low"},XV={none:"\u26AA none",low:"\u{1F7E2} low",medium:"\u{1F7E1} medium",high:"\u{1F534} high"};function Oo(t,e){let n=[];return n.push(QV(t)),n.push(I_(t)),t.blockers.length>0&&n.push(O_(t)),t.warnings.length>0&&n.push(D_(t)),n.push(M_(t)),n.push(wm(t)),n.push(N_(t)),n.push(iW(t)),n.push(Em(t.gaps)),n.push(Sm(t)),n.push(L_(t)),n.push(oW(t,e)),n.push(G_(t)),n.filter(Boolean).join(` + +`)}function P_(t,e){let n=[];return n.push("## Drift found breaking changes that need your call"),n.push(t.blockers.length>0?"Drift analysed this dependency change and prepared a fix, then stopped. The reasons are listed below.":"Drift analysed this dependency change and prepared a fix. This repository runs in `approve` mode, so nothing has been changed yet."),n.push(I_(t)),t.blockers.length>0&&n.push(O_(t)),t.warnings.length>0&&n.push(D_(t)),n.push(M_(t)),n.push(wm(t)),n.push(N_(t)),n.push(Em(t.gaps)),n.push(Sm(t)),n.push(L_(t)),n.push(["## To proceed","","Comment `/drift apply` on this issue and Drift will create the branch and","hand the plan to GitHub Copilot, one commit at a time. You will get a pull","request to review \u2014 nothing merges automatically.","","Comment `/drift dismiss` to close this out.","","To stop being asked for changes like this, adjust `.github/drift.yml` \u2014 see the [configuration reference](https://github.com/trydrift/drift/blob/main/docs/configuration.md)."].join(` +`)),n.push(G_(t)),n.filter(Boolean).join(` + +`)}function QV(t){let e=new Set(t.changes.map(r=>r.workspace).filter(r=>r!==void 0));return["## Drift: dependency compatibility fix","",`${t.changes.map(r=>{let s=e.size>1?pc(r):null,i=r.kind==="runtime"?null:Io[r.kind];return`\`${r.name}\`${i?` _(${i})_`:""} ${r.from??"\u2014"} \u2192 **${r.to??"\u2014"}**${s?` _(in ${s})_`:""}`}).join(", ")}`,"",t.commits.length>0?`Drift found **${t.breakingChanges.length} breaking change(s)** affecting **${new Set(t.impactSites.map(r=>r.file)).size} file(s)** in this repository, and planned **${t.commits.length} commit(s)** to fix them.`:"Drift found no code in this repository affected by this change."].join(` +`)}function I_(t){let e=new Set(t.impactSites.map(n=>n.file)).size;return["| | |","|---|---|",`| **Risk** | ${XV[t.risk]??t.risk} |`,`| **Breaking changes** | ${t.breakingChanges.length} |`,`| **Impact sites** | ${t.impactSites.length} across ${e} file(s) |`,`| **Planned commits** | ${t.commits.length} |`,`| **Evidence sources** | ${eW(t.evidence)} |`,`| **Base branch** | \`${t.baseBranch}\` |`].join(` +`)}function eW(t){let e=new Map;for(let n of t)e.set(n.source,(e.get(n.source)??0)+1);return e.size===0?"none":[...e.entries()].map(([n,r])=>`${n} (${r})`).join(", ")}function O_(t){return["## \u26D4 Why Drift stopped","","Drift did not dispatch this automatically. Each reason below is a guardrail","from `.github/drift.yml`:","",...t.blockers.map(e=>`- ${e}`)].join(` +`)}function D_(t){return["## \u26A0\uFE0F Worth checking","",...t.warnings.map(e=>`- ${e}`)].join(` +`)}function M_(t){if(t.breakingChanges.length===0)return["## Breaking changes","","None identified from the available evidence."].join(` +`);let e=new Map(t.evidence.map(r=>[r.id,r])),n=["## Breaking changes",""];for(let r of t.breakingChanges){let s=t.impactSites.filter(a=>a.breakingChangeId===r.id).length,i=i_(r);n.push(`### ${A_[r.confidence]} \xB7 \`${r.dependency}\` \xB7 ${r.kind}`),n.push(""),n.push(r.summary),n.push(""),r.before&&r.after&&r.before!==r.after&&n.push("```diff",`- ${Am(r.before,300)}`,`+ ${Am(r.after,300)}`,"```",""),n.push(`**Verdict:** ${s_[i]}.`),n.push(""),n.push(a_(r)),n.push(""),r.assessment&&(n.push(o_(r.assessment)),n.push(""),n.push(c_(r.assessment)),n.push("")),r.symbols.length>0&&(n.push(`**Symbols:** ${r.symbols.map(a=>`\`${a}\``).join(", ")}`),n.push("")),n.push(s>0?`**Found in this repo:** ${s} location(s)`:r.assessment?.localImpact.penalties.some(a=>a.code==="localization-unavailable")?"**Found in this repo:** not searched \u2014 no checkout was available. This is not evidence the change is unused.":"**Found in this repo:** no usages found in the files that import this dependency \u2014 no fix planned"),n.push(""),n.push(...tW(r.remediation)),n.push("");let o=r.citations.map(a=>e.get(a)).filter(a=>a!==void 0);if(o.length>0){n.push("**Evidence:**");for(let a of o)n.push(`- ${F_(a)}`);n.push("")}}return n.join(` +`).trim()}function tW(t){let e=nW(t);return e.length===1?[`**Fix:** ${e[0]}`]:["**Fix:**","",...e]}function nW(t){let e=[],n=[],r=()=>{let s=n.join(" ").trim();n.length=0,s&&e.push(s)};for(let s of t.split(/\r?\n/)){let i=s.trim(),o=/^(before|after):(.*)$/i.exec(i);if(o){r(),e.push(`**${sW(o[1])}:**`,"",rW(o[2].trimStart()),"");continue}if(!i){r();continue}n.push(i)}return r(),e.filter((s,i,o)=>s||o[i-1]&&o[i+1])}function rW(t){let e=t.match(/`+/g)?.reduce((r,s)=>Math.max(r,s.length),2)??2,n="`".repeat(e+1);return[n,t,n].join(` +`)}function sW(t){return t&&`${t[0].toUpperCase()}${t.slice(1).toLowerCase()}`}function N_(t){if(t.commits.length===0)return["## Commit plan","","No commits planned \u2014 nothing in this repository is affected."].join(` `);let e=["## Commit plan","","Each commit addresses one concern. The graph below records only necessary","dependencies; commits in the same execution layer have disjoint file scope and","may run in parallel.",""];for(let n of t.commits){if(e.push(`**${n.order}. \`${n.message}\`**`),e.push(""),e.push(`Unit: \`${n.id}\``),e.push(`Layer: ${n.executionLayer}`),n.dependsOn.length>0&&(e.push(`Depends on: ${n.dependsOn.map(r=>`\`${r}\``).join(", ")}`),e.push(`Why: ${n.dependencyReasons.map(r=>`${r.reason}${r.evidence.length?` (${r.evidence.slice(0,3).join("; ")})`:""}`).join("; ")}`)),e.push(`Files: ${n.allowedFiles.map(r=>`\`${r}\``).join(", ")}`),(n.allowedSymbols??[]).length>0&&e.push(`Symbols: ${n.allowedSymbols.map(r=>`\`${r}\``).join(", ")}`),n.expectedChecks.length>0&&e.push(`Expected checks: ${n.expectedChecks.map(r=>r.kind).join(", ")}`),n.codemod?.length){let r=n.codemod.map(s=>`\`${s.from}\` \u2192 \`${s.to}\``).join(", ");e.push(`**Resolved deterministically** by Drift's codemod engine (${r}) \u2014 no model call was needed for this commit.`)}else if(n.recipe?.length){let r=[...new Map(n.recipe.map(i=>[`${i.provider}:${i.name}@${i.version}`,i])).values()],s=r.map(i=>`[\`${i.name}@${i.version}\`](${i.source}) from ${i.publisher} (${i.provider})`).join(", ");e.push(`**Community recipe available**: ${s} \u2014 ${r[0].migration}`)}e.push("")}return e.join(` -`).trim()}function M2(t){if(t.impactSites.length===0)return"";let e=new Map;for(let r of t.impactSites){let s=e.get(r.file);s?s.push(r):e.set(r.file,[r])}let n=["
",`All ${t.impactSites.length} impact site(s)`,""];for(let[r,s]of[...e.entries()].sort()){n.push(`**\`${r}\`**`),n.push("");for(let i of s.slice(0,25)){let o=i.enclosingSymbol?` (in \`${i.enclosingSymbol}\`)`:"";n.push(`- L${i.line}${o} \u2014 \`${i.excerpt}\` \xB7 ${BT[i.confidence]}`)}s.length>25&&n.push(`- \u2026and ${s.length-25} more in this file`),n.push("")}return n.push("
"),n.join(` -`)}function YT(t){if(t.evidence.length===0)return"";let e=["
",`Evidence Drift used (${t.evidence.length} source(s))`,"","Every finding above traces back to one of these. Open them to check the work.",""];for(let n of t.evidence)e.push(`#### ${XT(n)}`),e.push(""),e.push(`\`${n.source}\` \xB7 weight ${n.weight.toFixed(2)}`),e.push(""),e.push("```"),e.push(L2(n.content,2e3)),e.push("```"),e.push("");return e.push("
"),e.join(` -`)}function N2(t,e){let n=["Every edit corresponds to a breaking change listed above \u2014 no unrelated refactoring crept in","The fixes match what the cited evidence actually says","CI passes on this branch"];return t.impactSites.some(r=>r.file.includes("test"))&&n.push("Test changes update assertions to the new API rather than weakening them"),t.breakingChanges.some(r=>r.kind==="behaviour-change"||r.kind==="default-change")&&n.push("Behaviour changes were handled deliberately \u2014 these compile either way, so the type checker will not catch a wrong choice"),t.breakingChanges.some(r=>r.confidence==="low")&&n.push("Low-confidence findings were verified against the upstream source before accepting"),["## Review checklist","",...n.map(r=>`- [ ] ${r}`)].join(` -`)}function ZT(t){return["---","",jT({schemaVersion:qs,planId:t.id,planDigest:Yc(t),headSha:t.headSha,baseBranch:t.baseBranch}),"",`Generated by [Drift](https://github.com/trydrift/drift) \xB7 plan \`${t.id}\` \xB7 ${t.createdAt}
`,"Drift reads dependency changes, proves which ones break your code, and drives","GitHub Copilot to fix them. It never merges anything.
"].join(` -`)}function XT(t){let e=t.title;return t.url?`[${e}](${t.url})`:t.locator?`${e} (\`${t.locator}\`)`:e}function L2(t,e){return t.length<=e?t:`${t.slice(0,e)} -\u2026(truncated)`}function Qc(t){if(t.commits.length===0)return`No affected code found for ${t.changes.length} dependency change(s)`;let e=new Set(t.impactSites.map(n=>n.file)).size;return`${t.breakingChanges.length} breaking change(s), ${e} file(s) affected, ${t.commits.length} commit(s) planned (risk: ${t.risk})`}var ex="2022-11-28";async function tm(t){let{copilotToken:e,repo:n,plan:r,config:s,logger:i,dryRun:o=!1,baseUrl:a}=t,c=G2(r,s);if(o)return i.info("Dry run: not dispatching to Copilot. The prompt is in the run output."),{ok:!0,prompt:c};let l=`${a??"https://api.github.com"}/agents/repos/${n.owner}/${n.repo}/tasks`,u={prompt:c,head_ref:r.branchName,base_ref:r.baseBranch,create_pull_request:!1};s.remediation.model&&(u.model=s.remediation.model);try{let d=await fetch(l,{method:"POST",headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":ex,Authorization:`Bearer ${e}`,"Content-Type":"application/json","User-Agent":"drift-bot/0.1"},body:JSON.stringify(u)});if(!d.ok){let f=await V2(d);return{ok:!1,prompt:c,error:B2(d.status,f)}}let p=await d.json();return i.info(`Copilot task ${p.id} created (state: ${p.state})`),{ok:!0,prompt:c,task:{id:p.id??"unknown",state:p.state??"queued",pullRequestNumber:p.pull_request?.number,pullRequestUrl:p.pull_request?.html_url}}}catch(d){return{ok:!1,prompt:c,error:`Request to the Copilot agent API failed: ${d.message}`}}}async function QT(t){let{copilotToken:e,repo:n,taskId:r,baseUrl:s}=t,i=`${s??"https://api.github.com"}/agents/repos/${n.owner}/${n.repo}/tasks/${r}`;try{let o=await fetch(i,{headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":ex,Authorization:`Bearer ${e}`,"User-Agent":"drift-bot/0.1"}});if(!o.ok)return null;let a=await o.json();return{id:a.id??r,state:a.state??"unknown",pullRequestNumber:a.pull_request?.number,pullRequestUrl:a.pull_request?.html_url}}catch{return null}}function nm(t){return["completed","failed","timed_out","cancelled"].includes(t)}async function tx(t){let e=t.pollIntervalMs??3e4,n=t.sleep??(i=>new Promise(o=>setTimeout(o,i))),r=Date.now()+t.timeoutMs,s=await QT(t);for(;(!s||!nm(s.state))&&Date.now()",`All ${t.impactSites.length} impact site(s)`,""];for(let[r,s]of[...e.entries()].sort()){n.push(`**\`${r}\`**`),n.push("");for(let i of s.slice(0,25)){let o=i.enclosingSymbol?` (in \`${i.enclosingSymbol}\`)`:"";n.push(`- L${i.line}${o} \u2014 \`${i.excerpt}\` \xB7 ${A_[i.confidence]}`)}s.length>25&&n.push(`- \u2026and ${s.length-25} more in this file`),n.push("")}return n.push(""),n.join(` +`)}function L_(t){if(t.evidence.length===0)return"";let e=["
",`Evidence Drift used (${t.evidence.length} source(s))`,"","Every finding above traces back to one of these. Open them to check the work.",""];for(let n of t.evidence)e.push(`#### ${F_(n)}`),e.push(""),e.push(`\`${n.source}\` \xB7 weight ${n.weight.toFixed(2)}`),e.push(""),e.push("```"),e.push(Am(n.content,2e3)),e.push("```"),e.push("");return e.push("
"),e.join(` +`)}function oW(t,e){let n=["Every edit corresponds to a breaking change listed above \u2014 no unrelated refactoring crept in","The fixes match what the cited evidence actually says","CI passes on this branch"];return t.impactSites.some(r=>r.file.includes("test"))&&n.push("Test changes update assertions to the new API rather than weakening them"),t.breakingChanges.some(r=>r.kind==="behaviour-change"||r.kind==="default-change")&&n.push("Behaviour changes were handled deliberately \u2014 these compile either way, so the type checker will not catch a wrong choice"),t.breakingChanges.some(r=>r.confidence==="low")&&n.push("Low-confidence findings were verified against the upstream source before accepting"),["## Review checklist","",...n.map(r=>`- [ ] ${r}`)].join(` +`)}function G_(t){return["---","",l_({schemaVersion:Ks,planId:t.id,planDigest:hl(t),headSha:t.headSha,baseBranch:t.baseBranch}),"",`Generated by [Drift](https://github.com/trydrift/drift) \xB7 plan \`${t.id}\` \xB7 ${t.createdAt}
`,"Drift reads dependency changes, proves which ones break your code, and drives","GitHub Copilot to fix them. It never merges anything.
"].join(` +`)}function F_(t){let e=t.title;return t.url?`[${e}](${t.url})`:t.locator?`${e} (\`${t.locator}\`)`:e}function Am(t,e){return t.length<=e?t:`${t.slice(0,e)} +\u2026(truncated)`}function xl(t){if(t.commits.length===0)return`No affected code found for ${t.changes.length} dependency change(s)`;let e=new Set(t.impactSites.map(n=>n.file)).size;return`${t.breakingChanges.length} breaking change(s), ${e} file(s) affected, ${t.commits.length} commit(s) planned (risk: ${t.risk})`}var q_="2022-11-28";async function Pm(t){let{copilotToken:e,repo:n,plan:r,config:s,logger:i,dryRun:o=!1,baseUrl:a}=t,c=aW(r,s);if(o)return i.info("Dry run: not dispatching to Copilot. The prompt is in the run output."),{ok:!0,prompt:c};let l=`${a??"https://api.github.com"}/agents/repos/${n.owner}/${n.repo}/tasks`,u={prompt:c,head_ref:r.branchName,base_ref:r.baseBranch,create_pull_request:!1};s.remediation.model&&(u.model=s.remediation.model);try{let d=await fetch(l,{method:"POST",headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":q_,Authorization:`Bearer ${e}`,"Content-Type":"application/json","User-Agent":"drift-bot/0.1"},body:JSON.stringify(u)});if(!d.ok){let f=await fW(d);return{ok:!1,prompt:c,error:pW(d.status,f)}}let p=await d.json();return i.info(`Copilot task ${p.id} created (state: ${p.state})`),{ok:!0,prompt:c,task:{id:p.id??"unknown",state:p.state??"queued",pullRequestNumber:p.pull_request?.number,pullRequestUrl:p.pull_request?.html_url}}}catch(d){return{ok:!1,prompt:c,error:`Request to the Copilot agent API failed: ${d.message}`}}}async function j_(t){let{copilotToken:e,repo:n,taskId:r,baseUrl:s}=t,i=`${s??"https://api.github.com"}/agents/repos/${n.owner}/${n.repo}/tasks/${r}`;try{let o=await fetch(i,{headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":q_,Authorization:`Bearer ${e}`,"User-Agent":"drift-bot/0.1"}});if(!o.ok)return null;let a=await o.json();return{id:a.id??r,state:a.state??"unknown",pullRequestNumber:a.pull_request?.number,pullRequestUrl:a.pull_request?.html_url}}catch{return null}}function Im(t){return["completed","failed","timed_out","cancelled"].includes(t)}async function U_(t){let e=t.pollIntervalMs??3e4,n=t.sleep??(i=>new Promise(o=>setTimeout(o,i))),r=Date.now()+t.timeoutMs,s=await j_(t);for(;(!s||!Im(s.state))&&Date.now()`- \`${r.name}\` (${r.ecosystem}): ${r.from??"\u2014"} \u2192 ${r.to??"\u2014"} [${r.bump}]`)].join(` -`)),n.push(j2(t)),n.push(F2(t)),n.push(q2(t,e)),e.remediation.customInstructions.trim()&&n.push(["## Repository-specific instructions","",e.remediation.customInstructions.trim()].join(` -`)),n.push(U2(t)),n.join(` +`)),n.push(cW(t)),n.push(lW(t)),n.push(uW(t,e)),e.remediation.customInstructions.trim()&&n.push(["## Repository-specific instructions","",e.remediation.customInstructions.trim()].join(` +`)),n.push(dW(t)),n.join(` -`)}function j2(t){let e=new Map(t.evidence.map(r=>[r.id,r])),n=["## What broke, and why we know"];n.push(""),n.push("Each finding below was derived from upstream evidence, quoted so you can verify it","rather than relying on recollection of this package\u2019s API."),n.push("");for(let r of t.breakingChanges)if(t.impactSites.filter(i=>i.breakingChangeId===r.id).length!==0){n.push(`### ${r.summary}`),n.push(""),n.push(`- Dependency: \`${r.dependency}\``),n.push(`- Kind: ${r.kind}`),n.push(`- Confidence: ${r.confidence}`),r.symbols.length&&n.push(`- Affected symbols: ${r.symbols.map(i=>`\`${i}\``).join(", ")}`),n.push(""),n.push(`**Required fix:** ${r.remediation}`),n.push("");for(let i of r.citations){let o=e.get(i);o&&(n.push(`
Evidence: ${o.title}`),n.push(""),n.push("```"),n.push(W2(o.content,1500)),n.push("```"),o.url&&n.push(`Source: ${o.url}`),n.push(""),n.push("
"),n.push(""))}}return n.join(` -`).trim()}function F2(t){let e=["## Commit plan \u2014 follow this exactly","","Make these commits by execution layer. Commits in the same layer are independent;","a later layer must wait for every dependency listed on its units. Each one addresses","a single concern so a human can review, approve, or revert it independently.","**Do not squash them, do not reorder dependency edges, and do not combine unrelated edits into one commit.**",""];for(let n of t.commits)e.push("---"),e.push(""),e.push(`### Commit ${n.order}: \`${n.message}\``),e.push(""),e.push(`- Unit id: \`${n.id}\``),e.push(`- Execution layer: ${n.executionLayer}`),n.dependsOn.length>0&&(e.push(`- Depends on: ${n.dependsOn.map(r=>`\`${r}\``).join(", ")}`),e.push(`- Dependency reasons: ${n.dependencyReasons.map(r=>`${r.reason} (${r.evidence.slice(0,3).join("; ")})`).join("; ")}`)),n.expectedChecks.length>0&&e.push(`- Expected checks: ${n.expectedChecks.map(r=>r.kind).join(", ")}`),e.push(""),e.push("Commit message body:"),e.push(""),e.push("```"),e.push(n.body),e.push("```"),e.push(""),e.push(`Files this commit may touch: ${n.allowedFiles.map(r=>`\`${r}\``).join(", ")}`),e.push(""),e.push(n.instructions),e.push("");return e.join(` -`).trim()}function q2(t,e){let n=["Change only what is required to make this repository work with the new dependency version. No refactoring, renaming, reformatting, or tidying of code you happen to pass by.","Do not modify dependency versions in any manifest or lockfile. The upgrade is the input to this task, not part of it.","Verify each fix against the evidence quoted above and against the installed version of the package in this repository. If the evidence does not name a replacement API, look it up in the installed package rather than inventing one.","If you cannot determine the correct fix for a location, leave the code as it is, add a clearly-marked `TODO(drift):` comment explaining what is unresolved, and say so in the pull request description. A flagged unknown is useful; a confident guess is not.","Run the repository\u2019s existing tests and build after each commit where that is possible."];e.guardrails.forbidTestWeakening&&n.push("Do not weaken, skip, or delete tests to make them pass. If a test fails because the API changed, update the test to exercise the new API while asserting the same behaviour. If a test fails for a reason you cannot resolve that way, leave it failing and explain why.");let r=e.guardrails.protectedPaths;return r.length>0&&n.push(`Do not modify files matching any of these patterns: ${r.map(s=>`\`${s}\``).join(", ")}.`),t.warnings.length>0&&n.push(`Drift flagged the following for human attention; be conservative around them: ${t.warnings.join(" ")}`),["## Rules","",...n.map((s,i)=>`${i+1}. ${s}`)].join(` -`)}function U2(t){return["## When you are done","","Open a pull request into `"+t.baseBranch+"`. In the description, include:","","- A short summary of what changed and why.","- One line per commit, mapping it to the breaking change it addresses.","- **Anything you could not fix, or fixed with low confidence.** This is the most"," important part of the description: the reviewer needs to know where to look.","- Any place where you had to choose between plausible interpretations, and which"," one you chose.","","Do not merge the pull request."].join(` -`)}function B2(t,e){switch(t){case 401:return"Copilot rejected the token (401). Check that DRIFT_COPILOT_TOKEN is set and has not expired.";case 403:return`Copilot denied the request (403). The most common causes, in the order worth checking: the token lacks the "Agent tasks: read and write" permission (this is the only permission the endpoint checks, and it is not implied by contents/issues/pull-request access); the token is a GitHub App installation token, which is not supported at all; the account has no Copilot seat, or a plan that cannot call this endpoint \u2014 it is in public preview and GitHub decides which plans may (see https://docs.github.com/en/rest/agent-tasks/agent-tasks); or the coding agent is disabled for this repository. Detail: ${e}`;case 404:return"The Copilot agent API returned 404. Either the coding agent is not enabled for this repository, or the token lacks access to it.";case 422:return`Copilot rejected the request as invalid (422): ${e}`;case 429:return"Copilot rate-limited the request (429). Try again shortly.";default:return`Copilot agent API returned ${t}: ${e}`}}async function V2(t){try{return(await t.text()).slice(0,500)}catch{return"(no response body)"}}function W2(t,e){return t.length<=e?t:`${t.slice(0,e)} -\u2026(truncated)`}var xo=require("node:fs/promises"),el=require("node:path");function nx(t,e){return t.codemod?"builtin":e&&t.recipe?"community-recipe":"ai"}function rx(t,e){let n=new Set(e.map(s=>s.id)),r=new Set(e.flatMap(s=>s.breakingChangeIds));return{...t,commits:t.commits.filter(s=>n.has(s.id)),breakingChanges:t.breakingChanges.filter(s=>r.has(s.id))}}function sx(t,e){let n=new Map(e);for(let o of t.codemod??[])for(let a of o.files){let c=n.get(a);c!==void 0&&n.set(a,D_(c,o,a))}let r=[];for(let[o,a]of e){let c=n.get(o);c!==void 0&&c!==a&&r.push({path:o,content:c})}if(r.length===0)return{status:"no-changes",edits:[],message:"The deterministic fix produced no changes here \u2014 likely already applied by an earlier commit."};let s=new Set(r.map(o=>o.path)).size,i=t.codemod?.length??0;return{status:"applied",edits:r,message:`Applied ${i} deterministic rename${i===1?"":"s"} across ${s} file${s===1?"":"s"} \u2014 no agent call was made.`}}async function ox(t,e,n={}){let r=n.exec??At,s=await r("git",["status","--porcelain"],{cwd:e});if(s.failure)return{status:"failed",changedFiles:[],message:"Could not inspect the worktree before running the recipe."};let i=ax(s.stdout||""),o=await cx(e,[...i.keys()],r),a=z2(t);if(!a)return{status:"failed",changedFiles:[],message:`Drift does not know how to run a "${t.provider}" recipe.`};n.logger?.info(`Running community recipe ${t.name}@${t.version} (${t.provider})`);let c=await r(a.bin,a.args,{cwd:e,timeoutMs:3e5});if(c.failure||c.code!==0){let u=c.failure==="not-found"?`${a.bin} is not installed`:c.stderr.trim()||c.stdout.trim();return{status:"failed",changedFiles:await ix(e,i,o,r),message:`Recipe ${t.name}@${t.version} failed: ${u||`exit code ${c.code}`}`.trim()}}let l=await ix(e,i,o,r);return l.length===0?{status:"no-changes",changedFiles:[],message:`Recipe ${t.name}@${t.version} made no changes here.`}:{status:"applied",changedFiles:l,message:`Applied community recipe ${t.name}@${t.version} from ${t.publisher} \u2014 no agent call was made.`}}function ax(t){let e=new Map;for(let n of t.split(` -`)){let r=n.trimEnd();if(!r.trim())continue;let s=r.slice(0,2),i=r.slice(2).trim(),o=i.indexOf(" -> ");o!==-1&&(i=i.slice(o+4).trim()),i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1)),i&&e.set(i,s)}return e}async function cx(t,e,n){let r=new Map;for(let s of e){let i=await n("git",["hash-object","--",s],{cwd:t});!i.failure&&i.code===0&&r.set(s,i.stdout.trim())}return r}async function ix(t,e,n,r){let s=await r("git",["status","--porcelain"],{cwd:t}),i=ax(s.stdout||""),o=new Set,a=[];for(let[l,u]of i)e.get(l)!==u?o.add(l):a.push(l);let c=await cx(t,a,r);for(let l of a)n.get(l)!==c.get(l)&&o.add(l);return[...o]}function z2(t){switch(t.provider){case"codemod.com":return{bin:"npx",args:["--yes","codemod@latest","run",`${t.name}@${t.version}`]};case"openrewrite":return{bin:"mvn",args:["-q","org.openrewrite.maven:rewrite-maven-plugin:run",`-Drewrite.activeRecipes=${t.name}`,`-Drewrite.recipeArtifactCoordinates=${t.source}:${t.version}`]};default:return null}}async function lx(t){let{repo:e,plan:n,config:r,github:s,logger:i}=t,o=t.exec??At,a=new Set;if(!e.workspace)return{committedIds:a};for(let c of n.commits){let l=nx(c,r.remediation.communityRecipes);if(l!=="ai")try{if(l==="builtin"){let f=await H2(e.workspace,c);if(!f){await To(e.workspace,c.files,o);continue}await s.commitFiles(e,n.branchName,f.edits,`${c.message} +`)}function cW(t){let e=new Map(t.evidence.map(r=>[r.id,r])),n=["## What broke, and why we know"];n.push(""),n.push("Each finding below was derived from upstream evidence, quoted so you can verify it","rather than relying on recollection of this package\u2019s API."),n.push("");for(let r of t.breakingChanges)if(t.impactSites.filter(i=>i.breakingChangeId===r.id).length!==0){n.push(`### ${r.summary}`),n.push(""),n.push(`- Dependency: \`${r.dependency}\``),n.push(`- Kind: ${r.kind}`),n.push(`- Confidence: ${r.confidence}`),r.symbols.length&&n.push(`- Affected symbols: ${r.symbols.map(i=>`\`${i}\``).join(", ")}`),n.push(""),n.push(`**Required fix:** ${r.remediation}`),n.push("");for(let i of r.citations){let o=e.get(i);o&&(n.push(`
Evidence: ${o.title}`),n.push(""),n.push("```"),n.push(mW(o.content,1500)),n.push("```"),o.url&&n.push(`Source: ${o.url}`),n.push(""),n.push("
"),n.push(""))}}return n.join(` +`).trim()}function lW(t){let e=["## Commit plan \u2014 follow this exactly","","Make these commits by execution layer. Commits in the same layer are independent;","a later layer must wait for every dependency listed on its units. Each one addresses","a single concern so a human can review, approve, or revert it independently.","**Do not squash them, do not reorder dependency edges, and do not combine unrelated edits into one commit.**",""];for(let n of t.commits)e.push("---"),e.push(""),e.push(`### Commit ${n.order}: \`${n.message}\``),e.push(""),e.push(`- Unit id: \`${n.id}\``),e.push(`- Execution layer: ${n.executionLayer}`),n.dependsOn.length>0&&(e.push(`- Depends on: ${n.dependsOn.map(r=>`\`${r}\``).join(", ")}`),e.push(`- Dependency reasons: ${n.dependencyReasons.map(r=>`${r.reason} (${r.evidence.slice(0,3).join("; ")})`).join("; ")}`)),n.expectedChecks.length>0&&e.push(`- Expected checks: ${n.expectedChecks.map(r=>r.kind).join(", ")}`),e.push(""),e.push("Commit message body:"),e.push(""),e.push("```"),e.push(n.body),e.push("```"),e.push(""),e.push(`Files this commit may touch: ${n.allowedFiles.map(r=>`\`${r}\``).join(", ")}`),e.push(""),e.push(n.instructions),e.push("");return e.join(` +`).trim()}function uW(t,e){let n=["Change only what is required to make this repository work with the new dependency version. No refactoring, renaming, reformatting, or tidying of code you happen to pass by.","Do not modify dependency versions in any manifest or lockfile. The upgrade is the input to this task, not part of it.","Verify each fix against the evidence quoted above and against the installed version of the package in this repository. If the evidence does not name a replacement API, look it up in the installed package rather than inventing one.","If you cannot determine the correct fix for a location, leave the code as it is, add a clearly-marked `TODO(drift):` comment explaining what is unresolved, and say so in the pull request description. A flagged unknown is useful; a confident guess is not.","Run the repository\u2019s existing tests and build after each commit where that is possible."];e.guardrails.forbidTestWeakening&&n.push("Do not weaken, skip, or delete tests to make them pass. If a test fails because the API changed, update the test to exercise the new API while asserting the same behaviour. If a test fails for a reason you cannot resolve that way, leave it failing and explain why.");let r=e.guardrails.protectedPaths;return r.length>0&&n.push(`Do not modify files matching any of these patterns: ${r.map(s=>`\`${s}\``).join(", ")}.`),t.warnings.length>0&&n.push(`Drift flagged the following for human attention; be conservative around them: ${t.warnings.join(" ")}`),["## Rules","",...n.map((s,i)=>`${i+1}. ${s}`)].join(` +`)}function dW(t){return["## When you are done","","Open a pull request into `"+t.baseBranch+"`. In the description, include:","","- A short summary of what changed and why.","- One line per commit, mapping it to the breaking change it addresses.","- **Anything you could not fix, or fixed with low confidence.** This is the most"," important part of the description: the reviewer needs to know where to look.","- Any place where you had to choose between plausible interpretations, and which"," one you chose.","","Do not merge the pull request."].join(` +`)}function pW(t,e){switch(t){case 401:return"Copilot rejected the token (401). Check that DRIFT_COPILOT_TOKEN is set and has not expired.";case 403:return`Copilot denied the request (403). The most common causes, in the order worth checking: the token lacks the "Agent tasks: read and write" permission (this is the only permission the endpoint checks, and it is not implied by contents/issues/pull-request access); the token is a GitHub App installation token, which is not supported at all; the account has no Copilot seat, or a plan that cannot call this endpoint \u2014 it is in public preview and GitHub decides which plans may (see https://docs.github.com/en/rest/agent-tasks/agent-tasks); or the coding agent is disabled for this repository. Detail: ${e}`;case 404:return"The Copilot agent API returned 404. Either the coding agent is not enabled for this repository, or the token lacks access to it.";case 422:return`Copilot rejected the request as invalid (422): ${e}`;case 429:return"Copilot rate-limited the request (429). Try again shortly.";default:return`Copilot agent API returned ${t}: ${e}`}}async function fW(t){try{return(await t.text()).slice(0,500)}catch{return"(no response body)"}}function mW(t,e){return t.length<=e?t:`${t.slice(0,e)} +\u2026(truncated)`}var Mo=require("node:fs/promises"),Tl=require("node:path");function B_(t,e){return t.codemod?"builtin":e&&t.recipe?"community-recipe":"ai"}function V_(t,e){let n=new Set(e.map(s=>s.id)),r=new Set(e.flatMap(s=>s.breakingChangeIds));return{...t,commits:t.commits.filter(s=>n.has(s.id)),breakingChanges:t.breakingChanges.filter(s=>r.has(s.id))}}function W_(t,e){let n=new Map(e);for(let o of t.codemod??[])for(let a of o.files){let c=n.get(a);c!==void 0&&n.set(a,oT(c,o,a))}let r=[];for(let[o,a]of e){let c=n.get(o);c!==void 0&&c!==a&&r.push({path:o,content:c})}if(r.length===0)return{status:"no-changes",edits:[],message:"The deterministic fix produced no changes here \u2014 likely already applied by an earlier commit."};let s=new Set(r.map(o=>o.path)).size,i=t.codemod?.length??0;return{status:"applied",edits:r,message:`Applied ${i} deterministic rename${i===1?"":"s"} across ${s} file${s===1?"":"s"} \u2014 no agent call was made.`}}async function H_(t,e,n={}){let r=n.exec??It,s=await r("git",["status","--porcelain"],{cwd:e});if(s.failure)return{status:"failed",changedFiles:[],message:"Could not inspect the worktree before running the recipe."};let i=K_(s.stdout||""),o=await J_(e,[...i.keys()],r),a=gW(t);if(!a)return{status:"failed",changedFiles:[],message:`Drift does not know how to run a "${t.provider}" recipe.`};n.logger?.info(`Running community recipe ${t.name}@${t.version} (${t.provider})`);let c=await r(a.bin,a.args,{cwd:e,timeoutMs:3e5});if(c.failure||c.code!==0){let u=c.failure==="not-found"?`${a.bin} is not installed`:c.stderr.trim()||c.stdout.trim();return{status:"failed",changedFiles:await z_(e,i,o,r),message:`Recipe ${t.name}@${t.version} failed: ${u||`exit code ${c.code}`}`.trim()}}let l=await z_(e,i,o,r);return l.length===0?{status:"no-changes",changedFiles:[],message:`Recipe ${t.name}@${t.version} made no changes here.`}:{status:"applied",changedFiles:l,message:`Applied community recipe ${t.name}@${t.version} from ${t.publisher} \u2014 no agent call was made.`}}function K_(t){let e=new Map;for(let n of t.split(` +`)){let r=n.trimEnd();if(!r.trim())continue;let s=r.slice(0,2),i=r.slice(2).trim(),o=i.indexOf(" -> ");o!==-1&&(i=i.slice(o+4).trim()),i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1)),i&&e.set(i,s)}return e}async function J_(t,e,n){let r=new Map;for(let s of e){let i=await n("git",["hash-object","--",s],{cwd:t});!i.failure&&i.code===0&&r.set(s,i.stdout.trim())}return r}async function z_(t,e,n,r){let s=await r("git",["status","--porcelain"],{cwd:t}),i=K_(s.stdout||""),o=new Set,a=[];for(let[l,u]of i)e.get(l)!==u?o.add(l):a.push(l);let c=await J_(t,a,r);for(let l of a)n.get(l)!==c.get(l)&&o.add(l);return[...o]}function gW(t){switch(t.provider){case"codemod.com":return{bin:"npx",args:["--yes","codemod@latest","run",`${t.name}@${t.version}`]};case"openrewrite":return{bin:"mvn",args:["-q","org.openrewrite.maven:rewrite-maven-plugin:run",`-Drewrite.activeRecipes=${t.name}`,`-Drewrite.recipeArtifactCoordinates=${t.source}:${t.version}`]};default:return null}}async function Y_(t){let{repo:e,plan:n,config:r,github:s,logger:i}=t,o=t.exec??It,a=new Set;if(!e.workspace)return{committedIds:a};for(let c of n.commits){let l=B_(c,r.remediation.communityRecipes);if(l!=="ai")try{if(l==="builtin"){let f=await hW(e.workspace,c);if(!f){await Do(e.workspace,c.files,o);continue}await s.commitFiles(e,n.branchName,f.edits,`${c.message} ${c.body} -${f.message}`)?(a.add(c.id),i.info(`Resolved commit ${c.order} directly (builtin): ${f.message}`)):await To(e.workspace,c.files,o);continue}let u=await K2(e.workspace,c,o,i),d=u.touched.length>0?u.touched:c.files;if(!u.edits){await To(e.workspace,d,o);continue}await s.commitFiles(e,n.branchName,u.edits,`${c.message} +${f.message}`)?(a.add(c.id),i.info(`Resolved commit ${c.order} directly (builtin): ${f.message}`)):await Do(e.workspace,c.files,o);continue}let u=await yW(e.workspace,c,o,i),d=u.touched.length>0?u.touched:c.files;if(!u.edits){await Do(e.workspace,d,o);continue}await s.commitFiles(e,n.branchName,u.edits,`${c.message} ${c.body} -${u.message}`)?(a.add(c.id),i.info(`Resolved commit ${c.order} directly (recipe): ${u.message}`)):await To(e.workspace,d,o)}catch(u){i.warn(`Deterministic remediation failed for commit ${c.order}, falling back to an agent: ${u.message}`),await To(e.workspace,c.files,o)}}return{committedIds:a}}async function H2(t,e){let n=new Map;for(let s of e.files)try{n.set(s,await(0,xo.readFile)((0,el.join)(t,s),"utf8"))}catch{}let r=sx(e,n);if(r.status!=="applied")return null;for(let s of r.edits)await(0,xo.writeFile)((0,el.join)(t,s.path),s.content,"utf8");return{edits:r.edits,message:r.message}}async function K2(t,e,n,r){let s=J2(e.recipe??[]);if(s.length===0)return{edits:null,message:"",touched:[]};let i=new Set([...e.allowedFiles,...e.files]),o=new Set,a=[];for(let u of s){let d=await ox(u,t,{exec:n,logger:r});for(let p of d.changedFiles)o.add(p);if(d.status==="failed")return r.warn(`Community recipe ${u.name}@${u.version} failed: ${d.message}`),{edits:null,message:"",touched:[...o]};d.status==="applied"&&a.push(d.message)}if(o.size===0)return{edits:null,message:"",touched:[]};let c=[...o].filter(u=>!i.has(u));if(c.length>0)return r.warn(`Community recipe for commit ${e.order} touched file(s) outside its scope (${c.join(", ")}); discarding and falling back to an agent.`),{edits:null,message:"",touched:[...o]};let l=[];for(let u of o)try{l.push({path:u,content:await(0,xo.readFile)((0,el.join)(t,u),"utf8")})}catch{}return l.length===0?{edits:null,message:"",touched:[...o]}:{edits:l,message:a.join(" ")||"Applied community recipe(s).",touched:[...o]}}function J2(t){let e=new Map;for(let n of t)e.set(`${n.provider}:${n.name}@${n.version}`,n);return[...e.values()]}async function To(t,e,n){e.length!==0&&await n("git",["checkout","--",...e],{cwd:t})}var nl="drift";async function rl(t){let{repo:e,plan:n,config:r,github:s,logger:i,copilotToken:o,dryRun:a=!1,approved:c=!1}=t;if(n.commits.length===0&&n.blockers.length===0)return i.info("No affected code found; nothing to dispatch."),await tl(t,"success","No action needed"),{status:"skipped",planId:n.id,message:"Dependency changed, but no code in this repository uses the affected APIs."};if(!(c?n.blockers.length===0:aT(n,r)))return rm(t);if(a){i.info(`Dry run: would dispatch ${n.commits.length} commit(s) on ${n.branchName}`);let w=o?await tm({copilotToken:o,repo:e,plan:n,config:r,logger:i,dryRun:!0}):void 0;return w&&i.debug("Copilot prompt preview",{length:w.prompt.length}),{status:"skipped",planId:n.id,branchName:n.branchName,message:`Dry run \u2014 no changes made. Would create branch \`${n.branchName}\` and resolve ${n.commits.length} commit(s) (deterministically where possible, otherwise via agent).`}}if(!await s.createBranch(e,n.branchName,e.afterSha))return{status:"failed",planId:n.id,message:`Could not create branch \`${n.branchName}\`. Check that the token has \`contents: write\`.`};let{committedIds:d}=await lx({repo:e,plan:n,config:r,github:s,logger:i,exec:t.exec}),p=n.commits.filter(w=>!d.has(w.id));if(p.length===0){i.info(`Resolved all ${n.commits.length} commit(s) deterministically; no agent was dispatched.`),await tl(t,"success",`Resolved ${n.commits.length} breaking change commit(s) without an agent`);let w=await ux(t,void 0,void 0);return{status:"dispatched",planId:n.id,branchName:n.branchName,pullRequestNumber:w?.number,pullRequestUrl:w?.url,message:w?`Resolved ${n.commits.length} commit(s) on \`${n.branchName}\` deterministically \u2014 no agent call was made. Tracked in pull request #${w.number} into \`${n.baseBranch}\`.`:`Resolved ${n.commits.length} commit(s) on \`${n.branchName}\` deterministically \u2014 no agent call was made. A pull request into \`${n.baseBranch}\` will follow.`}}if(d.size>0&&i.info(`Resolved ${d.size} commit(s) deterministically; dispatching the remaining ${p.length} to Copilot.`),!o)return i.warn("Drift is in auto mode with commit(s) that need an agent, but no Copilot token is available. Falling back to approval."),rm({...t,plan:{...n,blockers:[...n.blockers,"No Copilot token was available. Set the `DRIFT_COPILOT_TOKEN` secret to a user-scoped fine-grained token with `Agent tasks: read and write` \u2014 that is the only permission the Agent Tasks endpoint checks. The Copilot agent API does not accept GitHub App installation tokens."]}});let f=rx(n,p),m=await tm({copilotToken:o,repo:e,plan:f,config:r,logger:i});if(!m.ok)return i.error(`Copilot dispatch failed: ${m.error}`),{...await rm({...t,plan:{...n,blockers:[...n.blockers,m.error??"Copilot dispatch failed."]}}),status:"failed",message:m.error??"Copilot dispatch failed."};await tl(t,"neutral",`Copilot is fixing ${f.breakingChanges.length} breaking change(s)`);let g=m.task;i.info(`Dispatched to Copilot: task ${g?.id??"unknown"} on ${n.branchName}`);let h=await ux(t,g?.pullRequestNumber,g?.pullRequestUrl),y=d.size>0?`${d.size} commit(s) resolved deterministically; `:"";return{status:"dispatched",planId:n.id,branchName:n.branchName,taskId:g?.id,pullRequestNumber:h?.number??g?.pullRequestNumber,pullRequestUrl:h?.url??g?.pullRequestUrl,message:h?`${y}Copilot is working on ${p.length} commit(s) on \`${n.branchName}\`, tracked in pull request #${h.number} into \`${n.baseBranch}\`.`:`${y}Copilot is working on ${p.length} commit(s) on \`${n.branchName}\`. A pull request into \`${n.baseBranch}\` will follow.`}}async function ux(t,e,n){let{repo:r,plan:s,config:i,github:o,logger:a}=t;if(e&&n)return{number:e,url:n};if(!i.pullRequest.enabled)return a.info("pullRequest.enabled is false; leaving the branch without a pull request."),null;let c=i.pullRequest.base==="default-branch"?await o.getDefaultBranch(r.owner,r.repo)??s.baseBranch:s.baseBranch;if(c===s.branchName)return null;let l=await o.createPullRequest(r,{head:s.branchName,base:c,title:H_({changes:s.changes},{title:i.pullRequest.titleTemplate,prefix:i.remediation.branchPrefix}),body:_o(s,i),draft:uy(i),labels:[nl,...i.pullRequest.labels],reviewers:i.pullRequest.reviewers});return l?{number:l.number,url:l.url}:null}async function rm(t){let{repo:e,plan:n,config:r,github:s,logger:i,dryRun:o=!1}=t,a=n.blockers.length>0?`blocked by ${n.blockers.length} guardrail(s)`:`mode is \`${r.mode}\``;if(i.info(`Requesting human approval (${a})`),await tl(t,"action_required","Drift needs your approval"),o)return{status:"blocked",planId:n.id,message:`Dry run \u2014 would open an approval issue (${a}).`};let c=await s.findOpenPlanIssue(e,n.id);if(c!==null)return i.info(`Plan ${n.id} already filed as issue #${c}; not duplicating`),{status:"blocked",planId:n.id,approvalIssueNumber:c,message:`Already awaiting approval in #${c}.`};let l=await s.createIssue(e,{title:Y2(n),body:VT(n,r),labels:[nl,`drift:risk-${n.risk}`]});return l?{status:"blocked",planId:n.id,approvalIssueNumber:l.number,message:`Awaiting approval in #${l.number} (${a}). Comment \`/drift apply\` to proceed.`}:{status:"failed",planId:n.id,message:"Could not open an approval issue. Check that the token has `issues: write`."}}function Y2(t){if(t.changes.length===1){let e=t.changes[0];return`[Drift] ${e.name} ${e.from??"\u2014"} \u2192 ${e.to??"\u2014"} needs ${t.commits.length} fix(es)`}return`[Drift] ${t.changes.length} dependency updates need ${t.commits.length} fix(es)`}async function tl(t,e,n){let{repo:r,plan:s,config:i,github:o,dryRun:a}=t;a||await o.createCheckRun(r,{name:"Drift",conclusion:e,title:n,summary:Qc(s),text:_o(s,i)})}var dx=require("node:crypto"),Z2=1,X2=new Set(["sourceCode","code","snippet","excerpt","file","filePath","path","paths","rawPath","repository","repo","owner","organization","org","secret","token","prompt","modelResponse","stdout","stderr","output","fullOutput","commandOutput"]);function px(t,e=process.env){return e.DRIFT_TELEMETRY_DISABLED==="1"||e.DRIFT_TELEMETRY_DISABLED==="true"||e.DO_NOT_TRACK==="1"?!1:!!(t.enabled&&t.endpoint)}function fx(t){let e=t.now??new Date,n=t.rotationSalt??rV(e),r={schemaVersion:Z2,event:"upgrade_outcome",occurredAt:e.toISOString(),installation:{idHash:eV(t.installationId??"anonymous-local-install",n),rotation:n},dependencies:t.plan.changes.map(s=>({ecosystem:s.ecosystem,package:s.name,oldVersion:s.from,newVersion:s.to})),taxonomy:t.plan.breakingChanges.map(Q2),evidenceSourceClasses:[...new Set(t.plan.evidence.map(s=>s.source))].sort(),confidenceBands:t.plan.breakingChanges.map(s=>({upstream:s.assessment?.upstream.band??"none",localImpact:s.assessment?.localImpact.band??"none",verification:s.assessment?.verification.band??"none"})),gaps:t.plan.gaps.map(s=>({stage:s.stage,...s.ecosystem?{ecosystem:s.ecosystem}:{},...s.dependency?{dependency:s.dependency}:{},reason:s.reason,severity:s.severity,consequence:s.automaticExecution})),checks:tV(t.checks??[]),agentType:t.agentType??"none",executionResult:t.result?.status??"not-dispatched",...t.userAction?{userAction:t.userAction}:{},featureFlags:nV(t.featureFlags??{}),latencyMs:t.latencyMs??0,costUsd:t.costUsd??0,...t.retentionDays!==void 0?{retentionDays:t.retentionDays}:{}};return mx(r),r}function Q2(t){return t.taxonomy?{nature:t.taxonomy.nature,detectability:[...t.taxonomy.detectability].sort(),scope:t.taxonomy.scope,visibility:[...t.taxonomy.visibility].sort()}:{nature:"unknown",detectability:["external-observation"],scope:"ecosystem",visibility:["unknown"]}}function mx(t){sm(t,[])}function eV(t,e){return(0,dx.createHash)("sha256").update(`drift:${e}:${t}`).digest("hex")}async function gx(t,e){if(e.env?.DRIFT_TELEMETRY_DISABLED==="1"||e.env?.DO_NOT_TRACK==="1")return{sent:!1,reason:"telemetry disabled by environment"};mx(t);let n=await(e.fetch??fetch)(e.endpoint,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)});return{sent:n.ok,status:n.status}}function tV(t){return{run:t.filter(e=>e.status==="passed"||e.status==="failed").length,passed:t.filter(e=>e.status==="passed").length,failed:t.filter(e=>e.status==="failed").length,notRun:t.filter(e=>e.status==="not-run").length,cancelled:t.filter(e=>e.status==="cancelled").length}}function nV(t){return Object.fromEntries(Object.entries(t).sort(([e],[n])=>e.localeCompare(n)).map(([e,n])=>[e,n?"on":"off"]))}function rV(t){return`${t.getUTCFullYear()}-${String(t.getUTCMonth()+1).padStart(2,"0")}`}function sm(t,e){if(t!=null){if(typeof t=="string"){if(/-----BEGIN (RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/.test(t))throw new Error(`Telemetry field ${e.join(".")} looks like a private key.`);return}if(typeof t=="object"){if(Array.isArray(t)){t.forEach((n,r)=>sm(n,[...e,String(r)]));return}for(let[n,r]of Object.entries(t)){if(X2.has(n))throw new Error(`Telemetry field ${[...e,n].join(".")} is prohibited.`);sm(r,[...e,n])}}}}async function hx(t){let{repo:e,config:n,logger:r,github:s,copilotToken:i,githubToken:o,dryRun:a,approved:c}=t,l=Date.now(),{plan:u,summary:d}=await r.group("Drift: analysing",()=>Eo({repo:e,config:n,logger:r,provider:t.provider??s.asRepoProvider(e),workspace:t.workspace??e.workspace,githubToken:o,onProgress:(f,m)=>r.info(`[${f}] ${m}`)}));if(!u)return r.info(d),{plan:null,dispatch:{status:"skipped",planId:"none",message:d},summary:d};r.info(Qc(u));for(let f of u.blockers)r.warn(`Blocker: ${f}`);let p=await r.group("Drift: dispatching",()=>rl({repo:e,plan:u,config:n,github:s,logger:r,copilotToken:i,dryRun:a,approved:c}));return r.info(p.message),await im({config:n,plan:u,result:p,dryRun:a,approved:c,latencyMs:Date.now()-l,logger:r}),{plan:u,dispatch:p,summary:p.message}}async function im(t){let{config:e,plan:n,result:r,dryRun:s,approved:i,latencyMs:o,logger:a}=t;if(!px(e.telemetry))return;let c=e.telemetry.endpoint;if(c)try{let l=fx({plan:n,result:r,agentType:!s&&r.status==="dispatched"?"cloud":"none",latencyMs:o,...i?{userAction:"approved"}:{},featureFlags:{behaviouralVerification:e.verification.behavioural.enabled,automaticDispatch:e.mode==="auto",approvalRequired:e.mode==="approve",planDag:!0},...e.telemetry.installationId?{installationId:e.telemetry.installationId}:{},...e.telemetry.rotationSalt?{rotationSalt:e.telemetry.rotationSalt}:{},...e.telemetry.retentionDays!==void 0?{retentionDays:e.telemetry.retentionDays}:{}}),u=await gx(l,{endpoint:c});u.sent||a.debug(`Telemetry event not sent: ${u.reason??u.status}`)}catch(l){a.debug(`Telemetry event not sent: ${l.message}`)}}var yx={debug:0,info:1,warn:2,error:3},om=process.env.GITHUB_ACTIONS==="true";function bx(t="info"){let e=r=>yx[r]>=yx[t],n=(r,s,i)=>{if(!e(r))return;let o=i===void 0?"":` ${sV(i)}`,a=`${s}${o}`;if(om&&(r==="warn"||r==="error")){console.log(`::${r==="warn"?"warning":"error"}::${a.replace(/\n/g,"%0A")}`);return}(r==="error"?console.error:console.log)(`[drift:${r}] ${a}`)};return{debug:(r,s)=>n("debug",r,s),info:(r,s)=>n("info",r,s),warn:(r,s)=>n("warn",r,s),error:(r,s)=>n("error",r,s),async group(r,s){console.log(om?`::group::${r}`:`[drift] \u2500\u2500 ${r}`);try{return await s()}finally{om&&console.log("::endgroup::")}}}}function sV(t){try{return JSON.stringify(t)}catch{return String(t)}}var iV=["admin","maintain","write"];function oV(t){return iV.includes(t)}var aV=/^[ \t]*\/drift[ \t]+apply[ \t]*$/m;async function wx(t){let{request:e,lookupPermission:n,selfLogins:r=[],requiredLabel:s="drift"}=t;if(e.action!=="created")return{status:"not-an-approval",reason:`comment action is \`${e.action??"absent"}\`, not \`created\``};let i=e.comment?.body;if(!i||!aV.test(i))return{status:"not-an-approval",reason:"the comment is not a `/drift apply` command"};let o=e.issue;if(!o||typeof o.number!="number")return{status:"not-an-approval",reason:"the event carries no issue"};if(o.pull_request)return{status:"not-an-approval",reason:"the comment is on a pull request, not an approval issue"};let a=e.comment?.user?.login??null;if(a&&r.some(d=>d.toLowerCase()===a.toLowerCase()))return{status:"not-an-approval",reason:"the comment was posted by Drift itself"};if(!(o.labels??[]).map(d=>typeof d=="string"?d:d?.name??"").filter(Boolean).some(d=>d.toLowerCase()===s.toLowerCase()))return{status:"not-an-approval",reason:`the issue does not carry the \`${s}\` label, so Drift did not file it`};if(o.state&&o.state!=="open")return{status:"rejected",reason:`this issue is ${o.state}. Re-open it, or run Drift again to generate a current plan.`,issueNumber:o.number,actor:a};let l=FT(o.body??"");if(!l.ok)return{status:"rejected",reason:`Drift could not read the plan record on this issue: ${l.reason}.`,issueNumber:o.number,actor:a};if(!a)return{status:"rejected",reason:"the approval comment has no identifiable author, so Drift cannot check permission.",issueNumber:o.number,actor:null};let u;try{u=await n(a)}catch{u=null}return u===null?{status:"rejected",reason:"Drift could not confirm your permission on this repository, so it stopped. This is deliberate: an unavailable permission check is treated as a refusal, never as approval.",issueNumber:o.number,actor:a}:oV(u)?{status:"authorized",metadata:l.metadata,issueNumber:o.number,actor:a,permission:u}:{status:"rejected",reason:`\`${a}\` has \`${u}\` permission on this repository. Applying a Drift plan writes a branch and dispatches a coding agent, so it requires \`write\`, \`maintain\`, or \`admin\`.`,issueNumber:o.number,actor:a}}var vx=["github-actions[bot]","drift[bot]"];async function kx(t){let{payload:e,owner:n,repo:r,github:s,logger:i}=t,o=Date.now(),a={owner:n,repo:r,baseBranch:"",beforeSha:"",afterSha:""},c=e.issue,l=typeof c?.number=="number"?c.number:null,u=l!==null?await s.getIssue(a,l):null,d={action:e.action,comment:e.comment,issue:u?{number:u.number,body:u.body,labels:u.labels,state:u.state,...u.pullRequest?{pull_request:!0}:{}}:c},p=await s.getAuthenticatedLogin(),f=p?[...vx,p]:vx,m=await wx({request:d,selfLogins:f,requiredLabel:nl,lookupPermission:K=>s.getCollaboratorPermission(a,K)});if(m.status==="not-an-approval")return i.debug(`Ignoring comment: ${m.reason}`),{status:"ignored",reason:m.reason};if(m.status==="rejected")return i.warn(`Refused /drift apply on #${m.issueNumber}: ${m.reason}`),await Mr(t,a,m.issueNumber,m.reason),{status:"rejected",reason:m.reason,issueNumber:m.issueNumber};let{metadata:g,actor:h,permission:y}=m;if(i.info(`\`/drift apply\` on #${m.issueNumber} by ${h} (${y}) for plan ${g.planId}`),!await s.commitExists(a,g.headSha)){let K=`commit \`${g.headSha.slice(0,7)}\` is no longer in this repository. It may have been removed by a force-push or a branch deletion. Re-run Drift to analyse the current code.`;return await Mr(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let w=await s.getBranchHead(a,g.baseBranch);if(w===null){let K=`the base branch \`${g.baseBranch}\` no longer exists, so Drift cannot tell what this plan would merge into.`;return await Mr(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}if(w!==g.headSha){let K=`\`${g.baseBranch}\` has advanced since this plan was generated (reviewed \`${g.headSha.slice(0,7)}\`, now at \`${w.slice(0,7)}\`). The impact analysis in this issue describes the older commit, so Drift will not apply it. Re-run Drift to generate a plan for the current code.`;return await Mr(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let S=await cV(t,g.headSha),v={owner:n,repo:r,baseBranch:g.baseBranch,beforeSha:`${g.headSha}^`,afterSha:g.headSha,...S?{workspace:S}:{}},{config:k,problems:$}=await Oa(K=>s.readFile(v,K,g.headSha));for(let K of $)i.warn(K);let F=t.configOverride?{...k,...t.configOverride}:k,{plan:_,summary:ne}=await Eo({repo:v,config:F,logger:i,provider:s.asRepoProvider(v),...S?{workspace:S}:{}});if(!_){let K=`re-analysing \`${g.headSha.slice(0,7)}\` produced no plan (${ne}).`;return await Mr(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let ie=Yc(_);if(ie!==g.planDigest){let K=`the plan Drift just computed does not match the plan recorded on this issue, so the approval does not apply to it. +${u.message}`)?(a.add(c.id),i.info(`Resolved commit ${c.order} directly (recipe): ${u.message}`)):await Do(e.workspace,d,o)}catch(u){i.warn(`Deterministic remediation failed for commit ${c.order}, falling back to an agent: ${u.message}`),await Do(e.workspace,c.files,o)}}return{committedIds:a}}async function hW(t,e){let n=new Map;for(let s of e.files)try{n.set(s,await(0,Mo.readFile)((0,Tl.join)(t,s),"utf8"))}catch{}let r=W_(e,n);if(r.status!=="applied")return null;for(let s of r.edits)await(0,Mo.writeFile)((0,Tl.join)(t,s.path),s.content,"utf8");return{edits:r.edits,message:r.message}}async function yW(t,e,n,r){let s=bW(e.recipe??[]);if(s.length===0)return{edits:null,message:"",touched:[]};let i=new Set([...e.allowedFiles,...e.files]),o=new Set,a=[];for(let u of s){let d=await H_(u,t,{exec:n,logger:r});for(let p of d.changedFiles)o.add(p);if(d.status==="failed")return r.warn(`Community recipe ${u.name}@${u.version} failed: ${d.message}`),{edits:null,message:"",touched:[...o]};d.status==="applied"&&a.push(d.message)}if(o.size===0)return{edits:null,message:"",touched:[]};let c=[...o].filter(u=>!i.has(u));if(c.length>0)return r.warn(`Community recipe for commit ${e.order} touched file(s) outside its scope (${c.join(", ")}); discarding and falling back to an agent.`),{edits:null,message:"",touched:[...o]};let l=[];for(let u of o)try{l.push({path:u,content:await(0,Mo.readFile)((0,Tl.join)(t,u),"utf8")})}catch{}return l.length===0?{edits:null,message:"",touched:[...o]}:{edits:l,message:a.join(" ")||"Applied community recipe(s).",touched:[...o]}}function bW(t){let e=new Map;for(let n of t)e.set(`${n.provider}:${n.name}@${n.version}`,n);return[...e.values()]}async function Do(t,e,n){e.length!==0&&await n("git",["checkout","--",...e],{cwd:t})}var Ys="drift";async function $l(t){let{repo:e,plan:n,config:r,github:s,logger:i,copilotToken:o,dryRun:a=!1,approved:c=!1}=t;if(n.commits.length===0&&n.blockers.length===0)return i.info("No affected code found; nothing to dispatch."),await _l(t,"success","No action needed"),{status:"skipped",planId:n.id,message:"Dependency changed, but no code in this repository uses the affected APIs."};if(!(c?n.blockers.length===0:IT(n,r)))return Om(t);if(a){i.info(`Dry run: would dispatch ${n.commits.length} commit(s) on ${n.branchName}`);let w=o?await Pm({copilotToken:o,repo:e,plan:n,config:r,logger:i,dryRun:!0}):void 0;return w&&i.debug("Copilot prompt preview",{length:w.prompt.length}),{status:"skipped",planId:n.id,branchName:n.branchName,message:`Dry run \u2014 no changes made. Would create branch \`${n.branchName}\` and resolve ${n.commits.length} commit(s) (deterministically where possible, otherwise via agent).`}}if(!await s.createBranch(e,n.branchName,e.afterSha))return{status:"failed",planId:n.id,message:`Could not create branch \`${n.branchName}\`. Check that the token has \`contents: write\`.`};let{committedIds:d}=await Y_({repo:e,plan:n,config:r,github:s,logger:i,exec:t.exec}),p=n.commits.filter(w=>!d.has(w.id));if(p.length===0){i.info(`Resolved all ${n.commits.length} commit(s) deterministically; no agent was dispatched.`),await _l(t,"success",`Resolved ${n.commits.length} breaking change commit(s) without an agent`);let w=await Z_(t,void 0,void 0);return{status:"dispatched",planId:n.id,branchName:n.branchName,pullRequestNumber:w?.number,pullRequestUrl:w?.url,message:w?`Resolved ${n.commits.length} commit(s) on \`${n.branchName}\` deterministically \u2014 no agent call was made. Tracked in pull request #${w.number} into \`${n.baseBranch}\`.`:`Resolved ${n.commits.length} commit(s) on \`${n.branchName}\` deterministically \u2014 no agent call was made. A pull request into \`${n.baseBranch}\` will follow.`}}if(d.size>0&&i.info(`Resolved ${d.size} commit(s) deterministically; dispatching the remaining ${p.length} to Copilot.`),!o)return i.warn("Drift is in auto mode with commit(s) that need an agent, but no Copilot token is available. Falling back to approval."),Om({...t,plan:{...n,blockers:[...n.blockers,"No Copilot token was available. Set the `DRIFT_COPILOT_TOKEN` secret to a user-scoped fine-grained token with `Agent tasks: read and write` \u2014 that is the only permission the Agent Tasks endpoint checks. The Copilot agent API does not accept GitHub App installation tokens."]}});let f=V_(n,p),m=await Pm({copilotToken:o,repo:e,plan:f,config:r,logger:i});if(!m.ok)return i.error(`Copilot dispatch failed: ${m.error}`),{...await Om({...t,plan:{...n,blockers:[...n.blockers,m.error??"Copilot dispatch failed."]}}),status:"failed",message:m.error??"Copilot dispatch failed."};await _l(t,"neutral",`Copilot is fixing ${f.breakingChanges.length} breaking change(s)`);let g=m.task;i.info(`Dispatched to Copilot: task ${g?.id??"unknown"} on ${n.branchName}`);let h=await Z_(t,g?.pullRequestNumber,g?.pullRequestUrl),y=d.size>0?`${d.size} commit(s) resolved deterministically; `:"";return{status:"dispatched",planId:n.id,branchName:n.branchName,taskId:g?.id,pullRequestNumber:h?.number??g?.pullRequestNumber,pullRequestUrl:h?.url??g?.pullRequestUrl,message:h?`${y}Copilot is working on ${p.length} commit(s) on \`${n.branchName}\`, tracked in pull request #${h.number} into \`${n.baseBranch}\`.`:`${y}Copilot is working on ${p.length} commit(s) on \`${n.branchName}\`. A pull request into \`${n.baseBranch}\` will follow.`}}async function Z_(t,e,n){let{repo:r,plan:s,config:i,github:o,logger:a}=t;if(e&&n)return{number:e,url:n};if(!i.pullRequest.enabled)return a.info("pullRequest.enabled is false; leaving the branch without a pull request."),null;let c=i.pullRequest.base==="default-branch"?await o.getDefaultBranch(r.owner,r.repo)??s.baseBranch:s.baseBranch;if(c===s.branchName)return null;let l=await o.createPullRequest(r,{head:s.branchName,base:c,title:wT({changes:s.changes},{title:i.pullRequest.titleTemplate,prefix:i.remediation.branchPrefix}),body:Oo(s,i),draft:jy(i),labels:[Ys,...i.pullRequest.labels],reviewers:i.pullRequest.reviewers});return l?{number:l.number,url:l.url}:null}async function Om(t){let{repo:e,plan:n,config:r,github:s,logger:i,dryRun:o=!1}=t,a=n.blockers.length>0?`blocked by ${n.blockers.length} guardrail(s)`:`mode is \`${r.mode}\``;if(i.info(`Requesting human approval (${a})`),await _l(t,"action_required","Drift needs your approval"),o)return{status:"blocked",planId:n.id,message:`Dry run \u2014 would open an approval issue (${a}).`};let c=await s.findOpenPlanIssue(e,n.id);if(c!==null)return i.info(`Plan ${n.id} already filed as issue #${c}; not duplicating`),{status:"blocked",planId:n.id,approvalIssueNumber:c,message:`Already awaiting approval in #${c}.`};let l=await s.createIssue(e,{title:wW(n),body:P_(n,r),labels:[Ys,`drift:risk-${n.risk}`],assignees:r.issueCreation.assignees});return l?{status:"blocked",planId:n.id,approvalIssueNumber:l.number,message:`Awaiting approval in #${l.number} (${a}). Comment \`/drift apply\` to proceed.`}:{status:"failed",planId:n.id,message:"Could not open an approval issue. Check that the token has `issues: write`."}}function wW(t){if(t.changes.length===1){let e=t.changes[0];return`[Drift] ${e.name} ${e.from??"\u2014"} \u2192 ${e.to??"\u2014"} needs ${t.commits.length} fix(es)`}return`[Drift] ${t.changes.length} dependency updates need ${t.commits.length} fix(es)`}async function _l(t,e,n){let{repo:r,plan:s,config:i,github:o,dryRun:a}=t;a||await o.createCheckRun(r,{name:"Drift",conclusion:e,title:n,summary:xl(s),text:Oo(s,i)})}var X_=require("node:crypto"),vW=1,kW=new Set(["sourceCode","code","snippet","excerpt","file","filePath","path","paths","rawPath","repository","repo","owner","organization","org","secret","token","prompt","modelResponse","stdout","stderr","output","fullOutput","commandOutput"]);function Q_(t,e=process.env){return e.DRIFT_TELEMETRY_DISABLED==="1"||e.DRIFT_TELEMETRY_DISABLED==="true"||e.DO_NOT_TRACK==="1"?!1:!!(t.enabled&&t.endpoint)}function e$(t){let e=t.now??new Date,n=t.rotationSalt??_W(e),r={schemaVersion:vW,event:"upgrade_outcome",occurredAt:e.toISOString(),installation:{idHash:SW(t.installationId??"anonymous-local-install",n),rotation:n},dependencies:t.plan.changes.map(s=>({ecosystem:s.ecosystem,package:s.name,oldVersion:s.from,newVersion:s.to})),taxonomy:t.plan.breakingChanges.map(EW),evidenceSourceClasses:[...new Set(t.plan.evidence.map(s=>s.source))].sort(),confidenceBands:t.plan.breakingChanges.map(s=>({upstream:s.assessment?.upstream.band??"none",localImpact:s.assessment?.localImpact.band??"none",verification:s.assessment?.verification.band??"none"})),gaps:t.plan.gaps.map(s=>({stage:s.stage,...s.ecosystem?{ecosystem:s.ecosystem}:{},...s.dependency?{dependency:s.dependency}:{},reason:s.reason,severity:s.severity,consequence:s.automaticExecution})),checks:xW(t.checks??[]),agentType:t.agentType??"none",executionResult:t.result?.status??"not-dispatched",...t.userAction?{userAction:t.userAction}:{},featureFlags:TW(t.featureFlags??{}),latencyMs:t.latencyMs??0,costUsd:t.costUsd??0,...t.retentionDays!==void 0?{retentionDays:t.retentionDays}:{}};return t$(r),r}function EW(t){return t.taxonomy?{nature:t.taxonomy.nature,detectability:[...t.taxonomy.detectability].sort(),scope:t.taxonomy.scope,visibility:[...t.taxonomy.visibility].sort()}:{nature:"unknown",detectability:["external-observation"],scope:"ecosystem",visibility:["unknown"]}}function t$(t){Dm(t,[])}function SW(t,e){return(0,X_.createHash)("sha256").update(`drift:${e}:${t}`).digest("hex")}async function n$(t,e){if(e.env?.DRIFT_TELEMETRY_DISABLED==="1"||e.env?.DO_NOT_TRACK==="1")return{sent:!1,reason:"telemetry disabled by environment"};t$(t);let n=await(e.fetch??fetch)(e.endpoint,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)});return{sent:n.ok,status:n.status}}function xW(t){return{run:t.filter(e=>e.status==="passed"||e.status==="failed").length,passed:t.filter(e=>e.status==="passed").length,failed:t.filter(e=>e.status==="failed").length,notRun:t.filter(e=>e.status==="not-run").length,cancelled:t.filter(e=>e.status==="cancelled").length}}function TW(t){return Object.fromEntries(Object.entries(t).sort(([e],[n])=>e.localeCompare(n)).map(([e,n])=>[e,n?"on":"off"]))}function _W(t){return`${t.getUTCFullYear()}-${String(t.getUTCMonth()+1).padStart(2,"0")}`}function Dm(t,e){if(t!=null){if(typeof t=="string"){if(/-----BEGIN (RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/.test(t))throw new Error(`Telemetry field ${e.join(".")} looks like a private key.`);return}if(typeof t=="object"){if(Array.isArray(t)){t.forEach((n,r)=>Dm(n,[...e,String(r)]));return}for(let[n,r]of Object.entries(t)){if(kW.has(n))throw new Error(`Telemetry field ${[...e,n].join(".")} is prohibited.`);Dm(r,[...e,n])}}}}async function r$(t){let{repo:e,config:n,logger:r,github:s,copilotToken:i,githubToken:o,dryRun:a,approved:c}=t,l=Date.now(),{plan:u,summary:d}=await r.group("Drift: analysing",()=>Ro({repo:e,config:n,logger:r,provider:t.provider??s.asRepoProvider(e),workspace:t.workspace??e.workspace,githubToken:o,onProgress:(f,m)=>r.info(`[${f}] ${m}`)}));if(!u)return r.info(d),{plan:null,dispatch:{status:"skipped",planId:"none",message:d},summary:d};r.info(xl(u));for(let f of u.blockers)r.warn(`Blocker: ${f}`);let p=await r.group("Drift: dispatching",()=>$l({repo:e,plan:u,config:n,github:s,logger:r,copilotToken:i,dryRun:a,approved:c}));return r.info(p.message),await Mm({config:n,plan:u,result:p,dryRun:a,approved:c,latencyMs:Date.now()-l,logger:r}),{plan:u,dispatch:p,summary:p.message}}async function Mm(t){let{config:e,plan:n,result:r,dryRun:s,approved:i,latencyMs:o,logger:a}=t;if(!Q_(e.telemetry))return;let c=e.telemetry.endpoint;if(c)try{let l=e$({plan:n,result:r,agentType:!s&&r.status==="dispatched"?"cloud":"none",latencyMs:o,...i?{userAction:"approved"}:{},featureFlags:{behaviouralVerification:e.verification.behavioural.enabled,automaticDispatch:e.mode==="auto",approvalRequired:e.mode==="approve",planDag:!0},...e.telemetry.installationId?{installationId:e.telemetry.installationId}:{},...e.telemetry.rotationSalt?{rotationSalt:e.telemetry.rotationSalt}:{},...e.telemetry.retentionDays!==void 0?{retentionDays:e.telemetry.retentionDays}:{}}),u=await n$(l,{endpoint:c});u.sent||a.debug(`Telemetry event not sent: ${u.reason??u.status}`)}catch(l){a.debug(`Telemetry event not sent: ${l.message}`)}}var s$={debug:0,info:1,warn:2,error:3},Nm=process.env.GITHUB_ACTIONS==="true";function i$(t="info"){let e=r=>s$[r]>=s$[t],n=(r,s,i)=>{if(!e(r))return;let o=i===void 0?"":` ${$W(i)}`,a=`${s}${o}`;if(Nm&&(r==="warn"||r==="error")){console.log(`::${r==="warn"?"warning":"error"}::${a.replace(/\n/g,"%0A")}`);return}(r==="error"?console.error:console.log)(`[drift:${r}] ${a}`)};return{debug:(r,s)=>n("debug",r,s),info:(r,s)=>n("info",r,s),warn:(r,s)=>n("warn",r,s),error:(r,s)=>n("error",r,s),async group(r,s){console.log(Nm?`::group::${r}`:`[drift] \u2500\u2500 ${r}`);try{return await s()}finally{Nm&&console.log("::endgroup::")}}}}function $W(t){try{return JSON.stringify(t)}catch{return String(t)}}var RW=["admin","maintain","write"];function CW(t){return RW.includes(t)}var AW=/^[ \t]*\/drift[ \t]+apply[ \t]*$/m;async function o$(t){let{request:e,lookupPermission:n,selfLogins:r=[],requiredLabel:s="drift"}=t;if(e.action!=="created")return{status:"not-an-approval",reason:`comment action is \`${e.action??"absent"}\`, not \`created\``};let i=e.comment?.body;if(!i||!AW.test(i))return{status:"not-an-approval",reason:"the comment is not a `/drift apply` command"};let o=e.issue;if(!o||typeof o.number!="number")return{status:"not-an-approval",reason:"the event carries no issue"};if(o.pull_request)return{status:"not-an-approval",reason:"the comment is on a pull request, not an approval issue"};let a=e.comment?.user?.login??null;if(a&&r.some(d=>d.toLowerCase()===a.toLowerCase()))return{status:"not-an-approval",reason:"the comment was posted by Drift itself"};if(!(o.labels??[]).map(d=>typeof d=="string"?d:d?.name??"").filter(Boolean).some(d=>d.toLowerCase()===s.toLowerCase()))return{status:"not-an-approval",reason:`the issue does not carry the \`${s}\` label, so Drift did not file it`};if(o.state&&o.state!=="open")return{status:"rejected",reason:`this issue is ${o.state}. Re-open it, or run Drift again to generate a current plan.`,issueNumber:o.number,actor:a};let l=u_(o.body??"");if(!l.ok)return{status:"rejected",reason:`Drift could not read the plan record on this issue: ${l.reason}.`,issueNumber:o.number,actor:a};if(!a)return{status:"rejected",reason:"the approval comment has no identifiable author, so Drift cannot check permission.",issueNumber:o.number,actor:null};let u;try{u=await n(a)}catch{u=null}return u===null?{status:"rejected",reason:"Drift could not confirm your permission on this repository, so it stopped. This is deliberate: an unavailable permission check is treated as a refusal, never as approval.",issueNumber:o.number,actor:a}:CW(u)?{status:"authorized",metadata:l.metadata,issueNumber:o.number,actor:a,permission:u}:{status:"rejected",reason:`\`${a}\` has \`${u}\` permission on this repository. Applying a Drift plan writes a branch and dispatches a coding agent, so it requires \`write\`, \`maintain\`, or \`admin\`.`,issueNumber:o.number,actor:a}}var a$=["github-actions[bot]","drift[bot]"];async function c$(t){let{payload:e,owner:n,repo:r,github:s,logger:i}=t,o=Date.now(),a={owner:n,repo:r,baseBranch:"",beforeSha:"",afterSha:""},c=e.issue,l=typeof c?.number=="number"?c.number:null,u=l!==null?await s.getIssue(a,l):null,d={action:e.action,comment:e.comment,issue:u?{number:u.number,body:u.body,labels:u.labels,state:u.state,...u.pullRequest?{pull_request:!0}:{}}:c},p=await s.getAuthenticatedLogin(),f=p?[...a$,p]:a$,m=await o$({request:d,selfLogins:f,requiredLabel:Ys,lookupPermission:K=>s.getCollaboratorPermission(a,K)});if(m.status==="not-an-approval")return i.debug(`Ignoring comment: ${m.reason}`),{status:"ignored",reason:m.reason};if(m.status==="rejected")return i.warn(`Refused /drift apply on #${m.issueNumber}: ${m.reason}`),await Ur(t,a,m.issueNumber,m.reason),{status:"rejected",reason:m.reason,issueNumber:m.issueNumber};let{metadata:g,actor:h,permission:y}=m;if(i.info(`\`/drift apply\` on #${m.issueNumber} by ${h} (${y}) for plan ${g.planId}`),!await s.commitExists(a,g.headSha)){let K=`commit \`${g.headSha.slice(0,7)}\` is no longer in this repository. It may have been removed by a force-push or a branch deletion. Re-run Drift to analyse the current code.`;return await Ur(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let w=await s.getBranchHead(a,g.baseBranch);if(w===null){let K=`the base branch \`${g.baseBranch}\` no longer exists, so Drift cannot tell what this plan would merge into.`;return await Ur(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}if(w!==g.headSha){let K=`\`${g.baseBranch}\` has advanced since this plan was generated (reviewed \`${g.headSha.slice(0,7)}\`, now at \`${w.slice(0,7)}\`). The impact analysis in this issue describes the older commit, so Drift will not apply it. Re-run Drift to generate a plan for the current code.`;return await Ur(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let S=await PW(t,g.headSha),b={owner:n,repo:r,baseBranch:g.baseBranch,beforeSha:`${g.headSha}^`,afterSha:g.headSha,...S?{workspace:S}:{}},{config:k,problems:_}=await Ua(K=>s.readFile(b,K,g.headSha));for(let K of _)i.warn(K);let G=t.configOverride?{...k,...t.configOverride}:k,{plan:T,summary:se}=await Ro({repo:b,config:G,logger:i,provider:s.asRepoProvider(b),...S?{workspace:S}:{}});if(!T){let K=`re-analysing \`${g.headSha.slice(0,7)}\` produced no plan (${se}).`;return await Ur(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}let ie=hl(T);if(ie!==g.planDigest){let K=`the plan Drift just computed does not match the plan recorded on this issue, so the approval does not apply to it. - recorded: \`${g.planDigest.slice(0,16)}\u2026\` - computed: \`${ie.slice(0,16)}\u2026\` -This happens when the evidence behind the plan changed after it was filed \u2014 a new upstream release, an edited changelog, a newly disclosed advisory. Nothing is wrong, but what you approved is no longer what would run. Re-run Drift to generate a current plan and review that one.`;return await Mr(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}if(t.dispatchStore){let K=await t.dispatchStore.find(n,r,ie);if(K){let Ge=`This plan was already applied \u2014 see ${K.pullRequestNumber?`pull request #${K.pullRequestNumber}`:K.branchName?`branch \`${K.branchName}\``:"an earlier run"}. Nothing further to do.`;return i.info(`Plan ${g.planId} already dispatched (durable record); treating the approval as a no-op.`),await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${Ge}`),{status:"already-applied",issueNumber:m.issueNumber,message:Ge}}}let Me;try{Me=await s.listIssueComments(a,m.issueNumber)}catch(K){let ye=`Drift could not read this issue's comments (${K.message}), so it cannot tell whether this plan was already applied. It stopped rather than risk dispatching the same work twice. Try again.`;return await Mr(t,a,m.issueNumber,ye),{status:"rejected",reason:ye,issueNumber:m.issueNumber}}let re=UT(Me.map(K=>({body:K.body,authorIsDrift:!!(K.authorLogin&&f.some(ye=>ye.toLowerCase()===K.authorLogin.toLowerCase()))})),ie);if(re){let ye=`This plan was already applied \u2014 see ${re.pullRequestNumber?`pull request #${re.pullRequestNumber}`:re.branchName?`branch \`${re.branchName}\``:"an earlier run"}. Nothing further to do.`;return i.info(`Plan ${g.planId} already dispatched; treating the approval as a no-op.`),await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${ye}`),{status:"already-applied",issueNumber:m.issueNumber,message:ye}}let X=await rl({repo:v,plan:_,config:F,github:s,logger:i,...t.copilotToken?{copilotToken:t.copilotToken}:{},...t.dryRun?{dryRun:!0}:{},approved:!0});if(X.status==="dispatched"&&!t.dryRun){if(t.dispatchStore)try{await t.dispatchStore.record(n,r,ie,X)}catch(Ge){i.error(`Failed to durably record dispatch for plan ${g.planId}: ${Ge.message}`)}let K=qT({planDigest:ie,branchName:X.branchName??_.branchName,...X.taskId?{taskId:X.taskId}:{},...X.pullRequestNumber!==void 0?{pullRequestNumber:X.pullRequestNumber}:{}});await lV(s,a,m.issueNumber,`**Drift**: applied by @${h}. +This happens when the evidence behind the plan changed after it was filed \u2014 a new upstream release, an edited changelog, a newly disclosed advisory. Nothing is wrong, but what you approved is no longer what would run. Re-run Drift to generate a current plan and review that one.`;return await Ur(t,a,m.issueNumber,K),{status:"rejected",reason:K,issueNumber:m.issueNumber}}if(t.dispatchStore){let K=await t.dispatchStore.find(n,r,ie);if(K){let Te=`This plan was already applied \u2014 see ${K.pullRequestNumber?`pull request #${K.pullRequestNumber}`:K.branchName?`branch \`${K.branchName}\``:"an earlier run"}. Nothing further to do.`;return i.info(`Plan ${g.planId} already dispatched (durable record); treating the approval as a no-op.`),await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${Te}`),{status:"already-applied",issueNumber:m.issueNumber,message:Te}}}let ce;try{ce=await s.listIssueComments(a,m.issueNumber)}catch(K){let oe=`Drift could not read this issue's comments (${K.message}), so it cannot tell whether this plan was already applied. It stopped rather than risk dispatching the same work twice. Try again.`;return await Ur(t,a,m.issueNumber,oe),{status:"rejected",reason:oe,issueNumber:m.issueNumber}}let ne=p_(ce.map(K=>({body:K.body,authorIsDrift:!!(K.authorLogin&&f.some(oe=>oe.toLowerCase()===K.authorLogin.toLowerCase()))})),ie);if(ne){let oe=`This plan was already applied \u2014 see ${ne.pullRequestNumber?`pull request #${ne.pullRequestNumber}`:ne.branchName?`branch \`${ne.branchName}\``:"an earlier run"}. Nothing further to do.`;return i.info(`Plan ${g.planId} already dispatched; treating the approval as a no-op.`),await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${oe}`),{status:"already-applied",issueNumber:m.issueNumber,message:oe}}let Q=await $l({repo:b,plan:T,config:G,github:s,logger:i,...t.copilotToken?{copilotToken:t.copilotToken}:{},...t.dryRun?{dryRun:!0}:{},approved:!0});if(Q.status==="dispatched"&&!t.dryRun){if(t.dispatchStore)try{await t.dispatchStore.record(n,r,ie,Q)}catch(Te){i.error(`Failed to durably record dispatch for plan ${g.planId}: ${Te.message}`)}let K=d_({planDigest:ie,branchName:Q.branchName??T.branchName,...Q.taskId?{taskId:Q.taskId}:{},...Q.pullRequestNumber!==void 0?{pullRequestNumber:Q.pullRequestNumber}:{}});await IW(s,a,m.issueNumber,`**Drift**: applied by @${h}. + +${Q.message} + +${K}`,i)||(t.dispatchStore?i.warn(`Dispatch marker comment failed to post for plan ${g.planId} after retrying. The durable dispatch record still protects against a duplicate dispatch on retry.`):i.error(`Dispatch marker comment failed to post for plan ${g.planId} on #${m.issueNumber} after retrying, and no durable dispatch store is configured. A repeated \`/drift apply\` on this issue will not be recognised as already applied and may dispatch task ${Q.taskId??"(no id)"} again${Q.branchName?` on branch \`${Q.branchName}\``:""}. A human should check the issue manually before approving it again.`));try{await t.onDispatched?.(Q,b)}catch(Te){i.error(`Failed to record dispatched task ${Q.taskId??"(no id)"}: ${Te.message}`),await s.createCheckRun(b,{name:"Drift",conclusion:"action_required",title:"Copilot task dispatched, but not tracked",summary:`Copilot task ${Q.taskId??"(unknown id)"} was dispatched for this plan, but Drift could not record it for status tracking (${Te.message}). It will not automatically receive a pass/fail update when it finishes \u2014 check ${Q.pullRequestUrl??"the branch"} manually.`})}}else await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${Q.message}`);return await Mm({config:G,plan:T,result:Q,dryRun:t.dryRun,approved:!0,latencyMs:Date.now()-o,logger:i}),{status:"applied",issueNumber:m.issueNumber,plan:T,dispatch:Q,config:G}}async function PW(t,e){let{workspace:n,logger:r}=t;if(!n)return;let s=await It("git",["rev-parse","HEAD"],{cwd:n,timeoutMs:1e4});if(s.code!==0){r.warn(`Could not determine what \`${n}\` is checked out at, so Drift is not using it for localization.`);return}let i=s.stdout.trim();if(i===e||(await It("git",["fetch","--depth","1","origin",e],{cwd:n,timeoutMs:3e4})).code===0&&(await It("git",["checkout","--detach",e],{cwd:n,timeoutMs:1e4})).code===0)return n;r.warn(`The checkout is at ${i.slice(0,7)} but this plan describes ${e.slice(0,7)}, and Drift could not fetch and check out that commit. Skipping localization rather than reporting impact sites from the wrong tree.`)}async function Ur(t,e,n,r){t.dryRun||await t.github.commentOnIssue(e,n,`**Drift did not apply this plan.** + +${r}`)}async function IW(t,e,n,r,s,i=3,o=1e3){for(let a=1;a<=i;a++){if(await t.commentOnIssue(e,n,r))return!0;asetTimeout(e,t))}async function l$(){let t=NW(),e=i$(t.logLevel);if(!t.repoToken)return e.error("No repository token available. Pass `repo-token: ${{ secrets.GITHUB_TOKEN }}` to the action, or set GITHUB_TOKEN."),1;let n=await LW(),r=process.env.GITHUB_EVENT_NAME??"",s=new Ka({repoToken:t.repoToken,logger:e});if(r==="issue_comment")return FW(n,t,s,e);let i=GW(n,t.workspace);if(!i)return e.error("Could not determine the repository and commit range from the event payload. Drift supports `push`, `workflow_dispatch`, `schedule`, and `issue_comment` events."),1;let{config:o,path:a,problems:c}=await Ua(async u=>jW(t.workspace,t.configPath??u));for(let u of c)e.warn(u);e.info(a?`Loaded config from ${a}`:"No drift.yml found; using defaults (mode: approve)");let l=t.mode?{...o,mode:t.mode}:o;if(t.alertGranularity&&(l={...l,codeScanning:{...l.codeScanning,granularity:t.alertGranularity}}),r==="schedule"||t.scanMode==="outdated")return DW(i,l,s,t,e);if(!lr(l.watchBranches,i.baseBranch))return e.info(`Branch \`${i.baseBranch}\` is not in \`watchBranches\` (${l.watchBranches.join(", ")}); nothing to do.`),0;l.mode==="auto"&&!t.copilotToken&&!t.dryRun&&e.warn("mode is `auto` but no copilot-token input was supplied. Drift will analyse and file an approval issue instead of dispatching. See docs/copilot-integration.md.");try{let u=await r$({repo:i,config:l,logger:e,github:s,copilotToken:t.copilotToken,dryRun:t.dryRun,approved:!1,workspace:t.workspace});if(await Rl(u.dispatch,u.summary),u.plan){await No(Oo(u.plan,l));let d=Cm(u.plan,{includeInformational:l.codeScanning.includeInformational,granularity:l.codeScanning.granularity,repoBlobUrl:`https://github.com/${i.owner}/${i.repo}/blob/${i.afterSha}`});await u$({repo:i,config:l,github:s,logger:e,findings:d,category:"drift/diff"}),await d$({repo:i,config:l,github:s,logger:e,findings:d})}return u.dispatch.status==="dispatched"&&await p$({config:l,repo:i,dispatchResult:u.dispatch,github:s,copilotToken:t.copilotToken,logger:e}),u.dispatch.status==="failed"?1:0}catch(u){return e.error(`Drift failed: ${u.message}`),e.debug(u.stack??""),1}}async function u$(t){let{repo:e,config:n,github:r,logger:s,findings:i,category:o}=t;if(n.codeScanning.enabled){if(i.length===0){s.debug("No code scanning findings to upload.");return}s.info(`Uploading ${i.length} code scanning finding(s).`),await r.uploadSarif(e,{sarif:R_(i,o),commitSha:e.afterSha,ref:`refs/heads/${e.baseBranch}`})}}async function d$(t){let{repo:e,config:n,github:r,logger:s,findings:i}=t;if(!(!n.codeScanning.createIssuesPerAlert||i.length===0))for(let o of i){let a=`drift-alert:${o.ruleId}`,c=await r.findOpenPlanIssue(e,a);if(c!==null){s.debug(`${o.ruleId} already filed as issue #${c}; not duplicating`);continue}let l=await r.createIssue(e,{title:`Drift: ${o.ruleName}`,body:`${o.message} + +`,labels:[Ys,`drift:${o.level}`],assignees:n.issueCreation.assignees});if(!l){s.warn(`Could not open an issue for ${o.ruleId}. Check that the token has \`issues: write\`.`);continue}s.info(`Filed ${o.ruleId} as issue #${l.number}`)}}async function DW(t,e,n,r,s){if(!e.outdated.enabled)return s.info("`outdated.enabled` is false in .github/drift.yml; skipping the scheduled outdated-dependency scan."),0;s.info("Scanning installed dependencies against their registries...");try{let i=await k_({root:r.workspace,repo:t,config:e,logger:s,githubToken:r.repoToken});s.info(`Checked ${i.checked} dependenc${i.checked===1?"y":"ies"}: ${i.upToDate} up to date, ${i.candidates.length} outdated, ${i.unchecked.length} could not be checked.`);let o=C_(i.candidates,{includeInformational:e.codeScanning.includeInformational,granularity:e.codeScanning.granularity,repoBlobUrl:`https://github.com/${t.owner}/${t.repo}/blob/${t.afterSha}`});await u$({repo:t,config:e,github:n,logger:s,findings:o,category:"drift/outdated"}),await d$({repo:t,config:e,github:n,logger:s,findings:o});let a=`Checked ${i.checked} dependenc${i.checked===1?"y":"ies"}: ${i.upToDate} up to date, ${i.candidates.length} outdated, ${i.unchecked.length} could not be checked.`;return await Rl({status:"skipped"},a),await No(`### Drift: outdated dependency scan + +${a} -${X.message} +`+(o.length>0?`${o.length} package(s) uploaded to the Security tab, each alert listing its breaking changes, their locations, and a fix. -${K}`,i)||(t.dispatchStore?i.warn(`Dispatch marker comment failed to post for plan ${g.planId} after retrying. The durable dispatch record still protects against a duplicate dispatch on retry.`):i.error(`Dispatch marker comment failed to post for plan ${g.planId} on #${m.issueNumber} after retrying, and no durable dispatch store is configured. A repeated \`/drift apply\` on this issue will not be recognised as already applied and may dispatch task ${X.taskId??"(no id)"} again${X.branchName?` on branch \`${X.branchName}\``:""}. A human should check the issue manually before approving it again.`));try{await t.onDispatched?.(X,v)}catch(Ge){i.error(`Failed to record dispatched task ${X.taskId??"(no id)"}: ${Ge.message}`),await s.createCheckRun(v,{name:"Drift",conclusion:"action_required",title:"Copilot task dispatched, but not tracked",summary:`Copilot task ${X.taskId??"(unknown id)"} was dispatched for this plan, but Drift could not record it for status tracking (${Ge.message}). It will not automatically receive a pass/fail update when it finishes \u2014 check ${X.pullRequestUrl??"the branch"} manually.`})}}else await s.commentOnIssue(a,m.issueNumber,`**Drift**: ${X.message}`);return await im({config:F,plan:_,result:X,dryRun:t.dryRun,approved:!0,latencyMs:Date.now()-o,logger:i}),{status:"applied",issueNumber:m.issueNumber,plan:_,dispatch:X,config:F}}async function cV(t,e){let{workspace:n,logger:r}=t;if(!n)return;let s=await At("git",["rev-parse","HEAD"],{cwd:n,timeoutMs:1e4});if(s.code!==0){r.warn(`Could not determine what \`${n}\` is checked out at, so Drift is not using it for localization.`);return}let i=s.stdout.trim();if(i===e||(await At("git",["fetch","--depth","1","origin",e],{cwd:n,timeoutMs:3e4})).code===0&&(await At("git",["checkout","--detach",e],{cwd:n,timeoutMs:1e4})).code===0)return n;r.warn(`The checkout is at ${i.slice(0,7)} but this plan describes ${e.slice(0,7)}, and Drift could not fetch and check out that commit. Skipping localization rather than reporting impact sites from the wrong tree.`)}async function Mr(t,e,n,r){t.dryRun||await t.github.commentOnIssue(e,n,`**Drift did not apply this plan.** +`:`Nothing rose to a Security tab alert. -${r}`)}async function lV(t,e,n,r,s,i=3,o=1e3){for(let a=1;a<=i;a++){if(await t.commentOnIssue(e,n,r))return!0;asetTimeout(e,t))}async function Ex(){let t=dV(),e=bx(t.logLevel);if(!t.repoToken)return e.error("No repository token available. Pass `repo-token: ${{ secrets.GITHUB_TOKEN }}` to the action, or set GITHUB_TOKEN."),1;let n=await pV(),r=process.env.GITHUB_EVENT_NAME??"",s=new Ga({repoToken:t.repoToken,logger:e});if(r==="issue_comment")return mV(n,t,s,e);let i=fV(n,t.workspace);if(!i)return e.error("Could not determine the repository and commit range from the event payload. Drift supports `push`, `workflow_dispatch`, and `issue_comment` events."),1;let{config:o,path:a,problems:c}=await Oa(async u=>gV(t.workspace,t.configPath??u));for(let u of c)e.warn(u);e.info(a?`Loaded config from ${a}`:"No drift.yml found; using defaults (mode: approve)");let l=t.mode?{...o,mode:t.mode}:o;if(!ir(l.watchBranches,i.baseBranch))return e.info(`Branch \`${i.baseBranch}\` is not in \`watchBranches\` (${l.watchBranches.join(", ")}); nothing to do.`),0;l.mode==="auto"&&!t.copilotToken&&!t.dryRun&&e.warn("mode is `auto` but no copilot-token input was supplied. Drift will analyse and file an approval issue instead of dispatching. See docs/copilot-integration.md.");try{let u=await hx({repo:i,config:l,logger:e,github:s,copilotToken:t.copilotToken,dryRun:t.dryRun,approved:!1,workspace:t.workspace});return await _x(u.dispatch,u.summary),u.plan&&await sl(_o(u.plan,l)),u.dispatch.status==="dispatched"&&await Sx({config:l,repo:i,dispatchResult:u.dispatch,github:s,copilotToken:t.copilotToken,logger:e}),u.dispatch.status==="failed"?1:0}catch(u){return e.error(`Drift failed: ${u.message}`),e.debug(u.stack??""),1}}function dV(){let t=Bs("mode");return{repoToken:Bs("repo-token")??process.env.GITHUB_TOKEN??"",copilotToken:Bs("copilot-token")||process.env.DRIFT_COPILOT_TOKEN||void 0,mode:t==="auto"||t==="approve"?t:void 0,dryRun:(Bs("dry-run")??"").toLowerCase()==="true",logLevel:Bs("log-level")||"info",workspace:process.env.GITHUB_WORKSPACE??process.cwd(),configPath:Bs("config-path")||void 0}}function Bs(t){let e=`INPUT_${t.replace(/ /g,"_").toUpperCase()}`;return process.env[e]?.trim()||void 0}async function pV(){let t=process.env.GITHUB_EVENT_PATH;if(!t)return{};try{return JSON.parse(await(0,am.readFile)(t,"utf8"))}catch{return{}}}function fV(t,e){let n=t.repository,r=n?.full_name??process.env.GITHUB_REPOSITORY;if(!r)return null;let[s,i]=r.split("/");if(!s||!i)return null;let a=(t.ref??process.env.GITHUB_REF??"").replace("refs/heads/","")||n?.default_branch||process.env.GITHUB_REF_NAME||"main",c=t.after??process.env.GITHUB_SHA??"";if(!c)return null;let l=t.before,u=l&&!/^0+$/.test(l)?l:`${c}^`;return{owner:s,repo:i,baseBranch:a,beforeSha:u,afterSha:c,workspace:e}}async function mV(t,e,n,r){let i=t.repository?.full_name??process.env.GITHUB_REPOSITORY,[o,a]=(i??"").split("/");if(!o||!a)return r.error("Could not determine the repository from the `issue_comment` event payload."),1;let c=await kx({payload:t,owner:o,repo:a,github:n,logger:r,...e.copilotToken?{copilotToken:e.copilotToken}:{},...e.dryRun?{dryRun:!0}:{},workspace:e.workspace,...e.mode?{configOverride:{mode:e.mode}}:{}});switch(c.status){case"ignored":return r.debug(`Not an approval: ${c.reason}`),0;case"rejected":return r.warn(`Approval refused on #${c.issueNumber}: ${c.reason}`),await sl(`### Drift did not apply this plan +`)+MW(i.candidates)),0}catch(i){return s.error(`Outdated-dependency scan failed: ${i.message}`),s.debug(i.stack??""),await Rl({status:"failed"},`Outdated-dependency scan failed: ${i.message}`),1}}function MW(t){return t.length===0?"":["| Package | Kind | Version | Upstream breaking changes | Locally affected | Risk |","| --- | --- | --- | --- | --- | --- |",...t.map(n=>{let r=n.selected===n.latest?`${n.current} \u2192 ${n.selected}`:`${n.current} \u2192 ${n.selected} (latest ${n.latest})`,s=n.breakingCount>0?`${n.impactCount} site(s) in ${n.impactFiles} file(s)`:"\u2014";return`| ${n.name} | ${Io[n.kind]} | ${r} | ${n.breakingCount} | ${s} | ${n.risk} |`})].join(` +`)}function NW(){let t=Gn("mode"),e=Gn("scan-mode"),n=Gn("alert-granularity");return{repoToken:Gn("repo-token")??process.env.GITHUB_TOKEN??"",copilotToken:Gn("copilot-token")||process.env.DRIFT_COPILOT_TOKEN||void 0,mode:t==="auto"||t==="approve"?t:void 0,dryRun:(Gn("dry-run")??"").toLowerCase()==="true",logLevel:Gn("log-level")||"info",workspace:process.env.GITHUB_WORKSPACE??process.cwd(),configPath:Gn("config-path")||void 0,scanMode:e==="outdated"?"outdated":e==="diff"?"diff":void 0,alertGranularity:n==="package"||n==="breakingChange"||n==="affectedSite"?n:void 0}}function Gn(t){let e=`INPUT_${t.replace(/ /g,"_").toUpperCase()}`;return process.env[e]?.trim()||void 0}async function LW(){let t=process.env.GITHUB_EVENT_PATH;if(!t)return{};try{return JSON.parse(await(0,Lm.readFile)(t,"utf8"))}catch{return{}}}function GW(t,e){let n=t.repository,r=n?.full_name??process.env.GITHUB_REPOSITORY;if(!r)return null;let[s,i]=r.split("/");if(!s||!i)return null;let a=(t.ref??process.env.GITHUB_REF??"").replace("refs/heads/","")||n?.default_branch||process.env.GITHUB_REF_NAME||"main",c=t.after??process.env.GITHUB_SHA??"";if(!c)return null;let l=t.before,u=l&&!/^0+$/.test(l)?l:`${c}^`;return{owner:s,repo:i,baseBranch:a,beforeSha:u,afterSha:c,workspace:e}}async function FW(t,e,n,r){let i=t.repository?.full_name??process.env.GITHUB_REPOSITORY,[o,a]=(i??"").split("/");if(!o||!a)return r.error("Could not determine the repository from the `issue_comment` event payload."),1;let c=await c$({payload:t,owner:o,repo:a,github:n,logger:r,...e.copilotToken?{copilotToken:e.copilotToken}:{},...e.dryRun?{dryRun:!0}:{},workspace:e.workspace,...e.mode?{configOverride:{mode:e.mode}}:{}});switch(c.status){case"ignored":return r.debug(`Not an approval: ${c.reason}`),0;case"rejected":return r.warn(`Approval refused on #${c.issueNumber}: ${c.reason}`),await No(`### Drift did not apply this plan -${c.reason}`),0;case"already-applied":return r.info(c.message),await sl(`### Drift +${c.reason}`),0;case"already-applied":return r.info(c.message),await No(`### Drift -${c.message}`),0;case"applied":return await _x(c.dispatch,c.dispatch.message),await sl(c.dispatch.message),c.dispatch.status==="dispatched"&&await Sx({config:c.config,repo:{owner:o,repo:a,baseBranch:"",beforeSha:"",afterSha:c.plan.headSha},dispatchResult:c.dispatch,github:n,copilotToken:e.copilotToken,logger:r}),c.dispatch.status==="failed"?1:0}}async function gV(t,e){try{return await(0,am.readFile)(`${t}/${e}`,"utf8")}catch{return null}}async function Sx(t){let{config:e,repo:n,dispatchResult:r,github:s,copilotToken:i,logger:o}=t,a=e.remediation.awaitCompletion;if(!a.enabled||!i||!r.taskId)return;o.info(`Waiting up to ${a.timeoutMinutes}m for Copilot task ${r.taskId} to finish (remediation.awaitCompletion is on)`);let c=await tx({copilotToken:i,repo:n,taskId:r.taskId,timeoutMs:a.timeoutMinutes*6e4,pollIntervalMs:a.pollIntervalSeconds*1e3});if(!c||!nm(c.state)){o.warn(`Copilot task ${r.taskId} had not reached a terminal state after ${a.timeoutMinutes}m; posting a final check run and giving up.`);let d=r.pullRequestUrl;await s.createCheckRun(n,{name:"Drift",conclusion:"action_required",title:"Copilot status tracking timed out",summary:`Drift waited ${a.timeoutMinutes}m for Copilot task ${r.taskId} to reach a terminal state but it did not. ${d?`See ${d} for its current state.`:"A human needs to check the task manually."}`});return}let l=c.state==="completed",u=r.pullRequestUrl??c.pullRequestUrl;await s.createCheckRun(n,{name:"Drift",conclusion:l?"success":"failure",title:l?"Copilot finished":`Copilot did not finish (${c.state})`,summary:l?u?`See ${u} for the result.`:"The agent task completed.":`The Copilot agent task ended in state \`${c.state}\` without finishing the fix. ${u?`See ${u} for what it left behind.`:"A human needs to look at this."}`}),o.info(`Copilot task ${r.taskId} reached terminal state ${c.state}`)}async function _x(t,e){let n=process.env.GITHUB_OUTPUT;if(!n)return;let r={status:t.status,summary:e,branch:t.branchName??"","pull-request-url":t.pullRequestUrl??"","approval-issue":t.approvalIssueNumber?.toString()??""},s=Object.entries(r).map(([i,o])=>o.includes(` +${c.message}`),0;case"applied":return await Rl(c.dispatch,c.dispatch.message),await No(c.dispatch.message),c.dispatch.status==="dispatched"&&await p$({config:c.config,repo:{owner:o,repo:a,baseBranch:"",beforeSha:"",afterSha:c.plan.headSha},dispatchResult:c.dispatch,github:n,copilotToken:e.copilotToken,logger:r}),c.dispatch.status==="failed"?1:0}}async function jW(t,e){try{return await(0,Lm.readFile)(`${t}/${e}`,"utf8")}catch{return null}}async function p$(t){let{config:e,repo:n,dispatchResult:r,github:s,copilotToken:i,logger:o}=t,a=e.remediation.awaitCompletion;if(!a.enabled||!i||!r.taskId)return;o.info(`Waiting up to ${a.timeoutMinutes}m for Copilot task ${r.taskId} to finish (remediation.awaitCompletion is on)`);let c=await U_({copilotToken:i,repo:n,taskId:r.taskId,timeoutMs:a.timeoutMinutes*6e4,pollIntervalMs:a.pollIntervalSeconds*1e3});if(!c||!Im(c.state)){o.warn(`Copilot task ${r.taskId} had not reached a terminal state after ${a.timeoutMinutes}m; posting a final check run and giving up.`);let d=r.pullRequestUrl;await s.createCheckRun(n,{name:"Drift",conclusion:"action_required",title:"Copilot status tracking timed out",summary:`Drift waited ${a.timeoutMinutes}m for Copilot task ${r.taskId} to reach a terminal state but it did not. ${d?`See ${d} for its current state.`:"A human needs to check the task manually."}`});return}let l=c.state==="completed",u=r.pullRequestUrl??c.pullRequestUrl;await s.createCheckRun(n,{name:"Drift",conclusion:l?"success":"failure",title:l?"Copilot finished":`Copilot did not finish (${c.state})`,summary:l?u?`See ${u} for the result.`:"The agent task completed.":`The Copilot agent task ended in state \`${c.state}\` without finishing the fix. ${u?`See ${u} for what it left behind.`:"A human needs to look at this."}`}),o.info(`Copilot task ${r.taskId} reached terminal state ${c.state}`)}async function Rl(t,e){let n=process.env.GITHUB_OUTPUT;if(!n)return;let r={status:t.status,summary:e,branch:t.branchName??"","pull-request-url":t.pullRequestUrl??"","approval-issue":t.approvalIssueNumber?.toString()??""},s=Object.entries(r).map(([i,o])=>o.includes(` `)?`${i}<{process.exitCode=t},t=>{console.log(`::error::Drift crashed: ${t.message}`),process.exitCode=1}); +`,"utf8")}catch{}}async function No(t){let e=process.env.GITHUB_STEP_SUMMARY;if(e)try{await(0,Gm.appendFile)(e,`${t} +`,"utf8")}catch{}}l$().then(t=>{process.exitCode=t},t=>{console.log(`::error::Drift crashed: ${t.message}`),process.exitCode=1}); /*! Bundled license information: content-type/dist/index.js: diff --git a/docs/configuration.md b/docs/configuration.md index 3de6eb4..e1d122a 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -11,7 +11,9 @@ Searched in order: `.github/drift.yml`, `.github/drift.yaml`, `drift.yml`, output and falls back to defaults — which are the safe, approval-required settings. -A copy-paste starting point: [`examples/drift.yml`](../examples/drift.yml). +A copy-paste starting point: [`examples/drift.yml`](../examples/drift.yml). Or pick +your options on the site's `/configure` page (built from [`site/src/app/configure`](../site/src/app/configure)) +and download a ready-to-commit `drift.yml` and workflow file. --- @@ -83,7 +85,7 @@ turn them on; all sixteen are already on. | `minor` | `true` | | | `patch` | `false` | Breakage here is usually accidental, but real | | `transitive` | `false` | Lockfile-only churn is constant and rarely actionable | -| `dev` | `false` | Dev dependencies rarely break production paths | +| `dev` | `true` | Dev, optional, and peer dependencies still run in CI and in some consumers' hands | **`0.x` minor bumps are always analysed**, regardless of `minor`, because semver §4 makes them breaking. @@ -217,6 +219,169 @@ shape before wiring a collector. --- +## Code scanning + +Every plan Drift produces can also be rendered as +[SARIF](https://sarif.readthedocs.io) and uploaded to the repository's code +scanning dashboard, so Drift's findings sit next to CodeQL's and Scorecard's +rather than only in a pull request or an approval issue. The unit of an +alert is one *locally actionable* finding, not one package: a breaking +change becomes an alert only when it has at least one impact site — code in +this repository that actually calls the affected symbol. An upstream change +that touches nothing here never reaches the Security tab at all (an early +version of this alerted on every upstream change regardless of local impact; +zod 3 -> 4 alone found 347 individually-true breaking changes against this +project, and reachable code here used exactly one of them). The full +upstream count is still visible — in the job summary for a scheduled scan, +and in the pull request body for a push — it just isn't a Security alert. + +Each alert is anchored to the highest-confidence call site as its primary +location, with every other site the same change reaches listed as a related +location. It carries what the extension's inline diagnostics carry — the +evidence (with citations), where the finding was found (including which +workspace member, in a monorepo), and a fix: the exact command for a safe +upgrade, the deterministic commit Drift will make once approved, or a note to +comment `/drift apply` on the approval issue Drift filed. Severity reflects +both dimensions of confidence: a proven upstream change (Drift computed the +diff itself) with only a loosely-matched local call site is a warning, not +an error — `error` is reserved for when both agree. + +`ruleId` names the *kind* of finding (`drift/removed-export`, +`drift/vulnerability`, `drift/outdated`, ...) rather than the package it was +found in, matching how GitHub's rule descriptors are meant to be used — a +category that changes rarely, not one minted per dependency. Each result +also carries a content-based fingerprint, so the same finding reconciles +across runs even when unrelated edits shift its line number. Push-triggered +and scheduled scans upload to separate categories, so one mode's result set +never overwrites the other's: each uploads its complete current finding set +for its own category, and GitHub's own code scanning reconciliation does the +rest from there — a finding updates in place to the newest commit when it +reappears, and closes on its own (marked "fixed") the first run it doesn't. +Drift never needs to dismiss or delete an alert itself. + +Requires the workflow job to grant `security-events: write` — +[`examples/workflows/drift.yml`](../examples/workflows/drift.yml) already +has it. Without that permission, Drift logs a warning naming the missing +permission and continues; nothing else about the run is affected. + +### `codeScanning.enabled` + +`boolean` — default **`true`** + +Upload findings to code scanning after every analysed push. + +### `codeScanning.includeInformational` + +`boolean` — default **`false`** + +Also alert on a dependency move with no breaking change and no security +signal — a plain "update available" with nothing to triage. Off by default: +that belongs in the job summary, not the Security tab. `true` adds one +low-severity alert per otherwise-quiet outdated dependency, for a team that +wants full dependency visibility in code scanning rather than just the +summary. + +### `codeScanning.granularity` + +`'package' | 'breakingChange' | 'affectedSite'` — default **`'package'`** + +How findings are grouped into alerts. + +- `'package'` folds every breaking change and security signal for one + dependency into a single alert. No single call site is representative of + the whole alert, so no code snippet is shown — just text and a list of + links. +- `'breakingChange'` opens one alert per breaking change instead, covering + every call site it reaches. The alert now covers one issue, so its + primary location's snippet is shown as a representative example. +- `'affectedSite'` opens one alert per individual call site. There's + exactly one location per alert, so its snippet is a direct view of that + line, not a stand-in for anything else. This is the noisiest mode — one + breaking change reaching fifty call sites becomes fifty alerts — hence + not the default. + +### `codeScanning.createIssuesPerAlert` + +`boolean` — default **`false`** + +Also open a GitHub issue for every alert, in addition to the code scanning +upload. Off by default, since code scanning already surfaces every alert on +the Security tab. Useful for teams that don't watch that tab, or that want +alerts triaged and assigned like any other issue. Each issue embeds the +alert's `ruleId` as a hidden marker, so a rescan finds the existing issue +instead of filing a duplicate — the body itself is not updated on a rescan. + +## Issue creation + +The one-click "file this" action offered wherever Drift shows a breaking +change — the CLI's interactive `analyze` prompt and the VS Code extension's +report view both read this block for their default, so the two surfaces +behave identically. Every action fails soft: no git repo, no `gh`/GitHub +token, or a request that errors out is logged (CLI) or shown as a +dismissable notification (extension), never a thrown error or a crashed +session. + +### `issueCreation.default` + +`'issue' | 'branch' | 'both'` — default **`'issue'`** + +What the primary action does. + +- `'issue'` files a GitHub issue with the finding's evidence and a + rescan-safe hidden marker, mirroring `codeScanning.createIssuesPerAlert`'s + dedup behaviour — re-triggering it finds the existing issue rather than + filing a duplicate. +- `'branch'` creates (or checks out, if it already exists) a local branch + named for the finding, with no issue filed. +- `'both'` does both and links them: the branch name is included in the + issue body. + +The extension's report view always offers the other two choices one click +away, in the button's dropdown, regardless of this setting. + +### `issueCreation.granularity` + +`'package' | 'change'` — default **`'package'`** + +What one issue/branch covers. + +- `'package'` bundles every breaking change for one dependency into a single + issue/branch — the option offered at each package's group header. +- `'change'` scopes the action to one breaking change at a time — useful + when different call sites of the same upgrade need to be triaged or + landed separately. This is also always offered on each individual finding, + regardless of this setting. + +### `issueCreation.assignees` + +`string[]` — default **`[]`** + +GitHub usernames to assign automatically to every issue Drift files — +approval issues, and per-alert issues opened via +`codeScanning.createIssuesPerAlert`. Empty by default; nobody is assigned +unless a team opts in. + +### `outdated.enabled` + +`boolean` — default **`false`** + +Proactive scanning of every *installed* dependency against its registry, +independent of any push — the same check `drift outdated` runs locally. +Off by default because, unlike the rest of this config, it has no push to +react to and needs a `schedule` trigger of its own; see +[`examples/workflows/drift-outdated.yml`](../examples/workflows/drift-outdated.yml). + +Each dependency it finds becomes a code scanning alert exactly like the ones +above. It does not open a branch or a pull request: a `RemediationPlan` from +this scan describes what fixing the code *would* look like if the upgrade +were taken, and dispatching that as a real commit would mean editing code for +an upgrade nobody applied yet. The alert's fix instead names the exact +command — `drift outdated --upgrade `, or the underlying package manager command — +that applies it; once that lands and is pushed, the ordinary push-triggered +pipeline above takes over exactly as it would for a human's own bump. + +--- + ## Upgrade rationale Why an upgrade might be worth taking, alongside what it might cost. On by @@ -687,7 +852,8 @@ mid-session. | `drift.agent.ollamaHost` / `ollamaModel` | `localhost:11434`, `qwen2.5-coder` | Local model | | `drift.agent.timeoutSeconds` | `600` | Per commit unit | | `drift.analysis.runOnStartup` | `true` | Analyse on open, and scan when the panel first opens | -| `drift.analysis.includePatch` / `includeDev` / `includeTransitive` | `false` | Widen `/recent` analysis | +| `drift.analysis.includePatch` / `includeTransitive` | `false` | Widen `/recent` analysis | +| `drift.analysis.includeDev` | `true` | Also analyse dev, optional, and peer dependencies | | `drift.analysis.ignore` | `[]` | Package patterns to skip, added to `ignore` in `drift.yml` | | `drift.ui.showInlineDiagnostics` | `true` | Flag affected lines in the Problems panel | | `drift.logLevel` | `info` | Output channel verbosity | diff --git a/eval/fixtures/npm-return-value/Dockerfile b/eval/fixtures/npm-return-value/Dockerfile index 3be34f0..b790984 100644 --- a/eval/fixtures/npm-return-value/Dockerfile +++ b/eval/fixtures/npm-return-value/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine +FROM node:22-alpine@sha256:c610fcdfb1d5b4740dd70c284ed3cb16bb857e0f7166196e36a5501df7a3aa32 WORKDIR /fixture/consumer COPY . /fixture CMD ["npm", "test"] diff --git a/examples/drift.yml b/examples/drift.yml index c031c45..5f17f54 100644 --- a/examples/drift.yml +++ b/examples/drift.yml @@ -67,8 +67,9 @@ triggerOn: # Lockfile-only moves you didn't ask for. Off by default because transitive # churn is constant and rarely actionable. transitive: false - # Dev dependencies rarely break production code paths. - dev: false + # Dev, optional, and peer dependencies still run in CI and in the hands of + # some consumers, so they are analysed by default alongside runtime ones. + dev: true # Never analyse these. Glob patterns match the package name. ignore: [] @@ -203,6 +204,38 @@ remediation: # # and reviewed the diff. # coAuthor: true +# --------------------------------------------------------------------------- +# Code scanning alerts +# --------------------------------------------------------------------------- + +# Every locally actionable finding Drift produces — a breaking change that +# reaches code in this repository, or a vulnerability — can also be uploaded +# as SARIF to the repository's code scanning dashboard: one alert per finding, +# anchored to the exact call site, carrying the same evidence and fix a pull +# request would. Needs `security-events: write` on the workflow; see +# examples/workflows/drift.yml. +codeScanning: + enabled: true + # Also alert on a plain "update available" with nothing broken and no + # security signal. Off by default — that's a job-summary line, not + # something a developer needs to triage in the Security tab. + includeInformational: false + # One alert per package (default), per breaking change, or per individual + # call site. Only 'breakingChange' and 'affectedSite' show a code snippet + # in the alert, since 'package' can bundle many call sites under one + # alert and no single one of them is representative. + granularity: package + # Also file a GitHub issue for every alert. Off by default — the Security + # tab already has them; turn this on if your team triages via issues. + createIssuesPerAlert: false + +# Proactive scanning of every *installed* dependency against its registry, +# independent of any push — the same check `drift outdated` runs locally. +# Off by default because it needs a `schedule` trigger of its own; see +# examples/workflows/drift-outdated.yml. +outdated: + enabled: false + # --------------------------------------------------------------------------- # Optional LLM assistance # --------------------------------------------------------------------------- diff --git a/examples/workflows/drift-outdated.yml b/examples/workflows/drift-outdated.yml new file mode 100644 index 0000000..43604cd --- /dev/null +++ b/examples/workflows/drift-outdated.yml @@ -0,0 +1,70 @@ +# Drift — alert on outdated dependencies nobody has bumped yet. +# +# The main `drift.yml` workflow reacts to a push that changes a manifest: it +# tells you whether the change that just landed is safe. This workflow asks a +# different question on a schedule — "what's outdated right now, and is it +# safe to take?" — the same check `drift outdated` runs locally, over every +# direct dependency's installed version. +# +# Nothing here creates a branch or opens a pull request. Each dependency it +# finds becomes a code scanning alert with its own evidence and fix: a safe +# upgrade gets the exact command to run, one with real breaking changes gets +# the same evidence a pull request would carry. Taking the fix is always a +# separate, deliberate step — see the alert for how. +# +# Copy this file to `.github/workflows/drift-outdated.yml`, and set +# `outdated.enabled: true` in `.github/drift.yml` — this workflow runs on the +# schedule below either way, but Drift itself declines to scan until that +# config flag is on, the same opt-in gate every other proactive Drift feature +# uses. + +name: Drift (outdated dependencies) + +on: + schedule: + # Every Monday at 09:00 UTC. Adjust to taste — this has no relationship + # to how often your dependencies actually change; it's how often you want + # to be reminded what's available. + - cron: '0 9 * * 1' + + # Run it on demand from the Actions tab. + workflow_dispatch: + inputs: + alert-granularity: + description: 'How code scanning alerts are grouped. Leave blank to use codeScanning.granularity from drift.yml.' + type: choice + options: ['', package, breakingChange, affectedSite] + default: '' + +permissions: + contents: read + security-events: write # upload code scanning alerts + +jobs: + drift-outdated: + runs-on: ubuntu-latest + + steps: + - name: Check out the repository + uses: actions/checkout@v5 + + # See examples/workflows/drift.yml for why these are here and how to + # add the ones your repository needs. + - name: Set up Go + uses: actions/setup-go@v5 + continue-on-error: true + with: + go-version-file: go.mod + cache: true + + - name: Run Drift + id: drift + uses: trydrift/drift@v0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + scan-mode: outdated + alert-granularity: ${{ inputs.alert-granularity }} + + - name: Report outcome + if: always() + run: echo "${{ steps.drift.outputs.status }}: ${{ steps.drift.outputs.summary }}" diff --git a/examples/workflows/drift.yml b/examples/workflows/drift.yml index bb07687..d6f59e1 100644 --- a/examples/workflows/drift.yml +++ b/examples/workflows/drift.yml @@ -8,7 +8,7 @@ # # Copy this file to `.github/workflows/drift.yml`. # -# Two things to know before you enable it: +# Three things to know before you enable it: # # 1. `copilot-token` is optional. Drift only needs it when a planned fix # remains after deterministic remediation and any enabled community @@ -21,6 +21,13 @@ # 2. Drift ships in `approve` mode by default: it analyses, files an issue, # and waits for you. Switch to `auto` in `.github/drift.yml` once you # trust what it produces. +# +# 3. Every plan is also uploaded to the Security tab as a code scanning +# alert — one per affected package, listing every place its breaking +# changes are used, with the same evidence and fix a pull request would +# carry — set `codeScanning.enabled: false` in `.github/drift.yml` to +# turn that off. To also alert on dependencies nobody has bumped yet, +# see examples/workflows/drift-outdated.yml. name: Drift @@ -93,6 +100,12 @@ on: # Lets you re-run Drift against the current commit from the Actions tab. workflow_dispatch: + inputs: + alert-granularity: + description: 'How code scanning alerts are grouped. Leave blank to use codeScanning.granularity from drift.yml.' + type: choice + options: ['', package, breakingChange, affectedSite] + default: '' # Enables the `/drift apply` approval flow on issues Drift files. # @@ -123,6 +136,7 @@ jobs: issues: write # file and comment on the approval issue pull-requests: write # let Copilot open the PR checks: write # post the Drift check run + security-events: write # upload code scanning alerts (codeScanning.enabled in drift.yml) steps: - name: Check out the repository @@ -190,6 +204,7 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} copilot-token: ${{ secrets.DRIFT_COPILOT_TOKEN }} + alert-granularity: ${{ inputs.alert-granularity }} - name: Report outcome if: always() diff --git a/extension/esbuild.mjs b/extension/esbuild.mjs index 11ceb0e..8ff58bc 100644 --- a/extension/esbuild.mjs +++ b/extension/esbuild.mjs @@ -17,6 +17,10 @@ const options = { minify: !process.argv.includes('--watch'), sourcemap: process.argv.includes('--watch'), logLevel: 'info', + // `verification/behavioural.ts` guards its `import.meta.url` use behind a + // `typeof __dirname` check that always takes the __dirname branch in this + // CJS bundle — esbuild's "empty-import-meta" warning is a false positive. + logOverride: { 'empty-import-meta': 'silent' }, }; /** diff --git a/extension/package.json b/extension/package.json index 398d725..005df80 100644 --- a/extension/package.json +++ b/extension/package.json @@ -520,8 +520,8 @@ }, "drift.analysis.includeDev": { "type": "boolean", - "default": false, - "description": "Analyse dev dependencies. They rarely break production code paths.", + "default": true, + "description": "Analyse dev, optional, and peer dependencies alongside runtime ones.", "order": 12 }, "drift.analysis.concurrency": { @@ -660,6 +660,36 @@ "markdownDescription": "Set from the git picker in the Drift panel. Whether Drift commits on its own.\n\nOn the default, **Ask me first**, nothing enters git history until you keep it.", "order": 32 }, + "drift.issueCreation.default": { + "type": "string", + "default": "issue", + "enum": [ + "issue", + "branch", + "both" + ], + "enumDescriptions": [ + "File a GitHub issue", + "Create a local branch", + "File an issue and create a branch, linked together" + ], + "markdownDescription": "What the one-click action button on a breaking change does. The other two are always one click away in the button's dropdown.\n\nShared with the CLI's own `issueCreation.default` config field, so both surfaces offer the same default.", + "order": 39 + }, + "drift.issueCreation.granularity": { + "type": "string", + "default": "package", + "enum": [ + "package", + "change" + ], + "enumDescriptions": [ + "One action bundles every breaking change for a package", + "One action per individual breaking change" + ], + "markdownDescription": "What one issue/branch covers. **Per package** (the default) is offered on each package's group header; **per change** is offered on each individual finding regardless of this setting.", + "order": 40 + }, "drift.logLevel": { "type": "string", "default": "info", diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 6da8c0c..7597bcd 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -25,6 +25,7 @@ import { vscodeWorkspaceFs } from './upgrades.js'; import { detectWorkspaces, memberDirectories } from '../../src/detect/workspace.js'; import type { RemediationPlan } from '../../src/types.js'; import { discoverNestedProjects } from '../../src/detect/nested.js'; +import type { IssueBranchAction } from './issue-actions.js'; /** * Drift for VS Code. @@ -289,6 +290,35 @@ function registerCommands( register('drift.pushBranch', () => pushBranch(state)); register('drift.switchRepo', () => switchRepo(state)); + + // The one-click "file this" action on a breaking-change row or a + // package's group header. `scope`/`id` name what to bundle — one finding + // by its id, or every finding for a dependency — and `action` is omitted + // for the button's primary click (the configured default) and supplied + // for its dropdown's other two choices. + register( + 'drift.fileBreakingChange', + (async (scope: 'change' | 'package', id: string, action?: IssueBranchAction) => { + const plan = state.plan; + const root = state.workspaceRoot; + if (!plan || !root) { + void vscode.window.showWarningMessage('Drift: nothing to file — run analyze first.'); + return; + } + + const changes = plan.breakingChanges.filter((change) => + scope === 'change' ? change.id === id : change.dependency === id, + ); + if (changes.length === 0) return; + + const resolvedAction = + action ?? + vscode.workspace.getConfiguration('drift').get('issueCreation.default', 'issue'); + + const { runIssueBranchAction } = await import('./issue-actions.js'); + await runIssueBranchAction(root, resolvedAction, { dependency: changes[0]!.dependency, changes }); + }) as never, + ); } /** diff --git a/extension/src/gh.ts b/extension/src/gh.ts index 472e1f8..17a7ead 100644 --- a/extension/src/gh.ts +++ b/extension/src/gh.ts @@ -216,7 +216,7 @@ function pullRequestFor(url: string, existing: boolean): PullRequest { } function numberIn(url: string): number { - return Number(/\/pull\/(\d+)/.exec(url)?.[1] ?? 0); + return Number(/\/(?:pull|issues)\/(\d+)/.exec(url)?.[1] ?? 0); } function describe(err: unknown): string { @@ -225,3 +225,87 @@ function describe(err: unknown): string { if (stderr) return stderr.split('\n').filter(Boolean).slice(-3).join(' '); return e.message ?? 'The GitHub CLI failed.'; } + +export interface GhIssueRequest { + /** A directory inside the repository the issue belongs to. */ + cwd: string; + title: string; + /** Passed as a file so no shell ever sees it, same as the PR body. */ + body: string; + labels?: readonly string[]; + /** + * A hidden marker already embedded in `body` — searched for first so a + * repeat of the same action finds the issue it already filed instead of + * piling up duplicates. See `src/actions/issue-branch.ts#issueMarker`. + */ + marker: string; +} + +export type GhIssueOutcome = + | { kind: 'opened'; number: number; url: string; existing: boolean } + | { kind: 'unavailable'; reason: 'not-installed' | 'not-authenticated' } + | { kind: 'failed'; message: string }; + +/** + * File a GitHub issue with `gh`, or find the one already filed for the same + * marker. Mirrors `createPullRequestWithGh`'s shape and the same + * never-throw contract — a missing or signed-out `gh` is reported, not + * raised, since this always runs from a button click with no one watching + * a stack trace. + */ +export async function createIssueWithGh(request: GhIssueRequest, run: GhRunner = defaultRunner): Promise { + const availability = await ghAvailability(request.cwd, run); + if (!availability.installed) return { kind: 'unavailable', reason: 'not-installed' }; + if (!availability.authenticated) return { kind: 'unavailable', reason: 'not-authenticated' }; + + const existing = await findIssueWithGh(request.cwd, request.marker, run); + if (existing) return { kind: 'opened', number: existing.number, url: existing.url, existing: true }; + + const dir = await mkdtemp(join(tmpdir(), 'drift-issue-')); + const bodyPath = join(dir, 'body.md'); + + try { + await writeFile(bodyPath, request.body, 'utf8'); + + const args = ['issue', 'create', '--title', request.title, '--body-file', bodyPath]; + for (const label of request.labels ?? []) args.push('--label', label); + + try { + const { stdout } = await run(args, { cwd: request.cwd }); + const url = issueUrlIn(stdout); + if (url) return { kind: 'opened', number: numberIn(url), url, existing: false }; + return { kind: 'failed', message: 'The GitHub CLI did not report an issue URL.' }; + } catch (err) { + return { kind: 'failed', message: describe(err) }; + } + } finally { + await rm(dir, { recursive: true, force: true }).catch(() => {}); + } +} + +/** The open issue already carrying `marker` in its body, if any. */ +async function findIssueWithGh( + cwd: string, + marker: string, + run: GhRunner, +): Promise<{ number: number; url: string } | null> { + try { + const { stdout } = await run( + ['search', 'issues', `"${marker}"`, '--state', 'open', '--json', 'number,url', '--limit', '1'], + { cwd }, + ); + const results = JSON.parse(stdout) as Array<{ number: number; url: string }>; + const match = results[0]; + return match ? { number: match.number, url: match.url } : null; + } catch { + return null; + } +} + +function issueUrlIn(stdout: string): string | null { + const lines = stdout.split('\n').map((line) => line.trim()).filter(Boolean); + for (const line of lines.reverse()) { + if (/^https?:\/\/\S+\/issues\/\d+$/.test(line)) return line; + } + return null; +} diff --git a/extension/src/issue-actions.ts b/extension/src/issue-actions.ts new file mode 100644 index 0000000..de548db --- /dev/null +++ b/extension/src/issue-actions.ts @@ -0,0 +1,126 @@ +import * as vscode from 'vscode'; +import { branchNameFor, buildIssueContent, issueMarker, type IssueBranchTarget } from '../../src/actions/issue-branch.js'; +import { Git } from './git.js'; +import { createIssueWithGh } from './gh.js'; +import { remoteSlug } from './ship.js'; + +/** + * The extension's side of the one-click issue/branch action. Reuses the + * same content builders the CLI's interactive prompt does + * (`src/actions/issue-branch.ts`) so a finding filed from a webview button + * reads identically to one filed from the terminal, but drives it with the + * extension's own `Git` wrapper and `gh` helper rather than the CLI's raw + * `execFile` calls and `GitHubClient`. + * + * Every path here ends in a VS Code notification, never a thrown error — + * this always runs from a button click with nothing watching a stack trace, + * and a folder with no git repo, no remote, or no `gh` signed in is a + * routine outcome, not a bug. + */ + +export type IssueBranchAction = 'issue' | 'branch' | 'both'; + +export async function runIssueBranchAction( + workspaceRoot: string, + action: IssueBranchAction, + target: IssueBranchTarget, +): Promise { + const git = new Git(workspaceRoot); + + const repoRoot = await git.repoRoot(); + if (!repoRoot) { + void vscode.window.showWarningMessage('Drift: this folder is not a git repository.'); + return; + } + + let branchName: string | undefined; + if (action === 'branch' || action === 'both') { + const outcome = await createBranch(git, target); + if (!outcome) { + if (action === 'branch') return; + } else { + branchName = outcome.name; + if (action === 'branch') { + void vscode.window.showInformationMessage( + outcome.created ? `Drift: created branch ${outcome.name}.` : `Drift: switched to branch ${outcome.name}.`, + ); + } + } + } + + if (action === 'issue' || action === 'both') { + await createIssue(git, workspaceRoot, target, branchName); + } +} + +async function createBranch(git: Git, target: IssueBranchTarget): Promise<{ created: boolean; name: string } | null> { + const name = branchNameFor(target); + try { + const { created } = await git.createBranch(name); + return { created, name }; + } catch (err) { + void vscode.window.showWarningMessage(`Drift: could not create branch ${name} — ${(err as Error).message}`); + return null; + } +} + +async function createIssue( + git: Git, + workspaceRoot: string, + target: IssueBranchTarget, + linkedBranch: string | undefined, +): Promise { + const remote = await git.remoteUrl(); + const slug = remoteSlug(remote); + const content = buildIssueContent(target, linkedBranch); + + if (!slug) { + void vscode.window.showWarningMessage('Drift: no GitHub remote configured — cannot file an issue.'); + return; + } + + const outcome = await vscode.window.withProgress( + { location: vscode.ProgressLocation.Window, title: 'Drift: filing a GitHub issue' }, + () => + createIssueWithGh({ + cwd: workspaceRoot, + title: content.title, + body: content.body, + labels: content.labels, + marker: issueMarker(target), + }), + ); + + if (outcome.kind === 'opened') { + const choice = await vscode.window.showInformationMessage( + outcome.existing + ? `Drift: issue #${outcome.number} was already open — ${outcome.url}` + : `Drift: filed issue #${outcome.number} — ${outcome.url}`, + 'Open issue', + ); + if (choice === 'Open issue') await vscode.env.openExternal(vscode.Uri.parse(outcome.url)); + return; + } + + if (outcome.kind === 'failed') { + void vscode.window.showWarningMessage(`Drift: could not file the issue — ${outcome.message}`); + return; + } + + // `gh` is missing or signed out — never a dead end: GitHub's own "new + // issue" page, prefilled, is one click away either way. + const url = newIssueUrl(slug, content); + const choice = await vscode.window.showWarningMessage( + outcome.reason === 'not-installed' + ? 'Drift: the GitHub CLI is not installed.' + : 'Drift: the GitHub CLI is not signed in.', + 'Open a prefilled issue on GitHub', + ); + if (choice === 'Open a prefilled issue on GitHub') await vscode.env.openExternal(vscode.Uri.parse(url)); +} + +function newIssueUrl(slug: string, content: { title: string; body: string; labels: string[] }): string { + const params = new URLSearchParams({ title: content.title, body: content.body }); + if (content.labels.length) params.set('labels', content.labels.join(',')); + return `https://github.com/${slug}/issues/new?${params.toString()}`; +} diff --git a/extension/src/ui/report.ts b/extension/src/ui/report.ts index a5faf8d..4b8c29d 100644 --- a/extension/src/ui/report.ts +++ b/extension/src/ui/report.ts @@ -399,10 +399,76 @@ function renderChangeGroup( const hasFocus = changes.some((change) => isFocusedChange(change, focus)); return `
${escapeHtml(title)}${changes.length} breaking change${changes.length === 1 ? '' : 's'} - ${changes.map((change) => renderChangeCard(change, plan, isFocusedChange(change, focus), pendingUpgrade)).join('')} + ${groupByDependency(changes) + .map(([dependency, depChanges]) => renderPackageGroup(dependency, depChanges, plan, focus, pendingUpgrade)) + .join('')}
`; } +/** Preserves first-seen order, so packages appear in the order Drift found them. */ +function groupByDependency(changes: readonly BreakingChange[]): [string, BreakingChange[]][] { + const byDependency = new Map(); + for (const change of changes) { + const list = byDependency.get(change.dependency); + if (list) list.push(change); + else byDependency.set(change.dependency, [change]); + } + return [...byDependency.entries()]; +} + +function renderPackageGroup( + dependency: string, + changes: readonly BreakingChange[], + plan: RemediationPlan, + focus: FocusTarget | undefined, + pendingUpgrade: boolean, +): string { + return `
+
+ ${escapeHtml(dependency)} + ${changes.length} breaking change${changes.length === 1 ? '' : 's'} + ${renderIssueBranchButton('package', dependency)} +
+ ${changes.map((change) => renderChangeCard(change, plan, isFocusedChange(change, focus), pendingUpgrade)).join('')} +
`; +} + +const ISSUE_BRANCH_ACTION_LABEL: Record<'issue' | 'branch' | 'both', string> = { + issue: 'File issue', + branch: 'Create branch', + both: 'Issue + branch', +}; + +/** + * The one-click "file this" split button: a primary click runs + * `issueCreation.default`, and a small caret opens the other two actions — + * so the common case is one click and every case stays two. `scope`/`id` + * become `drift.fileBreakingChange`'s first two arguments; the handler + * looks the finding(s) back up from the current plan, so nothing about a + * `BreakingChange` needs to round-trip through the webview. + */ +function renderIssueBranchButton(scope: 'change' | 'package', id: string): string { + const configured = vscode.workspace + .getConfiguration('drift') + .get<'issue' | 'branch' | 'both'>('issueCreation.default', 'issue'); + const primary = configured in ISSUE_BRANCH_ACTION_LABEL ? configured : 'issue'; + const others = (['issue', 'branch', 'both'] as const).filter((action) => action !== primary); + const args = (action: 'issue' | 'branch' | 'both' | null) => escapeAttr(JSON.stringify([scope, id, action])); + + return ` + + + + `; +} + function renderChangeCard( change: BreakingChange, plan: RemediationPlan, @@ -445,6 +511,7 @@ function renderChangeCard( ${change.confidence} ${escapeHtml(change.kind)} ${escapeHtml(change.dependency)} + ${renderIssueBranchButton('change', change.id)} ${renderConfidenceDetail(change)}

${escapeHtml(displaySummary(change, plan, pendingUpgrade))}

@@ -847,6 +914,24 @@ a:hover { text-decoration: underline; color: var(--vscode-textLink-activeForegro .change-group .card { border-width: 0 0 1px 3px; border-radius: 0; margin: 0; } .change-group .card:last-child { border-bottom: 0; } +.package-group + .package-group { border-top: 1px solid var(--vscode-panel-border); } +.package-head { display: flex; align-items: center; gap: 8px; padding: 8px 12px; + background: var(--vscode-editorWidget-background); flex-wrap: wrap; } +.package-head .dep { font-weight: 600; } +.package-head .split-action { margin-left: auto; } + +.split-action { position: relative; display: inline-flex; } +.split-action button.small { border-radius: 0; } +.split-action button.small:first-child { border-radius: 3px 0 0 3px; } +.split-action button.caret { border-radius: 0 3px 3px 0; border-left: none; padding: 3px 6px; } +.split-menu { position: absolute; top: 100%; right: 0; z-index: 10; margin-top: 2px; + display: flex; flex-direction: column; min-width: 140px; + background: var(--vscode-dropdown-background); border: 1px solid var(--vscode-dropdown-border); + border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,.25); overflow: hidden; } +.split-menu button { border: none; border-radius: 0; background: transparent; text-align: left; + padding: 6px 10px; font-size: 0.82em; color: var(--vscode-dropdown-foreground); } +.split-menu button:hover { background: var(--vscode-list-hoverBackground); } + .commits { padding-left: 20px; } .commits li { margin-bottom: 10px; } .commit-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 8px 0 12px; } @@ -922,7 +1007,22 @@ pre { background: var(--vscode-textCodeBlock-background); padding: 10px; border- const SCRIPT = ` const vscode = acquireVsCodeApi(); +function closeMenus() { + document.querySelectorAll('.split-menu').forEach((menu) => { menu.hidden = true; }); +} document.addEventListener('click', (event) => { + const toggle = event.target.closest('[data-menu-toggle]'); + if (toggle) { + const menu = toggle.nextElementSibling; + const wasOpen = menu && !menu.hidden; + closeMenus(); + if (menu) menu.hidden = wasOpen; + event.stopPropagation(); + return; + } + const insideMenu = event.target.closest('.split-menu'); + if (!insideMenu) closeMenus(); + const site = event.target.closest('[data-file]'); if (site) { vscode.postMessage({ type: 'openFile', file: site.dataset.file, line: Number(site.dataset.line) }); @@ -935,11 +1035,16 @@ document.addEventListener('click', (event) => { } const button = event.target.closest('[data-command]'); if (button) { - const arg = button.dataset.arg; + let args = []; + if (button.dataset.args !== undefined) { + try { args = JSON.parse(button.dataset.args); } catch { args = []; } + } else if (button.dataset.arg !== undefined) { + args = [Number(button.dataset.arg)]; + } vscode.postMessage({ type: 'command', command: button.dataset.command, - args: arg === undefined ? [] : [Number(arg)], + args, }); return; } diff --git a/extension/src/ui/webview.ts b/extension/src/ui/webview.ts index 08b7380..ed4026a 100644 --- a/extension/src/ui/webview.ts +++ b/extension/src/ui/webview.ts @@ -1157,6 +1157,14 @@ function renderBreak(change: BreakingChange, plan: RemediationPlan, expanded: bo
${change.symbols.length ? `

${change.symbols.map((s) => `${escapeHtml(s)}`).join(' ')}

` : ''} + ${ + // The declaration itself, before and after — the actual evidence for + // the summary above, scoped to just this change rather than the + // dependency's full evidence dump below. + change.before && change.after && change.before !== change.after + ? `
${renderMarkdown(`before: ${change.before}\nafter: ${change.after}`)}
` + : '' + }
Fix:
${renderMarkdown(change.remediation)}
${ sites.length diff --git a/extension/test/build.mjs b/extension/test/build.mjs index 7b7568d..5f64e51 100644 --- a/extension/test/build.mjs +++ b/extension/test/build.mjs @@ -17,6 +17,9 @@ await build({ outfile: 'dist/harness.cjs', alias: { vscode: './test/vscode-stub.ts' }, logLevel: 'warning', + // See extension/esbuild.mjs: behavioural.ts's import.meta.url branch is + // dead code in CJS bundles, so this warning is a false positive. + logOverride: { 'empty-import-meta': 'silent' }, }); /** @@ -35,5 +38,6 @@ for (const name of readdirSync('test').filter((f) => f.endsWith('.test.ts'))) { outfile: `dist/${name.replace(/\.ts$/, '.cjs')}`, alias: { vscode: './test/vscode-stub.ts' }, logLevel: 'warning', + logOverride: { 'empty-import-meta': 'silent' }, }); } diff --git a/package-lock.json b/package-lock.json index a77cb26..1880d2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,8 @@ "devDependencies": { "@types/node": "^22.10.5", "@types/semver": "^7.5.8", - "esbuild": "^0.28.1" + "esbuild": "^0.28.1", + "fast-check": "^4.9.0" }, "engines": { "node": ">=22.6.0" @@ -1131,6 +1132,29 @@ "@esbuild/win32-x64": "0.28.1" } }, + "node_modules/fast-check": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz", + "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^8.0.0" + }, + "engines": { + "node": ">=12.17.0" + } + }, "node_modules/json-schema-to-ts": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", @@ -1151,6 +1175,23 @@ "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", "license": "MIT" }, + "node_modules/pure-rand": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz", + "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", diff --git a/package.json b/package.json index 5d8ea93..1b03c30 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,8 @@ "devDependencies": { "@types/node": "^22.10.5", "@types/semver": "^7.5.8", - "esbuild": "^0.28.1" + "esbuild": "^0.28.1", + "fast-check": "^4.9.0" }, "keywords": [ "dependencies", diff --git a/scripts/build-action.mjs b/scripts/build-action.mjs index 2e50747..70d145e 100644 --- a/scripts/build-action.mjs +++ b/scripts/build-action.mjs @@ -35,6 +35,7 @@ execFileSync( '--target=node24', '--format=cjs', '--minify', + '--log-override:empty-import-meta=silent', '--outfile=action/index.cjs', ], { cwd: repoRoot, stdio: 'inherit' }, diff --git a/scripts/build-workflow.mjs b/scripts/build-workflow.mjs index 18f6380..10f51ab 100644 --- a/scripts/build-workflow.mjs +++ b/scripts/build-workflow.mjs @@ -36,7 +36,7 @@ const workflow = `# Drift — detect breaking dependency changes and fix them. # # Copy this file to \`.github/workflows/drift.yml\`. # -# Two things to know before you enable it: +# Three things to know before you enable it: # # 1. \`copilot-token\` is optional. Drift only needs it when a planned fix # remains after deterministic remediation and any enabled community @@ -49,6 +49,13 @@ const workflow = `# Drift — detect breaking dependency changes and fix them. # 2. Drift ships in \`approve\` mode by default: it analyses, files an issue, # and waits for you. Switch to \`auto\` in \`.github/drift.yml\` once you # trust what it produces. +# +# 3. Every plan is also uploaded to the Security tab as a code scanning +# alert — one per affected package, listing every place its breaking +# changes are used, with the same evidence and fix a pull request would +# carry — set \`codeScanning.enabled: false\` in \`.github/drift.yml\` to +# turn that off. To also alert on dependencies nobody has bumped yet, +# see examples/workflows/drift-outdated.yml. name: Drift @@ -65,6 +72,12 @@ ${paths} # Lets you re-run Drift against the current commit from the Actions tab. workflow_dispatch: + inputs: + alert-granularity: + description: 'How code scanning alerts are grouped. Leave blank to use codeScanning.granularity from drift.yml.' + type: choice + options: ['', package, breakingChange, affectedSite] + default: '' # Enables the \`/drift apply\` approval flow on issues Drift files. # @@ -95,6 +108,7 @@ jobs: issues: write # file and comment on the approval issue pull-requests: write # let Copilot open the PR checks: write # post the Drift check run + security-events: write # upload code scanning alerts (codeScanning.enabled in drift.yml) steps: - name: Check out the repository @@ -162,6 +176,7 @@ jobs: with: repo-token: \${{ secrets.GITHUB_TOKEN }} copilot-token: \${{ secrets.DRIFT_COPILOT_TOKEN }} + alert-granularity: \${{ inputs.alert-granularity }} - name: Report outcome if: always() diff --git a/site/src/app/configure/page.tsx b/site/src/app/configure/page.tsx new file mode 100644 index 0000000..4134692 --- /dev/null +++ b/site/src/app/configure/page.tsx @@ -0,0 +1,102 @@ +import type { Metadata } from "next"; +import { instrumentSerif } from "@/lib/fonts"; +import { Backdrop } from "@/components/backdrop"; +import { ThemeToggle } from "@/components/theme-toggle"; +import { ConfigureForm } from "@/components/configure-form"; +import { WORKFLOW_TEMPLATE, OUTDATED_WORKFLOW_TEMPLATE } from "@/lib/action-templates"; + +export const metadata: Metadata = { + title: "Configure the Drift Action", + description: + "Pick the options you want and download a ready-to-commit .github/drift.yml and workflow file.", +}; + +const GITHUB = "https://github.com/trydrift/Drift"; + +/** + * A form over the same options `.github/drift.yml` and the example + * workflows accept, ending in a file a visitor can copy or download — + * for teams who would rather pick from a list than read the full + * configuration reference first. + */ +export default function Configure() { + return ( +
+ + +
+ + Drift + + +
+ +
+
+

+ // configure +

+

+ Build your drift.yml +

+

+ Every option here starts at Drift’s own default, so leaving everything alone gets you the + same zero-config install described on the{" "} + + main page + + . Change what you need, then copy or download the result into{" "} + .github/ — see the{" "} + + full configuration reference + {" "} + for every field not covered below. +

+ + +
+
+ + +
+ ); +} diff --git a/site/src/app/page.tsx b/site/src/app/page.tsx index 927239b..cfe694a 100644 --- a/site/src/app/page.tsx +++ b/site/src/app/page.tsx @@ -61,6 +61,12 @@ export default function Home() { > Action + + Configure + Checks first, approval next, pull request only after you allow it.{" "} - See the run. + See the run.{" "} + Or build your own drift.yml.
diff --git a/site/src/components/configure-form.tsx b/site/src/components/configure-form.tsx new file mode 100644 index 0000000..8dcd9f7 --- /dev/null +++ b/site/src/components/configure-form.tsx @@ -0,0 +1,295 @@ +"use client"; + +import { useMemo, useState } from "react"; +import { cn } from "@/lib/cn"; +import { + DEFAULT_OPTIONS, + generateDriftYaml, + generateWorkflow, + type ConfigureOptions, +} from "@/lib/generate-config"; + +/** + * Pick the options, get the two files back. Every field starts at Drift's + * own default (see `DEFAULT_OPTIONS`), so a visitor who changes nothing gets + * exactly the zero-config install the rest of the site describes. + */ +export function ConfigureForm({ + workflowTemplate, + outdatedTemplate, +}: { + workflowTemplate: string; + outdatedTemplate: string; +}) { + const [opts, setOpts] = useState(DEFAULT_OPTIONS); + + const set = (key: K, value: ConfigureOptions[K]) => + setOpts((prev) => ({ ...prev, [key]: value })); + + const driftYaml = useMemo(() => generateDriftYaml(opts), [opts]); + const workflowYaml = useMemo(() => generateWorkflow(workflowTemplate, opts, "diff"), [workflowTemplate, opts]); + const outdatedYaml = useMemo( + () => generateWorkflow(outdatedTemplate, opts, "outdated"), + [outdatedTemplate, opts], + ); + + return ( +
+
+ + set("mode", v)} + options={[ + { value: "approve", label: "Approve" }, + { value: "auto", label: "Auto" }, + ]} + /> + + + {opts.mode === "auto" && ( + + set("granularity", v as ConfigureOptions["granularity"])} + options={["package", "breakingChange", "affectedSite"]} + /> + + +
+ set("includeInformational", v)} + label="Include informational findings (safe upgrades, resolved advisories)" + /> + set("createIssuesPerAlert", v)} + label="Also file a GitHub issue per alert" + /> +
+
+ + )} + + +
+ set("issueGranularity", v as ConfigureOptions["issueGranularity"])} + options={["package", "change"]} + /> + set("assignees", v)} + placeholder="GitHub usernames to auto-assign" + /> +
+
+ + +
+ set("prLabels", v)} placeholder="Labels, comma-separated" /> + set("prReviewers", v)} + placeholder="Reviewers, comma-separated" + /> + set("prDraft", v)} label="Open as draft" /> +
+
+ + + set("outdatedEnabled", v)} label="Enabled" /> + + + +
+ set("copilotToken", v)} + label="Include copilot-token (agent fallback for fixes Drift can't resolve itself)" + /> + set("dryRun", v)} label="dry-run — report only, write nothing" /> +
+
+
+ +
+ + + {opts.outdatedEnabled && } +
+
+ ); +} + +/* ── Form controls ─────────────────────────────────────────────────────── */ + +function Field({ label, hint, children }: { label: string; hint: string; children: React.ReactNode }) { + return ( +
+ {label &&

{label}

} + {hint &&

{hint}

} +
{children}
+
+ ); +} + +function Segmented({ + value, + onChange, + options, +}: { + value: T; + onChange: (v: T) => void; + options: { value: T; label: string }[]; +}) { + return ( +
+ {options.map((opt) => ( + + ))} +
+ ); +} + +function Select({ value, onChange, options }: { value: string; onChange: (v: string) => void; options: string[] }) { + return ( + + ); +} + +function Toggle({ checked, onChange, label }: { checked: boolean; onChange: (v: boolean) => void; label: string }) { + return ( + + ); +} + +function TextList({ + value, + onChange, + placeholder, +}: { + value: string[]; + onChange: (v: string[]) => void; + placeholder: string; +}) { + const [text, setText] = useState(value.join(", ")); + + return ( + { + setText(e.target.value); + onChange( + e.target.value + .split(",") + .map((s) => s.trim()) + .filter(Boolean), + ); + }} + className="w-full rounded-lg border border-border bg-surface px-3 py-1.5 text-[12.5px] text-foreground outline-none placeholder:text-faint focus:border-brand" + /> + ); +} + +/* ── Output panel ──────────────────────────────────────────────────────── */ + +function FileOutput({ filename, content }: { filename: string; content: string }) { + const [copied, setCopied] = useState(false); + + const copy = async () => { + try { + await navigator.clipboard.writeText(content); + setCopied(true); + setTimeout(() => setCopied(false), 1500); + } catch { + // Clipboard access denied — the text is still selectable in the panel. + } + }; + + const downloadHref = `data:text/yaml;charset=utf-8,${encodeURIComponent(content)}`; + const downloadName = filename.split("/").pop() ?? "drift.yml"; + + return ( +
+
+ {filename} +
+ + + Download + +
+
+
+        {content}
+      
+
+ ); +} diff --git a/site/src/lib/action-templates.ts b/site/src/lib/action-templates.ts new file mode 100644 index 0000000..1b8086e --- /dev/null +++ b/site/src/lib/action-templates.ts @@ -0,0 +1,20 @@ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +/** + * The example workflow files, read straight from the repo rather than + * duplicated here — `examples/workflows/*.yml` are the single source of + * truth (`drift.yml` is itself generated from the manifest registry, see + * `scripts/build-workflow.mjs`), and copying their content into the site + * would just be a second place for them to go stale. This runs at build + * time only: the site is a static export, so there is no request-time + * Node process to read from. + */ + +const repoRoot = join(process.cwd(), ".."); + +export const WORKFLOW_TEMPLATE = readFileSync(join(repoRoot, "examples/workflows/drift.yml"), "utf8"); +export const OUTDATED_WORKFLOW_TEMPLATE = readFileSync( + join(repoRoot, "examples/workflows/drift-outdated.yml"), + "utf8", +); diff --git a/site/src/lib/generate-config.ts b/site/src/lib/generate-config.ts new file mode 100644 index 0000000..8547247 --- /dev/null +++ b/site/src/lib/generate-config.ts @@ -0,0 +1,209 @@ +/** + * Turns the picks made on `/configure` into a `.github/drift.yml` and the + * matching `.github/workflows/drift.yml` `with:` block. + * + * `drift.yml` only ever needs to state what differs from Drift's own + * defaults — every field not present falls back to the conservative default + * described in `docs/configuration.md` — so the generator only emits a key + * once its value has actually moved off that default. A form that always + * dumped every field would produce a config no shorter (and no more + * readable) than pasting the whole schema. + */ + +export type Mode = "approve" | "auto"; +export type MaxAutoRisk = "none" | "low" | "medium" | "high"; +export type AlertGranularity = "package" | "breakingChange" | "affectedSite"; +export type IssueDefault = "issue" | "branch" | "both"; +export type IssueGranularity = "package" | "change"; + +export interface ConfigureOptions { + mode: Mode; + maxAutoRisk: MaxAutoRisk; + watchBranches: string[]; + codeScanningEnabled: boolean; + granularity: AlertGranularity; + includeInformational: boolean; + createIssuesPerAlert: boolean; + issueDefault: IssueDefault; + issueGranularity: IssueGranularity; + assignees: string[]; + prLabels: string[]; + prReviewers: string[]; + prDraft: boolean; + outdatedEnabled: boolean; + copilotToken: boolean; + dryRun: boolean; +} + +export const DEFAULT_OPTIONS: ConfigureOptions = { + mode: "approve", + maxAutoRisk: "medium", + watchBranches: ["main", "master", "develop"], + codeScanningEnabled: true, + granularity: "package", + includeInformational: false, + createIssuesPerAlert: false, + issueDefault: "issue", + issueGranularity: "package", + assignees: [], + prLabels: [], + prReviewers: [], + prDraft: false, + outdatedEnabled: false, + copilotToken: true, + dryRun: false, +}; + +const sameList = (a: readonly string[], b: readonly string[]): boolean => + a.length === b.length && a.every((v, i) => v === b[i]); + +/** A YAML flow sequence of quoted strings, e.g. `['a', 'b']`. Empty renders as `[]`. */ +function stringList(values: readonly string[]): string { + return `[${values.map((v) => `'${v.replace(/'/g, "''")}'`).join(", ")}]`; +} + +/** + * The `.github/drift.yml` for these options — only the keys that differ from + * `DEFAULT_OPTIONS`, each with a one-line comment, so the file stays a + * legible diff against Drift's own defaults rather than a restatement of + * the whole schema. An all-default selection returns just the header. + */ +export function generateDriftYaml(opts: ConfigureOptions): string { + const lines: string[] = ["# .github/drift.yml — generated from Drift's /configure page", ""]; + const before = lines.length; + + if (opts.mode !== DEFAULT_OPTIONS.mode) { + lines.push( + opts.mode === "auto" + ? "# Dispatch a fix as soon as a breaking change is detected, subject to maxAutoRisk and every guardrail below." + : "# Analyse and file an approval issue for a human; never dispatch automatically.", + `mode: ${opts.mode}`, + "", + ); + } + + if (opts.mode === "auto" && opts.maxAutoRisk !== DEFAULT_OPTIONS.maxAutoRisk) { + lines.push( + "# Highest risk level eligible for automatic dispatch; anything above falls back to approval.", + `maxAutoRisk: ${opts.maxAutoRisk}`, + "", + ); + } + + if (!sameList(opts.watchBranches, DEFAULT_OPTIONS.watchBranches)) { + lines.push("# Branches Drift acts on.", `watchBranches: ${stringList(opts.watchBranches)}`, ""); + } + + const codeScanningLines: string[] = []; + if (opts.codeScanningEnabled !== DEFAULT_OPTIONS.codeScanningEnabled) { + codeScanningLines.push(` enabled: ${opts.codeScanningEnabled}`); + } + if (opts.granularity !== DEFAULT_OPTIONS.granularity) { + codeScanningLines.push(` granularity: ${opts.granularity}`); + } + if (opts.includeInformational !== DEFAULT_OPTIONS.includeInformational) { + codeScanningLines.push(` includeInformational: ${opts.includeInformational}`); + } + if (opts.createIssuesPerAlert !== DEFAULT_OPTIONS.createIssuesPerAlert) { + codeScanningLines.push(` createIssuesPerAlert: ${opts.createIssuesPerAlert}`); + } + if (codeScanningLines.length > 0) { + lines.push( + "# What's uploaded to the Security tab, and how alerts are grouped.", + "codeScanning:", + ...codeScanningLines, + "", + ); + } + + const issueCreationLines: string[] = []; + if (opts.issueDefault !== DEFAULT_OPTIONS.issueDefault) { + issueCreationLines.push(` default: ${opts.issueDefault}`); + } + if (opts.issueGranularity !== DEFAULT_OPTIONS.issueGranularity) { + issueCreationLines.push(` granularity: ${opts.issueGranularity}`); + } + if (opts.assignees.length > 0) { + issueCreationLines.push(` assignees: ${stringList(opts.assignees)}`); + } + if (issueCreationLines.length > 0) { + lines.push( + "# The one-click \"file this\" action offered by the CLI and the VS Code extension.", + "issueCreation:", + ...issueCreationLines, + "", + ); + } + + const pullRequestLines: string[] = []; + if (opts.prLabels.length > 0) pullRequestLines.push(` labels: ${stringList(opts.prLabels)}`); + if (opts.prReviewers.length > 0) pullRequestLines.push(` reviewers: ${stringList(opts.prReviewers)}`); + if (opts.prDraft !== DEFAULT_OPTIONS.prDraft) pullRequestLines.push(` draft: ${opts.prDraft}`); + if (pullRequestLines.length > 0) { + lines.push("# Applied to every pull request Drift opens.", "pullRequest:", ...pullRequestLines, ""); + } + + if (opts.outdatedEnabled !== DEFAULT_OPTIONS.outdatedEnabled) { + lines.push( + "# Proactively scan every installed dependency's version, not just the ones a push just bumped.", + "outdated:", + ` enabled: ${opts.outdatedEnabled}`, + "", + ); + } + + if (lines.length === before) { + lines.push("# Every option below is already Drift's default — nothing to override.", ""); + } + + return lines.join("\n").replace(/\n+$/, "\n"); +} + +/** + * Patches the example workflow's `with:` block for the "Run Drift" step to + * match these options, leaving every trigger, permission, and toolchain + * step from the template untouched. The template comes from + * `examples/workflows/*.yml` (see `action-templates.ts`) rather than being + * rebuilt here, so the trigger-path list and every comment stay exactly + * what ships in the repo. + */ +export function generateWorkflow(template: string, opts: ConfigureOptions, kind: "diff" | "outdated"): string { + const withLines = [" with:", " repo-token: ${{ secrets.GITHUB_TOKEN }}"]; + if (kind === "diff" && opts.copilotToken) { + withLines.push(" copilot-token: ${{ secrets.DRIFT_COPILOT_TOKEN }}"); + } + if (kind === "outdated") { + withLines.push(" scan-mode: outdated"); + } + if (kind === "diff" && opts.mode !== DEFAULT_OPTIONS.mode) { + withLines.push(` mode: ${opts.mode}`); + } + if (kind === "diff" && opts.dryRun) { + withLines.push(" dry-run: 'true'"); + } + withLines.push(" alert-granularity: ${{ inputs.alert-granularity }}"); + + const anchor = + kind === "diff" + ? [ + " with:", + " repo-token: ${{ secrets.GITHUB_TOKEN }}", + " copilot-token: ${{ secrets.DRIFT_COPILOT_TOKEN }}", + " alert-granularity: ${{ inputs.alert-granularity }}", + ].join("\n") + : [ + " with:", + " repo-token: ${{ secrets.GITHUB_TOKEN }}", + " scan-mode: outdated", + " alert-granularity: ${{ inputs.alert-granularity }}", + ].join("\n"); + + if (!template.includes(anchor)) { + // The committed template moved out from under this generator — fail + // visibly in the preview rather than silently shipping the unmodified + // template with none of the form's choices applied. + return `# Could not locate the "Run Drift" step in the template to customise.\n# Please copy examples/workflows/${kind === "diff" ? "drift.yml" : "drift-outdated.yml"} directly.\n\n${template}`; + } + + return template.replace(anchor, withLines.join("\n")); +} diff --git a/src/actions/cli-actions.ts b/src/actions/cli-actions.ts new file mode 100644 index 0000000..a99bb18 --- /dev/null +++ b/src/actions/cli-actions.ts @@ -0,0 +1,102 @@ +import { execFile } from 'node:child_process'; +import { promisify } from 'node:util'; +import type { GitHubClient } from '../github/client.js'; +import type { RepoContext } from '../types.js'; +import type { Logger } from '../util/logger.js'; +import { + branchNameFor, + buildIssueContent, + issueMarker, + type IssueBranchOutcome, + type IssueBranchTarget, +} from './issue-branch.js'; + +const run = promisify(execFile); + +/** + * The CLI's side of the one-click issue/branch action: plain `git` shelled + * out with `execFile` (there is no extension-style `Git` wrapper outside + * `extension/src/git.ts`, and this needs none of its worktree machinery), + * and the `GitHubClient` the CLI already constructs for every command. + * Every function here returns an `IssueBranchOutcome` and never throws — a + * missing repo, a missing token, or a rejected API call is data the caller + * decides what to do with, not a crash. + */ + +/** File (or find) the GitHub issue for a target. */ +export async function createIssueForTarget( + github: GitHubClient | null, + repo: RepoContext, + target: IssueBranchTarget, + logger: Logger, + linkedBranch?: string, +): Promise { + if (!github) return { kind: 'unavailable', reason: 'no-token' }; + + const marker = issueMarker(target); + const existing = await github.findOpenPlanIssue(repo, marker); + if (existing !== null) { + logger.debug(`${target.dependency} already filed as issue #${existing}; not duplicating`); + return { + kind: 'issue', + status: 'existing', + number: existing, + url: `https://github.com/${repo.owner}/${repo.repo}/issues/${existing}`, + }; + } + + const content = buildIssueContent(target, linkedBranch); + const issue = await github.createIssue(repo, content); + if (!issue) { + return { kind: 'failed', message: 'GitHub did not accept the issue. Check that the token has `issues: write`.' }; + } + return { kind: 'issue', status: 'created', number: issue.number, url: issue.url }; +} + +/** Create (or check out) a local branch for a target. */ +export async function createBranchForTarget( + workspace: string, + target: IssueBranchTarget, + logger: Logger, +): Promise { + const insideRepo = await git(['rev-parse', '--is-inside-work-tree'], workspace); + if (insideRepo?.trim() !== 'true') return { kind: 'unavailable', reason: 'no-git-repo' }; + + const name = branchNameFor(target); + const exists = (await git(['rev-parse', '--verify', '--quiet', `refs/heads/${name}`], workspace)) !== null; + + try { + if (exists) { + await run('git', ['checkout', name], { cwd: workspace, windowsHide: true }); + return { kind: 'branch', status: 'existing', name }; + } + await run('git', ['checkout', '-b', name], { cwd: workspace, windowsHide: true }); + return { kind: 'branch', status: 'created', name }; + } catch (err) { + logger.warn(`Could not create branch ${name}: ${(err as Error).message}`); + return { kind: 'failed', message: (err as Error).message }; + } +} + +/** Run both actions for a target, linking the issue to the branch it creates. */ +export async function createIssueAndBranchForTarget( + github: GitHubClient | null, + repo: RepoContext, + workspace: string, + target: IssueBranchTarget, + logger: Logger, +): Promise<{ branch: IssueBranchOutcome; issue: IssueBranchOutcome }> { + const branch = await createBranchForTarget(workspace, target, logger); + const linkedBranch = branch.kind === 'branch' ? branch.name : undefined; + const issue = await createIssueForTarget(github, repo, target, logger, linkedBranch); + return { branch, issue }; +} + +async function git(args: string[], cwd: string): Promise { + try { + const { stdout } = await run('git', args, { cwd, windowsHide: true }); + return stdout; + } catch { + return null; + } +} diff --git a/src/actions/issue-branch.ts b/src/actions/issue-branch.ts new file mode 100644 index 0000000..eb255f7 --- /dev/null +++ b/src/actions/issue-branch.ts @@ -0,0 +1,129 @@ +import type { BreakingChange } from '../types.js'; + +/** + * The one-click "file this" action offered wherever Drift shows a breaking + * change — content-only. Everything here is pure and side-effect free on + * purpose: the CLI's interactive prompt and the VS Code extension's report + * webview each drive their own git/`gh`/Octokit calls (different runtimes, + * different credentials), but both need the exact same title, body, marker, + * and branch name for the same finding. Building that text in one place is + * what keeps an issue filed from the terminal indistinguishable from one + * filed by clicking a button in the editor. + */ + +export type IssueBranchAction = 'issue' | 'branch' | 'both'; +export type IssueBranchScope = 'change' | 'package'; + +/** One or more breaking changes bundled into a single issue/branch. */ +export interface IssueBranchTarget { + dependency: string; + changes: readonly BreakingChange[]; +} + +/** + * Group breaking changes for the action's scope. + * + * `'package'` folds every finding for one dependency into a single target, + * matching `codeScanning.granularity`'s `'package'` mode. `'change'` gives + * each finding its own target, one per element of `changes` — used when the + * action is triggered from an individual row rather than a group header. + */ +export function groupForAction( + changes: readonly BreakingChange[], + scope: IssueBranchScope, +): IssueBranchTarget[] { + if (scope === 'change') { + return changes.map((change) => ({ dependency: change.dependency, changes: [change] })); + } + + const byDependency = new Map(); + for (const change of changes) { + const list = byDependency.get(change.dependency); + if (list) list.push(change); + else byDependency.set(change.dependency, [change]); + } + return [...byDependency.entries()].map(([dependency, grouped]) => ({ dependency, changes: grouped })); +} + +/** + * A hidden HTML-comment marker embedded in every issue this feature files, + * mirroring `codeScanning.createIssuesPerAlert`'s dedup marker + * (`src/runners/action.ts`). Content-derived from the target's dependency + * and finding ids, so re-triggering the same action always looks up the + * same marker and finds the issue it already filed rather than piling up + * duplicates. + */ +export function issueMarker(target: IssueBranchTarget): string { + const ids = [...target.changes.map((change) => change.id)].sort().join(','); + return `drift-issue:${target.dependency}:${ids}`; +} + +export interface IssueContent { + title: string; + body: string; + labels: string[]; +} + +function slugify(value: string): string { + return value + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, 60); +} + +/** Deterministic branch name for a target, safe as a git ref component. */ +export function branchNameFor(target: IssueBranchTarget): string { + if (target.changes.length === 1) { + return `drift/${slugify(target.dependency)}/${slugify(target.changes[0]!.id)}`; + } + return `drift/${slugify(target.dependency)}`; +} + +/** + * The issue's title and body for a target, optionally linking to a branch + * already created for the same finding(s) — the `'both'` action's contract. + */ +export function buildIssueContent(target: IssueBranchTarget, linkedBranch?: string): IssueContent { + const title = + target.changes.length === 1 + ? `Drift: ${target.dependency} — ${target.changes[0]!.summary}` + : `Drift: ${target.dependency} — ${target.changes.length} breaking changes`; + + const sections = target.changes.map((change) => { + const lines = [`### ${change.summary}`, '', change.remediation]; + if (change.before || change.after) { + lines.push('', '```diff', change.before ? `- ${change.before}` : '', change.after ? `+ ${change.after}` : '', '```'); + } + return lines.filter((line) => line !== '').join('\n'); + }); + + const bodyParts = [ + `Drift flagged ${target.changes.length === 1 ? 'a breaking change' : `${target.changes.length} breaking changes`} in **${target.dependency}**.`, + ...sections, + ]; + if (linkedBranch) bodyParts.push(`Tracking branch: \`${linkedBranch}\``); + bodyParts.push(``); + + return { + title, + body: bodyParts.join('\n\n'), + labels: ['drift', `drift:${target.dependency}`], + }; +} + +/** + * What the action did, in terms a caller can act on without inspecting an + * error object. Mirrors `GhPullRequestOutcome`'s discriminated-union shape + * (`extension/src/gh.ts`): every reason the action could not run is named, + * so the CLI and the extension can both fail soft — a log line or a + * dismissable toast, never a thrown error. + */ +export type IssueBranchOutcome = + | { kind: 'issue'; status: 'created' | 'existing'; number: number; url: string } + | { kind: 'branch'; status: 'created' | 'existing'; name: string } + | { + kind: 'unavailable'; + reason: 'no-git-repo' | 'no-remote' | 'gh-not-installed' | 'gh-not-authenticated' | 'no-token'; + } + | { kind: 'failed'; message: string }; diff --git a/src/analyze/index.ts b/src/analyze/index.ts index 5970527..a79f930 100644 --- a/src/analyze/index.ts +++ b/src/analyze/index.ts @@ -112,6 +112,8 @@ function fromComputedEvidence(record: Evidence): BreakingChange[] { workspace: record.workspace, kind: kindForFindingCode(finding.code), summary: finding.detail, + before: finding.before, + after: finding.after, remediation: remediationForFinding(finding, record.dependency), symbols: symbolsFromFinding(finding), // Provisional; `scoreUpstream` decides the real value once citations are diff --git a/src/cli.ts b/src/cli.ts index 059ed84..c36a425 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -34,6 +34,9 @@ import { import { opensPullRequestAsDraft, type DriftConfig } from './config/schema.js'; import { describeSeverity, scanTitle, severityOf } from './upgrade/severity.js'; import { ask } from './util/prompt.js'; +import { createBranchForTarget, createIssueAndBranchForTarget, createIssueForTarget } from './actions/cli-actions.js'; +import { groupForAction, type IssueBranchAction, type IssueBranchOutcome } from './actions/issue-branch.js'; +import type { RemediationPlan } from './types.js'; const run = promisify(execFile); @@ -222,7 +225,8 @@ Usage: Options for \`outdated\`: --repo Repository label for output. Default: git remote --dir Local checkout to scan. Default: cwd - --dev Also check dev/optional/peer dependencies + --no-dev Skip dev/optional/peer dependencies (checked by + default alongside runtime ones) --upgrade Install the recommended version for one package found by the scan (writes the manifest/lockfile locally — run \`drift fix\` afterwards). The @@ -461,13 +465,105 @@ async function analyzeCommand(flags: Flags): Promise { if (flags.json) { console.log(JSON.stringify(result.plan, null, 2)); - } else { - console.log(`\n${renderPullRequestBody(result.plan, config)}\n`); + return 0; + } + + console.log(`\n${renderPullRequestBody(result.plan, config)}\n`); + + if (process.stdin.isTTY && result.plan.breakingChanges.length > 0) { + await offerIssueBranchActions({ plan: result.plan, config, repo, github, workspace, logger }); } return 0; } +const ACTION_LABEL: Record = { + issue: 'File a GitHub issue', + branch: 'Create a local branch', + both: 'File an issue and a branch', +}; + +/** + * The interactive side of the one-click issue/branch action: offered once + * per group (per package or per breaking change, per `issueCreation. + * granularity`) right after `analyze` prints its report, so filing a + * finding needs no second command. TTY-gated by the caller, and every + * outcome — including "no git repo here" or "no GitHub token" — is reported + * as a log line, never a thrown error, since a piped or scripted run must + * never see this prompt at all and an interactive one must never crash over + * a missing credential. + */ +async function offerIssueBranchActions(args: { + plan: RemediationPlan; + config: DriftConfig; + repo: RepoContext; + github: GitHubClient; + workspace: string; + logger: Logger; +}): Promise { + const { plan, config, repo, github, workspace, logger } = args; + const targets = groupForAction(plan.breakingChanges, config.issueCreation.granularity); + const order: IssueBranchAction[] = [ + config.issueCreation.default, + ...(['issue', 'branch', 'both'] as const).filter((action) => action !== config.issueCreation.default), + ]; + const options = [...order.map((action) => ACTION_LABEL[action]), 'Skip']; + + for (const target of targets) { + const label = + target.changes.length === 1 + ? `${target.dependency}: ${target.changes[0]!.summary}` + : `${target.dependency} (${target.changes.length} breaking changes)`; + const answer = await ask(label, options, 'Skip'); + const chosen = order.find((action) => ACTION_LABEL[action] === answer); + if (!chosen) continue; + + if (chosen === 'issue') { + reportIssueBranchOutcome(await createIssueForTarget(github, repo, target, logger), logger); + } else if (chosen === 'branch') { + reportIssueBranchOutcome(await createBranchForTarget(workspace, target, logger), logger); + } else { + const outcome = await createIssueAndBranchForTarget(github, repo, workspace, target, logger); + reportIssueBranchOutcome(outcome.branch, logger); + reportIssueBranchOutcome(outcome.issue, logger); + } + } +} + +function reportIssueBranchOutcome(outcome: IssueBranchOutcome, logger: Logger): void { + switch (outcome.kind) { + case 'issue': + logger.info( + outcome.status === 'created' ? `Filed issue ${outcome.url}` : `Already filed as issue ${outcome.url}`, + ); + return; + case 'branch': + logger.info(outcome.status === 'created' ? `Created branch ${outcome.name}` : `Switched to branch ${outcome.name}`); + return; + case 'unavailable': + logger.warn(`Skipped — ${describeUnavailable(outcome.reason)}.`); + return; + case 'failed': + logger.warn(`Skipped — ${outcome.message}`); + return; + } +} + +function describeUnavailable(reason: Extract['reason']): string { + switch (reason) { + case 'no-git-repo': + return 'not a git repository'; + case 'no-remote': + return 'no git remote configured'; + case 'gh-not-installed': + return 'the GitHub CLI is not installed'; + case 'gh-not-authenticated': + return 'the GitHub CLI is not signed in'; + case 'no-token': + return 'no GitHub token available (pass --token, set GITHUB_TOKEN, or run `gh auth login`)'; + } +} + /** * Scan every direct dependency for a newer published version — not "what * changed", which `analyze` answers for a specific commit range, but "what @@ -525,7 +621,7 @@ async function outdatedCommand(flags: Flags): Promise { config, logger, githubToken: token || undefined, - breadth: { includeDev: Boolean(flags.dev), maxSites: 40, maxPackages: 0 }, + breadth: { includeDev: flags['no-dev'] !== true, maxSites: 40, maxPackages: 0 }, onProgress: (progress) => logger.debug(`${progress.phase}: ${progress.detail}`), }); diff --git a/src/config/schema.ts b/src/config/schema.ts index 35c8683..c30fcce 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -88,8 +88,9 @@ export const DriftConfigSchema = z.object({ patch: z.boolean().default(false), /** Transitive (lockfile-only) moves are noisy; off by default. */ transitive: z.boolean().default(false), - /** Dev dependencies rarely break production code paths. */ - dev: z.boolean().default(false), + /** Dev and optional dependencies still run in CI and in the hands of some + * consumers, so they are analysed by default alongside runtime ones. */ + dev: z.boolean().default(true), }) .default({}), @@ -408,6 +409,141 @@ export const DriftConfigSchema = z.object({ apiKeyEnv: z.string().default('ANTHROPIC_API_KEY'), }) .default({}), + + /** + * GitHub code scanning alerts, one per affected package. + * + * Every run that produces a plan — whether or not anything is breaking — + * can also render its findings as SARIF and upload them to the repository's + * code scanning dashboard, so the same evidence, location, and fix Drift + * puts in a pull request also shows up as an alert, the way CodeQL's and + * Scorecard's own findings do. Requires the workflow to grant + * `security-events: write`; Drift logs and continues, rather than failing + * the run, when that permission is missing. + */ + codeScanning: z + .object({ + enabled: z.boolean().default(true), + /** + * Alert even on findings with no local impact and no security signal — + * a plain "update available" with nothing broken and nothing insecure. + * Off (the default) keeps the Security tab to things a developer can + * actually act on: a breaking change that reaches code here, or a + * vulnerability. On adds one low-severity alert per otherwise-quiet + * outdated dependency, which is real signal for a team that wants full + * dependency visibility in Code Scanning rather than just the job + * summary — but is noise for most. + */ + includeInformational: z.boolean().default(false), + + /** + * How findings are grouped into alerts. + * + * `'package'` (the default) folds every breaking change and security + * signal for one dependency into a single alert, matching the "one + * alert per package" design this module was built around — it keeps + * the Security tab from growing one row per breaking change. Because + * one alert can bundle many call sites, no single one of them is + * representative, so the alert carries no code snippet — just the + * text and a link list of every location. + * + * `'breakingChange'` opens one alert per breaking change instead, + * covering every call site it reaches. The alert is scoped to a + * single issue now, so its primary location's snippet is shown as a + * representative example of that one breaking change, even though it + * may have reached more than one site. + * + * `'affectedSite'` goes one step further: one alert per individual + * call site. There is exactly one location per alert in this mode, + * so its snippet is never a stand-in for anything else — it's a + * direct view of the one line the alert is about. This is the + * noisiest mode by far — a single breaking change reaching fifty call + * sites in a large repository becomes fifty alerts — hence not the + * default. + */ + granularity: z.enum(['package', 'breakingChange', 'affectedSite']).default('package'), + + /** + * Also open a GitHub issue for every alert, in addition to the code + * scanning upload. + * + * Off by default: code scanning already puts every alert on the + * Security tab, and most teams don't want the same information + * duplicated as issues. Teams that don't watch that tab, or that want + * alerts triaged and assigned the way any other issue is, can turn + * this on. Each issue embeds the alert's `ruleId` as a hidden marker + * and re-running looks that marker up before filing, so a rescan + * finds the existing issue rather than piling up duplicates — the + * same statelessness the approval-issue flow already relies on. + */ + createIssuesPerAlert: z.boolean().default(false), + }) + .default({}), + + /** + * The one-click "file this" action offered wherever Drift shows a + * breaking change — the CLI's interactive `analyze`/`outdated` prompts + * and the VS Code extension's report view. Both surfaces call the same + * shared helper (`src/actions/issue-branch.ts`) and read this block for + * their default, so the behaviour stays identical whichever one you use. + * + * Every action here fails soft: no git repo, no `gh`/GitHub token, or a + * request that errors out is logged and surfaced as a dismissable + * warning, never a thrown error or a crashed session. + */ + issueCreation: z + .object({ + /** + * What the primary action does. `'issue'` (the default) files a + * GitHub issue with the finding's evidence and a rescan-safe hidden + * marker, mirroring `codeScanning.createIssuesPerAlert`'s dedup + * behaviour so re-triggering it updates rather than duplicates. + * `'branch'` creates (or checks out, if it already exists) a local + * branch named for the finding, with no issue filed. `'both'` does + * both and links them: the branch name is included in the issue body. + */ + default: z.enum(['issue', 'branch', 'both']).default('issue'), + + /** + * `'package'` (the default) bundles every breaking change for one + * dependency into a single issue/branch — the same "one row per + * package" shape `codeScanning.granularity`'s `'package'` mode uses, + * and the option offered at each package's group header. + * + * `'change'` scopes the action to one breaking change at a time, + * offered on each individual finding — useful when different call + * sites of the same upgrade need to be triaged or landed separately. + */ + granularity: z.enum(['package', 'change']).default('package'), + + /** + * GitHub usernames to assign the issue to, when the action's `default` + * above (or `codeScanning.createIssuesPerAlert`) files one. Empty by + * default — no one is assigned unless a team opts in. + */ + assignees: z.array(z.string()).default([]), + }) + .default({}), + + /** + * Proactive scanning of every direct dependency's *installed* version + * against its registry — not "what changed in this push", which is the + * rest of this config, but "what's available and un-taken right now". + * + * Off by default: unlike the push-triggered pipeline, this has no natural + * trigger of its own and needs a `schedule` added to the workflow — see + * `examples/workflows/drift-outdated.yml`. Once on, each outdated + * dependency is scanned the same way `drift outdated` scans it: an + * upgrade Drift can prove safe is committed directly (subject to + * `maxAutoRisk`, same as any other plan); one that isn't gets the same + * approval-issue or Copilot dispatch as a normal finding. Every dependency + * scanned — upgraded or not — gets a code scanning alert. + */ + outdated: z + .object({ + enabled: z.boolean().default(false), + }) + .default({}), }); export type DriftConfig = z.infer; diff --git a/src/dispatch/index.ts b/src/dispatch/index.ts index 5dfa8c2..80133f9 100644 --- a/src/dispatch/index.ts +++ b/src/dispatch/index.ts @@ -284,6 +284,7 @@ async function requestApproval(options: DispatchOptions): Promise { try { const response = await this.octokit.issues.create({ @@ -338,6 +339,7 @@ export class GitHubClient { title: params.title, body: params.body, labels: params.labels, + assignees: params.assignees, }); return { number: response.data.number, url: response.data.html_url }; } catch (err) { @@ -582,6 +584,49 @@ export class GitHubClient { } } + /** + * Upload a SARIF log to the repository's code scanning dashboard, so + * Drift's findings show up as alerts next to CodeQL's and Scorecard's. + * + * Requires the workflow to grant `security-events: write`; a token without + * it gets a 403, logged here as a warning that names the missing + * permission rather than a stack trace, since a repository that never + * added it is a normal, unremarkable state — not a bug in Drift. + * + * `ref` must be a fully-qualified ref (`refs/heads/main`), which is what + * distinguishes this alert set from the same commit analysed on a + * different branch — GitHub keys code scanning results by `(ref, + * commit_sha)`, not by commit alone. + */ + async uploadSarif( + repo: RepoContext, + params: { sarif: Record; commitSha: string; ref: string }, + ): Promise { + try { + const gzipped = gzipSync(Buffer.from(JSON.stringify(params.sarif), 'utf8')); + await this.octokit.codeScanning.uploadSarif({ + owner: repo.owner, + repo: repo.repo, + commit_sha: params.commitSha, + ref: params.ref, + sarif: gzipped.toString('base64'), + }); + this.logger.info('Uploaded SARIF results to code scanning.'); + return true; + } catch (err) { + const status = (err as { status?: number })?.status; + if (status === 403) { + this.logger.warn( + 'Could not upload code scanning results: the token is missing `security-events: write`. ' + + 'Add it to the workflow job\'s `permissions` to enable Drift\'s code scanning alerts.', + ); + } else { + this.logger.warn(`Could not upload code scanning results: ${(err as Error).message}`); + } + return false; + } + } + async findPullRequestForBranch(repo: RepoContext, branchName: string): Promise<{ number: number; url: string } | null> { try { const response = await this.octokit.pulls.list({ diff --git a/src/localize/index.ts b/src/localize/index.ts index 09b7edb..a922e89 100644 --- a/src/localize/index.ts +++ b/src/localize/index.ts @@ -696,6 +696,12 @@ function searchFiles( if (hit && isAtomLiteral(searchable, hit.index, candidate.language)) continue; const unit = fileIndex ? unitAtLine(fileIndex, i + 1) : undefined; + // A member access (`x.symbol`) whose receiver is not something this + // file provably bound from the dependency. `hit` is absent only for + // the call-opens-on-next-line fallback, where there is no match index + // on this line to read a receiver from. + const receiver = hit ? receiverOf(searchable, hit.index) : undefined; + const unboundReceiver = receiver !== undefined && !importedNames.has(receiver) && !importedNames.has('*'); sites.push({ breakingChangeId: change.id, @@ -704,7 +710,7 @@ function searchFiles( excerpt: line.trim().slice(0, 200), enclosingSymbol: unit?.name, matchedSymbol: symbol, - confidence: confidenceFor(symbol, importedNames, importsDependency, indirect, inherited?.inherited), + confidence: confidenceFor(symbol, importedNames, importsDependency, indirect, inherited?.inherited, unboundReceiver), }); } } @@ -852,14 +858,19 @@ function qualifiedByAnother( foreignNames: ReadonlySet, locallyDefined: ReadonlySet, ): boolean { - const before = line.slice(0, at); - const receiver = /([A-Za-z_$][\w$]*)\s*(?:\.|::)\s*$/.exec(before)?.[1]; + const receiver = receiverOf(line, at); if (!receiver) return false; // A receiver this file bound from *this* dependency is the opposite signal. if (importedNames.has(receiver) || importedNames.has('*')) return false; return foreignNames.has(receiver) || locallyDefined.has(receiver); } +/** The name immediately before `.` or `::` at a match position, if any. */ +function receiverOf(line: string, at: number): string | undefined { + const before = line.slice(0, at); + return /([A-Za-z_$][\w$]*)\s*(?:\.|::)\s*$/.exec(before)?.[1]; +} + /** * `:push` is an atom, not a call. * @@ -968,6 +979,7 @@ function confidenceFor( importsDependency: boolean, indirect: boolean, inherited: ReadonlySet | undefined, + unboundReceiver: boolean, ): Confidence { const root = symbol.split('.')[0] ?? symbol; @@ -983,6 +995,14 @@ function confidenceFor( if (importedNames.has(symbol) || importedNames.has(root) || importedNames.has('*')) { return 'high'; } + + // A member access on a receiver this file did not bind from the dependency + // — `dirs.find(...)` in a file that merely happens to import `zod` too — + // is not evidence of dependency usage, whatever `importsDependency` says. + // Importing the package at all does not make every generic method name + // (`find`, `flatten`, `omit`, ...) elsewhere in the file a use of it. + if (unboundReceiver) return 'low'; + return importsDependency ? 'medium' : 'low'; } diff --git a/src/report/markdown.ts b/src/report/markdown.ts index 00b79b0..e9292f0 100644 --- a/src/report/markdown.ts +++ b/src/report/markdown.ts @@ -20,6 +20,7 @@ import { } from './confidence.js'; import { PLAN_SCHEMA_VERSION, planDigest } from '../approval/digest.js'; import { renderApprovalMetadata } from '../approval/metadata.js'; +import { DEPENDENCY_KIND_LABELS } from './sarif.js'; /** * The Drift Report. @@ -118,7 +119,11 @@ function renderHeader(plan: RemediationPlan): string { const changes = plan.changes .map((c) => { const where = members.size > 1 ? describeMember(c) : null; - return `\`${c.name}\` ${c.from ?? '—'} → **${c.to ?? '—'}**${where ? ` _(in ${where})_` : ''}`; + // Runtime is the common case and clutters every line if labelled; the + // sections a reviewer doesn't expect (dev, optional, peer, transitive) + // are the ones worth calling out. + const kind = c.kind === 'runtime' ? null : DEPENDENCY_KIND_LABELS[c.kind]; + return `\`${c.name}\`${kind ? ` _(${kind})_` : ''} ${c.from ?? '—'} → **${c.to ?? '—'}**${where ? ` _(in ${where})_` : ''}`; }) .join(', '); @@ -189,6 +194,12 @@ function renderBreakingChanges(plan: RemediationPlan): string { lines.push(change.summary); lines.push(''); + // The declaration itself, before and after — the actual evidence for the + // summary above, not just a link to where it can be found. + if (change.before && change.after && change.before !== change.after) { + lines.push('```diff', `- ${truncate(change.before, 300)}`, `+ ${truncate(change.after, 300)}`, '```', ''); + } + // The verdict leads, because it is the sentence a reader acts on — and // because it is the one place the difference between "checked and clean" // and "not checked" is stated in words rather than implied by a count. diff --git a/src/report/sarif.ts b/src/report/sarif.ts new file mode 100644 index 0000000..716d797 --- /dev/null +++ b/src/report/sarif.ts @@ -0,0 +1,820 @@ +import { createHash } from 'node:crypto'; +import { describeMember } from '../detect/workspace.js'; +import { RECOMMENDATION_LABEL } from '../rationale/assess.js'; +import type { UpgradeRationale, Vulnerability } from '../rationale/types.js'; +import { compareSeverity } from '../rationale/types.js'; +import type { + BreakingChange, + BreakingChangeKind, + Confidence, + DependencyChange, + DependencyKind, + Ecosystem, + ImpactSite, + RemediationPlan, +} from '../types.js'; +import { upgradeCommandFor, type UpgradeCandidate } from '../upgrade/scan.js'; + +/** + * Turning a Drift plan into GitHub code scanning alerts. + * + * CodeQL and OpenSSF Scorecard both land their findings here, and a team that + * has come to trust that dashboard should not have to go somewhere else for + * Drift's. This module is the seam: everything upstream of it already knows + * the evidence, the location, and the fix (that's the whole plan/rationale + * pipeline) — this only reshapes it into SARIF. + * + * The unit of an alert is, by default, one *package* — a dependency that + * moved, not each individual breaking change it carries (see + * `codeScanning.granularity` in the config schema for the two opt-in + * alternatives: one alert per breaking change, or one per individual call + * site). A package can still carry hundreds + * of upstream breaking changes — most upgrades touch no code in a given + * repository at all — so dumping every one of them into a single alert + * (or, worse, opening one alert per upstream change regardless of whether + * it reaches this repository) is what turns the Security tab into noise + * nobody reads. So: + * + * - a breaking change is *listed* in its package's alert only when it has + * at least one `ImpactSite` — code in *this* repository that actually + * calls the affected symbol. An upstream-only change never reaches + * SARIF; it is still visible in the job summary / PR body, where the + * full upstream count belongs, and its existence is noted with a count + * inside the alert. + * - every locally-actionable issue for a package — each breaking change, + * plus any security signal — renders as its own block inside that one + * alert, one after another and separated by a rule, rather than folded + * into a single paragraph. A reader scanning the alert can tell exactly + * how many distinct things are wrong and where each one is. + * - the alert is anchored to the highest-confidence site among all its + * blocks as its primary `location`; every other site any block reaches + * rides along as a `relatedLocation` rather than inflating `locations[]`. + * - severity is the worst of every block's severity, and each block's own + * severity is upstream confidence *and* local confidence together: a + * proven upstream change with no confidently-matched local call site is + * a warning, not an error. + * - `ruleId` is `drift//` — stable across runs for the + * same package, independent of which breaking changes or advisories it + * currently has. That stability is what makes rescanning a *replacement* + * rather than an accumulation: GitHub keeps or opens one alert per + * `ruleId` from the newest upload and marks a `ruleId` absent from it + * fixed, so a package alert updates in place instead of piling up. + * - the message carries both a `markdown` and a `text` rendering, since + * GitHub's alert body only renders formatting and links (including + * jump-to-file links) from `message.markdown` — `message.text` is a + * plain-text fallback for tools that don't read it. + */ + +export type SarifLevel = 'error' | 'warning' | 'note'; + +/** What a reader can do right now about one finding. */ +export interface SarifFix { + /** One sentence: what taking the fix means. */ + description: string; + /** The exact command that applies it, when Drift knows one. */ + command?: string; + /** A pull request or approval issue Drift already opened for this. */ + url?: string; +} + +/** One place a finding was seen. */ +export interface SarifLocation { + file: string; + /** 1-indexed. */ + line: number; + excerpt?: string; +} + +/** One alert: one locally actionable finding. */ +export interface SarifFinding { + /** + * `drift//` — stable across runs for the same package, + * independent of which breaking changes or advisories it currently has. + * That stability is what lets GitHub's own SARIF reconciliation replace + * this alert in place on every rescan instead of accumulating duplicates. + */ + ruleId: string; + /** Human-readable rule name, shown in GitHub's rule/alert-type listing. */ + ruleName: string; + dependency: string; + ecosystem: Ecosystem; + /** `dependencies`, `devDependencies`, `optionalDependencies`, ... — which manifest section this was declared in. */ + dependencyKind: DependencyKind; + from: string | null; + to: string | null; + manifestPath: string; + /** Workspace member directory this was found in, e.g. a monorepo subfolder. Absent in a single-package repo. */ + workspace?: string; + workspaceLabel?: string | null; + level: SarifLevel; + /** + * Markdown source for `result.message.markdown` (GitHub renders this in + * the alert body — bold, links, code spans) and, stripped, for + * `result.message.text` (the plain-text fallback SARIF requires). GitHub + * treats the first sentence as the alert's title when space is + * constrained — there is no separate title field in SARIF — so the + * concise statement of what's wrong comes first and the supporting detail + * follows it. + */ + message: string; + /** The location GitHub anchors the alert to. */ + primaryLocation: SarifLocation; + /** Every other place the same finding reaches. */ + relatedLocations: SarifLocation[]; + /** + * Whether `primaryLocation`'s excerpt is safe to show as a code snippet. + * True only when the alert is scoped narrowly enough that one location's + * code is actually representative of the whole alert — see + * `codeScanning.granularity` in the config schema. False (the package + * grouping's default) omits it, since bundling many call sites under one + * alert makes any single snippet an arbitrary, misleading pick. + */ + snippetOk?: boolean; + fix?: SarifFix; + helpUri?: string; +} + +const TOOL_NAME = 'Drift'; +const TOOL_URI = 'https://github.com/trydrift/drift'; + +/** How many extra locations ride along as `relatedLocations`, per finding. */ +const MAX_RELATED_LOCATIONS = 9; + +/** + * Render a set of findings as a SARIF 2.1.0 log, ready to gzip and upload. + * + * `category` becomes `runAutomationDetails.id`. It must be distinct between + * the push-triggered diff scan and the scheduled outdated-dependency scan: + * without it, GitHub has no way to tell that an upload from one mode is not + * meant to replace the other's result set, and the two would fight over + * which findings are "current" on every run. + */ +export function buildSarifLog(findings: readonly SarifFinding[], category?: string): Record { + const rules = new Map(); + for (const finding of findings) { + if (!rules.has(finding.ruleId)) { + rules.set(finding.ruleId, { + id: finding.ruleId, + name: finding.ruleName, + ...(finding.helpUri ? { helpUri: finding.helpUri } : {}), + }); + } + } + + return { + $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json', + version: '2.1.0', + runs: [ + { + tool: { + driver: { + name: TOOL_NAME, + informationUri: TOOL_URI, + rules: [...rules.values()].map((rule) => ({ + id: rule.id, + name: rule.name, + shortDescription: { text: rule.name }, + fullDescription: { + text: `A Drift finding: what changed, where it's used, and the fix — see the alert body.`, + }, + helpUri: rule.helpUri ?? TOOL_URI, + defaultConfiguration: { level: 'warning' }, + properties: { tags: ['dependencies', 'drift'] }, + })), + }, + }, + ...(category ? { automationDetails: { id: category } } : {}), + results: findings.map((finding) => ({ + ruleId: finding.ruleId, + level: finding.level, + message: { text: stripMarkdown(finding.message), markdown: finding.message }, + locations: [toSarifPhysicalLocation(finding.primaryLocation, finding.snippetOk)], + ...(finding.relatedLocations.length > 0 + ? { + relatedLocations: finding.relatedLocations.map((loc, i) => ({ + id: i + 1, + ...toSarifPhysicalLocation(loc), + })), + } + : {}), + partialFingerprints: { + primaryLocationLineHash: lineHash(finding), + }, + })), + }, + ], + }; +} + +/** + * `result.message.markdown` is what GitHub actually renders in the alert + * body — `result.message.text` is a required plain-text fallback for tools + * that don't read markdown. Rather than maintain two parallel renderings of + * every finding, everything above builds one markdown string and this + * derives the fallback from it: strip the syntax, keep the words. + */ +function stripMarkdown(markdown: string): string { + return markdown + .replace(/\[([^\]]*)\]\(([^)]+)\)/g, '$1 ($2)') + .replace(/\*\*(.*?)\*\*/g, '$1') + .replace(/`([^`]*)`/g, '$1'); +} + +/** + * A markdown link from a `file:line` reference to that line in the repo. + * + * `repoBlobUrl` is `https://github.com///blob/`, supplied + * by the caller that knows which repository and commit this alert is for + * (see `findingsFromPlan`/`findingsFromCandidates`). Without it there is no + * way to build a real URL, so this falls back to a bare relative path — + * which GitHub resolves against whatever page the reader is currently on + * (e.g. the alert page itself), producing a broken link. Every real caller + * passes `repoBlobUrl`; the fallback exists only for callers (tests) that + * don't have a repo context to give it. + */ +function mdLink(file: string, line: number, repoBlobUrl?: string): string { + const href = repoBlobUrl ? `${repoBlobUrl}/${file}#L${line}` : `${file}#L${line}`; + return `[\`${file}:${line}\`](${href})`; +} + +// `includeSnippet` defaults to false: GitHub renders `region.snippet` as a +// single code preview at this location, and with a finding that can span +// dozens of call sites, the "primary" one is just whichever sorted first by +// confidence — showing its snippet alone would read as representative when +// it isn't. Callers only pass `true` once the alert is scoped narrowly +// enough (see `SarifFinding.snippetOk`) that one location's code actually +// stands in for the whole alert; the `Seen at:` link list covers the rest. +function toSarifPhysicalLocation(loc: SarifLocation, includeSnippet = false): Record { + return { + physicalLocation: { + artifactLocation: { uri: loc.file }, + region: { + startLine: Math.max(1, loc.line), + ...(includeSnippet && loc.excerpt ? { snippet: { text: loc.excerpt } } : {}), + }, + }, + }; +} + +/** + * A content-based fingerprint, so the same finding reconciles across runs + * even when unrelated edits shift its line number by a line or two. + * + * GitHub only reads `primaryLocationLineHash` out of `partialFingerprints` + * for result tracking — a `ruleId`-only fingerprint (the previous approach + * here) is silently ignored. Uploading through the REST API directly, rather + * than through `github/codeql-action/upload-sarif`, means Drift does not get + * one generated for it automatically either. + */ +function lineHash(finding: SarifFinding): string { + const basis = `${finding.ruleId}|${finding.primaryLocation.file}|${(finding.primaryLocation.excerpt ?? '').trim()}`; + return createHash('sha256').update(basis).digest('hex').slice(0, 40); +} + +/** How findings are grouped into alerts. See `codeScanning.granularity` in the config schema. */ +export type AlertGranularity = 'package' | 'breakingChange' | 'affectedSite'; + +/** + * Findings from a push-triggered `RemediationPlan`. + * + * By default (`granularity: 'package'`) this is one alert per package, + * folding every locally-actionable breaking change and every security + * signal found for it into that one alert as its own block. `'breakingChange'` + * and `'affectedSite'` split that single alert into one per breaking change, + * or one per individual call site, respectively — see `AlertGranularity` and + * the config schema for why a team would want either. A security or + * "update available" signal has no per-site notion of its own, so it always + * gets one alert regardless of granularity. + * + * Each run uploads the *complete* current set of findings for the ref it + * analysed (see `uploadCodeScanning` in `runners/action.ts`) rather than an + * incremental diff. GitHub's code scanning API is built around exactly that + * shape: for a given `(ref, category, tool)`, the newest upload is the + * authoritative state — a `ruleId` present in it keeps (or opens) one alert, + * updated to the latest commit; a `ruleId` that was open before and is + * absent from the new upload is automatically marked fixed. Because + * `ruleId` is built from stable, content-derived parts (the package name, + * and — for the finer granularities — the breaking change's own stable + * `id` or a hash of the site's content) rather than anything positional + * like a line number, rescanning replaces each alert in place rather than + * accumulating a new one alongside the old. + */ +export function findingsFromPlan( + plan: RemediationPlan, + opts: { + includeInformational?: boolean; + fixOf?: (change: DependencyChange) => SarifFix | undefined; + granularity?: AlertGranularity; + /** `https://github.com///blob/` — see `mdLink`. */ + repoBlobUrl?: string; + } = {}, +): SarifFinding[] { + const includeInformational = opts.includeInformational ?? false; + const granularity = opts.granularity ?? 'package'; + const repoBlobUrl = opts.repoBlobUrl; + const findings: SarifFinding[] = []; + + for (const change of plan.changes) { + const allBreaking = plan.breakingChanges.filter( + (b) => b.dependency === change.name && (b.workspace ?? '') === (change.workspace ?? ''), + ); + // `UpgradeRationale` isn't workspace-qualified — see its definition — so + // in the rare monorepo case of the same package at two versions across + // members, this matches the first. Every other consumer of rationale has + // the same limitation. + const rationale = plan.rationale?.find((r) => r.dependency === change.name); + + const breakingBlocks: { breaking: BreakingChange; block: FindingBlock }[] = []; + let upstreamOnlyCount = 0; + + const sortedBreaking = [...allBreaking].sort((a, b) => rank(b.confidence) - rank(a.confidence)); + for (const b of sortedBreaking) { + const sites = plan.impactSites.filter((site) => site.breakingChangeId === b.id); + if (sites.length === 0) { + upstreamOnlyCount++; // upstream-only: no code here to point at. + continue; + } + breakingBlocks.push({ breaking: b, block: buildBreakingBlock(b, sites, plan.evidence) }); + } + + const extraBlocks: FindingBlock[] = []; + if (hasSecuritySignal(rationale)) extraBlocks.push(buildSecurityBlock(rationale!)); + + if (breakingBlocks.length === 0 && extraBlocks.length === 0) { + if (!includeInformational || !rationale) continue; + extraBlocks.push(buildOutdatedBlock(change, rationale)); + } + + const commit = plan.commits.find((c) => allBreaking.some((b) => c.breakingChangeIds.includes(b.id))); + const fix = opts.fixOf?.(change) ?? fixFromCommit(commit, plan); + + if (granularity === 'package') { + findings.push( + buildPackageFinding({ + change, + blocks: [...breakingBlocks.map((x) => x.block), ...extraBlocks], + upstreamOnlyCount, + fix, + repoBlobUrl, + }), + ); + continue; + } + + // `'breakingChange'` / `'affectedSite'`: split into one alert per + // breaking change (optionally per site). The upstream-only count is + // package-level context about issues *not* in this list, so it doesn't + // belong on any one of these split alerts — it's dropped rather than + // repeated on every one of them. + for (const { breaking, block } of breakingBlocks) { + if (granularity === 'affectedSite') { + const sites = [block.primaryCandidate, ...block.relatedCandidates].filter( + (s): s is SarifLocation => s !== undefined, + ); + for (const site of sites) { + findings.push( + buildPackageFinding({ + change, + blocks: [{ ...block, primaryCandidate: site, relatedCandidates: [] }], + upstreamOnlyCount: 0, + fix, + ruleIdSuffix: `${breaking.id}/${siteKey(site)}`, + ruleName: `${change.name}: ${ruleNameForBreaking(breaking.kind)}`, + snippetOk: true, + repoBlobUrl, + }), + ); + } + } else { + findings.push( + buildPackageFinding({ + change, + blocks: [block], + upstreamOnlyCount: 0, + fix, + ruleIdSuffix: breaking.id, + ruleName: `${change.name}: ${ruleNameForBreaking(breaking.kind)}`, + snippetOk: true, + repoBlobUrl, + }), + ); + } + } + for (const block of extraBlocks) { + findings.push( + buildPackageFinding({ + change, + blocks: [block], + upstreamOnlyCount: 0, + fix, + ruleIdSuffix: 'other', + repoBlobUrl, + }), + ); + } + } + + return findings; +} + +/** A short, content-derived key for one impact site — stable across line shifts, unlike its line number. */ +function siteKey(loc: SarifLocation): string { + return createHash('sha256') + .update(`${loc.file}|${(loc.excerpt ?? '').trim()}`) + .digest('hex') + .slice(0, 10); +} + +function hasSecuritySignal(rationale: UpgradeRationale | undefined): boolean { + if (!rationale) return false; + const s = rationale.security; + return s.checked && (s.resolved.length > 0 || s.introduced.length > 0 || s.current.length > 0); +} + +/** + * One dependency's worth of findings from a proactive outdated-dependency + * scan (see `upgrade/scan.ts`, shared with `drift outdated`) — the check + * that runs on a schedule rather than a push, over every currently installed + * version rather than only the ones that just moved. + * + * Each candidate already carries its own single-dependency `RemediationPlan` + * (`scanUpgrades` builds one per package it can reach a verdict on), so this + * is `findingsFromPlan` run once per candidate — with one addition: a + * candidate with no breaking changes has no commits, and therefore no fix + * `findingsFromPlan` would describe on its own. The exact upgrade command + * fills that gap, so "safe to upgrade" alerts still say what to run. + */ +export function findingsFromCandidates( + candidates: readonly UpgradeCandidate[], + opts: { includeInformational?: boolean; granularity?: AlertGranularity; repoBlobUrl?: string } = {}, +): SarifFinding[] { + const findings: SarifFinding[] = []; + + for (const candidate of candidates) { + if (!candidate.plan) continue; + + const fixOf = (): SarifFix | undefined => { + if (candidate.plan!.commits.length > 0) return undefined; + const command = upgradeCommandFor(candidate); + if (!command) return undefined; + return { + description: + candidate.breakingCount > 0 + ? 'The upstream API changed, but no code in this repository was found to use the affected parts. Review before upgrading.' + : 'Safe to upgrade — no breaking changes found.', + command, + }; + }; + + findings.push(...findingsFromPlan(candidate.plan, { ...opts, fixOf })); + } + + return findings; +} + +const RULE_NAMES: Record = { + 'removed-export': 'Removed export used in this repository', + 'renamed-export': 'Renamed export used in this repository', + 'moved-export': 'Export moved to a different module', + 'signature-change': 'Call signature changed', + 'type-change': 'Type changed in a breaking way', + 'behaviour-change': 'Runtime behaviour changed', + 'removed-endpoint': 'API endpoint removed', + 'changed-endpoint': 'API endpoint changed', + 'required-field-added': 'New required field', + 'default-change': 'Default value changed', + 'config-change': 'Configuration shape changed', + 'runtime-requirement': 'Runtime requirement changed', + unknown: 'Unclassified breaking change', +}; + +function ruleNameForBreaking(kind: BreakingChangeKind): string { + return RULE_NAMES[kind] ?? 'Breaking change'; +} + +export const DEPENDENCY_KIND_LABELS: Record = { + runtime: 'dependency', + dev: 'devDependency', + peer: 'peerDependency', + optional: 'optionalDependency', + transitive: 'transitive dependency', +}; + +function dependencyKindLabel(kind: DependencyKind): string { + return DEPENDENCY_KIND_LABELS[kind] ?? kind; +} + +/** + * One locally-actionable issue's worth of alert content: a package's alert + * is the concatenation of these, each rendered on its own and separated by + * a rule, so a reader sees every distinct issue in turn rather than one + * paragraph with everything folded together. + */ +interface FindingBlock { + level: SarifLevel; + /** Markdown lines for this block alone; joined with `\n` by the caller. */ + lines: string[]; + /** The location this block would anchor an alert to, if it were its own. */ + primaryCandidate?: SarifLocation; + relatedCandidates: SarifLocation[]; + helpUri?: string; +} + +const LEVEL_RANK: Record = { error: 2, warning: 1, note: 0 }; + +function worstLevel(levels: readonly SarifLevel[]): SarifLevel { + return levels.reduce((worst, l) => (LEVEL_RANK[l] > LEVEL_RANK[worst] ? l : worst), 'note'); +} + +function buildBreakingBlock(breaking: BreakingChange, sites: ImpactSite[], evidence: RemediationPlan['evidence']): FindingBlock { + const sorted = [...sites].sort( + (a, b) => rank(b.confidence) - rank(a.confidence) || a.file.localeCompare(b.file) || a.line - b.line, + ); + const primary = sorted[0]!; + const related = sorted.slice(1, 1 + MAX_RELATED_LOCATIONS); + const localConfidence = primary.confidence; + const files = new Set(sites.map((s) => s.file)); + const helpUri = evidenceUrlForBreaking(breaking, evidence); + + const lines: string[] = [ + `**${ruleNameForBreaking(breaking.kind)}:** ${linkSymbols(breaking.summary, helpUri)}`, + '', + `Upstream confidence: ${breaking.confidence}. Local confidence: ${localConfidence}` + + (sites.length > 1 ? ` (best of ${sites.length} matches across ${files.size} file(s)).` : '.'), + ]; + // The declaration itself, before and after — the actual evidence for the + // claim above. `helpUri` alone used to stand in for this and pointed at the + // *current* published declaration file, which shows nothing about what + // changed; a reader had to diff two CDN files by hand to see it. + // + // Inline code spans, not a fenced ```diff block: GitHub's code-scanning + // alert markdown only renders the inline-code subset of GFM. A fenced block + // there shows up as literal backticks and a literal "diff" — a plain-text + // dump of the fence syntax rather than a code block. + if (breaking.before && breaking.after && breaking.before !== breaking.after) { + lines.push('', `- \`${truncate(breaking.before, 300)}\``, `+ \`${truncate(breaking.after, 300)}\``); + } + if (helpUri) lines.push('', `Declaration source: ${helpUri}`); + + return { + level: levelForBreaking(breaking.confidence, localConfidence), + lines, + primaryCandidate: { file: primary.file, line: primary.line, excerpt: primary.excerpt }, + relatedCandidates: related.map((s) => ({ file: s.file, line: s.line, excerpt: s.excerpt })), + helpUri, + }; +} + +function truncate(text: string, max: number): string { + return text.length > max ? `${text.slice(0, max - 1)}…` : text; +} + +/** + * Wraps every backtick-quoted symbol name in `text` with a markdown link to + * `url`, when one is known — the upstream commit, changelog, or diff that is + * the actual evidence for the claim being made about that symbol. Without + * this, the only place the evidence link appeared was `helpUri` metadata, + * which GitHub surfaces as a separate "show more" affordance rather than + * inline next to the symbol it's evidence for. + */ +function linkSymbols(text: string, url: string | undefined): string { + if (!url) return text; + return text.replace(/`([^`]+)`/g, (_match, symbol: string) => `[\`${symbol}\`](${url})`); +} + +/** + * Upstream confidence and local confidence together, not upstream alone. + * + * A proven upstream change (Drift computed the diff itself) that only + * loosely matches a call site in this repository is worth a warning, not an + * error — the error level is reserved for the case both dimensions agree. + */ +function levelForBreaking(upstream: Confidence, local: Confidence): SarifLevel { + if (upstream === 'high' && local === 'high') return 'error'; + if (upstream === 'high' || local === 'high') return 'warning'; + if (upstream === 'medium' && local === 'medium') return 'warning'; + return 'note'; +} + +function rank(confidence: Confidence): number { + return confidence === 'high' ? 2 : confidence === 'medium' ? 1 : 0; +} + +function buildSecurityBlock(rationale: UpgradeRationale): FindingBlock { + const sec = rationale.security; + + let title: string; + let level: SarifLevel; + const sections: string[] = []; + + if (sec.current.length > 0) { + title = `Currently affected by ${sec.current.length} known ${plural(sec.current.length, 'advisory', 'advisories')}`; + const worst = worstOf(sec.current); + level = worst === 'critical' || worst === 'high' ? 'error' : 'warning'; + sections.push(['**Currently affected:**', ...sec.current.map((v) => `- ${vulnerabilityLine(v)}`)].join('\n')); + } else if (sec.introduced.length > 0) { + title = `Upgrading would introduce ${sec.introduced.length} new known ${plural(sec.introduced.length, 'advisory', 'advisories')}`; + const worst = worstOf(sec.introduced); + level = worst === 'critical' || worst === 'high' ? 'error' : 'warning'; + } else { + title = `Resolves ${sec.resolved.length} known ${plural(sec.resolved.length, 'advisory', 'advisories')}`; + level = 'note'; + } + + if (sec.introduced.length > 0) { + sections.push(['**Would introduce:**', ...sec.introduced.map((v) => `- ${vulnerabilityLine(v)}`)].join('\n')); + } + if (sec.resolved.length > 0) { + sections.push(['**Resolves:**', ...sec.resolved.map((v) => `- ${vulnerabilityLine(v)}`)].join('\n')); + } + + const lines: string[] = [`**${title}**`]; + for (const section of sections) lines.push('', section); + lines.push('', `Drift's assessment: **${RECOMMENDATION_LABEL[rationale.assessment.recommendation]}**.`); + for (const reason of rationale.assessment.reasons) lines.push(`- ${reason}`); + + return { + level, + lines, + relatedCandidates: [], + helpUri: sec.current[0]?.url ?? sec.introduced[0]?.url ?? sec.resolved[0]?.url, + }; +} + +function buildOutdatedBlock(change: DependencyChange, rationale: UpgradeRationale): FindingBlock { + const versionMove = change.to ? `${change.from ?? 'none'} → ${change.to}` : 'removed'; + void rationale; + return { + level: 'note', + lines: [`**Update available** (${versionMove}), with no breaking changes or advisories found.`], + relatedCandidates: [], + }; +} + +/** + * Fold every locally-actionable block found for one package into the single + * alert GitHub sees for it: the worst level and every location among them, + * with each block's own markdown appended in turn. + */ +function buildPackageFinding(args: { + change: DependencyChange; + blocks: FindingBlock[]; + upstreamOnlyCount: number; + fix?: SarifFix; + /** Appended to `drift//` to keep split-granularity alerts distinct. */ + ruleIdSuffix?: string; + /** Overrides the default generic rule name — used by the finer granularities to name the specific breaking change. */ + ruleName?: string; + /** See `SarifFinding.snippetOk`. */ + snippetOk?: boolean; + /** `https://github.com///blob/` — see `mdLink`. */ + repoBlobUrl?: string; +}): SarifFinding { + const { change, blocks, upstreamOnlyCount, fix, ruleIdSuffix, ruleName, snippetOk, repoBlobUrl } = args; + const memberLabel = describeMember(change); + const versionMove = change.to ? `${change.from ?? 'none'} → ${change.to}` : 'removed'; + const hasBreaking = blocks.some((b) => b.primaryCandidate); + + const kindLabel = dependencyKindLabel(change.kind); + const header: string[] = [ + memberLabel + ? `**${change.name}** (${change.ecosystem} ${kindLabel}) ${versionMove} — ${memberLabel}` + : `**${change.name}** (${change.ecosystem} ${kindLabel}) ${versionMove}`, + ]; + if (upstreamOnlyCount > 0) { + header.push( + '', + `${upstreamOnlyCount} additional upstream breaking ${plural(upstreamOnlyCount, 'change does', 'changes do')} not reach code in this repository and ${plural(upstreamOnlyCount, 'is', 'are')} omitted here.`, + ); + } + + // Anchored (and snippet-eligible) only when `snippetOk` — i.e. the alert is + // scoped to one breaking change or one site, so that location really is + // representative. Package-granularity alerts fold many call sites together; + // picking any one of them as "the" location would show a single arbitrary + // snippet as if it stood for the whole alert, so they anchor to the + // manifest instead and rely entirely on each block's own "Seen at" list. + const primary = snippetOk + ? (blocks.find((b) => b.primaryCandidate)?.primaryCandidate ?? { file: change.manifestPath, line: 1 }) + : { file: change.manifestPath, line: 1 }; + const relatedSeen = new Set([`${primary.file}:${primary.line}`]); + const related: SarifLocation[] = []; + for (const block of blocks) { + const candidates = block.primaryCandidate ? [block.primaryCandidate, ...block.relatedCandidates] : block.relatedCandidates; + for (const loc of candidates) { + const key = `${loc.file}:${loc.line}`; + if (relatedSeen.has(key)) continue; + relatedSeen.add(key); + related.push(loc); + if (related.length >= MAX_RELATED_LOCATIONS) break; + } + if (related.length >= MAX_RELATED_LOCATIONS) break; + } + + // `related`'s array order is exactly the order `buildSarifLog` assigns + // `relatedLocations[].id` in (1-indexed) — this map lets every block spell + // its "Seen at" list as `[text](id)`, a link GitHub resolves to that + // location's line in the repo (jump-to-file), same as the plain + // `mdLink` fallback below it uses when a site fell outside the + // `MAX_RELATED_LOCATIONS` cap and never got an id. + const relatedIds = new Map(related.map((loc, i) => [`${loc.file}:${loc.line}`, i + 1])); + const siteLink = (loc: SarifLocation): string => { + const id = relatedIds.get(`${loc.file}:${loc.line}`); + return id !== undefined ? `[\`${loc.file}:${loc.line}\`](${id})` : mdLink(loc.file, loc.line, repoBlobUrl); + }; + + const body = [ + header.join('\n'), + ...blocks.map((b) => { + if (!b.primaryCandidate) return b.lines.join('\n'); + const seenAt = ['**Seen at:**', `- ${siteLink(b.primaryCandidate)}`, ...b.relatedCandidates.map((loc) => `- ${siteLink(loc)}`)]; + // A blank line alone is not always enough to force GitHub's alert + // markdown onto a new paragraph — an extra blank line guarantees "Seen + // at:" starts on its own line rather than trailing the block above it + // (observed running on immediately after "Declaration source: "). + return [...b.lines, '', '', ...seenAt].join('\n'); + }), + fixLine(fix, hasBreaking), + ].join('\n\n---\n\n'); + + return { + ruleId: ruleIdSuffix + ? `drift/${change.ecosystem}/${change.name}/${ruleIdSuffix}` + : `drift/${change.ecosystem}/${change.name}`, + ruleName: ruleName ?? `${change.name}: dependency finding`, + dependency: change.name, + ecosystem: change.ecosystem, + dependencyKind: change.kind, + from: change.from, + to: change.to, + manifestPath: change.manifestPath, + workspace: change.workspace, + workspaceLabel: memberLabel, + level: worstLevel(blocks.map((b) => b.level)), + message: body, + primaryLocation: primary, + relatedLocations: related, + snippetOk, + fix, + helpUri: blocks.find((b) => b.helpUri)?.helpUri, + }; +} + +function plural(count: number, singular: string, pluralForm: string): string { + return count === 1 ? singular : pluralForm; +} + +function worstOf(vs: Vulnerability[]): Vulnerability['severity'] { + return vs.reduce( + (worst, v) => (compareSeverity(v.severity, worst) < 0 ? v.severity : worst), + 'unknown', + ); +} + +function vulnerabilityLine(v: Vulnerability): string { + const fixed = v.fixedIn ? `, fixed in ${v.fixedIn}` : ''; + return `[${v.id}](${v.url}) (${v.severity}${fixed}): ${v.summary}`; +} + +function evidenceUrlForBreaking(breaking: BreakingChange, evidence: RemediationPlan['evidence']): string | undefined { + for (const citationId of breaking.citations) { + const url = evidence.find((e) => e.id === citationId)?.url; + if (url) return url; + } + return undefined; +} + +function fixFromCommit( + commit: RemediationPlan['commits'][number] | undefined, + plan: RemediationPlan, +): SarifFix | undefined { + if (!commit) return undefined; + const deterministic = (commit.codemod?.length ?? 0) > 0; + const recipe = (commit.recipe?.length ?? 0) > 0; + if (deterministic) { + return { + description: `Deterministic fix available: "${commit.message}". Drift can commit this itself once approved.`, + }; + } + if (recipe) { + return { + description: `A pinned community recipe resolves this: "${commit.message}". Enable \`remediation.communityRecipes\` in drift.yml to let Drift apply it.`, + }; + } + return { + description: + plan.risk === 'none' + ? `No deterministic fix; comment \`/drift apply\` on Drift's approval issue for this plan to dispatch GitHub Copilot.` + : `No deterministic fix, and this plan carries risk: \`${plan.risk}\`. Review the plan Drift filed, then comment \`/drift apply\` to dispatch a fix.`, + }; +} + +/** Human-readable line describing the fix, appended to every alert body. */ +function fixLine(fix: SarifFix | undefined, hasBreaking: boolean): string { + if (fix?.url) return `**Fix:** ${fix.description} → ${fix.url}`; + if (fix?.command) return `**Fix:** ${fix.description} Run: \`${fix.command}\``; + if (fix) return `**Fix:** ${fix.description}`; + return hasBreaking + ? '**Fix:** Drift did not produce a plan for this finding — see the workflow run for why.' + : '**Fix:** No action required; this is informational.'; +} diff --git a/src/runners/action.ts b/src/runners/action.ts index cd4ed71..4a2aec4 100644 --- a/src/runners/action.ts +++ b/src/runners/action.ts @@ -5,7 +5,17 @@ import type { DriftConfig } from '../config/schema.js'; import { loadConfig } from '../config/load.js'; import { GitHubClient } from '../github/client.js'; import { runPipeline } from '../pipeline.js'; +import { DRIFT_LABEL } from '../dispatch/index.js'; import { renderPullRequestBody } from '../report/markdown.js'; +import { + buildSarifLog, + DEPENDENCY_KIND_LABELS, + findingsFromCandidates, + findingsFromPlan, + type AlertGranularity, + type SarifFinding, +} from '../report/sarif.js'; +import { scanUpgrades, type UpgradeCandidate } from '../upgrade/scan.js'; import { createLogger, type Logger, type LogLevel } from '../util/logger.js'; import { matchesAny } from '../util/glob.js'; import { applyApproval } from '../approval/apply.js'; @@ -30,6 +40,10 @@ interface ActionInputs { logLevel: LogLevel; workspace: string; configPath?: string; + /** `diff` (default) analyses the push; `outdated` scans every installed dependency instead. */ + scanMode?: 'diff' | 'outdated'; + /** Overrides `codeScanning.granularity` in drift.yml. */ + alertGranularity?: AlertGranularity; } export async function runAction(): Promise { @@ -63,7 +77,7 @@ export async function runAction(): Promise { if (!repo) { logger.error( - 'Could not determine the repository and commit range from the event payload. Drift supports `push`, `workflow_dispatch`, and `issue_comment` events.', + 'Could not determine the repository and commit range from the event payload. Drift supports `push`, `workflow_dispatch`, `schedule`, and `issue_comment` events.', ); return 1; } @@ -76,7 +90,22 @@ export async function runAction(): Promise { // A workflow input overrides the committed config, so a team can trial // `auto` from a manual run without editing a file in their repo. - const effectiveConfig = inputs.mode ? { ...config, mode: inputs.mode } : config; + let effectiveConfig = inputs.mode ? { ...config, mode: inputs.mode } : config; + if (inputs.alertGranularity) { + effectiveConfig = { + ...effectiveConfig, + codeScanning: { ...effectiveConfig.codeScanning, granularity: inputs.alertGranularity }, + }; + } + + // A `schedule` trigger, or an explicit `scan-mode: outdated` on a manual + // dispatch, means "check every installed dependency against its registry" + // rather than "what changed in this push" — a different question with no + // commit range to diff, so it branches off before any of the range/ + // watchBranches logic below, which does not apply to it. + if (eventName === 'schedule' || inputs.scanMode === 'outdated') { + return runOutdatedScan(repo, effectiveConfig, github, inputs, logger); + } if (!matchesAny(effectiveConfig.watchBranches, repo.baseBranch)) { logger.info( @@ -108,6 +137,13 @@ export async function runAction(): Promise { await writeOutputs(result.dispatch, result.summary); if (result.plan) { await writeJobSummary(renderPullRequestBody(result.plan, effectiveConfig)); + const findings = findingsFromPlan(result.plan, { + includeInformational: effectiveConfig.codeScanning.includeInformational, + granularity: effectiveConfig.codeScanning.granularity, + repoBlobUrl: `https://github.com/${repo.owner}/${repo.repo}/blob/${repo.afterSha}`, + }); + await uploadCodeScanning({ repo, config: effectiveConfig, github, logger, findings, category: 'drift/diff' }); + await createIssuesForFindings({ repo, config: effectiveConfig, github, logger, findings }); } if (result.dispatch.status === 'dispatched') { @@ -131,8 +167,195 @@ export async function runAction(): Promise { } } +/** + * Upload every finding to the repository's code scanning dashboard. Shared + * by the push-triggered pipeline and the scheduled outdated-dependency scan, + * since both ultimately produce the same `SarifFinding[]` shape — see + * `report/sarif.ts`. + * + * `category` separates the two result sets (`drift/diff` vs `drift/outdated`) + * in GitHub's `runAutomationDetails.id`. Without it, the newest upload from + * either mode would be treated as the authoritative replacement for the + * other's findings too, incorrectly marking them fixed. + */ +async function uploadCodeScanning(args: { + repo: RepoContext; + config: DriftConfig; + github: GitHubClient; + logger: Logger; + findings: SarifFinding[]; + category: 'drift/diff' | 'drift/outdated'; +}): Promise { + const { repo, config, github, logger, findings, category } = args; + if (!config.codeScanning.enabled) return; + if (findings.length === 0) { + logger.debug('No code scanning findings to upload.'); + return; + } + + logger.info(`Uploading ${findings.length} code scanning finding(s).`); + await github.uploadSarif(repo, { + sarif: buildSarifLog(findings, category), + commitSha: repo.afterSha, + ref: `refs/heads/${repo.baseBranch}`, + }); +} + +/** + * Open a GitHub issue for every finding, in addition to the code scanning + * upload — opt-in via `codeScanning.createIssuesPerAlert`, for teams that + * want alerts triaged and assigned the way any other issue is rather than + * only through the Security tab. + * + * Each issue embeds the finding's `ruleId` as a hidden marker and a rescan + * looks that marker up before filing — the same statelessness + * `requestApproval` already relies on for the plan-approval issue (see + * `dispatch/index.ts`) — so a rescan finds the existing issue rather than + * piling up duplicates. It does not update an existing issue's body; a + * finding whose content changed still keeps its original issue open. + */ +async function createIssuesForFindings(args: { + repo: RepoContext; + config: DriftConfig; + github: GitHubClient; + logger: Logger; + findings: SarifFinding[]; +}): Promise { + const { repo, config, github, logger, findings } = args; + if (!config.codeScanning.createIssuesPerAlert || findings.length === 0) return; + + for (const finding of findings) { + const marker = `drift-alert:${finding.ruleId}`; + const existing = await github.findOpenPlanIssue(repo, marker); + if (existing !== null) { + logger.debug(`${finding.ruleId} already filed as issue #${existing}; not duplicating`); + continue; + } + + const issue = await github.createIssue(repo, { + title: `Drift: ${finding.ruleName}`, + body: `${finding.message}\n\n`, + labels: [DRIFT_LABEL, `drift:${finding.level}`], + assignees: config.issueCreation.assignees, + }); + if (!issue) { + logger.warn(`Could not open an issue for ${finding.ruleId}. Check that the token has \`issues: write\`.`); + continue; + } + logger.info(`Filed ${finding.ruleId} as issue #${issue.number}`); + } +} + +/** + * The `schedule`-triggered path: check every installed dependency against + * its registry, the same way `drift outdated` does locally, and alert on + * whatever is outdated — safe upgrades and ones with real breaking changes + * alike, each carrying its own evidence and fix. + * + * Deliberately does not dispatch a branch or a Copilot task the way the + * push-triggered path does. A `RemediationPlan` from this scan describes + * what fixing the code *would* look like if this upgrade were taken — it + * does not, itself, bump the manifest, because that is not this scan's job: + * Drift only ever edits code in response to a version change that has + * actually landed somewhere. Dispatching a fix branch here would create one + * for an upgrade nobody applied yet. The alert instead carries the exact + * command (`drift outdated --upgrade `, or the underlying package manager + * command) to apply it — once that commit lands and is pushed, the ordinary + * push-triggered pipeline above takes over exactly as it would for a human's + * own dependency bump. + */ +async function runOutdatedScan( + repo: RepoContext, + config: DriftConfig, + github: GitHubClient, + inputs: ActionInputs, + logger: Logger, +): Promise { + if (!config.outdated.enabled) { + logger.info('`outdated.enabled` is false in .github/drift.yml; skipping the scheduled outdated-dependency scan.'); + return 0; + } + + logger.info('Scanning installed dependencies against their registries...'); + + try { + const scan = await scanUpgrades({ + root: inputs.workspace, + repo, + config, + logger, + githubToken: inputs.repoToken, + }); + + logger.info( + `Checked ${scan.checked} dependenc${scan.checked === 1 ? 'y' : 'ies'}: ${scan.upToDate} up to date, ` + + `${scan.candidates.length} outdated, ${scan.unchecked.length} could not be checked.`, + ); + + const findings = findingsFromCandidates(scan.candidates, { + includeInformational: config.codeScanning.includeInformational, + granularity: config.codeScanning.granularity, + repoBlobUrl: `https://github.com/${repo.owner}/${repo.repo}/blob/${repo.afterSha}`, + }); + + await uploadCodeScanning({ repo, config, github, logger, findings, category: 'drift/outdated' }); + await createIssuesForFindings({ repo, config, github, logger, findings }); + + const summary = + `Checked ${scan.checked} dependenc${scan.checked === 1 ? 'y' : 'ies'}: ${scan.upToDate} up to date, ` + + `${scan.candidates.length} outdated, ${scan.unchecked.length} could not be checked.`; + + // This mode never dispatches a branch or PR — see the function's doc + // comment for why — so `skipped` is always the right status, whether or + // not it found anything to alert on. + await writeOutputs({ status: 'skipped' }, summary); + await writeJobSummary( + `### Drift: outdated dependency scan\n\n${summary}\n\n` + + (findings.length > 0 + ? `${findings.length} package(s) uploaded to the Security tab, each alert listing its breaking changes, their locations, and a fix.\n\n` + : 'Nothing rose to a Security tab alert.\n\n') + + renderOutdatedTable(scan.candidates), + ); + + return 0; + } catch (err) { + logger.error(`Outdated-dependency scan failed: ${(err as Error).message}`); + logger.debug((err as Error).stack ?? ''); + await writeOutputs({ status: 'failed' }, `Outdated-dependency scan failed: ${(err as Error).message}`); + return 1; + } +} + +/** + * A per-dependency table for the job summary: what's outdated, what would + * break, how much of it actually reaches this repository, and the risk. + * + * This is where the detail that `findingsFromCandidates` deliberately keeps + * out of the Security tab belongs instead — the full upstream breaking-change + * count for a package with nothing locally affected is useful context for a + * human skimming the summary, not a reason to open an alert nobody can act + * on. See `report/sarif.ts` for that split. + */ +function renderOutdatedTable(candidates: readonly UpgradeCandidate[]): string { + if (candidates.length === 0) return ''; + + const rows = candidates.map((c) => { + const version = c.selected === c.latest ? `${c.current} → ${c.selected}` : `${c.current} → ${c.selected} (latest ${c.latest})`; + const impact = c.breakingCount > 0 ? `${c.impactCount} site(s) in ${c.impactFiles} file(s)` : '—'; + return `| ${c.name} | ${DEPENDENCY_KIND_LABELS[c.kind]} | ${version} | ${c.breakingCount} | ${impact} | ${c.risk} |`; + }); + + return [ + '| Package | Kind | Version | Upstream breaking changes | Locally affected | Risk |', + '| --- | --- | --- | --- | --- | --- |', + ...rows, + ].join('\n'); +} + function readInputs(): ActionInputs { const mode = actionInput('mode'); + const scanMode = actionInput('scan-mode'); + const alertGranularity = actionInput('alert-granularity'); return { repoToken: actionInput('repo-token') ?? process.env.GITHUB_TOKEN ?? '', copilotToken: actionInput('copilot-token') || process.env.DRIFT_COPILOT_TOKEN || undefined, @@ -141,6 +364,11 @@ function readInputs(): ActionInputs { logLevel: (actionInput('log-level') as LogLevel) || 'info', workspace: process.env.GITHUB_WORKSPACE ?? process.cwd(), configPath: actionInput('config-path') || undefined, + scanMode: scanMode === 'outdated' ? 'outdated' : scanMode === 'diff' ? 'diff' : undefined, + alertGranularity: + alertGranularity === 'package' || alertGranularity === 'breakingChange' || alertGranularity === 'affectedSite' + ? alertGranularity + : undefined, }; } diff --git a/src/types.ts b/src/types.ts index 501b720..3629d7c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -237,6 +237,14 @@ export interface BreakingChange { kind: BreakingChangeKind; /** One-line statement of what broke. */ summary: string; + /** + * The actual before/after declaration text, when this came from a computed + * diff (see `StructuredFinding`). This is the evidence itself — a reader + * comparing two signatures — as opposed to `citations`, which point at + * where to go verify it independently. + */ + before?: string; + after?: string; /** What a fix must accomplish. Fed verbatim into the Copilot task. */ remediation: string; /** Identifiers to search for: export names, endpoint paths, option keys. */ diff --git a/src/upgrade/scan.ts b/src/upgrade/scan.ts index 9534fcb..c338bad 100644 --- a/src/upgrade/scan.ts +++ b/src/upgrade/scan.ts @@ -227,7 +227,7 @@ export interface ScanProgress { /** How widely to look. */ export interface ScanBreadth { - /** Include dev, optional and peer dependencies. */ + /** Include dev, optional and peer dependencies. On by default. */ includeDev: boolean; /** Cap on impact sites recorded per breaking change. */ maxSites: number; @@ -235,7 +235,7 @@ export interface ScanBreadth { maxPackages: number; } -const DEFAULT_BREADTH: ScanBreadth = { includeDev: false, maxSites: 40, maxPackages: 0 }; +const DEFAULT_BREADTH: ScanBreadth = { includeDev: true, maxSites: 40, maxPackages: 0 }; /** * Find every manifest in a set of directories and name the tool that owns it. @@ -1135,9 +1135,10 @@ export async function directDependencies( ? parserFor(target.lockfilePath)?.parse(lockContent, target.lockfilePath) : undefined; - // Runtime dependencies are what ship, so they are always checked. The rest are - // opt-in: a broken test helper is a nuisance, a broken runtime import is an - // outage, and mixing the two dilutes the signal. + // Runtime dependencies are what ship, so they are always checked. Dev, + // optional, and peer dependencies are checked by default too — they still + // run in CI or in some consumers' hands — but can be excluded to look at + // runtime alone. const kinds: DependencyKind[] = includeDev ? ['runtime', 'dev', 'optional', 'peer'] : ['runtime']; diff --git a/test/detect.test.ts b/test/detect.test.ts index 772cf8f..c858388 100644 --- a/test/detect.test.ts +++ b/test/detect.test.ts @@ -284,11 +284,11 @@ describe('triage', () => { assert.equal(actionable.length, 1, '0.x minors are breaking under semver section 4'); }); - test('skips dev dependencies unless enabled', () => { + test('dev dependencies are triaged by default, and can be turned off', () => { const dev = { ...change, kind: 'dev' as const }; - assert.equal(triage([dev], DEFAULT_CONFIG).actionable.length, 0); + assert.equal(triage([dev], DEFAULT_CONFIG).actionable.length, 1); - const config = DriftConfigSchema.parse({ triggerOn: { dev: true } }); - assert.equal(triage([dev], config).actionable.length, 1); + const config = DriftConfigSchema.parse({ triggerOn: { dev: false } }); + assert.equal(triage([dev], config).actionable.length, 0); }); }); diff --git a/test/dispatch.test.ts b/test/dispatch.test.ts index 54c9b24..cd9aebf 100644 --- a/test/dispatch.test.ts +++ b/test/dispatch.test.ts @@ -82,8 +82,10 @@ const RECIPE = { function fakeGithub() { const calls: string[] = []; + const issueParams: unknown[] = []; return { calls, + issueParams, async createBranch() { calls.push('createBranch'); return true; @@ -105,8 +107,9 @@ function fakeGithub() { async getDefaultBranch() { return 'main'; }, - async createIssue() { + async createIssue(_r: unknown, params: unknown) { calls.push('createIssue'); + issueParams.push(params); return { number: 2, url: 'https://github.com/acme/app/issues/2' }; }, async findOpenPlanIssue() { @@ -199,6 +202,37 @@ describe('dispatch: deterministic remediation before an agent', () => { }); }); + test('issueCreation.assignees is passed through to the approval issue', async () => { + await withWorkspace('gone();\n', async (workspace) => { + const config = DriftConfigSchema.parse({ + mode: 'auto', + remediation: { communityRecipes: false }, + issueCreation: { assignees: ['octocat'] }, + }); + const plan = buildPlan({ + repo: { ...repo, workspace }, + config, + changes: [], + evidence, + breakingChanges: [removedBreaking()] as never, + impactSites: [site('bc_2', 'app.ts', 'gone')] as never, + recipes: new Map([['bc_2', RECIPE]]) as never, + }); + + const github = fakeGithub(); + await dispatch({ + repo: { ...repo, workspace }, + plan, + config, + github: github as never, + logger, + }); + + assert.ok(github.calls.includes('createIssue')); + assert.deepEqual((github.issueParams[0] as { assignees?: string[] }).assignees, ['octocat']); + }); + }); + test('recipe failure falls back to approval safely rather than guessing', async () => { await withWorkspace('gone();\n', async (workspace) => { const config = DriftConfigSchema.parse({ mode: 'auto', remediation: { communityRecipes: true } }); diff --git a/test/fuzz.test.ts b/test/fuzz.test.ts new file mode 100644 index 0000000..3c10c77 --- /dev/null +++ b/test/fuzz.test.ts @@ -0,0 +1,99 @@ +import { test, describe } from 'node:test'; +import assert from 'node:assert/strict'; +import fc from 'fast-check'; +import { PARSERS } from '../dist/detect/index.js'; +import { parseRequirementLine } from '../dist/detect/ecosystems/python.js'; +import { parseConanReference } from '../dist/detect/ecosystems/conan.js'; +import { parseTomlArray, parseTomlVersionValue, scanTomlTables } from '../dist/detect/ecosystems/toml.js'; + +/** + * Property-based fuzzing over the hand-written string parsers that read + * untrusted manifest/lockfile content straight out of a scanned repository. + * `ManifestParser.parse` is documented as a total function — it must never + * throw on malformed input, since a syntax error in one manifest must not + * fail the whole Drift run (see `src/detect/ecosystems/types.ts`). These + * tests hold every parser to that invariant against randomly generated + * input rather than only the handful of fixtures the unit tests cover. + */ + +// One representative path per parser, exercising its primary `parse` +// branch — `handles()` for the full branch list lives in each ecosystems/*.ts. +const REPRESENTATIVE_PATHS: Record = { + 'pip/poetry/uv': ['pyproject.toml', 'requirements.txt', 'poetry.lock', 'setup.py', 'pipfile'], + 'npm/yarn/pnpm': ['package.json', 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'], + 'go modules': ['go.mod', 'go.sum'], + cargo: ['cargo.toml', 'cargo.lock'], + sbt: ['build.sbt'], + 'maven/gradle': ['pom.xml', 'build.gradle', 'build.gradle.kts', 'libs.versions.toml'], + bundler: ['gemfile', 'gemfile.lock', 'foo.gemspec'], + NuGet: ['app.csproj', 'packages.lock.json', 'packages.config'], + Composer: ['composer.json', 'composer.lock'], + Mix: ['mix.exs', 'mix.lock', 'rebar.config'], + pub: ['pubspec.yaml', 'pubspec.lock'], + 'Swift Package Manager': ['package.swift', 'package.resolved'], + CocoaPods: ['podfile', 'podfile.lock', 'foo.podspec'], + opam: ['dune-project', 'foo.opam'], + conan: ['conanfile.txt', 'conanfile.py', 'conan.lock'], + vcpkg: ['vcpkg.json'], + arduino: ['library.properties', 'platformio.ini'], +}; + +describe('manifest parsers never throw on malformed input', () => { + for (const parser of PARSERS) { + const paths = REPRESENTATIVE_PATHS[parser.name] ?? []; + assert.ok(paths.length > 0, `no representative path registered for parser ${parser.name}`); + + for (const path of paths) { + test(`${parser.name}: parse(${path}) is total`, () => { + fc.assert( + fc.property(fc.string({ maxLength: 2000 }), (content) => { + parser.parse(content, path); + }), + { numRuns: 200 }, + ); + }); + } + } +}); + +describe('standalone string parsers never throw on malformed input', () => { + test('parseRequirementLine', () => { + fc.assert( + fc.property(fc.string({ maxLength: 500 }), (line) => { + parseRequirementLine(line); + }), + ); + }); + + test('parseConanReference', () => { + fc.assert( + fc.property(fc.string({ maxLength: 500 }), (reference) => { + parseConanReference(reference); + }), + ); + }); + + test('parseTomlArray', () => { + fc.assert( + fc.property(fc.string({ maxLength: 500 }), (value) => { + parseTomlArray(value); + }), + ); + }); + + test('parseTomlVersionValue', () => { + fc.assert( + fc.property(fc.string({ maxLength: 500 }), (value) => { + parseTomlVersionValue(value); + }), + ); + }); + + test('scanTomlTables', () => { + fc.assert( + fc.property(fc.string({ maxLength: 2000 }), (content) => { + scanTomlTables(content); + }), + ); + }); +}); diff --git a/test/issue-branch.test.ts b/test/issue-branch.test.ts new file mode 100644 index 0000000..59e7fa5 --- /dev/null +++ b/test/issue-branch.test.ts @@ -0,0 +1,96 @@ +import { test, describe } from 'node:test'; +import assert from 'node:assert/strict'; +import { + branchNameFor, + buildIssueContent, + groupForAction, + issueMarker, +} from '../dist/actions/issue-branch.js'; +import type { BreakingChange } from '../dist/types.js'; + +/** + * The one-click issue/branch feature's content builders — the part shared + * by the CLI's interactive prompt and the extension's report webview. + * Everything here is pure, so these tests never touch git or GitHub. + */ + +function change(overrides: Partial = {}): BreakingChange { + return { + id: 'bc_1', + dependency: 'left-pad', + kind: 'removed-export', + summary: 'removed the default export', + remediation: 'use the named export instead', + symbols: ['default'], + confidence: 'high', + citations: [], + ...overrides, + }; +} + +describe('groupForAction', () => { + test('"change" scope gives every finding its own target', () => { + const changes = [change({ id: 'a' }), change({ id: 'b' })]; + const targets = groupForAction(changes, 'change'); + assert.equal(targets.length, 2); + assert.deepEqual(targets.map((t) => t.changes.length), [1, 1]); + }); + + test('"package" scope bundles findings for the same dependency', () => { + const changes = [ + change({ id: 'a', dependency: 'left-pad' }), + change({ id: 'b', dependency: 'left-pad' }), + change({ id: 'c', dependency: 'right-pad' }), + ]; + const targets = groupForAction(changes, 'package'); + assert.equal(targets.length, 2); + const leftPad = targets.find((t) => t.dependency === 'left-pad')!; + assert.equal(leftPad.changes.length, 2); + }); +}); + +describe('issueMarker', () => { + test('is deterministic and order-independent', () => { + const forward = { dependency: 'left-pad', changes: [change({ id: 'a' }), change({ id: 'b' })] }; + const backward = { dependency: 'left-pad', changes: [change({ id: 'b' }), change({ id: 'a' })] }; + assert.equal(issueMarker(forward), issueMarker(backward)); + }); + + test('differs across dependencies with the same finding ids', () => { + const a = issueMarker({ dependency: 'left-pad', changes: [change({ id: 'a' })] }); + const b = issueMarker({ dependency: 'right-pad', changes: [change({ id: 'a' })] }); + assert.notEqual(a, b); + }); +}); + +describe('branchNameFor', () => { + test('is a safe git ref for a single finding', () => { + const name = branchNameFor({ dependency: 'left-pad', changes: [change({ id: 'bc_1' })] }); + assert.match(name, /^drift\/left-pad\/bc-1$/); + }); + + test('drops the finding id when bundling a whole package', () => { + const name = branchNameFor({ + dependency: 'left-pad', + changes: [change({ id: 'a' }), change({ id: 'b' })], + }); + assert.equal(name, 'drift/left-pad'); + }); +}); + +describe('buildIssueContent', () => { + test('embeds the dedup marker and every finding', () => { + const target = { dependency: 'left-pad', changes: [change({ id: 'a' }), change({ id: 'b' })] }; + const content = buildIssueContent(target); + assert.match(content.title, /left-pad/); + assert.match(content.body, /removed the default export/); + assert.ok(content.body.includes(issueMarker(target))); + assert.deepEqual(content.labels, ['drift', 'drift:left-pad']); + }); + + test('links the tracking branch when one is supplied', () => { + const target = { dependency: 'left-pad', changes: [change()] }; + const content = buildIssueContent(target, 'drift/left-pad/bc-1'); + assert.match(content.body, /drift\/left-pad\/bc-1/); + }); +}); diff --git a/test/sarif.test.ts b/test/sarif.test.ts new file mode 100644 index 0000000..afb8ccd --- /dev/null +++ b/test/sarif.test.ts @@ -0,0 +1,487 @@ +import { test, describe } from 'node:test'; +import assert from 'node:assert/strict'; +import { buildSarifLog, findingsFromCandidates, findingsFromPlan } from '../dist/report/sarif.js'; +import { buildPlan } from '../dist/plan/index.js'; +import { DEFAULT_CONFIG } from '../dist/config/schema.js'; +import type { RemediationPlan } from '../dist/types.js'; +import type { UpgradeCandidate } from '../dist/upgrade/scan.js'; +import type { UpgradeRationale } from '../dist/rationale/types.js'; + +/** + * SARIF findings: what a repository sees in its Security tab. + * + * The core behavior under test: one alert per *package*, not one per + * breaking change and not one per upstream change. A breaking change with + * no impact site in this repository is never itemized in that alert — + * that's the fix for the 347-alert-body flood a single outdated `zod` + * upgrade produced in this repository (nearly all of those upstream changes + * touched no code here) — but every locally-actionable breaking change and + * security signal a package does have folds into its one alert as its own + * block, listed one after another rather than merged into one paragraph. + */ + +const repo = { + owner: 'acme', + repo: 'app', + baseBranch: 'main', + beforeSha: 'a'.repeat(40), + afterSha: 'b'.repeat(40), +}; + +const dependencyChange = { + name: 'acme-sdk', + ecosystem: 'npm' as const, + from: '1.0.0', + to: '2.0.0', + kind: 'runtime' as const, + bump: 'major' as const, + manifestPath: 'package.json', +}; + +const evidence = [ + { + id: 'ev_1', + source: 'type-surface-diff' as const, + dependency: 'acme-sdk', + url: 'https://example.com/diff', + title: 'API surface diff', + content: '`createClient` removed', + weight: 1, + }, +]; + +function breaking(id: string, overrides: Record = {}) { + return { + id, + dependency: 'acme-sdk', + kind: 'removed-export' as const, + summary: `\`createClient\` was removed (${id}).`, + remediation: 'Replace every usage of `createClient`.', + symbols: ['createClient'], + confidence: 'high' as const, + citations: ['ev_1'], + ...overrides, + }; +} + +const site = (breakingChangeId: string, overrides: Record = {}) => ({ + breakingChangeId, + file: 'src/index.ts', + line: 12, + excerpt: 'createClient()', + matchedSymbol: 'createClient', + confidence: 'high' as const, + ...overrides, +}); + +const cleanSecurity = { + checked: true, + current: [], + target: [], + resolved: [], + introduced: [], + carried: [], + direction: 'unknown' as const, +}; + +function rationale(overrides: Partial = {}): UpgradeRationale { + return { + dependency: 'acme-sdk', + from: '1.0.0', + to: '2.0.0', + security: cleanSecurity, + maintenance: { facts: [] }, + improvements: [], + license: { verdict: 'ok', statement: 'No license change.', introduced: [] }, + summary: { changes: [], unrelated: 0 }, + assessment: { + recommendation: 'safe-to-upgrade', + reasons: ['No breaking changes were found.'], + confidence: 'high', + confidenceBasis: 'A computed API diff was available.', + }, + gaps: [], + ...overrides, + }; +} + +describe('findingsFromPlan', () => { + test('one finding per package, folding every locally-actionable breaking change into its own block', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1'), breaking('bc_2')], + impactSites: [site('bc_1'), site('bc_2')], + }) as RemediationPlan; + + const findings = findingsFromPlan(plan); + assert.equal(findings.length, 1, 'one finding per package, not one per breaking change'); + assert.equal(findings[0]!.ruleId, 'drift/npm/acme-sdk', 'rule is stable per package, so a rescan replaces it'); + assert.equal(findings[0]!.level, 'error', 'high upstream confidence + high local confidence is an error'); + assert.match(findings[0]!.message, /createClient.*was removed \(bc_1\)/); + assert.match(findings[0]!.message, /createClient.*was removed \(bc_2\)/); + assert.match(findings[0]!.message, /---/, 'each breaking change is its own block, separated by a rule'); + assert.equal( + findings[0]!.primaryLocation.file, + dependencyChange.manifestPath, + 'package granularity anchors to the manifest, not one arbitrarily-chosen call site', + ); + assert.equal(findings[0]!.primaryLocation.line, 1); + assert.match(findings[0]!.message, /Seen at.*src\/index\.ts:12/s, 'the actual call site is still listed'); + }); + + test('a breaking change with no impact site is omitted from the alert body, not the whole alert', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1'), breaking('bc_2')], + impactSites: [site('bc_1')], // bc_2 reaches no code in this repo + }) as RemediationPlan; + + const findings = findingsFromPlan(plan); + assert.equal(findings.length, 1); + assert.match(findings[0]!.message, /bc_1/); + assert.doesNotMatch(findings[0]!.message, /bc_2/, 'the upstream-only change is not itemized'); + assert.match(findings[0]!.message, /1 additional upstream breaking change/); + }); + + test('multiple sites for the same breaking change: one alert, one primary location, the rest related', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1')], + impactSites: [ + site('bc_1', { file: 'src/a.ts', line: 1 }), + site('bc_1', { file: 'src/b.ts', line: 2 }), + ], + }) as RemediationPlan; + + const [finding] = findingsFromPlan(plan); + assert.equal(finding!.primaryLocation.file, dependencyChange.manifestPath); + assert.equal(finding!.relatedLocations.length, 2); + assert.equal(finding!.relatedLocations[0]!.file, 'src/a.ts'); + assert.equal(finding!.relatedLocations[1]!.file, 'src/b.ts'); + }); + + test('upstream-only confidence downgrades severity when local confidence is weaker', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1', { confidence: 'high' })], + impactSites: [site('bc_1', { confidence: 'medium' })], + }) as RemediationPlan; + + const [finding] = findingsFromPlan(plan); + assert.equal(finding!.level, 'warning', 'one strong signal but not two is a warning, not an error'); + }); + + test('a resolved advisory is alerted even with no breaking change', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [], + impactSites: [], + rationale: [ + rationale({ + security: { + ...cleanSecurity, + resolved: [ + { + id: 'GHSA-xxxx', + aliases: ['CVE-2024-1'], + summary: 'Prototype pollution', + severity: 'high', + url: 'https://example.com/advisory', + fixedIn: '2.0.0', + }, + ], + direction: 'improves', + }, + }), + ], + }) as RemediationPlan; + + const findings = findingsFromPlan(plan); + assert.equal(findings.length, 1); + assert.equal(findings[0]!.ruleId, 'drift/npm/acme-sdk'); + assert.equal(findings[0]!.level, 'note', 'resolving an advisory with nothing broken is informational'); + assert.match(findings[0]!.message, /GHSA-xxxx/); + assert.equal(findings[0]!.helpUri, 'https://example.com/advisory'); + }); + + test('a plain version bump with no signal is dropped by default', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [], + impactSites: [], + rationale: [rationale({ security: { ...cleanSecurity, checked: false, direction: 'unknown' } })], + }) as RemediationPlan; + + assert.equal(findingsFromPlan(plan).length, 0, 'includeInformational defaults to false'); + assert.equal(findingsFromPlan(plan, { includeInformational: true }).length, 1); + assert.equal(findingsFromPlan(plan, { includeInformational: true })[0]!.ruleId, 'drift/npm/acme-sdk'); + }); + + test('an unresolved current advisory is an error', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [], + impactSites: [], + rationale: [ + rationale({ + security: { + ...cleanSecurity, + current: [ + { + id: 'GHSA-yyyy', + aliases: [], + summary: 'Remote code execution', + severity: 'critical', + url: 'https://example.com/rce', + fixedIn: null, + }, + ], + direction: 'preserves', + }, + }), + ], + }) as RemediationPlan; + + const [finding] = findingsFromPlan(plan); + assert.equal(finding!.level, 'error'); + }); + + test('package granularity (default) never carries a snippet', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1')], + impactSites: [site('bc_1')], + }) as RemediationPlan; + + const [finding] = findingsFromPlan(plan); + assert.ok(!finding!.snippetOk, 'bundling many possible issues under one alert makes any one snippet arbitrary'); + }); + + test('every "Seen at" link resolves to a real repo URL, including sites beyond the related-locations cap', () => { + // 11 breaking changes, one site each — more than MAX_RELATED_LOCATIONS + // (9), so some sites fall outside the numeric relatedLocations id space + // and must fall back to an absolute blob URL rather than a broken + // relative link. + const ids = Array.from({ length: 11 }, (_, i) => `bc_${i}`); + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: ids.map((id) => breaking(id)), + impactSites: ids.map((id) => site(id, { file: `src/${id}.ts`, line: 1 })), + }) as RemediationPlan; + + const [finding] = findingsFromPlan(plan, { repoBlobUrl: 'https://github.com/acme/app/blob/deadbeef' }); + for (const id of ids) { + assert.match( + finding!.message, + new RegExp(`\\[\`src/${id}\\.ts:1\`\\]\\((?:\\d+|https://github\\.com/acme/app/blob/deadbeef/src/${id}\\.ts#L1)\\)`), + `${id}'s site link is either a jump-to-file id or a real blob URL, never a bare relative path`, + ); + } + assert.doesNotMatch(finding!.message, /\]\(src\//, 'no link is left as a bare relative path'); + }); + + test('breakingChange granularity: one alert per breaking change, each with its own stable ruleId and a representative snippet', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1'), breaking('bc_2')], + impactSites: [site('bc_1', { file: 'src/a.ts' }), site('bc_2', { file: 'src/b.ts' })], + }) as RemediationPlan; + + const findings = findingsFromPlan(plan, { granularity: 'breakingChange' }); + assert.equal(findings.length, 2, 'one alert per breaking change'); + const ruleIds = findings.map((f) => f.ruleId); + assert.ok(new Set(ruleIds).size === 2, 'ruleIds are distinct'); + for (const f of ruleIds) assert.match(f, /^drift\/npm\/acme-sdk\/bc_\d$/); + for (const finding of findings) assert.ok(finding.snippetOk, 'scoped to one breaking change, so its primary site is representative'); + + // rescanning the same plan produces the same ruleIds, so GitHub replaces each alert in place + const again = findingsFromPlan(plan, { granularity: 'breakingChange' }); + assert.deepEqual(again.map((f) => f.ruleId).sort(), ruleIds.sort()); + }); + + test('affectedSite granularity: one alert per call site, none carrying related locations', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1')], + impactSites: [ + site('bc_1', { file: 'src/a.ts', line: 1 }), + site('bc_1', { file: 'src/b.ts', line: 2 }), + ], + }) as RemediationPlan; + + const findings = findingsFromPlan(plan, { granularity: 'affectedSite' }); + assert.equal(findings.length, 2, 'one alert per call site, not per breaking change'); + const files = findings.map((f) => f.primaryLocation.file).sort(); + assert.deepEqual(files, ['src/a.ts', 'src/b.ts']); + for (const finding of findings) { + assert.equal(finding.relatedLocations.length, 0, 'a site alert is scoped to exactly one location'); + assert.ok(finding.snippetOk, 'exactly one site per alert, so its snippet is never a stand-in for another'); + } + assert.notEqual(findings[0]!.ruleId, findings[1]!.ruleId); + }); + + test('a security signal always gets its own single alert, regardless of granularity', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1')], + impactSites: [site('bc_1')], + rationale: [ + rationale({ + security: { + ...cleanSecurity, + resolved: [ + { + id: 'GHSA-xxxx', + aliases: [], + summary: 'Prototype pollution', + severity: 'high', + url: 'https://example.com/advisory', + fixedIn: '2.0.0', + }, + ], + }, + }), + ], + }) as RemediationPlan; + + const findings = findingsFromPlan(plan, { granularity: 'affectedSite' }); + // one alert per call site for the breaking change, plus exactly one for security + assert.equal(findings.length, 2); + const securityFinding = findings.find((f) => f.ruleId.endsWith('/other')); + assert.ok(securityFinding, 'the security block gets its own alert, suffixed distinctly from any site alert'); + assert.match(securityFinding!.message, /Resolves 1 known advisory/); + }); +}); + +describe('findingsFromCandidates', () => { + const baseCandidate: UpgradeCandidate = { + id: 'cand_1', + name: 'acme-sdk', + kind: 'runtime', + ecosystem: 'npm', + packageManager: 'npm', + manifestPath: 'package.json', + current: '1.0.0', + range: '^1.0.0', + selected: '1.2.0', + latest: '1.2.0', + versions: ['1.2.0'], + status: 'clean', + evidenceCount: 1, + breakingCount: 0, + impactCount: 0, + impactFiles: 0, + risk: 'none', + summary: 'No breaking changes found.', + gaps: [], + toolRequests: [], + }; + + test('a safe candidate with no commits gets the exact upgrade command as its fix', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [{ ...dependencyChange, from: '1.0.0', to: '1.2.0' }], + evidence: [], + breakingChanges: [], + impactSites: [], + rationale: [rationale({ from: '1.0.0', to: '1.2.0' })], + }) as RemediationPlan; + + const candidate: UpgradeCandidate = { ...baseCandidate, plan }; + const [finding] = findingsFromCandidates([candidate], { includeInformational: true }); + + assert.ok(finding, 'a candidate with a plan produces a finding'); + assert.equal(plan.commits.length, 0, 'a clean candidate has nothing to commit'); + assert.ok(finding!.fix?.command, 'the fix names the exact command to run'); + assert.match(finding!.fix!.command!, /1\.2\.0/); + }); + + test('a safe candidate produces no finding when informational alerts are off', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [{ ...dependencyChange, from: '1.0.0', to: '1.2.0' }], + evidence: [], + breakingChanges: [], + impactSites: [], + rationale: [rationale({ from: '1.0.0', to: '1.2.0' })], + }) as RemediationPlan; + + const candidate: UpgradeCandidate = { ...baseCandidate, plan }; + assert.equal(findingsFromCandidates([candidate]).length, 0); + }); + + test('a candidate with no plan produces no finding', () => { + assert.equal(findingsFromCandidates([{ ...baseCandidate }]).length, 0); + }); +}); + +describe('buildSarifLog', () => { + test('one rule per ruleId, one result per finding, with a category and a fingerprint', () => { + const plan = buildPlan({ + repo, + config: DEFAULT_CONFIG, + changes: [dependencyChange], + evidence, + breakingChanges: [breaking('bc_1')], + impactSites: [site('bc_1')], + }) as RemediationPlan; + + const log = buildSarifLog(findingsFromPlan(plan), 'drift/diff') as { + runs: [ + { + tool: { driver: { rules: unknown[] } }; + automationDetails?: { id: string }; + results: { partialFingerprints: { primaryLocationLineHash: string } }[]; + }, + ]; + }; + + assert.equal(log.runs[0]!.tool.driver.rules.length, 1); + assert.equal(log.runs[0]!.results.length, 1); + assert.equal(log.runs[0]!.automationDetails?.id, 'drift/diff'); + assert.ok(log.runs[0]!.results[0]!.partialFingerprints.primaryLocationLineHash.length > 0); + }); + + test('an empty finding list is still a valid, empty SARIF log', () => { + const log = buildSarifLog([]) as { runs: [{ results: unknown[] }] }; + assert.equal(log.runs[0]!.results.length, 0); + }); +});