diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83d878b6..d1c1dbb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,33 +49,10 @@ jobs: config: ./typos.toml - name: Lint - run: npm run lint + run: cargo clippy - name: Build - run: npm run build + run: cargo build --all-targets --all-features - name: Run tests - run: npm test - - - name: Generate TypeDoc documentation - run: npm run docs:ts:build - - - name: Upload documentation artifact - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b - with: - path: ./typescript/docs - - deploy-docs: - name: Deploy Documentation - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e + run: cargo test --all-features diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a5328c8d..d304d047 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,21 +21,3 @@ jobs: - run: cargo publish env: CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} - publish-npm: - runs-on: ubuntu-latest - environment: release # Optional: for enhanced security - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - # Setup .npmrc file to publish to npm - - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 - with: - node-version: "lts/*" - registry-url: "https://registry.npmjs.org" - - name: Update npm - run: npm install -g npm@latest - - run: npm ci - - run: npm run build - - run: npm publish diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index ea926093..00000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -typescript/examples/README.md diff --git a/AGENTS.md b/AGENTS.md index 333d1617..ea986258 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,6 @@ All paths in the protocol should be absolute - Handle the new request in the blanket impl of MessageHandler<{Agent|Client}Side> - Add the method to markdown_generator.rs SideDocs functions - Run `npm run generate` and fix any issues that appear -- Add the method to typescript/acp.ts classes and handlers - Run `npm run check` - Update the example agents and clients in tests and examples in both libraries @@ -33,6 +32,5 @@ All paths in the protocol should be absolute - Update the mintlify docs and guides in the `docs` directory - Run `npm run check` to make sure the json and zod schemas gets generated properly -- Params and responses docs make it to the schema, but the method-level docs, so make sure to update the typescript library accordingly. Never write readme files related to the conversation unless explicitly asked to. diff --git a/package-lock.json b/package-lock.json index b154e2f8..da77cca9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,16 @@ { - "name": "@agentclientprotocol/sdk", - "version": "0.4.6", + "name": "@agentclientprotocol/schema", + "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@agentclientprotocol/sdk", - "version": "0.4.6", + "name": "@agentclientprotocol/schema", + "version": "0.0.0", "license": "Apache-2.0", - "dependencies": { - "zod": "^3.0.0" - }, "devDependencies": { - "@types/node": "^24.1.0", - "concurrently": "^9.1.0", - "http-server": "^14.1.1", - "json-schema-to-typescript": "^15.0.4", "prettier": "^3.3.3", - "ts-to-zod": "^3.15.0", - "tsx": "^4.20.5", - "typedoc": "^0.28.11", - "typedoc-github-theme": "^0.3.1", - "typescript": "^5.8.3", - "vitest": "^3.2.4" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", - "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "tsx": "^4.20.5" } }, "node_modules/@esbuild/aix-ppc64": { @@ -485,3003 +455,106 @@ "node": ">=18" } }, - "node_modules/@gerrit0/mini-shiki": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.13.0.tgz", - "integrity": "sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-oniguruma": "^3.13.0", - "@shikijs/langs": "^3.13.0", - "@shikijs/themes": "^3.13.0", - "@shikijs/types": "^3.13.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.7.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oclif/core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.4.tgz", - "integrity": "sha512-78YYJls8+KG96tReyUsesKKIKqC0qbFSY1peUSrt0P2uGsrgAuU9axQ0iBQdhAlIwZDcTyaj+XXVQkz2kl/O0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.17.0", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.4.3", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.3", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "tinyglobby": "^0.2.14", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz", - "integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz", - "integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz", - "integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz", - "integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==", - "cpu": [ - "x64" - ], + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz", - "integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz", - "integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz", - "integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz", - "integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz", - "integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz", - "integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz", - "integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz", - "integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz", - "integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz", - "integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz", - "integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==", - "cpu": [ - "s390x" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz", - "integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==", - "cpu": [ - "x64" - ], + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz", - "integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==", - "cpu": [ - "x64" - ], + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz", - "integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==", - "cpu": [ - "arm64" - ], + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz", - "integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz", - "integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz", - "integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz", - "integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.13.0.tgz", - "integrity": "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.13.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.13.0.tgz", - "integrity": "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.13.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.13.0.tgz", - "integrity": "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.13.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", - "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", - "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.12.0" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript/vfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.1.tgz", - "integrity": "sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "4.1.2", - "rxjs": "7.8.2", - "shell-quote": "1.8.3", - "supports-color": "8.1.1", - "tree-kill": "1.2.2", - "yargs": "17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "8.2.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", - "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/external-editor": "^1.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-observable": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", - "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-to-typescript": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", - "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", - "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" - }, - "bin": { - "json2ts": "dist/src/cli.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/observable-fns": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", - "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/portfinder": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.6", - "debug": "^4.3.6" - }, - "engines": { - "node": ">= 10.12" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup": { - "version": "4.52.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz", - "integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.0", - "@rollup/rollup-android-arm64": "4.52.0", - "@rollup/rollup-darwin-arm64": "4.52.0", - "@rollup/rollup-darwin-x64": "4.52.0", - "@rollup/rollup-freebsd-arm64": "4.52.0", - "@rollup/rollup-freebsd-x64": "4.52.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.0", - "@rollup/rollup-linux-arm-musleabihf": "4.52.0", - "@rollup/rollup-linux-arm64-gnu": "4.52.0", - "@rollup/rollup-linux-arm64-musl": "4.52.0", - "@rollup/rollup-linux-loong64-gnu": "4.52.0", - "@rollup/rollup-linux-ppc64-gnu": "4.52.0", - "@rollup/rollup-linux-riscv64-gnu": "4.52.0", - "@rollup/rollup-linux-riscv64-musl": "4.52.0", - "@rollup/rollup-linux-s390x-gnu": "4.52.0", - "@rollup/rollup-linux-x64-gnu": "4.52.0", - "@rollup/rollup-linux-x64-musl": "4.52.0", - "@rollup/rollup-openharmony-arm64": "4.52.0", - "@rollup/rollup-win32-arm64-msvc": "4.52.0", - "@rollup/rollup-win32-ia32-msvc": "4.52.0", - "@rollup/rollup-win32-x64-gnu": "4.52.0", - "@rollup/rollup-win32-x64-msvc": "4.52.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/threads": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", - "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.1.0", - "debug": "^4.2.0", - "is-observable": "^2.1.0", - "observable-fns": "^0.6.1" - }, - "funding": { - "url": "https://github.com/andywer/threads.js?sponsor=1" - }, - "optionalDependencies": { - "tiny-worker": ">= 2" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-worker": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", - "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "esm": "^3.2.25" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-to-zod": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/ts-to-zod/-/ts-to-zod-3.15.0.tgz", - "integrity": "sha512-Lu5ITqD8xCIo4JZp4Cg3iSK3J2x3TGwwuDtNHfAIlx1mXWKClRdzqV+x6CFEzhKtJlZzhyvJIqg7DzrWfsdVSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oclif/core": ">=3.26.0", - "@typescript/vfs": "^1.5.0", - "case": "^1.6.3", - "chokidar": "^3.5.1", - "fs-extra": "^11.1.1", - "inquirer": "^8.2.0", - "lodash": "^4.17.21", - "ora": "^5.4.0", - "prettier": "3.0.3", - "rxjs": "^7.4.0", - "slash": "^3.0.0", - "threads": "^1.7.0", - "tslib": "^2.3.1", - "tsutils": "^3.21.0", - "typescript": "^5.2.2", - "zod": "^3.23.8" - }, - "bin": { - "ts-to-zod": "bin/run" - } - }, - "node_modules/ts-to-zod/node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "node_modules/tsx": { + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -3497,443 +570,6 @@ "optionalDependencies": { "fsevents": "~2.3.3" } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedoc": { - "version": "0.28.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.13.tgz", - "integrity": "sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@gerrit0/mini-shiki": "^3.12.0", - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.8.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18", - "pnpm": ">= 10" - }, - "peerDependencies": { - "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" - } - }, - "node_modules/typedoc-github-theme": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/typedoc-github-theme/-/typedoc-github-theme-0.3.1.tgz", - "integrity": "sha512-j6PmkAGmf/MGCzYjQcUH6jS9djPsNl/IoTXooxC+MoeMkBhbmPyKJlpR6Lw12BLoe2OYpYA2J1KMktUJXp/8Sw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typedoc": "~0.28.0" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", - "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", - "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index 6c0a4c5e..5b58ef1d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@agentclientprotocol/sdk", - "version": "0.4.6", + "name": "@agentclientprotocol/schema", + "version": "0.0.0", "publishConfig": { "access": "public" }, @@ -16,54 +16,22 @@ "license": "Apache-2.0", "author": "Zed Industries", "files": [ - "typescript", - "dist", "schema/schema.json", "LICENSE-APACHE" ], "type": "module", - "main": "dist/acp.js", - "types": "dist/acp.d.ts", - "directories": { - "example": "examples" - }, "scripts": { - "prepublishOnly": "cp typescript/README.md README.md", - "postpublish": "git checkout README.md", - "clean": "rm -rf dist tsconfig.tsbuildinfo && cargo clean", - "test": "cargo check --all-targets && cargo test && vitest run", - "test:ts": "vitest run", - "test:ts:watch": "vitest", "generate:json-schema": "cd rust && cargo run --bin generate --features unstable", - "generate:ts-schema": "node typescript/generate.js", "generate": "npm run generate:json-schema && npm run generate:ts-schema && npm run format", - "build": "npm run generate && tsc", "format": "prettier --write . && cargo fmt", "format:check": "prettier --check . && cargo fmt -- --check", - "lint": "cargo clippy", - "lint:fix": "cargo clippy --fix", "spellcheck": "./scripts/spellcheck.sh", "spellcheck:fix": "./scripts/spellcheck.sh --write-changes", - "check": "npm run lint && npm run format:check && npm run spellcheck && npm run build && npm run test && npm run docs:ts:verify", - "docs": "cd docs && npx mint@4.2.93 dev", - "docs:ts:build": "cd typescript && typedoc && echo 'TypeScript documentation generated in ./typescript/docs'", - "docs:ts:dev": "concurrently \"cd typescript && typedoc --watch --preserveWatchOutput\" \"npx http-server typescript/docs -p 8081\"", - "docs:ts:verify": "cd typescript && typedoc --emit none && echo 'TypeDoc verification passed'" - }, - "dependencies": { - "zod": "^3.0.0" + "check": "npm run lint && npm run format:check && npm run spellcheck && npm run build && npm run test", + "docs": "cd docs && npx mint@4.2.93 dev" }, "devDependencies": { - "@types/node": "^24.1.0", - "concurrently": "^9.1.0", - "http-server": "^14.1.1", - "json-schema-to-typescript": "^15.0.4", "prettier": "^3.3.3", - "ts-to-zod": "^3.15.0", - "tsx": "^4.20.5", - "typedoc": "^0.28.11", - "typedoc-github-theme": "^0.3.1", - "typescript": "^5.8.3", - "vitest": "^3.2.4" + "tsx": "^4.20.5" } } diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 28f9c5ce..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, - "declaration": true, - "allowSyntheticDefaultImports": true, - "lib": ["ESNext", "DOM", "DOM.Iterable"], - "module": "ESNext", - "moduleResolution": "bundler", - "target": "es2022", - "types": ["node"], - "rootDir": "typescript", - "outDir": "dist", - "paths": {} - }, - "include": [ - "typescript/acp.ts", - "typescript/connection.ts", - "typescript/schemas.ts" - ], - "exclude": [ - "**/dist/**", - "typescript/generate-schemas.ts", - "typescript/example.ts", - "tests/**" - ] -} diff --git a/typescript/README.md b/typescript/README.md deleted file mode 100644 index 1246258d..00000000 --- a/typescript/README.md +++ /dev/null @@ -1,49 +0,0 @@ - - Agent Client Protocol - - -# ACP TypeScript Library - -The official TypeScript implementation of the Agent Client Protocol (ACP) — a standardized communication protocol between code editors and AI-powered coding agents. - -Learn more at https://agentclientprotocol.com - -## Installation - -```bash -npm install @agentclientprotocol/sdk -``` - -## Get Started - -### Understand the Protocol - -Start by reading the [official ACP documentation](https://agentclientprotocol.com) to understand the core concepts and protocol specification. - -### Try the Examples - -The [examples directory](https://github.com/agentclientprotocol/agent-client-protocol/tree/main/typescript/examples) contains simple implementations of both Agents and Clients in TypeScript. These examples can be run from your terminal or from an ACP Client like [Zed](https://zed.dev), making them great starting points for your own integration! - -### Explore the API - -Browse the [TypeScript library reference](https://agentclientprotocol.github.io/agent-client-protocol) for detailed API documentation. - -If you're building an [Agent](https://agentclientprotocol.com/protocol/overview#agent), start with [AgentSideConnection](https://agentclientprotocol.github.io/agent-client-protocol/classes/AgentSideConnection.html). - -If you're building a [Client](https://agentclientprotocol.com/protocol/overview#client), start with [ClientSideConnection](https://agentclientprotocol.github.io/agent-client-protocol/classes/ClientSideConnection.html). - -### Study a Production Implementation - -For a complete, production-ready implementation, check out the [Gemini CLI Agent](https://github.com/google-gemini/gemini-cli/blob/main/packages/cli/src/zed-integration/zedIntegration.ts). - -## Resources - -- [Library docs](https://agentclientprotocol.github.io/agent-client-protocol) -- [Examples](https://github.com/agentclientprotocol/agent-client-protocol/tree/main/typescript/examples) -- [Protocol Documentation](https://agentclientprotocol.com) -- [GitHub Repository](https://github.com/agentclientprotocol/agent-client-protocol) -- [NPM Package](https://www.npmjs.com/package/@agentclientprotocol/sdk) - -## Contributing - -See the main [repository](https://github.com/agentclientprotocol/agent-client-protocol) for contribution guidelines. diff --git a/typescript/acp.test.ts b/typescript/acp.test.ts deleted file mode 100644 index 7dcea0be..00000000 --- a/typescript/acp.test.ts +++ /dev/null @@ -1,928 +0,0 @@ -import { describe, it, expect, beforeEach } from "vitest"; -import { - Agent, - ClientSideConnection, - Client, - AgentSideConnection, - InitializeRequest, - InitializeResponse, - NewSessionRequest, - NewSessionResponse, - LoadSessionRequest, - LoadSessionResponse, - AuthenticateRequest, - AuthenticateResponse, - PromptRequest, - PromptResponse, - WriteTextFileRequest, - WriteTextFileResponse, - ReadTextFileRequest, - ReadTextFileResponse, - RequestPermissionRequest, - RequestPermissionResponse, - CancelNotification, - SessionNotification, - PROTOCOL_VERSION, - ndJsonStream, -} from "./acp.js"; - -describe("Connection", () => { - let clientToAgent: TransformStream; - let agentToClient: TransformStream; - - beforeEach(() => { - clientToAgent = new TransformStream(); - agentToClient = new TransformStream(); - }); - - it("handles errors in bidirectional communication", async () => { - // Create client that throws errors - class TestClient implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - throw new Error("Write failed"); - } - async readTextFile( - _: ReadTextFileRequest, - ): Promise { - throw new Error("Read failed"); - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - throw new Error("Permission denied"); - } - async sessionUpdate(_: SessionNotification): Promise { - // no-op - } - } - - // Create agent that throws errors - class TestAgent implements Agent { - async initialize(_: InitializeRequest): Promise { - throw new Error("Failed to initialize"); - } - async newSession(_: NewSessionRequest): Promise { - throw new Error("Failed to create session"); - } - async loadSession(_: LoadSessionRequest): Promise { - throw new Error("Failed to load session"); - } - async authenticate(_: AuthenticateRequest): Promise { - throw new Error("Authentication failed"); - } - async prompt(_: PromptRequest): Promise { - throw new Error("Prompt failed"); - } - async cancel(_: CancelNotification): Promise { - // no-op - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Test error handling in client->agent direction - await expect( - clientConnection.writeTextFile({ - path: "/test.txt", - content: "test", - sessionId: "test-session", - }), - ).rejects.toThrow(); - - // Test error handling in agent->client direction - await expect( - agentConnection.newSession({ - cwd: "/test", - mcpServers: [], - }), - ).rejects.toThrow(); - }); - - it("handles concurrent requests", async () => { - let requestCount = 0; - - // Create client - class TestClient implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - requestCount++; - const currentCount = requestCount; - await new Promise((resolve) => setTimeout(resolve, 40)); - console.log(`Write request ${currentCount} completed`); - return {}; - } - async readTextFile( - params: ReadTextFileRequest, - ): Promise { - return { content: `Content of ${params.path}` }; - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(_: SessionNotification): Promise { - // no-op - } - } - - // Create agent - class TestAgent implements Agent { - async initialize(_: InitializeRequest): Promise { - return { - protocolVersion: 1, - agentCapabilities: { loadSession: false }, - authMethods: [], - }; - } - - async newSession(_: NewSessionRequest): Promise { - return { - sessionId: "test-session", - }; - } - async loadSession(_: LoadSessionRequest): Promise { - return {}; - } - async authenticate(_: AuthenticateRequest): Promise { - // no-op - } - async prompt(_: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(_: CancelNotification): Promise { - // no-op - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Send multiple concurrent requests - const promises = [ - clientConnection.writeTextFile({ - path: "/file1.txt", - content: "content1", - sessionId: "session1", - }), - clientConnection.writeTextFile({ - path: "/file2.txt", - content: "content2", - sessionId: "session1", - }), - clientConnection.writeTextFile({ - path: "/file3.txt", - content: "content3", - sessionId: "session1", - }), - ]; - - const results = await Promise.all(promises); - - // Verify all requests completed successfully - expect(results).toHaveLength(3); - expect(results[0]).toEqual({}); - expect(results[1]).toEqual({}); - expect(results[2]).toEqual({}); - expect(requestCount).toBe(3); - }); - - it("handles message ordering correctly", async () => { - const messageLog: string[] = []; - - // Create client - class TestClient implements Client { - async writeTextFile( - params: WriteTextFileRequest, - ): Promise { - messageLog.push(`writeTextFile called: ${params.path}`); - return {}; - } - async readTextFile( - params: ReadTextFileRequest, - ): Promise { - messageLog.push(`readTextFile called: ${params.path}`); - return { content: "test content" }; - } - async requestPermission( - params: RequestPermissionRequest, - ): Promise { - messageLog.push(`requestPermission called: ${params.toolCall.title}`); - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(params: SessionNotification): Promise { - messageLog.push("sessionUpdate called"); - } - } - - // Create agent - class TestAgent implements Agent { - async initialize(_: InitializeRequest): Promise { - return { - protocolVersion: 1, - agentCapabilities: { loadSession: false }, - authMethods: [], - }; - } - async newSession( - request: NewSessionRequest, - ): Promise { - messageLog.push(`newSession called: ${request.cwd}`); - return { - sessionId: "test-session", - }; - } - async loadSession( - params: LoadSessionRequest, - ): Promise { - messageLog.push(`loadSession called: ${params.sessionId}`); - return {}; - } - async authenticate(params: AuthenticateRequest): Promise { - messageLog.push(`authenticate called: ${params.methodId}`); - } - async prompt(params: PromptRequest): Promise { - messageLog.push(`prompt called: ${params.sessionId}`); - return { stopReason: "end_turn" }; - } - async cancel(params: CancelNotification): Promise { - messageLog.push(`cancelled called: ${params.sessionId}`); - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Send requests in specific order - await agentConnection.newSession({ - cwd: "/test", - mcpServers: [], - }); - await clientConnection.writeTextFile({ - path: "/test.txt", - content: "test", - sessionId: "test-session", - }); - await clientConnection.readTextFile({ - path: "/test.txt", - sessionId: "test-session", - }); - await clientConnection.requestPermission({ - sessionId: "test-session", - toolCall: { - title: "Execute command", - kind: "execute", - status: "pending", - toolCallId: "tool-123", - content: [ - { - type: "content", - content: { - type: "text", - text: "ls -la", - }, - }, - ], - }, - options: [ - { - kind: "allow_once", - name: "Allow", - optionId: "allow", - }, - { - kind: "reject_once", - name: "Reject", - optionId: "reject", - }, - ], - }); - - // Verify order - expect(messageLog).toEqual([ - "newSession called: /test", - "writeTextFile called: /test.txt", - "readTextFile called: /test.txt", - "requestPermission called: Execute command", - ]); - }); - - it("handles notifications correctly", async () => { - const notificationLog: string[] = []; - - // Create client - class TestClient implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - return {}; - } - async readTextFile( - _: ReadTextFileRequest, - ): Promise { - return { content: "test" }; - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(notification: SessionNotification): Promise { - if ( - notification.update && - "sessionUpdate" in notification.update && - notification.update.sessionUpdate === "agent_message_chunk" - ) { - notificationLog.push( - `agent message: ${(notification.update.content as any).text}`, - ); - } - } - } - - // Create agent - class TestAgent implements Agent { - async initialize(_: InitializeRequest): Promise { - return { - protocolVersion: 1, - agentCapabilities: { loadSession: false }, - authMethods: [], - }; - } - async newSession(_: NewSessionRequest): Promise { - return { - sessionId: "test-session", - }; - } - async loadSession(_: LoadSessionRequest): Promise { - return {}; - } - async authenticate(_: AuthenticateRequest): Promise { - // no-op - } - async prompt(_: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(params: CancelNotification): Promise { - notificationLog.push(`cancelled: ${params.sessionId}`); - } - } - - // Create shared instances - const testClient = () => new TestClient(); - const testAgent = () => new TestAgent(); - - // Set up connections - const agentConnection = new ClientSideConnection( - testClient, - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - testAgent, - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Send notifications - await clientConnection.sessionUpdate({ - sessionId: "test-session", - update: { - sessionUpdate: "agent_message_chunk", - content: { - type: "text", - text: "Hello from agent", - }, - }, - }); - - await agentConnection.cancel({ - sessionId: "test-session", - }); - - // Wait a bit for async handlers - await new Promise((resolve) => setTimeout(resolve, 50)); - - // Verify notifications were received - expect(notificationLog).toContain("agent message: Hello from agent"); - expect(notificationLog).toContain("cancelled: test-session"); - }); - - it("handles initialize method", async () => { - // Create client - class TestClient implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - return {}; - } - async readTextFile( - _: ReadTextFileRequest, - ): Promise { - return { content: "test" }; - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(_: SessionNotification): Promise { - // no-op - } - } - - // Create agent - class TestAgent implements Agent { - async initialize(params: InitializeRequest): Promise { - return { - protocolVersion: params.protocolVersion, - agentCapabilities: { loadSession: true }, - authMethods: [ - { - id: "oauth", - name: "OAuth", - description: "Authenticate with OAuth", - }, - ], - }; - } - async newSession(_: NewSessionRequest): Promise { - return { sessionId: "test-session" }; - } - async loadSession(_: LoadSessionRequest): Promise { - return {}; - } - async authenticate(_: AuthenticateRequest): Promise { - // no-op - } - async prompt(_: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(_: CancelNotification): Promise { - // no-op - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Test initialize request - const response = await agentConnection.initialize({ - protocolVersion: PROTOCOL_VERSION, - clientCapabilities: { - fs: { - readTextFile: false, - writeTextFile: false, - }, - }, - }); - - expect(response.protocolVersion).toBe(PROTOCOL_VERSION); - expect(response.agentCapabilities?.loadSession).toBe(true); - expect(response.authMethods).toHaveLength(1); - expect(response.authMethods?.[0].id).toBe("oauth"); - }); - - it("handles extension methods and notifications", async () => { - const extensionLog: string[] = []; - - // Create client with extension method support - class TestClient implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - return {}; - } - async readTextFile( - _: ReadTextFileRequest, - ): Promise { - return { content: "test" }; - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(_: SessionNotification): Promise { - // no-op - } - async extMethod( - method: string, - params: Record, - ): Promise> { - if (method === "example.com/ping") { - return { response: "pong", params }; - } - throw new Error(`Unknown method: ${method}`); - } - async extNotification( - method: string, - params: Record, - ): Promise { - extensionLog.push(`client extNotification: ${method}`); - } - } - - // Create agent with extension method support - class TestAgent implements Agent { - async initialize(_: InitializeRequest): Promise { - return { - protocolVersion: PROTOCOL_VERSION, - agentCapabilities: { loadSession: false }, - }; - } - async newSession(_: NewSessionRequest): Promise { - return { sessionId: "test-session" }; - } - async authenticate(_: AuthenticateRequest): Promise { - // no-op - } - async prompt(_: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(_: CancelNotification): Promise { - // no-op - } - async extMethod( - method: string, - params: Record, - ): Promise> { - if (method === "example.com/echo") { - return { echo: params }; - } - throw new Error(`Unknown method: ${method}`); - } - async extNotification( - method: string, - params: Record, - ): Promise { - extensionLog.push(`agent extNotification: ${method}`); - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Test agent calling client extension method - const clientResponse = await clientConnection.extMethod( - "example.com/ping", - { - data: "test", - }, - ); - expect(clientResponse).toEqual({ - response: "pong", - params: { data: "test" }, - }); - - // Test client calling agent extension method - const agentResponse = await agentConnection.extMethod("example.com/echo", { - message: "hello", - }); - expect(agentResponse).toEqual({ echo: { message: "hello" } }); - - // Test extension notifications - await clientConnection.extNotification("example.com/client/notify", { - info: "client notification", - }); - await agentConnection.extNotification("example.com/agent/notify", { - info: "agent notification", - }); - - // Wait a bit for async handlers - await new Promise((resolve) => setTimeout(resolve, 50)); - - // Verify notifications were logged - expect(extensionLog).toContain( - "client extNotification: example.com/client/notify", - ); - expect(extensionLog).toContain( - "agent extNotification: example.com/agent/notify", - ); - }); - - it("handles optional extension methods correctly", async () => { - // Create client WITHOUT extension methods - class TestClientWithoutExtensions implements Client { - async writeTextFile( - _: WriteTextFileRequest, - ): Promise { - return {}; - } - async readTextFile( - _: ReadTextFileRequest, - ): Promise { - return { content: "test" }; - } - async requestPermission( - _: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - }; - } - async sessionUpdate(_: SessionNotification): Promise { - // no-op - } - // Note: No extMethod or extNotification implemented - } - - // Create agent WITHOUT extension methods - class TestAgentWithoutExtensions implements Agent { - async initialize(_: InitializeRequest): Promise { - return { - protocolVersion: PROTOCOL_VERSION, - agentCapabilities: { loadSession: false }, - }; - } - async newSession(_: NewSessionRequest): Promise { - return { sessionId: "test-session" }; - } - async authenticate(_: AuthenticateRequest): Promise { - // no-op - } - async prompt(_: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(_: CancelNotification): Promise { - // no-op - } - // Note: No extMethod or extNotification implemented - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClientWithoutExtensions(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgentWithoutExtensions(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Test that calling extension methods on connections without them throws method not found - try { - await clientConnection.extMethod("example.com/ping", { data: "test" }); - expect.fail("Should have thrown method not found error"); - } catch (error: any) { - expect(error.code).toBe(-32601); // Method not found - expect(error.data.method).toBe("_example.com/ping"); // Should show full method name with underscore - } - - try { - await agentConnection.extMethod("example.com/echo", { message: "hello" }); - expect.fail("Should have thrown method not found error"); - } catch (error: any) { - expect(error.code).toBe(-32601); // Method not found - expect(error.data.method).toBe("_example.com/echo"); // Should show full method name with underscore - } - - // Notifications should be ignored when not implemented (no error thrown) - await clientConnection.extNotification("example.com/notify", { - info: "test", - }); - await agentConnection.extNotification("example.com/notify", { - info: "test", - }); - }); - - it("handles methods returning response objects with _meta or void", async () => { - // Create client that returns both response objects and void - class TestClient implements Client { - async writeTextFile( - params: WriteTextFileRequest, - ): Promise { - // Return response object with _meta - return { - _meta: { - timestamp: new Date().toISOString(), - version: "1.0.0", - }, - }; - } - async readTextFile( - params: ReadTextFileRequest, - ): Promise { - return { - content: "test content", - _meta: { - encoding: "utf-8", - }, - }; - } - async requestPermission( - params: RequestPermissionRequest, - ): Promise { - return { - outcome: { - outcome: "selected", - optionId: "allow", - }, - _meta: { - userId: "test-user", - }, - }; - } - async sessionUpdate(params: SessionNotification): Promise { - // Returns void - } - } - - // Create agent that returns both response objects and void - class TestAgent implements Agent { - async initialize(params: InitializeRequest): Promise { - return { - protocolVersion: params.protocolVersion, - agentCapabilities: { loadSession: true }, - _meta: { - agentVersion: "2.0.0", - }, - }; - } - async newSession(params: NewSessionRequest): Promise { - return { - sessionId: "test-session", - _meta: { - sessionType: "ephemeral", - }, - }; - } - async loadSession( - params: LoadSessionRequest, - ): Promise { - // Test returning minimal response - return {}; - } - async authenticate( - params: AuthenticateRequest, - ): Promise { - if (params.methodId === "none") { - // Test returning void - return; - } - // Test returning response with _meta - return { - _meta: { - authenticated: true, - method: params.methodId, - }, - }; - } - async prompt(params: PromptRequest): Promise { - return { stopReason: "end_turn" }; - } - async cancel(params: CancelNotification): Promise { - // Returns void - } - } - - // Set up connections - const agentConnection = new ClientSideConnection( - () => new TestClient(), - ndJsonStream(clientToAgent.writable, agentToClient.readable), - ); - - const clientConnection = new AgentSideConnection( - () => new TestAgent(), - ndJsonStream(agentToClient.writable, clientToAgent.readable), - ); - - // Test writeTextFile returns response with _meta - const writeResponse = await clientConnection.writeTextFile({ - path: "/test.txt", - content: "test", - sessionId: "test-session", - }); - expect(writeResponse).toEqual({ - _meta: { - timestamp: expect.any(String), - version: "1.0.0", - }, - }); - - // Test readTextFile returns response with content and _meta - const readResponse = await clientConnection.readTextFile({ - path: "/test.txt", - sessionId: "test-session", - }); - expect(readResponse.content).toBe("test content"); - expect(readResponse._meta).toEqual({ - encoding: "utf-8", - }); - - // Test initialize with _meta - const initResponse = await agentConnection.initialize({ - protocolVersion: PROTOCOL_VERSION, - clientCapabilities: {}, - }); - expect(initResponse._meta).toEqual({ - agentVersion: "2.0.0", - }); - - // Test authenticate returning void - const authResponseVoid = await agentConnection.authenticate({ - methodId: "none", - }); - expect(authResponseVoid).toEqual({}); - - // Test authenticate returning response with _meta - const authResponse = await agentConnection.authenticate({ - methodId: "oauth", - }); - expect(authResponse).toEqual({ - _meta: { - authenticated: true, - method: "oauth", - }, - }); - - // Test newSession with _meta - const sessionResponse = await agentConnection.newSession({ - cwd: "/test", - mcpServers: [], - }); - expect(sessionResponse._meta).toEqual({ - sessionType: "ephemeral", - }); - - // Test loadSession returning minimal response - const loadResponse = await agentConnection.loadSession({ - sessionId: "test-session", - mcpServers: [], - cwd: "/test", - }); - expect(loadResponse).toEqual({}); - }); -}); diff --git a/typescript/acp.ts b/typescript/acp.ts deleted file mode 100644 index e6263e4d..00000000 --- a/typescript/acp.ts +++ /dev/null @@ -1,1295 +0,0 @@ -import { z } from "zod"; -import * as schema from "./schema.js"; -export * from "./schema.js"; -export * from "./stream.js"; - -import type { Stream } from "./stream.js"; -import type { - AnyMessage, - AnyResponse, - Result, - ErrorResponse, - PendingResponse, - RequestHandler, - NotificationHandler, -} from "./jsonrpc.js"; - -/** - * An agent-side connection to a client. - * - * This class provides the agent's view of an ACP connection, allowing - * agents to communicate with clients. It implements the {@link Client} interface - * to provide methods for requesting permissions, accessing the file system, - * and sending session updates. - * - * See protocol docs: [Agent](https://agentclientprotocol.com/protocol/overview#agent) - */ -export class AgentSideConnection { - #connection: Connection; - - /** - * Creates a new agent-side connection to a client. - * - * This establishes the communication channel from the agent's perspective - * following the ACP specification. - * - * @param toAgent - A function that creates an Agent handler to process incoming client requests - * @param stream - The bidirectional message stream for communication. Typically created using - * {@link ndJsonStream} for stdio-based connections. - * - * See protocol docs: [Communication Model](https://agentclientprotocol.com/protocol/overview#communication-model) - */ - constructor(toAgent: (conn: AgentSideConnection) => Agent, stream: Stream) { - const agent = toAgent(this); - - const requestHandler = async ( - method: string, - params: unknown, - ): Promise => { - switch (method) { - case schema.AGENT_METHODS.initialize: { - const validatedParams = schema.initializeRequestSchema.parse(params); - return agent.initialize(validatedParams); - } - case schema.AGENT_METHODS.session_new: { - const validatedParams = schema.newSessionRequestSchema.parse(params); - return agent.newSession(validatedParams); - } - case schema.AGENT_METHODS.session_load: { - if (!agent.loadSession) { - throw RequestError.methodNotFound(method); - } - const validatedParams = schema.loadSessionRequestSchema.parse(params); - return agent.loadSession(validatedParams); - } - case schema.AGENT_METHODS.session_set_mode: { - if (!agent.setSessionMode) { - throw RequestError.methodNotFound(method); - } - const validatedParams = - schema.setSessionModeRequestSchema.parse(params); - const result = await agent.setSessionMode(validatedParams); - return result ?? {}; - } - case schema.AGENT_METHODS.authenticate: { - const validatedParams = - schema.authenticateRequestSchema.parse(params); - const result = await agent.authenticate(validatedParams); - return result ?? {}; - } - case schema.AGENT_METHODS.session_prompt: { - const validatedParams = schema.promptRequestSchema.parse(params); - return agent.prompt(validatedParams); - } - case schema.AGENT_METHODS.session_set_model: { - if (!agent.setSessionModel) { - throw RequestError.methodNotFound(method); - } - const validatedParams = - schema.setSessionModelRequestSchema.parse(params); - return agent.setSessionModel(validatedParams); - } - default: - if (method.startsWith("_")) { - if (!agent.extMethod) { - throw RequestError.methodNotFound(method); - } - return agent.extMethod( - method.substring(1), - params as Record, - ); - } - throw RequestError.methodNotFound(method); - } - }; - - const notificationHandler = async ( - method: string, - params: unknown, - ): Promise => { - switch (method) { - case schema.AGENT_METHODS.session_cancel: { - const validatedParams = schema.cancelNotificationSchema.parse(params); - return agent.cancel(validatedParams); - } - default: - if (method.startsWith("_")) { - if (!agent.extNotification) { - return; - } - return agent.extNotification( - method.substring(1), - params as Record, - ); - } - throw RequestError.methodNotFound(method); - } - }; - - this.#connection = new Connection( - requestHandler, - notificationHandler, - stream, - ); - } - - /** - * Handles session update notifications from the agent. - * - * This is a notification endpoint (no response expected) that sends - * real-time updates about session progress, including message chunks, - * tool calls, and execution plans. - * - * Note: Clients SHOULD continue accepting tool call updates even after - * sending a `session/cancel` notification, as the agent may send final - * updates before responding with the cancelled stop reason. - * - * See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-turn#3-agent-reports-output) - */ - async sessionUpdate(params: schema.SessionNotification): Promise { - return await this.#connection.sendNotification( - schema.CLIENT_METHODS.session_update, - params, - ); - } - - /** - * Requests permission from the user for a tool call operation. - * - * Called by the agent when it needs user authorization before executing - * a potentially sensitive operation. The client should present the options - * to the user and return their decision. - * - * If the client cancels the prompt turn via `session/cancel`, it MUST - * respond to this request with `RequestPermissionOutcome::Cancelled`. - * - * See protocol docs: [Requesting Permission](https://agentclientprotocol.com/protocol/tool-calls#requesting-permission) - */ - async requestPermission( - params: schema.RequestPermissionRequest, - ): Promise { - return await this.#connection.sendRequest( - schema.CLIENT_METHODS.session_request_permission, - params, - ); - } - - /** - * Reads content from a text file in the client's file system. - * - * Only available if the client advertises the `fs.readTextFile` capability. - * Allows the agent to access file contents within the client's environment. - * - * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) - */ - async readTextFile( - params: schema.ReadTextFileRequest, - ): Promise { - return await this.#connection.sendRequest( - schema.CLIENT_METHODS.fs_read_text_file, - params, - ); - } - - /** - * Writes content to a text file in the client's file system. - * - * Only available if the client advertises the `fs.writeTextFile` capability. - * Allows the agent to create or modify files within the client's environment. - * - * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) - */ - async writeTextFile( - params: schema.WriteTextFileRequest, - ): Promise { - return ( - (await this.#connection.sendRequest( - schema.CLIENT_METHODS.fs_write_text_file, - params, - )) ?? {} - ); - } - - /** - * Executes a command in a new terminal. - * - * Returns a `TerminalHandle` that can be used to get output, wait for exit, - * kill the command, or release the terminal. - * - * The terminal can also be embedded in tool calls by using its ID in - * `ToolCallContent` with type "terminal". - * - * @param params - The terminal creation parameters - * @returns A handle to control and monitor the terminal - */ - async createTerminal( - params: schema.CreateTerminalRequest, - ): Promise { - const response = await this.#connection.sendRequest< - schema.CreateTerminalRequest, - schema.CreateTerminalResponse - >(schema.CLIENT_METHODS.terminal_create, params); - - return new TerminalHandle( - response.terminalId, - params.sessionId, - this.#connection, - ); - } - - /** - * Extension method - * - * Allows the Agent to send an arbitrary request that is not part of the ACP spec. - */ - async extMethod( - method: string, - params: Record, - ): Promise> { - return await this.#connection.sendRequest(`_${method}`, params); - } - - /** - * Extension notification - * - * Allows the Agent to send an arbitrary notification that is not part of the ACP spec. - */ - async extNotification( - method: string, - params: Record, - ): Promise { - return await this.#connection.sendNotification(`_${method}`, params); - } -} - -/** - * Handle for controlling and monitoring a terminal created via `createTerminal`. - * - * Provides methods to: - * - Get current output without waiting - * - Wait for command completion - * - Kill the running command - * - Release terminal resources - * - * **Important:** Always call `release()` when done with the terminal to free resources. - - * The terminal supports async disposal via `Symbol.asyncDispose` for automatic cleanup. - - * You can use `await using` to ensure the terminal is automatically released when it - * goes out of scope. - */ -export class TerminalHandle { - #sessionId: string; - #connection: Connection; - - constructor( - public id: string, - sessionId: string, - conn: Connection, - ) { - this.#sessionId = sessionId; - this.#connection = conn; - } - - /** - * Gets the current terminal output without waiting for the command to exit. - */ - async currentOutput(): Promise { - return await this.#connection.sendRequest( - schema.CLIENT_METHODS.terminal_output, - { - sessionId: this.#sessionId, - terminalId: this.id, - }, - ); - } - - /** - * Waits for the terminal command to complete and returns its exit status. - */ - async waitForExit(): Promise { - return await this.#connection.sendRequest( - schema.CLIENT_METHODS.terminal_wait_for_exit, - { - sessionId: this.#sessionId, - terminalId: this.id, - }, - ); - } - - /** - * Kills the terminal command without releasing the terminal. - * - * The terminal remains valid after killing, allowing you to: - * - Get the final output with `currentOutput()` - * - Check the exit status - * - Release the terminal when done - * - * Useful for implementing timeouts or cancellation. - */ - async kill(): Promise { - return ( - (await this.#connection.sendRequest(schema.CLIENT_METHODS.terminal_kill, { - sessionId: this.#sessionId, - terminalId: this.id, - })) ?? {} - ); - } - - /** - * Releases the terminal and frees all associated resources. - * - * If the command is still running, it will be killed. - * After release, the terminal ID becomes invalid and cannot be used - * with other terminal methods. - * - * Tool calls that already reference this terminal will continue to - * display its output. - * - * **Important:** Always call this method when done with the terminal. - */ - async release(): Promise { - return ( - (await this.#connection.sendRequest( - schema.CLIENT_METHODS.terminal_release, - { - sessionId: this.#sessionId, - terminalId: this.id, - }, - )) ?? {} - ); - } - - async [Symbol.asyncDispose](): Promise { - await this.release(); - } -} - -/** - * A client-side connection to an agent. - * - * This class provides the client's view of an ACP connection, allowing - * clients (such as code editors) to communicate with agents. It implements - * the {@link Agent} interface to provide methods for initializing sessions, sending - * prompts, and managing the agent lifecycle. - * - * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) - */ -export class ClientSideConnection implements Agent { - #connection: Connection; - - /** - * Creates a new client-side connection to an agent. - * - * This establishes the communication channel between a client and agent - * following the ACP specification. - * - * @param toClient - A function that creates a Client handler to process incoming agent requests - * @param stream - The bidirectional message stream for communication. Typically created using - * {@link ndJsonStream} for stdio-based connections. - * - * See protocol docs: [Communication Model](https://agentclientprotocol.com/protocol/overview#communication-model) - */ - constructor(toClient: (agent: Agent) => Client, stream: Stream) { - const client = toClient(this); - - const requestHandler = async ( - method: string, - params: unknown, - ): Promise => { - switch (method) { - case schema.CLIENT_METHODS.fs_write_text_file: { - const validatedParams = - schema.writeTextFileRequestSchema.parse(params); - return client.writeTextFile?.(validatedParams); - } - case schema.CLIENT_METHODS.fs_read_text_file: { - const validatedParams = - schema.readTextFileRequestSchema.parse(params); - return client.readTextFile?.(validatedParams); - } - case schema.CLIENT_METHODS.session_request_permission: { - const validatedParams = - schema.requestPermissionRequestSchema.parse(params); - return client.requestPermission(validatedParams); - } - case schema.CLIENT_METHODS.terminal_create: { - const validatedParams = - schema.createTerminalRequestSchema.parse(params); - return client.createTerminal?.(validatedParams); - } - case schema.CLIENT_METHODS.terminal_output: { - const validatedParams = - schema.terminalOutputRequestSchema.parse(params); - return client.terminalOutput?.(validatedParams); - } - case schema.CLIENT_METHODS.terminal_release: { - const validatedParams = - schema.releaseTerminalRequestSchema.parse(params); - const result = await client.releaseTerminal?.(validatedParams); - return result ?? {}; - } - case schema.CLIENT_METHODS.terminal_wait_for_exit: { - const validatedParams = - schema.waitForTerminalExitRequestSchema.parse(params); - return client.waitForTerminalExit?.(validatedParams); - } - case schema.CLIENT_METHODS.terminal_kill: { - const validatedParams = - schema.killTerminalCommandRequestSchema.parse(params); - const result = await client.killTerminal?.(validatedParams); - return result ?? {}; - } - default: - // Handle extension methods (any method starting with '_') - if (method.startsWith("_")) { - const customMethod = method.substring(1); - if (!client.extMethod) { - throw RequestError.methodNotFound(method); - } - return client.extMethod( - customMethod, - params as Record, - ); - } - throw RequestError.methodNotFound(method); - } - }; - - const notificationHandler = async ( - method: string, - params: unknown, - ): Promise => { - switch (method) { - case schema.CLIENT_METHODS.session_update: { - const validatedParams = - schema.sessionNotificationSchema.parse(params); - return client.sessionUpdate(validatedParams); - } - default: - // Handle extension notifications (any method starting with '_') - if (method.startsWith("_")) { - const customMethod = method.substring(1); - if (!client.extNotification) { - return; - } - return client.extNotification( - customMethod, - params as Record, - ); - } - throw RequestError.methodNotFound(method); - } - }; - - this.#connection = new Connection( - requestHandler, - notificationHandler, - stream, - ); - } - - /** - * Establishes the connection with a client and negotiates protocol capabilities. - * - * This method is called once at the beginning of the connection to: - * - Negotiate the protocol version to use - * - Exchange capability information between client and agent - * - Determine available authentication methods - * - * The agent should respond with its supported protocol version and capabilities. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ - async initialize( - params: schema.InitializeRequest, - ): Promise { - return await this.#connection.sendRequest( - schema.AGENT_METHODS.initialize, - params, - ); - } - - /** - * Creates a new conversation session with the agent. - * - * Sessions represent independent conversation contexts with their own history and state. - * - * The agent should: - * - Create a new session context - * - Connect to any specified MCP servers - * - Return a unique session ID for future requests - * - * May return an `auth_required` error if the agent requires authentication. - * - * See protocol docs: [Session Setup](https://agentclientprotocol.com/protocol/session-setup) - */ - async newSession( - params: schema.NewSessionRequest, - ): Promise { - return await this.#connection.sendRequest( - schema.AGENT_METHODS.session_new, - params, - ); - } - - /** - * Loads an existing session to resume a previous conversation. - * - * This method is only available if the agent advertises the `loadSession` capability. - * - * The agent should: - * - Restore the session context and conversation history - * - Connect to the specified MCP servers - * - Stream the entire conversation history back to the client via notifications - * - * See protocol docs: [Loading Sessions](https://agentclientprotocol.com/protocol/session-setup#loading-sessions) - */ - async loadSession( - params: schema.LoadSessionRequest, - ): Promise { - return ( - (await this.#connection.sendRequest( - schema.AGENT_METHODS.session_load, - params, - )) ?? {} - ); - } - - /** - * Sets the operational mode for a session. - * - * Allows switching between different agent modes (e.g., "ask", "architect", "code") - * that affect system prompts, tool availability, and permission behaviors. - * - * The mode must be one of the modes advertised in `availableModes` during session - * creation or loading. Agents may also change modes autonomously and notify the - * client via `current_mode_update` notifications. - * - * This method can be called at any time during a session, whether the Agent is - * idle or actively generating a turn. - * - * See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) - */ - async setSessionMode( - params: schema.SetSessionModeRequest, - ): Promise { - return ( - (await this.#connection.sendRequest( - schema.AGENT_METHODS.session_set_mode, - params, - )) ?? {} - ); - } - - /** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Select a model for a given session. - */ - async setSessionModel( - params: schema.SetSessionModelRequest, - ): Promise { - return ( - (await this.#connection.sendRequest( - schema.AGENT_METHODS.session_set_mode, - params, - )) ?? {} - ); - } - - /** - * Authenticates the client using the specified authentication method. - * - * Called when the agent requires authentication before allowing session creation. - * The client provides the authentication method ID that was advertised during initialization. - * - * After successful authentication, the client can proceed to create sessions with - * `newSession` without receiving an `auth_required` error. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ - async authenticate( - params: schema.AuthenticateRequest, - ): Promise { - return ( - (await this.#connection.sendRequest( - schema.AGENT_METHODS.authenticate, - params, - )) ?? {} - ); - } - - /** - * Processes a user prompt within a session. - * - * This method handles the whole lifecycle of a prompt: - * - Receives user messages with optional context (files, images, etc.) - * - Processes the prompt using language models - * - Reports language model content and tool calls to the Clients - * - Requests permission to run tools - * - Executes any requested tool calls - * - Returns when the turn is complete with a stop reason - * - * See protocol docs: [Prompt Turn](https://agentclientprotocol.com/protocol/prompt-turn) - */ - async prompt(params: schema.PromptRequest): Promise { - return await this.#connection.sendRequest( - schema.AGENT_METHODS.session_prompt, - params, - ); - } - - /** - * Cancels ongoing operations for a session. - * - * This is a notification sent by the client to cancel an ongoing prompt turn. - * - * Upon receiving this notification, the Agent SHOULD: - * - Stop all language model requests as soon as possible - * - Abort all tool call invocations in progress - * - Send any pending `session/update` notifications - * - Respond to the original `session/prompt` request with `StopReason::Cancelled` - * - * See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation) - */ - async cancel(params: schema.CancelNotification): Promise { - return await this.#connection.sendNotification( - schema.AGENT_METHODS.session_cancel, - params, - ); - } - - /** - * Extension method - * - * Allows the Client to send an arbitrary request that is not part of the ACP spec. - */ - async extMethod( - method: string, - params: Record, - ): Promise> { - return await this.#connection.sendRequest(`_${method}`, params); - } - - /** - * Extension notification - * - * Allows the Client to send an arbitrary notification that is not part of the ACP spec. - */ - async extNotification( - method: string, - params: Record, - ): Promise { - return await this.#connection.sendNotification(`_${method}`, params); - } -} - -export type { AnyMessage } from "./jsonrpc.js"; - -class Connection { - #pendingResponses: Map = new Map(); - #nextRequestId: number = 0; - #requestHandler: RequestHandler; - #notificationHandler: NotificationHandler; - #stream: Stream; - #writeQueue: Promise = Promise.resolve(); - - constructor( - requestHandler: RequestHandler, - notificationHandler: NotificationHandler, - stream: Stream, - ) { - this.#requestHandler = requestHandler; - this.#notificationHandler = notificationHandler; - this.#stream = stream; - this.#receive(); - } - - async #receive() { - const reader = this.#stream.readable.getReader(); - try { - while (true) { - const { value: message, done } = await reader.read(); - if (done) { - break; - } - if (!message) { - continue; - } - - try { - this.#processMessage(message); - } catch (err) { - console.error( - "Unexpected error during message processing:", - message, - err, - ); - // Only send error response if the message had an id (was a request) - if ("id" in message && message.id !== undefined) { - this.#sendMessage({ - jsonrpc: "2.0", - id: message.id, - error: { - code: -32700, - message: "Parse error", - }, - }); - } - } - } - } finally { - reader.releaseLock(); - } - } - - async #processMessage(message: AnyMessage) { - if ("method" in message && "id" in message) { - // It's a request - const response = await this.#tryCallRequestHandler( - message.method, - message.params, - ); - if ("error" in response) { - console.error("Error handling request", message, response.error); - } - - await this.#sendMessage({ - jsonrpc: "2.0", - id: message.id, - ...response, - }); - } else if ("method" in message) { - // It's a notification - const response = await this.#tryCallNotificationHandler( - message.method, - message.params, - ); - if ("error" in response) { - console.error("Error handling notification", message, response.error); - } - } else if ("id" in message) { - // It's a response - this.#handleResponse(message); - } else { - console.error("Invalid message", { message }); - } - } - - async #tryCallRequestHandler( - method: string, - params: unknown, - ): Promise> { - try { - const result = await this.#requestHandler(method, params); - return { result: result ?? null }; - } catch (error: unknown) { - if (error instanceof RequestError) { - return error.toResult(); - } - - if (error instanceof z.ZodError) { - return RequestError.invalidParams(error.format()).toResult(); - } - - let details; - - if (error instanceof Error) { - details = error.message; - } else if ( - typeof error === "object" && - error != null && - "message" in error && - typeof error.message === "string" - ) { - details = error.message; - } - - try { - return RequestError.internalError( - details ? JSON.parse(details) : {}, - ).toResult(); - } catch (_err) { - return RequestError.internalError({ details }).toResult(); - } - } - } - - async #tryCallNotificationHandler( - method: string, - params: unknown, - ): Promise> { - try { - await this.#notificationHandler(method, params); - return { result: null }; - } catch (error: unknown) { - if (error instanceof RequestError) { - return error.toResult(); - } - - if (error instanceof z.ZodError) { - return RequestError.invalidParams(error.format()).toResult(); - } - - let details; - - if (error instanceof Error) { - details = error.message; - } else if ( - typeof error === "object" && - error != null && - "message" in error && - typeof error.message === "string" - ) { - details = error.message; - } - - try { - return RequestError.internalError( - details ? JSON.parse(details) : {}, - ).toResult(); - } catch (_err) { - return RequestError.internalError({ details }).toResult(); - } - } - } - - #handleResponse(response: AnyResponse) { - const pendingResponse = this.#pendingResponses.get(response.id); - if (pendingResponse) { - if ("result" in response) { - pendingResponse.resolve(response.result); - } else if ("error" in response) { - pendingResponse.reject(response.error); - } - this.#pendingResponses.delete(response.id); - } else { - console.error("Got response to unknown request", response.id); - } - } - - async sendRequest(method: string, params?: Req): Promise { - const id = this.#nextRequestId++; - const responsePromise = new Promise((resolve, reject) => { - this.#pendingResponses.set(id, { resolve, reject }); - }); - await this.#sendMessage({ jsonrpc: "2.0", id, method, params }); - return responsePromise as Promise; - } - - async sendNotification(method: string, params?: N): Promise { - await this.#sendMessage({ jsonrpc: "2.0", method, params }); - } - - async #sendMessage(message: AnyMessage) { - this.#writeQueue = this.#writeQueue - .then(async () => { - const writer = this.#stream.writable.getWriter(); - try { - await writer.write(message); - } finally { - writer.releaseLock(); - } - }) - .catch((error) => { - // Continue processing writes on error - console.error("ACP write error:", error); - }); - return this.#writeQueue; - } -} - -/** - * JSON-RPC error object. - * - * Represents an error that occurred during method execution, following the - * JSON-RPC 2.0 error object specification with optional additional data. - * - * See protocol docs: [JSON-RPC Error Object](https://www.jsonrpc.org/specification#error_object) - */ -export class RequestError extends Error { - data?: unknown; - - constructor( - public code: number, - message: string, - data?: unknown, - ) { - super(message); - this.name = "RequestError"; - this.data = data; - } - - /** - * Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text. - */ - static parseError(data?: object): RequestError { - return new RequestError(-32700, "Parse error", data); - } - - /** - * The JSON sent is not a valid Request object. - */ - static invalidRequest(data?: object): RequestError { - return new RequestError(-32600, "Invalid request", data); - } - - /** - * The method does not exist / is not available. - */ - static methodNotFound(method: string): RequestError { - return new RequestError(-32601, "Method not found", { method }); - } - - /** - * Invalid method parameter(s). - */ - static invalidParams(data?: object): RequestError { - return new RequestError(-32602, "Invalid params", data); - } - - /** - * Internal JSON-RPC error. - */ - static internalError(data?: object): RequestError { - return new RequestError(-32603, "Internal error", data); - } - - /** - * Authentication required. - */ - static authRequired(data?: object): RequestError { - return new RequestError(-32000, "Authentication required", data); - } - - /** - * Resource, such as a file, was not found - */ - static resourceNotFound(uri?: string): RequestError { - return new RequestError(-32002, "Resource not found", uri && { uri }); - } - - toResult(): Result { - return { - error: { - code: this.code, - message: this.message, - data: this.data, - }, - }; - } - - toErrorResponse(): ErrorResponse { - return { - code: this.code, - message: this.message, - data: this.data, - }; - } -} - -/** - * The Client interface defines the interface that ACP-compliant clients must implement. - * - * Clients are typically code editors (IDEs, text editors) that provide the interface - * between users and AI agents. They manage the environment, handle user interactions, - * and control access to resources. - */ -export interface Client { - /** - * Requests permission from the user for a tool call operation. - * - * Called by the agent when it needs user authorization before executing - * a potentially sensitive operation. The client should present the options - * to the user and return their decision. - * - * If the client cancels the prompt turn via `session/cancel`, it MUST - * respond to this request with `RequestPermissionOutcome::Cancelled`. - * - * See protocol docs: [Requesting Permission](https://agentclientprotocol.com/protocol/tool-calls#requesting-permission) - */ - requestPermission( - params: schema.RequestPermissionRequest, - ): Promise; - /** - * Handles session update notifications from the agent. - * - * This is a notification endpoint (no response expected) that receives - * real-time updates about session progress, including message chunks, - * tool calls, and execution plans. - * - * Note: Clients SHOULD continue accepting tool call updates even after - * sending a `session/cancel` notification, as the agent may send final - * updates before responding with the cancelled stop reason. - * - * See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-turn#3-agent-reports-output) - */ - sessionUpdate(params: schema.SessionNotification): Promise; - /** - * Writes content to a text file in the client's file system. - * - * Only available if the client advertises the `fs.writeTextFile` capability. - * Allows the agent to create or modify files within the client's environment. - * - * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) - */ - writeTextFile?( - params: schema.WriteTextFileRequest, - ): Promise; - /** - * Reads content from a text file in the client's file system. - * - * Only available if the client advertises the `fs.readTextFile` capability. - * Allows the agent to access file contents within the client's environment. - * - * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) - */ - readTextFile?( - params: schema.ReadTextFileRequest, - ): Promise; - - /** - * Creates a new terminal to execute a command. - * - * Only available if the `terminal` capability is set to `true`. - * - * The Agent must call `releaseTerminal` when done with the terminal - * to free resources. - - * @see {@link https://agentclientprotocol.com/protocol/terminals | Terminal Documentation} - */ - createTerminal?( - params: schema.CreateTerminalRequest, - ): Promise; - - /** - * Gets the current output and exit status of a terminal. - * - * Returns immediately without waiting for the command to complete. - * If the command has already exited, the exit status is included. - * - * @see {@link https://agentclientprotocol.com/protocol/terminals#getting-output | Getting Terminal Output} - */ - terminalOutput?( - params: schema.TerminalOutputRequest, - ): Promise; - - /** - * Releases a terminal and frees all associated resources. - * - * The command is killed if it hasn't exited yet. After release, - * the terminal ID becomes invalid for all other terminal methods. - * - * Tool calls that already contain the terminal ID continue to - * display its output. - * - * @see {@link https://agentclientprotocol.com/protocol/terminals#releasing-terminals | Releasing Terminals} - */ - releaseTerminal?( - params: schema.ReleaseTerminalRequest, - ): Promise; - - /** - * Waits for a terminal command to exit and returns its exit status. - * - * This method returns once the command completes, providing the - * exit code and/or signal that terminated the process. - * - * @see {@link https://agentclientprotocol.com/protocol/terminals#waiting-for-exit | Waiting for Exit} - */ - waitForTerminalExit?( - params: schema.WaitForTerminalExitRequest, - ): Promise; - - /** - * Kills a terminal command without releasing the terminal. - * - * While `releaseTerminal` also kills the command, this method keeps - * the terminal ID valid so it can be used with other methods. - * - * Useful for implementing command timeouts that terminate the command - * and then retrieve the final output. - * - * Note: Call `releaseTerminal` when the terminal is no longer needed. - * - * @see {@link https://agentclientprotocol.com/protocol/terminals#killing-commands | Killing Commands} - */ - killTerminal?( - params: schema.KillTerminalCommandRequest, - ): Promise; - - /** - * Extension method - * - * Allows the Agent to send an arbitrary request that is not part of the ACP spec. - * - * To help avoid conflicts, it's a good practice to prefix extension - * methods with a unique identifier such as domain name. - */ - extMethod?( - method: string, - params: Record, - ): Promise>; - - /** - * Extension notification - * - * Allows the Agent to send an arbitrary notification that is not part of the ACP spec. - */ - extNotification?( - method: string, - params: Record, - ): Promise; -} - -/** - * The Agent interface defines the interface that all ACP-compliant agents must implement. - * - * Agents are programs that use generative AI to autonomously modify code. They handle - * requests from clients and execute tasks using language models and tools. - */ -export interface Agent { - /** - * Establishes the connection with a client and negotiates protocol capabilities. - * - * This method is called once at the beginning of the connection to: - * - Negotiate the protocol version to use - * - Exchange capability information between client and agent - * - Determine available authentication methods - * - * The agent should respond with its supported protocol version and capabilities. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ - initialize( - params: schema.InitializeRequest, - ): Promise; - /** - * Creates a new conversation session with the agent. - * - * Sessions represent independent conversation contexts with their own history and state. - * - * The agent should: - * - Create a new session context - * - Connect to any specified MCP servers - * - Return a unique session ID for future requests - * - * May return an `auth_required` error if the agent requires authentication. - * - * See protocol docs: [Session Setup](https://agentclientprotocol.com/protocol/session-setup) - */ - newSession( - params: schema.NewSessionRequest, - ): Promise; - /** - * Loads an existing session to resume a previous conversation. - * - * This method is only available if the agent advertises the `loadSession` capability. - * - * The agent should: - * - Restore the session context and conversation history - * - Connect to the specified MCP servers - * - Stream the entire conversation history back to the client via notifications - * - * See protocol docs: [Loading Sessions](https://agentclientprotocol.com/protocol/session-setup#loading-sessions) - */ - loadSession?( - params: schema.LoadSessionRequest, - ): Promise; - /** - * Sets the operational mode for a session. - * - * Allows switching between different agent modes (e.g., "ask", "architect", "code") - * that affect system prompts, tool availability, and permission behaviors. - * - * The mode must be one of the modes advertised in `availableModes` during session - * creation or loading. Agents may also change modes autonomously and notify the - * client via `current_mode_update` notifications. - * - * This method can be called at any time during a session, whether the Agent is - * idle or actively generating a turn. - * - * See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) - */ - setSessionMode?( - params: schema.SetSessionModeRequest, - ): Promise; - /** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Select a model for a given session. - */ - setSessionModel?( - params: schema.SetSessionModelRequest, - ): Promise; - /** - * Authenticates the client using the specified authentication method. - * - * Called when the agent requires authentication before allowing session creation. - * The client provides the authentication method ID that was advertised during initialization. - * - * After successful authentication, the client can proceed to create sessions with - * `newSession` without receiving an `auth_required` error. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ - authenticate( - params: schema.AuthenticateRequest, - ): Promise; - /** - * Processes a user prompt within a session. - * - * This method handles the whole lifecycle of a prompt: - * - Receives user messages with optional context (files, images, etc.) - * - Processes the prompt using language models - * - Reports language model content and tool calls to the Clients - * - Requests permission to run tools - * - Executes any requested tool calls - * - Returns when the turn is complete with a stop reason - * - * See protocol docs: [Prompt Turn](https://agentclientprotocol.com/protocol/prompt-turn) - */ - prompt(params: schema.PromptRequest): Promise; - /** - * Cancels ongoing operations for a session. - * - * This is a notification sent by the client to cancel an ongoing prompt turn. - * - * Upon receiving this notification, the Agent SHOULD: - * - Stop all language model requests as soon as possible - * - Abort all tool call invocations in progress - * - Send any pending `session/update` notifications - * - Respond to the original `session/prompt` request with `StopReason::Cancelled` - * - * See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation) - */ - cancel(params: schema.CancelNotification): Promise; - - /** - * Extension method - * - * Allows the Client to send an arbitrary request that is not part of the ACP spec. - * - * To help avoid conflicts, it's a good practice to prefix extension - * methods with a unique identifier such as domain name. - */ - extMethod?( - method: string, - params: Record, - ): Promise>; - - /** - * Extension notification - * - * Allows the Client to send an arbitrary notification that is not part of the ACP spec. - */ - extNotification?( - method: string, - params: Record, - ): Promise; -} diff --git a/typescript/examples/README.md b/typescript/examples/README.md deleted file mode 100644 index 8edf47a2..00000000 --- a/typescript/examples/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# ACP TypeScript Examples - -This directory contains examples using the [ACP](https://agentclientprotocol.com) library for TypeScript: - -- [`agent.ts`](./agent.ts) - A minimal agent implementation that simulates LLM interaction -- [`client.ts`](./client.ts) - A minimal client implementation that spawns the [`agent.ts`](./agent.ts) as a subprocess - -## Running the Agent - -### In Zed - -While minimal, [`agent.ts`](./agent.ts) implements a compliant [ACP](https://agentclientprotocol.com) Agent. This means we can connect to it from an ACP client like [Zed](https://zed.dev)! - -1. Clone this repo - -```sh -$ git clone https://github.com/agentclientprotocol/agent-client-protocol.git -``` - -2. Add the following at the root of your [Zed](https://zed.dev) settings: - -```json - "agent_servers": { - "Example Agent": { - "command": "npx", - "args": [ - "tsx", - "/path/to/agent-client-protocol/typescript/examples/agent.ts" - ] - } -``` - -❕ Make sure to replace `/path/to/agent-client-protocol` with the path to your clone of this repository. - -Note: This configuration assumes you have [npx](https://docs.npmjs.com/cli/v8/commands/npx) in your `PATH`. - -3. Run the `acp: open acp logs` action from the command palette (⌘⇧P on macOS, ctrl-shift-p on Windows/Linux) to see the messages exchanged between the example agent and Zed. - -4. Then open the Agent Panel, and click "New Example Agent Thread" from the `+` menu on the top-right. - -![Agent menu](./img/menu.png) - -5. Finally, send a message and see the Agent respond! - -![Final state](./img/final.png) - -### By itself - -You can also run the Agent directly and send messages to it: - -```bash -npx tsx typescript/examples/agent.ts -``` - -Paste this into your terminal and press enter: - -```json -{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":1}} -``` - -You should see it respond with something like: - -```json -{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":1,"agentCapabilities":{"loadSession":false}}} -``` - -From there, you can try making a [new session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) and [sending a prompt](https://agentclientprotocol.com/protocol/prompt-turn#1-user-message). - -## Running the Client - -Run the client example from the root directory: - -```bash -npx tsx typescript/examples/client.ts -``` - -This client will spawn the example agent as a subprocess, send a message, and print the content it receives from it. diff --git a/typescript/examples/agent.ts b/typescript/examples/agent.ts deleted file mode 100644 index e3d0fcd1..00000000 --- a/typescript/examples/agent.ts +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env node - -import * as acp from "../acp.js"; -import { Readable, Writable } from "node:stream"; - -interface AgentSession { - pendingPrompt: AbortController | null; -} - -class ExampleAgent implements acp.Agent { - private connection: acp.AgentSideConnection; - private sessions: Map; - - constructor(connection: acp.AgentSideConnection) { - this.connection = connection; - this.sessions = new Map(); - } - - async initialize( - params: acp.InitializeRequest, - ): Promise { - return { - protocolVersion: acp.PROTOCOL_VERSION, - agentCapabilities: { - loadSession: false, - }, - }; - } - - async newSession( - params: acp.NewSessionRequest, - ): Promise { - const sessionId = Math.random().toString(36).substring(2); - - this.sessions.set(sessionId, { - pendingPrompt: null, - }); - - return { - sessionId, - }; - } - - async authenticate( - params: acp.AuthenticateRequest, - ): Promise { - // No auth needed - return empty response - return {}; - } - - async setSessionMode( - params: acp.SetSessionModeRequest, - ): Promise { - // Session mode changes not implemented in this example - return {}; - } - - async prompt(params: acp.PromptRequest): Promise { - const session = this.sessions.get(params.sessionId); - - if (!session) { - throw new Error(`Session ${params.sessionId} not found`); - } - - session.pendingPrompt?.abort(); - session.pendingPrompt = new AbortController(); - - try { - await this.simulateTurn(params.sessionId, session.pendingPrompt.signal); - } catch (err) { - if (session.pendingPrompt.signal.aborted) { - return { stopReason: "cancelled" }; - } - - throw err; - } - - session.pendingPrompt = null; - - return { - stopReason: "end_turn", - }; - } - - private async simulateTurn( - sessionId: string, - abortSignal: AbortSignal, - ): Promise { - // Send initial text chunk - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "agent_message_chunk", - content: { - type: "text", - text: "I'll help you with that. Let me start by reading some files to understand the current situation.", - }, - }, - }); - - await this.simulateModelInteraction(abortSignal); - - // Send a tool call that doesn't need permission - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "tool_call", - toolCallId: "call_1", - title: "Reading project files", - kind: "read", - status: "pending", - locations: [{ path: "/project/README.md" }], - rawInput: { path: "/project/README.md" }, - }, - }); - - await this.simulateModelInteraction(abortSignal); - - // Update tool call to completed - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "tool_call_update", - toolCallId: "call_1", - status: "completed", - content: [ - { - type: "content", - content: { - type: "text", - text: "# My Project\n\nThis is a sample project...", - }, - }, - ], - rawOutput: { content: "# My Project\n\nThis is a sample project..." }, - }, - }); - - await this.simulateModelInteraction(abortSignal); - - // Send more text - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "agent_message_chunk", - content: { - type: "text", - text: " Now I understand the project structure. I need to make some changes to improve it.", - }, - }, - }); - - await this.simulateModelInteraction(abortSignal); - - // Send a tool call that DOES need permission - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "tool_call", - toolCallId: "call_2", - title: "Modifying critical configuration file", - kind: "edit", - status: "pending", - locations: [{ path: "/project/config.json" }], - rawInput: { - path: "/project/config.json", - content: '{"database": {"host": "new-host"}}', - }, - }, - }); - - // Request permission for the sensitive operation - const permissionResponse = await this.connection.requestPermission({ - sessionId, - toolCall: { - toolCallId: "call_2", - title: "Modifying critical configuration file", - kind: "edit", - status: "pending", - locations: [{ path: "/home/user/project/config.json" }], - rawInput: { - path: "/home/user/project/config.json", - content: '{"database": {"host": "new-host"}}', - }, - }, - options: [ - { - kind: "allow_once", - name: "Allow this change", - optionId: "allow", - }, - { - kind: "reject_once", - name: "Skip this change", - optionId: "reject", - }, - ], - }); - - if (permissionResponse.outcome.outcome === "cancelled") { - return; - } - - switch (permissionResponse.outcome.optionId) { - case "allow": { - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "tool_call_update", - toolCallId: "call_2", - status: "completed", - rawOutput: { success: true, message: "Configuration updated" }, - }, - }); - - await this.simulateModelInteraction(abortSignal); - - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "agent_message_chunk", - content: { - type: "text", - text: " Perfect! I've successfully updated the configuration. The changes have been applied.", - }, - }, - }); - break; - } - case "reject": { - await this.simulateModelInteraction(abortSignal); - - await this.connection.sessionUpdate({ - sessionId, - update: { - sessionUpdate: "agent_message_chunk", - content: { - type: "text", - text: " I understand you prefer not to make that change. I'll skip the configuration update.", - }, - }, - }); - break; - } - default: - throw new Error( - `Unexpected permission outcome ${permissionResponse.outcome}`, - ); - } - } - - private simulateModelInteraction(abortSignal: AbortSignal): Promise { - return new Promise((resolve, reject) => - setTimeout(() => { - // In a real agent, you'd pass this abort signal to the LLM client - if (abortSignal.aborted) { - reject(); - } else { - resolve(); - } - }, 1000), - ); - } - - async cancel(params: acp.CancelNotification): Promise { - this.sessions.get(params.sessionId)?.pendingPrompt?.abort(); - } -} - -const input = Writable.toWeb(process.stdout); -const output = Readable.toWeb(process.stdin) as ReadableStream; - -const stream = acp.ndJsonStream(input, output); -new acp.AgentSideConnection((conn) => new ExampleAgent(conn), stream); diff --git a/typescript/examples/client.ts b/typescript/examples/client.ts deleted file mode 100644 index 68bc9daf..00000000 --- a/typescript/examples/client.ts +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env node - -import { spawn } from "node:child_process"; -import { fileURLToPath } from "node:url"; -import { dirname, join } from "node:path"; -import { Writable, Readable } from "node:stream"; -import readline from "node:readline/promises"; - -import * as acp from "../acp.js"; - -class ExampleClient implements acp.Client { - async requestPermission( - params: acp.RequestPermissionRequest, - ): Promise { - console.log(`\n🔐 Permission requested: ${params.toolCall.title}`); - - console.log(`\nOptions:`); - params.options.forEach((option, index) => { - console.log(` ${index + 1}. ${option.name} (${option.kind})`); - }); - - while (true) { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - let answer = await rl.question("\nChoose an option: "); - const trimmedAnswer = answer.trim(); - - const optionIndex = parseInt(trimmedAnswer) - 1; - if (optionIndex >= 0 && optionIndex < params.options.length) { - return { - outcome: { - outcome: "selected", - optionId: params.options[optionIndex].optionId, - }, - }; - } else { - console.log("Invalid option. Please try again."); - } - } - } - - async sessionUpdate(params: acp.SessionNotification): Promise { - const update = params.update; - - switch (update.sessionUpdate) { - case "agent_message_chunk": - if (update.content.type === "text") { - console.log(update.content.text); - } else { - console.log(`[${update.content.type}]`); - } - break; - case "tool_call": - console.log(`\n🔧 ${update.title} (${update.status})`); - break; - case "tool_call_update": - console.log( - `\n🔧 Tool call \`${update.toolCallId}\` updated: ${update.status}\n`, - ); - break; - case "plan": - case "agent_thought_chunk": - case "user_message_chunk": - console.log(`[${update.sessionUpdate}]`); - break; - } - } - - async writeTextFile( - params: acp.WriteTextFileRequest, - ): Promise { - console.error( - "[Client] Write text file called with:", - JSON.stringify(params, null, 2), - ); - - return {}; - } - - async readTextFile( - params: acp.ReadTextFileRequest, - ): Promise { - console.error( - "[Client] Read text file called with:", - JSON.stringify(params, null, 2), - ); - - return { - content: "Mock file content", - }; - } -} - -async function main() { - // Get the current file's directory to find agent.ts - const __filename = fileURLToPath(import.meta.url); - const __dirname = dirname(__filename); - const agentPath = join(__dirname, "agent.ts"); - - // Spawn the agent as a subprocess using tsx - const agentProcess = spawn("npx", ["tsx", agentPath], { - stdio: ["pipe", "pipe", "inherit"], - }); - - // Create streams to communicate with the agent - const input = Writable.toWeb(agentProcess.stdin!); - const output = Readable.toWeb( - agentProcess.stdout!, - ) as ReadableStream; - - // Create the client connection - const client = new ExampleClient(); - const stream = acp.ndJsonStream(input, output); - const connection = new acp.ClientSideConnection((_agent) => client, stream); - - try { - // Initialize the connection - const initResult = await connection.initialize({ - protocolVersion: acp.PROTOCOL_VERSION, - clientCapabilities: { - fs: { - readTextFile: true, - writeTextFile: true, - }, - }, - }); - - console.log( - `✅ Connected to agent (protocol v${initResult.protocolVersion})`, - ); - - // Create a new session - const sessionResult = await connection.newSession({ - cwd: process.cwd(), - mcpServers: [], - }); - - console.log(`📝 Created session: ${sessionResult.sessionId}`); - console.log(`💬 User: Hello, agent!\n`); - process.stdout.write(" "); - - // Send a test prompt - const promptResult = await connection.prompt({ - sessionId: sessionResult.sessionId, - prompt: [ - { - type: "text", - text: "Hello, agent!", - }, - ], - }); - - console.log(`\n\n✅ Agent completed with: ${promptResult.stopReason}`); - } catch (error) { - console.error("[Client] Error:", error); - } finally { - agentProcess.kill(); - process.exit(0); - } -} - -main().catch(console.error); diff --git a/typescript/examples/img/final.png b/typescript/examples/img/final.png deleted file mode 100644 index ea173c99..00000000 Binary files a/typescript/examples/img/final.png and /dev/null differ diff --git a/typescript/examples/img/menu.png b/typescript/examples/img/menu.png deleted file mode 100644 index 737303c2..00000000 Binary files a/typescript/examples/img/menu.png and /dev/null differ diff --git a/typescript/generate.js b/typescript/generate.js deleted file mode 100644 index d8d54102..00000000 --- a/typescript/generate.js +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env node - -import { compile } from "json-schema-to-typescript"; -import { generate } from "ts-to-zod"; -import fs from "fs"; - -const jsonSchema = JSON.parse(fs.readFileSync("./schema/schema.json", "utf8")); -const metadata = JSON.parse(fs.readFileSync("./schema/meta.json", "utf8")); - -const tsSrc = await compile(jsonSchema, "Agent Client Protocol", { - additionalProperties: false, - bannerComment: false, -}); - -const zodGenerator = generate({ - sourceText: tsSrc, - bannerComment: false, - keepComments: false, -}); -const zodSchemas = zodGenerator.getZodSchemasFile(); - -const schemaTs = ` -export const AGENT_METHODS = ${JSON.stringify(metadata.agentMethods, null, 2)} as const; - -export const CLIENT_METHODS = ${JSON.stringify(metadata.clientMethods, null, 2)} as const; - -export const PROTOCOL_VERSION = ${metadata.version}; - -import { z } from "zod"; - -${markSpecificTypesAsInternal(tsSrc)} - -${markZodSchemasAsInternal(fixGeneratedZod(zodSchemas))} -`; - -function fixGeneratedZod(src) { - return src - .replace(`// Generated by ts-to-zod\nimport { z } from "zod";\n`, "") - .replace(`import * as generated from "./zod";\n`, "") - .replace(/typeof generated./g, "typeof "); -} - -function markSpecificTypesAsInternal(src) { - const typesToExclude = [ - "AgentRequest", - "AgentResponse", - "AgentNotification", - "ClientRequest", - "ClientResponse", - "ClientNotification", - ]; - - let result = src; - - for (const typeName of typesToExclude) { - const regex = new RegExp(`(export type ${typeName}\\b)`, "g"); - result = result.replace(regex, "/** @internal */\n$1"); - } - - return result; -} - -function markZodSchemasAsInternal(src) { - // Mark all zod schemas as internal - they're implementation details - return src.replace(/(export const \w+Schema = )/g, "/** @internal */\n$1"); -} - -fs.writeFileSync("typescript/schema.ts", schemaTs, "utf8"); diff --git a/typescript/jsonrpc.ts b/typescript/jsonrpc.ts deleted file mode 100644 index b5d8214d..00000000 --- a/typescript/jsonrpc.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * JSON-RPC 2.0 type definitions for internal use. - */ - -export type AnyMessage = AnyRequest | AnyResponse | AnyNotification; - -export type AnyRequest = { - jsonrpc: "2.0"; - id: string | number | null; - method: string; - params?: unknown; -}; - -export type AnyResponse = { - jsonrpc: "2.0"; - id: string | number | null; -} & Result; - -export type AnyNotification = { - jsonrpc: "2.0"; - method: string; - params?: unknown; -}; - -export type Result = - | { - result: T; - } - | { - error: ErrorResponse; - }; - -export type ErrorResponse = { - code: number; - message: string; - data?: unknown; -}; - -export type PendingResponse = { - resolve: (response: unknown) => void; - reject: (error: ErrorResponse) => void; -}; - -export type RequestHandler = ( - method: string, - params: unknown, -) => Promise; -export type NotificationHandler = ( - method: string, - params: unknown, -) => Promise; diff --git a/typescript/schema.ts b/typescript/schema.ts deleted file mode 100644 index 4bd3b6dc..00000000 --- a/typescript/schema.ts +++ /dev/null @@ -1,2446 +0,0 @@ -export const AGENT_METHODS = { - authenticate: "authenticate", - initialize: "initialize", - session_cancel: "session/cancel", - session_load: "session/load", - session_new: "session/new", - session_prompt: "session/prompt", - session_set_mode: "session/set_mode", - session_set_model: "session/set_model", -} as const; - -export const CLIENT_METHODS = { - fs_read_text_file: "fs/read_text_file", - fs_write_text_file: "fs/write_text_file", - session_request_permission: "session/request_permission", - session_update: "session/update", - terminal_create: "terminal/create", - terminal_kill: "terminal/kill", - terminal_output: "terminal/output", - terminal_release: "terminal/release", - terminal_wait_for_exit: "terminal/wait_for_exit", -} as const; - -export const PROTOCOL_VERSION = 1; - -import { z } from "zod"; - -export type AgentClientProtocol = - | ClientRequest - | ClientResponse - | ClientNotification - | AgentRequest - | AgentResponse - | AgentNotification; -/** - * All possible requests that an agent can send to a client. - * - * This enum is used internally for routing RPC requests. You typically won't need - * to use this directly - instead, use the methods on the [`Client`] trait. - * - * This enum encompasses all method calls from agent to client. - */ -/** @internal */ -export type ClientRequest = - | WriteTextFileRequest - | ReadTextFileRequest - | RequestPermissionRequest - | CreateTerminalRequest - | TerminalOutputRequest - | ReleaseTerminalRequest - | WaitForTerminalExitRequest - | KillTerminalCommandRequest - | ExtMethodRequest; -/** - * Content produced by a tool call. - * - * Tool calls can produce different types of content including - * standard content blocks (text, images) or file diffs. - * - * See protocol docs: [Content](https://agentclientprotocol.com/protocol/tool-calls#content) - */ -export type ToolCallContent = - | { - /** - * Content blocks represent displayable information in the Agent Client Protocol. - * - * They provide a structured way to handle various types of user-facing content—whether - * it's text from language models, images for analysis, or embedded resources for context. - * - * Content blocks appear in: - * - User prompts sent via `session/prompt` - * - Language model output streamed through `session/update` notifications - * - Progress updates and results from tool calls - * - * This structure is compatible with the Model Context Protocol (MCP), enabling - * agents to seamlessly forward content from MCP tool outputs without transformation. - * - * See protocol docs: [Content](https://agentclientprotocol.com/protocol/content) - */ - content: - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - text: string; - type: "text"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - data: string; - mimeType: string; - type: "image"; - uri?: string | null; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - data: string; - mimeType: string; - type: "audio"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - description?: string | null; - mimeType?: string | null; - name: string; - size?: number | null; - title?: string | null; - type: "resource_link"; - uri: string; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - resource: EmbeddedResourceResource; - type: "resource"; - }; - type: "content"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The new content after modification. - */ - newText: string; - /** - * The original content (None for new files). - */ - oldText?: string | null; - /** - * The file path being modified. - */ - path: string; - type: "diff"; - } - | { - terminalId: string; - type: "terminal"; - }; -/** - * The sender or recipient of messages and data in a conversation. - */ -export type Role = "assistant" | "user"; -/** - * Resource content that can be embedded in a message. - */ -export type EmbeddedResourceResource = - | TextResourceContents - | BlobResourceContents; -/** - * Categories of tools that can be invoked. - * - * Tool kinds help clients choose appropriate icons and optimize how they - * display tool execution progress. - * - * See protocol docs: [Creating](https://agentclientprotocol.com/protocol/tool-calls#creating) - */ -export type ToolKind = - | "read" - | "edit" - | "delete" - | "move" - | "search" - | "execute" - | "think" - | "fetch" - | "switch_mode" - | "other"; -/** - * Execution status of a tool call. - * - * Tool calls progress through different statuses during their lifecycle. - * - * See protocol docs: [Status](https://agentclientprotocol.com/protocol/tool-calls#status) - */ -export type ToolCallStatus = "pending" | "in_progress" | "completed" | "failed"; -/** - * All possible responses that a client can send to an agent. - * - * This enum is used internally for routing RPC responses. You typically won't need - * to use this directly - the responses are handled automatically by the connection. - * - * These are responses to the corresponding `AgentRequest` variants. - */ -/** @internal */ -export type ClientResponse = - | WriteTextFileResponse - | ReadTextFileResponse - | RequestPermissionResponse - | CreateTerminalResponse - | TerminalOutputResponse - | ReleaseTerminalResponse - | WaitForTerminalExitResponse - | KillTerminalResponse - | ExtMethodResponse; -/** - * All possible notifications that a client can send to an agent. - * - * This enum is used internally for routing RPC notifications. You typically won't need - * to use this directly - use the notification methods on the [`Agent`] trait instead. - * - * Notifications do not expect a response. - */ -/** @internal */ -export type ClientNotification = CancelNotification | ExtNotification; -/** - * All possible requests that a client can send to an agent. - * - * This enum is used internally for routing RPC requests. You typically won't need - * to use this directly - instead, use the methods on the [`Agent`] trait. - * - * This enum encompasses all method calls from client to agent. - */ -/** @internal */ -export type AgentRequest = - | InitializeRequest - | AuthenticateRequest - | NewSessionRequest - | LoadSessionRequest - | SetSessionModeRequest - | PromptRequest - | SetSessionModelRequest - | ExtMethodRequest1; -/** - * Configuration for connecting to an MCP (Model Context Protocol) server. - * - * MCP servers provide tools and context that the agent can use when - * processing prompts. - * - * See protocol docs: [MCP Servers](https://agentclientprotocol.com/protocol/session-setup#mcp-servers) - */ -export type McpServer = - | { - /** - * HTTP headers to set when making requests to the MCP server. - */ - headers: HttpHeader[]; - /** - * Human-readable name identifying this MCP server. - */ - name: string; - type: "http"; - /** - * URL to the MCP server. - */ - url: string; - } - | { - /** - * HTTP headers to set when making requests to the MCP server. - */ - headers: HttpHeader[]; - /** - * Human-readable name identifying this MCP server. - */ - name: string; - type: "sse"; - /** - * URL to the MCP server. - */ - url: string; - } - | Stdio; -/** - * Content blocks represent displayable information in the Agent Client Protocol. - * - * They provide a structured way to handle various types of user-facing content—whether - * it's text from language models, images for analysis, or embedded resources for context. - * - * Content blocks appear in: - * - User prompts sent via `session/prompt` - * - Language model output streamed through `session/update` notifications - * - Progress updates and results from tool calls - * - * This structure is compatible with the Model Context Protocol (MCP), enabling - * agents to seamlessly forward content from MCP tool outputs without transformation. - * - * See protocol docs: [Content](https://agentclientprotocol.com/protocol/content) - */ -export type ContentBlock = - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - text: string; - type: "text"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - data: string; - mimeType: string; - type: "image"; - uri?: string | null; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - data: string; - mimeType: string; - type: "audio"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - description?: string | null; - mimeType?: string | null; - name: string; - size?: number | null; - title?: string | null; - type: "resource_link"; - uri: string; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - annotations?: Annotations | null; - resource: EmbeddedResourceResource; - type: "resource"; - }; -/** - * All possible responses that an agent can send to a client. - * - * This enum is used internally for routing RPC responses. You typically won't need - * to use this directly - the responses are handled automatically by the connection. - * - * These are responses to the corresponding `ClientRequest` variants. - */ -/** @internal */ -export type AgentResponse = - | InitializeResponse - | AuthenticateResponse - | NewSessionResponse - | LoadSessionResponse - | SetSessionModeResponse - | PromptResponse - | SetSessionModelResponse - | ExtMethodResponse1; -/** - * Unique identifier for a Session Mode. - */ -export type SessionModeId = string; -/** - * All possible notifications that an agent can send to a client. - * - * This enum is used internally for routing RPC notifications. You typically won't need - * to use this directly - use the notification methods on the [`Client`] trait instead. - * - * Notifications do not expect a response. - */ -/** @internal */ -export type AgentNotification = SessionNotification | ExtNotification1; -/** - * The input specification for a command. - */ -export type AvailableCommandInput = UnstructuredCommandInput; - -/** - * Request to write content to a text file. - * - * Only available if the client supports the `fs.writeTextFile` capability. - */ -export interface WriteTextFileRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The text content to write to the file. - */ - content: string; - /** - * Absolute path to the file to write. - */ - path: string; - /** - * The session ID for this request. - */ - sessionId: string; -} -/** - * Request to read content from a text file. - * - * Only available if the client supports the `fs.readTextFile` capability. - */ -export interface ReadTextFileRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Maximum number of lines to read. - */ - limit?: number | null; - /** - * Line number to start reading from (1-based). - */ - line?: number | null; - /** - * Absolute path to the file to read. - */ - path: string; - /** - * The session ID for this request. - */ - sessionId: string; -} -/** - * Request for user permission to execute a tool call. - * - * Sent when the agent needs authorization before performing a sensitive operation. - * - * See protocol docs: [Requesting Permission](https://agentclientprotocol.com/protocol/tool-calls#requesting-permission) - */ -export interface RequestPermissionRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Available permission options for the user to choose from. - */ - options: PermissionOption[]; - /** - * The session ID for this request. - */ - sessionId: string; - toolCall: ToolCallUpdate; -} -/** - * An option presented to the user when requesting permission. - */ -export interface PermissionOption { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Hint about the nature of this permission option. - */ - kind: "allow_once" | "allow_always" | "reject_once" | "reject_always"; - /** - * Human-readable label to display to the user. - */ - name: string; - /** - * Unique identifier for this permission option. - */ - optionId: string; -} -/** - * Details about the tool call requiring permission. - */ -export interface ToolCallUpdate { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Replace the content collection. - */ - content?: ToolCallContent[] | null; - /** - * Update the tool kind. - */ - kind?: ToolKind | null; - /** - * Replace the locations collection. - */ - locations?: ToolCallLocation[] | null; - /** - * Update the raw input. - */ - rawInput?: { - [k: string]: unknown; - }; - /** - * Update the raw output. - */ - rawOutput?: { - [k: string]: unknown; - }; - /** - * Update the execution status. - */ - status?: ToolCallStatus | null; - /** - * Update the human-readable title. - */ - title?: string | null; - /** - * The ID of the tool call being updated. - */ - toolCallId: string; -} -/** - * Optional annotations for the client. The client can use annotations to inform how objects are used or displayed - */ -export interface Annotations { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - audience?: Role[] | null; - lastModified?: string | null; - priority?: number | null; -} -/** - * Text-based resource contents. - */ -export interface TextResourceContents { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - mimeType?: string | null; - text: string; - uri: string; -} -/** - * Binary resource contents. - */ -export interface BlobResourceContents { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - blob: string; - mimeType?: string | null; - uri: string; -} -/** - * A file location being accessed or modified by a tool. - * - * Enables clients to implement "follow-along" features that track - * which files the agent is working with in real-time. - * - * See protocol docs: [Following the Agent](https://agentclientprotocol.com/protocol/tool-calls#following-the-agent) - */ -export interface ToolCallLocation { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Optional line number within the file. - */ - line?: number | null; - /** - * The file path being accessed or modified. - */ - path: string; -} -/** - * Request to create a new terminal and execute a command. - */ -export interface CreateTerminalRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Array of command arguments. - */ - args?: string[]; - /** - * The command to execute. - */ - command: string; - /** - * Working directory for the command (absolute path). - */ - cwd?: string | null; - /** - * Environment variables for the command. - */ - env?: EnvVariable[]; - /** - * Maximum number of output bytes to retain. - * - * When the limit is exceeded, the Client truncates from the beginning of the output - * to stay within the limit. - * - * The Client MUST ensure truncation happens at a character boundary to maintain valid - * string output, even if this means the retained output is slightly less than the - * specified limit. - */ - outputByteLimit?: number | null; - /** - * The session ID for this request. - */ - sessionId: string; -} -/** - * An environment variable to set when launching an MCP server. - */ -export interface EnvVariable { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The name of the environment variable. - */ - name: string; - /** - * The value to set for the environment variable. - */ - value: string; -} -/** - * Request to get the current output and status of a terminal. - */ -export interface TerminalOutputRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The session ID for this request. - */ - sessionId: string; - /** - * The ID of the terminal to get output from. - */ - terminalId: string; -} -/** - * Request to release a terminal and free its resources. - */ -export interface ReleaseTerminalRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The session ID for this request. - */ - sessionId: string; - /** - * The ID of the terminal to release. - */ - terminalId: string; -} -/** - * Request to wait for a terminal command to exit. - */ -export interface WaitForTerminalExitRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The session ID for this request. - */ - sessionId: string; - /** - * The ID of the terminal to wait for. - */ - terminalId: string; -} -/** - * Request to kill a terminal command without releasing the terminal. - */ -export interface KillTerminalCommandRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The session ID for this request. - */ - sessionId: string; - /** - * The ID of the terminal to kill. - */ - terminalId: string; -} -export interface ExtMethodRequest { - [k: string]: unknown; -} -/** - * Response to `fs/write_text_file` - */ -export interface WriteTextFileResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; -} -/** - * Response containing the contents of a text file. - */ -export interface ReadTextFileResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - content: string; -} -/** - * Response to a permission request. - */ -export interface RequestPermissionResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The user's decision on the permission request. - */ - outcome: - | { - outcome: "cancelled"; - } - | { - /** - * The ID of the option the user selected. - */ - optionId: string; - outcome: "selected"; - }; -} -/** - * Response containing the ID of the created terminal. - */ -export interface CreateTerminalResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The unique identifier for the created terminal. - */ - terminalId: string; -} -/** - * Response containing the terminal output and exit status. - */ -export interface TerminalOutputResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Exit status if the command has completed. - */ - exitStatus?: TerminalExitStatus | null; - /** - * The terminal output captured so far. - */ - output: string; - /** - * Whether the output was truncated due to byte limits. - */ - truncated: boolean; -} -/** - * Exit status of a terminal command. - */ -export interface TerminalExitStatus { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The process exit code (may be null if terminated by signal). - */ - exitCode?: number | null; - /** - * The signal that terminated the process (may be null if exited normally). - */ - signal?: string | null; -} -/** - * Response to terminal/release method - */ -export interface ReleaseTerminalResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; -} -/** - * Response containing the exit status of a terminal command. - */ -export interface WaitForTerminalExitResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The process exit code (may be null if terminated by signal). - */ - exitCode?: number | null; - /** - * The signal that terminated the process (may be null if exited normally). - */ - signal?: string | null; -} -/** - * Response to terminal/kill command method - */ -export interface KillTerminalResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; -} -export interface ExtMethodResponse { - [k: string]: unknown; -} -/** - * Notification to cancel ongoing operations for a session. - * - * See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation) - */ -export interface CancelNotification { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The ID of the session to cancel operations for. - */ - sessionId: string; -} -export interface ExtNotification { - [k: string]: unknown; -} -/** - * Request parameters for the initialize method. - * - * Sent by the client to establish connection and negotiate capabilities. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ -export interface InitializeRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - clientCapabilities?: ClientCapabilities; - /** - * The latest protocol version supported by the client. - */ - protocolVersion: number; -} -/** - * Capabilities supported by the client. - */ -export interface ClientCapabilities { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - fs?: FileSystemCapability; - /** - * Whether the Client support all `terminal/*` methods. - */ - terminal?: boolean; -} -/** - * File system capabilities supported by the client. - * Determines which file operations the agent can request. - */ -export interface FileSystemCapability { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Whether the Client supports `fs/read_text_file` requests. - */ - readTextFile?: boolean; - /** - * Whether the Client supports `fs/write_text_file` requests. - */ - writeTextFile?: boolean; -} -/** - * Request parameters for the authenticate method. - * - * Specifies which authentication method to use. - */ -export interface AuthenticateRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The ID of the authentication method to use. - * Must be one of the methods advertised in the initialize response. - */ - methodId: string; -} -/** - * Request parameters for creating a new session. - * - * See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) - */ -export interface NewSessionRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The working directory for this session. Must be an absolute path. - */ - cwd: string; - /** - * List of MCP (Model Context Protocol) servers the agent should connect to. - */ - mcpServers: McpServer[]; -} -/** - * An HTTP header to set when making requests to the MCP server. - */ -export interface HttpHeader { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The name of the HTTP header. - */ - name: string; - /** - * The value to set for the HTTP header. - */ - value: string; -} -/** - * Stdio transport configuration - * - * All Agents MUST support this transport. - */ -export interface Stdio { - /** - * Command-line arguments to pass to the MCP server. - */ - args: string[]; - /** - * Path to the MCP server executable. - */ - command: string; - /** - * Environment variables to set when launching the MCP server. - */ - env: EnvVariable[]; - /** - * Human-readable name identifying this MCP server. - */ - name: string; -} -/** - * Request parameters for loading an existing session. - * - * Only available if the Agent supports the `loadSession` capability. - * - * See protocol docs: [Loading Sessions](https://agentclientprotocol.com/protocol/session-setup#loading-sessions) - */ -export interface LoadSessionRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The working directory for this session. - */ - cwd: string; - /** - * List of MCP servers to connect to for this session. - */ - mcpServers: McpServer[]; - /** - * The ID of the session to load. - */ - sessionId: string; -} -/** - * Request parameters for setting a session mode. - */ -export interface SetSessionModeRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Unique identifier for a Session Mode. - */ - modeId: string; - /** - * The ID of the session to set the mode for. - */ - sessionId: string; -} -/** - * Request parameters for sending a user prompt to the agent. - * - * Contains the user's message and any additional context. - * - * See protocol docs: [User Message](https://agentclientprotocol.com/protocol/prompt-turn#1-user-message) - */ -export interface PromptRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The blocks of content that compose the user's message. - * - * As a baseline, the Agent MUST support [`ContentBlock::Text`] and [`ContentBlock::ResourceLink`], - * while other variants are optionally enabled via [`PromptCapabilities`]. - * - * The Client MUST adapt its interface according to [`PromptCapabilities`]. - * - * The client MAY include referenced pieces of context as either - * [`ContentBlock::Resource`] or [`ContentBlock::ResourceLink`]. - * - * When available, [`ContentBlock::Resource`] is preferred - * as it avoids extra round-trips and allows the message to include - * pieces of context from sources the agent may not have access to. - */ - prompt: ContentBlock[]; - /** - * The ID of the session to send this user message to - */ - sessionId: string; -} -/** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Request parameters for setting a session model. - */ -export interface SetSessionModelRequest { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The ID of the model to set. - */ - modelId: string; - /** - * The ID of the session to set the model for. - */ - sessionId: string; -} -export interface ExtMethodRequest1 { - [k: string]: unknown; -} -/** - * Response from the initialize method. - * - * Contains the negotiated protocol version and agent capabilities. - * - * See protocol docs: [Initialization](https://agentclientprotocol.com/protocol/initialization) - */ -export interface InitializeResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - agentCapabilities?: AgentCapabilities; - /** - * Authentication methods supported by the agent. - */ - authMethods?: AuthMethod[]; - /** - * The protocol version the client specified if supported by the agent, - * or the latest protocol version supported by the agent. - * - * The client should disconnect, if it doesn't support this version. - */ - protocolVersion: number; -} -/** - * Capabilities supported by the agent. - */ -export interface AgentCapabilities { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Whether the agent supports `session/load`. - */ - loadSession?: boolean; - mcpCapabilities?: McpCapabilities; - promptCapabilities?: PromptCapabilities; -} -/** - * MCP capabilities supported by the agent. - */ -export interface McpCapabilities { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Agent supports [`McpServer::Http`]. - */ - http?: boolean; - /** - * Agent supports [`McpServer::Sse`]. - */ - sse?: boolean; -} -/** - * Prompt capabilities supported by the agent. - */ -export interface PromptCapabilities { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Agent supports [`ContentBlock::Audio`]. - */ - audio?: boolean; - /** - * Agent supports embedded context in `session/prompt` requests. - * - * When enabled, the Client is allowed to include [`ContentBlock::Resource`] - * in prompt requests for pieces of context that are referenced in the message. - */ - embeddedContext?: boolean; - /** - * Agent supports [`ContentBlock::Image`]. - */ - image?: boolean; -} -/** - * Describes an available authentication method. - */ -export interface AuthMethod { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Optional description providing more details about this authentication method. - */ - description?: string | null; - /** - * Unique identifier for this authentication method. - */ - id: string; - /** - * Human-readable name of the authentication method. - */ - name: string; -} -/** - * Response to authenticate method - */ -export interface AuthenticateResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; -} -/** - * Response from creating a new session. - * - * See protocol docs: [Creating a Session](https://agentclientprotocol.com/protocol/session-setup#creating-a-session) - */ -export interface NewSessionResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Initial model state if supported by the Agent - */ - models?: SessionModelState | null; - /** - * Initial mode state if supported by the Agent - * - * See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) - */ - modes?: SessionModeState | null; - /** - * Unique identifier for the created session. - * - * Used in all subsequent requests for this conversation. - */ - sessionId: string; -} -/** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * The set of models and the one currently active. - */ -export interface SessionModelState { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The set of models that the Agent can use - */ - availableModels: ModelInfo[]; - /** - * The current model the Agent is in. - */ - currentModelId: string; -} -/** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Information about a selectable model. - */ -export interface ModelInfo { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Optional description of the model. - */ - description?: string | null; - /** - * Unique identifier for the model. - */ - modelId: string; - /** - * Human-readable name of the model. - */ - name: string; -} -/** - * The set of modes and the one currently active. - */ -export interface SessionModeState { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The set of modes that the Agent can operate in - */ - availableModes: SessionMode[]; - /** - * Unique identifier for a Session Mode. - */ - currentModeId: string; -} -/** - * A mode the agent can operate in. - * - * See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) - */ -export interface SessionMode { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - description?: string | null; - id: SessionModeId; - name: string; -} -/** - * Response from loading an existing session. - */ -export interface LoadSessionResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Initial model state if supported by the Agent - */ - models?: SessionModelState | null; - /** - * Initial mode state if supported by the Agent - * - * See protocol docs: [Session Modes](https://agentclientprotocol.com/protocol/session-modes) - */ - modes?: SessionModeState | null; -} -/** - * Response to `session/set_mode` method. - */ -export interface SetSessionModeResponse { - meta?: unknown; -} -/** - * Response from processing a user prompt. - * - * See protocol docs: [Check for Completion](https://agentclientprotocol.com/protocol/prompt-turn#4-check-for-completion) - */ -export interface PromptResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Indicates why the agent stopped processing the turn. - */ - stopReason: - | "end_turn" - | "max_tokens" - | "max_turn_requests" - | "refusal" - | "cancelled"; -} -/** - * **UNSTABLE** - * - * This capability is not part of the spec yet, and may be removed or changed at any point. - * - * Response to `session/set_model` method. - */ -export interface SetSessionModelResponse { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; -} -export interface ExtMethodResponse1 { - [k: string]: unknown; -} -/** - * Notification containing a session update from the agent. - * - * Used to stream real-time progress and results during prompt processing. - * - * See protocol docs: [Agent Reports Output](https://agentclientprotocol.com/protocol/prompt-turn#3-agent-reports-output) - */ -export interface SessionNotification { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The ID of the session this update pertains to. - */ - sessionId: string; - /** - * The actual update content. - */ - update: - | { - content: ContentBlock; - sessionUpdate: "user_message_chunk"; - } - | { - content: ContentBlock; - sessionUpdate: "agent_message_chunk"; - } - | { - content: ContentBlock; - sessionUpdate: "agent_thought_chunk"; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Content produced by the tool call. - */ - content?: ToolCallContent[]; - /** - * The category of tool being invoked. - * Helps clients choose appropriate icons and UI treatment. - */ - kind?: - | "read" - | "edit" - | "delete" - | "move" - | "search" - | "execute" - | "think" - | "fetch" - | "switch_mode" - | "other"; - /** - * File locations affected by this tool call. - * Enables "follow-along" features in clients. - */ - locations?: ToolCallLocation[]; - /** - * Raw input parameters sent to the tool. - */ - rawInput?: { - [k: string]: unknown; - }; - /** - * Raw output returned by the tool. - */ - rawOutput?: { - [k: string]: unknown; - }; - sessionUpdate: "tool_call"; - /** - * Current execution status of the tool call. - */ - status?: "pending" | "in_progress" | "completed" | "failed"; - /** - * Human-readable title describing what the tool is doing. - */ - title: string; - /** - * Unique identifier for this tool call within the session. - */ - toolCallId: string; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Replace the content collection. - */ - content?: ToolCallContent[] | null; - /** - * Update the tool kind. - */ - kind?: ToolKind | null; - /** - * Replace the locations collection. - */ - locations?: ToolCallLocation[] | null; - /** - * Update the raw input. - */ - rawInput?: { - [k: string]: unknown; - }; - /** - * Update the raw output. - */ - rawOutput?: { - [k: string]: unknown; - }; - sessionUpdate: "tool_call_update"; - /** - * Update the execution status. - */ - status?: ToolCallStatus | null; - /** - * Update the human-readable title. - */ - title?: string | null; - /** - * The ID of the tool call being updated. - */ - toolCallId: string; - } - | { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * The list of tasks to be accomplished. - * - * When updating a plan, the agent must send a complete list of all entries - * with their current status. The client replaces the entire plan with each update. - */ - entries: PlanEntry[]; - sessionUpdate: "plan"; - } - | { - availableCommands: AvailableCommand[]; - sessionUpdate: "available_commands_update"; - } - | { - currentModeId: SessionModeId; - sessionUpdate: "current_mode_update"; - }; -} -/** - * A single entry in the execution plan. - * - * Represents a task or goal that the assistant intends to accomplish - * as part of fulfilling the user's request. - * See protocol docs: [Plan Entries](https://agentclientprotocol.com/protocol/agent-plan#plan-entries) - */ -export interface PlanEntry { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Human-readable description of what this task aims to accomplish. - */ - content: string; - /** - * The relative importance of this task. - * Used to indicate which tasks are most critical to the overall goal. - */ - priority: "high" | "medium" | "low"; - /** - * Current execution status of this task. - */ - status: "pending" | "in_progress" | "completed"; -} -/** - * Information about a command. - */ -export interface AvailableCommand { - /** - * Extension point for implementations - */ - _meta?: { - [k: string]: unknown; - }; - /** - * Human-readable description of what the command does. - */ - description: string; - /** - * Input for the command if required - */ - input?: AvailableCommandInput | null; - /** - * Command name (e.g., `create_plan`, `research_codebase`). - */ - name: string; -} -/** - * All text that was typed after the command name is provided as input. - */ -export interface UnstructuredCommandInput { - /** - * A hint to display when the input hasn't been provided yet - */ - hint: string; -} -export interface ExtNotification1 { - [k: string]: unknown; -} - -/** @internal */ -export const writeTextFileRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.string(), - path: z.string(), - sessionId: z.string(), -}); - -/** @internal */ -export const readTextFileRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - limit: z.number().optional().nullable(), - line: z.number().optional().nullable(), - path: z.string(), - sessionId: z.string(), -}); - -/** @internal */ -export const terminalOutputRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), - terminalId: z.string(), -}); - -/** @internal */ -export const releaseTerminalRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), - terminalId: z.string(), -}); - -/** @internal */ -export const waitForTerminalExitRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), - terminalId: z.string(), -}); - -/** @internal */ -export const killTerminalCommandRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), - terminalId: z.string(), -}); - -/** @internal */ -export const extMethodRequestSchema = z.record(z.unknown()); - -/** @internal */ -export const roleSchema = z.union([z.literal("assistant"), z.literal("user")]); - -/** @internal */ -export const textResourceContentsSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - mimeType: z.string().optional().nullable(), - text: z.string(), - uri: z.string(), -}); - -/** @internal */ -export const blobResourceContentsSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - blob: z.string(), - mimeType: z.string().optional().nullable(), - uri: z.string(), -}); - -/** @internal */ -export const toolKindSchema = z.union([ - z.literal("read"), - z.literal("edit"), - z.literal("delete"), - z.literal("move"), - z.literal("search"), - z.literal("execute"), - z.literal("think"), - z.literal("fetch"), - z.literal("switch_mode"), - z.literal("other"), -]); - -/** @internal */ -export const toolCallStatusSchema = z.union([ - z.literal("pending"), - z.literal("in_progress"), - z.literal("completed"), - z.literal("failed"), -]); - -/** @internal */ -export const writeTextFileResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), -}); - -/** @internal */ -export const readTextFileResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.string(), -}); - -/** @internal */ -export const requestPermissionResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - outcome: z.union([ - z.object({ - outcome: z.literal("cancelled"), - }), - z.object({ - optionId: z.string(), - outcome: z.literal("selected"), - }), - ]), -}); - -/** @internal */ -export const createTerminalResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - terminalId: z.string(), -}); - -/** @internal */ -export const releaseTerminalResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), -}); - -/** @internal */ -export const waitForTerminalExitResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - exitCode: z.number().optional().nullable(), - signal: z.string().optional().nullable(), -}); - -/** @internal */ -export const killTerminalResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), -}); - -/** @internal */ -export const extMethodResponseSchema = z.record(z.unknown()); - -/** @internal */ -export const cancelNotificationSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), -}); - -/** @internal */ -export const extNotificationSchema = z.record(z.unknown()); - -/** @internal */ -export const authenticateRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - methodId: z.string(), -}); - -/** @internal */ -export const setSessionModeRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - modeId: z.string(), - sessionId: z.string(), -}); - -/** @internal */ -export const setSessionModelRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - modelId: z.string(), - sessionId: z.string(), -}); - -/** @internal */ -export const extMethodRequest1Schema = z.record(z.unknown()); - -/** @internal */ -export const httpHeaderSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - name: z.string(), - value: z.string(), -}); - -/** @internal */ -export const annotationsSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - audience: z.array(roleSchema).optional().nullable(), - lastModified: z.string().optional().nullable(), - priority: z.number().optional().nullable(), -}); - -/** @internal */ -export const embeddedResourceResourceSchema = z.union([ - textResourceContentsSchema, - blobResourceContentsSchema, -]); - -/** @internal */ -export const authenticateResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), -}); - -/** @internal */ -export const setSessionModeResponseSchema = z.object({ - meta: z.unknown().optional(), -}); - -/** @internal */ -export const promptResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - stopReason: z.union([ - z.literal("end_turn"), - z.literal("max_tokens"), - z.literal("max_turn_requests"), - z.literal("refusal"), - z.literal("cancelled"), - ]), -}); - -/** @internal */ -export const setSessionModelResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), -}); - -/** @internal */ -export const extMethodResponse1Schema = z.record(z.unknown()); - -/** @internal */ -export const sessionModeIdSchema = z.string(); - -/** @internal */ -export const extNotification1Schema = z.record(z.unknown()); - -/** @internal */ -export const unstructuredCommandInputSchema = z.object({ - hint: z.string(), -}); - -/** @internal */ -export const permissionOptionSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - kind: z.union([ - z.literal("allow_once"), - z.literal("allow_always"), - z.literal("reject_once"), - z.literal("reject_always"), - ]), - name: z.string(), - optionId: z.string(), -}); - -/** @internal */ -export const toolCallContentSchema = z.union([ - z.object({ - content: z.union([ - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - text: z.string(), - type: z.literal("text"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - data: z.string(), - mimeType: z.string(), - type: z.literal("image"), - uri: z.string().optional().nullable(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - data: z.string(), - mimeType: z.string(), - type: z.literal("audio"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - description: z.string().optional().nullable(), - mimeType: z.string().optional().nullable(), - name: z.string(), - size: z.number().optional().nullable(), - title: z.string().optional().nullable(), - type: z.literal("resource_link"), - uri: z.string(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - resource: embeddedResourceResourceSchema, - type: z.literal("resource"), - }), - ]), - type: z.literal("content"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - newText: z.string(), - oldText: z.string().optional().nullable(), - path: z.string(), - type: z.literal("diff"), - }), - z.object({ - terminalId: z.string(), - type: z.literal("terminal"), - }), -]); - -/** @internal */ -export const toolCallLocationSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - line: z.number().optional().nullable(), - path: z.string(), -}); - -/** @internal */ -export const envVariableSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - name: z.string(), - value: z.string(), -}); - -/** @internal */ -export const terminalExitStatusSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - exitCode: z.number().optional().nullable(), - signal: z.string().optional().nullable(), -}); - -/** @internal */ -export const fileSystemCapabilitySchema = z.object({ - _meta: z.record(z.unknown()).optional(), - readTextFile: z.boolean().optional(), - writeTextFile: z.boolean().optional(), -}); - -/** @internal */ -export const stdioSchema = z.object({ - args: z.array(z.string()), - command: z.string(), - env: z.array(envVariableSchema), - name: z.string(), -}); - -/** @internal */ -export const mcpServerSchema = z.union([ - z.object({ - headers: z.array(httpHeaderSchema), - name: z.string(), - type: z.literal("http"), - url: z.string(), - }), - z.object({ - headers: z.array(httpHeaderSchema), - name: z.string(), - type: z.literal("sse"), - url: z.string(), - }), - stdioSchema, -]); - -/** @internal */ -export const contentBlockSchema = z.union([ - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - text: z.string(), - type: z.literal("text"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - data: z.string(), - mimeType: z.string(), - type: z.literal("image"), - uri: z.string().optional().nullable(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - data: z.string(), - mimeType: z.string(), - type: z.literal("audio"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - description: z.string().optional().nullable(), - mimeType: z.string().optional().nullable(), - name: z.string(), - size: z.number().optional().nullable(), - title: z.string().optional().nullable(), - type: z.literal("resource_link"), - uri: z.string(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - annotations: annotationsSchema.optional().nullable(), - resource: embeddedResourceResourceSchema, - type: z.literal("resource"), - }), -]); - -/** @internal */ -export const authMethodSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - description: z.string().optional().nullable(), - id: z.string(), - name: z.string(), -}); - -/** @internal */ -export const mcpCapabilitiesSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - http: z.boolean().optional(), - sse: z.boolean().optional(), -}); - -/** @internal */ -export const promptCapabilitiesSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - audio: z.boolean().optional(), - embeddedContext: z.boolean().optional(), - image: z.boolean().optional(), -}); - -/** @internal */ -export const modelInfoSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - description: z.string().optional().nullable(), - modelId: z.string(), - name: z.string(), -}); - -/** @internal */ -export const sessionModeSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - description: z.string().optional().nullable(), - id: sessionModeIdSchema, - name: z.string(), -}); - -/** @internal */ -export const sessionModelStateSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - availableModels: z.array(modelInfoSchema), - currentModelId: z.string(), -}); - -/** @internal */ -export const sessionModeStateSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - availableModes: z.array(sessionModeSchema), - currentModeId: z.string(), -}); - -/** @internal */ -export const planEntrySchema = z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.string(), - priority: z.union([z.literal("high"), z.literal("medium"), z.literal("low")]), - status: z.union([ - z.literal("pending"), - z.literal("in_progress"), - z.literal("completed"), - ]), -}); - -/** @internal */ -export const availableCommandInputSchema = unstructuredCommandInputSchema; - -/** @internal */ -export const clientNotificationSchema = z.union([ - cancelNotificationSchema, - extNotificationSchema, -]); - -/** @internal */ -export const createTerminalRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - args: z.array(z.string()).optional(), - command: z.string(), - cwd: z.string().optional().nullable(), - env: z.array(envVariableSchema).optional(), - outputByteLimit: z.number().optional().nullable(), - sessionId: z.string(), -}); - -/** @internal */ -export const terminalOutputResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - exitStatus: terminalExitStatusSchema.optional().nullable(), - output: z.string(), - truncated: z.boolean(), -}); - -/** @internal */ -export const newSessionRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - cwd: z.string(), - mcpServers: z.array(mcpServerSchema), -}); - -/** @internal */ -export const loadSessionRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - cwd: z.string(), - mcpServers: z.array(mcpServerSchema), - sessionId: z.string(), -}); - -/** @internal */ -export const promptRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - prompt: z.array(contentBlockSchema), - sessionId: z.string(), -}); - -/** @internal */ -export const newSessionResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - models: sessionModelStateSchema.optional().nullable(), - modes: sessionModeStateSchema.optional().nullable(), - sessionId: z.string(), -}); - -/** @internal */ -export const loadSessionResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - models: sessionModelStateSchema.optional().nullable(), - modes: sessionModeStateSchema.optional().nullable(), -}); - -/** @internal */ -export const toolCallUpdateSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.array(toolCallContentSchema).optional().nullable(), - kind: toolKindSchema.optional().nullable(), - locations: z.array(toolCallLocationSchema).optional().nullable(), - rawInput: z.record(z.unknown()).optional(), - rawOutput: z.record(z.unknown()).optional(), - status: toolCallStatusSchema.optional().nullable(), - title: z.string().optional().nullable(), - toolCallId: z.string(), -}); - -/** @internal */ -export const clientCapabilitiesSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - fs: fileSystemCapabilitySchema.optional(), - terminal: z.boolean().optional(), -}); - -/** @internal */ -export const agentCapabilitiesSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - loadSession: z.boolean().optional(), - mcpCapabilities: mcpCapabilitiesSchema.optional(), - promptCapabilities: promptCapabilitiesSchema.optional(), -}); - -/** @internal */ -export const availableCommandSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - description: z.string(), - input: availableCommandInputSchema.optional().nullable(), - name: z.string(), -}); - -/** @internal */ -export const clientResponseSchema = z.union([ - writeTextFileResponseSchema, - readTextFileResponseSchema, - requestPermissionResponseSchema, - createTerminalResponseSchema, - terminalOutputResponseSchema, - releaseTerminalResponseSchema, - waitForTerminalExitResponseSchema, - killTerminalResponseSchema, - extMethodResponseSchema, -]); - -/** @internal */ -export const requestPermissionRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - options: z.array(permissionOptionSchema), - sessionId: z.string(), - toolCall: toolCallUpdateSchema, -}); - -/** @internal */ -export const initializeRequestSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - clientCapabilities: clientCapabilitiesSchema.optional(), - protocolVersion: z.number(), -}); - -/** @internal */ -export const initializeResponseSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - agentCapabilities: agentCapabilitiesSchema.optional(), - authMethods: z.array(authMethodSchema).optional(), - protocolVersion: z.number(), -}); - -/** @internal */ -export const sessionNotificationSchema = z.object({ - _meta: z.record(z.unknown()).optional(), - sessionId: z.string(), - update: z.union([ - z.object({ - content: contentBlockSchema, - sessionUpdate: z.literal("user_message_chunk"), - }), - z.object({ - content: contentBlockSchema, - sessionUpdate: z.literal("agent_message_chunk"), - }), - z.object({ - content: contentBlockSchema, - sessionUpdate: z.literal("agent_thought_chunk"), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.array(toolCallContentSchema).optional(), - kind: z - .union([ - z.literal("read"), - z.literal("edit"), - z.literal("delete"), - z.literal("move"), - z.literal("search"), - z.literal("execute"), - z.literal("think"), - z.literal("fetch"), - z.literal("switch_mode"), - z.literal("other"), - ]) - .optional(), - locations: z.array(toolCallLocationSchema).optional(), - rawInput: z.record(z.unknown()).optional(), - rawOutput: z.record(z.unknown()).optional(), - sessionUpdate: z.literal("tool_call"), - status: z - .union([ - z.literal("pending"), - z.literal("in_progress"), - z.literal("completed"), - z.literal("failed"), - ]) - .optional(), - title: z.string(), - toolCallId: z.string(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - content: z.array(toolCallContentSchema).optional().nullable(), - kind: toolKindSchema.optional().nullable(), - locations: z.array(toolCallLocationSchema).optional().nullable(), - rawInput: z.record(z.unknown()).optional(), - rawOutput: z.record(z.unknown()).optional(), - sessionUpdate: z.literal("tool_call_update"), - status: toolCallStatusSchema.optional().nullable(), - title: z.string().optional().nullable(), - toolCallId: z.string(), - }), - z.object({ - _meta: z.record(z.unknown()).optional(), - entries: z.array(planEntrySchema), - sessionUpdate: z.literal("plan"), - }), - z.object({ - availableCommands: z.array(availableCommandSchema), - sessionUpdate: z.literal("available_commands_update"), - }), - z.object({ - currentModeId: sessionModeIdSchema, - sessionUpdate: z.literal("current_mode_update"), - }), - ]), -}); - -/** @internal */ -export const clientRequestSchema = z.union([ - writeTextFileRequestSchema, - readTextFileRequestSchema, - requestPermissionRequestSchema, - createTerminalRequestSchema, - terminalOutputRequestSchema, - releaseTerminalRequestSchema, - waitForTerminalExitRequestSchema, - killTerminalCommandRequestSchema, - extMethodRequestSchema, -]); - -/** @internal */ -export const agentRequestSchema = z.union([ - initializeRequestSchema, - authenticateRequestSchema, - newSessionRequestSchema, - loadSessionRequestSchema, - setSessionModeRequestSchema, - promptRequestSchema, - setSessionModelRequestSchema, - extMethodRequest1Schema, -]); - -/** @internal */ -export const agentResponseSchema = z.union([ - initializeResponseSchema, - authenticateResponseSchema, - newSessionResponseSchema, - loadSessionResponseSchema, - setSessionModeResponseSchema, - promptResponseSchema, - setSessionModelResponseSchema, - extMethodResponse1Schema, -]); - -/** @internal */ -export const agentNotificationSchema = z.union([ - sessionNotificationSchema, - extNotification1Schema, -]); - -/** @internal */ -export const agentClientProtocolSchema = z.union([ - clientRequestSchema, - clientResponseSchema, - clientNotificationSchema, - agentRequestSchema, - agentResponseSchema, - agentNotificationSchema, -]); diff --git a/typescript/stream.ts b/typescript/stream.ts deleted file mode 100644 index d7f08c7e..00000000 --- a/typescript/stream.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { AnyMessage } from "./jsonrpc.js"; - -/** - * Stream interface for ACP connections. - * - * This type powers the bidirectional communication for an ACP connection, - * providing readable and writable streams of messages. - * - * The most common way to create a Stream is using {@link ndJsonStream}. - */ -export type Stream = { - writable: WritableStream; - readable: ReadableStream; -}; - -/** - * Creates an ACP Stream from a pair of newline-delimited JSON streams. - * - * This is the typical way to handle ACP connections over stdio, converting - * between AnyMessage objects and newline-delimited JSON. - * - * @param output - The writable stream to send encoded messages to - * @param input - The readable stream to receive encoded messages from - * @returns A Stream for bidirectional ACP communication - */ -export function ndJsonStream( - output: WritableStream, - input: ReadableStream, -): Stream { - const textEncoder = new TextEncoder(); - const textDecoder = new TextDecoder(); - - const readable = new ReadableStream({ - async start(controller) { - let content = ""; - const reader = input.getReader(); - try { - while (true) { - const { value, done } = await reader.read(); - if (done) { - break; - } - if (!value) { - continue; - } - content += textDecoder.decode(value, { stream: true }); - const lines = content.split("\n"); - content = lines.pop() || ""; - - for (const line of lines) { - const trimmedLine = line.trim(); - if (trimmedLine) { - try { - const message = JSON.parse(trimmedLine) as AnyMessage; - controller.enqueue(message); - } catch (err) { - console.error( - "Failed to parse JSON message:", - trimmedLine, - err, - ); - } - } - } - } - } finally { - reader.releaseLock(); - controller.close(); - } - }, - }); - - const writable = new WritableStream({ - async write(message) { - const content = JSON.stringify(message) + "\n"; - const writer = output.getWriter(); - try { - await writer.write(textEncoder.encode(content)); - } finally { - writer.releaseLock(); - } - }, - }); - - return { readable, writable }; -} diff --git a/typescript/typedoc.json b/typescript/typedoc.json deleted file mode 100644 index 58c22745..00000000 --- a/typescript/typedoc.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "https://typedoc.org/schema.json", - "name": "Agent Client Protocol", - "entryPoints": ["./acp.ts"], - "out": "./docs", - "navigationLinks": { - "Protocol Docs": "https://agentclientprotocol.com", - "GitHub": "https://github.com/agentclientprotocol/agent-client-protocol", - "NPM": "https://www.npmjs.com/package/@agentclientprotocol/sdk" - }, - "tsconfig": "../tsconfig.json", - "excludePrivate": true, - "excludeProtected": true, - "excludeInternal": true, - "excludeExternals": false, - "includeVersion": true, - "searchInComments": true, - "categorizeByGroup": true, - "sort": ["source-order"], - "visibilityFilters": { - "protected": false, - "private": false, - "inherited": true, - "external": false - }, - "plugin": ["typedoc-github-theme"], - "theme": "typedoc-github-theme", - "lightHighlightTheme": "github-light", - "darkHighlightTheme": "github-dark", - "readme": "./README.md", - "exclude": [ - "**/node_modules/**", - "**/dist/**", - "**/tests/**", - "**/test/**", - "**/*.test.ts", - "**/*.spec.ts", - "**/generate.js" - ], - "externalPattern": ["**/node_modules/**"], - "excludeNotDocumented": false, - "excludeReferences": false, - "validation": { - "notExported": true, - "invalidLink": true, - "notDocumented": false - }, - "treatWarningsAsErrors": false, - "skipErrorChecking": false, - "disableSources": false, - "gitRevision": "main", - "gitRemote": "origin", - "hideGenerator": false -} diff --git a/typos.toml b/typos.toml index 508daa50..19643f20 100644 --- a/typos.toml +++ b/typos.toml @@ -13,12 +13,6 @@ extend-exclude = [ # Package lock files contain hashes and encoded data "package-lock.json", "Cargo.lock", - - # TypeScript documentation output - "typescript/docs/", - - # Build artifacts - "tsconfig.tsbuildinfo", ] [default]