Merge branch 'main' into imanolmaiztegui/kilo-opencode-v1.3.14

This commit is contained in:
Catriel Müller
2026-04-13 15:44:28 -03:00
committed by GitHub
63 changed files with 5959 additions and 115 deletions
+25
View File
@@ -0,0 +1,25 @@
# Changesets
This directory contains changeset files used to track changes for the next release.
## Adding a changeset
When making a user-facing change, run:
```sh
bunx changeset add
```
Or manually create a file `.changeset/<slug>.md`:
```md
---
"kilo-code": minor
---
Short description of the change for the changelog.
```
Use `patch` for bug fixes, `minor` for new features, `major` for breaking changes.
Changeset files are consumed at release time when the `publish.yml` workflow runs, generating changelog entries for the GitHub release notes.
+11
View File
@@ -0,0 +1,11 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.0.4/schema.json",
"changelog": ["../script/changelog-github.cjs", { "repo": "Kilo-Org/kilocode" }],
"commit": false,
"fixed": [["kilo-code", "@kilocode/cli"]],
"linked": [],
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
}
+10
View File
@@ -0,0 +1,10 @@
---
"kilo-code": patch
"@kilocode/cli": patch
---
Merged upstream opencode changes from v1.3.10:
- Subagent tool calls stay clickable while pending
- Improved storage migration reliability
- Better muted text contrast in Catppuccin themes
+9
View File
@@ -0,0 +1,9 @@
---
"kilo-code": patch
"@kilocode/cli": patch
---
Merged upstream opencode changes from v1.3.6:
- Fixed token usage double-counting for Anthropic and Amazon Bedrock providers
- Fixed variant dialog search filtering
+10
View File
@@ -0,0 +1,10 @@
---
"kilo-code": patch
"@kilocode/cli": patch
---
Merged upstream opencode changes from v1.3.7:
- Added first-class PowerShell support on Windows
- Plugin installs now preserve JSONC comments in configuration files
- Improved variant modal behavior to be less intrusive
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Make subsession costs in TaskHeader tooltip more readable with many subsessions
+5
View File
@@ -46,9 +46,14 @@ jobs:
- uses: ./.github/actions/setup-bun - uses: ./.github/actions/setup-bun
# kilocode_change start - install deps for changeset changelog generation
- name: Install dependencies
run: bun install
- name: Install Kilo - name: Install Kilo
if: inputs.bump || inputs.version if: inputs.bump || inputs.version
run: bun i -g @kilocode/cli run: bun i -g @kilocode/cli
# kilocode_change end
- id: version - id: version
run: | run: |
+176 -16
View File
@@ -14,6 +14,8 @@
}, },
"devDependencies": { "devDependencies": {
"@actions/artifact": "5.0.1", "@actions/artifact": "5.0.1",
"@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.27.10",
"@tsconfig/bun": "catalog:", "@tsconfig/bun": "catalog:",
"@types/mime-types": "3.0.1", "@types/mime-types": "3.0.1",
"@typescript/native-preview": "catalog:", "@typescript/native-preview": "catalog:",
@@ -955,6 +957,44 @@
"@bufbuild/protoplugin": ["@bufbuild/protoplugin@2.11.0", "", { "dependencies": { "@bufbuild/protobuf": "2.11.0", "@typescript/vfs": "^1.6.2", "typescript": "5.4.5" } }, "sha512-lyZVNFUHArIOt4W0+dwYBe5GBwbKzbOy8ObaloEqsw9Mmiwv2O48TwddDoHN4itylC+BaEGqFdI1W8WQt2vWJQ=="], "@bufbuild/protoplugin": ["@bufbuild/protoplugin@2.11.0", "", { "dependencies": { "@bufbuild/protobuf": "2.11.0", "@typescript/vfs": "^1.6.2", "typescript": "5.4.5" } }, "sha512-lyZVNFUHArIOt4W0+dwYBe5GBwbKzbOy8ObaloEqsw9Mmiwv2O48TwddDoHN4itylC+BaEGqFdI1W8WQt2vWJQ=="],
"@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="],
"@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
"@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="],
"@changesets/changelog-github": ["@changesets/changelog-github@0.5.2", "", { "dependencies": { "@changesets/get-github-info": "^0.7.0", "@changesets/types": "^6.1.0", "dotenv": "^8.1.0" } }, "sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw=="],
"@changesets/cli": ["@changesets/cli@2.30.0", "", { "dependencies": { "@changesets/apply-release-plan": "^7.1.0", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.3", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.15", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA=="],
"@changesets/config": ["@changesets/config@3.1.3", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw=="],
"@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="],
"@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="],
"@changesets/get-github-info": ["@changesets/get-github-info@0.7.0", "", { "dependencies": { "dataloader": "^1.4.0", "node-fetch": "^2.5.0" } }, "sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A=="],
"@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.15", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.3", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g=="],
"@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="],
"@changesets/git": ["@changesets/git@3.0.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw=="],
"@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="],
"@changesets/parse": ["@changesets/parse@0.4.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A=="],
"@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="],
"@changesets/read": ["@changesets/read@0.6.7", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA=="],
"@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="],
"@changesets/types": ["@changesets/types@6.1.0", "", {}, "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA=="],
"@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="],
"@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@12.0.0", "", { "dependencies": { "@chevrotain/gast": "12.0.0", "@chevrotain/types": "12.0.0" } }, "sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg=="], "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@12.0.0", "", { "dependencies": { "@chevrotain/gast": "12.0.0", "@chevrotain/types": "12.0.0" } }, "sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg=="],
"@chevrotain/gast": ["@chevrotain/gast@12.0.0", "", { "dependencies": { "@chevrotain/types": "12.0.0" } }, "sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ=="], "@chevrotain/gast": ["@chevrotain/gast@12.0.0", "", { "dependencies": { "@chevrotain/types": "12.0.0" } }, "sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ=="],
@@ -1187,6 +1227,8 @@
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
"@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
"@internationalized/date": ["@internationalized/date@3.12.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ=="], "@internationalized/date": ["@internationalized/date@3.12.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ=="],
"@internationalized/number": ["@internationalized/number@3.6.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g=="], "@internationalized/number": ["@internationalized/number@3.6.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g=="],
@@ -1309,6 +1351,10 @@
"@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="],
"@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="],
"@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="],
"@markdoc/markdoc": ["@markdoc/markdoc@0.5.7", "", { "optionalDependencies": { "@types/linkify-it": "^3.0.1", "@types/markdown-it": "12.2.3" }, "peerDependencies": { "@types/react": "*", "react": "*" }, "optionalPeers": ["@types/react", "react"] }, "sha512-NxreNThm7foFgMMQD6zgk7rKkcFMmdC8J5r+Zn4FKoN75F5YjvwdihwF11VhrBfL3CXnD4+YG1VYwvBL+igzvw=="], "@markdoc/markdoc": ["@markdoc/markdoc@0.5.7", "", { "optionalDependencies": { "@types/linkify-it": "^3.0.1", "@types/markdown-it": "12.2.3" }, "peerDependencies": { "@types/react": "*", "react": "*" }, "optionalPeers": ["@types/react", "react"] }, "sha512-NxreNThm7foFgMMQD6zgk7rKkcFMmdC8J5r+Zn4FKoN75F5YjvwdihwF11VhrBfL3CXnD4+YG1VYwvBL+igzvw=="],
"@markdoc/next.js": ["@markdoc/next.js@0.5.0", "", { "dependencies": { "js-yaml": "^4.1.0" }, "peerDependencies": { "@markdoc/markdoc": "*", "next": "*", "react": "*" } }, "sha512-gzWvRc2dlxArQn1mDS4SHed46vkAoKBbXkELihQRYv1eVSA0u9eoNEdJXNuBL4Ajn9j2dPpwZp6nAVjN4nzZlA=="], "@markdoc/next.js": ["@markdoc/next.js@0.5.0", "", { "dependencies": { "js-yaml": "^4.1.0" }, "peerDependencies": { "@markdoc/markdoc": "*", "next": "*", "react": "*" } }, "sha512-gzWvRc2dlxArQn1mDS4SHed46vkAoKBbXkELihQRYv1eVSA0u9eoNEdJXNuBL4Ajn9j2dPpwZp6nAVjN4nzZlA=="],
@@ -2367,6 +2413,8 @@
"array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
"arrgv": ["arrgv@1.0.2", "", {}, "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw=="], "arrgv": ["arrgv@1.0.2", "", {}, "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw=="],
"arrify": ["arrify@3.0.0", "", {}, "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw=="], "arrify": ["arrify@3.0.0", "", {}, "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw=="],
@@ -2441,6 +2489,8 @@
"before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="],
"better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="],
"bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
"bin-links": ["bin-links@6.0.0", "", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w=="], "bin-links": ["bin-links@6.0.0", "", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w=="],
@@ -2551,6 +2601,8 @@
"character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
"chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
"check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="],
"cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="], "cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="],
@@ -2755,6 +2807,8 @@
"data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"dataloader": ["dataloader@1.4.0", "", {}, "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="],
"date-time": ["date-time@3.1.0", "", { "dependencies": { "time-zone": "^1.0.0" } }, "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg=="], "date-time": ["date-time@3.1.0", "", { "dependencies": { "time-zone": "^1.0.0" } }, "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg=="],
"dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="],
@@ -2807,6 +2861,8 @@
"destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
"detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="],
"detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
"detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="],
@@ -2911,6 +2967,8 @@
"enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="], "enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
"enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="],
"entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
"env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
@@ -3001,6 +3059,8 @@
"extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
"extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="],
"extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="],
"extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="],
@@ -3105,7 +3165,7 @@
"fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="],
"fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="],
"fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
@@ -3157,7 +3217,7 @@
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
"globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
"google-auth-library": ["google-auth-library@10.5.0", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.0.0", "gcp-metadata": "^8.0.0", "google-logging-utils": "^1.0.0", "gtoken": "^8.0.0", "jws": "^4.0.0" } }, "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w=="], "google-auth-library": ["google-auth-library@10.5.0", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.0.0", "gcp-metadata": "^8.0.0", "google-logging-utils": "^1.0.0", "gtoken": "^8.0.0", "jws": "^4.0.0" } }, "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w=="],
@@ -3221,6 +3281,8 @@
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
"human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
"human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="],
"humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
@@ -3309,12 +3371,16 @@
"is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
"is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],
"is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
"is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
"is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
"is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
"is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
"is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="],
@@ -3505,6 +3571,8 @@
"lodash.samplesize": ["lodash.samplesize@4.2.0", "", {}, "sha512-1ZhKV7/nuISuaQdxfCqrs4HHxXIYN+0Z4f7NMQn2PHkxFZJGavJQ1j/paxyJnLJmN2ZamNN6SMepneV+dCgQTA=="], "lodash.samplesize": ["lodash.samplesize@4.2.0", "", {}, "sha512-1ZhKV7/nuISuaQdxfCqrs4HHxXIYN+0Z4f7NMQn2PHkxFZJGavJQ1j/paxyJnLJmN2ZamNN6SMepneV+dCgQTA=="],
"lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
"lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="],
"log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
@@ -3631,6 +3699,8 @@
"motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="], "motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"msgpackr": ["msgpackr@1.11.9", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw=="], "msgpackr": ["msgpackr@1.11.9", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw=="],
@@ -3759,6 +3829,8 @@
"ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
"outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
"oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="], "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
"p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="],
@@ -3767,6 +3839,8 @@
"p-event": ["p-event@5.0.1", "", { "dependencies": { "p-timeout": "^5.0.2" } }, "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ=="], "p-event": ["p-event@5.0.1", "", { "dependencies": { "p-timeout": "^5.0.2" } }, "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ=="],
"p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="],
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
@@ -3779,7 +3853,7 @@
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
"pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="], "pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="],
@@ -3997,6 +4071,8 @@
"read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="],
"read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],
"readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
"readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="], "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
@@ -4041,7 +4117,7 @@
"resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="],
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
@@ -4163,7 +4239,7 @@
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
"slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
"slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
@@ -4203,6 +4279,8 @@
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
"spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="],
"spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
"spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
@@ -4271,6 +4349,8 @@
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
"strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
"strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
@@ -4331,6 +4411,8 @@
"temp-file": ["temp-file@3.4.0", "", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="], "temp-file": ["temp-file@3.4.0", "", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="],
"term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="],
"terminal-link": ["terminal-link@4.0.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "supports-hyperlinks": "^3.2.0" } }, "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA=="], "terminal-link": ["terminal-link@4.0.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "supports-hyperlinks": "^3.2.0" } }, "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA=="],
"test-exclude": ["test-exclude@7.0.2", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^10.2.2" } }, "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw=="], "test-exclude": ["test-exclude@7.0.2", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^10.2.2" } }, "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw=="],
@@ -4479,7 +4561,7 @@
"universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="],
"universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
@@ -4663,6 +4745,8 @@
"@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
"@antfu/install-pkg/tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], "@antfu/install-pkg/tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="],
"@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
@@ -4693,6 +4777,12 @@
"@bufbuild/protoplugin/typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="], "@bufbuild/protoplugin/typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="],
"@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
"@changesets/changelog-github/dotenv": ["dotenv@8.6.0", "", {}, "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="],
"@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
"@develar/schema-utils/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "@develar/schema-utils/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
"@effect/platform-node/undici": ["undici@7.24.7", "", {}, "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ=="], "@effect/platform-node/undici": ["undici@7.24.7", "", {}, "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ=="],
@@ -4713,6 +4803,8 @@
"@electron/notarize/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],
"@electron/osx-sign/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="],
"@electron/rebuild/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "@electron/rebuild/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
@@ -4799,6 +4891,14 @@
"@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],
"@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
"@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
"@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="],
"@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
"@modelcontextprotocol/sdk/jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], "@modelcontextprotocol/sdk/jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="],
"@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], "@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="],
@@ -5025,6 +5125,8 @@
"builder-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "builder-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"builder-util/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"builder-util-runtime/sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], "builder-util-runtime/sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
"c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
@@ -5069,6 +5171,8 @@
"dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], "dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
"dmg-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"dmg-builder/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "dmg-builder/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
"dmg-license/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "dmg-license/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
@@ -5081,15 +5185,19 @@
"electron-builder/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "electron-builder/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"electron-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"electron-builder/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "electron-builder/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
"electron-publish/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "electron-publish/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"electron-publish/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"electron-publish/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], "electron-publish/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="],
"electron-vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "electron-updater/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"electron-winstaller/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], "electron-vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
@@ -5097,6 +5205,8 @@
"engine.io-client/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], "engine.io-client/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="],
"enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"eslint/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "eslint/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
"eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
@@ -5125,8 +5235,6 @@
"friendly-words/express": ["express@4.22.1", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="], "friendly-words/express": ["express@4.22.1", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="],
"fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
"gitlab-ai-provider/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.71.2", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ=="], "gitlab-ai-provider/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.71.2", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ=="],
@@ -5137,6 +5245,8 @@
"global-agent/matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], "global-agent/matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="],
"globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
"gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
"http2-wrapper/quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], "http2-wrapper/quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
@@ -5145,6 +5255,8 @@
"iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], "iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="],
"import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
"isomorphic-git/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "isomorphic-git/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
"istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
@@ -5239,6 +5351,8 @@
"ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], "ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
"p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="],
"parent-module/callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "parent-module/callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
"parse-semver/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], "parse-semver/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
@@ -5281,18 +5395,20 @@
"read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], "read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
"read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
"readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
"readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
"redent/indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "redent/indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
"resolve-cwd/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
"restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
"rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
"secretlint/globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="],
"serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="],
"sharp/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "sharp/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
@@ -5339,6 +5455,8 @@
"tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
"temp-file/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
"test-exclude/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "test-exclude/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
"tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
@@ -5413,7 +5531,7 @@
"@electron/fuses/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/fuses/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "@electron/fuses/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"@electron/notarize/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/notarize/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
@@ -5447,10 +5565,14 @@
"@electron/universal/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/universal/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"@electron/universal/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="],
"@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"@electron/windows-sign/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="],
"@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
@@ -5481,6 +5603,10 @@
"@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "@malept/flatpak-bundler/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"@malept/flatpak-bundler/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
"@morphllm/morphsdk/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw=="], "@morphllm/morphsdk/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw=="],
"@morphllm/morphsdk/ai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.1", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng=="], "@morphllm/morphsdk/ai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.1", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng=="],
@@ -5681,6 +5807,10 @@
"builder-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "builder-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"builder-util/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"builder-util/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
"c8/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "c8/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
@@ -5699,6 +5829,10 @@
"dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="],
"dmg-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"dmg-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
"drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], "drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
@@ -5755,6 +5889,10 @@
"electron-builder/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "electron-builder/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"electron-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"electron-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"electron-builder/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "electron-builder/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
"electron-builder/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "electron-builder/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -5763,6 +5901,14 @@
"electron-publish/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "electron-publish/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
"electron-publish/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"electron-publish/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"electron-updater/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"electron-updater/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"electron-vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], "electron-vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
"electron-vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], "electron-vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
@@ -5815,7 +5961,7 @@
"electron-vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], "electron-vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
"electron-winstaller/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
@@ -5879,6 +6025,8 @@
"node-sarif-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "node-sarif-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"node-sarif-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
"opencontrol/@modelcontextprotocol/sdk/express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], "opencontrol/@modelcontextprotocol/sdk/express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="],
@@ -5911,12 +6059,16 @@
"qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], "qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="],
"read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
"readable-stream/buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], "readable-stream/buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
"readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="],
"rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
"secretlint/globby/slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="],
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"supertap/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "supertap/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
@@ -5929,6 +6081,10 @@
"tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
"temp-file/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
"temp-file/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"test-exclude/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], "test-exclude/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
"test-exclude/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], "test-exclude/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
@@ -5995,6 +6151,8 @@
"@kilocode/kilo-gateway/@opentui/solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@kilocode/kilo-gateway/@opentui/solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
"@morphllm/morphsdk/ai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@morphllm/morphsdk/ai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@octokit/graphql/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], "@octokit/graphql/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="],
@@ -6055,8 +6213,6 @@
"@vscode/vsce/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "@vscode/vsce/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
"app-builder-lib/@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="],
"archiver-utils/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], "archiver-utils/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
"archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="],
@@ -6155,6 +6311,8 @@
"qrcode/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], "qrcode/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="],
"read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
"readdir-glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "readdir-glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
"rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="],
@@ -6191,6 +6349,8 @@
"@kilocode/cli/@morphllm/morphsdk/ai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@kilocode/cli/@morphllm/morphsdk/ai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
"@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
"@vscode/test-cli/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@vscode/test-cli/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+5 -1
View File
@@ -16,7 +16,9 @@
"random": "echo 'Random script'", "random": "echo 'Random script'",
"hello": "echo 'Hello World!'", "hello": "echo 'Hello World!'",
"test": "echo 'do not run tests from root' && exit 1", "test": "echo 'do not run tests from root' && exit 1",
"extension": "bun --cwd packages/kilo-vscode script/launch.ts" "extension": "bun --cwd packages/kilo-vscode script/launch.ts",
"changeset": "bunx changeset",
"changeset:version": "bunx changeset version && bun install --lockfile-only"
}, },
"workspaces": { "workspaces": {
"packages": [ "packages": [
@@ -74,6 +76,8 @@
}, },
"devDependencies": { "devDependencies": {
"@actions/artifact": "5.0.1", "@actions/artifact": "5.0.1",
"@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.27.10",
"@tsconfig/bun": "catalog:", "@tsconfig/bun": "catalog:",
"@types/mime-types": "3.0.1", "@types/mime-types": "3.0.1",
"@typescript/native-preview": "catalog:", "@typescript/native-preview": "catalog:",
@@ -33,14 +33,54 @@ Each Agent Manager session runs in an isolated git worktree on a separate branch
### PR Status Badges ### PR Status Badges
Worktree items in the sidebar display a **PR status badge** when the branch has an associated pull request: Each worktree item displays a **PR status badge** when its branch has an associated pull request. The badge shows the PR number (e.g. `#142`) and is color-coded to reflect the current state at a glance. Click the badge to open the PR in your browser.
- **Open** — badge indicating the PR is open (its color can also reflect review and check status) {% callout type="info" %}
- **Merged** — purple badge indicating the PR has been merged The GitHub CLI (`gh`) must be installed and authenticated for PR badges to work. If `gh` is missing or not logged in, badges won't appear.
- **Closed** — red badge indicating the PR was closed without merging {% /callout %}
- **Draft** — gray badge indicating the PR is in draft state
The badge appears on the right side of each worktree item and updates automatically via polling. If the worktree's branch doesn't have a PR yet, no badge is shown. #### How PRs are detected
The extension uses `gh` to automatically discover PRs for each worktree branch. Three strategies are tried in order:
1. **Branch tracking ref**`gh pr view` resolves via the branch's tracking ref (works for fork PRs checked out with `gh pr checkout`)
2. **Branch name**`gh pr view <branch>` matches same-repo branches pushed to origin
3. **HEAD commit SHA**`gh pr list --search "<sha>"` as a last resort, matching PRs whose head ref points to the exact same commit
You can also import a PR directly from the advanced new worktree dialog: open the **New Worktree** dropdown and select **Advanced**, or press `Cmd+Shift+N` (macOS) / `Ctrl+Shift+N` (Windows/Linux), switch to the **Import** tab, then paste the GitHub PR URL. The branch is checked out and the badge appears automatically.
#### Badge colors
The badge color reflects the most important signal, evaluated in priority order:
| State | Color | Condition |
| --- | --- | --- |
| Draft | Gray | PR is in draft state |
| Merged | Purple | PR has been merged |
| Closed | Red | PR was closed without merging |
| Checks failing | Red | Any CI check has failed |
| Changes requested | Yellow | A reviewer requested changes |
| Checks pending | Yellow (pulsing) | CI checks are still running |
| Open (default) | Green | PR is open, no failing or pending checks, no blocking review |
When checks are pending on an open PR, the badge pulses to indicate activity.
#### Badge icon
The badge shows a **checkmark** icon when the PR review status is "Approved", and a **branch** icon in all other cases.
#### Hover card details
Hovering over a worktree item shows a card with additional PR details:
- **PR number** with a link icon to open it in the browser
- **State** — Open, Draft, Merged, or Closed
- **Review** — Approved, Changes Requested, or Pending (when a review exists)
- **Checks** — how many checks passed out of the total (e.g. `8/10 passed`)
#### Automatic updates
PR badges update automatically in the background. The active worktree refreshes frequently, while other worktrees sync periodically to keep badges current. Polling pauses when the Agent Manager panel is hidden.
### Creating a New Worktree Session ### Creating a New Worktree Session
File diff suppressed because it is too large Load Diff
+12
View File
@@ -165,6 +165,12 @@
"category": "Kilo Code", "category": "Kilo Code",
"icon": "$(terminal)" "icon": "$(terminal)"
}, },
{
"command": "kilo-code.new.agentManager.runScript",
"title": "Agent Manager: Run Script",
"category": "Kilo Code",
"icon": "$(play)"
},
{ {
"command": "kilo-code.new.agentManager.toggleDiff", "command": "kilo-code.new.agentManager.toggleDiff",
"title": "Agent Manager: Toggle Diff Panel", "title": "Agent Manager: Toggle Diff Panel",
@@ -508,6 +514,12 @@
"mac": "cmd+/", "mac": "cmd+/",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'" "when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel'"
}, },
{
"command": "kilo-code.new.agentManager.runScript",
"key": "ctrl+e",
"mac": "cmd+e",
"when": "activeWebviewPanelId == 'kilo-code.new.AgentManagerPanel' && (isMac || !terminalFocus)"
},
{ {
"command": "kilo-code.new.agentManager.toggleDiff", "command": "kilo-code.new.agentManager.toggleDiff",
"key": "ctrl+d", "key": "ctrl+d",
+7 -3
View File
@@ -49,6 +49,7 @@ import { matchFollowup, recordFollowup, type Followup } from "./kilo-provider/fo
import { childID } from "./kilo-provider/task-session" import { childID } from "./kilo-provider/task-session"
import { handleNetworkEvent, clearNetworkWaits } from "./kilo-provider/network" import { handleNetworkEvent, clearNetworkWaits } from "./kilo-provider/network"
import { retryable, backoff, MAX_RETRIES } from "./util/retry" import { retryable, backoff, MAX_RETRIES } from "./util/retry"
import { hasGit } from "./kilo-provider/git-status"
// legacy-migration start // legacy-migration start
import { import {
checkAndShowMigrationWizard, checkAndShowMigrationWizard,
@@ -200,6 +201,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
private statsPoller: GitStatsPoller | null = null private statsPoller: GitStatsPoller | null = null
private statsGitOps: GitOps | null = null private statsGitOps: GitOps | null = null
private cachedStats: unknown = null private cachedStats: unknown = null
private cachedGitRepo = false
/** Optional interceptor called before the standard message handler. /** Optional interceptor called before the standard message handler.
* Return null to consume the message, or return a (possibly transformed) message. */ * Return null to consume the message, or return a (possibly transformed) message. */
@@ -341,8 +343,9 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
data: profileData, data: profileData,
}) })
// Re-send cached worktree stats so the badge renders immediately after webview reload. // Re-send cached worktree stats and git status after webview reload.
if (this.cachedStats) this.postMessage(this.cachedStats) if (this.cachedStats) this.postMessage(this.cachedStats)
this.postMessage({ type: "gitStatus", repo: this.cachedGitRepo })
// Seed session status map so the Settings panel knows about already-running sessions. // Seed session status map so the Settings panel knows about already-running sessions.
// Must run after webview is ready (postMessage is a no-op before that). // Must run after webview is ready (postMessage is a no-op before that).
@@ -1202,12 +1205,13 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.fetchAndSendNotifications(), this.fetchAndSendNotifications(),
this.seedSessionStatusMap(), this.seedSessionStatusMap(),
]) ])
this.cachedGitRepo = await hasGit(this.client!, this.getWorkspaceDirectory())
this.postMessage({ type: "gitStatus", repo: this.cachedGitRepo })
this.sendNotificationSettings() this.sendNotificationSettings()
this.sendTimelineSetting() this.sendTimelineSetting()
this.postMessage({ type: "extensionDataReady" }) this.postMessage({ type: "extensionDataReady" })
// Start polling worktree diff stats for the sidebar badge if (this.cachedGitRepo) this.startStatsPolling()
this.startStatsPolling()
console.log("[Kilo New] KiloProvider: ✅ initializeConnection completed successfully") console.log("[Kilo New] KiloProvider: ✅ initializeConnection completed successfully")
} catch (error) { } catch (error) {
@@ -19,6 +19,9 @@ import { copyEnvFiles } from "./env-copy"
import { SessionTerminalManager } from "./SessionTerminalManager" import { SessionTerminalManager } from "./SessionTerminalManager"
import { createTerminalHost } from "./terminal-host" import { createTerminalHost } from "./terminal-host"
import { executeVscodeTask } from "./task-runner" import { executeVscodeTask } from "./task-runner"
import { startVscodeRunTask } from "./run/task"
import { RunController } from "./run/controller"
import { handleRunMessage } from "./run/message"
import { forkSession } from "./fork-session" import { forkSession } from "./fork-session"
import { continueInWorktree } from "./continue-in-worktree" import { continueInWorktree } from "./continue-in-worktree"
import { WorktreeDiffController } from "./worktree-diff-controller" import { WorktreeDiffController } from "./worktree-diff-controller"
@@ -49,6 +52,7 @@ export class AgentManagerProvider implements Disposable {
private setupScript: SetupScriptService | undefined private setupScript: SetupScriptService | undefined
private importer: WorktreeImporter private importer: WorktreeImporter
private terminalManager: SessionTerminalManager private terminalManager: SessionTerminalManager
private run: RunController
private stateReady: Promise<void> | undefined private stateReady: Promise<void> | undefined
private statsPoller: GitStatsPoller private statsPoller: GitStatsPoller
private prBridge!: PRStatusBridge private prBridge!: PRStatusBridge
@@ -71,6 +75,16 @@ export class AgentManagerProvider implements Disposable {
(msg) => this.outputChannel.appendLine(`[SessionTerminal] ${msg}`), (msg) => this.outputChannel.appendLine(`[SessionTerminal] ${msg}`),
createTerminalHost(), createTerminalHost(),
) )
this.run = new RunController({
root: () => this.getRoot(),
state: () => this.getStateManager(),
open: (file) => this.host.openDocument(file),
start: startVscodeRunTask,
post: (status) => this.postToWebview({ type: "agentManager.runStatus", ...status }),
error: (message) => this.postToWebview({ type: "error", message }),
log: (msg) => this.outputChannel.appendLine(`[RunScript] ${msg}`),
refresh: () => this.pushState(),
})
this.importer = new WorktreeImporter({ this.importer = new WorktreeImporter({
manager: () => this.getWorktreeManager(), manager: () => this.getWorktreeManager(),
state: () => this.getStateManager(), state: () => this.getStateManager(),
@@ -354,6 +368,7 @@ export class AgentManagerProvider implements Disposable {
void this.configureSetupScript() void this.configureSetupScript()
return null return null
} }
if (handleRunMessage(this.run, m)) return null
if (m.type === "agentManager.showTerminal") { if (m.type === "agentManager.showTerminal") {
this.terminalManager.showTerminal(m.sessionId, this.state) this.terminalManager.showTerminal(m.sessionId, this.state)
return null return null
@@ -766,6 +781,7 @@ export class AgentManagerProvider implements Disposable {
// Remove from state BEFORE disk removal so pollers immediately stop targeting this worktree. // Remove from state BEFORE disk removal so pollers immediately stop targeting this worktree.
this.statsPoller.skipWorktree(worktreeId) this.statsPoller.skipWorktree(worktreeId)
this.prBridge.remove(worktreeId) this.prBridge.remove(worktreeId)
this.run.remove(worktreeId)
const orphaned = state.removeWorktree(worktreeId) const orphaned = state.removeWorktree(worktreeId)
if (this.diffs.shouldStopForWorktree(worktree.path, orphaned)) { if (this.diffs.shouldStopForWorktree(worktree.path, orphaned)) {
this.diffs.stop() this.diffs.stop()
@@ -1230,6 +1246,7 @@ export class AgentManagerProvider implements Disposable {
if (!state) return if (!state) return
const worktrees = state.getWorktrees() const worktrees = state.getWorktrees()
const staleWorktreeIds = this.staleWorktreesForState(worktrees) const staleWorktreeIds = this.staleWorktreesForState(worktrees)
const run = this.run.state()
this.postToWebview({ this.postToWebview({
type: "agentManager.state", type: "agentManager.state",
worktrees, worktrees,
@@ -1242,6 +1259,7 @@ export class AgentManagerProvider implements Disposable {
reviewDiffStyle: state.getReviewDiffStyle(), reviewDiffStyle: state.getReviewDiffStyle(),
isGitRepo: true, isGitRepo: true,
defaultBaseBranch: state.getDefaultBaseBranch(), defaultBaseBranch: state.getDefaultBaseBranch(),
...run,
}) })
this.statsPoller.setEnabled(worktrees.length > 0 || this.panel !== undefined) this.statsPoller.setEnabled(worktrees.length > 0 || this.panel !== undefined)
@@ -1258,6 +1276,8 @@ export class AgentManagerProvider implements Disposable {
staleWorktreeIds: [], staleWorktreeIds: [],
reviewDiffStyle: "unified", reviewDiffStyle: "unified",
isGitRepo: false, isGitRepo: false,
runStatuses: [],
runScriptConfigured: false,
}) })
} }
@@ -1436,6 +1456,7 @@ export class AgentManagerProvider implements Disposable {
this.statsPoller.stop() this.statsPoller.stop()
this.gitOps.dispose() this.gitOps.dispose()
this.prBridge.poller.stop() this.prBridge.poller.stop()
this.run.dispose()
this.terminalManager.dispose() this.terminalManager.dispose()
this.panel?.dispose() this.panel?.dispose()
this.outputChannel.dispose() this.outputChannel.dispose()
@@ -59,13 +59,15 @@ export function buildKeybindingMap(
if (kb.command.startsWith(AM_PREFIX)) { if (kb.command.startsWith(AM_PREFIX)) {
bindings[kb.command.slice(AM_PREFIX.length)] = formatKeybinding(raw, mac) bindings[kb.command.slice(AM_PREFIX.length)] = formatKeybinding(raw, mac)
} else if (GLOBAL_KEYBINDINGS[kb.command]) { continue
bindings[GLOBAL_KEYBINDINGS[kb.command]] = formatKeybinding(raw, mac)
} }
const name = GLOBAL_KEYBINDINGS[kb.command]
if (name) bindings[name] = formatKeybinding(raw, mac)
} }
// Ensure fallback bindings are always present (may be missing from // Ensure fallback bindings are always present (may be missing from
// cached packageJSON if the extension hasn't been fully reloaded) // cached packageJSON if the extension hasn't been fully reloaded)
if (!bindings.runScript) bindings.runScript = formatKeybinding(mac ? "cmd+e" : "ctrl+e", mac)
if (!bindings.toggleDiff) bindings.toggleDiff = formatKeybinding(mac ? "cmd+d" : "ctrl+d", mac) if (!bindings.toggleDiff) bindings.toggleDiff = formatKeybinding(mac ? "cmd+d" : "ctrl+d", mac)
if (!bindings.showShortcuts) bindings.showShortcuts = formatKeybinding(mac ? "cmd+shift+/" : "ctrl+shift+/", mac) if (!bindings.showShortcuts) bindings.showShortcuts = formatKeybinding(mac ? "cmd+shift+/" : "ctrl+shift+/", mac)
@@ -0,0 +1,138 @@
import * as fs from "node:fs"
import * as path from "node:path"
import { getShellEnvironment } from "../shell-env"
import { RunScriptManager, type RunHandle, type RunStatus } from "./manager"
import { RunScriptService } from "./service"
import type { WorktreeStateManager } from "../WorktreeStateManager"
export interface RunTaskConfig {
worktreeId: string
branch: string
command: string
args: string[]
cwd: string
env: Record<string, string>
}
interface TaskExit {
exitCode?: number
}
type StartTask = (config: RunTaskConfig, done: (exit: TaskExit) => void) => Promise<RunHandle>
interface Options {
root: () => string | undefined
state: () => WorktreeStateManager | undefined
open: (path: string) => Promise<void>
start: StartTask
post: (status: RunStatus) => void
error: (msg: string) => void
log: (msg: string) => void
refresh?: () => void
env?: () => Promise<Record<string, string>>
}
export class RunController {
private service: RunScriptService | undefined
private serviceRoot: string | undefined
private readonly manager: RunScriptManager
constructor(private readonly opts: Options) {
this.manager = new RunScriptManager(opts.log, opts.post)
}
state(): { runStatuses: RunStatus[]; runScriptConfigured: boolean; runScriptPath?: string } {
const service = this.getService()
const script = service?.resolveScript()
return {
runStatuses: this.manager.all(),
runScriptConfigured: !!script,
runScriptPath: script?.path,
}
}
async configure(): Promise<void> {
const service = this.getService()
if (!service) return
if (!service.hasScript()) await service.createDefaultScript()
const script = service.resolveScript()
await this.opts.open(script?.path ?? service.getScriptPath())
this.opts.refresh?.()
}
async run(worktreeId: string): Promise<void> {
const status = this.manager.status(worktreeId)
if (status.state !== "idle") {
this.stop(worktreeId)
return
}
const root = this.opts.root()
const service = this.getService()
if (!root || !service) return
// Resolve cwd and branch: "local" runs from repo root, worktrees from their path
const local = worktreeId === "local"
const state = this.opts.state()
const worktree = local ? undefined : state?.getWorktree(worktreeId)
if (!local && !worktree) {
this.opts.error("Worktree not found")
return
}
const cwd = local ? root : worktree!.path
if (!cwd || !path.isAbsolute(cwd)) {
this.opts.error("Invalid working directory")
return
}
try {
if (!fs.statSync(cwd).isDirectory()) {
this.opts.error("Working directory is not a directory")
return
}
} catch {
this.opts.error("Working directory does not exist")
return
}
const script = service.resolveTask()
if (!script) {
await this.configure()
return
}
const branch = local ? "local" : worktree!.branch
const env = {
...(await (this.opts.env ?? getShellEnvironment)()),
WORKTREE_PATH: cwd,
REPO_PATH: root,
}
const start = () =>
this.opts.start({ worktreeId, branch, command: script.command, args: script.args, cwd, env }, (exit) =>
this.manager.finish(worktreeId, { exitCode: exit.exitCode }),
)
await this.manager.start(worktreeId, start)
}
stop(worktreeId: string): void {
this.manager.stop(worktreeId)
}
remove(worktreeId: string): void {
this.manager.remove(worktreeId)
}
dispose(): void {
this.manager.dispose()
}
private getService(): RunScriptService | undefined {
const root = this.opts.root()
if (!root) return undefined
if (this.service && this.serviceRoot === root) return this.service
this.serviceRoot = root
this.service = new RunScriptService(root)
return this.service
}
}
@@ -0,0 +1,138 @@
export type RunState = "idle" | "running" | "stopping"
export interface RunStatus {
worktreeId: string
state: RunState
exitCode?: number
signal?: string
startedAt?: string
finishedAt?: string
error?: string
}
export interface RunHandle {
stop(): void
dispose?(): void
}
interface Entry {
status: RunStatus
handle?: RunHandle
}
interface FinishOptions {
exitCode?: number
signal?: string
error?: string
}
function message(error: unknown): string {
if (error instanceof Error) return error.message
return String(error)
}
export class RunScriptManager {
private entries = new Map<string, Entry>()
private removed = new Set<string>()
constructor(
private readonly log: (msg: string) => void,
private readonly emit: (status: RunStatus) => void,
private readonly now: () => Date = () => new Date(),
) {}
async start(worktreeId: string, start: () => Promise<RunHandle>): Promise<boolean> {
const current = this.entries.get(worktreeId)
if (current && current.status.state !== "idle") return false
const entry: Entry = {
status: {
worktreeId,
state: "running",
startedAt: this.now().toISOString(),
},
}
this.entries.set(worktreeId, entry)
this.emit(entry.status)
try {
const handle = await start()
const latest = this.entries.get(worktreeId)
if (latest !== entry) {
handle.dispose?.()
return true
}
entry.handle = handle
if (entry.status.state === "stopping") handle.stop()
} catch (error) {
this.finish(worktreeId, { error: message(error) })
}
return true
}
stop(worktreeId: string): void {
const entry = this.entries.get(worktreeId)
if (!entry || entry.status.state === "idle" || entry.status.state === "stopping") return
entry.status = {
...entry.status,
state: "stopping",
}
this.emit(entry.status)
if (!entry.handle) return
try {
entry.handle.stop()
} catch (error) {
this.log(`Failed to stop run script for ${worktreeId}: ${message(error)}`)
}
}
finish(worktreeId: string, opts: FinishOptions = {}): void {
if (this.removed.has(worktreeId)) return
const entry = this.entries.get(worktreeId)
entry?.handle?.dispose?.()
const status: RunStatus = {
worktreeId,
state: "idle",
finishedAt: this.now().toISOString(),
}
if (entry?.status.startedAt) status.startedAt = entry.status.startedAt
if (opts.exitCode !== undefined) status.exitCode = opts.exitCode
if (opts.signal) status.signal = opts.signal
if (opts.error) status.error = opts.error
this.entries.set(worktreeId, { status })
this.emit(status)
}
status(worktreeId: string): RunStatus {
return this.entries.get(worktreeId)?.status ?? { worktreeId, state: "idle" }
}
all(): RunStatus[] {
return [...this.entries.values()].map((entry) => entry.status)
}
remove(worktreeId: string): void {
const entry = this.entries.get(worktreeId)
if (entry?.status.state !== "idle") this.stop(worktreeId)
this.entries.delete(worktreeId)
this.removed.add(worktreeId)
}
dispose(): void {
for (const entry of this.entries.values()) {
if (entry.status.state !== "idle") {
try {
entry.handle?.stop()
} catch (error) {
this.log(`Failed to stop run script during dispose: ${message(error)}`)
}
}
entry.handle?.dispose?.()
}
this.entries.clear()
}
}
@@ -0,0 +1,18 @@
import type { AgentManagerInMessage } from "../types"
import type { RunController } from "./controller"
export function handleRunMessage(run: RunController, msg: AgentManagerInMessage): boolean {
if (msg.type === "agentManager.configureRunScript") {
void run.configure()
return true
}
if (msg.type === "agentManager.runScript") {
void run.run(msg.worktreeId)
return true
}
if (msg.type === "agentManager.stopRunScript") {
run.stop(msg.worktreeId)
return true
}
return false
}
@@ -0,0 +1,170 @@
import * as fs from "node:fs"
import * as path from "node:path"
import { KILO_DIR } from "../constants"
const RUN_SCRIPT_FILENAME = "run-script"
const RUN_SCRIPT_SHELL_FILENAME = "run-script.sh"
const RUN_SCRIPT_POWERSHELL_FILENAME = "run-script.ps1"
const RUN_SCRIPT_CMD_FILENAME = "run-script.cmd"
const RUN_SCRIPT_BAT_FILENAME = "run-script.bat"
/** Only these filenames are valid run-script names. Prevents directory traversal. */
const ALLOWED = new Set([
RUN_SCRIPT_FILENAME,
RUN_SCRIPT_SHELL_FILENAME,
RUN_SCRIPT_POWERSHELL_FILENAME,
RUN_SCRIPT_CMD_FILENAME,
RUN_SCRIPT_BAT_FILENAME,
])
const TEMPLATE = `#!/bin/sh
# Run script for Agent Manager.
# Runs in the selected worktree (or repo root for local).
# Add the commands to start your project:
# npm run dev
# bun run dev
# cargo run
# python manage.py runserver
`
const TEMPLATE_POWERSHELL = `# Run script for Agent Manager.
# Runs in the selected worktree (or repo root for local).
# Add the commands to start your project:
# npm run dev
# bun run dev
# cargo run
# python manage.py runserver
`
export type RunScriptKind = "posix" | "powershell" | "cmd"
type DefaultKind = Exclude<RunScriptKind, "cmd">
export interface RunScriptInfo {
path: string
kind: RunScriptKind
}
export interface RunScript extends RunScriptInfo {
command: string
args: string[]
}
interface Candidate {
name: string
kind: RunScriptKind
}
interface DefaultCandidate {
name: string
kind: DefaultKind
}
/**
* Validate that a resolved script file is safe to execute:
* - Real path must resolve to a regular file (not a directory, device, etc.)
* - If the entry is a symlink, the resolved target must live inside the .kilo directory
*/
function validated(file: string, dir: string): boolean {
try {
const lstat = fs.lstatSync(file)
if (lstat.isSymbolicLink()) {
const real = fs.realpathSync(file)
const expected = fs.realpathSync(dir)
if (!real.startsWith(expected + path.sep)) return false
const target = fs.statSync(real)
return target.isFile()
}
return lstat.isFile()
} catch {
return false
}
}
export function buildRunTaskCommand(script: RunScriptInfo): { command: string; args: string[] } {
if (script.kind === "powershell") {
return {
command: "powershell.exe",
args: ["-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", script.path],
}
}
if (script.kind === "cmd") {
// Use -File semantics via cmd /c with the path as a single argument.
// The path is double-quoted; cmd.exe treats the first and last quotes
// as delimiters when /s is used, executing the inner string literally.
return {
command: "cmd.exe",
args: ["/d", "/s", "/c", `"${script.path}"`],
}
}
return {
command: "sh",
args: [script.path],
}
}
export class RunScriptService {
private readonly dir: string
constructor(root: string) {
this.dir = path.join(root, KILO_DIR)
}
resolveScript(platform: NodeJS.Platform = process.platform): RunScriptInfo | undefined {
for (const candidate of this.candidates(platform)) {
if (!ALLOWED.has(candidate.name)) continue
const file = path.join(this.dir, candidate.name)
if (!validated(file, this.dir)) continue
return { path: file, kind: candidate.kind }
}
return undefined
}
resolveTask(platform: NodeJS.Platform = process.platform): RunScript | undefined {
const script = this.resolveScript(platform)
if (!script) return undefined
const cmd = buildRunTaskCommand(script)
return { ...script, command: cmd.command, args: cmd.args }
}
getScriptPath(platform: NodeJS.Platform = process.platform): string {
return this.resolveScript(platform)?.path ?? path.join(this.dir, this.defaultCandidate(platform).name)
}
hasScript(platform: NodeJS.Platform = process.platform): boolean {
return this.resolveScript(platform) !== undefined
}
async createDefaultScript(platform: NodeJS.Platform = process.platform): Promise<void> {
if (!fs.existsSync(this.dir)) await fs.promises.mkdir(this.dir, { recursive: true })
const script = this.defaultCandidate(platform)
const file = path.join(this.dir, script.name)
if (fs.existsSync(file)) return
await fs.promises.writeFile(file, this.template(script.kind), { encoding: "utf-8", mode: 0o644 })
}
private candidates(platform: NodeJS.Platform): Candidate[] {
if (platform === "win32") {
return [
{ name: RUN_SCRIPT_POWERSHELL_FILENAME, kind: "powershell" },
{ name: RUN_SCRIPT_CMD_FILENAME, kind: "cmd" },
{ name: RUN_SCRIPT_BAT_FILENAME, kind: "cmd" },
]
}
return [
{ name: RUN_SCRIPT_FILENAME, kind: "posix" },
{ name: RUN_SCRIPT_SHELL_FILENAME, kind: "posix" },
]
}
private defaultCandidate(platform: NodeJS.Platform): DefaultCandidate {
if (platform === "win32") return { name: RUN_SCRIPT_POWERSHELL_FILENAME, kind: "powershell" }
return { name: RUN_SCRIPT_FILENAME, kind: "posix" }
}
private template(kind: DefaultKind): string {
if (kind === "powershell") return TEMPLATE_POWERSHELL
return TEMPLATE
}
}
@@ -0,0 +1,73 @@
import * as vscode from "vscode"
import type { RunHandle } from "./manager"
const GRACE_MS = 250
export interface RunTaskConfig {
worktreeId: string
branch: string
command: string
args: string[]
cwd: string
env: Record<string, string>
}
export interface RunTaskExit {
exitCode?: number
}
export async function startVscodeRunTask(config: RunTaskConfig, done: (exit: RunTaskExit) => void): Promise<RunHandle> {
const proc = new vscode.ProcessExecution(config.command, config.args, {
cwd: config.cwd,
env: config.env,
})
const task = new vscode.Task(
{ type: "kilo-worktree-run" },
vscode.TaskScope.Workspace,
`Run: ${config.branch}`,
"Kilo Code",
proc,
[],
)
task.presentationOptions = {
reveal: vscode.TaskRevealKind.Always,
panel: vscode.TaskPanelKind.Dedicated,
clear: true,
showReuseMessage: false,
}
const execution = await vscode.tasks.executeTask(task)
let closed = false
let cleaned = false
let grace: ReturnType<typeof setTimeout> | undefined
const cleanup = () => {
if (cleaned) return
cleaned = true
processListener.dispose()
endListener.dispose()
if (grace) clearTimeout(grace)
}
const finish = (exit: RunTaskExit = {}) => {
if (closed) return
closed = true
cleanup()
done(exit)
}
const processListener = vscode.tasks.onDidEndTaskProcess((event) => {
if (event.execution !== execution) return
finish({ exitCode: event.exitCode ?? undefined })
})
const endListener = vscode.tasks.onDidEndTask((event) => {
if (event.execution !== execution || closed) return
grace = setTimeout(() => finish(), GRACE_MS)
})
return {
stop: () => execution.terminate(),
dispose: cleanup,
}
}
@@ -13,6 +13,7 @@ import type { WorktreeStats, LocalStats } from "./GitStatsPoller"
import type { ApplyConflict } from "./GitOps" import type { ApplyConflict } from "./GitOps"
import type { BranchListItem, WorktreeSetupErrorCode } from "./git-import" import type { BranchListItem, WorktreeSetupErrorCode } from "./git-import"
import type { ExternalWorktreeItem } from "./WorktreeManager" import type { ExternalWorktreeItem } from "./WorktreeManager"
import type { RunStatus } from "./run/manager"
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Shared payload types // Shared payload types
@@ -126,6 +127,9 @@ interface StateMessage {
reviewDiffStyle?: "unified" | "split" reviewDiffStyle?: "unified" | "split"
isGitRepo?: boolean isGitRepo?: boolean
defaultBaseBranch?: string defaultBaseBranch?: string
runStatuses?: RunStatus[]
runScriptConfigured?: boolean
runScriptPath?: string
} }
interface ErrorOutMessage { interface ErrorOutMessage {
@@ -249,6 +253,10 @@ interface ActionOutMessage {
action: string action: string
} }
interface RunStatusMessage extends RunStatus {
type: "agentManager.runStatus"
}
/** All messages the Agent Manager extension sends to the webview. */ /** All messages the Agent Manager extension sends to the webview. */
export type AgentManagerOutMessage = export type AgentManagerOutMessage =
| WorktreeStatsMessage | WorktreeStatsMessage
@@ -274,6 +282,7 @@ export type AgentManagerOutMessage =
| RevertWorktreeFileResultMessage | RevertWorktreeFileResultMessage
| PRStatusOutMessage | PRStatusOutMessage
| ActionOutMessage | ActionOutMessage
| RunStatusMessage
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Webview → Extension messages (onMessage) // Webview → Extension messages (onMessage)
@@ -331,6 +340,20 @@ interface ConfigureSetupScriptIn {
type: "agentManager.configureSetupScript" type: "agentManager.configureSetupScript"
} }
interface ConfigureRunScriptIn {
type: "agentManager.configureRunScript"
}
interface RunScriptIn {
type: "agentManager.runScript"
worktreeId: string
}
interface StopRunScriptIn {
type: "agentManager.stopRunScript"
worktreeId: string
}
interface ShowTerminalIn { interface ShowTerminalIn {
type: "agentManager.showTerminal" type: "agentManager.showTerminal"
sessionId: string sessionId: string
@@ -612,6 +635,9 @@ export type AgentManagerInMessage =
| ForgetSessionIn | ForgetSessionIn
| ForkSessionIn | ForkSessionIn
| ConfigureSetupScriptIn | ConfigureSetupScriptIn
| ConfigureRunScriptIn
| RunScriptIn
| StopRunScriptIn
| ShowTerminalIn | ShowTerminalIn
| ShowLocalTerminalIn | ShowLocalTerminalIn
| OpenWorktreeIn | OpenWorktreeIn
+7 -2
View File
@@ -86,11 +86,13 @@ export function activate(context: vscode.ExtensionContext) {
}), }),
) )
// Ensure Agent Manager keybindings work when a VS Code terminal has focus. // Ensure Agent Manager navigation keybindings work when a VS Code terminal has focus.
// The terminal intercepts all keystrokes unless the command is listed in // The terminal intercepts all keystrokes unless the command is listed in
// terminal.integrated.commandsToSkipShell, which only contains built-in // terminal.integrated.commandsToSkipShell, which only contains built-in
// commands by default. // commands by default.
ensureCommandsSkipShell(["kilo-code.new.agentManagerOpen", "kilo-code.new.agentManager.showTerminal"]) const skip = ["kilo-code.new.agentManagerOpen", "kilo-code.new.agentManager.showTerminal"]
if (process.platform === "darwin") skip.push("kilo-code.new.agentManager.runScript")
ensureCommandsSkipShell(skip)
// Create Agent Manager provider for editor panel // Create Agent Manager provider for editor panel
const agentManagerHost = new VscodeHost(context.extensionUri, connectionService, context) const agentManagerHost = new VscodeHost(context.extensionUri, connectionService, context)
@@ -281,6 +283,9 @@ export function activate(context: vscode.ExtensionContext) {
vscode.commands.registerCommand("kilo-code.new.agentManager.showTerminal", () => { vscode.commands.registerCommand("kilo-code.new.agentManager.showTerminal", () => {
agentManagerProvider.showTerminalForCurrentSession() agentManagerProvider.showTerminalForCurrentSession()
}), }),
vscode.commands.registerCommand("kilo-code.new.agentManager.runScript", () => {
agentManagerProvider.postMessage({ type: "action", action: "runScript" })
}),
vscode.commands.registerCommand("kilo-code.new.agentManager.toggleDiff", () => { vscode.commands.registerCommand("kilo-code.new.agentManager.toggleDiff", () => {
agentManagerProvider.postMessage({ type: "action", action: "toggleDiff" }) agentManagerProvider.postMessage({ type: "action", action: "toggleDiff" })
}), }),
@@ -0,0 +1,8 @@
import type { KiloClient } from "@kilocode/sdk/v2/client"
export async function hasGit(client: KiloClient, directory: string): Promise<boolean> {
return client.project
.current({ directory })
.then((r) => r.data?.vcs === "git")
.catch(() => false)
}
@@ -54,12 +54,7 @@ export class AutocompleteModel {
throw new Error("Connection service is not available") throw new Error("Connection service is not available")
} }
const state = this.connectionService.getConnectionState() const client = await this.connectionService.getClientAsync()
if (state !== "connected") {
throw new Error(`CLI backend is not connected (state: ${state})`)
}
const client = this.connectionService.getClient()
let cost = 0 let cost = 0
let inputTokens = 0 let inputTokens = 0
@@ -146,13 +141,13 @@ export class AutocompleteModel {
* Returns false on any error (not connected, fetch failed, etc.). * Returns false on any error (not connected, fetch failed, etc.).
*/ */
public async hasBalance(): Promise<boolean> { public async hasBalance(): Promise<boolean> {
if (!this.connectionService || this.connectionService.getConnectionState() !== "connected") { if (!this.connectionService) return false
try {
const client = await this.connectionService.getClientAsync()
const result = await client.kilo.profile().catch(() => null)
return (result?.data?.balance?.balance ?? 0) > 0
} catch {
return false return false
} }
const result = await this.connectionService
.getClient()
.kilo.profile()
.catch(() => null)
return (result?.data?.balance?.balance ?? 0) > 0
} }
} }
@@ -1,20 +1,30 @@
import { describe, it, expect, vi } from "vitest" import { describe, it, expect, vi, beforeEach } from "vitest"
import { AutocompleteModel } from "../AutocompleteModel" import { AutocompleteModel } from "../AutocompleteModel"
import type { KiloConnectionService } from "../../cli-backend" import type { KiloConnectionService } from "../../cli-backend"
const mockClient = {
kilo: {
fim: vi.fn(),
},
}
function createMockConnectionService(state: "connecting" | "connected" | "disconnected" | "error" = "connected") { function createMockConnectionService(state: "connecting" | "connected" | "disconnected" | "error" = "connected") {
return { return {
getConnectionState: vi.fn().mockReturnValue(state), getConnectionState: vi.fn().mockReturnValue(state),
getClient: vi.fn().mockReturnValue({ getClient: vi.fn().mockReturnValue(mockClient),
kilo: { getClientAsync:
fim: vi.fn(), state === "connected"
}, ? vi.fn().mockResolvedValue(mockClient)
}), : vi.fn().mockRejectedValue(new Error(`CLI backend is not connected (state: ${state})`)),
onStateChange: vi.fn().mockReturnValue(() => {}), onStateChange: vi.fn().mockReturnValue(() => {}),
} as unknown as KiloConnectionService } as unknown as KiloConnectionService
} }
describe("AutocompleteModel", () => { describe("AutocompleteModel", () => {
beforeEach(() => {
mockClient.kilo.fim.mockReset()
})
describe("constructor", () => { describe("constructor", () => {
it("defaults profileName and profileType to null", () => { it("defaults profileName and profileType to null", () => {
const model = new AutocompleteModel() const model = new AutocompleteModel()
@@ -98,7 +108,7 @@ describe("AutocompleteModel", () => {
const connection = createMockConnectionService("disconnected") const connection = createMockConnectionService("disconnected")
const model = new AutocompleteModel(connection) const model = new AutocompleteModel(connection)
await expect(model.generateFimResponse("prefix", "suffix", vi.fn())).rejects.toThrow( await expect(model.generateFimResponse("prefix", "suffix", vi.fn())).rejects.toThrow(
"CLI backend is not connected (state: disconnected)", "CLI backend is not connected",
) )
}) })
@@ -113,8 +123,7 @@ describe("AutocompleteModel", () => {
] ]
const connection = createMockConnectionService("connected") const connection = createMockConnectionService("connected")
const client = (connection as any).getClient() mockClient.kilo.fim.mockResolvedValue({
client.kilo.fim.mockResolvedValue({
stream: (async function* () { stream: (async function* () {
for (const chunk of chunks) yield chunk for (const chunk of chunks) yield chunk
})(), })(),
@@ -136,8 +145,7 @@ describe("AutocompleteModel", () => {
it("passes model parameters to fim call", async () => { it("passes model parameters to fim call", async () => {
const connection = createMockConnectionService("connected") const connection = createMockConnectionService("connected")
const client = (connection as any).getClient() mockClient.kilo.fim.mockResolvedValue({
client.kilo.fim.mockResolvedValue({
stream: (async function* () {})(), stream: (async function* () {})(),
}) })
@@ -145,7 +153,7 @@ describe("AutocompleteModel", () => {
const signal = new AbortController().signal const signal = new AbortController().signal
await model.generateFimResponse("pre", "suf", vi.fn(), signal) await model.generateFimResponse("pre", "suf", vi.fn(), signal)
expect(client.kilo.fim).toHaveBeenCalledWith( expect(mockClient.kilo.fim).toHaveBeenCalledWith(
{ {
prefix: "pre", prefix: "pre",
suffix: "suf", suffix: "suf",
@@ -153,7 +161,7 @@ describe("AutocompleteModel", () => {
maxTokens: 256, maxTokens: 256,
temperature: 0.2, temperature: 0.2,
}, },
{ signal }, expect.objectContaining({ signal }),
) )
}) })
}) })
@@ -121,6 +121,20 @@ export class KiloConnectionService {
return this.client return this.client
} }
/**
* Get the shared SDK client, auto-connecting if not yet started.
* Accepts an optional directory to use as the workspace root; falls back
* to the first VS Code workspace folder. Throws if neither is available
* or if the connection fails.
*/
async getClientAsync(dir?: string): Promise<KiloClient> {
if (this.client) return this.client
const root = dir ?? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath
if (!root) throw new Error("No workspace folder open")
await this.connect(root)
return this.client!
}
/** /**
* Get server info (port). Returns null if not connected. * Get server info (port). Returns null if not connected.
*/ */
@@ -54,7 +54,7 @@ describe("commit-message service", () => {
} }
mockConnectionService = { mockConnectionService = {
getClient: vi.fn().mockReturnValue(mockClient), getClientAsync: vi.fn().mockResolvedValue(mockClient),
} as any } as any
}) })
@@ -115,7 +115,7 @@ describe("commit-message service", () => {
expect(vscode.window.showErrorMessage).toHaveBeenCalledWith("No Git repository found") expect(vscode.window.showErrorMessage).toHaveBeenCalledWith("No Git repository found")
}) })
it("shows error when backend is not connected", async () => { it("shows error when backend fails to connect", async () => {
;(vscode.extensions.getExtension as Mock).mockReturnValue({ ;(vscode.extensions.getExtension as Mock).mockReturnValue({
isActive: true, isActive: true,
activate: vi.fn().mockResolvedValue(undefined), activate: vi.fn().mockResolvedValue(undefined),
@@ -125,17 +125,38 @@ describe("commit-message service", () => {
}), }),
}, },
}) })
;(mockConnectionService.getClient as Mock).mockImplementation(() => { ;(mockConnectionService.getClientAsync as Mock).mockRejectedValue(new Error("Connect failed"))
throw new Error("Not connected")
})
await commandCallback() await commandCallback()
expect(vscode.window.showErrorMessage).toHaveBeenCalledWith( expect(vscode.window.showErrorMessage).toHaveBeenCalledWith(
"Kilo backend is not connected. Please wait for the connection to establish.", "Failed to connect to Kilo backend. Please try again.",
) )
}) })
it("auto-connects backend and generates message when client not yet ready", async () => {
const mockInputBox = { value: "" }
;(vscode.extensions.getExtension as Mock).mockReturnValue({
isActive: true,
activate: vi.fn().mockResolvedValue(undefined),
exports: {
getAPI: () => ({
repositories: [{ inputBox: mockInputBox, rootUri: { fsPath: "/auto-connect-repo" } }],
}),
},
})
const mockToken = { onCancellationRequested: vi.fn() }
;(vscode.window.withProgress as Mock).mockImplementation(async (_options: any, task: any) => {
await task({}, mockToken)
})
await commandCallback()
expect(mockConnectionService.getClientAsync).toHaveBeenCalled()
expect(mockInputBox.value).toBe("feat: add new feature")
})
it("calls commitMessage.generate on the SDK client with repository root path", async () => { it("calls commitMessage.generate on the SDK client with repository root path", async () => {
const mockInputBox = { value: "" } const mockInputBox = { value: "" }
;(vscode.extensions.getExtension as Mock).mockReturnValue({ ;(vscode.extensions.getExtension as Mock).mockReturnValue({
@@ -229,7 +250,7 @@ describe("commit-message service", () => {
} as any) } as any)
vi.mocked(vscode.window.withProgress).mockImplementation(async (_options, task) => { vi.mocked(vscode.window.withProgress).mockImplementation(async (_options, task) => {
await task({} as any, {} as any) await task({} as any, { onCancellationRequested: vi.fn() } as any)
}) })
// Simulate SCM title/input passing the SourceControl for the worktree repo // Simulate SCM title/input passing the SourceControl for the worktree repo
@@ -254,7 +275,7 @@ describe("commit-message service", () => {
} as any) } as any)
vi.mocked(vscode.window.withProgress).mockImplementation(async (_options, task) => { vi.mocked(vscode.window.withProgress).mockImplementation(async (_options, task) => {
await task({} as any, {} as any) await task({} as any, { onCancellationRequested: vi.fn() } as any)
}) })
const scmArg = { rootUri: { fsPath: "/nonexistent-repo" } } as vscode.SourceControl const scmArg = { rootUri: { fsPath: "/nonexistent-repo" } } as vscode.SourceControl
@@ -1,5 +1,4 @@
import * as vscode from "vscode" import * as vscode from "vscode"
import type { KiloClient } from "@kilocode/sdk/v2/client"
import type { KiloConnectionService } from "../cli-backend/connection-service" import type { KiloConnectionService } from "../cli-backend/connection-service"
import { getErrorMessage } from "../../kilo-provider-utils" import { getErrorMessage } from "../../kilo-provider-utils"
@@ -53,21 +52,17 @@ export function registerCommitMessageService(
return return
} }
let client: KiloClient | undefined
try {
client = connectionService.getClient()
} catch (err) {
console.error("[Kilo New] Failed to get client:", err)
vscode.window.showErrorMessage("Kilo backend is not connected. Please wait for the connection to establish.")
return
}
if (!client) {
vscode.window.showErrorMessage("Kilo backend is not connected. Please wait for the connection to establish.")
return
}
const path = repository.rootUri.fsPath const path = repository.rootUri.fsPath
let client
try {
client = await connectionService.getClientAsync(path)
} catch (err) {
console.error("[Kilo New] Failed to connect to Kilo backend:", err)
vscode.window.showErrorMessage("Failed to connect to Kilo backend. Please try again.")
return
}
const previousMessage = lastWorkspacePath === path ? lastGeneratedMessage : undefined const previousMessage = lastWorkspacePath === path ? lastGeneratedMessage : undefined
const controller = new AbortController() const controller = new AbortController()
@@ -39,6 +39,7 @@ const PROVIDER_FILE = path.join(ROOT, "src/agent-manager/AgentManagerProvider.ts
const DIFF_CONTROLLER_FILE = path.join(ROOT, "src/agent-manager/worktree-diff-controller.ts") const DIFF_CONTROLLER_FILE = path.join(ROOT, "src/agent-manager/worktree-diff-controller.ts")
const IMPORTER_FILE = path.join(ROOT, "src/agent-manager/worktree-importer.ts") const IMPORTER_FILE = path.join(ROOT, "src/agent-manager/worktree-importer.ts")
const SETUP_SCRIPT_RUNNER_FILE = path.join(ROOT, "src/agent-manager/SetupScriptRunner.ts") const SETUP_SCRIPT_RUNNER_FILE = path.join(ROOT, "src/agent-manager/SetupScriptRunner.ts")
const RUN_MESSAGE_FILE = path.join(ROOT, "src/agent-manager/run/message.ts")
function readAllCss(): string { function readAllCss(): string {
return CSS_FILES.map((f) => fs.readFileSync(f, "utf-8")).join("\n") return CSS_FILES.map((f) => fs.readFileSync(f, "utf-8")).join("\n")
@@ -185,7 +186,7 @@ describe("Agent Manager Provider — onMessage routing", () => {
// -- onMessage dispatches all expected message types ----------------------- // -- onMessage dispatches all expected message types -----------------------
it("provider routing handles all documented agentManager.* message types", () => { it("provider routing handles all documented agentManager.* message types", () => {
const text = provider() const text = provider() + fs.readFileSync(RUN_MESSAGE_FILE, "utf-8")
const expected = [ const expected = [
"agentManager.createWorktree", "agentManager.createWorktree",
"agentManager.deleteWorktree", "agentManager.deleteWorktree",
@@ -196,6 +197,9 @@ describe("Agent Manager Provider — onMessage routing", () => {
"agentManager.persistSession", "agentManager.persistSession",
"agentManager.forgetSession", "agentManager.forgetSession",
"agentManager.configureSetupScript", "agentManager.configureSetupScript",
"agentManager.configureRunScript",
"agentManager.runScript",
"agentManager.stopRunScript",
"agentManager.showTerminal", "agentManager.showTerminal",
"agentManager.showLocalTerminal", "agentManager.showLocalTerminal",
"agentManager.showExistingLocalTerminal", "agentManager.showExistingLocalTerminal",
@@ -557,6 +561,9 @@ const VSCODE_ALLOWED: Record<string, { note: string }> = {
"task-runner.ts": { "task-runner.ts": {
note: "vscode adapter for SetupScriptRunner", note: "vscode adapter for SetupScriptRunner",
}, },
"run/task.ts": {
note: "vscode adapter for Agent Manager run scripts",
},
} }
/** /**
@@ -0,0 +1,145 @@
import { describe, it, expect } from "bun:test"
import { RunScriptManager, type RunHandle, type RunStatus } from "../../src/agent-manager/run/manager"
function createManager() {
const logs: string[] = []
const statuses: RunStatus[] = []
const manager = new RunScriptManager(
(msg) => logs.push(msg),
(status) => statuses.push({ ...status }),
() => new Date("2026-01-02T03:04:05.000Z"),
)
return { manager, logs, statuses }
}
function deferred<T>() {
const out = {} as { promise: Promise<T>; resolve: (value: T) => void; reject: (error: unknown) => void }
out.promise = new Promise<T>((resolve, reject) => {
out.resolve = resolve
out.reject = reject
})
return out
}
describe("RunScriptManager", () => {
it("transitions from idle to running and back to idle on finish", async () => {
const ctx = createManager()
const handle: RunHandle = { stop: () => {} }
expect(await ctx.manager.start("wt-1", async () => handle)).toBe(true)
ctx.manager.finish("wt-1", { exitCode: 0 })
expect(ctx.statuses.map((s) => s.state)).toEqual(["running", "idle"])
expect(ctx.manager.status("wt-1")).toMatchObject({ worktreeId: "wt-1", state: "idle", exitCode: 0 })
})
it("rejects duplicate starts while a run is active", async () => {
const ctx = createManager()
const first = await ctx.manager.start("wt-1", async () => ({ stop: () => {} }))
const second = await ctx.manager.start("wt-1", async () => ({ stop: () => {} }))
expect(first).toBe(true)
expect(second).toBe(false)
expect(ctx.statuses.map((s) => s.state)).toEqual(["running"])
})
it("marks a running task as stopping and invokes the handle", async () => {
const ctx = createManager()
let stopped = 0
await ctx.manager.start("wt-1", async () => ({ stop: () => stopped++ }))
ctx.manager.stop("wt-1")
ctx.manager.stop("wt-1")
expect(stopped).toBe(1)
expect(ctx.manager.status("wt-1").state).toBe("stopping")
expect(ctx.statuses.map((s) => s.state)).toEqual(["running", "stopping"])
})
it("stops the handle when a stop request races task startup", async () => {
const ctx = createManager()
const gate = deferred<RunHandle>()
let stopped = 0
const started = ctx.manager.start("wt-1", () => gate.promise)
ctx.manager.stop("wt-1")
gate.resolve({ stop: () => stopped++ })
await started
expect(stopped).toBe(1)
expect(ctx.statuses.map((s) => s.state)).toEqual(["running", "stopping"])
})
it("records startup errors as idle status", async () => {
const ctx = createManager()
await ctx.manager.start("wt-1", async () => {
throw new Error("task failed")
})
expect(ctx.manager.status("wt-1")).toMatchObject({ state: "idle", error: "task failed" })
expect(ctx.statuses.map((s) => s.state)).toEqual(["running", "idle"])
})
it("removes idle state and disposes active state", async () => {
const ctx = createManager()
let stopped = 0
await ctx.manager.start("wt-1", async () => ({ stop: () => stopped++ }))
ctx.manager.remove("wt-1")
expect(stopped).toBe(1)
expect(ctx.manager.all()).toEqual([])
})
it("disposes all active handles", async () => {
const ctx = createManager()
let stopped = 0
let disposed = 0
await ctx.manager.start("wt-1", async () => ({ stop: () => stopped++, dispose: () => disposed++ }))
ctx.manager.dispose()
expect(stopped).toBe(1)
expect(disposed).toBe(1)
expect(ctx.manager.all()).toEqual([])
})
it("disposes multiple worktrees and skips idle entries", async () => {
const ctx = createManager()
let stopped = 0
await ctx.manager.start("wt-1", async () => ({ stop: () => stopped++ }))
await ctx.manager.start("wt-2", async () => ({ stop: () => stopped++ }))
// wt-3 is started then finished — should be idle and not stopped again
await ctx.manager.start("wt-3", async () => ({ stop: () => stopped++ }))
ctx.manager.finish("wt-3", { exitCode: 0 })
ctx.manager.dispose()
expect(stopped).toBe(2)
expect(ctx.manager.all()).toEqual([])
})
it("finish after remove does not resurrect stale state", async () => {
const ctx = createManager()
await ctx.manager.start("wt-1", async () => ({ stop: () => {} }))
ctx.manager.remove("wt-1")
ctx.manager.finish("wt-1", { exitCode: 0 })
expect(ctx.manager.all()).toEqual([])
})
it("dispose tolerates handles that throw on stop", async () => {
const ctx = createManager()
await ctx.manager.start("wt-1", async () => ({
stop: () => {
throw new Error("stop failed")
},
}))
ctx.manager.dispose()
expect(ctx.manager.all()).toEqual([])
expect(ctx.logs.some((m) => m.includes("stop failed"))).toBe(true)
})
})
@@ -0,0 +1,97 @@
import { describe, it, expect, beforeEach, afterEach } from "bun:test"
import * as fs from "node:fs"
import * as os from "node:os"
import * as path from "node:path"
import { buildRunTaskCommand, RunScriptService } from "../../src/agent-manager/run/service"
function tmpdir(): string {
return fs.mkdtempSync(path.join(os.tmpdir(), "run-script-service-test-"))
}
describe("RunScriptService", () => {
let root: string
let dir: string
beforeEach(() => {
root = tmpdir()
dir = path.join(root, ".kilo")
fs.mkdirSync(dir)
})
afterEach(() => {
fs.rmSync(root, { recursive: true, force: true })
})
it("resolves posix run-script before run-script.sh", () => {
const bare = path.join(dir, "run-script")
fs.writeFileSync(bare, "bun test")
fs.writeFileSync(path.join(dir, "run-script.sh"), "npm test")
expect(new RunScriptService(root).resolveScript("darwin")).toEqual({ path: bare, kind: "posix" })
})
it("resolves Windows scripts by PowerShell, CMD, then BAT priority", () => {
const ps = path.join(dir, "run-script.ps1")
fs.writeFileSync(ps, "bun test")
fs.writeFileSync(path.join(dir, "run-script.cmd"), "bun test")
fs.writeFileSync(path.join(dir, "run-script.bat"), "bun test")
expect(new RunScriptService(root).resolveScript("win32")).toEqual({ path: ps, kind: "powershell" })
})
it("returns undefined when no platform script exists", () => {
expect(new RunScriptService(root).resolveTask("linux")).toBeUndefined()
})
it("creates a platform default script", async () => {
fs.rmSync(dir, { recursive: true, force: true })
await new RunScriptService(root).createDefaultScript("win32")
const file = path.join(dir, "run-script.ps1")
expect(fs.existsSync(file)).toBe(true)
expect(fs.readFileSync(file, "utf-8")).toContain("bun run dev")
})
it("builds commands for shell, PowerShell, and CMD scripts", () => {
expect(buildRunTaskCommand({ path: "/tmp/run-script", kind: "posix" })).toEqual({
command: "sh",
args: ["/tmp/run-script"],
})
expect(buildRunTaskCommand({ path: "C:\\repo\\.kilo\\run-script.ps1", kind: "powershell" })).toEqual({
command: "powershell.exe",
args: ["-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "C:\\repo\\.kilo\\run-script.ps1"],
})
expect(buildRunTaskCommand({ path: "C:\\repo path\\.kilo\\run-script.cmd", kind: "cmd" })).toEqual({
command: "cmd.exe",
args: ["/d", "/s", "/c", '"C:\\repo path\\.kilo\\run-script.cmd"'],
})
})
it("rejects directories masquerading as run-script", () => {
fs.mkdirSync(path.join(dir, "run-script"))
expect(new RunScriptService(root).resolveScript("darwin")).toBeUndefined()
})
it("rejects symlinks pointing outside the .kilo directory", () => {
const outside = path.join(root, "evil.sh")
fs.writeFileSync(outside, "echo pwned")
fs.symlinkSync(outside, path.join(dir, "run-script"))
expect(new RunScriptService(root).resolveScript("darwin")).toBeUndefined()
})
it("accepts symlinks pointing inside the .kilo directory", () => {
const target = path.join(dir, "real-script")
fs.writeFileSync(target, "bun test")
fs.symlinkSync(target, path.join(dir, "run-script"))
const result = new RunScriptService(root).resolveScript("darwin")
expect(result).toBeDefined()
expect(result!.kind).toBe("posix")
})
it("does not overwrite an existing script on createDefaultScript", async () => {
fs.writeFileSync(path.join(dir, "run-script"), "custom content")
await new RunScriptService(root).createDefaultScript("darwin")
expect(fs.readFileSync(path.join(dir, "run-script"), "utf-8")).toBe("custom content")
})
})
@@ -33,6 +33,7 @@ import type {
WorktreeGitStats, WorktreeGitStats,
LocalGitStats, LocalGitStats,
WorktreeState, WorktreeState,
RunStatus,
PRStatus, PRStatus,
AgentManagerPRStatusMessage, AgentManagerPRStatusMessage,
ManagedSessionState, ManagedSessionState,
@@ -81,7 +82,7 @@ import { NewWorktreeDialog } from "./NewWorktreeDialog"
import { LanguageBridge, DataBridge } from "../src/App" import { LanguageBridge, DataBridge } from "../src/App"
import { useLanguage } from "../src/context/language" import { useLanguage } from "../src/context/language"
import { formatRelativeDate } from "../src/utils/date" import { formatRelativeDate } from "../src/utils/date"
import { validateLocalSession, nextSelectionAfterDelete, adjacentHint, LOCAL } from "./navigate" import { validateLocalSession, nextSelectionAfterDelete, adjacentHint, restoreLocalSessions, LOCAL } from "./navigate"
import { reorderTabs, applyTabOrder, firstOrderedTitle } from "./tab-order" import { reorderTabs, applyTabOrder, firstOrderedTitle } from "./tab-order"
import { ConstrainDragYAxis, SortableReviewTab, SortableTab } from "./sortable-tab" import { ConstrainDragYAxis, SortableReviewTab, SortableTab } from "./sortable-tab"
import { DiffPanel } from "./DiffPanel" import { DiffPanel } from "./DiffPanel"
@@ -98,7 +99,6 @@ import {
buildTopLevelItems, buildTopLevelItems,
buildSidebarOrder, buildSidebarOrder,
buildShortcutMap, buildShortcutMap,
completeSidebarOrder,
isGrouped, isGrouped,
isGroupStart, isGroupStart,
isGroupEnd, isGroupEnd,
@@ -149,6 +149,7 @@ const defaultBindings: Record<string, string> = {
previousTab: isMac ? "⌘⌥←" : "Ctrl+Alt+←", previousTab: isMac ? "⌘⌥←" : "Ctrl+Alt+←",
nextTab: isMac ? "⌘⌥→" : "Ctrl+Alt+→", nextTab: isMac ? "⌘⌥→" : "Ctrl+Alt+→",
showTerminal: isMac ? "⌘/" : "Ctrl+/", showTerminal: isMac ? "⌘/" : "Ctrl+/",
runScript: isMac ? "⌘E" : "Ctrl+E",
toggleDiff: isMac ? "⌘D" : "Ctrl+D", toggleDiff: isMac ? "⌘D" : "Ctrl+D",
showShortcuts: isMac ? "⌘⇧/" : "Ctrl+Shift+/", showShortcuts: isMac ? "⌘⇧/" : "Ctrl+Shift+/",
newTab: isMac ? "⌘T" : "Ctrl+T", newTab: isMac ? "⌘T" : "Ctrl+T",
@@ -288,6 +289,7 @@ function buildShortcutCategories(
title: t("agentManager.shortcuts.category.terminal"), title: t("agentManager.shortcuts.category.terminal"),
shortcuts: [ shortcuts: [
{ label: t("agentManager.shortcuts.toggleTerminal"), binding: bindings.showTerminal ?? "" }, { label: t("agentManager.shortcuts.toggleTerminal"), binding: bindings.showTerminal ?? "" },
{ label: t("agentManager.shortcuts.runScript"), binding: bindings.runScript ?? "" },
{ label: t("agentManager.shortcuts.toggleDiff"), binding: bindings.toggleDiff ?? "" }, { label: t("agentManager.shortcuts.toggleDiff"), binding: bindings.toggleDiff ?? "" },
], ],
}, },
@@ -366,6 +368,9 @@ const AgentManagerContent: Component = () => {
// Per-worktree PR status data // Per-worktree PR status data
const [prStatuses, setPrStatuses] = createSignal<Record<string, PRStatus | null>>({}) const [prStatuses, setPrStatuses] = createSignal<Record<string, PRStatus | null>>({})
const [runStatuses, setRunStatuses] = createSignal<Record<string, RunStatus>>({})
const [runScriptConfigured, setRunScriptConfigured] = createSignal(false)
// Local repo git stats (branch name, diff additions/deletions, commits) // Local repo git stats (branch name, diff additions/deletions, commits)
const [localStats, setLocalStats] = createSignal<LocalGitStats | undefined>() const [localStats, setLocalStats] = createSignal<LocalGitStats | undefined>()
@@ -596,6 +601,22 @@ const AgentManagerContent: Component = () => {
vscode.postMessage({ type: "agentManager.openWorktree", worktreeId: sel }) vscode.postMessage({ type: "agentManager.openWorktree", worktreeId: sel })
} }
const runWorktree = (id: string) => {
const state = runStatuses()[id]?.state ?? "idle"
if (state === "running" || state === "stopping") {
vscode.postMessage({ type: "agentManager.stopRunScript", worktreeId: id })
return
}
vscode.postMessage({ type: "agentManager.runScript", worktreeId: id })
}
const configureRunScript = () => vscode.postMessage({ type: "agentManager.configureRunScript" })
const runSelected = () => {
const sel = selection()
if (sel) runWorktree(sel)
}
createEffect( createEffect(
on( on(
() => [applyTarget(), applyDiffs(), applySelectionTouched()] as const, () => [applyTarget(), applyDiffs(), applySelectionTouched()] as const,
@@ -672,12 +693,16 @@ const AgentManagerContent: Component = () => {
const all = session.sessions() const all = session.sessions()
if (all.length === 0) return // sessions not loaded yet if (all.length === 0) return // sessions not loaded yet
const ids = all.map((s) => s.id) const ids = all.map((s) => s.id)
const valid = localSessionIDs().filter((lid) => isPending(lid) || validateLocalSession(lid, ids)) const prev = localSessionIDs()
if (valid.length !== localSessionIDs().length) { const valid = prev.filter((lid) => isPending(lid) || validateLocalSession(lid, ids))
if (valid.length !== prev.length) {
const removed = prev.filter((lid) => !isPending(lid) && !valid.includes(lid))
for (const id of removed) {
vscode.postMessage({ type: "agentManager.forgetSession", sessionId: id })
}
setLocalSessionIDs(valid) setLocalSessionIDs(valid)
} }
}) })
// Drop in-memory review state for worktrees that no longer exist. // Drop in-memory review state for worktrees that no longer exist.
createEffect(() => { createEffect(() => {
const ids = new Set(worktrees().map((wt) => wt.id)) const ids = new Set(worktrees().map((wt) => wt.id))
@@ -1015,6 +1040,12 @@ const AgentManagerContent: Component = () => {
if (agent) session.selectAgent(agent.name) if (agent) session.selectAgent(agent.name)
} }
const syncRunStatuses = (items: RunStatus[] = []) => {
const map: Record<string, RunStatus> = {}
for (const item of items) map[item.worktreeId] = item
setRunStatuses(map)
}
onMount(() => { onMount(() => {
const handler = (event: MessageEvent) => { const handler = (event: MessageEvent) => {
const msg = event.data as ExtensionMessage const msg = event.data as ExtensionMessage
@@ -1038,6 +1069,7 @@ const AgentManagerContent: Component = () => {
else if (msg.action === "closeTab") closeActiveTab() else if (msg.action === "closeTab") closeActiveTab()
else if (msg.action === "newWorktree") handleNewWorktreeOrPromote() else if (msg.action === "newWorktree") handleNewWorktreeOrPromote()
else if (msg.action === "openWorktree") openWorktreeDirectory() else if (msg.action === "openWorktree") openWorktreeDirectory()
else if (msg.action === "runScript") runSelected()
else if (msg.action === "advancedWorktree") showAdvancedWorktreeDialog() else if (msg.action === "advancedWorktree") showAdvancedWorktreeDialog()
else if (msg.action === "closeWorktree") closeSelectedWorktree() else if (msg.action === "closeWorktree") closeSelectedWorktree()
else if (msg.action === "showShortcuts") handleShowKeyboardShortcuts() else if (msg.action === "showShortcuts") handleShowKeyboardShortcuts()
@@ -1059,8 +1091,8 @@ const AgentManagerContent: Component = () => {
if (e.altKey && ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { if (e.altKey && ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) {
e.preventDefault() e.preventDefault()
} }
// Prevent browser defaults for our shortcuts (new tab, close tab, new window, toggle diff, find) // Prevent browser defaults for our shortcuts (new tab, close tab, new window, toggle diff, run, find)
if (["t", "w", "n", "d", "f"].includes(e.key.toLowerCase()) && !e.shiftKey) { if (["t", "w", "n", "d", "e", "f"].includes(e.key.toLowerCase()) && !e.shiftKey) {
e.preventDefault() e.preventDefault()
} }
// Prevent defaults for shift variants (close worktree, advanced/new open worktree) // Prevent defaults for shift variants (close worktree, advanced/new open worktree)
@@ -1119,6 +1151,7 @@ const AgentManagerContent: Component = () => {
setLocalSessionIDs((prev) => [...prev, created.session.id]) setLocalSessionIDs((prev) => [...prev, created.session.id])
setSelection(LOCAL) setSelection(LOCAL)
} }
vscode.postMessage({ type: "agentManager.persistSession", sessionId: created.session.id })
session.selectSession(created.session.id) session.selectSession(created.session.id)
}) })
@@ -1127,6 +1160,12 @@ const AgentManagerContent: Component = () => {
if (msg.type === "sessionsLoaded" && !sessionsLoaded()) setSessionsLoaded(true) if (msg.type === "sessionsLoaded" && !sessionsLoaded()) setSessionsLoaded(true)
}) })
const unsubRun = vscode.onMessage((msg) => {
if (msg.type !== "agentManager.runStatus") return
const ev = msg as RunStatus
setRunStatuses((prev) => ({ ...prev, [ev.worktreeId]: ev }))
})
const unsub = vscode.onMessage((msg) => { const unsub = vscode.onMessage((msg) => {
if (msg.type === "agentManager.repoInfo") { if (msg.type === "agentManager.repoInfo") {
const info = msg as AgentManagerRepoInfoMessage const info = msg as AgentManagerRepoInfoMessage
@@ -1193,6 +1232,7 @@ const AgentManagerContent: Component = () => {
if (idx >= 0) return [...prev.slice(0, idx + 1), ev.sessionId, ...prev.slice(idx + 1)] if (idx >= 0) return [...prev.slice(0, idx + 1), ev.sessionId, ...prev.slice(idx + 1)]
return [...prev, ev.sessionId] return [...prev, ev.sessionId]
}) })
vscode.postMessage({ type: "agentManager.persistSession", sessionId: ev.sessionId })
} }
session.selectSession(ev.sessionId) session.selectSession(ev.sessionId)
} }
@@ -1226,20 +1266,22 @@ const AgentManagerContent: Component = () => {
setReviewDiffStyle(state.reviewDiffStyle) setReviewDiffStyle(state.reviewDiffStyle)
} }
if ("defaultBaseBranch" in state) setDefaultBaseBranch(state.defaultBaseBranch || undefined) if ("defaultBaseBranch" in state) setDefaultBaseBranch(state.defaultBaseBranch || undefined)
setRunScriptConfigured(state.runScriptConfigured === true)
syncRunStatuses(state.runStatuses)
const current = session.currentSessionID() const current = session.currentSessionID()
if (current) { if (current) {
const ms = state.sessions.find((s) => s.id === current) const ms = state.sessions.find((s) => s.id === current)
if (ms?.worktreeId) setSelection(ms.worktreeId) if (ms?.worktreeId) setSelection(ms.worktreeId)
} }
// Recover local tab order from persisted state // Restore local session IDs from persisted state (sessions with no worktreeId)
const localOrder = state.tabOrder?.[LOCAL] const restored = restoreLocalSessions(
if (localOrder && localSessionIDs().length > 0) { state.sessions,
const reordered = applyTabOrder( localSessionIDs(),
localSessionIDs().map((id) => ({ id })), state.tabOrder?.[LOCAL],
localOrder, isPending,
).map((item) => item.id) applyTabOrder,
setLocalSessionIDs(reordered) )
} if (restored) setLocalSessionIDs(restored)
// Recover sessions collapsed state from extension-persisted state // Recover sessions collapsed state from extension-persisted state
if (state.sessionsCollapsed !== undefined) setSessionsCollapsed(state.sessionsCollapsed) if (state.sessionsCollapsed !== undefined) setSessionsCollapsed(state.sessionsCollapsed)
// Clear busy state for worktrees that have been removed // Clear busy state for worktrees that have been removed
@@ -1248,6 +1290,9 @@ const AgentManagerContent: Component = () => {
const next = new Map([...prev].filter(([id]) => ids.has(id))) const next = new Map([...prev].filter(([id]) => ids.has(id)))
return next.size === prev.size ? prev : next return next.size === prev.size ? prev : next
}) })
setRunStatuses((prev) =>
Object.fromEntries(Object.entries(prev).filter(([id]) => id === "local" || ids.has(id))),
)
} }
// When a multi-version progress update arrives, mark newly created worktrees as loading // When a multi-version progress update arrives, mark newly created worktrees as loading
@@ -1311,7 +1356,6 @@ const AgentManagerContent: Component = () => {
providerID: ev.providerID, providerID: ev.providerID,
modelID: ev.modelID, modelID: ev.modelID,
agent: ev.agent, agent: ev.agent,
variant: ev.variant,
files: ev.files, files: ev.files,
}) })
} }
@@ -1426,6 +1470,7 @@ const AgentManagerContent: Component = () => {
window.removeEventListener("focus", onWindowFocus) window.removeEventListener("focus", onWindowFocus)
unsubCreate() unsubCreate()
unsubSessions() unsubSessions()
unsubRun()
unsub() unsub()
}) })
}) })
@@ -1891,6 +1936,9 @@ const AgentManagerContent: Component = () => {
} }
if (pending || localSet().has(sessionId)) { if (pending || localSet().has(sessionId)) {
setLocalSessionIDs((prev) => prev.filter((id) => id !== sessionId)) setLocalSessionIDs((prev) => prev.filter((id) => id !== sessionId))
if (!pending) {
vscode.postMessage({ type: "agentManager.forgetSession", sessionId })
}
} else { } else {
vscode.postMessage({ type: "agentManager.closeSession", sessionId }) vscode.postMessage({ type: "agentManager.closeSession", sessionId })
} }
@@ -2278,7 +2326,10 @@ const AgentManagerContent: Component = () => {
if (typeof from !== "string" || typeof to !== "string") return if (typeof from !== "string" || typeof to !== "string") return
if (secIds().has(to)) return if (secIds().has(to)) return
setSidebarWorktreeOrder((prev) => { setSidebarWorktreeOrder((prev) => {
const cur = completeSidebarOrder(sections(), sortedWorktrees(), prev) const cur = applyTabOrder(
sortedWorktrees().map((w) => ({ id: w.id })),
prev,
).map((i) => i.id)
return reorderTabs(cur, from, to) ?? prev return reorderTabs(cur, from, to) ?? prev
}) })
} }
@@ -2288,7 +2339,6 @@ const AgentManagerContent: Component = () => {
setDraggingWorktree(undefined) setDraggingWorktree(undefined)
document.body.classList.remove("am-wt-dragging-active") document.body.classList.remove("am-wt-dragging-active")
if (typeof from === "string" && typeof to === "string" && secIds().has(to)) { if (typeof from === "string" && typeof to === "string" && secIds().has(to)) {
vscode.postMessage({ type: "agentManager.setWorktreeOrder", order: sidebarWorktreeOrder() })
moveToSection([from], to) moveToSection([from], to)
return return
} }
@@ -2351,6 +2401,7 @@ const AgentManagerContent: Component = () => {
pr={ pr={
prStatuses()[wt.id] !== undefined ? (prStatuses()[wt.id] ?? undefined) : undefined prStatuses()[wt.id] !== undefined ? (prStatuses()[wt.id] ?? undefined) : undefined
} }
runStatus={runStatuses()[wt.id]}
onOpenPR={() => onOpenPR={() =>
vscode.postMessage({ type: "agentManager.openPR", worktreeId: wt.id }) vscode.postMessage({ type: "agentManager.openPR", worktreeId: wt.id })
} }
@@ -2686,6 +2737,54 @@ const AgentManagerContent: Component = () => {
</Tooltip> </Tooltip>
</> </>
</Show> </Show>
<Show when={sel()}>
{(() => {
const rid = () => (sel() === LOCAL ? LOCAL : (sel() as string))
const rs = () => runStatuses()[rid()]
const active = () => rs()?.state === "running" || rs()?.state === "stopping"
const configured = runScriptConfigured
const title = () => (configured() ? (active() ? "Stop" : "Run") : "Configure run script")
return (
<span
class={`am-run-group ${active() ? "am-run-active" : ""} ${!configured() ? "am-run-unconfigured" : ""}`}
>
<TooltipKeybind title={title()} keybind={kb().runScript ?? ""} placement="bottom">
<Button
size="small"
variant="ghost"
icon={active() ? "stop" : "play"}
disabled={rs()?.state === "stopping"}
onClick={() => runWorktree(rid())}
>
{active() ? "Stop" : "Run"}
</Button>
</TooltipKeybind>
<DropdownMenu gutter={4} placement="bottom-end">
<DropdownMenu.Trigger
as={(p: Record<string, unknown>) => (
<IconButton
{...p}
icon="chevron-down"
size="small"
variant="ghost"
label={t("agentManager.run.options")}
class="am-run-group-chevron"
/>
)}
/>
<DropdownMenu.Portal>
<DropdownMenu.Content class="am-split-menu">
<DropdownMenu.Item onSelect={configureRunScript}>
<Icon name="settings-gear" size="small" />
<DropdownMenu.ItemLabel>{t("agentManager.run.configure")}</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Portal>
</DropdownMenu>
</span>
)
})()}
</Show>
<TooltipKeybind <TooltipKeybind
title={t("agentManager.diff.toggle")} title={t("agentManager.diff.toggle")}
keybind={kb().toggleDiff ?? ""} keybind={kb().toggleDiff ?? ""}
@@ -10,7 +10,7 @@ import { Tooltip, TooltipKeybind } from "@kilocode/kilo-ui/tooltip"
import { HoverCard } from "@kilocode/kilo-ui/hover-card" import { HoverCard } from "@kilocode/kilo-ui/hover-card"
import { ContextMenu } from "@kilocode/kilo-ui/context-menu" import { ContextMenu } from "@kilocode/kilo-ui/context-menu"
import { Button } from "@kilocode/kilo-ui/button" import { Button } from "@kilocode/kilo-ui/button"
import type { WorktreeState, WorktreeGitStats, PRStatus, SectionState } from "../src/types/messages" import type { WorktreeState, WorktreeGitStats, PRStatus, SectionState, RunStatus } from "../src/types/messages"
import { colorCss } from "./section-colors" import { colorCss } from "./section-colors"
import { useLanguage } from "../src/context/language" import { useLanguage } from "../src/context/language"
import { formatRelativeDate } from "../src/utils/date" import { formatRelativeDate } from "../src/utils/date"
@@ -56,6 +56,7 @@ interface WorktreeItemProps {
openKeybind: string openKeybind: string
/** PR status for this worktree's branch, or null if no PR. */ /** PR status for this worktree's branch, or null if no PR. */
pr?: PRStatus | null pr?: PRStatus | null
runStatus?: RunStatus
/** Callback when the PR badge is clicked. */ /** Callback when the PR badge is clicked. */
onOpenPR?: () => void onOpenPR?: () => void
/** Available sections for the "Move to Section" submenu. */ /** Available sections for the "Move to Section" submenu. */
@@ -107,6 +108,28 @@ function reviewLabel(review: string): string {
return "Pending" return "Pending"
} }
function runAccent(status: RunStatus | undefined): "running" | "stopping" | "success" | "error" | undefined {
if (status?.state === "running") return "running"
if (status?.state === "stopping") return "stopping"
if (status?.exitCode === undefined && !status?.error) return undefined
if (status.exitCode === 0 && !status.error) return "success"
return "error"
}
function RunBadge(props: { status?: RunStatus }) {
const kind = () => runAccent(props.status)
return (
<Show when={kind()}>
<span class="am-run-badge" data-run-state={kind()}>
<Icon name={kind() === "success" ? "check-small" : kind() === "error" ? "warning" : "play"} size="small" />
<Show when={props.status?.state === "running" || props.status?.state === "stopping"}>
<span class="am-run-badge-label">{props.status?.state === "stopping" ? "Stopping" : "Running"}</span>
</Show>
</span>
</Show>
)
}
export const WorktreeItem: Component<WorktreeItemProps> = (props) => { export const WorktreeItem: Component<WorktreeItemProps> = (props) => {
const { t } = useLanguage() const { t } = useLanguage()
const [hovered, setHovered] = createSignal(false) const [hovered, setHovered] = createSignal(false)
@@ -280,6 +303,7 @@ export const WorktreeItem: Component<WorktreeItemProps> = (props) => {
<Show when={props.subtitle}> <Show when={props.subtitle}>
<span class="am-worktree-subtitle">{props.subtitle}</span> <span class="am-worktree-subtitle">{props.subtitle}</span>
</Show> </Show>
<RunBadge status={props.runStatus} />
<Show <Show
when={props.pr} when={props.pr}
fallback={ fallback={
@@ -508,6 +508,89 @@ button.am-section-toggle:hover .am-section-label {
margin-left: auto; margin-left: auto;
} }
.am-run-badge {
--am-run-accent: var(--text-muted);
display: inline-flex;
align-items: center;
gap: 3px;
padding: 1px 5px 1px 3px;
border-radius: 6px;
background: color-mix(in srgb, var(--am-run-accent) 12%, transparent);
color: var(--am-run-accent);
font-size: 10px;
line-height: 1;
margin-left: auto;
}
.am-run-badge [data-component="icon"] {
width: 11px;
height: 11px;
color: currentColor;
}
.am-run-badge-label {
color: currentColor;
}
.am-run-badge[data-run-state="running"] {
--am-run-accent: var(--vscode-testing-iconPassed, #34d399);
animation: am-run-pulse 1.5s ease-in-out infinite;
}
.am-run-badge[data-run-state="stopping"] {
--am-run-accent: #fbbf24;
}
.am-run-badge[data-run-state="success"] {
--am-run-accent: var(--vscode-testing-iconPassed, #34d399);
}
.am-run-badge[data-run-state="error"] {
--am-run-accent: #f87171;
}
@keyframes am-run-pulse {
0%,
100% {
opacity: 0.95;
}
50% {
opacity: 0.45;
}
}
/* Toolbar Run button group */
.am-run-group {
display: inline-flex;
align-items: center;
gap: 0;
}
.am-run-group-chevron {
padding: 0 2px !important;
min-width: 0 !important;
width: auto !important;
}
.am-run-group-chevron [data-component="icon"] {
width: 12px;
height: 12px;
}
/* Unconfigured — muted until hover */
.am-run-unconfigured {
opacity: 0.5;
}
.am-run-unconfigured:hover {
opacity: 0.85;
}
/* Green accent when running — uses VS Code's standard green token */
.am-run-active,
.am-run-active [data-component="icon"] {
color: var(--vscode-testing-iconPassed, #34d399) !important;
}
.am-stat-files { .am-stat-files {
color: var(--text-muted); color: var(--text-muted);
} }
@@ -72,6 +72,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "علامة تبويب جديدة", "agentManager.shortcuts.newTab": "علامة تبويب جديدة",
"agentManager.shortcuts.closeTab": "إغلاق علامة التبويب", "agentManager.shortcuts.closeTab": "إغلاق علامة التبويب",
"agentManager.shortcuts.toggleTerminal": "تبديل الطرفية", "agentManager.shortcuts.toggleTerminal": "تبديل الطرفية",
"agentManager.shortcuts.runScript": "تشغيل السكربت",
"agentManager.run.options": "خيارات التشغيل",
"agentManager.run.configure": "تكوين سكربت التشغيل",
"agentManager.shortcuts.openAgentManager": "فتح Agent Manager", "agentManager.shortcuts.openAgentManager": "فتح Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nova aba", "agentManager.shortcuts.newTab": "Nova aba",
"agentManager.shortcuts.closeTab": "Fechar aba", "agentManager.shortcuts.closeTab": "Fechar aba",
"agentManager.shortcuts.toggleTerminal": "Alternar terminal", "agentManager.shortcuts.toggleTerminal": "Alternar terminal",
"agentManager.shortcuts.runScript": "Executar script",
"agentManager.run.options": "Opções de execução",
"agentManager.run.configure": "Configurar script de execução",
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager", "agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -74,6 +74,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nova kartica", "agentManager.shortcuts.newTab": "Nova kartica",
"agentManager.shortcuts.closeTab": "Zatvori karticu", "agentManager.shortcuts.closeTab": "Zatvori karticu",
"agentManager.shortcuts.toggleTerminal": "Prebaci terminal", "agentManager.shortcuts.toggleTerminal": "Prebaci terminal",
"agentManager.shortcuts.runScript": "Pokreni skriptu",
"agentManager.run.options": "Opcije pokretanja",
"agentManager.run.configure": "Konfiguriši skriptu za pokretanje",
"agentManager.shortcuts.openAgentManager": "Otvori Agent Manager", "agentManager.shortcuts.openAgentManager": "Otvori Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Ny fane", "agentManager.shortcuts.newTab": "Ny fane",
"agentManager.shortcuts.closeTab": "Luk fane", "agentManager.shortcuts.closeTab": "Luk fane",
"agentManager.shortcuts.toggleTerminal": "Skift terminal", "agentManager.shortcuts.toggleTerminal": "Skift terminal",
"agentManager.shortcuts.runScript": "Kør script",
"agentManager.run.options": "Kørselsindstillinger",
"agentManager.run.configure": "Konfigurer kørselsscript",
"agentManager.shortcuts.openAgentManager": "Åbn Agent Manager", "agentManager.shortcuts.openAgentManager": "Åbn Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -74,6 +74,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Neuer Tab", "agentManager.shortcuts.newTab": "Neuer Tab",
"agentManager.shortcuts.closeTab": "Tab schließen", "agentManager.shortcuts.closeTab": "Tab schließen",
"agentManager.shortcuts.toggleTerminal": "Terminal umschalten", "agentManager.shortcuts.toggleTerminal": "Terminal umschalten",
"agentManager.shortcuts.runScript": "Skript ausführen",
"agentManager.run.options": "Ausführungsoptionen",
"agentManager.run.configure": "Ausführungsskript konfigurieren",
"agentManager.shortcuts.openAgentManager": "Agent Manager öffnen", "agentManager.shortcuts.openAgentManager": "Agent Manager öffnen",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -78,6 +78,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "New tab", "agentManager.shortcuts.newTab": "New tab",
"agentManager.shortcuts.closeTab": "Close tab", "agentManager.shortcuts.closeTab": "Close tab",
"agentManager.shortcuts.toggleTerminal": "Toggle terminal", "agentManager.shortcuts.toggleTerminal": "Toggle terminal",
"agentManager.shortcuts.runScript": "Run script",
"agentManager.run.options": "Run options",
"agentManager.run.configure": "Configure run script",
"agentManager.shortcuts.openAgentManager": "Open Agent Manager", "agentManager.shortcuts.openAgentManager": "Open Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nueva pestaña", "agentManager.shortcuts.newTab": "Nueva pestaña",
"agentManager.shortcuts.closeTab": "Cerrar pestaña", "agentManager.shortcuts.closeTab": "Cerrar pestaña",
"agentManager.shortcuts.toggleTerminal": "Alternar terminal", "agentManager.shortcuts.toggleTerminal": "Alternar terminal",
"agentManager.shortcuts.runScript": "Ejecutar script",
"agentManager.run.options": "Opciones de ejecución",
"agentManager.run.configure": "Configurar script de ejecución",
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager", "agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nouvel onglet", "agentManager.shortcuts.newTab": "Nouvel onglet",
"agentManager.shortcuts.closeTab": "Fermer l'onglet", "agentManager.shortcuts.closeTab": "Fermer l'onglet",
"agentManager.shortcuts.toggleTerminal": "Basculer le terminal", "agentManager.shortcuts.toggleTerminal": "Basculer le terminal",
"agentManager.shortcuts.runScript": "Exécuter le script",
"agentManager.run.options": "Options d'exécution",
"agentManager.run.configure": "Configurer le script d'exécution",
"agentManager.shortcuts.openAgentManager": "Ouvrir Agent Manager", "agentManager.shortcuts.openAgentManager": "Ouvrir Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "新しいタブ", "agentManager.shortcuts.newTab": "新しいタブ",
"agentManager.shortcuts.closeTab": "タブを閉じる", "agentManager.shortcuts.closeTab": "タブを閉じる",
"agentManager.shortcuts.toggleTerminal": "ターミナルの切り替え", "agentManager.shortcuts.toggleTerminal": "ターミナルの切り替え",
"agentManager.shortcuts.runScript": "スクリプトを実行",
"agentManager.run.options": "実行オプション",
"agentManager.run.configure": "実行スクリプトを設定",
"agentManager.shortcuts.openAgentManager": "Agent Managerを開く", "agentManager.shortcuts.openAgentManager": "Agent Managerを開く",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "새 탭", "agentManager.shortcuts.newTab": "새 탭",
"agentManager.shortcuts.closeTab": "탭 닫기", "agentManager.shortcuts.closeTab": "탭 닫기",
"agentManager.shortcuts.toggleTerminal": "터미널 전환", "agentManager.shortcuts.toggleTerminal": "터미널 전환",
"agentManager.shortcuts.runScript": "스크립트 실행",
"agentManager.run.options": "실행 옵션",
"agentManager.run.configure": "실행 스크립트 구성",
"agentManager.shortcuts.openAgentManager": "Agent Manager 열기", "agentManager.shortcuts.openAgentManager": "Agent Manager 열기",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -78,6 +78,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nieuw tabblad", "agentManager.shortcuts.newTab": "Nieuw tabblad",
"agentManager.shortcuts.closeTab": "Tabblad sluiten", "agentManager.shortcuts.closeTab": "Tabblad sluiten",
"agentManager.shortcuts.toggleTerminal": "Terminal in-/uitschakelen", "agentManager.shortcuts.toggleTerminal": "Terminal in-/uitschakelen",
"agentManager.shortcuts.runScript": "Script uitvoeren",
"agentManager.run.options": "Uitvoeropties",
"agentManager.run.configure": "Uitvoerscript configureren",
"agentManager.shortcuts.openAgentManager": "Agent Manager openen", "agentManager.shortcuts.openAgentManager": "Agent Manager openen",
"agentManager.shortcuts.cycleAgentMode": "Volgende agent modus", "agentManager.shortcuts.cycleAgentMode": "Volgende agent modus",
"agentManager.shortcuts.cyclePreviousAgentMode": "Vorige agent modus", "agentManager.shortcuts.cyclePreviousAgentMode": "Vorige agent modus",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Ny fane", "agentManager.shortcuts.newTab": "Ny fane",
"agentManager.shortcuts.closeTab": "Lukk fane", "agentManager.shortcuts.closeTab": "Lukk fane",
"agentManager.shortcuts.toggleTerminal": "Veksle terminal", "agentManager.shortcuts.toggleTerminal": "Veksle terminal",
"agentManager.shortcuts.runScript": "Kjør skript",
"agentManager.run.options": "Kjøringsalternativer",
"agentManager.run.configure": "Konfigurer kjøreskript",
"agentManager.shortcuts.openAgentManager": "Åpne Agent Manager", "agentManager.shortcuts.openAgentManager": "Åpne Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Nowa karta", "agentManager.shortcuts.newTab": "Nowa karta",
"agentManager.shortcuts.closeTab": "Zamknij kartę", "agentManager.shortcuts.closeTab": "Zamknij kartę",
"agentManager.shortcuts.toggleTerminal": "Przełącz terminal", "agentManager.shortcuts.toggleTerminal": "Przełącz terminal",
"agentManager.shortcuts.runScript": "Uruchom skrypt",
"agentManager.run.options": "Opcje uruchamiania",
"agentManager.run.configure": "Konfiguruj skrypt uruchamiania",
"agentManager.shortcuts.openAgentManager": "Otwórz Agent Manager", "agentManager.shortcuts.openAgentManager": "Otwórz Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -73,6 +73,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Новая вкладка", "agentManager.shortcuts.newTab": "Новая вкладка",
"agentManager.shortcuts.closeTab": "Закрыть вкладку", "agentManager.shortcuts.closeTab": "Закрыть вкладку",
"agentManager.shortcuts.toggleTerminal": "Переключить терминал", "agentManager.shortcuts.toggleTerminal": "Переключить терминал",
"agentManager.shortcuts.runScript": "Запустить скрипт",
"agentManager.run.options": "Параметры запуска",
"agentManager.run.configure": "Настроить скрипт запуска",
"agentManager.shortcuts.openAgentManager": "Открыть Agent Manager", "agentManager.shortcuts.openAgentManager": "Открыть Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -70,6 +70,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "แท็บใหม่", "agentManager.shortcuts.newTab": "แท็บใหม่",
"agentManager.shortcuts.closeTab": "ปิดแท็บ", "agentManager.shortcuts.closeTab": "ปิดแท็บ",
"agentManager.shortcuts.toggleTerminal": "สลับเทอร์มินัล", "agentManager.shortcuts.toggleTerminal": "สลับเทอร์มินัล",
"agentManager.shortcuts.runScript": "เรียกใช้สคริปต์",
"agentManager.run.options": "ตัวเลือกการเรียกใช้",
"agentManager.run.configure": "กำหนดค่าสคริปต์การเรียกใช้",
"agentManager.shortcuts.openAgentManager": "เปิด Agent Manager", "agentManager.shortcuts.openAgentManager": "เปิด Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -78,6 +78,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Yeni sekme", "agentManager.shortcuts.newTab": "Yeni sekme",
"agentManager.shortcuts.closeTab": "Sekmeyi kapat", "agentManager.shortcuts.closeTab": "Sekmeyi kapat",
"agentManager.shortcuts.toggleTerminal": "Terminali aç/kapat", "agentManager.shortcuts.toggleTerminal": "Terminali aç/kapat",
"agentManager.shortcuts.runScript": "Betiği çalıştır",
"agentManager.run.options": "Çalıştırma seçenekleri",
"agentManager.run.configure": "Çalıştırma betiğini yapılandır",
"agentManager.shortcuts.openAgentManager": "Agent Manager'ı Aç", "agentManager.shortcuts.openAgentManager": "Agent Manager'ı Aç",
"agentManager.shortcuts.cycleAgentMode": "Sonraki agent modu", "agentManager.shortcuts.cycleAgentMode": "Sonraki agent modu",
"agentManager.shortcuts.cyclePreviousAgentMode": "Önceki agent modu", "agentManager.shortcuts.cyclePreviousAgentMode": "Önceki agent modu",
@@ -79,6 +79,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "Нова вкладка", "agentManager.shortcuts.newTab": "Нова вкладка",
"agentManager.shortcuts.closeTab": "Закрити вкладку", "agentManager.shortcuts.closeTab": "Закрити вкладку",
"agentManager.shortcuts.toggleTerminal": "Перемкнути термінал", "agentManager.shortcuts.toggleTerminal": "Перемкнути термінал",
"agentManager.shortcuts.runScript": "Запустити скрипт",
"agentManager.run.options": "Параметри запуску",
"agentManager.run.configure": "Налаштувати скрипт запуску",
"agentManager.shortcuts.openAgentManager": "Відкрити Agent Manager", "agentManager.shortcuts.openAgentManager": "Відкрити Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Наступний режим агента", "agentManager.shortcuts.cycleAgentMode": "Наступний режим агента",
"agentManager.shortcuts.cyclePreviousAgentMode": "Попередній режим агента", "agentManager.shortcuts.cyclePreviousAgentMode": "Попередній режим агента",
@@ -70,6 +70,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "新建标签页", "agentManager.shortcuts.newTab": "新建标签页",
"agentManager.shortcuts.closeTab": "关闭标签页", "agentManager.shortcuts.closeTab": "关闭标签页",
"agentManager.shortcuts.toggleTerminal": "切换终端", "agentManager.shortcuts.toggleTerminal": "切换终端",
"agentManager.shortcuts.runScript": "运行脚本",
"agentManager.run.options": "运行选项",
"agentManager.run.configure": "配置运行脚本",
"agentManager.shortcuts.openAgentManager": "打开 Agent Manager", "agentManager.shortcuts.openAgentManager": "打开 Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -70,6 +70,9 @@ export const dict = {
"agentManager.shortcuts.newTab": "新建分頁", "agentManager.shortcuts.newTab": "新建分頁",
"agentManager.shortcuts.closeTab": "關閉分頁", "agentManager.shortcuts.closeTab": "關閉分頁",
"agentManager.shortcuts.toggleTerminal": "切換終端機", "agentManager.shortcuts.toggleTerminal": "切換終端機",
"agentManager.shortcuts.runScript": "執行指令碼",
"agentManager.run.options": "執行選項",
"agentManager.run.configure": "設定執行指令碼",
"agentManager.shortcuts.openAgentManager": "開啟 Agent Manager", "agentManager.shortcuts.openAgentManager": "開啟 Agent Manager",
"agentManager.shortcuts.cycleAgentMode": "Next agent mode", "agentManager.shortcuts.cycleAgentMode": "Next agent mode",
"agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode", "agentManager.shortcuts.cyclePreviousAgentMode": "Previous agent mode",
@@ -161,7 +161,7 @@ export const ChatView: Component<ChatViewProps> = (props) => {
{language.t("command.session.new.task")} {language.t("command.session.new.task")}
</Button> </Button>
</Tooltip> </Tooltip>
<Show when={canContinueInWorktree()}> <Show when={canContinueInWorktree() && server.gitInstalled()}>
<Tooltip value="Continue in isolated worktree" placement="top"> <Tooltip value="Continue in isolated worktree" placement="top">
<Button <Button
variant="ghost" variant="ghost"
@@ -183,7 +183,7 @@ export const ChatView: Component<ChatViewProps> = (props) => {
</Button> </Button>
</Tooltip> </Tooltip>
</Show> </Show>
<Show when={isSidebar()}> <Show when={isSidebar() && server.gitInstalled()}>
<Tooltip <Tooltip
value={ value={
session.worktreeStats()?.files session.worktreeStats()?.files
@@ -190,7 +190,7 @@ export const VscodeSessionTurn: Component<VscodeSessionTurnProps> = (props) => {
</Show> </Show>
{/* Diff summary — shown after completion */} {/* Diff summary — shown after completion */}
<Show when={diffs().length > 0}> <Show when={diffs().length > 0 && server.gitInstalled()}>
<div class="vscode-session-turn-diffs" data-component="session-turn"> <div class="vscode-session-turn-diffs" data-component="session-turn">
<Collapsible open={open()} onOpenChange={setOpen} variant="ghost"> <Collapsible open={open()} onOpenChange={setOpen} variant="ghost">
<Collapsible.Trigger> <Collapsible.Trigger>
@@ -20,6 +20,7 @@ interface ServerContextValue {
vscodeLanguage: Accessor<string | undefined> vscodeLanguage: Accessor<string | undefined>
languageOverride: Accessor<string | undefined> languageOverride: Accessor<string | undefined>
workspaceDirectory: Accessor<string> workspaceDirectory: Accessor<string>
gitInstalled: Accessor<boolean>
} }
export const ServerContext = createContext<ServerContextValue>() export const ServerContext = createContext<ServerContextValue>()
@@ -39,6 +40,11 @@ export const ServerProvider: ParentComponent = (props) => {
const [vscodeLanguage, setVscodeLanguage] = createSignal<string | undefined>() const [vscodeLanguage, setVscodeLanguage] = createSignal<string | undefined>()
const [languageOverride, setLanguageOverride] = createSignal<string | undefined>() const [languageOverride, setLanguageOverride] = createSignal<string | undefined>()
const [workspaceDirectory, setWorkspaceDirectory] = createSignal<string>("") const [workspaceDirectory, setWorkspaceDirectory] = createSignal<string>("")
const [gitInstalled, setGitInstalled] = createSignal<boolean>(false)
const gitSub = vscode.onMessage((m: ExtensionMessage) => {
if (m.type === "gitStatus") setGitInstalled(m.repo)
})
onMount(() => { onMount(() => {
const unsubscribe = vscode.onMessage((message: ExtensionMessage) => { const unsubscribe = vscode.onMessage((message: ExtensionMessage) => {
@@ -121,7 +127,10 @@ export const ServerProvider: ParentComponent = (props) => {
} }
}) })
onCleanup(unsubscribe) onCleanup(() => {
gitSub()
unsubscribe()
})
// Let the extension know the webview has mounted and message handlers are registered. // Let the extension know the webview has mounted and message handlers are registered.
// Without this handshake, messages posted during a webview refresh can be lost. // Without this handshake, messages posted during a webview refresh can be lost.
@@ -151,6 +160,7 @@ export const ServerProvider: ParentComponent = (props) => {
vscodeLanguage, vscodeLanguage,
languageOverride, languageOverride,
workspaceDirectory, workspaceDirectory,
gitInstalled,
} }
return <ServerContext.Provider value={value}>{props.children}</ServerContext.Provider> return <ServerContext.Provider value={value}>{props.children}</ServerContext.Provider>
@@ -447,6 +447,11 @@ export interface ReadyMessage {
workspaceDirectory?: string workspaceDirectory?: string
} }
export interface GitStatusMessage {
type: "gitStatus"
repo: boolean
}
export interface WorkspaceDirectoryChangedMessage { export interface WorkspaceDirectoryChangedMessage {
type: "workspaceDirectoryChanged" type: "workspaceDirectoryChanged"
directory: string directory: string
@@ -894,6 +899,18 @@ export interface PRStatus {
files: number files: number
} }
export type RunState = "idle" | "running" | "stopping"
export interface RunStatus {
worktreeId: string
state: RunState
exitCode?: number
signal?: string
startedAt?: string
finishedAt?: string
error?: string
}
export interface ManagedSessionState { export interface ManagedSessionState {
id: string id: string
worktreeId: string | null worktreeId: string | null
@@ -928,6 +945,13 @@ export interface AgentManagerStateMessage {
reviewDiffStyle?: "unified" | "split" reviewDiffStyle?: "unified" | "split"
isGitRepo?: boolean isGitRepo?: boolean
defaultBaseBranch?: string defaultBaseBranch?: string
runStatuses?: RunStatus[]
runScriptConfigured?: boolean
runScriptPath?: string
}
export interface AgentManagerRunStatusMessage extends RunStatus {
type: "agentManager.runStatus"
} }
// Resolved keybindings for agent manager actions // Resolved keybindings for agent manager actions
@@ -1119,7 +1143,6 @@ export interface AgentManagerSendInitialMessage {
providerID?: string providerID?: string
modelID?: string modelID?: string
agent?: string agent?: string
variant?: string
files?: Array<{ mime: string; url: string }> files?: Array<{ mime: string; url: string }>
} }
@@ -1403,6 +1426,7 @@ export interface CustomProviderModelsFetchedMessage {
export type ExtensionMessage = export type ExtensionMessage =
| ReadyMessage | ReadyMessage
| GitStatusMessage
| ConnectionStateMessage | ConnectionStateMessage
| ErrorMessage | ErrorMessage
| SendMessageFailedMessage | SendMessageFailedMessage
@@ -1453,6 +1477,7 @@ export type ExtensionMessage =
| AgentManagerSessionAddedMessage | AgentManagerSessionAddedMessage
| AgentManagerSessionForkedMessage | AgentManagerSessionForkedMessage
| AgentManagerStateMessage | AgentManagerStateMessage
| AgentManagerRunStatusMessage
| AgentManagerKeybindingsMessage | AgentManagerKeybindingsMessage
| AgentManagerMultiVersionProgressMessage | AgentManagerMultiVersionProgressMessage
| AgentManagerSetSessionModelMessage | AgentManagerSetSessionModelMessage
@@ -1870,6 +1895,7 @@ export interface CreateWorktreeRequest {
type: "agentManager.createWorktree" type: "agentManager.createWorktree"
baseBranch?: string baseBranch?: string
branchName?: string branchName?: string
variant?: string
} }
// Delete a worktree and dissociate its sessions // Delete a worktree and dissociate its sessions
@@ -1947,6 +1973,20 @@ export interface ConfigureSetupScriptRequest {
type: "agentManager.configureSetupScript" type: "agentManager.configureSetupScript"
} }
export interface ConfigureRunScriptRequest {
type: "agentManager.configureRunScript"
}
export interface RunScriptRequest {
type: "agentManager.runScript"
worktreeId: string
}
export interface StopRunScriptRequest {
type: "agentManager.stopRunScript"
worktreeId: string
}
// Show terminal for a session // Show terminal for a session
export interface ShowTerminalRequest { export interface ShowTerminalRequest {
type: "agentManager.showTerminal" type: "agentManager.showTerminal"
@@ -2006,13 +2046,13 @@ export interface CreateMultiVersionRequest {
providerID?: string providerID?: string
modelID?: string modelID?: string
agent?: string agent?: string
variant?: string
files?: FileAttachment[] files?: FileAttachment[]
baseBranch?: string baseBranch?: string
branchName?: string branchName?: string
// Per-version model allocations for multi-model comparison mode. // Per-version model allocations for multi-model comparison mode.
// When set, each entry expands to `count` versions with that model. // When set, each entry expands to `count` versions with that model.
// Overrides `versions`, `providerID`, and `modelID`. // Overrides `versions`, `providerID`, and `modelID`.
variant?: string
modelAllocations?: ModelAllocation[] modelAllocations?: ModelAllocation[]
} }
@@ -2399,6 +2439,9 @@ export type WebviewMessage =
| RequestRepoInfoMessage | RequestRepoInfoMessage
| RequestStateMessage | RequestStateMessage
| ConfigureSetupScriptRequest | ConfigureSetupScriptRequest
| ConfigureRunScriptRequest
| RunScriptRequest
| StopRunScriptRequest
| ShowTerminalRequest | ShowTerminalRequest
| ShowLocalTerminalRequest | ShowLocalTerminalRequest
| OpenWorktreeRequest | OpenWorktreeRequest
+1
View File
@@ -0,0 +1 @@
# @kilocode/cli
@@ -14,7 +14,7 @@ export function kiloProviderOptions(options: { [x: string]: any }) {
openrouter.reasoning && "effort" in openrouter.reasoning ? openrouter.reasoning?.effort : undefined, openrouter.reasoning && "effort" in openrouter.reasoning ? openrouter.reasoning?.effort : undefined,
textVerbosity: openrouter.verbosity, textVerbosity: openrouter.verbosity,
store: false, store: false,
//forceReasoning: openrouter.reasoning?.enabled, // ai sdk v6 forceReasoning: openrouter.reasoning?.enabled,
} satisfies OpenAIResponsesProviderOptions } satisfies OpenAIResponsesProviderOptions
result.anthropic = { result.anthropic = {
thinking: { type: openrouter.reasoning?.enabled ? "adaptive" : "disabled" }, thinking: { type: openrouter.reasoning?.enabled ? "adaptive" : "disabled" },
+1
View File
@@ -53,6 +53,7 @@ const icons = {
"magnifying-glass-menu": `<path d="M2.08325 10.0002H4.58325M2.08325 5.41683H5.41659M2.08325 14.5835H5.41659M16.4583 13.9585L18.7499 16.2502M17.9166 10.0002C17.9166 12.9917 15.4915 15.4168 12.4999 15.4168C9.50838 15.4168 7.08325 12.9917 7.08325 10.0002C7.08325 7.00862 9.50838 4.5835 12.4999 4.5835C15.4915 4.5835 17.9166 7.00862 17.9166 10.0002Z" stroke="currentColor" stroke-linecap="square"/>`, "magnifying-glass-menu": `<path d="M2.08325 10.0002H4.58325M2.08325 5.41683H5.41659M2.08325 14.5835H5.41659M16.4583 13.9585L18.7499 16.2502M17.9166 10.0002C17.9166 12.9917 15.4915 15.4168 12.4999 15.4168C9.50838 15.4168 7.08325 12.9917 7.08325 10.0002C7.08325 7.00862 9.50838 4.5835 12.4999 4.5835C15.4915 4.5835 17.9166 7.00862 17.9166 10.0002Z" stroke="currentColor" stroke-linecap="square"/>`,
"window-cursor": `<path d="M17.9166 10.4167V3.75H2.08325V17.0833H10.4166M17.9166 13.5897L11.6666 11.6667L13.5897 17.9167L15.032 15.0321L17.9166 13.5897Z" stroke="currentColor" stroke-width="1.07143" stroke-linecap="square"/><path d="M5.00024 6.125C5.29925 6.12518 5.54126 6.36795 5.54126 6.66699C5.54108 6.96589 5.29914 7.20783 5.00024 7.20801C4.7012 7.20801 4.45843 6.966 4.45825 6.66699C4.45825 6.36784 4.70109 6.125 5.00024 6.125ZM7.91626 6.125C8.21541 6.125 8.45825 6.36784 8.45825 6.66699C8.45808 6.966 8.21531 7.20801 7.91626 7.20801C7.61736 7.20783 7.37542 6.96589 7.37524 6.66699C7.37524 6.36795 7.61726 6.12518 7.91626 6.125ZM10.8333 6.125C11.1324 6.125 11.3752 6.36784 11.3752 6.66699C11.3751 6.966 11.1323 7.20801 10.8333 7.20801C10.5342 7.20801 10.2914 6.966 10.2913 6.66699C10.2913 6.36784 10.5341 6.125 10.8333 6.125Z" fill="currentColor" stroke="currentColor" stroke-width="0.25" stroke-linecap="square"/>`, "window-cursor": `<path d="M17.9166 10.4167V3.75H2.08325V17.0833H10.4166M17.9166 13.5897L11.6666 11.6667L13.5897 17.9167L15.032 15.0321L17.9166 13.5897Z" stroke="currentColor" stroke-width="1.07143" stroke-linecap="square"/><path d="M5.00024 6.125C5.29925 6.12518 5.54126 6.36795 5.54126 6.66699C5.54108 6.96589 5.29914 7.20783 5.00024 7.20801C4.7012 7.20801 4.45843 6.966 4.45825 6.66699C4.45825 6.36784 4.70109 6.125 5.00024 6.125ZM7.91626 6.125C8.21541 6.125 8.45825 6.36784 8.45825 6.66699C8.45808 6.966 8.21531 7.20801 7.91626 7.20801C7.61736 7.20783 7.37542 6.96589 7.37524 6.66699C7.37524 6.36795 7.61726 6.12518 7.91626 6.125ZM10.8333 6.125C11.1324 6.125 11.3752 6.36784 11.3752 6.66699C11.3751 6.966 11.1323 7.20801 10.8333 7.20801C10.5342 7.20801 10.2914 6.966 10.2913 6.66699C10.2913 6.36784 10.5341 6.125 10.8333 6.125Z" fill="currentColor" stroke="currentColor" stroke-width="0.25" stroke-linecap="square"/>`,
task: `<path d="M9.99992 2.0835V17.9168M7.08325 3.75016H2.08325V16.2502H7.08325M12.9166 16.2502H17.9166V3.75016H12.9166" stroke="currentColor" stroke-linecap="square"/>`, task: `<path d="M9.99992 2.0835V17.9168M7.08325 3.75016H2.08325V16.2502H7.08325M12.9166 16.2502H17.9166V3.75016H12.9166" stroke="currentColor" stroke-linecap="square"/>`,
play: `<path d="M6 4L16 10L6 16V4Z" fill="currentColor"/>`,
stop: `<rect x="5" y="5" width="10" height="10" fill="currentColor"/>`, stop: `<rect x="5" y="5" width="10" height="10" fill="currentColor"/>`,
status: `<path d="M2 10V18H18V10M2 10V2H18V10M2 10H18M5 6H9M5 14H9" stroke="currentColor"/>`, status: `<path d="M2 10V18H18V10M2 10V2H18V10M2 10H18M5 6H9M5 14H9" stroke="currentColor"/>`,
"status-active": `<path d="M18 2H2V10H18V2Z" fill="currentColor" fill-opacity="0.1"/> "status-active": `<path d="M18 2H2V10H18V2Z" fill="currentColor" fill-opacity="0.1"/>
+59
View File
@@ -0,0 +1,59 @@
// kilocode_change - new file
// Custom changelog generator that wraps @changesets/changelog-github
// but strips "Thanks @user!" for team members.
const github = require("@changesets/changelog-github")
const team = new Set([
"actions-user",
"kilo-maintainer[bot]",
"kiloconnect[bot]",
"kiloconnect-lite[bot]",
"alexkgold",
"arimesser",
"arkadiykondrashov",
"bturcotte520",
"catrielmuller",
"chrarnoldus",
"codingelves",
"darkogj",
"dosire",
"DScdng",
"emilieschario",
"eshurakov",
"Helix-Kilo",
"iscekic",
"jeanduplessis",
"jobrietbergen",
"jrf0110",
"kevinvandijk",
"alex-alecu",
"imanolmzd-svg",
"kilocode-bot",
"kilo-code-bot[bot]",
"kirillk",
"lambertjosh",
"LigiaZ",
"marius-kilocode",
"markijbema",
"olearycrew",
"pandemicsyn",
"pedroheyerdahl",
"RSO",
"sbreitenother",
"suhailkc2025",
"Sureshkumars",
])
const base = github.default || github
module.exports = {
...base,
getReleaseLine: async (changeset, type, options) => {
const line = await base.getReleaseLine(changeset, type, options)
// Strip "Thanks @user!" for team members
return line.replace(/ Thanks \[@([^\]]+)\]\([^)]+\)!/g, (match, user) => {
if (team.has(user)) return ""
return match
})
},
}
@@ -368,6 +368,20 @@ export async function transformPackageJson(file: string, options: PackageJsonOpt
pkg.scripts.extension = ourScripts.extension pkg.scripts.extension = ourScripts.extension
changes.push(`scripts.extension: preserved Kilo's extension script`) changes.push(`scripts.extension: preserved Kilo's extension script`)
} }
if (relativePath === "package.json" && ourScripts?.changeset && pkg.scripts?.changeset !== ourScripts.changeset) {
pkg.scripts = pkg.scripts || {}
pkg.scripts.changeset = ourScripts.changeset
changes.push(`scripts.changeset: preserved Kilo's changeset script`)
}
if (
relativePath === "package.json" &&
ourScripts?.["changeset:version"] &&
pkg.scripts?.["changeset:version"] !== ourScripts["changeset:version"]
) {
pkg.scripts = pkg.scripts || {}
pkg.scripts["changeset:version"] = ourScripts["changeset:version"]
changes.push(`scripts.changeset:version: preserved Kilo's changeset:version script`)
}
// Merge catalog with "newest wins" strategy // Merge catalog with "newest wins" strategy
if (ourWorkspaces?.catalog || theirWorkspaces?.catalog) { if (ourWorkspaces?.catalog || theirWorkspaces?.catalog) {
+33 -5
View File
@@ -6,15 +6,29 @@ import { $ } from "bun"
const output = [`version=${Script.version}`] const output = [`version=${Script.version}`]
if (!Script.preview) { if (!Script.preview) {
const sha = process.env.GITHUB_SHA ?? (await $`git rev-parse HEAD`.text()).trim() // kilocode_change start - use changesets for changelog generation
await $`bun script/changelog.ts --to ${sha}`.cwd(process.cwd()) // Run changeset version to consume .changeset/*.md files into CHANGELOG.md.
const file = `${process.cwd()}/UPCOMING_CHANGELOG.md` // This also bumps package.json versions, but publish.ts overwrites them with
const body = await Bun.file(file) // Script.version later, so the changeset-computed versions are irrelevant.
// If no changesets exist yet, changeset version exits 0 but writes nothing.
const result = await $`bunx changeset version`.nothrow()
if (result.exitCode !== 0) {
console.warn("changeset version failed (exit " + result.exitCode + "), continuing with fallback notes")
}
// Extract the latest version section from the kilo-code extension changelog.
// Changesets writes to packages/kilo-vscode/CHANGELOG.md (not root) because
// the changeset targets the "kilo-code" package. This is also the file the
// VS Code Marketplace reads at publish time.
const changelog = await Bun.file(`${process.cwd()}/packages/kilo-vscode/CHANGELOG.md`)
.text() .text()
.catch(() => "No notable changes") .catch(() => "")
const body = extractLatestSection(changelog) || "No notable changes"
const dir = process.env.RUNNER_TEMP ?? "/tmp" const dir = process.env.RUNNER_TEMP ?? "/tmp"
const notesFile = `${dir}/opencode-release-notes.txt` const notesFile = `${dir}/opencode-release-notes.txt`
await Bun.write(notesFile, body) await Bun.write(notesFile, body)
// kilocode_change end
await $`gh release create v${Script.version} -d --title "v${Script.version}" --notes-file ${notesFile}` await $`gh release create v${Script.version} -d --title "v${Script.version}" --notes-file ${notesFile}`
const release = await $`gh release view v${Script.version} --json tagName,databaseId`.json() const release = await $`gh release view v${Script.version} --json tagName,databaseId`.json()
output.push(`release=${release.databaseId}`) output.push(`release=${release.databaseId}`)
@@ -35,4 +49,18 @@ if (process.env.GITHUB_OUTPUT) {
await Bun.write(process.env.GITHUB_OUTPUT, output.join("\n")) await Bun.write(process.env.GITHUB_OUTPUT, output.join("\n"))
} }
// kilocode_change start - extract latest changelog section for release notes
function extractLatestSection(changelog: string): string {
if (!changelog) return ""
const lines = changelog.split("\n")
// Find first ## heading (version section)
const start = lines.findIndex((line) => /^## /.test(line))
if (start < 0) return ""
// Find the next ## heading after the first one
const end = lines.findIndex((line, i) => i > start && /^## /.test(line))
const section = lines.slice(start + 1, end < 0 ? undefined : end)
return section.join("\n").trim()
}
// kilocode_change end
process.exit(0) process.exit(0)