diff --git a/apps/vscode/package-lock.json b/apps/vscode/package-lock.json index d4515cf091..4fa796416e 100644 --- a/apps/vscode/package-lock.json +++ b/apps/vscode/package-lock.json @@ -11,10 +11,10 @@ "dependencies": { "@anthropic-ai/sdk": "^0.37.0", "@bufbuild/protobuf": "^2.2.5", - "@cline/agents": "^0.0.42", - "@cline/core": "^0.0.42", - "@cline/llms": "^0.0.42", - "@cline/shared": "^0.0.42", + "@cline/agents": "0.0.42-nightly.1780514867", + "@cline/core": "0.0.42-nightly.1780514867", + "@cline/llms": "0.0.42-nightly.1780514867", + "@cline/shared": "0.0.42-nightly.1780514867", "@google/genai": "^1.30.0", "@grpc/grpc-js": "^1.9.15", "@grpc/proto-loader": "^0.7.13", @@ -153,10 +153,13 @@ } }, "node_modules/@ai-sdk/amazon-bedrock": { - "version": "4.0.111", + "version": "4.0.112", + "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-4.0.112.tgz", + "integrity": "sha512-PsSh7a6qW+3kQXPs1kD4wDwuZby0t1PIaB6j/1aMKmPFJ5LxcIcULLMF/bjITLt5o/8lc0t6TXIwG0zlhH7uZw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/anthropic": "3.0.81", + "@ai-sdk/openai": "3.0.67", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@smithy/eventstream-codec": "^4.0.1", @@ -172,6 +175,8 @@ }, "node_modules/@ai-sdk/anthropic": { "version": "3.0.81", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.81.tgz", + "integrity": "sha512-B1JDd9Ugq9R5AgIaW3674lhGCMMYJcPUxnrZh8fzbGojgg4QvHFRv6eZahGQAUsmGHbcf74G9bdSBDLWQGY2GA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -185,7 +190,9 @@ } }, "node_modules/@ai-sdk/gateway": { - "version": "3.0.121", + "version": "3.0.123", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.123.tgz", + "integrity": "sha512-rL+3Sp9crOlfE7MwguFPS30qVp6HFcr9na0KYMb4CcQdxAIjBJec3EEdCjc94UyRVZWLmgQ6Yr605FmPlFIi0w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -201,6 +208,8 @@ }, "node_modules/@ai-sdk/google": { "version": "3.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.80.tgz", + "integrity": "sha512-5ORbm/yFUPO0MEvZsxBMN0cdKw2+lwU/wVn5KN3KF8Dmk1LughuDuUohMh/7iU/XFTiyB0OvmTW/tdV/J7O9zg==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -214,7 +223,9 @@ } }, "node_modules/@ai-sdk/google-vertex": { - "version": "4.0.140", + "version": "4.0.141", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.141.tgz", + "integrity": "sha512-UGXQeV+z30Gk1/mhKZoXKbYO7Q0U7pg0Nlz44hb2B1FpYRFBu8+ziaI60BdetncaoxPocdNKhP41AD15IA6nJg==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/anthropic": "3.0.81", @@ -231,23 +242,10 @@ "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/google-vertex/node_modules/google-auth-library": { - "version": "10.6.2", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.1.4", - "gcp-metadata": "8.1.2", - "google-logging-utils": "1.1.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@ai-sdk/mistral": { "version": "3.0.37", + "resolved": "https://registry.npmjs.org/@ai-sdk/mistral/-/mistral-3.0.37.tgz", + "integrity": "sha512-KkdaMjs4C2y+vrZWJE990E3ZxBFiOTHQ94ZlquuIttpphcqJTMxNoIpnKT/4UzMVWXL0BUEE2vs+1UEVXkN8Kg==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -262,6 +260,8 @@ }, "node_modules/@ai-sdk/openai": { "version": "3.0.67", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.67.tgz", + "integrity": "sha512-oAiGC9eWG7IgtdsdS74bOCnAAHarAfTJhWN9x5INwnWPekL802AvF+0I5DvLzIF1MIRmNw4N8mPSL/GUVbX9Mw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -276,6 +276,8 @@ }, "node_modules/@ai-sdk/openai-compatible": { "version": "2.0.48", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.48.tgz", + "integrity": "sha512-z9MC6M4Oh/yUY/F/eszOtO8wc2nMz99XmZQKd2gWTtyIfe716xTfrKe3aYZKg20NZDtyjqPPKPSR+wqz7q1T7Q==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -290,6 +292,8 @@ }, "node_modules/@ai-sdk/provider": { "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", + "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -300,6 +304,8 @@ }, "node_modules/@ai-sdk/provider-utils": { "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", + "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.10", @@ -315,6 +321,8 @@ }, "node_modules/@anthropic-ai/claude-agent-sdk": { "version": "0.2.141", + "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.2.141.tgz", + "integrity": "sha512-AIBacMWGcZIUcXlUoObqjwJ6pmJI3BayAqPAFXuvSq3DHJXdiuZVs7l/zTB5l3nRhRv5cqSrI2XbiDeHgZWizw==", "license": "SEE LICENSE IN README.md", "dependencies": { "@anthropic-ai/sdk": "^0.93.0", @@ -339,6 +347,8 @@ }, "node_modules/@anthropic-ai/claude-agent-sdk-darwin-arm64": { "version": "0.2.141", + "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-arm64/-/claude-agent-sdk-darwin-arm64-0.2.141.tgz", + "integrity": "sha512-9HZ0ot6+FwOfQ1aeMqQLH4IJGMm/DcP08SysDxscVjBm6l2JjqleHohxi3zid0DurfGweqT+4x9GScJffwg55g==", "cpu": [ "arm64" ], @@ -453,6 +463,8 @@ }, "node_modules/@anthropic-ai/claude-agent-sdk/node_modules/@anthropic-ai/sdk": { "version": "0.93.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.93.0.tgz", + "integrity": "sha512-q9vaSZQVFx6B/gPxetGYfLXSJD5v0sOmh0OpZDq7yCrTSA+Rscvrtyol7JJTW40wEpQB4U1B4JXzxQitbQ3CAA==", "license": "MIT", "dependencies": { "json-schema-to-ts": "^3.1.1" @@ -493,8 +505,24 @@ "version": "5.26.5", "license": "MIT" }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", @@ -506,55 +534,10 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-crypto/util": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.5", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -566,6 +549,8 @@ }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -576,8 +561,19 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-crypto/sha256-js/node_modules/@aws-crypto/util": { + "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", @@ -585,29 +581,10 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-js/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js/node_modules/@smithy/util-utf8": { + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -618,18 +595,20 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.1049.0", + "version": "3.1061.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1061.0.tgz", + "integrity": "sha512-U3ULArHdDdu6MOtgkg3ojVVAiT5mjKMv2hUdvu3PvLxNZXV6T3pHY4b4GCAcv9vHXqZ5ci+4IMvCwHkoY6kMzA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/credential-provider-node": "^3.972.43", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/fetch-http-handler": "^5.4.2", - "@smithy/node-http-handler": "^4.7.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/credential-provider-node": "^3.972.50", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -637,15 +616,17 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.974.12", + "version": "3.974.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.17.tgz", + "integrity": "sha512-r8o4h2K7j6P9ngno+8ei0aK0U/4JwDb7A2fMMxGVoSqDN8AFlIzSDeZHME9LcVLR2codyhtr1WAAg+/nmkeeMA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.8", - "@aws-sdk/xml-builder": "^3.972.24", + "@aws-sdk/types": "^3.973.10", + "@aws-sdk/xml-builder": "^3.972.27", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/core": "^3.24.2", - "@smithy/signature-v4": "^5.4.2", - "@smithy/types": "^4.14.1", + "@smithy/core": "^3.24.6", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -653,129 +634,16 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@aws-sdk/xml-builder": { - "version": "3.972.24", - "license": "Apache-2.0", - "dependencies": { - "@nodable/entities": "2.1.0", - "@smithy/types": "^4.14.1", - "fast-xml-parser": "5.7.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/core/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.4", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core/node_modules/@nodable/entities": { - "version": "2.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, - "node_modules/@aws-sdk/core/node_modules/@smithy/signature-v4": { - "version": "5.4.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.3", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core/node_modules/bowser": { - "version": "2.14.1", - "license": "MIT" - }, - "node_modules/@aws-sdk/core/node_modules/fast-xml-builder": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.5.0", - "xml-naming": "^0.1.0" - } - }, - "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { - "version": "5.7.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.7", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.2.3" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@aws-sdk/core/node_modules/path-expression-matcher": { - "version": "1.5.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/core/node_modules/strnum": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/@aws-sdk/core/node_modules/xml-naming": { - "version": "0.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.972.35", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.40.tgz", + "integrity": "sha512-viZSv9qWrcfWvpnhy8FPQ5y0ee4TiCOX/xM8LSQXR+xJn0P4DV7B+XwXfOZ+Ik3+yQ/aO69qVnngEpXExAwizA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -783,13 +651,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.38", + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.43.tgz", + "integrity": "sha512-g0XVQKzaA/4cq1vz1IvCQwYM+1Pkv01J9yHDpCTXekVuGZRDEz0wqBQ1AuYTq7FM6uik4uBGH8Tb5d9YvgeA7g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -797,15 +667,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.40", + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.45.tgz", + "integrity": "sha512-w9PuOoKCt6+xoESvY+zlV0u3PKQ0mVL259PcsVR6a3S/uYJJHnIi4r1NxdJHEcNldUVRIciltWnFMGBR4YEm3g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/fetch-http-handler": "^5.4.2", - "@smithy/node-http-handler": "^4.7.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -813,21 +685,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.42", + "version": "3.972.48", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.48.tgz", + "integrity": "sha512-+6BQ6Lrnc+EyAGElLRW6j+Sa+RirPHnIJsobvYO6nnyK+oGKmz1ne/ieclbLWyjyDKEU3/JVJWcWY3VLFPvGtQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/credential-provider-env": "^3.972.38", - "@aws-sdk/credential-provider-http": "^3.972.40", - "@aws-sdk/credential-provider-login": "^3.972.42", - "@aws-sdk/credential-provider-process": "^3.972.38", - "@aws-sdk/credential-provider-sso": "^3.972.42", - "@aws-sdk/credential-provider-web-identity": "^3.972.42", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/credential-provider-imds": "^4.3.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/credential-provider-env": "^3.972.43", + "@aws-sdk/credential-provider-http": "^3.972.45", + "@aws-sdk/credential-provider-login": "^3.972.47", + "@aws-sdk/credential-provider-process": "^3.972.43", + "@aws-sdk/credential-provider-sso": "^3.972.47", + "@aws-sdk/credential-provider-web-identity": "^3.972.47", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -835,14 +709,16 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.42", + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.47.tgz", + "integrity": "sha512-Iy2ebWVgrZBH05464uJiQYu6HSSiROnwVZptthEFXx2gWjo1ORCxEAFZB5Cr2MdfrSnZ+0QUPkZ1ZpCqpkUrLQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -850,19 +726,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.43", + "version": "3.972.50", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.50.tgz", + "integrity": "sha512-b05Aelq5cqAvCCDQjCYacl0XmR8QhBNSqLbsdISkQmlQBa5oPS66zYPteWcSp5LswbpoIe552EUGjluKiadBig==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.38", - "@aws-sdk/credential-provider-http": "^3.972.40", - "@aws-sdk/credential-provider-ini": "^3.972.42", - "@aws-sdk/credential-provider-process": "^3.972.38", - "@aws-sdk/credential-provider-sso": "^3.972.42", - "@aws-sdk/credential-provider-web-identity": "^3.972.42", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/credential-provider-imds": "^4.3.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/credential-provider-env": "^3.972.43", + "@aws-sdk/credential-provider-http": "^3.972.45", + "@aws-sdk/credential-provider-ini": "^3.972.48", + "@aws-sdk/credential-provider-process": "^3.972.43", + "@aws-sdk/credential-provider-sso": "^3.972.47", + "@aws-sdk/credential-provider-web-identity": "^3.972.47", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -870,13 +748,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.38", + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.43.tgz", + "integrity": "sha512-GPokLNyvTfCmuaHk+v3GKVs4ZT3cMu5kgS2a+NPkOMt96cq6fSIK0g+mZHpGS6Cd4QGrPKesANEaLUKgOskTzg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -884,15 +764,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.42", + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.47.tgz", + "integrity": "sha512-0AzvLrzlvJs0DzbeWGvNj+bX3Uzd7VNS6vDqCOdZzBlCGKGd78uxctJSW9iK/Rt/nxiJqpTvrYQlVJ4guVM2Dw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/token-providers": "3.1049.0", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/token-providers": "3.1060.0", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -900,14 +782,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.42", + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.47.tgz", + "integrity": "sha512-eksfbUErOejUAGWBAcNqaP7IX21oUOEo73d9R56k9Ua4d57qS90NEYkWJsuSGzTXMFulCu17qXJI/qGmM7hvoA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -915,25 +799,27 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.1049.0", + "version": "3.1061.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1061.0.tgz", + "integrity": "sha512-Jf7N/lx74AV7BLvooCkqMqV4xBAyHJ+L/Hn7TbU2QSlQsVK8Ngm5R0Z9ljD4PwxCVfUUc8T8jGhY+ZaTyQjnRA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.1049.0", - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/credential-provider-cognito-identity": "^3.972.35", - "@aws-sdk/credential-provider-env": "^3.972.38", - "@aws-sdk/credential-provider-http": "^3.972.40", - "@aws-sdk/credential-provider-ini": "^3.972.42", - "@aws-sdk/credential-provider-login": "^3.972.42", - "@aws-sdk/credential-provider-node": "^3.972.43", - "@aws-sdk/credential-provider-process": "^3.972.38", - "@aws-sdk/credential-provider-sso": "^3.972.42", - "@aws-sdk/credential-provider-web-identity": "^3.972.42", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/credential-provider-imds": "^4.3.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/client-cognito-identity": "3.1061.0", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/credential-provider-cognito-identity": "^3.972.40", + "@aws-sdk/credential-provider-env": "^3.972.43", + "@aws-sdk/credential-provider-http": "^3.972.45", + "@aws-sdk/credential-provider-ini": "^3.972.48", + "@aws-sdk/credential-provider-login": "^3.972.47", + "@aws-sdk/credential-provider-node": "^3.972.50", + "@aws-sdk/credential-provider-process": "^3.972.43", + "@aws-sdk/credential-provider-sso": "^3.972.47", + "@aws-sdk/credential-provider-web-identity": "^3.972.47", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -941,59 +827,52 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.10", + "version": "3.997.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.15.tgz", + "integrity": "sha512-Fpri1/PXKMKveORZ7E00VLTlWS5DkfZkW70PUE+bOnpWpAeHAQLoiDHhkzN3kNWbbSsGg64+IZYiq/EZgME3Mg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/signature-v4-multi-region": "^3.996.27", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/fetch-http-handler": "^5.4.2", - "@smithy/node-http-handler": "^4.7.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/signature-v4-multi-region": "^3.996.31", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.27", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.31", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.31.tgz", + "integrity": "sha512-Kn2up9SlG1KC6wRtwf0d7waTGF6rvp9DxYqB54x6UCKdQ6kyaXCqHL4WGb5vUJga5kS8FxnjhY0LqM28aMvnNQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/signature-v4": "^5.4.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/types": "^3.973.10", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { - "version": "5.4.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.3", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1049.0", + "version": "3.1060.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1060.0.tgz", + "integrity": "sha512-6NZaMKkFhpaNiwLpHi1sZaYjidL/lCJE6ME6NxwA8gv9vQna+Kr0j4OFwVoz6tANRWM3WbGz6jiPsGX/Vkjwow==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.974.12", - "@aws-sdk/nested-clients": "^3.997.10", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", + "@aws-sdk/core": "^3.974.17", + "@aws-sdk/nested-clients": "^3.997.15", + "@aws-sdk/types": "^3.973.10", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { @@ -1001,16 +880,53 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.8", + "version": "3.973.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.10.tgz", + "integrity": "sha512-992QrTO7G9qCvKD0fx1rMlqcL14plUcRAbwmqqYVsuF3GrqcvlAL9qxR+baMafarEZ+l7DUQ5lCMmt5mbMhF7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.1", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.27.tgz", + "integrity": "sha512-hpsCXCOI436kxWpjtRuIHVvuPP81MOw8f18jzfZeg+UOiiOvlqWcmWChzEhJEu16cOC6+ku4ncBN+7rdt+DZ9g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.3", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@azure/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", @@ -1234,87 +1150,10 @@ "node": ">=0.8.0" } }, - "node_modules/@azure/msal-node/node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/@azure/msal-node/node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@azure/msal-node/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/@babel/runtime": { "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1636,11 +1475,13 @@ "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@cline/agents": { - "version": "0.0.42", + "version": "0.0.42-nightly.1780514867", + "resolved": "https://registry.npmjs.org/@cline/agents/-/agents-0.0.42-nightly.1780514867.tgz", + "integrity": "sha512-OhuoDpY0QL/mc/WhDeIdiiHvVyKweVjiKbdDcLCuoAqPzBdaEqJ4Xv0YssR+CKIkp8jf+CCmxzbt8cB0sOkSfA==", "license": "Apache-2.0", "dependencies": { - "@cline/llms": "0.0.42", - "@cline/shared": "0.0.42", + "@cline/llms": "0.0.42-nightly.1780514867", + "@cline/shared": "0.0.42-nightly.1780514867", "nanoid": "^5.1.7" }, "engines": { @@ -1648,11 +1489,13 @@ } }, "node_modules/@cline/core": { - "version": "0.0.42", + "version": "0.0.42-nightly.1780514867", + "resolved": "https://registry.npmjs.org/@cline/core/-/core-0.0.42-nightly.1780514867.tgz", + "integrity": "sha512-hnC2w05xvpWGGKlsXkKpgM6d/r2qoMqWqPF0cHTEfudfmb5RbrjWFsE3k/1A7kYDHKsYMqZkonWHmvQRSit0pQ==", "dependencies": { - "@cline/agents": "0.0.42", - "@cline/llms": "0.0.42", - "@cline/shared": "0.0.42", + "@cline/agents": "0.0.42-nightly.1780514867", + "@cline/llms": "0.0.42-nightly.1780514867", + "@cline/shared": "0.0.42-nightly.1780514867", "@modelcontextprotocol/sdk": "^1.29.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.214.0", @@ -2035,7 +1878,9 @@ } }, "node_modules/@cline/llms": { - "version": "0.0.42", + "version": "0.0.42-nightly.1780514867", + "resolved": "https://registry.npmjs.org/@cline/llms/-/llms-0.0.42-nightly.1780514867.tgz", + "integrity": "sha512-xuU5599N/snCy/mOvsKd5rNWWQXKp2SgBcmJ52BIjh5BcA4hlZiJUL3EPWDU4BEoPG6WEKhLiompNvMFwyShew==", "dependencies": { "@ai-sdk/amazon-bedrock": "^4.0.89", "@ai-sdk/anthropic": "^3.0.68", @@ -2046,7 +1891,8 @@ "@ai-sdk/openai-compatible": "^2.0.38", "@ai-sdk/provider": "^3.0.8", "@aws-sdk/credential-providers": "^3.922.0", - "@cline/shared": "0.0.42", + "@cline/shared": "0.0.42-nightly.1780514867", + "@jerome-benoit/sap-ai-provider": "4.6.9", "@langfuse/otel": "^4.0.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/sdk-trace-node": "^2.6.1", @@ -2071,36 +1917,10 @@ } } }, - "node_modules/@cline/llms/node_modules/@ai-sdk/anthropic": { - "version": "3.0.78", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@cline/llms/node_modules/@ai-sdk/google": { - "version": "3.0.75", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/@cline/llms/node_modules/@langfuse/otel": { "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@langfuse/otel/-/otel-4.6.1.tgz", + "integrity": "sha512-ZUa+nV5und6IYK2b5w1vXoNzU/Hfpl1MJ2uu9Woyb74ZBQi36nBwo7SeX+NLvy+n/UzKcJMetOYrA5ywlXvnuA==", "license": "MIT", "dependencies": { "@langfuse/core": "^4.6.1" @@ -2117,6 +1937,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/api-logs": { "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.218.0.tgz", + "integrity": "sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2128,6 +1950,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/context-async-hooks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.1.tgz", + "integrity": "sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -2138,6 +1962,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/exporter-trace-otlp-http": { "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.218.0.tgz", + "integrity": "sha512-8dqezsmPhtKitIK/eTipZhYl9EX2/gNQ5zUMhaz3uxEURwfkNf8IPvo6yNfrzbxdtpAOybS/+h7wmIWYqFSpiw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2156,6 +1982,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.218.0.tgz", + "integrity": "sha512-ZwqpkNL5W7RyGJPDZ9g06DvKp8KFTWPJPN12anpMQYSKpTSU0z3EIZuPq9vPGpS8siFyOqDYDAuCwlNO9FqgbA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2171,6 +1999,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/otlp-transformer": { "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.218.0.tgz", + "integrity": "sha512-CFaKH87WAzjuJ4awowTTLzUvMfaRfiOFG5+qm5S5ncyalRtN4ecQ+YmuANJSCrVPuvZFEkUgKhBPBndxi3rHsQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2190,6 +2020,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/resources": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2205,6 +2037,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/sdk-logs": { "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.218.0.tgz", + "integrity": "sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2222,6 +2056,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/sdk-metrics": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2237,6 +2073,8 @@ }, "node_modules/@cline/llms/node_modules/@opentelemetry/sdk-trace-node": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.1.tgz", + "integrity": "sha512-pCpQxU68lV+I9s9svqMyVu5iHdDDUnqUpSxqwyCU8A9ejEsSnMPCbearwsUO4yk08ZJzAIUCFuReMdVQvHrdvg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/context-async-hooks": "2.7.1", @@ -2252,10 +2090,14 @@ }, "node_modules/@cline/llms/node_modules/@streamparser/json": { "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.21.tgz", + "integrity": "sha512-v+49JBiG1kmc/9Ug79Lz9wyKaRocBgCnpRaLpdy7p0d3ICKtOAfc/H/Epa1j3F6YdnzjnZKKrnJ8xnh/v1P8Aw==", "license": "MIT" }, "node_modules/@cline/shared": { - "version": "0.0.42", + "version": "0.0.42-nightly.1780514867", + "resolved": "https://registry.npmjs.org/@cline/shared/-/shared-0.0.42-nightly.1780514867.tgz", + "integrity": "sha512-h03+ENf2Zqab1O6EcnD0PPhr3SFvnAx2lOHaTjad8945AEWB1AMEeqDWqNaOM9u75mzuUq16PogpGyaiZpPcYA==", "dependencies": { "aws4fetch": "^1.0.20", "jsonrepair": "^3.13.2", @@ -2266,6 +2108,15 @@ "node": ">=22" } }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "dev": true, @@ -2299,6 +2150,17 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@epic-web/invariant": { "version": "1.0.0", "dev": true, @@ -2770,21 +2632,6 @@ "version": "0.12.0", "license": "MIT" }, - "node_modules/@google/genai/node_modules/google-auth-library": { - "version": "10.6.2", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.1.4", - "gcp-metadata": "8.1.2", - "google-logging-utils": "1.1.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@google/genai/node_modules/p-retry": { "version": "4.6.2", "license": "MIT", @@ -2796,13 +2643,6 @@ "node": ">=8" } }, - "node_modules/@google/genai/node_modules/retry": { - "version": "0.13.1", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", "license": "Apache-2.0", @@ -2967,6 +2807,25 @@ "node": ">=8" } }, + "node_modules/@jerome-benoit/sap-ai-provider": { + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/@jerome-benoit/sap-ai-provider/-/sap-ai-provider-4.6.9.tgz", + "integrity": "sha512-z+ayDBasD2/PB4iAO6Lp6myQ96KZYjN/gBX3WAisaFKcCeRIsJyzHcBQh26lDu0cpzAybRmI5XUrWzn3nRaqgA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "^3.0.10", + "@ai-sdk/provider-utils": "^4.0.26", + "@sap-ai-sdk/foundation-models": "^2.10.0", + "@sap-ai-sdk/orchestration": "^2.10.0", + "zod": "^4.4.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "ai": "^5.0.0 || ^6.0.0" + } + }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", "license": "MIT", @@ -2977,6 +2836,8 @@ }, "node_modules/@langfuse/core": { "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@langfuse/core/-/core-4.6.1.tgz", + "integrity": "sha512-DtQoKWHQh0I0MsJxcKrBQVKAJ3fea6+raXlISVY3NDMFG/zSKkdkNouQvUXQtSCHBbOFupHMBw8imM30lbhq3g==", "license": "MIT", "peerDependencies": { "@opentelemetry/api": "^1.9.0" @@ -3542,10 +3403,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, "node_modules/@modelcontextprotocol/sdk/node_modules/ip-address": { "version": "10.2.0", "license": "MIT", @@ -3920,8 +3777,22 @@ "version": "1.0.2", "license": "ISC" }, + "node_modules/@nodable/entities": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@openai/codex": { "version": "0.130.0", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.130.0.tgz", + "integrity": "sha512-WGDj+RZ3TXWC/7MlwprgLWOqzpwatPIINPhP3IRzHA0ni+o3QZ4i4xrS2uWwGmHUJ395J5JHwoZAAZYyfJyz6w==", "license": "Apache-2.0", "optional": true, "bin": { @@ -3942,6 +3813,8 @@ "node_modules/@openai/codex-darwin-arm64": { "name": "@openai/codex", "version": "0.130.0-darwin-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.130.0-darwin-arm64.tgz", + "integrity": "sha512-R9pkGC7kwC8yQ8el5hvBlmugQlcsG/pHMEFgZluu03X9fD2TezGxdq3KqRDRCZuMYl07ILamVEoqknuJ0cq7MA==", "cpu": [ "arm64" ], @@ -4040,7 +3913,9 @@ } }, "node_modules/@opencode-ai/sdk": { - "version": "1.15.12", + "version": "1.15.13", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.15.13.tgz", + "integrity": "sha512-4TwojIoQ8EG6/mVBuUVYZXiFcwNmiiytEnjnvyuvSJjGwFIlw2YIBFxtSVC3FbwwbwHT63teh1RHiQUUC4U5xw==", "license": "MIT", "dependencies": { "cross-spawn": "7.0.6" @@ -6259,6 +6134,159 @@ "win32" ] }, + "node_modules/@sap-ai-sdk/ai-api": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@sap-ai-sdk/ai-api/-/ai-api-2.11.0.tgz", + "integrity": "sha512-KmBSIJfwSv7MlVFbNbZx9RQXT9P2hYvBQKPmAwURXc6Vh+UfNi1F2b45Nt8Yi90z+HFw0lsazgVN5wgav+qFGQ==", + "license": "Apache-2.0", + "dependencies": { + "@sap-ai-sdk/core": "^2.11.0", + "@sap-cloud-sdk/connectivity": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0" + } + }, + "node_modules/@sap-ai-sdk/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@sap-ai-sdk/core/-/core-2.11.0.tgz", + "integrity": "sha512-6xJ0X88vi/eDG159rDs4S/g8Y6Gq9/B4O21oimIPccSJQF7WIB2+2Z4lFKTSBem/5E3FfxqknIZ/5bPX+/6lHA==", + "license": "Apache-2.0", + "dependencies": { + "@sap-cloud-sdk/connectivity": "^4.7.0", + "@sap-cloud-sdk/http-client": "^4.7.0", + "@sap-cloud-sdk/openapi": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0" + } + }, + "node_modules/@sap-ai-sdk/foundation-models": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@sap-ai-sdk/foundation-models/-/foundation-models-2.11.0.tgz", + "integrity": "sha512-AYRzR2+RA+9yCGzLymdUjcNPVDosXxHQrbFYNEcGicpYZu/Gy0WOc1GU/FCywfdqa0mGphSRpGCT+eduXLA1pw==", + "license": "Apache-2.0", + "dependencies": { + "@sap-ai-sdk/ai-api": "^2.11.0", + "@sap-ai-sdk/core": "^2.11.0", + "@sap-cloud-sdk/connectivity": "^4.7.0", + "@sap-cloud-sdk/http-client": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0" + } + }, + "node_modules/@sap-ai-sdk/orchestration": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@sap-ai-sdk/orchestration/-/orchestration-2.11.0.tgz", + "integrity": "sha512-UR/erV97rtuEUXPGgMeDPmr3Yn2DLF5duQcvd4BleZ4bOSorarIj6igEd8XnBnGpSvcMCIgs5B6J2Vvi7E3+Ag==", + "license": "Apache-2.0", + "dependencies": { + "@sap-ai-sdk/ai-api": "^2.11.0", + "@sap-ai-sdk/core": "^2.11.0", + "@sap-ai-sdk/prompt-registry": "^2.11.0", + "@sap-cloud-sdk/util": "^4.6.0", + "yaml": "^2.9.0" + } + }, + "node_modules/@sap-ai-sdk/prompt-registry": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@sap-ai-sdk/prompt-registry/-/prompt-registry-2.11.0.tgz", + "integrity": "sha512-1WrqGjwHltF/aOXoNDPYtvvaprQarPsKZUC0wSMeC6XZokoYvjvHNrltLm1IFygpjTr8yma45JJkKcwV1qzvDg==", + "license": "Apache-2.0", + "dependencies": { + "@sap-ai-sdk/core": "^2.11.0", + "zod": "^4.4.3" + } + }, + "node_modules/@sap-cloud-sdk/connectivity": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/connectivity/-/connectivity-4.7.0.tgz", + "integrity": "sha512-+EgdTpGi3ZomPuv/ab+bWQIxUfJvownW2MzdYSvX7hkEkmKJfod0O6ja2OqC+OJBLm1TE0JpbJ6AcCkqeZYuOg==", + "license": "Apache-2.0", + "dependencies": { + "@sap-cloud-sdk/resilience": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0", + "@sap/xsenv": "^6.2.0", + "@sap/xssec": "^4.13.0", + "async-retry": "^1.3.3", + "axios": "^1.15.0", + "jks-js": "^1.1.6", + "jsonwebtoken": "^9.0.3", + "safe-stable-stringify": "^2.5.0" + } + }, + "node_modules/@sap-cloud-sdk/http-client": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/http-client/-/http-client-4.7.0.tgz", + "integrity": "sha512-7+S6ru7SrnyKA2MGimX09oix0EVwmPGcCAz0TRwFZVnglU+VTRmZ8QdcwcVTR26E9YhkR4OVl6EK7jb2Z0OxfQ==", + "license": "Apache-2.0", + "dependencies": { + "@sap-cloud-sdk/connectivity": "^4.7.0", + "@sap-cloud-sdk/resilience": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0", + "axios": "^1.15.0" + } + }, + "node_modules/@sap-cloud-sdk/openapi": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/openapi/-/openapi-4.7.0.tgz", + "integrity": "sha512-OKTEGVScCRsfgL9Lk/bEKcGnyfq0GgruXuZfsxoMbTqbe2f9X/fgHgXIWQEkTuXQplkrSDiNFRyvl0n/ON9Ycg==", + "license": "Apache-2.0", + "dependencies": { + "@sap-cloud-sdk/connectivity": "^4.7.0", + "@sap-cloud-sdk/http-client": "^4.7.0", + "@sap-cloud-sdk/resilience": "^4.7.0", + "@sap-cloud-sdk/util": "^4.7.0", + "axios": "^1.15.0" + } + }, + "node_modules/@sap-cloud-sdk/resilience": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/resilience/-/resilience-4.7.0.tgz", + "integrity": "sha512-L6PV49nNyZHnTNFbvaufadm+qOhaammXLXkDQmD7WIzMjhiYMqa/obK3NJoohe/kZ7q73jPB2vdLsAqopqTh0A==", + "license": "Apache-2.0", + "dependencies": { + "@sap-cloud-sdk/util": "^4.7.0", + "async-retry": "^1.3.3", + "axios": "^1.15.0", + "opossum": "^9.0.0" + } + }, + "node_modules/@sap-cloud-sdk/util": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/util/-/util-4.7.0.tgz", + "integrity": "sha512-nWJXMdM0Pcx/ipM2+5BvSciQKyCc0LAAO+acCOAQp65SA4HEQ2Odp9yxidY4ijW42TVp3fSMBvGwVjbWWx9Uew==", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.15.0", + "logform": "^2.7.0", + "voca": "^1.4.1", + "winston": "^3.19.0", + "winston-transport": "^4.9.0" + } + }, + "node_modules/@sap/xsenv": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sap/xsenv/-/xsenv-6.2.1.tgz", + "integrity": "sha512-R1p7VdD3N3jvdkL8av4vLqF+cTQihTz9mCqqF+oa9rVZvgLaCb4ODyZ1dln5/fBgg1OSuch0ESxu3AqZrXVknw==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "debug": "4.4.3", + "node-cache": "^5.1.2", + "verror": "1.10.1" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, + "node_modules/@sap/xssec": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@sap/xssec/-/xssec-4.13.0.tgz", + "integrity": "sha512-8e+bU+OyAIpAGXQanOopZa5YEK+yHKw84dhhihcCotF40MSNFbVHjQ4xM5hf4QndlqDGfXIuvXmoOMuDATa/gA==", + "license": "SAP DEVELOPER LICENSE AGREEMENT", + "dependencies": { + "debug": "^4.4.3", + "jwt-decode": "^4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@secretlint/node": { "version": "10.2.2", "dev": true, @@ -6933,40 +6961,64 @@ } }, "node_modules/@smithy/core": { - "version": "3.24.5", + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.6.tgz", + "integrity": "sha512-wBXDRup6UU97VKyaiRo8AssnfStPtG0oAAfpq/bC0a1YYau8pM86YB4kM6ccoVi1mS8l/UHbn9oDM+7uozr/ug==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.14.2", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@aws-crypto/crc32": { - "version": "5.2.0", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.7.tgz", + "integrity": "sha512-xj8gq/bjFABAh6qWPSDCYcY3kzQIm4b561C+YnHH4zGq8rOgzQ3Shk+JGlpUxSd41UGiO6FkLdUCtNX1FAeHgg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@smithy/eventstream-codec": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.3.6.tgz", + "integrity": "sha512-Ussyv240JxwQP8AmkYdm26wGP/1I8QmIv0ZosgDJDlSzD73FEdj1BOpXMc06VrxX5KxTKhadFNomT2SWutUnpg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/core": "^3.24.6", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.6.tgz", + "integrity": "sha512-FEwEYJ1jlBKdhe9TPzfghEi1bP55ZeEImlDkEa62bBBYzUcnB6RUCyuiS2mqKt6ZVjUbBgcNhzfIctH+Hevx9g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -6975,8 +7027,50 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { + "node_modules/@smithy/node-http-handler": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.6.tgz", + "integrity": "sha512-3fya8i7GrJilQouk4cZJKdy5k8MWQBpjfXrRNaXDedH8r779tr0jcxyH3+yoTmsluc2+vF4S343yFbnvu8ExDQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.6.tgz", + "integrity": "sha512-Ojg4B6oIDlIr1R86xCDJt1zJWnYa0VINmqdjfe9qxWjdRivHalZ3iSlQgVqYbW0MdpFOC5XfHEWsnbmdnpIILQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.3.tgz", + "integrity": "sha512-YupL0ZWmFtJexUN2cHzkvvF/b9pKrtAIfT1o7/oY/Ppu8IYeZ+lDPM5vZdQJaSeA132dJCqojjGC9NhXeF71VQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -6986,85 +7080,29 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.3.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.3", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.3.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.4.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.3", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.7.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.24.3", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.14.2", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@smithy/util-utf8": { - "version": "4.3.5", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.3.6.tgz", + "integrity": "sha512-tAa4sePYB7mlJzdYbdBqdv37KwFKWixmM/r3ihcI0HFOVjf+a5oGvtcLXcGm4S1bY4DFsLAIOHgjubtp+oRufw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.24.5", + "@smithy/core": "^3.24.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "license": "MIT" @@ -7879,6 +7917,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, "node_modules/@types/turndown": { "version": "5.0.6", "dev": true, @@ -7900,6 +7944,8 @@ }, "node_modules/@vercel/oidc": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", "license": "Apache-2.0", "engines": { "node": ">= 20" @@ -8694,10 +8740,12 @@ } }, "node_modules/ai": { - "version": "6.0.193", + "version": "6.0.195", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.195.tgz", + "integrity": "sha512-IYZpuVz0boWbpIQYyinfWFrvQ1N0dG+EVB63it45B2YAU/MxxCnwz4zBswjYnPtHnJBedpMPNrwVbeczbl2GKg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "3.0.121", + "@ai-sdk/gateway": "3.0.123", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "^1.9.0" @@ -8711,6 +8759,8 @@ }, "node_modules/ai-sdk-provider-claude-code": { "version": "3.4.4", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-claude-code/-/ai-sdk-provider-claude-code-3.4.4.tgz", + "integrity": "sha512-iHcup5SHh4Tul1RIi9J+bnpngen8WX66yC3lsz1YlbtwAmRhUEzZUuGKzmFGIN8Pmx9uQrerGfLJdbFxIxKkyw==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "^3.0.0", @@ -8726,6 +8776,8 @@ }, "node_modules/ai-sdk-provider-codex-cli": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-codex-cli/-/ai-sdk-provider-codex-cli-1.2.1.tgz", + "integrity": "sha512-YBOycHYrdIXUcqOXS/BPDTjABjNl2ZBUtcy+PQmuRNUHaZohedZdWNxVAcIw65RZHzcasDojcD+qgLr0QvJX0Q==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "^3.0.0", @@ -8744,6 +8796,8 @@ }, "node_modules/ai-sdk-provider-opencode-sdk": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-opencode-sdk/-/ai-sdk-provider-opencode-sdk-3.0.2.tgz", + "integrity": "sha512-X2UDG+gRR7/V8YClSRWKXwCGNIUld8NnkIRXMzPB7MYKiZ0mYm4XJqo1HW9C6UsgNvsuQJBf/LTsFHSnEQF/fw==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "^3.0.8", @@ -8831,20 +8885,6 @@ "version": "4.2.11", "license": "ISC" }, - "node_modules/archiver-utils/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/archiver-utils/node_modules/isarray": { "version": "1.0.0", "license": "MIT" @@ -8898,10 +8938,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/archiver-utils/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/arg": { "version": "4.1.3", "dev": true, @@ -8911,6 +8947,24 @@ "version": "2.0.1", "license": "Python-2.0" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "dev": true, @@ -8923,6 +8977,15 @@ "version": "3.2.6", "license": "MIT" }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/aws4fetch": { "version": "1.0.20", "license": "MIT" @@ -9021,6 +9084,12 @@ "version": "3.4.7", "license": "MIT" }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, "node_modules/buffer-crc32": { "version": "1.0.0", "license": "MIT", @@ -9289,17 +9358,6 @@ "node": ">=0.8.19" } }, - "node_modules/caching-transform/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caching-transform/node_modules/is-typedarray": { "version": "1.0.0", "dev": true, @@ -9721,6 +9779,15 @@ "resolved": "", "link": true }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "license": "MIT", @@ -9745,6 +9812,19 @@ "version": "13.0.3", "license": "MIT" }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/color-convert": { "version": "2.0.1", "license": "MIT", @@ -9759,6 +9839,39 @@ "version": "1.1.4", "license": "MIT" }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, "node_modules/commander": { "version": "11.1.0", "dev": true, @@ -9772,6 +9885,12 @@ "dev": true, "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -9919,6 +10038,8 @@ }, "node_modules/dify-ai-provider": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dify-ai-provider/-/dify-ai-provider-1.1.0.tgz", + "integrity": "sha512-THfsde1O2JW5gaaHJYpkjhWYtsba1Uw6FIgIiaJLMGxU+dzf5KXXiKrG1xIvYPZfu4kicmPU5wnCQ4lNGcohvg==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -9928,6 +10049,8 @@ }, "node_modules/dify-ai-provider/node_modules/@ai-sdk/provider": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.3.tgz", + "integrity": "sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -9938,6 +10061,8 @@ }, "node_modules/dify-ai-provider/node_modules/@ai-sdk/provider-utils": { "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.25.tgz", + "integrity": "sha512-CvsRu+32Y8a167s+lrIBtsybvgTHp8j9y+6BeTvLeoW3Q+okw/b4CnNUFOLIXsRaKHQKAH+IHNJPYWywfpw0LA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.3", @@ -9953,6 +10078,8 @@ }, "node_modules/dify-ai-provider/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" @@ -9984,6 +10111,12 @@ "version": "1.3.3", "license": "MIT" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.21.5", "license": "MIT", @@ -10288,10 +10421,6 @@ "wrappy": "1" } }, - "node_modules/exceljs/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, "node_modules/exceljs/node_modules/isarray": { "version": "1.0.0", "license": "MIT" @@ -10342,10 +10471,6 @@ "version": "4.4.0", "license": "MIT" }, - "node_modules/exceljs/node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, "node_modules/exceljs/node_modules/lodash.union": { "version": "4.6.0", "license": "MIT" @@ -10380,13 +10505,6 @@ "node": ">= 6" } }, - "node_modules/exceljs/node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/exceljs/node_modules/tar-stream": { "version": "2.2.0", "license": "MIT", @@ -10401,10 +10519,6 @@ "node": ">=6" } }, - "node_modules/exceljs/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/exceljs/node_modules/uuid": { "version": "8.3.2", "license": "MIT", @@ -10870,6 +10984,15 @@ "version": "3.0.2", "license": "MIT" }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, "node_modules/fast-csv": { "version": "4.3.6", "license": "MIT", @@ -10918,10 +11041,6 @@ "version": "4.6.0", "license": "MIT" }, - "node_modules/fast-csv/node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, "node_modules/fast-csv/node_modules/lodash.isequal": { "version": "4.5.0", "license": "MIT" @@ -11135,6 +11254,49 @@ "node": ">=8.0" } }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, "node_modules/fetch-blob": { "version": "3.2.0", "funding": [ @@ -11325,6 +11487,12 @@ "semver": "bin/semver.js" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, "node_modules/follow-redirects": { "version": "1.16.0", "funding": [ @@ -12055,6 +12223,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-auth-library": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/google-logging-utils": { "version": "1.1.3", "license": "Apache-2.0", @@ -12217,6 +12402,12 @@ "version": "1.0.4", "license": "MIT" }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/is-plain-obj": { "version": "4.1.0", "license": "MIT", @@ -12244,6 +12435,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "license": "MIT", @@ -12846,11 +13049,6 @@ "wrappy": "1" } }, - "node_modules/istanbul-lib-processinfo/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, "node_modules/istanbul-lib-processinfo/node_modules/once": { "version": "1.4.0", "dev": true, @@ -13111,6 +13309,17 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jks-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/jks-js/-/jks-js-1.1.7.tgz", + "integrity": "sha512-BeiDRKsAi1NwEwgx2JB/9/0tar5BNGIv+foGm1G5GgiyR35s/iUnfd/BWqYd16mLDD8qTaAVBrIcOOuVqXJZNQ==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.4.0", + "node-int64": "^0.4.0", + "node-rsa": "^1.1.1" + } + }, "node_modules/js-yaml": { "version": "4.1.1", "license": "MIT", @@ -13137,10 +13346,14 @@ }, "node_modules/json-schema": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-to-ts": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -13166,11 +13379,35 @@ }, "node_modules/jsonrepair": { "version": "3.14.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.14.0.tgz", + "integrity": "sha512-tWPGKMZf/8UPim+fcW2EfcQ/d/7aKUrP6IECz9G3Tu6Q5dX0orSleqJ9z6sSw7qrQkjF8/Edo4DvsWBZ8H+HNg==", "license": "ISC", "bin": { "jsonrepair": "bin/cli.js" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jszip": { "version": "3.10.1", "license": "(MIT OR GPL-3.0-or-later)", @@ -13189,10 +13426,6 @@ "version": "3.0.6", "license": "MIT" }, - "node_modules/jszip/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", "license": "MIT" @@ -13240,10 +13473,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/jszip/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/jwa": { "version": "2.0.1", "license": "MIT", @@ -13292,6 +13521,12 @@ "node": ">=0.10.0" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "dev": true, @@ -13866,6 +14101,65 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -14459,6 +14753,18 @@ "version": "1.0.6", "license": "MIT" }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "license": "MIT", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "funding": [ @@ -14514,6 +14820,21 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, "node_modules/node-machine-id": { "version": "1.1.12", "license": "MIT" @@ -14545,6 +14866,15 @@ "license": "MIT", "optional": true }, + "node_modules/node-rsa": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", + "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", + "license": "MIT", + "dependencies": { + "asn1": "^0.2.4" + } + }, "node_modules/npm-run-all": { "version": "4.1.5", "dev": true, @@ -14870,11 +15200,6 @@ "wrappy": "1" } }, - "node_modules/nyc/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, "node_modules/nyc/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -15120,6 +15445,15 @@ ], "license": "MIT" }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/open": { "version": "10.2.0", "license": "MIT", @@ -15294,6 +15628,15 @@ } } }, + "node_modules/opossum": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/opossum/-/opossum-9.0.0.tgz", + "integrity": "sha512-K76U0QkxOfUZamneQuzz+AP0fyfTJcCplZ2oZL93nxeupuJbN4s6uFNbmVCt4eWqqGqRnnowdFuBicJ1fLMVxw==", + "license": "Apache-2.0", + "engines": { + "node": "^24 || ^22 || ^20" + } + }, "node_modules/ora": { "version": "8.2.0", "dev": true, @@ -15552,6 +15895,21 @@ "semver": "bin/semver" } }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "license": "MIT", @@ -17004,13 +17362,6 @@ "node": ">= 0.6.0" } }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/readdir-glob": { "version": "1.1.3", "license": "Apache-2.0", @@ -17151,6 +17502,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/rimraf": { "version": "6.1.3", "dev": true, @@ -17259,6 +17619,15 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "license": "MIT" @@ -18089,11 +18458,6 @@ "wrappy": "1" } }, - "node_modules/spawn-wrap/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, "node_modules/spawn-wrap/node_modules/is-windows": { "version": "1.0.2", "dev": true, @@ -18175,11 +18539,29 @@ "dev": true, "license": "ISC" }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/std-env": { "version": "4.1.0", "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "dev": true, @@ -19574,6 +19956,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/supports-color": { "version": "10.2.2", "dev": true, @@ -19739,6 +20133,12 @@ "b4a": "^1.6.4" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "dev": true, @@ -19804,8 +20204,19 @@ "tree-kill": "cli.js" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-algebra": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", "license": "MIT" }, "node_modules/ts-morph": { @@ -20368,10 +20779,6 @@ "wrappy": "1" } }, - "node_modules/unzipper/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, "node_modules/unzipper/node_modules/isarray": { "version": "1.0.0", "license": "MIT" @@ -20443,10 +20850,6 @@ "version": "0.3.9", "license": "MIT/X11" }, - "node_modules/unzipper/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/unzipper/node_modules/wrappy": { "version": "1.0.2", "license": "ISC" @@ -20456,6 +20859,12 @@ "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==", + "license": "MIT" + }, "node_modules/uuid": { "version": "11.1.1", "funding": [ @@ -20472,6 +20881,20 @@ "dev": true, "license": "MIT" }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/vite": { "version": "7.3.3", "license": "MIT", @@ -21221,6 +21644,12 @@ } } }, + "node_modules/voca": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/voca/-/voca-1.4.1.tgz", + "integrity": "sha512-NJC/BzESaHT1p4B5k4JykxedeltmNbau4cummStd4RjFojgq/kLew5TzYge9N2geeWyI2w8T30wUET5v+F7ZHA==", + "license": "MIT" + }, "node_modules/vscode-uri": { "version": "3.1.0", "license": "MIT" @@ -21400,6 +21829,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/workerpool": { "version": "9.3.4", "dev": true, @@ -21424,6 +21917,21 @@ } } }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xml2js": { "version": "0.5.0", "dev": true, @@ -21717,16 +22225,6 @@ "node": ">= 14" } }, - "node_modules/zip-stream/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zip-stream/node_modules/normalize-path": { "version": "3.0.0", "license": "MIT", diff --git a/apps/vscode/package.json b/apps/vscode/package.json index 13943265b9..6bb8f04ce7 100644 --- a/apps/vscode/package.json +++ b/apps/vscode/package.json @@ -493,10 +493,10 @@ "dependencies": { "@anthropic-ai/sdk": "^0.37.0", "@bufbuild/protobuf": "^2.2.5", - "@cline/agents": "^0.0.42", - "@cline/core": "^0.0.42", - "@cline/llms": "^0.0.42", - "@cline/shared": "^0.0.42", + "@cline/agents": "0.0.42-nightly.1780514867", + "@cline/core": "0.0.42-nightly.1780514867", + "@cline/llms": "0.0.42-nightly.1780514867", + "@cline/shared": "0.0.42-nightly.1780514867", "@google/genai": "^1.30.0", "@grpc/grpc-js": "^1.9.15", "@grpc/proto-loader": "^0.7.13", diff --git a/apps/vscode/src/common.ts b/apps/vscode/src/common.ts index fe441e4993..45aa313578 100644 --- a/apps/vscode/src/common.ts +++ b/apps/vscode/src/common.ts @@ -10,6 +10,7 @@ import { HookProcessRegistry } from "./core/hooks/HookProcessRegistry" import { StateManager } from "./core/storage/StateManager" import { AgentConfigLoader } from "./core/task/tools/subagent/AgentConfigLoader" import { ExtensionRegistryInfo } from "./registry" +import { registerVsCodeLmHandler } from "./sdk/vscode-lm/register-vscode-lm" import { ErrorService } from "./services/error" import { featureFlagsService } from "./services/feature-flags" import { getDistinctId } from "./services/logging/distinctId" @@ -51,6 +52,11 @@ export async function initialize(storageContext: StorageContext): Promise ({ registerHandler })) +vi.mock("@/shared/services/Logger", () => ({ Logger: { debug: vi.fn() } })) + +// `vscode.lm` presence is the gate. Use a mutable mock so each test controls it. +const lm: { selectChatModels?: unknown } = {} +vi.mock("vscode", () => ({ + get lm() { + return lm + }, +})) + +describe("registerVsCodeLmHandler gating", () => { + beforeEach(() => { + vi.resetModules() + registerHandler.mockClear() + delete lm.selectChatModels + }) + + it("does not register when the vscode.lm API is unavailable (e.g. JetBrains)", async () => { + const { registerVsCodeLmHandler, isVsCodeLmApiAvailable } = await import("./register-vscode-lm") + expect(isVsCodeLmApiAvailable()).toBe(false) + registerVsCodeLmHandler() + expect(registerHandler).not.toHaveBeenCalled() + }) + + it("registers once when the vscode.lm API is available", async () => { + lm.selectChatModels = vi.fn() + const { registerVsCodeLmHandler, isVsCodeLmApiAvailable, VSCODE_LM_PROVIDER_ID } = await import("./register-vscode-lm") + expect(isVsCodeLmApiAvailable()).toBe(true) + registerVsCodeLmHandler() + registerVsCodeLmHandler() // idempotent + expect(registerHandler).toHaveBeenCalledTimes(1) + expect(registerHandler).toHaveBeenCalledWith(VSCODE_LM_PROVIDER_ID, expect.any(Function)) + }) +}) diff --git a/apps/vscode/src/sdk/vscode-lm/register-vscode-lm.ts b/apps/vscode/src/sdk/vscode-lm/register-vscode-lm.ts new file mode 100644 index 0000000000..0d472dc333 --- /dev/null +++ b/apps/vscode/src/sdk/vscode-lm/register-vscode-lm.ts @@ -0,0 +1,45 @@ +// Registers the VS Code Language Model handler with the Cline SDK. +// +// The SDK's `@cline/llms` factory registry (registerHandler) exists for +// providers that need host-only dependencies — here, the `vscode` module / +// `vscode.lm` API — which cannot live in the SDK package. Once registered, +// `createHandler({ providerId: "vscode-lm", ... })` returns this handler, and +// the agent runtime resolves "vscode-lm" through the same registry, so both the +// main task loop and standalone utility calls use the VS Code LM API. +// +// The `vscode.lm` API only exists in VS Code and derivatives. On other hosts +// (e.g. JetBrains, which runs the shared activation path through a `vscode` +// shim) it is absent, so registration is gated on the API being present. + +import { registerHandler } from "@cline/llms" +import * as vscode from "vscode" +import { Logger } from "@/shared/services/Logger" +import { VsCodeLmHandler } from "./vscode-lm-handler" + +export const VSCODE_LM_PROVIDER_ID = "vscode-lm" + +/** + * Whether the host exposes the VS Code Language Model API. False on hosts + * without `vscode.lm` (e.g. JetBrains / standalone), where the provider must not + * be registered or surfaced. + */ +export function isVsCodeLmApiAvailable(): boolean { + return typeof vscode.lm?.selectChatModels === "function" +} + +// Registration is process-global (the SDK registry is a module singleton), so a +// module-local flag guards against redundant re-registration on reload. +let registered = false + +/** + * Register the VS Code LM handler factory, once, when the `vscode.lm` API is + * available. No-ops on hosts without the API and on repeated activation. + */ +export function registerVsCodeLmHandler(): void { + if (registered || !isVsCodeLmApiAvailable()) { + return + } + registerHandler(VSCODE_LM_PROVIDER_ID, (config) => new VsCodeLmHandler(config)) + registered = true + Logger.debug("[vscode-lm] Registered VS Code Language Model handler with the SDK") +} diff --git a/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.test.ts b/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.test.ts new file mode 100644 index 0000000000..6bcdbaaeb6 --- /dev/null +++ b/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.test.ts @@ -0,0 +1,159 @@ +import type { Message } from "@cline/llms" +import { describe, expect, it, vi } from "vitest" + +// The shared vscode vitest stub does not define the Language Model API classes, +// so mock the small subset the transform uses. Each class records enough to +// assert structure in tests. +vi.mock("vscode", () => { + class LanguageModelTextPart { + constructor(public value: string) {} + } + class LanguageModelToolCallPart { + constructor( + public callId: string, + public name: string, + public input: object, + ) {} + } + class LanguageModelToolResultPart { + constructor( + public callId: string, + public content: unknown[], + ) {} + } + const LanguageModelChatMessage = { + User: (content: unknown) => ({ role: "user", content }), + Assistant: (content: unknown) => ({ role: "assistant", content }), + } + return { LanguageModelTextPart, LanguageModelToolCallPart, LanguageModelToolResultPart, LanguageModelChatMessage } +}) + +// Logger is referenced by asObjectSafe; stub it to avoid host dependencies. +vi.mock("@/shared/services/Logger", () => ({ Logger: { warn: vi.fn(), error: vi.fn(), debug: vi.fn() } })) + +const { convertToVsCodeLmMessages, asObjectSafe } = await import("./vscode-lm-format") +const vscode = await import("vscode") + +describe("convertToVsCodeLmMessages", () => { + it("converts simple string user/assistant messages", () => { + const messages: Message[] = [ + { role: "user", content: "hello" }, + { role: "assistant", content: "hi there" }, + ] + const result = convertToVsCodeLmMessages(messages) + expect(result).toEqual([ + { role: "user", content: "hello" }, + { role: "assistant", content: "hi there" }, + ]) + }) + + it("converts a user message with text + tool_result, tool results first", () => { + const messages: Message[] = [ + { + role: "user", + content: [ + { type: "text", text: "after tool" }, + { type: "tool_result", tool_use_id: "call-1", name: "read", content: "file contents" }, + ], + }, + ] + const [message] = convertToVsCodeLmMessages(messages) + const content = message.content as unknown[] + // Tool result part is emitted before the text part. + expect(content[0]).toBeInstanceOf(vscode.LanguageModelToolResultPart) + expect((content[0] as { callId: string }).callId).toBe("call-1") + expect(content[1]).toBeInstanceOf(vscode.LanguageModelTextPart) + expect((content[1] as { value: string }).value).toBe("after tool") + }) + + it("renders images as placeholders (VS Code LM does not accept images)", () => { + const messages: Message[] = [{ role: "user", content: [{ type: "image", data: "abc", mediaType: "image/png" }] }] + const [message] = convertToVsCodeLmMessages(messages) + const part = (message.content as { value: string }[])[0] + expect(part).toBeInstanceOf(vscode.LanguageModelTextPart) + expect(part.value).toContain("image/png") + expect(part.value).toContain("not supported") + }) + + it("extracts text from structured (untyped) tool_result content (run_commands shape)", () => { + // SDK tool executors return rich, untyped objects (ToolOperationResult: + // { query, result, success }) — NOT typed text blocks. The result text + // must reach the model, not an empty string. + const messages: Message[] = [ + { role: "assistant", content: [{ type: "tool_use", id: "c1", name: "run_commands", input: {} }] }, + { + role: "user", + content: [ + { + type: "tool_result", + tool_use_id: "c1", + name: "run_commands", + // biome-ignore lint/suspicious/noExplicitAny: simulating runtime untyped content + content: [{ query: "ls", result: "demo.ts\ndemo.txt\nsrc\n", success: true }] as any, + }, + ], + }, + { role: "user", content: "continue" }, + ] + const result = convertToVsCodeLmMessages(messages) + const toolResultMsg = result[1] + const trPart = (toolResultMsg.content as { content: { value: string }[] }[])[0] + expect(trPart).toBeInstanceOf(vscode.LanguageModelToolResultPart) + // The inner text part must contain the actual command output, not "". + expect(trPart.content[0].value).toBe("demo.ts\ndemo.txt\nsrc\n") + }) + + it("appends a trailing plain user message when the convo ends on tool results", () => { + const messages: Message[] = [ + { role: "assistant", content: [{ type: "tool_use", id: "c1", name: "read", input: {} }] }, + { role: "user", content: [{ type: "tool_result", tool_use_id: "c1", name: "read", content: "file body" }] }, + ] + const result = convertToVsCodeLmMessages(messages) + // Last message must NOT be the tool-result one (Copilot requirement); it's + // a plain string user message (LanguageModelChatMessage.User(string)). + const last = result[result.length - 1] + expect(last.role).toBe("user") + expect(typeof last.content).toBe("string") + expect(last.content as unknown as string).toContain("result of calling one or more tools") + // The tool-result message is preserved before the nudge. + expect(result).toHaveLength(3) + expect((result[1].content as unknown[])[0]).toBeInstanceOf(vscode.LanguageModelToolResultPart) + }) + + it("does NOT append a trailing nudge when the convo ends on a normal user message", () => { + const messages: Message[] = [ + { role: "assistant", content: [{ type: "tool_use", id: "c1", name: "read", input: {} }] }, + { role: "user", content: [{ type: "tool_result", tool_use_id: "c1", name: "read", content: "body" }] }, + { role: "user", content: "thanks, continue" }, + ] + const result = convertToVsCodeLmMessages(messages) + expect(result).toHaveLength(3) + expect(result[result.length - 1].content).toBe("thanks, continue") + }) + + it("converts an assistant tool_use into a tool call part with object input", () => { + const messages: Message[] = [ + { role: "assistant", content: [{ type: "tool_use", id: "call-9", name: "edit", input: { path: "a.ts" } }] }, + ] + const [message] = convertToVsCodeLmMessages(messages) + const part = (message.content as unknown[])[0] + expect(part).toBeInstanceOf(vscode.LanguageModelToolCallPart) + expect((part as { name: string }).name).toBe("edit") + expect((part as { input: object }).input).toEqual({ path: "a.ts" }) + }) +}) + +describe("asObjectSafe", () => { + it("parses JSON strings", () => { + expect(asObjectSafe('{"a":1}')).toEqual({ a: 1 }) + }) + it("clones objects", () => { + const input = { a: 1 } + expect(asObjectSafe(input)).toEqual({ a: 1 }) + expect(asObjectSafe(input)).not.toBe(input) + }) + it("returns {} for nullish or invalid", () => { + expect(asObjectSafe(null)).toEqual({}) + expect(asObjectSafe("not json")).toEqual({}) + }) +}) diff --git a/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.ts b/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.ts new file mode 100644 index 0000000000..0c5264d40c --- /dev/null +++ b/apps/vscode/src/sdk/vscode-lm/vscode-lm-format.ts @@ -0,0 +1,206 @@ +// Converts Cline SDK messages (@cline/llms `Message`) into VS Code Language +// Model API messages (`vscode.LanguageModelChatMessage`). +// +// SDK content blocks (text / image / tool_use / tool_result) map onto VS Code LM +// parts. VS Code LM does not accept images, so image inputs become a text +// placeholder. Tool calls and tool results round-trip as +// `LanguageModelToolCallPart` / `LanguageModelToolResultPart`. + +import type { ContentBlock, Message } from "@cline/llms"; +import * as vscode from "vscode"; +import { Logger } from "@/shared/services/Logger"; +import { extractToolOutputText } from "../message-translator"; + +/** + * Safely coerce a tool-call input value into a plain object for + * `LanguageModelToolCallPart`, which requires an object input. + */ +export function asObjectSafe(value: unknown): object { + if (!value) { + return {}; + } + + try { + if (typeof value === "string") { + return JSON.parse(value); + } + if (typeof value === "object") { + return Object.assign({}, value); + } + return {}; + } catch (error) { + Logger.warn("Cline : Failed to parse object:", error); + return {}; + } +} + +function imagePlaceholder(mediaType?: string): vscode.LanguageModelTextPart { + return new vscode.LanguageModelTextPart( + `[Image (${mediaType || "unknown media-type"}) not supported by VSCode LM API]`, + ); +} + +/** + * Render the content of a tool_result block into VS Code LM text parts. + */ +function toolResultTextParts( + content: ContentBlock & { type: "tool_result" }, +): vscode.LanguageModelTextPart[] { + if (typeof content.content === "string") { + return [new vscode.LanguageModelTextPart(content.content)]; + } + + // SDK tool executors (run_commands, search_codebase, read_files, MCP, ...) + // put rich, untyped result objects in `content` — e.g. an array of + // ToolOperationResult `{ query, result, success, error? }` — rather than typed + // text/image/file content blocks. Such items have no `.type`/`.text`, so they + // can only be read via extractToolOutputText (which pulls `.result`/`.error` + // out of ToolOperationResult[], else falls back to JSON.stringify). When no + // item looks like a typed content block, treat the whole array as untyped + // output and extract its text in one pass. + const isTypedBlock = ( + part: unknown, + ): part is { type: "text" | "image" | "file" } => + typeof part === "object" && + part !== null && + typeof (part as { type?: unknown }).type === "string"; + + if (!content.content.some(isTypedBlock)) { + const text = extractToolOutputText(content.content); + return [new vscode.LanguageModelTextPart(text)]; + } + + const parts = content.content.map((part) => { + switch (part.type) { + case "text": + return new vscode.LanguageModelTextPart(part.text ?? ""); + case "image": + return imagePlaceholder(part.mediaType); + case "file": + return new vscode.LanguageModelTextPart(part.content ?? ""); + default: + // Untyped item interleaved with typed blocks — serialize just this item. + return new vscode.LanguageModelTextPart(extractToolOutputText(part)); + } + }); + + return parts.length > 0 ? parts : [new vscode.LanguageModelTextPart("")]; +} + +export function convertToVsCodeLmMessages( + messages: Message[], +): vscode.LanguageModelChatMessage[] { + const vsCodeLmMessages: vscode.LanguageModelChatMessage[] = []; + + for (const message of messages) { + // Simple string content. + if (typeof message.content === "string") { + vsCodeLmMessages.push( + message.role === "assistant" + ? vscode.LanguageModelChatMessage.Assistant(message.content) + : vscode.LanguageModelChatMessage.User(message.content), + ); + continue; + } + + if (message.role === "user") { + const toolResults = message.content.filter( + (part): part is ContentBlock & { type: "tool_result" } => + part.type === "tool_result", + ); + const nonTool = message.content.filter( + (part) => part.type === "text" || part.type === "image", + ); + + const contentParts = [ + // Tool results first, as VS Code LM tool result parts. + ...toolResults.map( + (toolResult) => + new vscode.LanguageModelToolResultPart( + toolResult.tool_use_id, + toolResultTextParts(toolResult), + ), + ), + // Then text / image-placeholder parts. + ...nonTool.map((part) => + part.type === "image" + ? imagePlaceholder(part.mediaType) + : new vscode.LanguageModelTextPart( + part.type === "text" ? part.text : "", + ), + ), + ]; + + vsCodeLmMessages.push(vscode.LanguageModelChatMessage.User(contentParts)); + continue; + } + + if (message.role === "assistant") { + const toolUses = message.content.filter( + (part): part is ContentBlock & { type: "tool_use" } => + part.type === "tool_use", + ); + const nonTool = message.content.filter( + (part) => part.type === "text" || part.type === "image", + ); + + const contentParts = [ + // Tool calls first. + ...toolUses.map( + (toolUse) => + new vscode.LanguageModelToolCallPart( + toolUse.id, + toolUse.name, + asObjectSafe(toolUse.input), + ), + ), + // Then text (images are not generated/produced for assistant turns). + ...nonTool.map((part) => + part.type === "image" + ? new vscode.LanguageModelTextPart( + "[Image generation not supported by VSCode LM API]", + ) + : new vscode.LanguageModelTextPart( + part.type === "text" ? part.text : "", + ), + ), + ]; + + vsCodeLmMessages.push( + vscode.LanguageModelChatMessage.Assistant(contentParts), + ); + } + } + + // Copilot (and other VS Code LM) models require that the prompt does NOT end + // on a tool-result message — the final message must be a non-tool-result + // UserMessage. If we end on tool results, the model can't "see" the output and + // tends to re-run tools or call random ones. Mirror the official VS Code chat + // sample (chat-sample/src/toolsPrompt.tsx), which appends a trailing user + // nudge after tool results. + if (endsWithToolResult(vsCodeLmMessages)) { + vsCodeLmMessages.push( + vscode.LanguageModelChatMessage.User( + "Above is the result of calling one or more tools. The user cannot see the results, so you should explain them to the user if referencing them in your answer.", + ), + ); + } + + return vsCodeLmMessages; +} + +/** + * True when the last message is a user message whose content consists of (only) + * tool result parts. + */ +function endsWithToolResult( + messages: vscode.LanguageModelChatMessage[], +): boolean { + const last = messages[messages.length - 1]; + if (!last || !Array.isArray(last.content) || last.content.length === 0) { + return false; + } + return last.content.some( + (part) => part instanceof vscode.LanguageModelToolResultPart, + ); +} diff --git a/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.test.ts b/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.test.ts new file mode 100644 index 0000000000..3c1fa6a5b3 --- /dev/null +++ b/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.test.ts @@ -0,0 +1,218 @@ +import type { ProviderConfig, ToolDefinition } from "@cline/llms"; +import { describe, expect, it, vi } from "vitest"; + +// Real-enough `vscode` mock: the handler uses `instanceof` on the stream parts +// and the LanguageModelChatToolMode enum, and constructs a CancellationTokenSource. +vi.mock("vscode", () => { + class LanguageModelTextPart { + constructor(public value: string) {} + } + class LanguageModelToolCallPart { + constructor( + public callId: string, + public name: string, + public input: object, + ) {} + } + class LanguageModelToolResultPart { + constructor( + public callId: string, + public content: unknown[], + ) {} + } + class CancellationTokenSource { + token = {}; + cancel = vi.fn(); + dispose = vi.fn(); + } + class CancellationError extends Error {} + return { + LanguageModelTextPart, + LanguageModelToolCallPart, + LanguageModelToolResultPart, + CancellationTokenSource, + CancellationError, + LanguageModelChatToolMode: { Auto: 1, Required: 2 }, + lm: { selectChatModels: vi.fn() }, + LanguageModelChatMessage: { + User: (content: unknown) => ({ role: "user", content }), + Assistant: (content: unknown) => ({ role: "assistant", content }), + }, + }; +}); +vi.mock("@/shared/services/Logger", () => ({ + Logger: { warn: vi.fn(), error: vi.fn(), debug: vi.fn() }, +})); + +const { parseVsCodeLmSelector, VsCodeLmHandler } = await import( + "./vscode-lm-handler" +); +const vscode = await import("vscode"); + +describe("parseVsCodeLmSelector", () => { + it("returns an empty selector for empty/undefined input", () => { + expect(parseVsCodeLmSelector(undefined)).toEqual({}); + expect(parseVsCodeLmSelector("")).toEqual({}); + }); + + it("parses vendor/family (the common case)", () => { + expect(parseVsCodeLmSelector("copilot/claude-sonnet")).toEqual({ + vendor: "copilot", + family: "claude-sonnet", + }); + }); + + it("parses vendor/family/version/id positionally", () => { + expect(parseVsCodeLmSelector("copilot/claude-sonnet/1.0/abc")).toEqual({ + vendor: "copilot", + family: "claude-sonnet", + version: "1.0", + id: "abc", + }); + }); + + it("parses encoded family values containing slashes", () => { + expect(parseVsCodeLmSelector("copilot/openai%2Fgpt-4o")).toEqual({ + vendor: "copilot", + family: "openai/gpt-4o", + }); + }); + + it("omits trailing missing segments", () => { + expect(parseVsCodeLmSelector("copilot")).toEqual({ vendor: "copilot" }); + }); +}); + +// Build a fake LanguageModelChat whose stream yields the given parts, and +// capture the requestOptions passed to sendRequest for assertions. +function fakeModel(parts: unknown[]) { + const calls: { options: Record }[] = []; + const model = { + id: "copilot-claude", + name: "Claude", + vendor: "copilot", + family: "claude-sonnet", + version: "1", + maxInputTokens: 200_000, + sendRequest: vi.fn( + (_messages: unknown, options: Record) => { + calls.push({ options }); + return Promise.resolve({ + stream: (async function* () { + for (const part of parts) { + yield part; + } + })(), + text: (async function* () {})(), + }); + }, + ), + countTokens: vi.fn(async () => 0), + }; + return { model, calls }; +} + +async function collect(gen: AsyncGenerator): Promise { + const out: T[] = []; + for await (const v of gen) { + out.push(v); + } + return out; +} + +const config = { + providerId: "vscode-lm", + modelId: "copilot/claude-sonnet", +} as ProviderConfig; + +describe("VsCodeLmHandler.createMessage tool calling", () => { + it("passes tools + Auto toolMode to sendRequest when tools are provided", async () => { + const { model, calls } = fakeModel([ + new vscode.LanguageModelTextPart("hello"), + ]); + vi.mocked(vscode.lm.selectChatModels).mockResolvedValue([model] as never); + + const handler = new VsCodeLmHandler(config); + const tools: ToolDefinition[] = [ + { + name: "read_file", + description: "Reads a file", + inputSchema: { + type: "object", + properties: { path: { type: "string" } }, + }, + }, + ]; + await collect( + handler.createMessage("sys", [{ role: "user", content: "hi" }], tools), + ); + + expect(calls).toHaveLength(1); + expect(calls[0].options.toolMode).toBe( + vscode.LanguageModelChatToolMode.Auto, + ); + expect(calls[0].options.tools).toEqual([ + { + name: "read_file", + description: "Reads a file", + inputSchema: { + type: "object", + properties: { path: { type: "string" } }, + }, + }, + ]); + }); + + it("does not set tools when none are provided", async () => { + const { model, calls } = fakeModel([ + new vscode.LanguageModelTextPart("hi"), + ]); + vi.mocked(vscode.lm.selectChatModels).mockResolvedValue([model] as never); + + const handler = new VsCodeLmHandler(config); + await collect( + handler.createMessage("sys", [{ role: "user", content: "hi" }]), + ); + + expect(calls[0].options.tools).toBeUndefined(); + expect(calls[0].options.toolMode).toBeUndefined(); + }); + + it("emits a native tool_calls chunk for a LanguageModelToolCallPart", async () => { + const { model } = fakeModel([ + new vscode.LanguageModelTextPart("thinking"), + new vscode.LanguageModelToolCallPart("call-1", "read_file", { + path: "a.ts", + }), + ]); + vi.mocked(vscode.lm.selectChatModels).mockResolvedValue([model] as never); + + const handler = new VsCodeLmHandler(config); + const chunks = await collect( + handler.createMessage( + "sys", + [{ role: "user", content: "hi" }], + [{ name: "read_file", description: "", inputSchema: {} }], + ), + ); + + const toolChunk = chunks.find((c) => c.type === "tool_calls"); + expect(toolChunk).toEqual({ + type: "tool_calls", + id: expect.any(String), + tool_call: { + call_id: "call-1", + function: { + id: "call-1", + name: "read_file", + arguments: { path: "a.ts" }, + }, + }, + }); + // A text chunk and a final usage chunk are also present. + expect(chunks.some((c) => c.type === "text" && c.text === "thinking")).toBe( + true, + ); + expect(chunks.at(-1)?.type).toBe("usage"); + }); +}); diff --git a/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.ts b/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.ts new file mode 100644 index 0000000000..485052edff --- /dev/null +++ b/apps/vscode/src/sdk/vscode-lm/vscode-lm-handler.ts @@ -0,0 +1,295 @@ +// Cline SDK `ApiHandler` (from `@cline/llms`) backed by the VS Code Language +// Model API (`vscode.lm`). Registered via `registerHandler("vscode-lm", ...)` +// (see ./register-vscode-lm.ts) so the SDK routes "vscode-lm" inference here. +// +// Model selection: the SDK `ProviderConfig` has no field for a VS Code LM +// selector, so the selector travels as a `vendor/family[/version/id]` string in +// `ProviderConfig.modelId` (the model-id channel the rest of the SDK adapter +// uses) and is parsed back into a `LanguageModelChatSelector` here. See +// parseVsCodeLmSelector / apps/vscode/src/shared/vsCodeSelectorUtils.ts. + +import type { + ApiHandler, + ApiStreamChunk, + HandlerModelInfo, + Message, + ProviderConfig, + ToolDefinition, +} from "@cline/llms"; +import { nanoid } from "nanoid"; +import * as vscode from "vscode"; +import { Logger } from "@/shared/services/Logger"; +import { + parseVsCodeLmModelSelector, + SELECTOR_SEPARATOR, +} from "@/shared/vsCodeSelectorUtils"; +import { convertToVsCodeLmMessages } from "./vscode-lm-format"; + +const FALLBACK_CONTEXT_WINDOW = 128_000; + +/** + * Parse a stringified VS Code LM selector (`vendor/family[/version/id]`) back + * into a `LanguageModelChatSelector`. The model picker commonly supplies just + * `vendor` and `family`; any further segments map to version/id positionally, + * mirroring `stringifyVsCodeLmModelSelector`. + */ +export function parseVsCodeLmSelector( + modelId: string | undefined, +): vscode.LanguageModelChatSelector { + return parseVsCodeLmModelSelector(modelId); +} + +function extractText(message: vscode.LanguageModelChatMessage): string { + if (typeof message.content === "string") { + return message.content; + } + if (Array.isArray(message.content)) { + return message.content + .filter( + (part): part is vscode.LanguageModelTextPart => + part instanceof vscode.LanguageModelTextPart, + ) + .map((part) => part.value) + .join(""); + } + return ""; +} + +export class VsCodeLmHandler implements ApiHandler { + private readonly selector: vscode.LanguageModelChatSelector; + private client: vscode.LanguageModelChat | null = null; + private currentRequestCancellation: vscode.CancellationTokenSource | null = + null; + private abortSignal: AbortSignal | undefined; + + constructor(config: ProviderConfig) { + this.selector = parseVsCodeLmSelector(config.modelId); + this.abortSignal = config.abortSignal; + } + + setAbortSignal(signal: AbortSignal | undefined): void { + this.abortSignal = signal; + } + + abort(): void { + this.ensureCleanState(); + } + + private ensureCleanState(): void { + if (this.currentRequestCancellation) { + this.currentRequestCancellation.cancel(); + this.currentRequestCancellation.dispose(); + this.currentRequestCancellation = null; + } + } + + private async getClient(): Promise { + if (this.client) { + return this.client; + } + try { + const models = await vscode.lm.selectChatModels(this.selector); + if (models && models.length > 0) { + this.client = models[0]; + return this.client; + } + throw new Error( + `No VS Code language model matched selector ${JSON.stringify(this.selector)}. Ensure GitHub Copilot (or another LM provider) is installed and the model is enabled.`, + ); + } catch (error) { + const message = error instanceof Error ? error.message : "Unknown error"; + throw new Error( + `Cline : Failed to select model: ${message}`, + ); + } + } + + getMessages( + systemPrompt: string, + messages: Message[], + ): vscode.LanguageModelChatMessage[] { + return [ + vscode.LanguageModelChatMessage.Assistant(systemPrompt), + ...convertToVsCodeLmMessages(messages), + ]; + } + + // VS Code LM does not expose a tokenizer cheaply, so approximate as chars/4. + // Good enough for budgeting and usage display. + private approxTokens(text: string): number { + return Math.ceil((text || "").length / 4); + } + + async *createMessage( + systemPrompt: string, + messages: Message[], + tools?: ToolDefinition[], + ): AsyncGenerator { + this.ensureCleanState(); + const client = await this.getClient(); + const id = nanoid(); + + const vsCodeLmMessages = this.getMessages(systemPrompt, messages); + const inputTokens = vsCodeLmMessages.reduce( + (sum, msg) => sum + this.approxTokens(extractText(msg)), + 0, + ); + + this.currentRequestCancellation = new vscode.CancellationTokenSource(); + if (this.abortSignal) { + if (this.abortSignal.aborted) { + this.currentRequestCancellation.cancel(); + } else { + this.abortSignal.addEventListener( + "abort", + () => this.currentRequestCancellation?.cancel(), + { once: true }, + ); + } + } + + let accumulatedText = ""; + + try { + const requestOptions: vscode.LanguageModelChatRequestOptions = { + justification: `Cline would like to use '${client.name}' from '${client.vendor}', Click 'Allow' to proceed.`, + }; + + // Native tool calling: the VS Code LM API (finalized in VS Code 1.95) + // accepts tool definitions on the request and streams back + // LanguageModelToolCallPart for invocations. Map the SDK's + // ToolDefinition[] onto vscode.LanguageModelChatTool[]; tool RESULTS are + // already round-tripped as LanguageModelToolResultPart by + // convertToVsCodeLmMessages. We use "Auto" tool mode so the model + // decides when to call tools (vs. forcing a call). + if (tools && tools.length > 0) { + requestOptions.tools = tools.map((tool) => ({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + })); + requestOptions.toolMode = vscode.LanguageModelChatToolMode.Auto; + } + + const response = await client.sendRequest( + vsCodeLmMessages, + requestOptions, + this.currentRequestCancellation.token, + ); + + for await (const chunk of response.stream) { + if (chunk instanceof vscode.LanguageModelTextPart) { + if (typeof chunk.value !== "string") { + continue; + } + accumulatedText += chunk.value; + const textChunk: ApiStreamChunk = { + type: "text", + text: chunk.value, + id, + }; + yield textChunk; + } else if (chunk instanceof vscode.LanguageModelToolCallPart) { + // A tool invocation from the model. callId/name/input come straight + // from the API (input is already a parsed object); forward them as a + // tool-call chunk for the SDK runtime to execute. + if (!chunk.name || !chunk.callId || !chunk.input) { + continue; + } + const toolCallChunk: ApiStreamChunk = { + type: "tool_calls", + id, + tool_call: { + call_id: chunk.callId, + function: { + id: chunk.callId, + name: chunk.name, + arguments: chunk.input as Record, + }, + }, + }; + // Approximate output token accounting still wants the tool call's + // size; serialize for the estimate without affecting the chunk. + accumulatedText += JSON.stringify({ + name: chunk.name, + input: chunk.input, + callId: chunk.callId, + }); + yield toolCallChunk; + } + } + + const usageChunk: ApiStreamChunk = { + type: "usage", + inputTokens, + outputTokens: this.approxTokens(accumulatedText), + totalCost: 0, + id, + }; + yield usageChunk; + } catch (error) { + this.ensureCleanState(); + if (error instanceof vscode.CancellationError) { + throw new Error( + "Cline : Request cancelled by user", + ); + } + if (error instanceof Error) { + Logger.error("Cline : Stream error:", error); + throw error; + } + throw new Error( + `Cline : Response stream error: ${String(error)}`, + ); + } finally { + this.ensureCleanState(); + } + } + + getModel(): HandlerModelInfo { + if (this.client) { + const modelParts = [ + this.client.vendor, + this.client.family, + this.client.version, + ].filter(Boolean); + const modelId = this.client.id || modelParts.join(SELECTOR_SEPARATOR); + const contextWindow = + typeof this.client.maxInputTokens === "number" && + this.client.maxInputTokens > 0 + ? this.client.maxInputTokens + : FALLBACK_CONTEXT_WINDOW; + return { + id: modelId, + info: { + id: modelId, + contextWindow, + maxInputTokens: contextWindow, + maxTokens: -1, + description: `VSCode Language Model: ${modelId}`, + }, + }; + } + + // No client yet (e.g. getModel() called before createMessage()). + const fallbackId = + [ + this.selector.vendor, + this.selector.family, + this.selector.version, + this.selector.id, + ] + .filter(Boolean) + .join(SELECTOR_SEPARATOR) || "vscode-lm"; + return { + id: fallbackId, + info: { + id: fallbackId, + contextWindow: FALLBACK_CONTEXT_WINDOW, + maxInputTokens: FALLBACK_CONTEXT_WINDOW, + maxTokens: -1, + description: `VSCode Language Model (Fallback): ${fallbackId}`, + }, + }; + } +} diff --git a/apps/vscode/src/shared/vsCodeSelectorUtils.test.ts b/apps/vscode/src/shared/vsCodeSelectorUtils.test.ts new file mode 100644 index 0000000000..0677493dee --- /dev/null +++ b/apps/vscode/src/shared/vsCodeSelectorUtils.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from "vitest"; +import { + parseVsCodeLmModelSelector, + stringifyVsCodeLmModelSelector, +} from "./vsCodeSelectorUtils"; + +describe("VS Code LM selector string encoding", () => { + it("round-trips vendor/family selectors", () => { + const selector = { vendor: "copilot", family: "claude-sonnet" }; + const value = stringifyVsCodeLmModelSelector(selector); + + expect(value).toBe("copilot/claude-sonnet"); + expect(parseVsCodeLmModelSelector(value)).toEqual(selector); + }); + + it("preserves family values containing slashes", () => { + const selector = { vendor: "copilot", family: "openai/gpt-4o" }; + const value = stringifyVsCodeLmModelSelector(selector); + + expect(value).toBe("copilot/openai%2Fgpt-4o"); + expect(parseVsCodeLmModelSelector(value)).toEqual(selector); + }); + + it("round-trips optional version and id segments", () => { + const selector = { + vendor: "copilot", + family: "anthropic/claude", + version: "2026/06", + id: "model/id", + }; + const value = stringifyVsCodeLmModelSelector(selector); + + expect(parseVsCodeLmModelSelector(value)).toEqual(selector); + }); + + it("keeps compatibility with old unencoded vendor/family values", () => { + expect(parseVsCodeLmModelSelector("copilot/claude-sonnet")).toEqual({ + vendor: "copilot", + family: "claude-sonnet", + }); + }); +}); diff --git a/apps/vscode/src/shared/vsCodeSelectorUtils.ts b/apps/vscode/src/shared/vsCodeSelectorUtils.ts index 620fccccd8..bc5c24c8b0 100644 --- a/apps/vscode/src/shared/vsCodeSelectorUtils.ts +++ b/apps/vscode/src/shared/vsCodeSelectorUtils.ts @@ -1,7 +1,61 @@ -import { LanguageModelChatSelector } from "vscode" +import type { LanguageModelChatSelector } from "vscode"; -export const SELECTOR_SEPARATOR = "/" +export const SELECTOR_SEPARATOR = "/"; -export function stringifyVsCodeLmModelSelector(selector: LanguageModelChatSelector): string { - return [selector.vendor, selector.family, selector.version, selector.id].filter(Boolean).join(SELECTOR_SEPARATOR) +function encodeSelectorSegment(value: string): string { + return encodeURIComponent(value); +} + +function decodeSelectorSegment(value: string): string { + try { + return decodeURIComponent(value); + } catch { + // A segment that isn't valid percent-encoding is passed through as-is, so + // a malformed or hand-written selector string still yields a usable value. + return value; + } +} + +export function stringifyVsCodeLmModelSelector( + selector: LanguageModelChatSelector, +): string { + return [selector.vendor, selector.family, selector.version, selector.id] + .filter((part): part is string => Boolean(part)) + .map(encodeSelectorSegment) + .join(SELECTOR_SEPARATOR); +} + +/** + * Parse a stringified VS Code LM selector (`vendor/family[/version/id]`) back + * into a `LanguageModelChatSelector`. + * + * Selector segments are URI-encoded by stringifyVsCodeLmModelSelector so model + * family/id values can themselves contain `/` (common for BYOK providers such as + * `openai/gpt-4o`). Splitting on the separator therefore yields up to four + * positional segments (vendor, family, version, id); each is decoded + * independently, and missing trailing segments are simply omitted. + */ +export function parseVsCodeLmModelSelector( + modelId: string | undefined, +): LanguageModelChatSelector { + if (!modelId) { + return {}; + } + + const parts = modelId.split(SELECTOR_SEPARATOR); + const [vendor, family, version, id] = parts.map(decodeSelectorSegment); + const selector: LanguageModelChatSelector = {}; + if (vendor) { + selector.vendor = vendor; + } + if (family) { + selector.family = family; + } + if (version) { + selector.version = version; + } + if (id) { + selector.id = id; + } + return selector; } diff --git a/apps/vscode/vitest.config.ts b/apps/vscode/vitest.config.ts index 74b062d28d..25fc3fe964 100644 --- a/apps/vscode/vitest.config.ts +++ b/apps/vscode/vitest.config.ts @@ -1,5 +1,5 @@ -import path from "node:path" -import { defineConfig } from "vitest/config" +import path from "node:path"; +import { defineConfig } from "vitest/config"; // Vitest config for the VSCode extension's SDK-adapter and model-catalog // unit tests. (The bulk of the extension's unit tests still run under mocha @@ -8,6 +8,7 @@ export default defineConfig({ test: { include: [ "src/sdk/**/*.test.ts", + "src/shared/vsCodeSelectorUtils.test.ts", "src/core/storage/remote-config/**/*.test.ts", "src/shared/model-catalog/provider-helpers.test.ts", "src/core/controller/models/__tests__/providerCatalogHandlers.test.ts", @@ -24,9 +25,18 @@ export default defineConfig({ }, resolve: { alias: { - "@cline/core": path.resolve(__dirname, "src/test/cline-core-vitest-stub.ts"), - "@cline/llms": path.resolve(__dirname, "node_modules/@cline/llms/dist/index.js"), - "@cline/shared": path.resolve(__dirname, "node_modules/@cline/shared/dist/index.js"), + "@cline/core": path.resolve( + __dirname, + "src/test/cline-core-vitest-stub.ts", + ), + "@cline/llms": path.resolve( + __dirname, + "node_modules/@cline/llms/dist/index.js", + ), + "@cline/shared": path.resolve( + __dirname, + "node_modules/@cline/shared/dist/index.js", + ), vscode: path.resolve(__dirname, "src/test/vscode-vitest-stub.ts"), "@": path.resolve(__dirname, "src"), "@api": path.resolve(__dirname, "src/core/api"), @@ -35,12 +45,18 @@ export default defineConfig({ "@hosts": path.resolve(__dirname, "src/hosts"), "@integrations": path.resolve(__dirname, "src/integrations"), "@services": path.resolve(__dirname, "src/services"), - "@shared/proto/cline/common": path.resolve(__dirname, "src/shared/proto/cline/common.ts"), - "@shared/proto/cline/models": path.resolve(__dirname, "src/shared/proto/cline/models.ts"), + "@shared/proto/cline/common": path.resolve( + __dirname, + "src/shared/proto/cline/common.ts", + ), + "@shared/proto/cline/models": path.resolve( + __dirname, + "src/shared/proto/cline/models.ts", + ), "@shared/proto": path.resolve(__dirname, "src/shared/proto"), "@shared": path.resolve(__dirname, "src/shared"), "@utils": path.resolve(__dirname, "src/utils"), "@packages": path.resolve(__dirname, "src/packages"), }, }, -}) +}); diff --git a/apps/vscode/webview-ui/src/components/settings/providers/VSCodeLmProvider.tsx b/apps/vscode/webview-ui/src/components/settings/providers/VSCodeLmProvider.tsx index 56d10e038b..dc3204e9c6 100644 --- a/apps/vscode/webview-ui/src/components/settings/providers/VSCodeLmProvider.tsx +++ b/apps/vscode/webview-ui/src/components/settings/providers/VSCodeLmProvider.tsx @@ -1,48 +1,62 @@ -import { EmptyRequest } from "@shared/proto/cline/common" -import { Mode } from "@shared/storage/types" -import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react" -import { useCallback, useEffect, useState } from "react" -import { useInterval } from "react-use" -import * as vscodemodels from "vscode" -import { useExtensionState } from "@/context/ExtensionStateContext" -import { ModelsServiceClient } from "@/services/grpc-client" -import { DROPDOWN_Z_INDEX, DropdownContainer } from "../ApiOptions" -import { getModeSpecificFields } from "../utils/providerUtils" -import { useApiConfigurationHandlers } from "../utils/useApiConfigurationHandlers" +import { EmptyRequest } from "@shared/proto/cline/common"; +import type { Mode } from "@shared/storage/types"; +import { + parseVsCodeLmModelSelector, + stringifyVsCodeLmModelSelector, +} from "@shared/vsCodeSelectorUtils"; +import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react"; +import { useCallback, useEffect, useState } from "react"; +import { useInterval } from "react-use"; +import type * as vscodemodels from "vscode"; +import { useExtensionState } from "@/context/ExtensionStateContext"; +import { ModelsServiceClient } from "@/services/grpc-client"; +import { DROPDOWN_Z_INDEX, DropdownContainer } from "../ApiOptions"; +import { getModeSpecificFields } from "../utils/providerUtils"; +import { useApiConfigurationHandlers } from "../utils/useApiConfigurationHandlers"; interface VSCodeLmProviderProps { - currentMode: Mode + currentMode: Mode; } export const VSCodeLmProvider = ({ currentMode }: VSCodeLmProviderProps) => { - const [vsCodeLmModels, setVsCodeLmModels] = useState([]) - const { apiConfiguration } = useExtensionState() - const { handleFieldChange, handleModeFieldChange } = useApiConfigurationHandlers() + const [vsCodeLmModels, setVsCodeLmModels] = useState< + vscodemodels.LanguageModelChatSelector[] + >([]); + const { apiConfiguration } = useExtensionState(); + const { handleModeFieldChange } = useApiConfigurationHandlers(); - const { vsCodeLmModelSelector } = getModeSpecificFields(apiConfiguration, currentMode) + const { vsCodeLmModelSelector } = getModeSpecificFields( + apiConfiguration, + currentMode, + ); // Poll VS Code LM models const requestVsCodeLmModels = useCallback(async () => { try { - const response = await ModelsServiceClient.getVsCodeLmModels(EmptyRequest.create({})) - if (response && response.models) { - setVsCodeLmModels(response.models) + const response = await ModelsServiceClient.getVsCodeLmModels( + EmptyRequest.create({}), + ); + if (response?.models) { + setVsCodeLmModels(response.models); } } catch (error) { - console.error("Failed to fetch VS Code LM models:", error) - setVsCodeLmModels([]) + console.error("Failed to fetch VS Code LM models:", error); + setVsCodeLmModels([]); } - }, []) + }, []); useEffect(() => { - requestVsCodeLmModels() - }, [requestVsCodeLmModels]) + requestVsCodeLmModels(); + }, [requestVsCodeLmModels]); - useInterval(requestVsCodeLmModels, 2000) + useInterval(requestVsCodeLmModels, 2000); return (
- + @@ -50,30 +64,36 @@ export const VSCodeLmProvider = ({ currentMode }: VSCodeLmProviderProps) => { { - const value = (e.target as HTMLInputElement).value + const value = (e.target as HTMLInputElement).value; if (!value) { - return + return; } - const [vendor, family] = value.split("/") handleModeFieldChange( - { plan: "planModeVsCodeLmModelSelector", act: "actModeVsCodeLmModelSelector" }, - { vendor, family }, + { + plan: "planModeVsCodeLmModelSelector", + act: "actModeVsCodeLmModelSelector", + }, + parseVsCodeLmModelSelector(value), currentMode, - ) + ); }} style={{ width: "100%" }} value={ vsCodeLmModelSelector - ? `${vsCodeLmModelSelector.vendor ?? ""}/${vsCodeLmModelSelector.family ?? ""}` + ? stringifyVsCodeLmModelSelector(vsCodeLmModelSelector) : "" - }> + } + > Select a model... - {vsCodeLmModels.map((model) => ( - - {model.vendor} - {model.family} - - ))} + {vsCodeLmModels.map((model) => { + const value = stringifyVsCodeLmModelSelector(model); + return ( + + {model.vendor} - {model.family} + + ); + })} ) : (

{ fontSize: "12px", marginTop: "5px", color: "var(--vscode-descriptionForeground)", - }}> - Use models from your GitHub Copilot subscription. Install the{" "} - Copilot extension and - enable Claude models in Copilot settings to get started. + }} + > + Uses models contributed by other extensions through the VS Code + Language Model API. The most common source is GitHub Copilot — + install the{" "} + + Copilot extension + {" "} + and enable models in Copilot settings — but any extension that + registers a language model provider will appear here.

)}
- ) -} + ); +}; diff --git a/apps/vscode/webview-ui/src/utils/getConfiguredProviders.ts b/apps/vscode/webview-ui/src/utils/getConfiguredProviders.ts index 65110e4963..c8c812c16e 100644 --- a/apps/vscode/webview-ui/src/utils/getConfiguredProviders.ts +++ b/apps/vscode/webview-ui/src/utils/getConfiguredProviders.ts @@ -1,6 +1,7 @@ import type { ApiConfiguration, ApiProvider } from "@shared/api" import PROVIDERS from "@shared/providers/providers.json" import type { RemoteConfigFields } from "@shared/storage/state-keys" +import { PLATFORM_CONFIG, PlatformType } from "@/config/platform.config" /** * Returns a list of API providers that are configured (have required credentials/settings) @@ -215,8 +216,11 @@ export function getConfiguredProviders( configured.push("litellm") } - // VSCode LM - always potentially available - configured.push("vscode-lm") + // VSCode LM - VS Code only (the vscode.lm API does not exist on other hosts + // such as JetBrains). Potentially available there whenever models are installed. + if (PLATFORM_CONFIG.type === PlatformType.VSCODE) { + configured.push("vscode-lm") + } // Claude Code - requires path if (apiConfiguration.claudeCodePath) {