diff --git a/.vscode/settings.json b/.vscode/settings.json index 77c430d..cf7e00b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,10 +11,11 @@ }, "editor.insertSpaces": true, "ecl.debugLogging": true, - "ecl.launchConfiguration": "not found", + "ecl.launchConfiguration": "no selection", "ecl.targetCluster": { "localhost": "thor", - "not found": "thor" + "not found": "thor", + "no selection": "thor" }, "svg.preview.background": "dark-transparent" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b261aff..ecb6ac8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,23 +13,23 @@ "html-to-text": "9.0.5" }, "devDependencies": { - "@eslint/js": "9.39.1", - "@fluentui/react": "8.125.1", - "@fluentui/react-hooks": "8.10.1", - "@hpcc-js/api": "3.4.1", - "@hpcc-js/common": "3.5.1", - "@hpcc-js/comms": "3.11.1", - "@hpcc-js/dgrid": "3.5.1", - "@hpcc-js/dgrid-shim": "3.3.1", - "@hpcc-js/esbuild-plugins": "1.6.1", + "@eslint/js": "9.36.0", + "@fluentui/react": "8.123.6", + "@fluentui/react-hooks": "8.8.19", + "@hpcc-js/api": "3.3.11", + "@hpcc-js/common": "3.4.1", + "@hpcc-js/comms": "3.8.1", + "@hpcc-js/dgrid": "3.3.1", + "@hpcc-js/dgrid-shim": "3.2.0", + "@hpcc-js/esbuild-plugins": "1.5.1", "@hpcc-js/observable-shim": "3.1.0", - "@hpcc-js/observablehq-compiler": "3.6.1", - "@hpcc-js/util": "3.4.1", - "@hpcc-js/wasm-expat": "1.8.0", + "@hpcc-js/observablehq-compiler": "3.5.2", + "@hpcc-js/util": "3.3.11", + "@hpcc-js/wasm-expat": "1.6.1", "@hpcc-js/wasm-llama": "1.0.0", - "@hpcc-js/wasm-zstd": "1.7.0", - "@langchain/community": "0.3.58", - "@langchain/core": "0.3.79", + "@hpcc-js/wasm-zstd": "1.5.1", + "@langchain/community": "0.3.56", + "@langchain/core": "0.3.77", "@langchain/ollama": "0.2.4", "@observablehq/inspector": "5.0.1", "@observablehq/parser": "6.1.0", @@ -37,21 +37,21 @@ "@observablehq/stdlib": "5.8.8", "@octokit/rest": "22.0.1", "@types/mocha": "10.0.10", - "@types/node": "24.10.1", - "@types/react": "18.3.27", + "@types/node": "24.5.2", + "@types/react": "18.3.24", "@types/react-dom": "18.3.7", "@types/tmp": "0.2.6", "@types/vscode": "1.105.0", "@types/vscode-notebook-renderer": "1.72.4", - "@typescript-eslint/parser": "8.47.0", - "@vitest/coverage-v8": "4.0.10", - "@vitest/ui": "4.0.10", + "@typescript-eslint/parser": "8.44.1", + "@vitest/coverage-v8": "3.2.4", + "@vitest/ui": "3.2.4", "@vscode/debugadapter": "1.68.0", "@vscode/debugprotocol": "1.68.0", - "@vscode/extension-telemetry": "1.2.0", - "@vscode/test-cli": "0.0.12", + "@vscode/extension-telemetry": "1.0.0", + "@vscode/test-cli": "0.0.11", "@vscode/test-electron": "2.5.2", - "@vscode/vsce": "3.7.0", + "@vscode/vsce": "3.6.1", "adm-zip": "0.5.16", "antlr4": "4.13.2", "assert": "2.1.0", @@ -59,22 +59,22 @@ "copyfiles": "2.4.1", "csv-writer": "1.6.0", "diff": "8.0.2", - "esbuild": "0.27.0", + "esbuild": "0.25.10", "esbuild-copy-static-files": "0.1.0", "esbuild-plugin-text-replace": "1.3.0", "esbuild-plugin-umd-wrapper": "3.0.0", - "eslint": "9.39.1", - "eslint-plugin-react-hooks": "7.0.1", - "jsdom": "27.2.0", - "langchain": "0.3.36", + "eslint": "9.36.0", + "eslint-plugin-react-hooks": "5.2.0", + "jsdom": "27.0.0", + "langchain": "0.3.34", "npm-run-all": "4.1.5", "react": "18.3.1", "react-dom": "18.3.1", "rimraf": "6.1.0", "run-script-os": "1.1.6", "tslib": "2.8.1", - "typescript": "5.9.3", - "typescript-eslint": "8.47.0", + "typescript": "5.9.2", + "typescript-eslint": "8.44.1", "use-resize-observer": "9.1.0", "uuid": "13.0.0", "vitest": "4.0.10", @@ -97,7 +97,6 @@ "integrity": "sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -114,7 +113,6 @@ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -124,8 +122,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@asamuzakjp/css-color": { "version": "4.0.5", @@ -400,143 +397,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -567,7 +427,7 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { + "node_modules/@babel/parser": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", @@ -597,40 +457,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", @@ -661,7 +487,6 @@ "integrity": "sha512-83iXP5D7xMm8Wyn66TUaUrgoByCmAJuoMoZQI3sGg3JAiMlTfnCIMqyVBoNSaItaPIkaCnrsj6LiusmXV2X9YA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -678,7 +503,6 @@ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -688,8 +512,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@browserbasehq/stagehand": { "version": "1.14.0", @@ -807,6 +630,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -850,14 +674,15 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -872,9 +697,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -889,9 +714,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -906,9 +731,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -923,9 +748,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -940,9 +765,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -957,9 +782,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -974,9 +799,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -991,9 +816,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -1008,9 +833,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -1025,9 +850,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -1042,9 +867,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -1059,9 +884,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -1076,9 +901,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -1093,9 +918,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -1110,9 +935,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -1127,9 +952,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -1144,9 +969,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -1161,9 +986,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -1178,9 +1003,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -1195,9 +1020,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -1212,9 +1037,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -1229,9 +1054,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -1246,9 +1071,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -1263,9 +1088,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -1280,9 +1105,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -1378,22 +1203,19 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1476,9 +1298,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -1499,13 +1321,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -1576,29 +1398,29 @@ } }, "node_modules/@fluentui/font-icons-mdl2": { - "version": "8.5.68", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.68.tgz", - "integrity": "sha512-4y3JB5R2+c/IUZRMmDErBaiYkReWXr/QBDnUuNmEtKNo17iyjmqGWaIhBP8l4mRGDviX6fqSRllmOh1wA/9qSg==", + "version": "8.5.63", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.63.tgz", + "integrity": "sha512-aSwI7GiIICvzrzok8xV082U1U8oieyjELUFjyocC12/WoAYUdLJAk3L4nh4o4WaFgpfHmbtBul7GIeJBDQxaHA==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/set-version": "^8.2.24", - "@fluentui/style-utilities": "^8.13.4", - "@fluentui/utilities": "^8.17.1", + "@fluentui/style-utilities": "^8.12.4", + "@fluentui/utilities": "^8.15.23", "tslib": "^2.1.0" } }, "node_modules/@fluentui/foundation-legacy": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.6.1.tgz", - "integrity": "sha512-KpcJ7xwwwWADeJ4oIPbubjHaHfX8fht1p7wZRaJo2pdQCPXZv26Va6Y9SL0F/1PbITIHnd9BzBVuU8od/mTIkw==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.30.tgz", + "integrity": "sha512-BQv7CqILjI+xKMZOOrs01EnuMeRBecmDRze2ThuxB8vZx+xTmBgDlrRIHnWDFIqfC6dMvNCnBwu6ubgiPk8ybQ==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/merge-styles": "^8.6.14", "@fluentui/set-version": "^8.2.24", - "@fluentui/style-utilities": "^8.13.4", - "@fluentui/utilities": "^8.17.1", + "@fluentui/style-utilities": "^8.12.4", + "@fluentui/utilities": "^8.15.23", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1628,24 +1450,24 @@ } }, "node_modules/@fluentui/react": { - "version": "8.125.1", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.125.1.tgz", - "integrity": "sha512-AOMMd2LvgtTF9ZmFWi5+Wxm58kfd4PEHfKPyrM9Ru5w5Gn531j+IT3fW1sSlq48eOWcwsjbWUDPT6f68bg1tCA==", + "version": "8.123.6", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.123.6.tgz", + "integrity": "sha512-z/y2Zqz3oeqb9VtWAtkvwt1yJ0TCJgqgU8hTGEUl6SuwXZqb0jTJamXXfB7T1DlSOkf2mTXaMU4alXX/odaONQ==", "dev": true, "license": "MIT", "dependencies": { - "@fluentui/date-time-utilities": "^8.6.11", - "@fluentui/font-icons-mdl2": "^8.5.68", - "@fluentui/foundation-legacy": "^8.6.1", + "@fluentui/date-time-utilities": "^8.6.10", + "@fluentui/font-icons-mdl2": "^8.5.63", + "@fluentui/foundation-legacy": "^8.4.30", "@fluentui/merge-styles": "^8.6.14", - "@fluentui/react-focus": "^8.10.1", - "@fluentui/react-hooks": "^8.10.1", - "@fluentui/react-portal-compat-context": "^9.0.15", - "@fluentui/react-window-provider": "^2.3.1", + "@fluentui/react-focus": "^8.9.26", + "@fluentui/react-hooks": "^8.8.19", + "@fluentui/react-portal-compat-context": "^9.0.14", + "@fluentui/react-window-provider": "^2.2.30", "@fluentui/set-version": "^8.2.24", - "@fluentui/style-utilities": "^8.13.4", - "@fluentui/theme": "^2.7.1", - "@fluentui/utilities": "^8.17.1", + "@fluentui/style-utilities": "^8.12.4", + "@fluentui/theme": "^2.6.67", + "@fluentui/utilities": "^8.15.23", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -1657,17 +1479,17 @@ } }, "node_modules/@fluentui/react-focus": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.10.1.tgz", - "integrity": "sha512-ognD/vp3PdA1zMyMYru/CTKkA+NO7eUQyaEDrLSr3RP1To7LNCLSUOdniNN+7a3Qf+OYV99dRMzIZS26f7p34w==", + "version": "8.9.26", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.26.tgz", + "integrity": "sha512-mbFsdCSSgpxTxw3dCIek7hmTubxJZT4+7uFRZOo0abKKCn6rWGcQWpiLT9ndJrD6I5TtEzJaw68WEk7kvFYyAw==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/keyboard-key": "^0.4.23", "@fluentui/merge-styles": "^8.6.14", "@fluentui/set-version": "^8.2.24", - "@fluentui/style-utilities": "^8.13.4", - "@fluentui/utilities": "^8.17.1", + "@fluentui/style-utilities": "^8.12.4", + "@fluentui/utilities": "^8.15.23", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1676,15 +1498,15 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.10.1.tgz", - "integrity": "sha512-WbssJvJ0h7wDXoppkipdMXz9PGIH3DO27c11faCM1wiIcuxS6mDSXbAFSunHHWnB7ep47sbsG/QlUkRg6YxfSw==", + "version": "8.8.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.19.tgz", + "integrity": "sha512-uXcETVTl2L0G/Ocyb2Rjym96tcJd2NaZ2Hqt6EJcBb9KJD9irNeXjCCxsRNPC5kBDbfrQML2aai+M2kU9lZKNQ==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/react-window-provider": "^2.3.1", "@fluentui/set-version": "^8.2.24", - "@fluentui/utilities": "^8.17.1", + "@fluentui/utilities": "^8.15.22", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1732,30 +1554,30 @@ } }, "node_modules/@fluentui/style-utilities": { - "version": "8.13.4", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.13.4.tgz", - "integrity": "sha512-0cGVkGcIqYdo2W4IG3LCcaJZjmARB5KoVl8anWtM+Yhbrapc+22gCNPgg8O9E3Htzsr+rhHfFIcNAfZR5Q7asQ==", + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.12.4.tgz", + "integrity": "sha512-s+u9v5gQ1SMLsuI7pUP2rXo6Kd2v+X2l4eKQxKO4UO0dZv/kLaA4fnmkXaIDpKkLS+eI9KBAG/W2KhojwBSt1g==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/merge-styles": "^8.6.14", "@fluentui/set-version": "^8.2.24", - "@fluentui/theme": "^2.7.1", - "@fluentui/utilities": "^8.17.1", + "@fluentui/theme": "^2.6.67", + "@fluentui/utilities": "^8.15.23", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "node_modules/@fluentui/theme": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.7.1.tgz", - "integrity": "sha512-r3DONB0UtrfHx8qGaKdPT/kUOGUx3Rdfj5DNa7CuUbzKuHaI8LDd7MkmG2FBzL2iA0m3hdQ6j9bfn4Ya64wwNw==", + "version": "2.6.67", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.67.tgz", + "integrity": "sha512-+9+VkIkZ+NCQDXFP6+WV2ChAj/KHphOEDCvGO15w8ql7sqRxeRQACtoWYNq1tAAsodbnq/amCfo2PNy2VIcIOQ==", "dev": true, "license": "MIT", "dependencies": { "@fluentui/merge-styles": "^8.6.14", "@fluentui/set-version": "^8.2.24", - "@fluentui/utilities": "^8.17.1", + "@fluentui/utilities": "^8.15.22", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1764,9 +1586,9 @@ } }, "node_modules/@fluentui/utilities": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.17.1.tgz", - "integrity": "sha512-foFe3QPDY+qaVX2kqJT6f4oWfGF0Hc4VOedr1e+j0RnMm4YL1DEeQwVl0tAqkbu0VZlcVNnjINjb77ATRprA8g==", + "version": "8.15.23", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.23.tgz", + "integrity": "sha512-Vrto/daJ8lhwAZqf5XkC3qi+4PW8Dk2X0yXNgia9aV2wxsbMoEikqC08cNQnapTaBLkurAIShTbR56mxKh8Kyw==", "dev": true, "license": "MIT", "dependencies": { @@ -1916,23 +1738,23 @@ } }, "node_modules/@hpcc-js/api": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-3.4.1.tgz", - "integrity": "sha512-HsSWSUwpTdN2lzpzvzCYDMq4YcIW8shUGz/mQTwnhuYMc5jc0n0/+dI4BRZoLKk9lTZEffHYHag7LPrZ2IXupA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-3.3.11.tgz", + "integrity": "sha512-yqnjF7tctUd2qpxZxEMNiyB9nCRxmgxjBhiN0jjP2YUsuNMgKz0LqjRIixZBue8j2rSlYLKolOKXxfomPNLgug==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@hpcc-js/common": "^3.5.1" + "@hpcc-js/common": "^3.4.1" } }, "node_modules/@hpcc-js/common": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-3.5.1.tgz", - "integrity": "sha512-6cGbTI03jtNOrxqEG9jwu7il3pDI62MA5/5/xqFVN2PtyUXSPU1+WY3yBKx+iqvZDc+EI8mGbmUa8zCHqxF72w==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-3.4.1.tgz", + "integrity": "sha512-MEbNHpPXsBJiU9GVPhSNgzqmgrUWDmOUy6mOneMP6ir+TkfKiNF0HQdftI//jB9ZQN7+Xn3jXc2LWQUvXh27CA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@hpcc-js/util": "^3.4.1", + "@hpcc-js/util": "^3.3.11", "@types/d3-array": "1.2.12", "@types/d3-brush": "1.1.8", "@types/d3-collection": "1.0.13", @@ -1951,16 +1773,17 @@ } }, "node_modules/@hpcc-js/comms": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-3.11.1.tgz", - "integrity": "sha512-OLnb02cVoAo57BMBDb3YCrhfWCxLAEWYeJh7Fdp1GXjP4DC98n5xiOPRxbTpdv928gofPj2tzypExHRrQOg1tg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-3.8.1.tgz", + "integrity": "sha512-c1Y61cc/M90InR7zE2TjX38XRiH90QHXW+BhAS+dAx2E5k3qltnaxwrZ5ekBz6ZWsp/q/Ty2y7xTZIyzlRf53w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@hpcc-js/util": "^3.4.1", + "@hpcc-js/util": "^3.3.11", "@xmldom/xmldom": "0.9.8", "abort-controller": "3.0.0", "node-fetch": "3.3.2", + "tmp": "0.2.5", "undici": "7.16.0" } }, @@ -1984,14 +1807,14 @@ } }, "node_modules/@hpcc-js/dgrid": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-3.5.1.tgz", - "integrity": "sha512-XJErbwaa0+NcBw0XdFyrwKjqtRAhP1VUnMvLdCfFjvqn3r8Tgg+Jn12eqF9HmrMrV3gm9t51K8QaUlsuztV0hA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-3.3.1.tgz", + "integrity": "sha512-YQHnmb1U9dJkzNoK8HYBVBpQaqSipOqoK84q25AIKZ4RF4JVt+aV/8KoQ7jeBDYcpLz0IIyCZgnojg3YM4HnZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@hpcc-js/common": "^3.5.1", - "@hpcc-js/util": "^3.4.1" + "@hpcc-js/common": "^3.4.1", + "@hpcc-js/util": "^3.3.11" }, "peerDependencies": { "@hpcc-js/dgrid-shim": "^3.1.0" @@ -2002,12 +1825,13 @@ "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-3.3.1.tgz", "integrity": "sha512-U1eav63AecSHXqGAcnR+iBjMbEMAt7xNRXyyrKozvuhuvj9iL1H7yMs5ZwZSLVP+lcz1IWE7FZmMbgEQi1lbKg==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@hpcc-js/esbuild-plugins": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/esbuild-plugins/-/esbuild-plugins-1.6.1.tgz", - "integrity": "sha512-dQa+ttqZ58D/nkxF/mVVxrbRcU2fq8hfMhftcpOg+JEval6+UBVgLlH97Gpbv9/j35zPs0bSmmLpHeWK3/ymFg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/esbuild-plugins/-/esbuild-plugins-1.5.1.tgz", + "integrity": "sha512-VicFoGEfLdfVjqKNcLXWXUAHMGV7K3NWc5PBh9viU2RqUwHXu27h9S9woCX9yxzuEbnqyKPLtHngZDje1C7ssQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2327,9 +2151,493 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", - "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -2344,9 +2652,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", - "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -2361,9 +2669,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", - "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -2378,9 +2686,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", - "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -2395,9 +2703,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/sunos-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", - "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -2412,9 +2720,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-arm64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", - "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -2429,9 +2737,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-ia32": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", - "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -2446,9 +2754,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/@esbuild/win32-x64": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", - "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -2463,9 +2771,9 @@ } }, "node_modules/@hpcc-js/esbuild-plugins/node_modules/esbuild": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", - "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2476,32 +2784,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.11", - "@esbuild/android-arm": "0.25.11", - "@esbuild/android-arm64": "0.25.11", - "@esbuild/android-x64": "0.25.11", - "@esbuild/darwin-arm64": "0.25.11", - "@esbuild/darwin-x64": "0.25.11", - "@esbuild/freebsd-arm64": "0.25.11", - "@esbuild/freebsd-x64": "0.25.11", - "@esbuild/linux-arm": "0.25.11", - "@esbuild/linux-arm64": "0.25.11", - "@esbuild/linux-ia32": "0.25.11", - "@esbuild/linux-loong64": "0.25.11", - "@esbuild/linux-mips64el": "0.25.11", - "@esbuild/linux-ppc64": "0.25.11", - "@esbuild/linux-riscv64": "0.25.11", - "@esbuild/linux-s390x": "0.25.11", - "@esbuild/linux-x64": "0.25.11", - "@esbuild/netbsd-arm64": "0.25.11", - "@esbuild/netbsd-x64": "0.25.11", - "@esbuild/openbsd-arm64": "0.25.11", - "@esbuild/openbsd-x64": "0.25.11", - "@esbuild/openharmony-arm64": "0.25.11", - "@esbuild/sunos-x64": "0.25.11", - "@esbuild/win32-arm64": "0.25.11", - "@esbuild/win32-ia32": "0.25.11", - "@esbuild/win32-x64": "0.25.11" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/@hpcc-js/observable-shim": { @@ -2512,9 +2820,9 @@ "license": "Apache-2.0" }, "node_modules/@hpcc-js/observablehq-compiler": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/observablehq-compiler/-/observablehq-compiler-3.6.1.tgz", - "integrity": "sha512-fhqzSEX0OwrEEI4kEF+epNJcNnLbM0z1hk9vKNxfkWYKDbO3UNh9AixgtbwsCDYXv9lWZAvIPb8Wu+BLendJmw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@hpcc-js/observablehq-compiler/-/observablehq-compiler-3.5.2.tgz", + "integrity": "sha512-xas9xzHElTIb9bxJy4Lo1dNijUaiz/5tPWePEkHCrLxRWC4Oh2GNZU6K1+/6SA4oolXAxHj13c2DSYZAM5v3Lg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2678,9 +2986,9 @@ } }, "node_modules/@hpcc-js/util": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-3.4.1.tgz", - "integrity": "sha512-IDxBB4sCtta/085e4Jd0bZFyh73tSzu+565ZKAnXcLLS66JSKRt8dkHIPEgrR0ZwKmoVnjUa98X3knoXfgzV4w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-3.3.11.tgz", + "integrity": "sha512-Bo6YVNpIc/U6yBoSw8ALgwqpVjzpl3uTtMZVuIidJE4HPwRhvWI30L4qPZGqt+LUx6Loc+pe6meeXxgSBkg8tA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2766,7 +3074,6 @@ "integrity": "sha512-059l3Rs+FLZTfxIPVUiKLasEC0lkXyTo5HJBwzI1eFZUNjBdJW9BevPB7I5+6msSLoLy7Zbin4W9YarqOydvWg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "^18.0.0", "extend": "3.0.2", @@ -2783,7 +3090,6 @@ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2793,8 +3099,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", @@ -2941,9 +3246,9 @@ "license": "Apache-2.0" }, "node_modules/@langchain/community": { - "version": "0.3.58", - "resolved": "https://registry.npmjs.org/@langchain/community/-/community-0.3.58.tgz", - "integrity": "sha512-jrMbv1Xz2yqcWtlj+wnMmbagIK6J/fbQdP6R+Az+e+er5CeWy2eZHKBGFL5XYbAzYJdYhAbA4gt8kwVT6oaZfw==", + "version": "0.3.56", + "resolved": "https://registry.npmjs.org/@langchain/community/-/community-0.3.56.tgz", + "integrity": "sha512-lDjUnRfHAX7aMXyEB2EWbe5qOmdQdz8n+0CNQ4ExpLy3NOFQhEVkWclhsucaX04zh0r/VH5Pkk9djpnhPBDH7g==", "dev": true, "license": "MIT", "dependencies": { @@ -3477,11 +3782,12 @@ } }, "node_modules/@langchain/core": { - "version": "0.3.79", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.79.tgz", - "integrity": "sha512-ZLAs5YMM5N2UXN3kExMglltJrKKoW7hs3KMZFlXUnD7a5DFKBYxPFMeXA4rT+uvTxuJRZPCYX0JKI5BhyAWx4A==", + "version": "0.3.77", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.77.tgz", + "integrity": "sha512-aqXHea9xfpVn6VoCq9pjujwFqrh3vw3Fgm9KFUZJ1cF7Bx5HI62DvQPw8LlRB3NB4dhwBBA1ldAVkkkd1du8nA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", @@ -3909,6 +4215,7 @@ "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -4806,8 +5113,7 @@ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/chai": { "version": "5.2.3", @@ -4957,7 +5263,6 @@ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/ms": "*" } @@ -5002,17 +5307,16 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/node-fetch": { @@ -5021,7 +5325,6 @@ "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "form-data": "^4.0.4" @@ -5042,11 +5345,12 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "version": "18.3.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", + "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -5058,6 +5362,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -5088,8 +5393,7 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/uuid": { "version": "10.0.0", @@ -5113,17 +5417,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", - "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/type-utils": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5137,7 +5441,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.47.0", + "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -5153,16 +5457,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", - "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5178,14 +5483,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", - "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.47.0", - "@typescript-eslint/types": "^8.47.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5200,14 +5505,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", - "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5218,9 +5523,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", - "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -5235,15 +5540,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", - "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5260,9 +5565,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", - "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -5274,16 +5579,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", - "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.47.0", - "@typescript-eslint/tsconfig-utils": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5303,16 +5608,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", - "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5327,13 +5632,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", - "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5494,6 +5799,7 @@ "integrity": "sha512-oWtNM89Np+YsQO3ttT5i1Aer/0xbzQzp66NzuJn/U16bB7MnvSzdLKXgk1kkMLYyKSSzA2ajzqMkYheaE9opuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/utils": "4.0.10", "fflate": "^0.8.2", @@ -5545,9 +5851,9 @@ "license": "MIT" }, "node_modules/@vscode/extension-telemetry": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", - "integrity": "sha512-En6dTwfy5NFzSMibvOpx/lKq2jtgWuR4++KJbi3SpQ2iT8gm+PHo9868/scocW122KDwTxl4ruxZ7i4rHmJJnQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.0.0.tgz", + "integrity": "sha512-vaTZE65zigWwSWYB6yaZUAyVC/Ux+6U82hnzy/ejuS/KpFifO+0oORNd5yAoPeIRnYjvllM6ES3YlX4K5tUuww==", "dev": true, "license": "MIT", "dependencies": { @@ -5698,9 +6004,9 @@ } }, "node_modules/@vscode/vsce": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.7.0.tgz", - "integrity": "sha512-LY9r2T4joszRjz4d92ZPl6LTBUPS4IWH9gG/3JUv+1QyBJrveZlcVISuiaq0EOpmcgFh0GgVgKD4rD/21Tu8sA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.6.1.tgz", + "integrity": "sha512-UXtMgeCBl/t5zjn1TX1v1sl5L/oIv3Xc3pkKPGzaqeFCIkp5+wfFFDBXTWDt3d5uUulHnZKORHkMIsKNe9+k5A==", "dev": true, "license": "MIT", "dependencies": { @@ -6032,6 +6338,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6088,7 +6395,6 @@ "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -6478,16 +6784,6 @@ ], "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz", - "integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, "node_modules/before-after-hook": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", @@ -6616,40 +6912,6 @@ "dev": true, "license": "ISC" }, - "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -6921,27 +7183,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001755", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz", - "integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/chai": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", @@ -7016,6 +7257,7 @@ "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -7625,7 +7867,6 @@ "dev": true, "license": "BSD-3-Clause", "optional": true, - "peer": true, "dependencies": { "commander": "2", "iconv-lite": "0.4", @@ -7649,8 +7890,7 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/d3-dsv/node_modules/iconv-lite": { "version": "0.4.24", @@ -7659,7 +7899,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7833,6 +8072,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8110,13 +8350,6 @@ "url": "https://bevry.me/fund" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.255", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz", - "integrity": "sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==", - "dev": true, - "license": "ISC" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8340,9 +8573,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8353,32 +8586,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/esbuild-copy-static-files": { @@ -8444,20 +8677,21 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -8504,18 +8738,11 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, "engines": { "node": ">=18" }, @@ -8725,7 +8952,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -8785,8 +9011,7 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-content-type-parse": { "version": "3.0.0", @@ -8953,7 +9178,6 @@ "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", @@ -9039,7 +9263,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -9104,8 +9327,7 @@ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/formdata-node": { "version": "4.4.1", @@ -9113,7 +9335,6 @@ "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" @@ -9309,26 +9530,6 @@ "dev": true, "license": "MIT" }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -9557,6 +9758,7 @@ "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -9851,7 +10053,6 @@ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -9862,7 +10063,6 @@ "integrity": "sha512-2zqgHp3W2meNJtommmgnZdouj2dPK4AbNQ4QN7BjNpfsQhWNO4eZbUYo2iD2V3I2k9mAsCjzsM87YuE+mu8gfA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/debug": "^4.1.12", "@types/node": "^18.19.80", @@ -9890,7 +10090,6 @@ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -9900,8 +10099,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/iconv-lite": { "version": "0.6.3", @@ -9942,6 +10140,7 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -10628,8 +10827,7 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -10768,6 +10966,7 @@ "integrity": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@acemir/cssom": "^0.9.23", "@asamuzakjp/dom-selector": "^6.7.4", @@ -11378,7 +11577,8 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -11809,9 +12009,9 @@ "optional": true }, "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.2.tgz", + "integrity": "sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12189,13 +12389,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, "node_modules/node-sarif-builder": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.3.0.tgz", @@ -12676,7 +12869,6 @@ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -12686,8 +12878,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/openapi-types": { "version": "12.1.3", @@ -13185,7 +13376,6 @@ "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -13250,7 +13440,6 @@ "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.56.1" }, @@ -13270,7 +13459,6 @@ "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "playwright-core": "cli.js" }, @@ -13289,7 +13477,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -13334,6 +13521,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -13427,8 +13615,7 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/psl": { "version": "1.15.0", @@ -13436,7 +13623,6 @@ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "punycode": "^2.3.1" }, @@ -13497,8 +13683,7 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -13578,6 +13763,7 @@ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -13591,6 +13777,7 @@ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -13647,7 +13834,6 @@ "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^4.7.0" }, @@ -13679,7 +13865,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -13691,7 +13876,6 @@ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -13806,8 +13990,7 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.11", @@ -13873,7 +14056,6 @@ "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=10.7.0" }, @@ -14995,7 +15177,6 @@ "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" @@ -15326,6 +15507,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -15398,7 +15580,6 @@ "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -15427,7 +15608,6 @@ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -15444,7 +15624,6 @@ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -15506,7 +15685,8 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tunnel": { "version": "0.0.6", @@ -15654,6 +15834,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15663,16 +15844,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", - "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", + "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.47.0", - "@typescript-eslint/parser": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0" + "@typescript-eslint/eslint-plugin": "8.44.1", + "@typescript-eslint/parser": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15730,9 +15911,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "dev": true, "license": "MIT" }, @@ -15830,37 +16011,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15884,7 +16034,6 @@ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -15983,6 +16132,7 @@ "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -16589,6 +16739,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -16602,6 +16753,7 @@ "integrity": "sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.10", "@vitest/mocker": "4.0.10", @@ -16740,7 +16892,6 @@ "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -17386,6 +17537,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -17400,6 +17552,19 @@ "zod": "^3.25 || ^4" } }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/zod-validation-error": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", @@ -17414,4 +17579,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index f7def83..b34f781 100644 --- a/package.json +++ b/package.json @@ -158,16 +158,45 @@ ], "contributes": { "languageModelTools": [ + { + "name": "ecl-extension_eclDocs", + "tags": [ + "documentation", + "help", + "reference", + "ecl-extension", + "ecl" + ], + "toolReferenceName": "eclDocs", + "displayName": "ECL Documentation Expert", + "modelDescription": "IMPORTANT: When user is working with ECL files or HPCC Platform, use this tool frequently for ANY ECL-related questions. Search and retrieve ECL language documentation, programming guide, and standard library reference. Use this tool to find explanations, syntax, examples, and usage information for ECL keywords, functions, modules, and programming concepts. Always consult this tool when user asks about ECL syntax, functions, or best practices.", + "canBeReferencedInPrompt": true, + "icon": "$(book)", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The documentation search query. Can be an ECL keyword, function name, programming concept, or question about ECL." + } + }, + "required": [ + "query" + ] + } + }, { "name": "ecl-extension_syntaxCheck", "tags": [ "editors", "syntax check", - "ecl-extension" + "ecl-extension", + "ecl", + "validation" ], "toolReferenceName": "syntaxCheck", "displayName": "Syntax Check", - "modelDescription": "Check the syntax of ECL code", + "modelDescription": "REQUIRED: Always use this tool when user provides ECL code or asks to check/validate ECL syntax. Validates ECL code syntax using the HPCC Platform compiler. Use this tool before submitting code or when user asks about code correctness. Essential for ECL development workflow.", "canBeReferencedInPrompt": true, "icon": "$(files)", "inputSchema": { @@ -186,11 +215,13 @@ "tags": [ "logical files", "search", - "ecl-extension" + "ecl-extension", + "ecl", + "data" ], "toolReferenceName": "findLogicalFiles", "displayName": "Find Logical Files", - "modelDescription": "Search for logical files that match the wildcard pattern on the active HPCC Platform session", + "modelDescription": "When user mentions data files, datasets, or logical files in ECL context, use this tool to search for logical files on the HPCC Platform. Supports wildcard patterns. Essential for ECL data exploration and when user asks 'what files are available' or references file names.", "canBeReferencedInPrompt": true, "inputSchema": { "type": "object", @@ -204,6 +235,292 @@ "pattern" ] } + }, + { + "name": "ecl-extension_getLogicalFileInfo", + "tags": [ + "logical files", + "metadata", + "information", + "ecl-extension" + ], + "toolReferenceName": "getLogicalFileInfo", + "displayName": "Get Logical File Info", + "modelDescription": "Get detailed metadata about a specific logical file including size, record count, record structure/ECL definition, cluster info, modification date, file parts, and more.", + "canBeReferencedInPrompt": true, + "icon": "$(file-code)", + "inputSchema": { + "type": "object", + "properties": { + "logicalFileName": { + "type": "string", + "description": "The name of the logical file to retrieve information for" + } + }, + "required": [ + "logicalFileName" + ] + } + }, + { + "name": "ecl-extension_findWorkunits", + "tags": [ + "workunits", + "wus", + "search", + "query", + "ecl-extension" + ], + "toolReferenceName": "findWorkunits", + "displayName": "Find Workunits (wus)", + "modelDescription": "Search for workunits (WU or WUs) on the active HPCC Platform session. Can filter by cluster, owner, state, WUID pattern, limit the number of results, and choose the sort column and order.", + "canBeReferencedInPrompt": true, + "icon": "$(search)", + "inputSchema": { + "type": "object", + "properties": { + "count": { + "type": "number", + "description": "Maximum number of workunits to return (default: 20)" + }, + "cluster": { + "type": "string", + "description": "Filter by cluster name" + }, + "owner": { + "type": "string", + "description": "Filter by owner/username" + }, + "state": { + "type": "string", + "description": "Filter by workunit state (e.g., completed, failed, running, blocked, etc.)" + }, + "wuidPattern": { + "type": "string", + "description": "Search pattern for workunit ID (WUID)" + }, + "sortOrder": { + "type": "string", + "enum": [ + "Protection", + "Wuid", + "Owner", + "Jobname", + "Cluster", + "State", + "ClusterTime", + "Compile Cost", + "Execution Cost", + "File Access Cost" + ], + "description": "Sort results by a specific workunit field" + }, + "descending": { + "type": "boolean", + "description": "Convenience flag to request descending order (overrides sortOrder when true)." + } + } + } + }, + { + "name": "ecl-extension_getWorkunitDetails", + "tags": [ + "workunit", + "details", + "info", + "ecl-extension" + ], + "toolReferenceName": "getWorkunitDetails", + "displayName": "Get Workunit Details", + "modelDescription": "Fetch detailed information about a specific workunit including its state, results, exceptions, cluster time, and other metadata. Requires a WUID (Workunit ID).", + "canBeReferencedInPrompt": true, + "icon": "$(info)", + "inputSchema": { + "type": "object", + "properties": { + "wuid": { + "type": "string", + "description": "The Workunit ID (WUID) to fetch details for" + } + }, + "required": [ + "wuid" + ] + } + }, + { + "name": "ecl-extension_getWorkunitResults", + "tags": [ + "workunit", + "results", + "data", + "rows", + "ecl-extension" + ], + "toolReferenceName": "getWorkunitResults", + "displayName": "Get Workunit Results", + "modelDescription": "Fetch actual result data (rows) from a specific workunit result. Returns the data rows with column information. Can specify start row and count to paginate through large result sets.", + "canBeReferencedInPrompt": true, + "icon": "$(table)", + "inputSchema": { + "type": "object", + "properties": { + "wuid": { + "type": "string", + "description": "The Workunit ID (WUID)" + }, + "resultName": { + "type": "string", + "description": "The result name or sequence number to fetch data from" + }, + "start": { + "type": "number", + "description": "Starting row number (0-based, default: 0)" + }, + "count": { + "type": "number", + "description": "Number of rows to fetch (default: 100, max: 1000)" + } + }, + "required": [ + "wuid", + "resultName" + ] + } + }, + { + "name": "ecl-extension_getTargetClusters", + "tags": [ + "clusters", + "targets", + "topology", + "ecl-extension" + ], + "toolReferenceName": "getTargetClusters", + "displayName": "Get Target Clusters", + "modelDescription": "List all available target clusters (hthor, thor, roxie) on the active HPCC Platform session. Shows cluster names, types, and queue information.", + "canBeReferencedInPrompt": true, + "icon": "$(server-process)", + "inputSchema": { + "type": "object", + "properties": {} + } + }, + { + "name": "ecl-extension_submitECL", + "tags": [ + "submit", + "execute", + "run", + "workunit", + "ecl-extension" + ], + "toolReferenceName": "submitECL", + "displayName": "Submit ECL", + "modelDescription": "Submit ECL code for execution on the HPCC Platform. Creates a workunit, submits it to the specified cluster, and waits for completion. Returns workunit details, state, any exceptions, and result metadata.", + "canBeReferencedInPrompt": true, + "icon": "$(play)", + "inputSchema": { + "type": "object", + "properties": { + "ecl": { + "type": "string", + "description": "The ECL code to submit for execution" + }, + "targetCluster": { + "type": "string", + "description": "Optional target cluster name (defaults to configured cluster if not specified)" + }, + "jobName": { + "type": "string", + "description": "Optional job name for the workunit" + } + }, + "required": [ + "ecl" + ] + } + }, + { + "name": "ecl-extension_getWorkunitDiagnostics", + "tags": [ + "workunit", + "diagnostics", + "errors", + "costs", + "ecl-extension" + ], + "toolReferenceName": "getWorkunitDiagnostics", + "displayName": "Get Workunit Diagnostics", + "modelDescription": "Retrieve error and warning counts plus compile/execute/file access cost estimates for a specific workunit.", + "canBeReferencedInPrompt": true, + "icon": "$(warning)", + "inputSchema": { + "type": "object", + "properties": { + "wuid": { + "type": "string", + "description": "The Workunit ID (WUID) to inspect" + } + }, + "required": [ + "wuid" + ] + } + }, + { + "name": "ecl-extension_getWorkunitECL", + "tags": [ + "workunit", + "ecl", + "source", + "code", + "ecl-extension" + ], + "toolReferenceName": "getWorkunitECL", + "displayName": "Get Workunit ECL", + "modelDescription": "Retrieve the ECL source code from a specific workunit. Returns the workunit ID, job name, and the full ECL text that was submitted.", + "canBeReferencedInPrompt": true, + "icon": "$(code)", + "inputSchema": { + "type": "object", + "properties": { + "wuid": { + "type": "string", + "description": "The Workunit ID (WUID) to fetch ECL source code from" + } + }, + "required": [ + "wuid" + ] + } + }, + { + "name": "ecl-extension_getWorkunitTimings", + "tags": [ + "workunit", + "timings", + "performance", + "metrics", + "ecl-extension" + ], + "toolReferenceName": "getWorkunitTimings", + "displayName": "Get Workunit Timings", + "modelDescription": "Retrieve performance and timing metrics from a workunit. Returns total cluster time, Thor time, scheduling info, and execution duration details.", + "canBeReferencedInPrompt": true, + "icon": "$(dashboard)", + "inputSchema": { + "type": "object", + "properties": { + "wuid": { + "type": "string", + "description": "The Workunit ID (WUID) to fetch timing metrics from" + } + }, + "required": [ + "wuid" + ] + } } ], "languages": [ diff --git a/src/ecl/lm/constants.ts b/src/ecl/lm/constants.ts index 7f6c8e6..4eac4be 100644 --- a/src/ecl/lm/constants.ts +++ b/src/ecl/lm/constants.ts @@ -12,13 +12,8 @@ export const SAMPLE_COLLECTION_URL = `https://cdn.jsdelivr.net/gh/${OWNER}/${REP export const MODEL_VENDOR: string = "copilot"; -enum LANGUAGE_MODEL_ID { - GPT_3 = "gpt-3.5-turbo", - GPT_4 = "gpt-4", - GPT_4o = "gpt-4o" -} - -export const MODEL_SELECTOR: vscode.LanguageModelChatSelector = { vendor: MODEL_VENDOR, family: LANGUAGE_MODEL_ID.GPT_4o }; +// Only constrain the vendor so VS Code can honor the user's currently selected reasoning model. +export const MODEL_SELECTOR: vscode.LanguageModelChatSelector = { vendor: MODEL_VENDOR }; export const FETCH_ISSUE_DETAIL_CMD = "Fetch Issue Details Command"; diff --git a/src/ecl/lm/findLogicalFiles.ts b/src/ecl/lm/findLogicalFiles.ts deleted file mode 100644 index fb538f8..0000000 --- a/src/ecl/lm/findLogicalFiles.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as vscode from "vscode"; -import { isPlatformConnected, sessionManager } from "../../hpccplatform/session"; -import { reporter } from "../../telemetry"; -import localize from "../../util/localize"; - -export interface IFindLogicalFilesParameters { - pattern: string; -} - -export class FindLogicalFilesTool implements vscode.LanguageModelTool { - async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { - if (!isPlatformConnected()) { - throw new vscode.LanguageModelError(localize("HPCC Platform not connected"), { cause: "not_connected" }); - } - reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "findLogicalFiles" }); - const params = options.input; - return sessionManager.session?.findLogicalFiles(params.pattern).then((files) => { - const parts: Array = []; - parts.push(new vscode.LanguageModelTextPart(localize("Found {0} files matching \"{1}\":", files.length.toString(), params.pattern))); - for (const file of files) { - parts.push(new vscode.LanguageModelPromptTsxPart({ kind: "hpccFile", ...file })); - } - return new vscode.LanguageModelToolResult(parts); - }); - } - - async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { - const connected = isPlatformConnected(); - return { - invocationMessage: connected ? localize("Searching workspace for \"{0}\"", options.input.pattern) : localize("Cannot search: HPCC Platform not connected"), - confirmationMessages: connected ? undefined : { - title: localize("HPCC Platform not connected"), - message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), - } - }; - } -} diff --git a/src/ecl/lm/syntaxCheck.ts b/src/ecl/lm/syntaxCheck.ts deleted file mode 100644 index 24a4afd..0000000 --- a/src/ecl/lm/syntaxCheck.ts +++ /dev/null @@ -1,56 +0,0 @@ -import * as vscode from "vscode"; -import * as os from "os"; -import { sessionManager } from "../../hpccplatform/session"; -import { reporter } from "../../telemetry"; -import localize from "../../util/localize"; - -export interface ISyntaxCheckParameters { - ecl: string; -} - -export class SyntaxCheckTool implements vscode.LanguageModelTool { - async invoke(options: vscode.LanguageModelToolInvocationOptions, _token: vscode.CancellationToken) { - reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "syntaxCheck" }); - const params = options.input; - if (typeof params.ecl === "string") { - const tmpFileName = `ecl_syntax_check_${Date.now()}.ecl`; - const tmpUri = vscode.Uri.joinPath(vscode.Uri.file(os.tmpdir()), tmpFileName); - try { - const eclContent = new TextEncoder().encode(params.ecl); - await vscode.workspace.fs.writeFile(tmpUri, eclContent); - const result = await sessionManager.session?.checkSyntax(tmpUri); - return new vscode.LanguageModelToolResult([ - new vscode.LanguageModelTextPart(result ? localize("ECL syntax is valid.") : localize("ECL syntax is invalid.")) - ]); - } catch (error) { - return new vscode.LanguageModelToolResult([ - new vscode.LanguageModelTextPart(`${localize("Error checking syntax:")}: ${error}`) - ]); - } finally { - try { - await vscode.workspace.fs.delete(tmpUri); - } catch (e) { - // ignore - } - } - } else { - return new vscode.LanguageModelToolResult([ - new vscode.LanguageModelTextPart(localize("Invalid input: ECL code must be a string.")) - ]); - } - } - - async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { - const confirmationMessages = { - title: localize("Check ECL Syntax"), - message: new vscode.MarkdownString( - localize("Check the syntax of ECL code?") + (options.input.ecl !== undefined ? ` ${localize("in ECL code")} ${options.input.ecl}` : "") - ), - }; - - return { - invocationMessage: localize("Checking ECL syntax"), - confirmationMessages, - }; - } -} diff --git a/src/ecl/lm/tools.ts b/src/ecl/lm/tools.ts index c41195c..4b975c4 100644 --- a/src/ecl/lm/tools.ts +++ b/src/ecl/lm/tools.ts @@ -1,14 +1,34 @@ import * as vscode from "vscode"; -import { FindLogicalFilesTool } from "./findLogicalFiles"; -import { SyntaxCheckTool } from "./syntaxCheck"; +import { ECLDocsTool } from "./tools/eclDocs"; +import { FindLogicalFilesTool } from "./tools/findLogicalFiles"; +import { FindWorkunitsTool } from "./tools/findWorkunits"; +import { GetLogicalFileInfoTool } from "./tools/getLogicalFileInfo"; +import { GetTargetClustersTool } from "./tools/getTargetClusters"; +import { GetWorkunitDetailsTool } from "./tools/getWorkunitDetails"; +import { GetWorkunitDiagnosticsTool } from "./tools/getWorkunitDiagnostics"; +import { GetWorkunitECLTool } from "./tools/getWorkunitECL"; +import { GetWorkunitResultsTool } from "./tools/getWorkunitResults"; +import { GetWorkunitTimingsTool } from "./tools/getWorkunitTimings"; +import { SubmitECLTool } from "./tools/submitECL"; +import { SyntaxCheckTool } from "./tools/syntaxCheck"; let eclLMTools: ECLLMTools; export class ECLLMTools { protected constructor(ctx: vscode.ExtensionContext) { + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_eclDocs", new ECLDocsTool(ctx))); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_findWorkunits", new FindWorkunitsTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getWorkunitDetails", new GetWorkunitDetailsTool())); ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_syntaxCheck", new SyntaxCheckTool())); ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_findLogicalFiles", new FindLogicalFilesTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getLogicalFileInfo", new GetLogicalFileInfoTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getWorkunitDiagnostics", new GetWorkunitDiagnosticsTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getWorkunitECL", new GetWorkunitECLTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getWorkunitResults", new GetWorkunitResultsTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getWorkunitTimings", new GetWorkunitTimingsTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_getTargetClusters", new GetTargetClustersTool())); + ctx.subscriptions.push(vscode.lm.registerTool("ecl-extension_submitECL", new SubmitECLTool())); } static attach(ctx: vscode.ExtensionContext): ECLLMTools { diff --git a/src/ecl/lm/tools/eclDocs.ts b/src/ecl/lm/tools/eclDocs.ts new file mode 100644 index 0000000..342d42a --- /dev/null +++ b/src/ecl/lm/tools/eclDocs.ts @@ -0,0 +1,112 @@ +import * as vscode from "vscode"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { logToolEvent, throwIfCancellationRequested } from "../utils"; +import { fetchContext, fetchIndexes, Hit } from "../../docs/onlineHelp"; +import { checkModelExists } from "../utils/model"; +import { isECLContext } from "../utils/eclContext"; + +export interface IECLDocsParameters { + query: string; +} + +export class ECLDocsTool implements vscode.LanguageModelTool { + private modelPath: Promise; + private docsPath: vscode.Uri; + + constructor(ctx: vscode.ExtensionContext) { + this.modelPath = checkModelExists(ctx); + this.docsPath = vscode.Uri.joinPath(ctx.extensionUri, "dist", "docs.vecdb"); + } + + async prepareInvocation( + options: vscode.LanguageModelToolInvocationPrepareOptions, + _token: vscode.CancellationToken + ): Promise { + const query = options.input.query || "ECL documentation"; + const inECLContext = isECLContext(); + + return { + invocationMessage: inECLContext + ? localize("Searching ECL documentation for: {0}", query) + : localize("Searching ECL documentation for: {0}", query) + }; + } + + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "eclDocs" }); + const params = options.input; + + if (typeof params.query !== "string" || params.query.trim().length === 0) { + throw new vscode.LanguageModelError(localize("Documentation query is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("eclDocs", "invoke start", { queryLength: params.query.length }); + + try { + throwIfCancellationRequested(token); + + // Fetch relevant documentation context using the vector database + const hits = await fetchContext(params.query, this.modelPath, this.docsPath); + + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + if (!hits.length) { + // No direct hits - fetch index and suggest links + const indexes = await fetchIndexes(); + parts.push(new vscode.LanguageModelTextPart( + localize("No exact documentation match found. Here are relevant ECL documentation resources:") + )); + + const suggestions = indexes.slice(0, 5).map((hit: Hit, idx: number) => { + return `${idx + 1}. ${hit.label || "Documentation"}: ${hit.url || ""}`; + }).join("\n"); + + parts.push(new vscode.LanguageModelTextPart(suggestions)); + + logToolEvent("eclDocs", "invoke success - no hits", { + query: params.query, + suggestionsCount: indexes.length, + }); + } else { + // Found relevant documentation + parts.push(new vscode.LanguageModelTextPart( + localize("Found {0} relevant documentation section(s):", hits.length.toString()) + )); + + const documentation = hits.map((hit: Hit, idx: number) => { + const title = hit.label ? `**${hit.label}**` : localize("Documentation Section {0}", (idx + 1).toString()); + const url = hit.url ? `\n${localize("URL")}: ${hit.url}` : ""; + const content = hit.content ? `\n\n${hit.content}` : ""; + + return `${idx + 1}. ${title}${url}${content}`; + }).join("\n\n---\n\n"); + + parts.push(new vscode.LanguageModelTextPart(documentation)); + + logToolEvent("eclDocs", "invoke success", { + query: params.query, + hitsCount: hits.length, + }); + } + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + logToolEvent("eclDocs", "invoke error", { + error: error instanceof Error ? error.message : String(error), + }); + + if (error instanceof vscode.LanguageModelError) { + throw error; + } + + const errorMsg = error instanceof Error ? error.message : localize("Unknown error occurred"); + throw new vscode.LanguageModelError( + localize("Failed to search ECL documentation: {0}", errorMsg), + { cause: error } + ); + } + } +} diff --git a/src/ecl/lm/tools/findLogicalFiles.ts b/src/ecl/lm/tools/findLogicalFiles.ts new file mode 100644 index 0000000..07197ec --- /dev/null +++ b/src/ecl/lm/tools/findLogicalFiles.ts @@ -0,0 +1,79 @@ +import * as vscode from "vscode"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IFindLogicalFilesParameters { + pattern: string; +} + +export class FindLogicalFilesTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "findLogicalFiles" }); + const params = options.input; + const pattern = typeof params.pattern === "string" ? params.pattern.trim() : ""; + if (pattern.length === 0) { + throw new vscode.LanguageModelError(localize("Search pattern is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("findLogicalFiles", "invoke start", { pattern }); + + try { + const session = requireConnectedSession(); + + throwIfCancellationRequested(token); + + const files = await session.findLogicalFiles(pattern); + + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + if (files.length === 0) { + parts.push(new vscode.LanguageModelTextPart(localize("No logical files match \"{0}\".", pattern))); + } else { + parts.push(new vscode.LanguageModelTextPart(localize("Found {0} logical file(s) matching \"{1}\".", files.length.toString(), pattern))); + + const list = files.map(file => { + const name = file.Name || localize("Unnamed file"); + const owner = file.Owner || localize("unknown owner"); + const description = file.Description ? ` — ${file.Description}` : ""; + return `- ${name} (${owner})${description}`; + }).join("\n"); + + parts.push(new vscode.LanguageModelTextPart(list)); + + for (const file of files) { + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(file, null, 2))); + } + } + + logToolEvent("findLogicalFiles", "invoke success", { + pattern, + fileCount: files.length, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logToolEvent("findLogicalFiles", "invoke failed", { pattern, error: message }); + throw new vscode.LanguageModelError(localize("Failed to search logical files: {0}", message), { cause: error }); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + const pattern = typeof options.input.pattern === "string" ? options.input.pattern.trim() : ""; + + return { + invocationMessage: connected + ? localize("Searching HPCC Platform for \"{0}\"", pattern || localize("(empty pattern)")) + : localize("Cannot search: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/findWorkunits.ts b/src/ecl/lm/tools/findWorkunits.ts new file mode 100644 index 0000000..5c9195c --- /dev/null +++ b/src/ecl/lm/tools/findWorkunits.ts @@ -0,0 +1,294 @@ +import * as vscode from "vscode"; +import { WsWorkunits } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +enum SortBy { + protection = "Protection", + wuid = "Wuid", + owner = "Owner", + jobname = "Jobname", + cluster = "Cluster", + state = "State", + clustertime = "ClusterTime", + compilecost = "Compile Cost", + executioncost = "Execution Cost", + fileaccesscost = "File Access Cost" +} + +export interface IFindWorkunitsParameters { + /** + * Maximum number of workunits to return (default: 20) + */ + count?: number; + /** + * Filter by cluster name + */ + cluster?: string; + /** + * Filter by owner/username + */ + owner?: string; + /** + * Filter by state (e.g., "completed", "failed", "running") + */ + state?: string; + /** + * Search pattern for workunit ID (WUID) + */ + wuidPattern?: string; + /** + * Field to sort by (e.g. "wuid", "owner", "cluster", "state", "jobname"). + */ + sortOrder?: SortBy; + + /** + * Convenience flag to request descending order (overrides sortOrder when provided). + */ + descending?: boolean; +} + +export class FindWorkunitsTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "findWorkunits" }); + const params = options.input; + + const sortKeyLookup: Record = { + wuid: { field: "Wuid", labelKey: "workunit ID" }, + id: { field: "Wuid", labelKey: "workunit ID" }, + owner: { field: "Owner", labelKey: "owner" }, + user: { field: "Owner", labelKey: "owner" }, + cluster: { field: "Cluster", labelKey: "cluster" }, + state: { field: "State", labelKey: "state" }, + status: { field: "State", labelKey: "state" }, + jobname: { field: "Jobname", labelKey: "job name" }, + job: { field: "Jobname", labelKey: "job name" }, + protection: { field: "Protection", labelKey: "protection status" }, + clustertime: { field: "ClusterTime", labelKey: "cluster time" }, + "cluster time": { field: "ClusterTime", labelKey: "cluster time" }, + compilecost: { field: "Compile Cost", labelKey: "compile cost" }, + "compile cost": { field: "Compile Cost", labelKey: "compile cost" }, + executioncost: { field: "Execution Cost", labelKey: "execution cost" }, + "execution cost": { field: "Execution Cost", labelKey: "execution cost" }, + fileaccesscost: { field: "File Access Cost", labelKey: "file access cost" }, + "file access cost": { field: "File Access Cost", labelKey: "file access cost" }, + }; + + const sortByRaw = typeof params.sortOrder === "string" ? params.sortOrder.trim().toLowerCase() : undefined; + let sortByField: string | undefined; + let sortLabel: string | undefined; + let unsupportedSortKey: string | undefined; + + if (sortByRaw) { + const mapping = sortKeyLookup[sortByRaw]; + if (mapping) { + sortByField = mapping.field; + sortLabel = localize(mapping.labelKey); + } else { + unsupportedSortKey = params.sortOrder; + } + } + + let descending: boolean | undefined; + let sortOrderLabel: string | undefined; + + if (typeof params.descending === "boolean") { + descending = params.descending; + sortOrderLabel = descending ? localize("descending") : localize("ascending"); + } + + logToolEvent("findWorkunits", "invoke start", { + count: params.count, + cluster: params.cluster, + owner: params.owner, + state: params.state, + wuidPattern: params.wuidPattern, + sortBy: sortByField ?? params.sortOrder, + descending, + unsupportedSortKey, + }); + + const session = requireConnectedSession(); + + const requestCount = Math.min(Math.max(params.count ?? 20, 1), 200); + + // Build WUQuery request from parameters + const request: Partial = { + Count: requestCount, + }; + + if (params.cluster) { + request.Cluster = params.cluster; + } + if (params.owner) { + request.Owner = params.owner; + } + if (params.state) { + request.State = params.state; + } + if (params.wuidPattern) { + request.Wuid = params.wuidPattern; + } + if (sortByField) { + request.Sortby = sortByField; + } + if (descending !== undefined) { + request.Descending = descending; + } + + throwIfCancellationRequested(token); + + try { + const workunits = await session.wuQuery(request); + + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + if (workunits.length === 0) { + parts.push(new vscode.LanguageModelTextPart(localize("No workunits found matching the specified criteria."))); + } else { + parts.push(new vscode.LanguageModelTextPart(localize("Found {0} workunit(s).", workunits.length.toString()))); + + const list = workunits.map(wu => { + const state = wu.State || localize("unknown state"); + const jobName = wu.Jobname || localize("unnamed job"); + return `- ${wu.Wuid} (${state}) — ${jobName}`; + }).join("\n"); + parts.push(new vscode.LanguageModelTextPart(list)); + + for (const wu of workunits) { + const detailsUrl = session.wuDetailsUrl(wu.Wuid); + const wuInfo = { + Wuid: wu.Wuid, + Owner: wu.Owner, + Cluster: wu.Cluster, + Jobname: wu.Jobname, + StateID: wu.StateID, + State: wu.State, + Protected: !!wu.Protected, + Action: wu.Action, + ActionEx: wu.ActionEx, + DateTimeScheduled: wu.DateTimeScheduled, + IsPausing: !!wu.IsPausing, + ThorLCR: !!wu.ThorLCR, + TotalClusterTime: wu.TotalClusterTime, + ExecuteCost: wu.ExecuteCost, + FileAccessCost: wu.FileAccessCost, + CompileCost: wu.CompileCost, + NoAccess: !!wu.NoAccess, + detailsUrl, + }; + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(wuInfo, null, 2))); + } + } + + if (sortLabel) { + const summary = sortOrderLabel + ? localize("Sorted by {0} ({1}).", sortLabel, sortOrderLabel) + : localize("Sorted by {0}.", sortLabel); + parts.push(new vscode.LanguageModelTextPart(summary)); + } else if (sortOrderLabel) { + parts.push(new vscode.LanguageModelTextPart(localize("Sort order: {0}.", sortOrderLabel))); + } + + if (unsupportedSortKey) { + parts.push(new vscode.LanguageModelTextPart(localize("Sort key \"{0}\" is not supported; using default ordering.", unsupportedSortKey))); + } + + logToolEvent("findWorkunits", "invoke success", { + resultCount: workunits.length, + sortBy: request.Sortby, + descending, + unsupportedSortKey, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logToolEvent("findWorkunits", "invoke failed", { + error: message, + sortBy: sortByField ?? params.sortOrder, + descending, + unsupportedSortKey, + }); + throw new vscode.LanguageModelError(localize("Failed to query workunits: {0}", message), { cause: error }); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + const params = options.input; + + const filters: string[] = []; + if (params.cluster) filters.push(localize("cluster: {0}", params.cluster)); + if (params.owner) filters.push(localize("owner: {0}", params.owner)); + if (params.state) filters.push(localize("state: {0}", params.state)); + if (params.wuidPattern) filters.push(localize("WUID: {0}", params.wuidPattern)); + + const sortLabelLookup: Record = { + wuid: "workunit ID", + id: "workunit ID", + owner: "owner", + user: "owner", + cluster: "cluster", + state: "state", + status: "state", + jobname: "job name", + job: "job name", + protection: "protection status", + clustertime: "cluster time", + "cluster time": "cluster time", + compilecost: "compile cost", + "compile cost": "compile cost", + executioncost: "execution cost", + "execution cost": "execution cost", + fileaccesscost: "file access cost", + "file access cost": "file access cost", + }; + + const sortByRaw = typeof params.sortOrder === "string" ? params.sortOrder.trim().toLowerCase() : undefined; + const sortLabel = sortByRaw ? sortLabelLookup[sortByRaw] : undefined; + if (sortLabel) { + const localizedSortLabel = localize(sortLabel); + filters.push(localize("sort by {0}", localizedSortLabel)); + } else if (params.sortOrder) { + filters.push(localize("sort by {0}", params.sortOrder)); + } + + const sortOrderRaw = typeof params.sortOrder === "string" ? params.sortOrder.trim().toLowerCase() : undefined; + let orderLabel: string | undefined; + if (sortOrderRaw === "asc" || sortOrderRaw === "ascending") { + orderLabel = localize("ascending"); + } else if (sortOrderRaw === "desc" || sortOrderRaw === "descending") { + orderLabel = localize("descending"); + } else if (params.sortOrder) { + orderLabel = params.sortOrder; + } + + if (!orderLabel && typeof params.descending === "boolean") { + orderLabel = params.descending ? localize("descending") : localize("ascending"); + } + + if (orderLabel) { + filters.push(localize("order: {0}", orderLabel)); + } + + let searchDesc = localize("recent workunits"); + if (filters.length > 0) { + searchDesc = filters.join(", "); + } + + return { + invocationMessage: connected + ? localize("Searching for {0}", searchDesc) + : localize("Cannot search: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getLogicalFileInfo.ts b/src/ecl/lm/tools/getLogicalFileInfo.ts new file mode 100644 index 0000000..3e9ce9f --- /dev/null +++ b/src/ecl/lm/tools/getLogicalFileInfo.ts @@ -0,0 +1,113 @@ +import * as vscode from "vscode"; +import { LogicalFile } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetLogicalFileInfoParameters { + /** + * Name of the logical file to retrieve information for + */ + logicalFileName: string; +} + +export class GetLogicalFileInfoTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getLogicalFileInfo" }); + const params = options.input; + + const logicalFileName = typeof params.logicalFileName === "string" ? params.logicalFileName.trim() : ""; + if (logicalFileName.length === 0) { + throw new vscode.LanguageModelError(localize("Logical file name is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getLogicalFileInfo", "invoke start", { logicalFileName }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + const number = new Intl.NumberFormat(); + + try { + // Attach to the logical file (cluster is empty string for default) + const logicalFile = LogicalFile.attach(opts, "", logicalFileName); + + // Fetch detailed information + throwIfCancellationRequested(token); + const fileInfo = await logicalFile.fetchInfo(); + throwIfCancellationRequested(token); + + // Build comprehensive file information + const info: Record = { + name: fileInfo.Name, + size: fileInfo.Filesize, + recordCount: fileInfo.RecordCount, + recordSize: fileInfo.RecordSize, + modified: fileInfo.Modified, + directory: fileInfo.Dir, + description: fileInfo.Description, + isCompressed: fileInfo.IsCompressed, + isSuperfile: fileInfo.isSuperfile, + numParts: fileInfo.NumParts, + owner: fileInfo.Owner, + persistent: fileInfo.Persistent, + format: fileInfo.Format + }; + + // Get ECL record definition if available + if (fileInfo.Ecl) { + info.eclDefinition = fileInfo.Ecl; + } + + const parts: vscode.LanguageModelTextPart[] = []; + + const fileName = fileInfo.Name || logicalFileName; + const recordCount = typeof fileInfo.RecordCount === "number" ? fileInfo.RecordCount : 0; + const size = typeof fileInfo.Filesize === "number" ? fileInfo.Filesize : 0; + const summary = localize( + "Logical file {0}: {1} record(s), {2} byte(s).", + fileName, + number.format(recordCount), + number.format(size) + ); + parts.push(new vscode.LanguageModelTextPart(summary)); + + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(info, null, 2))); + + if (typeof info.eclDefinition === "string" && info.eclDefinition.length > 0) { + parts.push(new vscode.LanguageModelTextPart(`${localize("Record definition:")}\n${info.eclDefinition}`)); + } + + logToolEvent("getLogicalFileInfo", "invoke success", { + logicalFileName, + recordCount, + size, + }); + + return new vscode.LanguageModelToolResult(parts); + + } catch (e) { + const error = e as Error; + logToolEvent("getLogicalFileInfo", "invoke failed", { logicalFileName, error: error.message }); + throw new vscode.LanguageModelError( + localize("Failed to retrieve logical file info: {0}", error.message), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken): Promise { + const connected = isPlatformConnected(); + const logicalFileName = typeof options.input.logicalFileName === "string" ? options.input.logicalFileName.trim() : ""; + + return { + invocationMessage: connected + ? localize("Getting detailed information for logical file '{0}'", logicalFileName || localize("(unspecified)")) + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getTargetClusters.ts b/src/ecl/lm/tools/getTargetClusters.ts new file mode 100644 index 0000000..d886b90 --- /dev/null +++ b/src/ecl/lm/tools/getTargetClusters.ts @@ -0,0 +1,81 @@ +import * as vscode from "vscode"; +import { WsTopology } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface IGetTargetClustersParameters { + // No parameters needed - fetches all clusters from current session +} + +export class GetTargetClustersTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getTargetClusters" }); + + logToolEvent("getTargetClusters", "invoke start"); + + const session = requireConnectedSession(); + + throwIfCancellationRequested(token); + + try { + // Fetch available clusters + const clusters = await session.targetClusters(); + + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + if (clusters.length === 0) { + parts.push(new vscode.LanguageModelTextPart(localize("No clusters found on the connected HPCC Platform."))); + } else { + parts.push(new vscode.LanguageModelTextPart(localize("Found {0} cluster(s):", clusters.length.toString()))); + + // Add a text summary + const clusterSummary = clusters.map(c => { + const queue = c.Queue ? ` — ${c.Queue}` : ""; + return `- ${c.Name} (${c.Type})${queue}`; + }).join("\n"); + parts.push(new vscode.LanguageModelTextPart( + localize("Available clusters:\n{0}", clusterSummary) + )); + + for (const cluster of clusters) { + const clusterInfo = { + name: cluster.Name, + type: cluster.Type, + queue: cluster.Queue + }; + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(clusterInfo, null, 2))); + } + } + + logToolEvent("getTargetClusters", "invoke success", { clusterCount: clusters.length }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + logToolEvent("getTargetClusters", "invoke failed", { error: errorMessage }); + throw new vscode.LanguageModelError( + localize("Failed to fetch target clusters: {0}", errorMessage), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + + return { + invocationMessage: connected + ? localize("Fetching available target clusters") + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getWorkunitDetails.ts b/src/ecl/lm/tools/getWorkunitDetails.ts new file mode 100644 index 0000000..b78a849 --- /dev/null +++ b/src/ecl/lm/tools/getWorkunitDetails.ts @@ -0,0 +1,138 @@ +import * as vscode from "vscode"; +import { Workunit } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetWorkunitDetailsParameters { + /** + * Workunit ID (WUID) to fetch details for + */ + wuid: string; +} + +export class GetWorkunitDetailsTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getWorkunitDetails" }); + const params = options.input; + + const wuid = typeof params.wuid === "string" ? params.wuid.trim() : ""; + if (wuid.length === 0) { + throw new vscode.LanguageModelError(localize("WUID is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getWorkunitDetails", "invoke start", { wuid }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + + try { + // Attach to the workunit and fetch its details + const wu = Workunit.attach(opts, wuid); + await wu.refresh(); + + // Fetch results (if available) + throwIfCancellationRequested(token); + + const results = await wu.fetchResults().catch(() => []); + + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + // Add workunit summary information + const detailsUrl = session.wuDetailsUrl(wu.Wuid); + parts.push(new vscode.LanguageModelTextPart(localize("Workunit Details for {0}:", wuid))); + + const wuDetails = { + wuid: wu.Wuid, + owner: wu.Owner, + cluster: wu.Cluster, + state: wu.State, + stateID: wu.StateID, + jobname: wu.Jobname, + protected: wu.Protected, + description: wu.Description, + scope: wu.Scope, + totalClusterTime: wu.TotalClusterTime, + applicationValues: wu.ApplicationValues, + }; + + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(wuDetails, null, 2))); + + const summary = localize( + "{0} on {1} is {2}.", + wu.Wuid, + wu.Cluster || localize("unknown cluster"), + wu.State || localize("unknown state") + ); + parts.push(new vscode.LanguageModelTextPart(summary)); + if (detailsUrl) { + parts.push(new vscode.LanguageModelTextPart(`${localize("ECL Watch URL:")} ${detailsUrl}`)); + } + + // Add results information if available + if (results.length > 0) { + parts.push(new vscode.LanguageModelTextPart(localize("Results ({0}):", results.length.toString()))); + for (const result of results) { + parts.push(new vscode.LanguageModelTextPart(JSON.stringify({ + name: result.Name, + value: result.Value, + sequence: result.Sequence, + total: result.Total, + }, null, 2))); + } + } + + // Add exceptions if any + const exceptions = await wu.fetchECLExceptions().catch(() => []); + throwIfCancellationRequested(token); + if (exceptions.length > 0) { + parts.push(new vscode.LanguageModelTextPart(localize("Exceptions ({0}):", exceptions.length.toString()))); + for (const exception of exceptions) { + parts.push(new vscode.LanguageModelTextPart(JSON.stringify({ + severity: exception.Severity, + source: exception.Source, + message: exception.Message, + code: exception.Code, + fileName: exception.FileName, + lineNo: exception.LineNo, + column: exception.Column, + }, null, 2))); + } + } + + logToolEvent("getWorkunitDetails", "invoke success", { + wuid: wu.Wuid, + state: wu.State, + resultCount: results.length, + exceptionCount: exceptions.length, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + logToolEvent("getWorkunitDetails", "invoke failed", { wuid, error: errorMessage }); + throw new vscode.LanguageModelError( + localize("Failed to fetch workunit details: {0}", errorMessage), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + const wuid = typeof options.input.wuid === "string" ? options.input.wuid.trim() : ""; + + return { + invocationMessage: connected + ? localize("Fetching details for workunit {0}", wuid || localize("(unspecified)")) + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getWorkunitDiagnostics.ts b/src/ecl/lm/tools/getWorkunitDiagnostics.ts new file mode 100644 index 0000000..d8002ef --- /dev/null +++ b/src/ecl/lm/tools/getWorkunitDiagnostics.ts @@ -0,0 +1,138 @@ +import * as vscode from "vscode"; +import { Workunit } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetWorkunitDiagnosticsParameters { + /** + * Workunit ID (WUID) to inspect + */ + wuid: string; +} + +export class GetWorkunitDiagnosticsTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getWorkunitDiagnostics" }); + const params = options.input; + + const wuid = typeof params.wuid === "string" ? params.wuid.trim() : ""; + if (wuid.length === 0) { + throw new vscode.LanguageModelError(localize("WUID is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getWorkunitDiagnostics", "invoke start", { + wuid, + }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + const number = new Intl.NumberFormat(); + + try { + const wu = Workunit.attach(opts, wuid); + await wu.refresh(); + throwIfCancellationRequested(token); + + const errorCount = typeof wu.ErrorCount === "number" ? wu.ErrorCount : Number(wu.ErrorCount ?? 0); + const warningCount = typeof wu.WarningCount === "number" ? wu.WarningCount : Number(wu.WarningCount ?? 0); + const infoCount = typeof wu.InfoCount === "number" ? wu.InfoCount : Number(wu.InfoCount ?? 0); + const alertCount = typeof wu.AlertCount === "number" ? wu.AlertCount : Number(wu.AlertCount ?? 0); + + const compileCost = typeof wu.CompileCost === "number" ? wu.CompileCost : Number(wu.CompileCost ?? 0); + const executeCost = typeof wu.ExecuteCost === "number" ? wu.ExecuteCost : Number(wu.ExecuteCost ?? 0); + const fileAccessCost = typeof wu.FileAccessCost === "number" ? wu.FileAccessCost : Number(wu.FileAccessCost ?? 0); + + const parts: Array = []; + + parts.push(new vscode.LanguageModelTextPart(localize( + "Workunit {0} ({1}) has {2} error(s), {3} warning(s), {4} info message(s), and {5} alert(s).", + wu.Wuid, + wu.State || localize("unknown state"), + number.format(errorCount), + number.format(warningCount), + number.format(infoCount), + number.format(alertCount) + ))); + + parts.push(new vscode.LanguageModelTextPart(localize( + "Estimated costs — Compile: {0}, Execute: {1}, File access: {2}.", + number.format(compileCost), + number.format(executeCost), + number.format(fileAccessCost) + ))); + + const exceptions = await wu.fetchECLExceptions().catch(() => []); + throwIfCancellationRequested(token); + + if (exceptions.length === 0) { + parts.push(new vscode.LanguageModelTextPart(localize("No ECL exceptions reported."))); + } else { + const lines = (exceptions as Array>).map((exception, index: number) => { + const severity = typeof exception.Severity === "string" ? exception.Severity : localize("unknown severity"); + const message = typeof exception.Message === "string" ? exception.Message : localize("No message provided"); + const source = typeof exception.Source === "string" && exception.Source.length > 0 ? ` (${exception.Source})` : ""; + const locationParts: Array = []; + if (typeof exception.FileName === "string" && exception.FileName.length > 0) { + locationParts.push(exception.FileName); + } + if (typeof exception.LineNo === "number") { + locationParts.push(exception.LineNo.toString()); + } + if (typeof exception.Column === "number") { + locationParts.push(exception.Column.toString()); + } + const location = locationParts.length > 0 ? ` [${locationParts.join(":")}]` : ""; + return `${index + 1}. ${severity.toUpperCase()}: ${message}${source}${location}`; + }).join("\n"); + + parts.push(new vscode.LanguageModelTextPart(`${localize("Exceptions:")}\n${lines}`)); + } + + const payload = { + wuid: wu.Wuid, + owner: wu.Owner, + state: wu.State, + errorCount, + warningCount, + infoCount, + alertCount, + compileCost, + executeCost, + fileAccessCost + }; + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(payload, null, 2))); + + logToolEvent("getWorkunitDiagnostics", "invoke success", { + wuid: wu.Wuid, + state: wu.State, + errorCount, + warningCount, + exceptionCount: Array.isArray(exceptions) ? exceptions.length : 0, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logToolEvent("getWorkunitDiagnostics", "invoke failed", { + wuid, + error: message, + }); + throw new vscode.LanguageModelError(localize("Failed to retrieve workunit diagnostics: {0}", message), { cause: error }); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken): Promise { + const connected = isPlatformConnected(); + return { + invocationMessage: connected + ? localize("Retrieving diagnostics for workunit {0}", options.input.wuid || "") + : localize("Cannot fetch diagnostics: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")) + } + }; + } +} diff --git a/src/ecl/lm/tools/getWorkunitECL.ts b/src/ecl/lm/tools/getWorkunitECL.ts new file mode 100644 index 0000000..a32fbea --- /dev/null +++ b/src/ecl/lm/tools/getWorkunitECL.ts @@ -0,0 +1,101 @@ +import * as vscode from "vscode"; +import { Workunit } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetWorkunitECLParameters { + /** + * Workunit ID (WUID) to fetch ECL source code from + */ + wuid: string; +} + +export class GetWorkunitECLTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getWorkunitECL" }); + const params = options.input; + + const wuid = typeof params.wuid === "string" ? params.wuid.trim() : ""; + if (wuid.length === 0) { + throw new vscode.LanguageModelError(localize("WUID is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getWorkunitECL", "invoke start", { wuid }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + + try { + // Attach to the workunit + const wu = Workunit.attach(opts, wuid); + await wu.refresh(); + + // Fetch the ECL source code using fetchQuery + throwIfCancellationRequested(token); + const queryInfo = await wu.fetchQuery(); + throwIfCancellationRequested(token); + const eclText = queryInfo.Text || ""; + + const info: Record = { + wuid: wu.Wuid, + jobname: wu.Jobname, + eclText: eclText + }; + + const parts: vscode.LanguageModelTextPart[] = []; + + const summary = localize( + "Retrieved ECL for {0} ({1}).", + wu.Wuid, + wu.Jobname || localize("unnamed job") + ); + parts.push(new vscode.LanguageModelTextPart(summary)); + + const detailsUrl = session.wuDetailsUrl(wu.Wuid); + if (detailsUrl) { + parts.push(new vscode.LanguageModelTextPart(`${localize("ECL Watch URL:")} ${detailsUrl}`)); + } + + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(info, null, 2))); + + const snippetLimit = 4000; + if (eclText.length > 0) { + const snippet = eclText.length > snippetLimit ? `${eclText.slice(0, snippetLimit)}\n…` : eclText; + parts.push(new vscode.LanguageModelTextPart(`${localize("ECL source preview:")}\n${snippet}`)); + } + + logToolEvent("getWorkunitECL", "invoke success", { + wuid: wu.Wuid, + jobname: wu.Jobname, + eclLength: eclText.length, + }); + + return new vscode.LanguageModelToolResult(parts); + + } catch (e) { + const error = e as Error; + logToolEvent("getWorkunitECL", "invoke failed", { wuid, error: error.message }); + throw new vscode.LanguageModelError( + localize("Failed to fetch ECL from workunit: {0}", error.message), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken): Promise { + const connected = isPlatformConnected(); + const wuid = typeof options.input.wuid === "string" ? options.input.wuid.trim() : ""; + + return { + invocationMessage: connected + ? localize("Fetching ECL source code from workunit '{0}'", wuid || localize("(unspecified)")) + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getWorkunitResults.ts b/src/ecl/lm/tools/getWorkunitResults.ts new file mode 100644 index 0000000..b3ca431 --- /dev/null +++ b/src/ecl/lm/tools/getWorkunitResults.ts @@ -0,0 +1,147 @@ +import * as vscode from "vscode"; +import { Result, Workunit, type XSDXMLNode } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetWorkunitResultsParameters { + /** + * Workunit ID (WUID) + */ + wuid: string; + /** + * Result name or sequence number + */ + resultName: string; + /** + * Starting row (0-based, default: 0) + */ + start?: number; + /** + * Number of rows to fetch (default: 100, max: 1000) + */ + count?: number; +} + +export class GetWorkunitResultsTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getWorkunitResults" }); + const params = options.input; + + if (!params.wuid || !params.resultName) { + throw new vscode.LanguageModelError(localize("WUID and result name are required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getWorkunitResults", "invoke start", { + wuid: params.wuid, + resultName: params.resultName, + start: params.start, + count: params.count, + }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + + try { + // Attach to the result + const result = Result.attach(opts, params.wuid, params.resultName); + + // Fetch schema to get column information + throwIfCancellationRequested(token); + const schema = await result.fetchXMLSchema(); + throwIfCancellationRequested(token); + + // Determine row range + const start = params.start ?? 0; + const count = Math.min(params.count ?? 100, 1000); // Cap at 1000 rows + + // Fetch the rows + const rows = await result.fetchRows(start, count); + throwIfCancellationRequested(token); + + const parts: vscode.LanguageModelTextPart[] = []; + + // Add summary + const totalRows = typeof result.Total === "number" ? result.Total : rows.length; + parts.push(new vscode.LanguageModelTextPart( + localize("Result '{0}' from workunit {1}: Showing rows {2}-{3} of {4} total", + params.resultName, + params.wuid, + start.toString(), + rows.length === 0 ? start.toString() : (start + rows.length - 1).toString(), + totalRows.toString() + ) + )); + + const resultUrl = session.wuResultUrl(params.wuid, params.resultName); + if (resultUrl) { + parts.push(new vscode.LanguageModelTextPart(`${localize("Result URL:")} ${resultUrl}`)); + } + + // Add column information + if (schema && schema.root && schema.root.children) { + const columns = schema.root.children.map((child: XSDXMLNode) => ({ + name: child.name, + type: child.type + })); + parts.push(new vscode.LanguageModelTextPart(JSON.stringify({ columns }, null, 2))); + } + + // Add the actual data rows + if (rows.length > 0) { + const structured = { + rows, + start, + count: rows.length, + total: result.Total, + }; + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(structured, null, 2))); + + parts.push(new vscode.LanguageModelTextPart( + localize("Data preview (first {0} rows):\n{1}", + Math.min(5, rows.length).toString(), + JSON.stringify(rows.slice(0, 5), null, 2) + ) + )); + } else { + parts.push(new vscode.LanguageModelTextPart(localize("No rows found in the specified range."))); + } + + logToolEvent("getWorkunitResults", "invoke success", { + wuid: params.wuid, + resultName: params.resultName, + returnedRows: rows.length, + totalRows, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + logToolEvent("getWorkunitResults", "invoke failed", { + wuid: params.wuid, + resultName: params.resultName, + error: errorMessage, + }); + throw new vscode.LanguageModelError( + localize("Failed to fetch workunit results: {0}", errorMessage), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + const params = options.input; + + return { + invocationMessage: connected + ? localize("Fetching result '{0}' from workunit {1}", params.resultName || "", params.wuid || "") + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/getWorkunitTimings.ts b/src/ecl/lm/tools/getWorkunitTimings.ts new file mode 100644 index 0000000..1a8f22a --- /dev/null +++ b/src/ecl/lm/tools/getWorkunitTimings.ts @@ -0,0 +1,100 @@ +import * as vscode from "vscode"; +import { Workunit } from "@hpcc-js/comms"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { createServiceOptions, logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; + +export interface IGetWorkunitTimingsParameters { + /** + * Workunit ID (WUID) to fetch timing/performance metrics from + */ + wuid: string; +} + +export class GetWorkunitTimingsTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "getWorkunitTimings" }); + const params = options.input; + + const wuid = typeof params.wuid === "string" ? params.wuid.trim() : ""; + if (wuid.length === 0) { + throw new vscode.LanguageModelError(localize("WUID is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("getWorkunitTimings", "invoke start", { + wuid, + }); + + const session = requireConnectedSession(); + const opts = await createServiceOptions(session); + + try { + // Attach to the workunit + const wu = Workunit.attach(opts, wuid); + await wu.refresh(); + + throwIfCancellationRequested(token); + + // Build timing information + const info: Record = { + wuid: wu.Wuid, + state: wu.State, + totalClusterTime: wu.TotalClusterTime, + cluster: wu.Cluster + }; + + // Add any other available timing properties + if (wu.DateTimeScheduled) info.dateTimeScheduled = wu.DateTimeScheduled; + + const parts: vscode.LanguageModelTextPart[] = []; + const summary = localize( + "Workunit {0} ran on {1} with total cluster time {2}.", + wu.Wuid, + wu.Cluster || localize("unknown cluster"), + wu.TotalClusterTime || localize("not reported") + ); + parts.push(new vscode.LanguageModelTextPart(summary)); + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(info, null, 2))); + + const detailsUrl = session.wuDetailsUrl(wu.Wuid); + if (detailsUrl) { + parts.push(new vscode.LanguageModelTextPart(`${localize("ECL Watch URL:")} ${detailsUrl}`)); + } + + logToolEvent("getWorkunitTimings", "invoke success", { + wuid: wu.Wuid, + cluster: wu.Cluster, + totalClusterTime: wu.TotalClusterTime, + }); + + return new vscode.LanguageModelToolResult(parts); + + } catch (e) { + const error = e as Error; + logToolEvent("getWorkunitTimings", "invoke failed", { + wuid, + error: error.message, + }); + throw new vscode.LanguageModelError( + localize("Failed to fetch workunit timings: {0}", error.message), + { cause: error } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken): Promise { + const connected = isPlatformConnected(); + const wuid = typeof options.input.wuid === "string" ? options.input.wuid.trim() : ""; + + return { + invocationMessage: connected + ? localize("Fetching timing metrics from workunit '{0}'", wuid || localize("(unspecified)")) + : localize("Cannot fetch: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/submitECL.ts b/src/ecl/lm/tools/submitECL.ts new file mode 100644 index 0000000..e57b6ed --- /dev/null +++ b/src/ecl/lm/tools/submitECL.ts @@ -0,0 +1,170 @@ +import * as vscode from "vscode"; +import { Workunit } from "@hpcc-js/comms"; +import { isPlatformConnected, sessionManager } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import * as os from "os"; +import { logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; +import { isECLContext } from "../utils/eclContext"; + +export interface ISubmitECLParameters { + /** + * ECL code to submit for execution + */ + ecl: string; + /** + * Optional job name for the workunit + */ + jobName?: string; + /** + * Optional target cluster name + */ + targetCluster?: string; +} + +export class SubmitECLTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken): Promise { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "submitECL" }); + const params = options.input; + + if (!params.ecl) { + throw new vscode.LanguageModelError(localize("ECL code is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("submitECL", "invoke start", { + jobName: params.jobName, + eclLength: params.ecl.length, + }); + + const session = requireConnectedSession(); + + try { + // Create a temporary file with the ECL code + const tmpFileName = `ecl_lm_submit_${Date.now()}.ecl`; + const tmpUri = vscode.Uri.joinPath(vscode.Uri.file(os.tmpdir()), tmpFileName); + + // Write ECL code to temp file + const eclContent = new TextEncoder().encode(params.ecl); + await vscode.workspace.fs.writeFile(tmpUri, eclContent); + + try { + + // Submit the ECL + throwIfCancellationRequested(token); + + const workunit: Workunit = await session.submit(tmpUri, "submit"); + + if (token.isCancellationRequested) { + throw new vscode.LanguageModelError(localize("Operation cancelled"), { cause: "cancelled" }); + } + + if (params.jobName) { + await workunit.update({ Jobname: params.jobName }).catch(() => undefined); + } + + if (!workunit) { + throw new Error(localize("Failed to create workunit")); + } + + // Wait for workunit to complete + await workunit.watchUntilComplete(); + + throwIfCancellationRequested(token); + + // Fetch final state and basic info + await workunit.refresh(); + + // Build response with workunit details + const info: Record = { + wuid: workunit.Wuid, + state: workunit.State, + jobName: params.jobName || tmpFileName.replace(".ecl", ""), + owner: session.userID + }; + + // Check for errors/exceptions + const exceptions = await workunit.fetchECLExceptions().catch(() => []); + throwIfCancellationRequested(token); + if (exceptions.length > 0) { + info.exceptions = exceptions.map((ex: { Source: string; Severity: string; Message: string }) => ({ + source: ex.Source, + severity: ex.Severity, + message: ex.Message + })); + } + + // Get result names (don't fetch full data - could be huge) + const results = await workunit.fetchResults().catch(() => []); + throwIfCancellationRequested(token); + if (results.length > 0) { + info.results = results.map((r: { Name: string; Total: number }) => ({ + name: r.Name, + rowCount: r.Total + })); + } + + const parts: vscode.LanguageModelTextPart[] = []; + parts.push(new vscode.LanguageModelTextPart(localize("Submitted workunit {0}: {1}", workunit.Wuid, workunit.State || localize("unknown state")))); + parts.push(new vscode.LanguageModelTextPart(JSON.stringify(info, null, 2))); + + const detailsUrl = session.wuDetailsUrl(workunit.Wuid); + if (detailsUrl) { + parts.push(new vscode.LanguageModelTextPart(`${localize("ECL Watch URL:")} ${detailsUrl}`)); + } + + if (Array.isArray(info.results) && info.results.length > 0) { + const resultSummary = info.results.map((result: any) => `- ${result.name} (${result.rowCount ?? 0} row(s))`).join("\n"); + parts.push(new vscode.LanguageModelTextPart(`${localize("Result overview:")}\n${resultSummary}`)); + } + + if (Array.isArray(info.exceptions) && info.exceptions.length > 0) { + const exceptionSummary = info.exceptions.map((exception: any) => `- ${exception.severity}: ${exception.message}`).join("\n"); + parts.push(new vscode.LanguageModelTextPart(`${localize("Exceptions:")}\n${exceptionSummary}`)); + } + + logToolEvent("submitECL", "invoke success", { + wuid: workunit.Wuid, + state: workunit.State, + resultCount: Array.isArray(info.results) ? info.results.length : 0, + exceptionCount: Array.isArray(info.exceptions) ? info.exceptions.length : 0, + }); + + return new vscode.LanguageModelToolResult(parts); + + } finally { + // Clean up temporary file + try { + await vscode.workspace.fs.delete(tmpUri); + } catch { + // Ignore cleanup errors + } + } + + } catch (e) { + const error = e as Error; + logToolEvent("submitECL", "invoke failed", { + jobName: params.jobName, + error: error.message, + }); + throw new vscode.LanguageModelError( + localize("Failed to submit ECL: {0}", error.message), + { cause: "execution_failed" } + ); + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken): Promise { + const connected = isPlatformConnected(); + const jobName = options.input.jobName || localize("ECL job"); + + return { + invocationMessage: connected + ? localize("Submitting {0}", jobName) + : localize("Cannot submit: HPCC Platform not connected"), + confirmationMessages: connected ? undefined : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + } + }; + } +} diff --git a/src/ecl/lm/tools/syntaxCheck.ts b/src/ecl/lm/tools/syntaxCheck.ts new file mode 100644 index 0000000..0af3abe --- /dev/null +++ b/src/ecl/lm/tools/syntaxCheck.ts @@ -0,0 +1,115 @@ +import * as vscode from "vscode"; +import * as os from "os"; +import { isPlatformConnected } from "../../../hpccplatform/session"; +import { reporter } from "../../../telemetry"; +import localize from "../../../util/localize"; +import { logToolEvent, requireConnectedSession, throwIfCancellationRequested } from "../utils"; +import { isECLContext } from "../utils/eclContext"; + +export interface ISyntaxCheckParameters { + ecl: string; +} + +export class SyntaxCheckTool implements vscode.LanguageModelTool { + async invoke(options: vscode.LanguageModelToolInvocationOptions, token: vscode.CancellationToken) { + reporter?.sendTelemetryEvent("lmTool.invoke", { tool: "syntaxCheck" }); + const params = options.input; + if (typeof params.ecl !== "string" || params.ecl.trim().length === 0) { + throw new vscode.LanguageModelError(localize("ECL code is required"), { cause: "invalid_parameters" }); + } + + logToolEvent("syntaxCheck", "invoke start", { inputLength: params.ecl.length }); + + const session = requireConnectedSession(); + const tmpFileName = `ecl_syntax_check_${Date.now()}.ecl`; + const tmpUri = vscode.Uri.joinPath(vscode.Uri.file(os.tmpdir()), tmpFileName); + + try { + const eclContent = new TextEncoder().encode(params.ecl); + await vscode.workspace.fs.writeFile(tmpUri, eclContent); + + throwIfCancellationRequested(token); + + const result = await session.checkSyntax(tmpUri); + + throwIfCancellationRequested(token); + + const errors = result?.errors ?? []; + const checked = result?.checked ?? []; + const issueCount = errors.length; + const checkedCount = checked.length; + + const parts: vscode.LanguageModelTextPart[] = []; + + if (issueCount === 0) { + parts.push(new vscode.LanguageModelTextPart(localize("No syntax errors found. Checked {0} file(s).", checkedCount.toString()))); + } else { + parts.push(new vscode.LanguageModelTextPart(localize("Detected {0} syntax issue(s) across {1} file(s).", issueCount.toString(), Math.max(checkedCount, 1).toString()))); + + const formatted = errors + .map((error: any, idx: number) => { + const filePath = typeof error.filePath === "string" && error.filePath.length > 0 ? error.filePath : checked[0] || tmpUri.fsPath; + const line = typeof error.line === "number" ? error.line : undefined; + const column = typeof error.col === "number" ? error.col : undefined; + const severity = typeof error.severity === "string" ? error.severity : "error"; + const code = error.code ? `[${error.code}] ` : ""; + const location = [filePath, line, column] + .filter(value => value !== undefined && value !== "") + .join(":"); + const message = error.msg || error.message || localize("Unknown syntax issue"); + return `${idx + 1}. ${location} ${severity.toUpperCase()} ${code}${message}`; + }) + .join("\n"); + + if (formatted) { + parts.push(new vscode.LanguageModelTextPart(formatted)); + } + } + + if (checkedCount > 0) { + const checkedFiles = checked.join("\n"); + parts.push(new vscode.LanguageModelTextPart(`${localize("Files checked:")}\n${checkedFiles}`)); + } + + logToolEvent("syntaxCheck", "invoke success", { + issueCount, + checkedCount, + filesChecked: checked, + }); + + return new vscode.LanguageModelToolResult(parts); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logToolEvent("syntaxCheck", "invoke failed", { error: message }); + throw new vscode.LanguageModelError(localize("Error checking syntax: {0}", message), { cause: error }); + } finally { + try { + await vscode.workspace.fs.delete(tmpUri); + } catch { + // ignore + } + } + } + + async prepareInvocation(options: vscode.LanguageModelToolInvocationPrepareOptions, _token: vscode.CancellationToken) { + const connected = isPlatformConnected(); + const eclPreview = options.input.ecl ? `\n\n${options.input.ecl.slice(0, 200)}${options.input.ecl.length > 200 ? "…" : ""}` : ""; + + const confirmationMessages = connected ? { + title: localize("Check ECL Syntax"), + message: new vscode.MarkdownString( + localize("Check the syntax of ECL code?") + eclPreview + ), + } : { + title: localize("HPCC Platform not connected"), + message: new vscode.MarkdownString(localize("This tool requires an active HPCC connection.")), + }; + + return { + invocationMessage: connected + ? localize("Checking ECL syntax") + : localize("Cannot check syntax: HPCC Platform not connected"), + confirmationMessages, + }; + } +} diff --git a/src/ecl/lm/utils/eclContext.ts b/src/ecl/lm/utils/eclContext.ts new file mode 100644 index 0000000..ef277df --- /dev/null +++ b/src/ecl/lm/utils/eclContext.ts @@ -0,0 +1,67 @@ +import * as vscode from "vscode"; + +/** + * Determines if the user is currently working in an ECL context + */ +export function isECLContext(): boolean { + const activeEditor = vscode.window.activeTextEditor; + + if (!activeEditor) { + return false; + } + + // Check if active document is ECL-related + const doc = activeEditor.document; + const isECLLanguage = doc.languageId === "ecl" || doc.languageId === "kel"; + const isECLFile = doc.fileName.match(/\.(ecl|kel|mod|ecllib|eclnb)$/i); + + // Check visible editors for ECL content + const hasECLVisible = vscode.window.visibleTextEditors.some(editor => { + const editorDoc = editor.document; + return editorDoc.languageId === "ecl" || + editorDoc.languageId === "kel" || + editorDoc.fileName.match(/\.(ecl|kel|mod|ecllib|eclnb)$/i); + }); + + // Check if viewing HPCC Platform output or workunit + const isHPCCOutput = doc.uri.scheme === "hpcc" || + doc.uri.scheme === "wu" || + doc.fileName.includes("workunit") || + doc.fileName.includes("HPCC"); + + return !!(isECLLanguage || isECLFile || hasECLVisible || isHPCCOutput); +} + +/** + * Gets contextual information about the current ECL environment + */ +export function getECLContextInfo(): { + isECLContext: boolean; + activeLanguage?: string; + activeFileName?: string; + hasECLFiles: boolean; + isConnected: boolean; +} { + const isECL = isECLContext(); + const activeEditor = vscode.window.activeTextEditor; + + return { + isECLContext: isECL, + activeLanguage: activeEditor?.document.languageId, + activeFileName: activeEditor?.document.fileName, + hasECLFiles: vscode.workspace.textDocuments.some(doc => + doc.languageId === "ecl" || doc.languageId === "kel" + ), + isConnected: !!vscode.workspace.getConfiguration("ecl").get("connected") + }; +} + +/** + * Creates a context-aware invocation message + */ +export function createECLContextMessage(toolName: string, baseMessage: string): string { + if (isECLContext()) { + return `${baseMessage} (ECL context detected)`; + } + return baseMessage; +} diff --git a/src/ecl/lm/utils/index.ts b/src/ecl/lm/utils/index.ts index 50960ba..9b3574d 100644 --- a/src/ecl/lm/utils/index.ts +++ b/src/ecl/lm/utils/index.ts @@ -1 +1,3 @@ -export * from "./chatResponse"; \ No newline at end of file +export * from "./chatResponse"; +export * from "./session"; +export * from "./logger"; \ No newline at end of file diff --git a/src/ecl/lm/utils/logger.ts b/src/ecl/lm/utils/logger.ts new file mode 100644 index 0000000..eecfb34 --- /dev/null +++ b/src/ecl/lm/utils/logger.ts @@ -0,0 +1,23 @@ +import * as vscode from "vscode"; + +let outputChannel: vscode.OutputChannel | undefined; + +function channel(): vscode.OutputChannel { + if (!outputChannel) { + outputChannel = vscode.window.createOutputChannel("ECL LM Tools", { log: true }); + } + return outputChannel; +} + +export function logToolEvent(tool: string, message: string, details: Record = {}): void { + const timestamp = new Date().toISOString(); + let serialized = ""; + if (details && Object.keys(details).length > 0) { + try { + serialized = ` ${JSON.stringify(details)}`; + } catch { + serialized = " {\"error\":\"Unable to serialize details\"}"; + } + } + channel().appendLine(`[${timestamp}] [${tool}] ${message}${serialized}`); +} diff --git a/src/ecl/lm/utils/session.ts b/src/ecl/lm/utils/session.ts new file mode 100644 index 0000000..f6bbf68 --- /dev/null +++ b/src/ecl/lm/utils/session.ts @@ -0,0 +1,27 @@ +import * as vscode from "vscode"; +import { isPlatformConnected, sessionManager } from "../../../hpccplatform/session"; +import localize from "../../../util/localize"; + +export function requireConnectedSession(): NonNullable { + if (!isPlatformConnected()) { + throw new vscode.LanguageModelError(localize("HPCC Platform not connected"), { cause: "not_connected" }); + } + + const session = sessionManager.session; + if (!session) { + throw new vscode.LanguageModelError(localize("No active session configuration"), { cause: "not_connected" }); + } + + return session; +} + +export async function createServiceOptions(session?: NonNullable) { + const activeSession = session ?? requireConnectedSession(); + return activeSession.options(); +} + +export function throwIfCancellationRequested(token: vscode.CancellationToken): void { + if (token.isCancellationRequested) { + throw new vscode.LanguageModelError(localize("Operation cancelled"), { cause: "cancelled" }); + } +} diff --git a/src/hpccplatform/session.ts b/src/hpccplatform/session.ts index b577b90..0deea67 100644 --- a/src/hpccplatform/session.ts +++ b/src/hpccplatform/session.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode"; -import { WsWorkunits, Workunit, ClientTools } from "@hpcc-js/comms"; +import { WsWorkunits, Workunit, ClientTools, type IOptions } from "@hpcc-js/comms"; import { scopedLogger } from "@hpcc-js/util"; import { launchConfigurations, LaunchConfig, LaunchRequestArguments, espUrl, wuDetailsUrl, wuResultUrl, CheckResponse, launchConfiguration, IExecFile } from "./launchConfig"; import { LaunchConfigState, credentialManager, Credentials } from "../util/credentialManager"; @@ -116,6 +116,18 @@ class Session { return this._launchConfig.bundleUninstall(name); } + async options(): Promise { + const credentials = await this.getStoredCredentials(); + + return { + baseUrl: credentials.baseUrl, + userID: credentials.user, + password: credentials.password, + rejectUnauthorized: this.launchRequestArgs?.rejectUnauthorized ?? true, + timeoutSecs: this.launchRequestArgs?.timeoutSecs ?? 60 + }; + } + async getStoredCredentials(): Promise { return this._launchConfig.getStoredCredentials(); }