diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..1807794e6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,40 @@ +# Repository Guidelines + +## Project Structure & Module Organization +- Source: `src/` (ES modules, SCSS). Key areas: `src/components/`, `src/pages/`, `src/lib/`, `src/plugins/` (Cordova plugins), `src/styles/`. +- Web assets: `www/` (entry `index.html`, build output in `www/build/`, css/js subfolders). +- Config: `webpack.config.js`, `.babelrc`, `biome.json`, `config.xml`. +- Utilities: `utils/` (build, start, setup scripts; language and tooling helpers). + +## Build, Test, and Development Commands +- `pnpm run setup`: Install deps, add Android platform, create build dirs, add plugins. +- `pnpm run start -- android d`: Build and run on device/emulator (default dev). For release-like: `pnpm run start -- android p`. +- `pnpm run build`: Build app (defaults to dev). Production example: `pnpm run build -- paid prod`. F-Droid variant: `pnpm run build -- paid prod fdroid`. +- `pnpm run clean -- android android`: Recreate Android platform. +- `pnpm run plugin -- [path]`: Reinstall a Cordova plugin. +- Linting/format: `pnpm run lint`, `pnpm run format`, `pnpm run check` (Biome). + +## Coding Style & Naming Conventions +- Formatting: Biome enforced; indent with tabs (`biome.json`). Run `npm run format` before commits. +- Language: ESM JavaScript, SCSS; prefer imports from `src` root (webpack `resolve.modules: ["node_modules", "src"]`). +- Naming: camelCase for files/dirs (e.g., `fileSystem`, `quickTools`), PascalCase for classes/components, kebab-case for SCSS partials when applicable. + +## Testing Guidelines +- No formal test runner configured. Provide clear manual verification steps for Android (device/emulator), including affected screens, repro steps, and expected/actual behavior. +- Attach logs when relevant (see issue templates mention of `Acode.log`). Screenshots or screen recordings are encouraged for UI changes. + +## Commit & Pull Request Guidelines +- Commits: Follow conventional style when possible (`feat:`, `fix:`, `chore(scope):`, etc.), reference issues (`(#123)`). +- PRs: Include a concise summary, linked issues, screenshots for UI, and test/verification steps. Note any Cordova plugin or config changes. +- Keep diffs focused; run `npm run lint` and ensure `www/build/` is generated by the pipeline, not committed. + +## Security & Configuration Tips +- Building for F-Droid: pass `fdroid` as the third arg to `build` to toggle plugin set. +- Do not commit secrets/keystores. Android signing is handled outside the repo; keep `keystore.jks` private. + +# When you need to call tools from the shell, use this rubric: + +- Find Files: `fd` +- Find Text: `rg` (ripgrep) +- Select among matches: pipe to `fzf` +- JSON: `jq` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f2d00d40d..1f0b2f4ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,11 @@ "license": "MIT", "dependencies": { "@deadlyjack/ajax": "^1.2.6", + "@langchain/core": "^0.3.57", + "@langchain/google-genai": "^0.2.10", + "@langchain/langgraph": "^0.2.74", + "@langchain/langgraph-checkpoint": "^0.0.18", + "@langchain/langgraph-swarm": "^0.0.3", "@ungap/custom-elements": "^1.3.0", "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", @@ -27,9 +32,11 @@ "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", "filesize": "^11.0.2", + "he": "^1.2.0", "html-tag-js": "^2.4.15", "js-base64": "^3.7.7", "jszip": "^3.10.1", + "langchain": "^0.3.27", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-footnote": "^4.0.0", @@ -39,9 +46,11 @@ "minimatch": "^10.0.3", "moment": "^2.30.1", "mustache": "^4.2.0", + "turndown": "^7.2.0", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", - "yargs": "^18.0.0" + "yargs": "^18.0.0", + "zod": "^3.25.47" }, "devDependencies": { "@babel/core": "^7.28.0", @@ -70,6 +79,7 @@ "cordova-plugin-sftp": "file:src/plugins/sftp", "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", + "cordova-sqlite-storage": "^7.0.0", "css-loader": "^7.1.2", "mini-css-extract-plugin": "^2.9.3", "path-browserify": "^1.0.1", @@ -601,6 +611,8 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", "dependencies": { @@ -1578,6 +1590,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { @@ -1823,6 +1837,12 @@ "node": ">=14.21.3" } }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", @@ -1869,6 +1889,8 @@ }, "node_modules/@deadlyjack/ajax": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@deadlyjack/ajax/-/ajax-1.2.6.tgz", + "integrity": "sha512-VwZU8YUflO2/V/dl3dluu+3jg8Ghz/W5fwxD5Z21OZXKeV73d+vStKVBe4wi+Av2KbTR35K7Z+5Q3iIpjB41MA==", "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { @@ -1881,6 +1903,15 @@ "node": ">=14.17.0" } }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", @@ -1904,6 +1935,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -1929,6 +1962,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", "engines": { "node": ">=12" @@ -1939,10 +1974,14 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -1958,6 +1997,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -1971,6 +2012,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -1986,6 +2029,8 @@ }, "node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "license": "ISC" }, "node_modules/@jridgewell/gen-mapping": { @@ -2057,8 +2102,245 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@langchain/core": { + "version": "0.3.57", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.57.tgz", + "integrity": "sha512-jz28qCTKJmi47b6jqhQ6vYRTG5jRpqhtPQjriRTB5wR8mgvzo6xKs0fG/kExS3ZvM79ytD1npBvgf8i19xOo9Q==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.3.29", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@langchain/core/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/google-genai": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-0.2.10.tgz", + "integrity": "sha512-kIy0qhu7FAsShNTvuOx8uV+hf7mWk8OzJP5W9mjs1ovAIT1C9WqG1epkhexBfj4DAQfQ6E+m/oGtJ+CVsalspw==", + "license": "MIT", + "dependencies": { + "@google/generative-ai": "^0.24.0", + "uuid": "^11.1.0", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.55 <0.4.0" + } + }, + "node_modules/@langchain/google-genai/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@langchain/langgraph": { + "version": "0.2.74", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.2.74.tgz", + "integrity": "sha512-oHpEi5sTZTPaeZX1UnzfM2OAJ21QGQrwReTV6+QnX7h8nDCBzhtipAw1cK616S+X8zpcVOjgOtJuaJhXa4mN8w==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph-checkpoint": "~0.0.17", + "@langchain/langgraph-sdk": "~0.0.32", + "uuid": "^10.0.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.36 <0.3.0 || >=0.3.40 < 0.4.0", + "zod-to-json-schema": "^3.x" + }, + "peerDependenciesMeta": { + "zod-to-json-schema": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-checkpoint": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.0.18.tgz", + "integrity": "sha512-IS7zJj36VgY+4pf8ZjsVuUWef7oTwt1y9ylvwu0aLuOn1d0fg05Om9DLm3v2GZ2Df6bhLV1kfWAM0IAl9O5rQQ==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.31 <0.4.0" + } + }, + "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-sdk": { + "version": "0.0.78", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.78.tgz", + "integrity": "sha512-skkUDmEhClWzlsr8jRaS1VpXVBISm5OFd0MUtS1jKRL5pn08K+IJRvHnlzgum9x7Dste9KXGcIGVoR7cNKJQrw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.31 <0.4.0", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-swarm": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-swarm/-/langgraph-swarm-0.0.3.tgz", + "integrity": "sha512-6ctP1KGj344KXeY5c08LzvfayCWPA2I52pw7a6t4tcaQ3Y39h3aDvYl94wEqxv20KXIccdzvtAFX1ndxRBrP2Q==", + "license": "MIT", + "dependencies": { + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^0.3.40", + "@langchain/langgraph": "^0.2.53" + } + }, + "node_modules/@langchain/langgraph/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/openai": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.5.11.tgz", + "integrity": "sha512-DAp7x+NfjSqDvKVMle8yb85nzz+3ctP7zGJaeRS0vLmvkY9qf/jRkowsM0mcsIiEUKhG/AHzWqvxbhktb/jJ6Q==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "^4.96.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.48 <0.4.0" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.1.0.tgz", + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.21 <0.4.0" + } + }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", + "license": "BSD-2-Clause" + }, "node_modules/@netflix/nerror": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -2068,6 +2350,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2079,6 +2363,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -2086,6 +2372,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2187,6 +2475,8 @@ }, "node_modules/@npmcli/arborist/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/fs": { @@ -2224,10 +2514,14 @@ }, "node_modules/@npmcli/fs/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/git": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -2245,6 +2539,8 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -2275,6 +2571,8 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2288,6 +2586,8 @@ }, "node_modules/@npmcli/git/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/installed-package-contents": { @@ -2354,6 +2654,8 @@ }, "node_modules/@npmcli/metavuln-calculator": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", "license": "ISC", "dependencies": { "cacache": "^17.0.0", @@ -2397,10 +2699,14 @@ }, "node_modules/@npmcli/metavuln-calculator/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/name-from-folder": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2408,6 +2714,8 @@ }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2472,6 +2780,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "license": "ISC", "dependencies": { "which": "^3.0.0" @@ -2482,6 +2792,8 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2505,6 +2817,8 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", @@ -2519,6 +2833,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2842,6 +3158,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, "engines": { @@ -2869,10 +3187,14 @@ }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", "license": "ISC" }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "license": "MIT", "engines": { "node": ">= 10" @@ -2880,6 +3202,8 @@ }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2887,6 +3211,8 @@ }, "node_modules/@tufjs/models": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "license": "MIT", "dependencies": { "@tufjs/canonical-json": "1.0.0", @@ -2950,7 +3276,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/linkify-it": { @@ -2982,12 +3307,54 @@ "version": "24.2.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.1.tgz", "integrity": "sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.10.0" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/node-fetch/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -3001,8 +3368,16 @@ "integrity": "sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==", "dev": true }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, "node_modules/@ungap/custom-elements": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/custom-elements/-/custom-elements-1.3.0.tgz", + "integrity": "sha512-f4q/s76+8nOy+fhrNHyetuoPDR01lmlZB5czfCG+OOnBw/Wf+x48DcCDPmMQY7oL8xYFL8qfenMoiS8DUkKBUw==", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { @@ -3307,10 +3682,14 @@ }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, "node_modules/abort-controller": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -3321,6 +3700,8 @@ }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -3370,6 +3751,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -3392,6 +3775,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3417,6 +3802,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3466,10 +3853,14 @@ }, "node_modules/ansi": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "license": "MIT" }, "node_modules/ansi-escapes": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "license": "MIT", "engines": { "node": ">=4" @@ -3477,6 +3868,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3484,6 +3877,8 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -3494,6 +3889,8 @@ }, "node_modules/aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "license": "ISC" }, "node_modules/are-we-there-yet": { @@ -3527,6 +3924,8 @@ }, "node_modules/array-find-index": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3534,10 +3933,14 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -3545,6 +3948,8 @@ }, "node_modules/asn1": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" @@ -3552,6 +3957,8 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "license": "MIT", "engines": { "node": ">=0.8" @@ -3559,6 +3966,8 @@ }, "node_modules/async": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "license": "MIT", "dependencies": { "lodash": "^4.17.14" @@ -3566,10 +3975,14 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/atomically": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", "license": "MIT", "engines": { "node": ">=10.12.0" @@ -3615,10 +4028,14 @@ }, "node_modules/autosize": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-6.0.1.tgz", + "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==", "license": "MIT" }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "license": "Apache-2.0", "engines": { "node": "*" @@ -3754,10 +4171,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3776,6 +4197,8 @@ }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" @@ -3790,6 +4213,8 @@ }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { @@ -3821,6 +4246,8 @@ }, "node_modules/bin-links/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -3879,6 +4306,8 @@ }, "node_modules/bplist-parser": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -3888,9 +4317,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4001,6 +4430,8 @@ }, "node_modules/builtins/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/bytes": { @@ -4055,6 +4486,8 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -4093,13 +4526,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001733", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001733.tgz", @@ -4123,10 +4583,14 @@ }, "node_modules/caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "license": "Apache-2.0" }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -4139,6 +4603,8 @@ }, "node_modules/chalk/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4146,6 +4612,8 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/chevrotain": { @@ -4178,6 +4646,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -4193,6 +4663,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -4214,6 +4686,8 @@ }, "node_modules/cli-cursor": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" @@ -4224,6 +4698,8 @@ }, "node_modules/cli-width": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "license": "ISC" }, "node_modules/cliui": { @@ -4314,6 +4790,8 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -4321,10 +4799,14 @@ }, "node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", "bin": { "color-support": "bin.js" @@ -4345,6 +4827,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -4355,6 +4839,8 @@ }, "node_modules/common-ancestor-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "license": "ISC" }, "node_modules/compressible": { @@ -4387,6 +4873,8 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -4394,6 +4882,8 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/compression/node_modules/negotiator": { @@ -4427,10 +4917,14 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/conf": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", "license": "MIT", "dependencies": { "ajv": "^8.6.3", @@ -4453,6 +4947,8 @@ }, "node_modules/conf/node_modules/dot-prop": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -4489,10 +4985,14 @@ }, "node_modules/conf/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/configstore": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^5.2.0", @@ -4508,6 +5008,8 @@ }, "node_modules/configstore/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -4530,10 +5032,23 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, + "node_modules/console-table-printer": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.0.tgz", + "integrity": "sha512-zrY29NkhSoY9SxEynJVWk6zuuI2tGnlS00+Jx+EWkp6QTsyj8W/Zc20awiqVvPj73oP5kX6w5uDW9rle5IznYw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -4544,6 +5059,8 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4584,10 +5101,14 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, "node_modules/cordova": { "version": "12.0.0", + "resolved": "https://registry.npmjs.org/cordova/-/cordova-12.0.0.tgz", + "integrity": "sha512-D0gGDsaXlmafWxVZExJo6jO8AEVLYBe12Qghjx4zz8XfNhSUe3cInm4TyDZoxB2hFom73eLxIbomYOb0J6tutw==", "license": "Apache-2.0", "dependencies": { "configstore": "^5.0.1", @@ -4716,10 +5237,14 @@ }, "node_modules/cordova-app-hello-world": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", + "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==", "license": "Apache-2.0" }, "node_modules/cordova-clipboard": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz", + "integrity": "sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw==", "dev": true, "license": "MIT" }, @@ -4748,6 +5273,8 @@ }, "node_modules/cordova-create": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-5.0.0.tgz", + "integrity": "sha512-jFc+vbh6Xx2DciI0/RFzLOB0X7YOiiDv9kjDfoq+jqh+TRZDYOuES19F1ZkwgDTJGnwUO0HoMIswiiTy45Royw==", "license": "Apache-2.0", "dependencies": { "cordova-app-hello-world": "^6.0.0", @@ -4768,6 +5295,8 @@ }, "node_modules/cordova-create/node_modules/isobject": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4775,6 +5304,8 @@ }, "node_modules/cordova-fetch": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-4.0.0.tgz", + "integrity": "sha512-aymq5lEwv6Y1n+FYoeRK/fCsyrMP2CBh5lo2o8NUO4MG68ws2QC+C5Xwju9kezQzEatg+9Gg2wrw5kGI+nmhXA==", "license": "Apache-2.0", "dependencies": { "@npmcli/arborist": "^6.2.5", @@ -4805,6 +5336,8 @@ }, "node_modules/cordova-fetch/node_modules/pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "license": "MIT", "engines": { "node": ">=10" @@ -4828,6 +5361,8 @@ }, "node_modules/cordova-fetch/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4841,6 +5376,8 @@ }, "node_modules/cordova-fetch/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/cordova-lib": { @@ -4880,6 +5417,8 @@ }, "node_modules/cordova-lib/node_modules/pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "license": "MIT", "engines": { "node": ">=10" @@ -4913,6 +5452,8 @@ }, "node_modules/cordova-lib/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -4924,6 +5465,8 @@ }, "node_modules/cordova-lib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/cordova-plugin-advanced-http": { @@ -4949,6 +5492,8 @@ }, "node_modules/cordova-plugin-device": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.1.0.tgz", + "integrity": "sha512-FU0Lw1jZpuKOgG4v80LrfMAOIMCGfAVPumn7AwaX9S1iU/X3OPZUyoKUgP09q4bxL35IeNPkqNWVKYduAXZ1sg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5012,6 +5557,8 @@ }, "node_modules/cordova-serve": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.1.tgz", + "integrity": "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw==", "license": "Apache-2.0", "dependencies": { "chalk": "^3.0.0", @@ -5027,6 +5574,8 @@ }, "node_modules/cordova-serve/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -5040,6 +5589,8 @@ }, "node_modules/cordova-serve/node_modules/chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -5051,6 +5602,8 @@ }, "node_modules/cordova-serve/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -5061,10 +5614,14 @@ }, "node_modules/cordova-serve/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/cordova-serve/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -5072,6 +5629,8 @@ }, "node_modules/cordova-serve/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5080,6 +5639,23 @@ "node": ">=8" } }, + "node_modules/cordova-sqlite-storage": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-7.0.0.tgz", + "integrity": "sha512-BV1KCNtHnFD37ZQmhztStKsaNxniGlLcUSiQ9wieWH2PpZ0gH/tuWeINrrXGKIt9teTukYRnxFyerQ/Lc9x41A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cordova-sqlite-storage-dependencies": "5.0.0" + } + }, + "node_modules/cordova-sqlite-storage-dependencies": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-5.0.0.tgz", + "integrity": "sha512-WjWm1QX+2JyLxjaNmYX2kNzmhrRk8q6n4GQ1PkUc79xR2bmJeO/m3koSuPemnWJdLdlsqDz8dCEHmgQSxhYjcg==", + "dev": true, + "license": "MIT" + }, "node_modules/cordova/node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", @@ -5105,6 +5681,8 @@ }, "node_modules/cordova/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/core-js": { @@ -5146,6 +5724,8 @@ }, "node_modules/core-util-is": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cosmiconfig": { @@ -5194,6 +5774,8 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "license": "MIT", "engines": { "node": ">=8" @@ -5262,11 +5844,15 @@ }, "node_modules/css-loader/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -5277,6 +5863,8 @@ }, "node_modules/currently-unhandled": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" @@ -5287,6 +5875,8 @@ }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -5303,6 +5893,8 @@ }, "node_modules/debounce-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", "license": "MIT", "dependencies": { "mimic-fn": "^3.0.0" @@ -5316,6 +5908,8 @@ }, "node_modules/debounce-fn/node_modules/mimic-fn": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "license": "MIT", "engines": { "node": ">=8" @@ -5338,8 +5932,19 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dedent": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "license": "MIT" }, "node_modules/define-data-property": { @@ -5360,6 +5965,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -5367,19 +5974,27 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, "node_modules/dep-graph": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz", + "integrity": "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q==", "dependencies": { "underscore": "1.2.1" } }, "node_modules/dep-graph/node_modules/underscore": { - "version": "1.2.1" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz", + "integrity": "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA==" }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5396,6 +6011,8 @@ }, "node_modules/detect-indent": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "license": "MIT", "engines": { "node": ">=8" @@ -5417,6 +6034,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "license": "MIT", "engines": { "node": ">=8" @@ -5424,6 +6043,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -5503,6 +6124,8 @@ }, "node_modules/dot-prop": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -5511,12 +6134,30 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "license": "MIT", "dependencies": { "jsbn": "~0.1.0", @@ -5525,6 +6166,8 @@ }, "node_modules/editor": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==", "license": "MIT" }, "node_modules/ee-first": { @@ -5541,6 +6184,8 @@ }, "node_modules/elementtree": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" @@ -5551,10 +6196,14 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", "engines": { @@ -5571,6 +6220,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "license": "MIT", "optional": true, "dependencies": { @@ -5579,6 +6230,8 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -5586,6 +6239,8 @@ }, "node_modules/endent": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "license": "MIT", "dependencies": { "dedent": "^0.7.0", @@ -5620,6 +6275,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "license": "MIT", "engines": { "node": ">=6" @@ -5640,6 +6297,8 @@ }, "node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT" }, "node_modules/error-ex": { @@ -5652,12 +6311,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5675,22 +6332,51 @@ "dev": true, "license": "MIT" }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -5701,6 +6387,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5713,6 +6401,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5724,6 +6414,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5735,6 +6427,8 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5743,6 +6437,8 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5751,6 +6447,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5767,13 +6465,23 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -5781,6 +6489,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -5860,6 +6570,8 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5867,10 +6579,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -5889,10 +6605,14 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -5905,6 +6625,8 @@ }, "node_modules/external-editor/node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -5915,6 +6637,8 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -5925,6 +6649,8 @@ }, "node_modules/extsprintf": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", "engines": [ "node >=0.6.0" ], @@ -5932,6 +6658,8 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { @@ -5952,14 +6680,20 @@ }, "node_modules/fast-json-parse": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { @@ -5975,6 +6709,8 @@ }, "node_modules/figures": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -5985,6 +6721,8 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -6042,6 +6780,8 @@ }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -6088,6 +6828,8 @@ }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "license": "Apache-2.0", "engines": { "node": "*" @@ -6095,6 +6837,8 @@ }, "node_modules/form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -6105,6 +6849,12 @@ "node": ">= 0.12" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, "node_modules/form-data/node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -6117,8 +6867,23 @@ "node": ">= 0.6" } }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6171,6 +6936,8 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/function-bind": { @@ -6210,6 +6977,8 @@ }, "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": { @@ -6218,6 +6987,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -6236,15 +7007,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6253,8 +7030,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -6265,6 +7057,8 @@ }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -6272,6 +7066,8 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -6290,6 +7086,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6306,9 +7104,9 @@ "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -6317,6 +7115,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -6327,6 +7127,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -6345,17 +7147,20 @@ }, "node_modules/globby/node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6369,6 +7174,8 @@ }, "node_modules/har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "license": "ISC", "engines": { "node": ">=4" @@ -6376,6 +7183,8 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "license": "MIT", "dependencies": { "ajv": "^6.12.3", @@ -6387,6 +7196,8 @@ }, "node_modules/har-validator/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6401,10 +7212,14 @@ }, "node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" @@ -6421,10 +7236,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6432,10 +7248,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -6445,6 +7265,8 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "license": "ISC" }, "node_modules/hasown": { @@ -6458,6 +7280,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/hosted-git-info": { "version": "6.1.1", "license": "ISC", @@ -6470,6 +7301,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -6550,6 +7383,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "license": "MIT", "dependencies": { "@tootallnate/once": "2", @@ -6562,6 +7397,8 @@ }, "node_modules/http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -6575,6 +7412,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -6586,6 +7425,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -6593,6 +7434,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "dependencies": { "ms": "^2.0.0" @@ -6600,6 +7443,8 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "optional": true, "dependencies": { @@ -6611,6 +7456,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "license": "ISC", "engines": { @@ -6672,6 +7519,8 @@ }, "node_modules/immediate": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, "node_modules/immutable": { @@ -6715,6 +7564,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -6722,6 +7573,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -6729,6 +7582,8 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -6737,6 +7592,8 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/init-package-json": { @@ -6780,10 +7637,14 @@ }, "node_modules/init-package-json/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/inquirer": { "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "license": "MIT", "dependencies": { "ansi-escapes": "^3.2.0", @@ -6806,6 +7667,8 @@ }, "node_modules/inquirer/node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "license": "MIT", "engines": { "node": ">=6" @@ -6813,6 +7676,8 @@ }, "node_modules/inquirer/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "license": "MIT", "engines": { "node": ">=4" @@ -6820,6 +7685,8 @@ }, "node_modules/inquirer/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -6831,6 +7698,8 @@ }, "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "license": "MIT", "engines": { "node": ">=4" @@ -6838,6 +7707,8 @@ }, "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" @@ -6848,6 +7719,8 @@ }, "node_modules/inquirer/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" @@ -6858,6 +7731,8 @@ }, "node_modules/insight": { "version": "0.11.1", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", + "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", "license": "BSD-2-Clause", "dependencies": { "async": "^2.6.2", @@ -6876,6 +7751,8 @@ }, "node_modules/insight/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6889,6 +7766,8 @@ }, "node_modules/insight/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6903,6 +7782,8 @@ }, "node_modules/insight/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -6913,10 +7794,14 @@ }, "node_modules/insight/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/insight/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -6924,6 +7809,8 @@ }, "node_modules/insight/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6934,6 +7821,8 @@ }, "node_modules/interpret": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "license": "MIT", "engines": { @@ -6947,6 +7836,8 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -6975,6 +7866,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -6988,6 +7881,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6995,6 +7890,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -7002,6 +7899,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7012,6 +7911,8 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "license": "MIT" }, "node_modules/is-number": { @@ -7024,6 +7925,8 @@ }, "node_modules/is-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "license": "MIT", "engines": { "node": ">=8" @@ -7054,6 +7957,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -7064,10 +7969,14 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -7078,10 +7987,14 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { @@ -7096,6 +8009,8 @@ }, "node_modules/isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "license": "MIT" }, "node_modules/jackspeak": { @@ -7181,6 +8096,15 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" }, + "node_modules/js-tiktoken": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.20.tgz", + "integrity": "sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7192,7 +8116,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7202,6 +8125,8 @@ }, "node_modules/jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "license": "MIT" }, "node_modules/jsesc": { @@ -7262,23 +8187,33 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-schema-typed": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", "license": "BSD-2-Clause" }, "node_modules/json-stringify-nice": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7286,10 +8221,14 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -7301,6 +8240,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7311,13 +8252,26 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "engines": [ "node >= 0.2.0" ], "license": "MIT" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsprim": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "license": "MIT", "dependencies": { "assert-plus": "1.0.0", @@ -7331,6 +8285,8 @@ }, "node_modules/jsprim/node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ], @@ -7338,6 +8294,8 @@ }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", @@ -7360,12 +8318,241 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/langchain": { + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.3.27.tgz", + "integrity": "sha512-XfOuXetMSpkS11Mt6YJkDmvuSGTMPUsks5DJz4RCZ3y2dcbLkOe5kecjx2SWVJYqQIqcMMwsjsve3/ZjnRe7rQ==", + "license": "MIT", + "dependencies": { + "@langchain/openai": ">=0.1.0 <0.6.0", + "@langchain/textsplitters": ">=0.0.0 <0.2.0", + "js-tiktoken": "^1.0.12", + "js-yaml": "^4.1.0", + "jsonpointer": "^5.0.1", + "langsmith": "^0.3.29", + "openapi-types": "^12.1.3", + "p-retry": "4", + "uuid": "^10.0.0", + "yaml": "^2.2.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "peerDependencies": { + "@langchain/anthropic": "*", + "@langchain/aws": "*", + "@langchain/cerebras": "*", + "@langchain/cohere": "*", + "@langchain/core": ">=0.2.21 <0.4.0", + "@langchain/deepseek": "*", + "@langchain/google-genai": "*", + "@langchain/google-vertexai": "*", + "@langchain/google-vertexai-web": "*", + "@langchain/groq": "*", + "@langchain/mistralai": "*", + "@langchain/ollama": "*", + "@langchain/xai": "*", + "axios": "*", + "cheerio": "*", + "handlebars": "^4.7.8", + "peggy": "^3.0.2", + "typeorm": "*" + }, + "peerDependenciesMeta": { + "@langchain/anthropic": { + "optional": true + }, + "@langchain/aws": { + "optional": true + }, + "@langchain/cerebras": { + "optional": true + }, + "@langchain/cohere": { + "optional": true + }, + "@langchain/deepseek": { + "optional": true + }, + "@langchain/google-genai": { + "optional": true + }, + "@langchain/google-vertexai": { + "optional": true + }, + "@langchain/google-vertexai-web": { + "optional": true + }, + "@langchain/groq": { + "optional": true + }, + "@langchain/mistralai": { + "optional": true + }, + "@langchain/ollama": { + "optional": true + }, + "@langchain/xai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "peggy": { + "optional": true + }, + "typeorm": { + "optional": true + } + } + }, + "node_modules/langchain/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/langsmith": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.29.tgz", + "integrity": "sha512-JPF2B339qpYy9FyuY4Yz1aWYtgPlFc/a+VTj3L/JcFLHCiMP7+Ig8I9jO+o1QwVa+JU3iugL1RS0wwc+Glw0zA==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "openai": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } + } + }, + "node_modules/langsmith/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/langsmith/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/langsmith/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/langsmith/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/langsmith/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/langsmith/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/langsmith/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/langsmith/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/lie": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -7387,6 +8574,8 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -7395,6 +8584,8 @@ }, "node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -7408,6 +8599,8 @@ }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -7419,6 +8612,8 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { @@ -7430,14 +8625,20 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.zip": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "license": "MIT" }, "node_modules/loud-rejection": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", "license": "MIT", "dependencies": { "currently-unhandled": "^0.4.1", @@ -7459,6 +8660,8 @@ }, "node_modules/macos-release": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "license": "MIT", "engines": { "node": ">=6" @@ -7469,6 +8672,8 @@ }, "node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", @@ -7493,6 +8698,8 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -7549,8 +8756,19 @@ "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", "license": "ISC" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5-file": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", "license": "MIT", "bin": { "md5-file": "cli.js" @@ -7582,10 +8800,14 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -7593,6 +8815,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7624,6 +8848,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7652,6 +8878,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -7695,6 +8923,8 @@ }, "node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -7702,6 +8932,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7712,6 +8944,8 @@ }, "node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7722,6 +8956,8 @@ }, "node_modules/minipass-collect/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-fetch": { @@ -7741,6 +8977,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7751,6 +8989,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7761,6 +9001,8 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-json-stream": { @@ -7773,6 +9015,8 @@ }, "node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7783,10 +9027,14 @@ }, "node_modules/minipass-json-stream/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7797,6 +9045,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7807,10 +9057,14 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7821,6 +9075,8 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7831,10 +9087,14 @@ }, "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -7846,6 +9106,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7856,10 +9118,14 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -7885,6 +9151,8 @@ }, "node_modules/mustache": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", "license": "MIT", "bin": { "mustache": "bin/mustache" @@ -7892,6 +9160,8 @@ }, "node_modules/mute-stream": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "license": "ISC" }, "node_modules/nanoid": { @@ -7914,6 +9184,8 @@ }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7921,6 +9193,8 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, @@ -7932,6 +9206,46 @@ "license": "MIT", "optional": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp": { "version": "9.4.0", "license": "MIT", @@ -7957,6 +9271,8 @@ }, "node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "license": "ISC", "dependencies": { "delegates": "^1.0.0", @@ -7968,6 +9284,8 @@ }, "node_modules/node-gyp/node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -7995,6 +9313,8 @@ }, "node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "license": "ISC", "dependencies": { "abbrev": "^1.0.0" @@ -8008,6 +9328,8 @@ }, "node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", @@ -8021,6 +9343,8 @@ }, "node_modules/node-gyp/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8046,6 +9370,8 @@ }, "node_modules/node-gyp/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/node-releases": { @@ -8072,6 +9398,8 @@ }, "node_modules/nopt/node_modules/abbrev": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8079,6 +9407,8 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", @@ -8115,10 +9445,14 @@ }, "node_modules/normalize-package-data/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { @@ -8170,10 +9504,14 @@ }, "node_modules/npm-install-checks/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8181,6 +9519,8 @@ }, "node_modules/npm-package-arg": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", @@ -8217,10 +9557,14 @@ }, "node_modules/npm-package-arg/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-packlist": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" @@ -8267,10 +9611,14 @@ }, "node_modules/npm-pick-manifest/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-registry-fetch": { "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "license": "ISC", "dependencies": { "make-fetch-happen": "^11.0.0", @@ -8287,6 +9635,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -8297,6 +9647,8 @@ }, "node_modules/npmlog": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", "license": "ISC", "dependencies": { "are-we-there-yet": "^4.0.0", @@ -8310,6 +9662,8 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "license": "Apache-2.0", "engines": { "node": "*" @@ -8328,6 +9682,8 @@ }, "node_modules/objectorarray": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", "license": "ISC" }, "node_modules/on-finished": { @@ -8352,6 +9708,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -8359,6 +9717,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -8372,6 +9732,8 @@ }, "node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -8384,8 +9746,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.104.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", + "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.108", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.108.tgz", + "integrity": "sha512-JZv9uwGYYtfcsO7B99KszTlNhvrIWqsRy7Xjp5Hr7ZFj7DSlsxIi0zJfibe/1xtPn6kEEbfMjH2lbsubwa81pQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, "node_modules/os-name": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "license": "MIT", "dependencies": { "macos-release": "^2.5.0", @@ -8400,6 +9815,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8407,6 +9824,8 @@ }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", "engines": { "node": ">=4" @@ -8414,6 +9833,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -8427,6 +9848,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -8438,6 +9861,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -8449,8 +9874,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -8458,6 +9935,8 @@ }, "node_modules/pacote": { "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", @@ -8488,10 +9967,14 @@ }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -8502,6 +9985,8 @@ }, "node_modules/parse-conflict-json": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", @@ -8547,11 +10032,15 @@ }, "node_modules/path-browserify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -8560,6 +10049,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8567,10 +10058,14 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -8578,6 +10073,8 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { @@ -8608,6 +10105,8 @@ }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -8615,6 +10114,8 @@ }, "node_modules/performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "license": "MIT" }, "node_modules/picocolors": { @@ -8626,6 +10127,8 @@ }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8636,6 +10139,8 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", "engines": { "node": ">=6" @@ -8643,6 +10148,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8654,6 +10161,8 @@ }, "node_modules/pkg-up": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "license": "MIT", "dependencies": { "find-up": "^3.0.0" @@ -8664,6 +10173,8 @@ }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "license": "MIT", "dependencies": { "locate-path": "^3.0.0" @@ -8674,6 +10185,8 @@ }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "license": "MIT", "dependencies": { "p-locate": "^3.0.0", @@ -8685,6 +10198,8 @@ }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "license": "MIT", "dependencies": { "p-limit": "^2.0.0" @@ -8695,6 +10210,8 @@ }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "license": "MIT", "engines": { "node": ">=4" @@ -8800,6 +10317,8 @@ }, "node_modules/postcss-loader/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, @@ -8852,6 +10371,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "license": "ISC", "dependencies": { @@ -8877,6 +10398,8 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, @@ -8911,6 +10434,8 @@ }, "node_modules/proc-log": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8925,10 +10450,14 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/promise-all-reject-late": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8936,6 +10465,8 @@ }, "node_modules/promise-call-limit": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8943,10 +10474,14 @@ }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "license": "MIT", "dependencies": { "err-code": "^2.0.2", @@ -8978,6 +10513,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -9016,6 +10553,8 @@ }, "node_modules/q": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "license": "MIT", "engines": { "node": ">=0.6.0", @@ -9038,10 +10577,14 @@ }, "node_modules/querystringify": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -9103,6 +10646,8 @@ }, "node_modules/raw-loader": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, "license": "MIT", "dependencies": { @@ -9122,6 +10667,8 @@ }, "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -9137,6 +10684,8 @@ }, "node_modules/raw-loader/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -9145,6 +10694,8 @@ }, "node_modules/raw-loader/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -9177,6 +10728,8 @@ }, "node_modules/read-chunk": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", "license": "MIT", "dependencies": { "pify": "^4.0.1", @@ -9188,6 +10741,8 @@ }, "node_modules/read-cmd-shim": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -9195,6 +10750,8 @@ }, "node_modules/read-package-json": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "license": "ISC", "dependencies": { "glob": "^10.2.2", @@ -9208,6 +10765,8 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", @@ -9288,6 +10847,8 @@ }, "node_modules/rechoir": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9370,6 +10931,8 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -9411,6 +10974,8 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.6" @@ -9418,6 +10983,8 @@ }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", @@ -9429,6 +10996,8 @@ }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "license": "MIT", "bin": { "uuid": "bin/uuid" @@ -9436,6 +11005,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9443,6 +11014,8 @@ }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { @@ -9467,6 +11040,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -9478,6 +11053,8 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -9486,6 +11063,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -9493,6 +11072,8 @@ }, "node_modules/restore-cursor": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "dependencies": { "onetime": "^2.0.0", @@ -9504,6 +11085,8 @@ }, "node_modules/restore-cursor/node_modules/mimic-fn": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", "engines": { "node": ">=4" @@ -9511,6 +11094,8 @@ }, "node_modules/restore-cursor/node_modules/onetime": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" @@ -9521,6 +11106,8 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "license": "MIT", "engines": { "node": ">= 4" @@ -9536,6 +11123,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -9549,6 +11138,8 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9556,6 +11147,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -9577,6 +11170,8 @@ }, "node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -9587,10 +11182,14 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { @@ -9687,6 +11286,8 @@ }, "node_modules/sax": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "license": "ISC" }, "node_modules/schema-utils": { @@ -9711,6 +11312,8 @@ }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9786,6 +11389,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, "node_modules/set-function-length": { @@ -9806,6 +11411,8 @@ }, "node_modules/setimmediate": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/setprototypeof": { @@ -9828,6 +11435,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -9838,6 +11447,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -9862,6 +11473,8 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/sigstore": { @@ -9880,8 +11493,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/simple-wcswidth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", + "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -9902,6 +11523,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "license": "MIT", "dependencies": { "agent-base": "^6.0.2", @@ -9943,6 +11566,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -9955,6 +11580,8 @@ }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -10019,6 +11646,8 @@ }, "node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -10036,6 +11665,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -10049,6 +11680,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -10061,10 +11694,14 @@ }, "node_modules/stringify-package": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", "license": "ISC" }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -10076,6 +11713,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -10086,6 +11725,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "license": "MIT", "engines": { "node": ">=8" @@ -10093,6 +11734,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -10130,6 +11773,8 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -10140,6 +11785,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10199,6 +11846,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -10209,6 +11858,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -10219,6 +11870,8 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/terminal": { @@ -10296,6 +11949,8 @@ }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/tmp": { @@ -10342,13 +11997,23 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "license": "MIT", "engines": { "node": ">= 4.0.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/treeverse": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -10356,6 +12021,8 @@ }, "node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/tuf-js": { @@ -10372,6 +12039,8 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -10380,8 +12049,19 @@ "node": "*" } }, + "node_modules/turndown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", + "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", + "license": "MIT", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" + } + }, "node_modules/tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "license": "Unlicense" }, "node_modules/type-is": { @@ -10410,6 +12090,8 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" @@ -10424,7 +12106,6 @@ "version": "7.10.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -10473,6 +12154,8 @@ }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" @@ -10483,6 +12166,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -10493,6 +12178,8 @@ }, "node_modules/unique-string": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" @@ -10559,6 +12246,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -10566,6 +12255,8 @@ }, "node_modules/url-parse": { "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -10574,10 +12265,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -10585,6 +12280,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -10592,10 +12289,14 @@ }, "node_modules/valid-identifier": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/valid-identifier/-/valid-identifier-0.0.2.tgz", + "integrity": "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==", "license": "Apache-2.0" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", @@ -10623,6 +12324,8 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10630,6 +12333,8 @@ }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -10642,10 +12347,14 @@ }, "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "license": "MIT" }, "node_modules/walk-up-path": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "license": "ISC" }, "node_modules/watchpack": { @@ -10662,6 +12371,21 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/webpack": { "version": "5.101.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", @@ -10802,8 +12526,20 @@ "node": ">= 0.6" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -10817,6 +12553,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -10831,6 +12569,8 @@ }, "node_modules/windows-release": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "license": "MIT", "dependencies": { "execa": "^4.0.2" @@ -10844,6 +12584,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", @@ -10865,6 +12607,8 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -10878,6 +12622,8 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "license": "Apache-2.0", "engines": { "node": ">=8.12.0" @@ -10885,6 +12631,8 @@ }, "node_modules/with-open-file": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", "license": "MIT", "dependencies": { "p-finally": "^1.0.0", @@ -10915,6 +12663,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10930,6 +12680,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -10943,6 +12695,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -10953,6 +12707,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-regex": { @@ -11019,10 +12775,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -11033,6 +12793,8 @@ }, "node_modules/xdg-basedir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "license": "MIT", "engines": { "node": ">=8" @@ -11049,6 +12811,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -11061,6 +12825,18 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", @@ -11150,6 +12926,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.25.49", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.49.tgz", + "integrity": "sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "src/plugins/browser": { "name": "cordova-plugin-browser", "version": "1.0.0", diff --git a/package.json b/package.json index 741b987c6..2146195ea 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "cordova-plugin-advanced-http": { "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1" }, + "cordova-sqlite-storage": {}, "cordova-plugin-websocket": {}, "cordova-plugin-buildinfo": {}, "cordova-plugin-system": {}, @@ -79,6 +80,7 @@ "cordova-plugin-sftp": "file:src/plugins/sftp", "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", + "cordova-sqlite-storage": "^7.0.0", "css-loader": "^7.1.2", "mini-css-extract-plugin": "^2.9.3", "path-browserify": "^1.0.1", @@ -95,6 +97,11 @@ }, "dependencies": { "@deadlyjack/ajax": "^1.2.6", + "@langchain/core": "^0.3.57", + "@langchain/google-genai": "^0.2.10", + "@langchain/langgraph": "^0.2.74", + "@langchain/langgraph-checkpoint": "^0.0.18", + "@langchain/langgraph-swarm": "^0.0.3", "@ungap/custom-elements": "^1.3.0", "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", @@ -112,9 +119,11 @@ "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", "filesize": "^11.0.2", + "he": "^1.2.0", "html-tag-js": "^2.4.15", "js-base64": "^3.7.7", "jszip": "^3.10.1", + "langchain": "^0.3.27", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-footnote": "^4.0.0", @@ -124,9 +133,11 @@ "minimatch": "^10.0.3", "moment": "^2.30.1", "mustache": "^4.2.0", + "turndown": "^7.2.0", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", - "yargs": "^18.0.0" + "yargs": "^18.0.0", + "zod": "^3.25.47" }, "browserslist": "cover 100%,not android < 5" } \ No newline at end of file diff --git a/src/ace/commands.js b/src/ace/commands.js index 8f8f0047d..7fe18fbc3 100644 --- a/src/ace/commands.js +++ b/src/ace/commands.js @@ -309,6 +309,14 @@ const commands = [ }, readOnly: true, }, + { + name: "openAiAssistant", + description: "AI Assistant", + exec() { + acode.exec("open", "ai_assistant"); + }, + readOnly: true, + }, { name: "openFileExplorer", description: "File Explorer", diff --git a/src/lib/commands.js b/src/lib/commands.js index 8f70ba391..2f41b11f1 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -7,6 +7,7 @@ import prompt from "dialogs/prompt"; import select from "dialogs/select"; import actions from "handlers/quickTools"; import recents from "lib/recents"; +import AiAssistant from "pages/aiAssistant"; import FileBrowser from "pages/fileBrowser"; import plugins from "pages/plugins"; import Problems from "pages/problems/problems"; @@ -188,6 +189,10 @@ export default { FileBrowser(); break; + case "ai_assistant": + AiAssistant(); + break; + default: return; } diff --git a/src/pages/aiAssistant/agent/sessionManager.js b/src/pages/aiAssistant/agent/sessionManager.js new file mode 100644 index 000000000..cafbf246a --- /dev/null +++ b/src/pages/aiAssistant/agent/sessionManager.js @@ -0,0 +1,202 @@ +import { + isAIMessageChunk, + isToolMessage, + isToolMessageChunk, +} from "@langchain/core/messages"; + +function extractText(contentLike) { + if (!contentLike) return ""; + if (typeof contentLike === "string") return contentLike; + if (Array.isArray(contentLike)) { + return contentLike + .map((item) => { + if (!item) return ""; + if (typeof item === "string") return item; + if (typeof item === "object" && "text" in item) return item.text ?? ""; + if (typeof item === "object" && "content" in item) + return extractText(item.content); + return ""; + }) + .join(""); + } + if (typeof contentLike === "object" && "text" in contentLike) { + return contentLike.text ?? ""; + } + return ""; +} + +function ensureToolState(toolStates, toolCallId, defaults = {}) { + if (!toolStates.has(toolCallId)) { + toolStates.set(toolCallId, { + id: toolCallId, + name: defaults.name || "Tool", + argsBuffer: "", + argsObject: undefined, + output: "", + status: "running", + isNew: true, + stage: "start", + }); + } + const state = toolStates.get(toolCallId); + Object.assign(state, defaults); + return state; +} + +export function createSessionManager(agent) { + return { + async runTurn({ + conversationId, + userMessage, + signal, + assistantMessageId, + onStart, + onToken, + onToolEvent, + }) { + const toolStates = new Map(); + let accumulatedText = ""; + + const emitToolState = (state) => { + if (!onToolEvent) return; + state.parentMessageId = assistantMessageId; + onToolEvent({ + id: state.id, + name: state.name, + argsText: state.argsBuffer, + argsObject: state.argsObject, + output: state.output, + status: state.status, + stage: state.stage, + isNew: state.isNew, + parentMessageId: assistantMessageId, + }); + state.isNew = false; + }; + + try { + const stream = await agent.stream( + { messages: [userMessage] }, + { + streamMode: "messages", + signal, + configurable: { + thread_id: conversationId, + }, + }, + ); + + onStart?.(); + + for await (const event of stream) { + const payload = Array.isArray(event) ? event[0] : event; + if (!payload) continue; + + if (isToolMessageChunk(payload) || isToolMessage(payload)) { + const toolCallId = + payload.tool_call_id || payload.id || `tool_${toolStates.size}`; + const state = ensureToolState(toolStates, toolCallId); + const chunkText = extractText(payload.content ?? payload); + if (chunkText) { + state.output = `${state.output || ""}${chunkText}`; + } + if (payload.status) { + state.status = payload.status === "error" ? "error" : "success"; + } + state.stage = "output"; + emitToolState(state); + continue; + } + + if (isAIMessageChunk(payload)) { + const { tool_call_chunks: toolCallChunks, tool_calls: toolCalls } = + payload; + + if (Array.isArray(toolCallChunks) && toolCallChunks.length) { + for (const chunk of toolCallChunks) { + const toolCallId = + chunk.id || + chunk.tool_call_id || + chunk.name || + `tool_${toolStates.size}`; + const state = ensureToolState(toolStates, toolCallId, { + name: + chunk.name || toolStates.get(toolCallId)?.name || "Tool", + }); + if (chunk.args) { + state.argsBuffer = `${state.argsBuffer || ""}${chunk.args}`; + } + state.stage = "args-delta"; + emitToolState(state); + } + } + + if (Array.isArray(toolCalls) && toolCalls.length) { + for (const call of toolCalls) { + const toolCallId = + call.id || call.name || `tool_${toolStates.size}`; + const state = ensureToolState(toolStates, toolCallId, { + name: call.name || toolStates.get(toolCallId)?.name || "Tool", + }); + state.argsObject = call.args; + try { + state.argsBuffer = JSON.stringify(call.args, null, 2); + } catch (error) { + state.argsBuffer = String(call.args); + } + state.stage = "args-final"; + emitToolState(state); + } + } + } + + const chunkText = extractText(payload?.content ?? payload); + if (chunkText) { + accumulatedText += chunkText; + onToken?.({ + fullText: accumulatedText, + delta: chunkText, + }); + } + } + + const toolRuns = Array.from(toolStates.values()).map((state) => { + if (!state.status || state.status === "running") { + state.status = "success"; + } + state.stage = "complete"; + emitToolState(state); + return { + id: state.id, + name: state.name, + status: state.status, + argsText: state.argsBuffer, + argsObject: state.argsObject, + output: state.output, + timestamp: Date.now(), + parentMessageId: assistantMessageId, + }; + }); + + return { + content: accumulatedText, + toolRuns, + }; + } catch (error) { + if (toolStates.size) { + error.toolRuns = Array.from(toolStates.values()).map((state) => ({ + id: state.id, + name: state.name, + status: state.status, + argsText: state.argsBuffer, + argsObject: state.argsObject, + output: state.output, + timestamp: Date.now(), + parentMessageId: assistantMessageId, + })); + } + throw error; + } + }, + }; +} diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js new file mode 100644 index 000000000..c2d40e93e --- /dev/null +++ b/src/pages/aiAssistant/assistant.js @@ -0,0 +1,619 @@ +import { createReactAgent } from "@langchain/langgraph/prebuilt"; +import { ChatOpenAI } from "@langchain/openai"; +import confirm from "dialogs/confirm"; +import select from "dialogs/select"; +import Ref from "html-tag-js/ref"; +import EditorFile from "lib/editorFile"; +import { createSessionManager } from "./agent/sessionManager"; +import styles from "./assistant.m.scss"; +import { CordovaSqliteSaver } from "./memory"; +import { createChatStore } from "./state/chatStore"; +import { SYSTEM_PROMPT } from "./system_prompt"; +import { allTools } from "./tools"; +import { createMessageRenderer } from "./ui/messageRenderer"; + +const GEMINI_API_KEY = ""; // Replace + +export default function openAIAssistantPage() { + // References + const profileBtnRef = Ref(); + const historySidebarRef = Ref(); + const chatInputRef = Ref(); + const sendBtnRef = Ref(); + const messageContainerRef = Ref(); + const stopBtnRef = Ref(); + + let currentProfile = "ask"; + let currentController = null; + let aiTabInstance; + + const chatStore = createChatStore(); + + const messageRenderer = createMessageRenderer({ + messageContainerRef, + onUserEdit: handleEditMessage, + }); + + const agentCheckpointer = new CordovaSqliteSaver(); + const model = new ChatOpenAI({ + model: "openrouter/sonoma-sky-alpha", + apiKey: GEMINI_API_KEY, + streaming: true, + configuration: { + baseURL: "https://openrouter.ai/api/v1", + }, + }); + + const toolsArray = Object.values(allTools); + + const agent = createReactAgent({ + llm: model, + tools: toolsArray, + checkpointSaver: agentCheckpointer, + stateModifier: SYSTEM_PROMPT, + }); + + const sessionManager = createSessionManager(agent); + + function getActiveConversationId() { + return chatStore.getConversationId(); + } + + function handleProfileSwitch(profile, { updateStore = true } = {}) { + const iconEl = profileBtnRef.el?.querySelector("i:first-child"); + const textEl = profileBtnRef.el?.querySelector("span"); + + currentProfile = profile; + + if (iconEl && textEl) { + if (profile === "ask") { + iconEl.className = "icon help"; + textEl.textContent = "Ask"; + } else { + iconEl.className = "icon edit"; + textEl.textContent = "Write"; + } + } + + if (updateStore) { + void chatStore.setProfile(profile); + } + } + + async function showProfileMenu(e) { + e.preventDefault(); + const profile = await select("Select Profile", [ + { + value: "ask", + text: "Ask", + icon: "help", + }, + { + value: "write", + text: "Write", + icon: "edit", + }, + ]); + if (profile) handleProfileSwitch(profile); + } + + function toggleHistorySidebar() { + if (!historySidebarRef.el) return; + historySidebarRef.el.classList.toggle("hidden"); + } + + function handleChatInput() { + if (!chatInputRef.el) return; + const value = chatInputRef.el.value || ""; + if (sendBtnRef.el) { + sendBtnRef.el.disabled = value.trim().length === 0; + } + chatInputRef.el.style.height = "auto"; + chatInputRef.el.style.height = + Math.min(chatInputRef.el.scrollHeight, 120) + `px`; + } + + async function updateHistorySidebar() { + if (!historySidebarRef.el) return; + const conversations = await chatStore.listConversations(); + const historyItemsContainer = + historySidebarRef.el.querySelector(".chat-history"); + if (!historyItemsContainer) return; + + historyItemsContainer.innerHTML = ""; + const activeConversationId = getActiveConversationId(); + + conversations.forEach((conv) => { + const item = ( +
{ + if (conv.id !== activeConversationId) { + loadConversation(conv.id); + toggleHistorySidebar(); + } + }} + /> + ); + + const iconWrapper = ( +
+ +
+ ); + const textWrapper = ( +
{conv.title || "Untitled"}
+ ); + const deleteBtn = ( + + ); + + item.append(iconWrapper, textWrapper, deleteBtn); + historyItemsContainer.appendChild(item); + }); + } + + async function loadConversation(conversationId) { + currentController?.abort(); + currentController = null; + + messageRenderer.clearMessages(); + + if (conversationId) { + const loaded = await chatStore.loadConversation(conversationId); + if (loaded) { + currentProfile = chatStore.getProfile(); + handleProfileSwitch(currentProfile, { updateStore: false }); + + loaded.messages.forEach((msg) => { + if (msg.role === "tool") { + try { + const toolPayload = JSON.parse(msg.content); + const toolState = { + id: toolPayload.id || msg.id, + name: toolPayload.name, + status: toolPayload.status, + argsText: + typeof toolPayload.args === "string" + ? toolPayload.args + : undefined, + argsObject: + typeof toolPayload.args === "object" + ? toolPayload.args + : undefined, + output: toolPayload.output, + stage: "complete", + isNew: true, + parentMessageId: toolPayload.parentMessageId, + }; + messageRenderer.renderToolEvent(toolState, { + targetMessageId: toolPayload.parentMessageId, + fallbackToStandalone: true, + }); + } catch (error) { + console.error("Failed to parse tool message", error); + } + } else { + messageRenderer.renderMessage(msg); + } + }); + } + } + + if (!chatStore.getConversation()) { + await chatStore.startNewConversation(currentProfile); + } + + updateHistorySidebar(); + chatInputRef.el?.focus(); + } + + async function reloadOrCreateConversation(conversationId) { + if (conversationId) { + await loadConversation(conversationId); + return; + } + await chatStore.startNewConversation(currentProfile); + messageRenderer.clearMessages(); + updateHistorySidebar(); + chatInputRef.el?.focus(); + } + + async function handleSendBtn() { + const inputEl = chatInputRef.el; + if (!inputEl) return; + + const userInput = (inputEl.value || "").trim(); + if (!userInput) return; + + const userMessage = await chatStore.prepareMessage("user", userInput); + messageRenderer.renderMessage(userMessage, { renderMarkdown: false }); + + inputEl.value = ""; + handleChatInput(); + + messageRenderer.showLoadingIndicator(); + + const { isFirstUserMessage } = + await chatStore.commitUserMessage(userMessage); + + updateHistorySidebar(); + + const assistantMessageId = chatStore.generateMessageId(); + const assistantTimestamp = Date.now(); + const assistantMessage = await chatStore.prepareMessage("assistant", "", { + id: assistantMessageId, + timestamp: assistantTimestamp, + }); + + currentController = new AbortController(); + if (sendBtnRef.el) sendBtnRef.el.style.display = "none"; + if (stopBtnRef.el) stopBtnRef.el.style.display = "block"; + + let streamedContent = ""; + let assistantMessageRendered = false; + + try { + const result = await sessionManager.runTurn({ + conversationId: getActiveConversationId(), + userMessage: { role: "user", content: userInput }, + signal: currentController.signal, + assistantMessageId, + onStart: () => { + messageRenderer.removeLoadingIndicator(); + messageRenderer.renderAssistantPlaceholder(assistantMessage); + assistantMessageRendered = true; + }, + onToken: ({ fullText }) => { + streamedContent = fullText; + messageRenderer.updateAssistantStreaming( + assistantMessageId, + fullText, + { showCursor: true }, + ); + }, + onToolEvent: (toolState) => { + messageRenderer.renderToolEvent(toolState, { + targetMessageId: assistantMessageId, + }); + }, + }); + + streamedContent = result.content; + + messageRenderer.updateAssistantStreaming( + assistantMessageId, + streamedContent, + { showCursor: false }, + ); + + const finalTimestamp = Date.now(); + assistantMessage.content = streamedContent; + assistantMessage.timestamp = finalTimestamp; + messageRenderer.finalizeAssistantMessage( + assistantMessageId, + streamedContent, + finalTimestamp, + ); + + await chatStore.commitAssistantMessage(assistantMessage, { + wasError: false, + }); + + if (Array.isArray(result.toolRuns) && result.toolRuns.length) { + for (const toolRun of result.toolRuns) { + await chatStore.commitToolMessage(toolRun); + } + } + + updateHistorySidebar(); + } catch (error) { + messageRenderer.removeLoadingIndicator(); + + const isAbort = + error.name === "AbortError" || + (error.message && /abort/i.test(error.message)); + + const errorContent = isAbort + ? `Streaming cancelled by user.` + : `Error: ${error.message || "Unknown error."}`; + + if (!assistantMessageRendered) { + messageRenderer.renderAssistantPlaceholder(assistantMessage); + assistantMessageRendered = true; + } + + assistantMessage.content = `${streamedContent}${errorContent}`; + assistantMessage.timestamp = Date.now(); + messageRenderer.updateAssistantStreaming( + assistantMessageId, + assistantMessage.content, + ); + messageRenderer.finalizeAssistantMessage( + assistantMessageId, + assistantMessage.content, + assistantMessage.timestamp, + ); + + await chatStore.commitAssistantMessage(assistantMessage, { + wasError: !isAbort, + }); + + if (error.toolRuns) { + for (const toolRun of error.toolRuns) { + await chatStore.commitToolMessage(toolRun); + } + } + + updateHistorySidebar(); + } finally { + currentController = null; + if (sendBtnRef.el) sendBtnRef.el.style.display = "block"; + if (stopBtnRef.el) stopBtnRef.el.style.display = "none"; + handleChatInput(); + } + + if (isFirstUserMessage) { + updateHistorySidebar(); + } + } + + function handleStopBtn() { + if (currentController) { + currentController.abort(); + currentController = null; + if (stopBtnRef.el) stopBtnRef.el.style.display = "none"; + if (sendBtnRef.el) sendBtnRef.el.style.display = "block"; + } + } + + function handleEditMessage(message) { + if (!message || !messageContainerRef.el) return; + const messageEl = messageContainerRef.el.querySelector( + `#message-${message.id}`, + ); + if (!messageEl) return; + + const messageContent = messageEl.querySelector(".message-content"); + if (!messageContent) return; + + const editContainer =
; + + const textarea = ( + +
+ + +
+
+ + + ); + + (async () => { + try { + const conversations = await chatStore.listConversations(); + if (conversations.length > 0) { + await loadConversation(conversations[0].id); + } else { + await reloadOrCreateConversation(null); + } + } catch (error) { + console.error( + "Failed to initialize AI Assistant page or database:", + error, + ); + const errDiv = `
Failed to initialize AI Assistant: ${error.message}. Ensure SQLite plugin is functional.
`; + if (messageContainerRef.el) { + messageContainerRef.el.innerHTML = errDiv; + } else { + alert( + `Critical Error: AI Assistant failed to initialize. ${error.message}`, + ); + } + } + })(); + + const uri = "ai://assistant"; + const existingFile = window.editorManager.getFile(uri, "uri"); + if (existingFile) { + existingFile.makeActive(); + return; + } + + aiTabInstance = new EditorFile("AI Assistant", { + uri: uri, + type: "page", + tabIcon: "file file_type_assistant", + content: aiAssistantContainer, + render: true, + stylesheets: [styles], + hideQuickTools: true, + }); + + messageRenderer.setEditorInstance(aiTabInstance); +} diff --git a/src/pages/aiAssistant/assistant.m.scss b/src/pages/aiAssistant/assistant.m.scss new file mode 100644 index 000000000..52ff0c752 --- /dev/null +++ b/src/pages/aiAssistant/assistant.m.scss @@ -0,0 +1,1281 @@ +:root { + --blue-primary: #2374e1; + --blue-secondary: #1a5fbf; + --blue-tertiary: #0e3a7c; + --blue-quaternary: #0a2c5e; + --red-primary: #e63e3e; + --green-primary: #4caf50; + --yellow-primary: #ffc107; + --purple-primary: #9c27b0; +} + +.chat-container { + display: flex; + flex-direction: column; + height: 100%; + max-width: 100%; + margin: 0 auto; + overflow: hidden; + line-height: 1.5; + + .chat-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + background-color: var(--popup-background-color); + + .header-left, + .header-right { + display: flex; + align-items: center; + gap: 0.75rem; + + .separator { + width: 1px; + height: 1rem; + background-color: var(--border-color); + } + } + } + + .chat-main { + display: flex; + flex: 1; + overflow: hidden; + position: relative; + + .chat-sidebar { + width: 240px; + border-right: 1px solid var(--border-color); + background-color: var(--popup-background-color); + display: flex; + flex-direction: column; + transition: transform 0.3s ease; + position: absolute; + top: 0; + bottom: 0; + left: 0; + z-index: 10; + + .sidebar-header { + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + display: flex; + justify-content: space-between; + align-items: center; + + .sidebar-title { + font-size: 0.75rem; + font-weight: 500; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + } + } + + .chat-sidebar.hidden { + transform: translateX(-100%); + } + + .chat-history { + flex: 1; + overflow-y: auto; + padding: 0.5rem; + + .history-item { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + border-radius: 0.375rem; + cursor: pointer; + margin-bottom: 0.25rem; + transition: all 0.2s ease; + position: relative; + + &:hover { + background-color: color-mix( + in srgb, + var(--popup-background-color) 70%, + white + ); + } + &:hover .history-delete { + opacity: 1; + } + + &.active { + background-color: color-mix( + in srgb, + var(--popup-background-color) 70%, + white + ); + } + + .history-icon { + display: flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + + .history-text { + flex: 1; + font-size: 0.75rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .history-delete { + opacity: 0; + transition: all 0.2s ease; + margin-left: auto; + width: 1.25rem; + height: 1.25rem; + padding: 0; + color: color-mix( + in srgb, + var(--secondary-text-color) 70%, + transparent + ); + + &:hover { + color: var(--error-text-color); + background-color: rgba(229, 62, 62, 0.1); + } + } + } + } + + .messages-wrapper { + flex: 1; + margin-left: 0; + transition: margin-left 0.3s ease; + width: 100%; + } + + .messages-wrapper.with-sidebar { + margin-left: 240px; + width: calc(100% - 240px); + } + + .edit-container { + margin-top: 0.75rem; + padding: 0.75rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border-radius: 0.375rem; + border: 1px solid var(--border-color); + } + + .edit-textarea { + width: 100%; + min-height: 100px; + padding: 0.75rem; + background-color: var(--primary-color); + border: 1px solid var(--border-color); + border-radius: 0.375rem; + color: var(--primary-text-color); + font-size: 0.875rem; + resize: none; + transition: all 0.2s ease; + box-sizing: border-box; + + &:focus { + outline: none; + border-color: var(--active-color); + box-shadow: 0 0 0 2px rgba(35, 116, 225, 0.1); + } + } + + .edit-actions { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 0.75rem; + gap: 0.5rem; + } + + .edit-info { + font-size: 0.75rem; + color: color-mix(in srgb, var(--secondary-text-color) 70%, transparent); + } + + .edit-buttons { + display: flex; + gap: 0.5rem; + } + + .messages-container { + height: 100%; + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 0.1) transparent; + } + + .messages-container::-webkit-scrollbar { + width: 6px; + } + + .messages-container::-webkit-scrollbar-track { + background: transparent; + } + + .messages-container::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 10px; + } + + .messages-container::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.2); + } + + .message { + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--border-color); + user-select: text; + + *::selection { + background-color: color-mix( + in srgb, + var(--popup-background-color) 50%, + white + ); + color: var(--active-color); + } + } + + .message.user { + background-color: color-mix( + in srgb, + var(--primary-color) 45%, + transparent + ); + } + + .message.tool { + background-color: color-mix( + in srgb, + var(--popup-background-color) 35%, + transparent + ); + } + + .tool-card { + border-radius: 0.5rem; + border: 1px solid var(--border-color); + background-color: color-mix( + in srgb, + var(--popup-background-color) 10%, + transparent + ); + overflow: hidden; + } + + .assistant-tools { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin: 0.75rem 0 0.5rem; + } + + .assistant-tool { + border-radius: 0.5rem; + border: 1px solid color-mix( + in srgb, + var(--border-color) 80%, + transparent + ); + background-color: color-mix( + in srgb, + var(--popup-background-color) 15%, + transparent + ); + overflow: hidden; + } + + .assistant-tool__summary { + all: unset; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: 0.5rem 0.75rem; + cursor: pointer; + background: color-mix( + in srgb, + var(--popup-background-color) 25%, + transparent + ); + transition: background 0.15s ease; + } + + .assistant-tool__summary:hover { + background: color-mix( + in srgb, + var(--popup-background-color) 35%, + transparent + ); + } + + .assistant-tool__summary.expanded { + border-bottom: 1px solid var(--border-color); + } + + .assistant-tool__title { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.15rem; + max-width: 70%; + } + + .assistant-tool__name { + font-size: 0.8rem; + font-weight: 600; + color: var(--primary-text-color); + } + + .assistant-tool__preview { + font-size: 0.7rem; + color: color-mix(in srgb, var(--secondary-text-color) 85%, transparent); + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 100%; + opacity: 0; + transition: opacity 0.15s ease; + } + + .assistant-tool__preview.visible { + opacity: 1; + } + + .assistant-tool__status { + font-size: 0.7rem; + font-weight: 600; + padding: 0.2rem 0.5rem; + border-radius: 999px; + text-transform: uppercase; + letter-spacing: 0.05em; + background-color: color-mix( + in srgb, + var(--popup-background-color) 45%, + transparent + ); + } + + .assistant-tool__status.status-running { + color: var(--yellow-primary); + } + + .assistant-tool__status.status-success { + color: var(--green-primary); + } + + .assistant-tool__status.status-error { + color: var(--red-primary); + } + + .assistant-tool__caret { + font-size: 1rem; + color: color-mix(in srgb, var(--secondary-text-color) 80%, transparent); + margin-left: 0.5rem; + } + + .assistant-tool__body { + display: none; + padding: 0.75rem; + background: color-mix( + in srgb, + var(--popup-background-color) 15%, + transparent + ); + } + + .assistant-tool__body.visible { + display: block; + } + + .assistant-tool__section { + display: flex; + flex-direction: column; + gap: 0.25rem; + margin-bottom: 0.5rem; + } + + .assistant-tool__section:last-child { + margin-bottom: 0; + } + + .assistant-tool__section-title { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: color-mix( + in srgb, + var(--secondary-text-color) 80%, + transparent + ); + } + + .assistant-tool__section-content { + margin: 0; + padding: 0.5rem; + border-radius: 0.35rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 25%, + transparent + ); + font-size: 0.75rem; + max-height: 200px; + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + } + + .tool-card-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + border-bottom: 1px solid var(--border-color); + background-color: color-mix( + in srgb, + var(--popup-background-color) 30%, + transparent + ); + } + + .tool-card-title { + font-size: 0.8rem; + font-weight: 600; + display: flex; + align-items: center; + gap: 0.35rem; + color: var(--primary-text-color); + } + + .tool-status { + font-size: 0.7rem; + font-weight: 600; + padding: 0.2rem 0.5rem; + border-radius: 999px; + text-transform: uppercase; + letter-spacing: 0.04em; + background-color: color-mix( + in srgb, + var(--popup-background-color) 40%, + transparent + ); + } + + .tool-status.status-running { + color: var(--yellow-primary); + } + + .tool-status.status-success { + color: var(--green-primary); + } + + .tool-status.status-error { + color: var(--red-primary); + } + + .tool-card-body { + padding: 0.75rem; + display: grid; + gap: 0.75rem; + } + + .tool-section-title { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: color-mix( + in srgb, + var(--secondary-text-color) 80%, + transparent + ); + margin-bottom: 0.25rem; + } + + .tool-section-content { + margin: 0; + padding: 0.5rem; + border-radius: 0.4rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + font-size: 0.75rem; + max-height: 180px; + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + } + + .message-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; + } + + .message-sender { + display: inline-block; + font-size: 0.75rem; + font-weight: 500; + padding: 0.125rem 0.5rem; + border-radius: 0.25rem; + } + + .message-sender.ai { + background-color: var(--active-icon-color); + color: color-mix(in srgb, var(--active-color) 70%, transparent); + } + + .message-sender.user { + background-color: var(--popup-background-color); + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + + .message-actions { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .message-time { + font-size: 0.75rem; + color: color-mix(in srgb, var(--secondary-text-color) 70%, transparent); + margin-right: 0.25rem; + } + + .message-content { + font-size: 0.875rem; + line-height: 1.6; + } + + .message-content p { + margin-bottom: 0.75rem; + } + + .message-content p:last-child { + margin-bottom: 0; + } + + .message-content pre { + background-color: var(--popup-background-color); + border-radius: 0.375rem; + margin: 0.75rem 0; + overflow: hidden; + } + + .message-content code { + font-size: 0.75rem; + } + + .message-content p code { + background-color: var(--popup-background-color); + padding: 0.125rem 0.25rem; + border-radius: 0.25rem; + } + + .artifact { + margin: 0.75rem 0; + border: 1px solid var(--border-color); + border-radius: 0.375rem; + overflow: hidden; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .artifact-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + background-color: var(--popup-background-color); + border-bottom: 1px solid var(--border-color); + } + + .artifact-title { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--secondary-text-color); + } + + .artifact-content { + padding: 0.75rem; + font-size: 0.75rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + max-height: 300px; + overflow-y: auto; + } + + .artifact-content.collapsed { + display: none; + } + + .thinking-artifact .artifact-title svg { + color: var(--yellow-primary); + } + + .planning-artifact .artifact-title svg { + color: var(--blue-primary); + } + + .tool-artifact .artifact-title svg { + color: var(--green-primary); + } + + .network-artifact .artifact-title svg { + color: var(--purple-primary); + } + + .terminal-artifact .artifact-title svg { + color: var(--primary-text-color); + } + + .code-artifact .artifact-title svg { + color: var(--primary-text-color); + } + + .code-block { + margin: 0.75rem 0; + border-radius: 0.375rem; + overflow: hidden; + border: 1px solid var(--border-color); + } + + .code-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + background-color: var(--popup-background-color); + border-bottom: 1px solid var(--border-color); + } + + .code-language { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--secondary-text-color); + } + + .code-actions { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .code-content { + position: relative; + max-height: 150px; + overflow: hidden; + } + + .code-content.expanded { + max-height: none; + overflow-y: auto; + } + + .code-content:not(.expanded)::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 40px; + background: linear-gradient( + transparent, + color-mix(in srgb, var(--popup-background-color) 20%, transparent) + ); + pointer-events: none; + } + + .code-content pre { + margin: 0; + padding: 0.75rem; + } + .code-content pre code div { + background-color: inherit !important; + } + + .code-expand { + display: flex; + align-items: center; + justify-content: center; + padding: 0.25rem; + background-color: var(--popup-background-color); + border-top: 1px solid var(--border-color); + font-size: 0.75rem; + color: var(--secondary-text-color); + cursor: pointer; + } + + .code-expand:hover { + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .badge { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.125rem 0.375rem; + border-radius: 0.25rem; + font-size: 0.625rem; + font-weight: 500; + margin-right: 0.25rem; + word-break: break-word; + overflow-wrap: break-word; + white-space: normal; + } + + .badge-blue { + background-color: var(--blue-tertiary); + color: var(--blue-primary); + } + + .badge-green { + background-color: rgba(76, 175, 80, 0.2); + color: var(--green-primary); + } + + .badge-red { + background-color: rgba(229, 62, 62, 0.2); + color: var(--red-primary); + } + + .badge-yellow { + background-color: rgba(255, 193, 7, 0.2); + color: var(--yellow-primary); + } + + .badge-purple { + background-color: rgba(156, 39, 176, 0.2); + color: var(--purple-primary); + } + + /* Network request artifact */ + .network-request { + padding: 0.75rem; + } + + .network-url-input { + display: flex; + align-items: center; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + padding: 0.25rem 0.5rem; + margin-bottom: 0.75rem; + overflow: hidden; + } + + .network-url-input i { + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + margin-right: 0.5rem; + flex-shrink: 0; + } + + .network-url-input input { + flex: 1; + background: none; + border: none; + color: var(--primary-text-color); + font-size: 0.75rem; + padding: 0.25rem 0; + width: 100%; + } + + .network-url-input input:focus { + outline: none; + } + + .network-description { + margin-bottom: 0.75rem; + color: var(--secondary-text-color); + } + + .network-actions { + display: flex; + gap: 0.5rem; + } + + .network-status { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.75rem; + padding: 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + } + + .network-status.allowed { + background-color: rgba(76, 175, 80, 0.1); + color: var(--green-primary); + } + + .network-status.blocked { + background-color: rgba(229, 62, 62, 0.1); + color: var(--red-primary); + } + + .network-status.hidden { + display: none; + } + + /* Terminal artifact */ + .terminal-command-input { + display: flex; + align-items: center; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + padding: 0.25rem 0.5rem; + margin-bottom: 0.75rem; + overflow: hidden; + } + + .terminal-command-input span { + color: var(--green-primary); + margin-right: 0.5rem; + + font-size: 0.75rem; + } + + .terminal-command-input input { + flex: 1; + background: none; + border: none; + color: var(--primary-text-color); + + font-size: 0.75rem; + padding: 0.25rem 0; + } + + .terminal-command-input input:focus { + outline: none; + } + + .terminal-actions { + display: flex; + gap: 0.5rem; + margin-bottom: 0.75rem; + } + + .terminal-output { + font-size: 0.75rem; + white-space: pre-wrap; + padding: 0.75rem; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + max-height: 200px; + overflow-y: auto; + } + + .terminal-output.hidden { + display: none; + } + + .terminal-status { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.75rem; + padding: 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + } + + .terminal-status.success { + background-color: rgba(76, 175, 80, 0.1); + color: var(--green-primary); + } + + .terminal-status.error { + background-color: rgba(229, 62, 62, 0.1); + color: var(--red-primary); + } + + .terminal-status.running { + background-color: rgba(255, 193, 7, 0.1); + color: var(--yellow-primary); + } + + .terminal-status.hidden { + display: none; + } + + .file-badge { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + margin: 0.25rem 0; + background-color: var(--popup-background-color); + } + } + + .input-area { + /* padding: 1.5rem; */ + padding: 1rem; + background: var(--primary-color); + border-top: 1px solid var(--border-color); + + .input-container { + display: flex; + align-items: flex-end; + gap: 0.75rem; + background: transparent; + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 0.75rem; + + &:focus-within { + border-color: var(--active-color); + } + + .attach-btn { + width: 32px; + height: 32px; + border: none; + background: none; + cursor: pointer; + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); + transition: color 0.2s; + display: flex; + align-items: center; + justify-content: center; + &:hover { + color: var(--primary-text-color); + } + } + + .chat-input { + flex: 1; + min-height: 32px; + max-height: 120px; + border: none; + background: transparent; + resize: none; + font-family: inherit; + font-size: 0.95rem; + line-height: 1.5; + color: var(--primary-text-color); + outline: none; + &::placeholder { + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); + } + } + + .action-buttons { + display: flex; + gap: 0.5rem; + + .action-btn { + width: 32px; + height: 32px; + border: none; + border-radius: 6px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + } + + .stop-btn { + background: var(--error-text-color); + color: white; + display: none; + } + + .stop-btn:hover { + background: color-mix(in srgb, var(--error-text-color) 80%, white); + } + + .send-btn { + background: var(--button-background-color); + color: var(--button-text-color); + } + + .send-btn:hover { + background: var(--button-active-color); + } + + .send-btn:disabled { + background: var(--popup-background-color); + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); + cursor: not-allowed; + } + } + } + } + + .btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.25rem; + background: none; + border: none; + border-radius: 0.25rem; + color: var(--secondary-text-color); + cursor: pointer; + transition: all 0.2s ease; + } + + .btn:hover { + color: var(--primary-text-color); + background-color: rgba(255, 255, 255, 0.1); + } + + .btn:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + .btn-primary { + background-color: var(--button-background-color); + color: white; + } + + .btn-primary:hover { + background-color: var(--button-active-color); + color: white; + } + + .btn-outline { + border: 1px solid var(--border-color); + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .btn-sm { + height: 1.75rem; + padding: 0 0.5rem; + font-size: 0.75rem; + } + + .btn-icon { + width: 1.75rem; + height: 1.75rem; + padding: 0; + } + + .btn-text { + margin-left: 0.25rem; + } + + /* Profile switcher */ + .profile-switcher { + position: relative; + } + + .profile-button { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 0.5rem; + height: 2rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border: 1px solid var(--border-color); + border-radius: 0.375rem; + color: var(--primary-text-color); + font-size: 0.75rem; + cursor: pointer; + } + + /* Loading indicator */ + .ai_loading { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 0.75rem; + padding: 1rem 1.5rem; + min-height: auto; + color: var(--secondary-text-color); + font-size: 0.875rem; + border-bottom: 1px solid var(--border-color); + } + + .loading-dots { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .loading-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--active-color); + opacity: 0.6; + } + + .loading-dot:nth-child(1) { + animation: bounce_dot_loading 1.5s infinite; + } + + .loading-dot:nth-child(2) { + animation: bounce_dot_loading 1.5s infinite 0.3s; + } + + .loading-dot:nth-child(3) { + animation: bounce_dot_loading 1.5s infinite 0.6s; + } + + @keyframes bounce_dot_loading { + 0%, + 100% { + opacity: 0.4; + transform: scale(0.8); + } + 50% { + opacity: 1; + transform: scale(1); + } + } + + /* Settings modal */ + .modal-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 100; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease; + } + + .modal-backdrop.open { + opacity: 1; + pointer-events: auto; + } + + .modal { + width: 500px; + max-width: 90%; + background-color: var(--bg-secondary); + border-radius: 0.5rem; + border: 1px solid var(--border-color); + overflow: hidden; + transform: translateY(20px); + transition: transform 0.2s ease; + } + + .modal-backdrop.open .modal { + transform: translateY(0); + } + + .modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + border-bottom: 1px solid var(--border-color); + } + + .modal-title { + font-size: 1rem; + font-weight: 500; + } + + .modal-close { + background: none; + border: none; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + cursor: pointer; + } + + .modal-body { + padding: 1rem; + max-height: 70vh; + overflow-y: auto; + } + + .modal-section { + margin-bottom: 1.5rem; + } + + .modal-section-title { + font-size: 0.875rem; + font-weight: 500; + margin-bottom: 0.75rem; + color: var(--secondary-text-color); + } + + .modal-footer { + padding: 1rem; + border-top: 1px solid var(--border-color); + display: flex; + justify-content: flex-end; + gap: 0.5rem; + } + + /* Responsive styles */ + @media (max-width: 768px) { + .btn-text { + display: none; + } + + .header-left, + .header-right { + gap: 0.5rem; + } + + .message { + padding: 0.75rem 1rem; + } + + .chat-sidebar { + width: 100%; + } + + .messages-wrapper.with-sidebar { + margin-left: 0; + width: 100%; + } + } +} diff --git a/src/pages/aiAssistant/db.js b/src/pages/aiAssistant/db.js new file mode 100644 index 000000000..9abe23273 --- /dev/null +++ b/src/pages/aiAssistant/db.js @@ -0,0 +1,288 @@ +const DB_NAME = "AIAssistant.db"; +const DB_LOCATION = "default"; // 'default' location for cordova-sqlite-storage +let db = null; +// Helper to execute SQL and return a Promise +// This can be used by all other functions. +export function executeSqlAsync(transaction, sql, params = []) { + return new Promise((resolve, reject) => { + transaction.executeSql( + sql, + params, + (tx, resultSet) => resolve(resultSet), + (tx, error) => { + console.error( + "[DB EXEC SQL ERR]", + error.message, + "Query (first 100 chars):", + sql.substring(0, 100), + "Params:", + params, + ); + reject(error); // Reject with the SQLite error object + }, + ); + }); +} + +// Internal function to initialize tables on a given DB instance +async function initializeTables(dbInstance) { + return new Promise((resolve, reject) => { + dbInstance.transaction( + (tx) => { + tx.executeSql(` + CREATE TABLE IF NOT EXISTS conversations ( + id TEXT PRIMARY KEY, + title TEXT, + createdAt INTEGER, + lastModifiedAt INTEGER, + profile TEXT + ) + `); + tx.executeSql(` + CREATE TABLE IF NOT EXISTS messages ( + id TEXT PRIMARY KEY, + conversationId TEXT, + role TEXT, + content TEXT, + timestamp INTEGER, + FOREIGN KEY (conversationId) REFERENCES conversations(id) ON DELETE CASCADE + ) + `); + tx.executeSql(` + CREATE TABLE IF NOT EXISTS langgraph_checkpoints ( + thread_id TEXT NOT NULL, + checkpoint_ns TEXT NOT NULL DEFAULT '', + checkpoint_id TEXT NOT NULL, + parent_checkpoint_id TEXT, + checkpoint TEXT, + metadata TEXT, + updated_at INTEGER, + PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id) + ) + `); + tx.executeSql(` + CREATE TABLE IF NOT EXISTS writes ( + thread_id TEXT NOT NULL, + checkpoint_ns TEXT NOT NULL DEFAULT '', + checkpoint_id TEXT NOT NULL, + task_id TEXT NOT NULL, + idx INTEGER NOT NULL, + channel TEXT NOT NULL, + value TEXT, + PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id, task_id, idx, channel) + ) + `); + + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_messages_conversationId_timestamp ON messages (conversationId, timestamp ASC)`, + ); + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_conversations_lastModifiedAt ON conversations (lastModifiedAt DESC)`, + ); + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_lg_checkpoints_main ON langgraph_checkpoints (thread_id, checkpoint_ns, checkpoint_id DESC)`, + ); + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_writes_main ON writes (thread_id, checkpoint_ns, checkpoint_id, task_id, channel)`, + ); + }, + (transactionError) => { + console.error( + "[DB] Transaction error during table initialization:", + transactionError, + ); + reject(transactionError); + }, + () => { + resolve(); + }, + ); + }); +} + +// All exported DB functions should call this first. +async function ensureDbOpen() { + if (db) { + return db; // Return existing, already open connection + } + + return new Promise((resolve, reject) => { + if (!window.sqlitePlugin) { + const msg = + "[DB] SQLite plugin is not available. Ensure cordova-sqlite-storage is installed and deviceready has fired."; + console.error(msg); + return reject(new Error(msg)); + } + + // Open the database + const newlyOpenedDb = window.sqlitePlugin.openDatabase( + { + name: DB_NAME, + location: DB_LOCATION, + }, + async () => { + // Success opening DB + try { + await initializeTables(newlyOpenedDb); + db = newlyOpenedDb; + resolve(db); + } catch (initError) { + console.error( + "[DB] Error during table initialization after DB open:", + initError, + ); + reject(initError); + } + }, + (error) => { + // Error opening DB + console.error("[DB] Error opening SQLite DB:", JSON.stringify(error)); + reject(error); + }, + ); + }); +} + +export async function openDB() { + return ensureDbOpen(); +} + +// --- Conversation Functions --- +export async function addConversation(conversation) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.transaction((tx) => { + executeSqlAsync( + tx, + "INSERT INTO conversations (id, title, createdAt, lastModifiedAt, profile) VALUES (?, ?, ?, ?, ?)", + [ + conversation.id, + conversation.title, + conversation.createdAt, + conversation.lastModifiedAt, + conversation.profile, + ], + ) + .then(() => resolve(conversation.id)) // Resolve with the ID on successful insert + .catch(reject); // Propagate SQL execution error + }, reject); // Transaction error callback + }); +} + +export async function getConversation(id) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.readTransaction((tx) => { + // Use readTransaction for SELECT + executeSqlAsync(tx, "SELECT * FROM conversations WHERE id = ?", [id]) + .then((resultSet) => { + if (resultSet.rows.length > 0) { + resolve(resultSet.rows.item(0)); + } else { + resolve(null); // Not found + } + }) + .catch(reject); + }, reject); + }); +} + +export async function getAllConversations() { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.readTransaction((tx) => { + executeSqlAsync( + tx, + "SELECT * FROM conversations ORDER BY lastModifiedAt DESC", + [], + ) + .then((resultSet) => { + const conversations = []; + for (let i = 0; i < resultSet.rows.length; i++) { + conversations.push(resultSet.rows.item(i)); + } + resolve(conversations); + }) + .catch(reject); + }, reject); + }); +} + +export async function updateConversation(conversation) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.transaction((tx) => { + executeSqlAsync( + tx, + "UPDATE conversations SET title = ?, lastModifiedAt = ?, profile = ? WHERE id = ?", + [ + conversation.title, + conversation.lastModifiedAt, + conversation.profile, + conversation.id, + ], + ) + .then(() => resolve(conversation.id)) + .catch(reject); + }, reject); + }); +} + +export async function deleteConversation(conversationId) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.transaction((tx) => { + // CASCADE DELETE on messages table should handle associated messages + executeSqlAsync(tx, "DELETE FROM conversations WHERE id = ?", [ + conversationId, + ]) + .then(() => { + resolve(); + }) + .catch(reject); + }, reject); + }); +} + +// --- Message Functions --- +export async function addMessageToDB(message) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.transaction((tx) => { + executeSqlAsync( + tx, + "INSERT INTO messages (id, conversationId, role, content, timestamp) VALUES (?, ?, ?, ?, ?)", + [ + message.id, + message.conversationId, + message.role, + message.content, + message.timestamp, + ], + ) + .then(() => resolve(message.id)) + .catch(reject); + }, reject); + }); +} + +export async function getMessagesForConversation(conversationId) { + const currentDb = await ensureDbOpen(); + return new Promise((resolve, reject) => { + currentDb.readTransaction((tx) => { + executeSqlAsync( + tx, + "SELECT * FROM messages WHERE conversationId = ? ORDER BY timestamp ASC", + [conversationId], + ) + .then((resultSet) => { + const messages = []; + for (let i = 0; i < resultSet.rows.length; i++) { + messages.push(resultSet.rows.item(i)); + } + resolve(messages); + }) + .catch(reject); + }, reject); + }); +} diff --git a/src/pages/aiAssistant/index.js b/src/pages/aiAssistant/index.js new file mode 100644 index 000000000..d89a773bc --- /dev/null +++ b/src/pages/aiAssistant/index.js @@ -0,0 +1,8 @@ +//jshint ignore:start + +function AiAssistant() { + import(/* webpackChunkName: "aiAssistant" */ "./assistant").then((res) => { + res.default(); + }); +} +export default AiAssistant; diff --git a/src/pages/aiAssistant/memory.js b/src/pages/aiAssistant/memory.js new file mode 100644 index 000000000..c6992a30b --- /dev/null +++ b/src/pages/aiAssistant/memory.js @@ -0,0 +1,462 @@ +import { + BaseCheckpointSaver, + copyCheckpoint, + getCheckpointId, + TASKS, + WRITES_IDX_MAP, +} from "@langchain/langgraph-checkpoint"; +import { executeSqlAsync, openDB } from "./db"; + +const checkpointMetadataKeys = ["source", "step", "writes", "parents"]; +function validateKeys(keys) { + return keys; +} +const validCheckpointMetadataKeys = validateKeys(checkpointMetadataKeys); + +// Helper to convert Uint8Array or other forms to a UTF-8 string for DB storage +function ensureStringForDB(serializedData) { + if (typeof serializedData === "string") { + return serializedData; + } + if (serializedData instanceof Uint8Array) { + try { + return new TextDecoder().decode(serializedData); + } catch (e) { + console.error( + "TextDecoder failed for Uint8Array, falling back to JSON.stringify:", + e, + serializedData, + ); + return JSON.stringify(serializedData); // Last resort, might not be ideal + } + } + if ( + Array.isArray(serializedData) && + serializedData.every((n) => typeof n === "number") + ) { + try { + return String.fromCharCode(...serializedData); + } catch (e) { + console.error( + "String.fromCharCode failed, falling back to JSON.stringify:", + e, + ); + return JSON.stringify(serializedData); + } + } + if (serializedData === null || serializedData === undefined) { + return null; // Store actual nulls as null + } + // Last resort for other unexpected object types + return JSON.stringify(serializedData); +} + +export class CordovaSqliteSaver extends BaseCheckpointSaver { + constructor(serde) { + super(serde); + this.db = null; + this.isSetup = false; + } + + static async create(serde) { + const saver = new CordovaSqliteSaver(serde); + await saver.setup(); + return saver; + } + + async setup() { + if (this.isSetup) return; + this.db = await openDB(); + this.isSetup = true; + } + + _extractIds(config, methodName = "") { + const thread_id = config?.configurable?.thread_id; + const lookup_checkpoint_id = config?.configurable?.checkpoint_id; + + if ( + !thread_id && + (methodName === "put" || + methodName === "getTuple" || + methodName === "list") + ) { + console.error( + `${methodName}: thread_id is required in config. Config received:`, + JSON.stringify(config), + ); + throw new Error(`${methodName}: thread_id is required in config.`); + } + return { thread_id, lookup_checkpoint_id }; + } + + /** + * Retrieves a complete checkpoint tuple (checkpoint, config, metadata, pending writes, parent config) + * from the database for a given thread and optional specific checkpoint ID. + * @param {object} config - Configuration object, typically containing `thread_id` and optionally `checkpoint_id` and `checkpoint_ns`. + * @returns {Promise} A promise that resolves to the checkpoint tuple + * ({ checkpoint, config, metadata, parentConfig, pendingWrites }) or `undefined` if not found. + * @throws {Error} If a database error occurs during retrieval. + */ + async getTuple(config) { + if (!this.isSetup) await this.setup(); + + const { thread_id, lookup_checkpoint_id } = this._extractIds( + config, + "getTuple", + ); + + const fetchDataPromise = new Promise((resolveData, rejectData) => { + this.db.readTransaction( + (tx) => { + let mainSql = `SELECT checkpoint_id, parent_checkpoint_id, checkpoint, metadata + FROM langgraph_checkpoints WHERE thread_id = ? AND checkpoint_ns = ?`; + const mainParams = [ + thread_id, + config.configurable?.checkpoint_ns ?? "", + ]; + + if (lookup_checkpoint_id) { + mainSql += " AND checkpoint_id = ?"; + mainParams.push(lookup_checkpoint_id); + } else { + mainSql += " ORDER BY checkpoint_id DESC LIMIT 1"; + } + + tx.executeSql( + mainSql, + mainParams, + (tx_s1, mainResultSet) => { + if (mainResultSet.rows.length === 0) { + return rejectData({ name: "CheckpointNotFound" }); + } + const mainRowData = mainResultSet.rows.item(0); + const actual_checkpoint_id = mainRowData.checkpoint_id; + + const writesSql = `SELECT task_id, channel, value FROM writes + WHERE thread_id = ? AND checkpoint_ns = ? AND checkpoint_id = ?`; + tx.executeSql( + writesSql, + [ + thread_id, + config.configurable?.checkpoint_ns ?? "", + actual_checkpoint_id, + ], + (tx_s2, writesResultSet) => { + const pendingWritesData = []; + for (let i = 0; i < writesResultSet.rows.length; i++) { + pendingWritesData.push(writesResultSet.rows.item(i)); + } + + if (mainRowData.parent_checkpoint_id) { + const sendsSql = `SELECT value FROM writes + WHERE thread_id = ? AND checkpoint_ns = ? AND checkpoint_id = ? AND channel = ? + ORDER BY idx`; + tx.executeSql( + sendsSql, + [ + thread_id, + config.configurable?.checkpoint_ns ?? "", + mainRowData.parent_checkpoint_id, + TASKS, + ], + (tx_s3, sendsResultSet) => { + const pendingSendsData = []; + for (let i = 0; i < sendsResultSet.rows.length; i++) { + pendingSendsData.push(sendsResultSet.rows.item(i)); + } + resolveData({ + mainRowData, + pendingWritesData, + pendingSendsData, + }); + }, + (tx_e3, errorS3) => rejectData(errorS3), + ); + } else { + resolveData({ + mainRowData, + pendingWritesData, + pendingSendsData: [], + }); + } + }, + (tx_e2, errorW) => rejectData(errorW), + ); + }, + (tx_e1, errorM) => rejectData(errorM), + ); + }, + (transactionError) => rejectData(transactionError), + ); + }); + + try { + const { mainRowData, pendingWritesData, pendingSendsData } = + await fetchDataPromise; + + const deserializedCheckpointData = await this.serde.loadsTyped( + mainRowData.type ?? "json", + mainRowData.checkpoint, + ); + const deserializedMetadata = await this.serde.loadsTyped( + mainRowData.type ?? "json", + mainRowData.metadata, + ); + + const pendingWrites = await Promise.all( + pendingWritesData.map(async (write) => [ + write.task_id, + write.channel, + await this.serde.loadsTyped(write.type ?? "json", write.value), + ]), + ); + const pending_sends = await Promise.all( + pendingSendsData.map(async (send) => + this.serde.loadsTyped(send.type ?? "json", send.value), + ), + ); + + const checkpoint = { ...deserializedCheckpointData, pending_sends }; + const finalConfig = { + configurable: { + thread_id: thread_id, + checkpoint_ns: + mainRowData.checkpoint_ns || + (config.configurable?.checkpoint_ns ?? ""), + checkpoint_id: mainRowData.checkpoint_id, + }, + }; + return { + checkpoint, + config: finalConfig, + metadata: deserializedMetadata, + parentConfig: mainRowData.parent_checkpoint_id + ? { + configurable: { + thread_id: thread_id, + checkpoint_ns: + mainRowData.checkpoint_ns || + (config.configurable?.checkpoint_ns ?? ""), + checkpoint_id: mainRowData.parent_checkpoint_id, + }, + } + : undefined, + pendingWrites, + }; + } catch (error) { + /* ... (your existing catch block for CheckpointNotFound etc.) ... */ + if (error && error.name === "CheckpointNotFound") { + return undefined; + } + console.error( + `getTuple: Error after fetching data for thread ${thread_id}:`, + error, + ); + throw error; + } + } + + /** + * Stores a checkpoint and its metadata in the database. + * @param {object} config - Configuration including thread_id and optional checkpoint_ns/checkpoint_id. + * @param {object} checkpoint - The checkpoint object to save. + * @param {object} metadata - Metadata associated with the checkpoint. + * @returns {Promise} A promise resolving to an object with configurable details. + */ + async put(config, checkpoint, metadata) { + if (!this.isSetup) await this.setup(); + + const thread_id = config.configurable?.thread_id; + const checkpoint_ns = config.configurable?.checkpoint_ns ?? ""; + const parent_checkpoint_id = config.configurable?.checkpoint_id; + + if (!thread_id) { + throw new Error(`Missing "thread_id" in config for put.`); + } + if (!checkpoint.id) { + throw new Error(`Missing "id" in checkpoint object for put.`); + } + const new_checkpoint_id = checkpoint.id; + + const preparedCheckpoint = copyCheckpoint(checkpoint); + delete preparedCheckpoint.pending_sends; + + const [typeCp, rawSerializedCheckpoint] = + this.serde.dumpsTyped(preparedCheckpoint); + const [typeMd, rawSerializedMetadata] = this.serde.dumpsTyped(metadata); + + // Ensure strings for DB + const finalSerializedCheckpoint = ensureStringForDB( + rawSerializedCheckpoint, + ); + const finalSerializedMetadata = ensureStringForDB(rawSerializedMetadata); + + return new Promise((resolve, reject) => { + this.db.transaction((tx) => { + executeSqlAsync( + tx, + `INSERT OR REPLACE INTO langgraph_checkpoints (thread_id, checkpoint_ns, checkpoint_id, parent_checkpoint_id, checkpoint, metadata) + VALUES ( ?, ?, ?, ?, ?, ?)`, + [ + thread_id, + checkpoint_ns, + new_checkpoint_id, + parent_checkpoint_id, + finalSerializedCheckpoint, + finalSerializedMetadata, + ], + ) + .then(() => { + resolve({ + configurable: { + thread_id, + checkpoint_ns, + checkpoint_id: new_checkpoint_id, + }, + }); + }) + .catch(reject); // SQL errors + }, reject); // Transaction errors + }); + } + + /** + * Stores writes associated with a specific thread and checkpoint. + * @param {object} config - Configuration including thread_id, checkpoint_ns, and checkpoint_id. + * @param {Array<[string, any]>} writes - An array of [channel, value] tuples to store. + * @param {string} taskId - The ID of the task performing the writes. + * @returns {Promise} A promise that resolves when writes are stored. + */ + async putWrites(config, writes, taskId) { + if (!this.isSetup) await this.setup(); + + const thread_id = config.configurable?.thread_id; + const checkpoint_ns = config.configurable?.checkpoint_ns ?? ""; + const checkpoint_id = config.configurable?.checkpoint_id; + + if (!thread_id || !checkpoint_id) { + throw new Error( + "Missing thread_id or checkpoint_id in config for putWrites.", + ); + } + if (!writes || writes.length === 0) { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + this.db.transaction((tx) => { + const writePromises = writes.map((writeTuple, idx) => { + const channel = writeTuple[0]; + const value = writeTuple[1]; + const [type, rawSerializedValue] = this.serde.dumpsTyped(value); + const finalSerializedValue = ensureStringForDB(rawSerializedValue); // Ensure string + + return executeSqlAsync( + tx, + `INSERT OR REPLACE INTO writes (thread_id, checkpoint_ns, checkpoint_id, task_id, idx, channel, value) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + [ + thread_id, + checkpoint_ns, + checkpoint_id, + taskId, + WRITES_IDX_MAP[channel] || idx, + channel, + finalSerializedValue, + ], + ); + }); + + Promise.all(writePromises) + .then(() => resolve()) + .catch(reject); // Will catch first error from Promise.all + }, reject); // Transaction errors + }); + } + + /** + * Asynchronously lists checkpoints for a given thread. + * @param {object} config - Configuration object. + * @param {object} options - Options for listing (limit, before, filter). + * @yields {object} A checkpoint tuple. + */ + async *list(config, options) { + if (!this.isSetup) await this.setup(); + + const { limit, before, filter } = options ?? {}; + const thread_id = config.configurable?.thread_id; + const checkpoint_ns = config.configurable?.checkpoint_ns ?? ""; + + if (!thread_id) { + return; + } + + let checkpointIdRows = []; // To store { checkpoint_id: string } + try { + await new Promise((resolveOuter, rejectOuter) => { + this.db.readTransaction((tx) => { + let sql = `SELECT checkpoint_id FROM langgraph_checkpoints`; + + const params = []; + const whereClauses = ["thread_id = ?", "checkpoint_ns = ?"]; + params.push(thread_id, checkpoint_ns); + + if (before?.configurable?.checkpoint_id) { + whereClauses.push("checkpoint_id < ?"); + params.push(before.configurable.checkpoint_id); + } + if (filter && Object.keys(filter).length > 0) { + } + if (whereClauses.length > 0) { + sql += ` WHERE ${whereClauses.join(" AND ")}`; + } + sql += ` ORDER BY checkpoint_id DESC`; + if (limit) { + // This limit is applied before JS filtering, so fetch more if JS filtering is heavy + sql += ` LIMIT ${Number.parseInt(limit, 10) * (filter ? 5 : 1)}`; // Fetch more if filtering + } + + executeSqlAsync(tx, sql, params) + .then((resultSet) => { + for (let i = 0; i < resultSet.rows.length; i++) { + checkpointIdRows.push(resultSet.rows.item(i)); + } + resolveOuter(); + }) + .catch(rejectOuter); + }, rejectOuter); + }); + + let yieldedCount = 0; + for (const idRow of checkpointIdRows) { + const tupleConfig = { + configurable: { + thread_id, + checkpoint_ns, + checkpoint_id: idRow.checkpoint_id, + }, + }; + const fullTuple = await this.getTuple(tupleConfig); + if (fullTuple) { + if ( + filter && + fullTuple.metadata && + !Object.entries(filter).every( + ([key, value]) => fullTuple.metadata[key] === value, + ) + ) { + continue; // Skip if JS filter doesn't match + } + yield fullTuple; + yieldedCount++; + if (limit !== undefined && yieldedCount >= limit) break; + } + } + } catch (error) { + console.error( + `list: Error fetching/processing for thread ${thread_id}:`, + error, + ); + } + } +} diff --git a/src/pages/aiAssistant/state/chatStore.js b/src/pages/aiAssistant/state/chatStore.js new file mode 100644 index 000000000..961f01de2 --- /dev/null +++ b/src/pages/aiAssistant/state/chatStore.js @@ -0,0 +1,198 @@ +import { + addConversation, + addMessageToDB, + deleteConversation, + getAllConversations, + getConversation as getConversationById, + getMessagesForConversation, + updateConversation, +} from "../db"; + +function createConversationId() { + return `conv_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`; +} + +export function createChatStore() { + let currentConversation = null; + let currentConversationId = null; + let currentProfile = "ask"; + let chatHistory = []; + let messageCounter = 0; + + const getCurrentConversation = () => currentConversation; + const getConversationId = () => currentConversationId; + const getProfile = () => currentProfile; + const getHistory = () => [...chatHistory]; + + const generateMessageId = () => `msg_${Date.now()}_${++messageCounter}`; + + async function listConversations() { + return getAllConversations(); + } + + async function ensureConversation() { + if (currentConversation) return currentConversation; + return startNewConversation(currentProfile); + } + + async function startNewConversation(profile = currentProfile) { + const now = Date.now(); + currentConversationId = createConversationId(); + currentConversation = { + id: currentConversationId, + title: "New Chat", + createdAt: now, + lastModifiedAt: now, + profile: profile, + }; + currentProfile = profile; + chatHistory = []; + messageCounter = 0; + await addConversation(currentConversation); + return currentConversation; + } + + async function loadConversation(conversationId) { + const conversation = await getConversationById(conversationId); + if (!conversation) return null; + + const messages = await getMessagesForConversation(conversationId); + + currentConversation = conversation; + currentConversationId = conversation.id; + currentProfile = conversation.profile || currentProfile; + chatHistory = messages.map((msg) => ({ + id: msg.id, + role: msg.role, + content: msg.content, + timestamp: msg.timestamp, + })); + messageCounter = 0; + + return { conversation, messages }; + } + + async function setProfile(profile) { + currentProfile = profile; + if (currentConversation) { + currentConversation.profile = profile; + await updateConversation(currentConversation); + } + } + + async function deleteConversationById(conversationId) { + await deleteConversation(conversationId); + if (conversationId === currentConversationId) { + currentConversation = null; + currentConversationId = null; + chatHistory = []; + } + } + + async function prepareMessage(role, content = "", overrides = {}) { + await ensureConversation(); + return { + id: overrides.id || generateMessageId(), + conversationId: currentConversationId, + role, + content, + timestamp: overrides.timestamp || Date.now(), + ...overrides, + }; + } + + async function commitUserMessage(message) { + if (!currentConversation) { + throw new Error("Cannot save user message without active conversation."); + } + + const isFirstUserMessage = + chatHistory.findIndex((msg) => msg.role === "user") === -1; + + if (isFirstUserMessage && currentConversation.title === "New Chat") { + const trimmed = message.content.trim(); + currentConversation.title = + trimmed.substring(0, 30) + (trimmed.length > 30 ? "..." : ""); + } + + currentConversation.lastModifiedAt = message.timestamp; + await addMessageToDB(message); + await updateConversation(currentConversation); + + chatHistory.push({ + id: message.id, + role: message.role, + content: message.content, + timestamp: message.timestamp, + }); + + return { isFirstUserMessage }; + } + + async function commitAssistantMessage(message, { wasError = false } = {}) { + if (!currentConversation) { + throw new Error( + "Cannot save assistant message without active conversation.", + ); + } + + currentConversation.lastModifiedAt = message.timestamp; + await addMessageToDB(message); + await updateConversation(currentConversation); + + if (!wasError) { + chatHistory.push({ + id: message.id, + role: message.role, + content: message.content, + timestamp: message.timestamp, + }); + } + } + + async function commitToolMessage(toolRun) { + if (!currentConversation) return; + + const messageId = toolRun.id || generateMessageId(); + const payload = { + id: toolRun.id || messageId, + name: toolRun.name, + status: toolRun.status, + args: toolRun.argsObject ?? toolRun.argsText ?? null, + output: toolRun.output ?? "", + parentMessageId: toolRun.parentMessageId ?? null, + }; + const message = { + id: messageId, + conversationId: currentConversationId, + role: "tool", + content: JSON.stringify(payload), + timestamp: toolRun.timestamp || Date.now(), + }; + + await addMessageToDB(message); + chatHistory.push({ + id: message.id, + role: message.role, + content: message.content, + timestamp: message.timestamp, + }); + } + + return { + getConversation: getCurrentConversation, + getConversationId, + getProfile, + getHistory, + listConversations, + loadConversation, + startNewConversation, + setProfile, + deleteConversationById, + prepareMessage, + commitUserMessage, + commitAssistantMessage, + commitToolMessage, + generateMessageId, + }; +} diff --git a/src/pages/aiAssistant/system_prompt.js b/src/pages/aiAssistant/system_prompt.js new file mode 100644 index 000000000..d69de6004 --- /dev/null +++ b/src/pages/aiAssistant/system_prompt.js @@ -0,0 +1,34 @@ +import { addedFolder } from "lib/openFolder"; + +export const SYSTEM_PROMPT = `You are a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. + +## Communication + +1. Be conversational but professional. +2. Refer to the user in the second person and yourself in the first person. +3. Format your responses in markdown. Use backticks to format file, directory, function, and class names. +4. NEVER lie or make things up. +5. Refrain from apologizing all the time when results are unexpected. Instead, just try your best to proceed or explain the circumstances to the user without apologizing. + +## Fixing Diagnostics + +1. Make 1-2 attempts at fixing diagnostics, then defer to the user. +2. Never simplify code you've written just to solve diagnostics. Complete, mostly correct code is more valuable than perfect code that doesn't solve the problem. + +## Debugging Guidelines + +When debugging, only make code changes if you are certain that you can solve the problem. +Otherwise, follow debugging best practices: +1. Address the root cause instead of the symptoms. +2. Add descriptive logging statements and error messages to track variable and code state. +3. Add test functions and statements to isolate the problem. + +## Calling External APIs + +1. Unless explicitly requested by the user, use the best suited external APIs and packages to solve the task. There is no need to ask the user for permission. +2. When selecting which version of an API or package to use, choose one that is compatible with the user's dependency management file(s). If no such file exists or if the package is not present, use the latest version that is in your training data. +3. If an external API requires an API Key, be sure to point this out to the user. Adhere to best security practices (e.g. DO NOT hardcode an API key in a place where it can be exposed) + +SideBar workspace projects(name, absolutePath or url): +${addedFolder.map((node) => `name: ${node.title}\nurl: ${node.url}`).join("\n")} +`; diff --git a/src/pages/aiAssistant/tools/createDir.js b/src/pages/aiAssistant/tools/createDir.js new file mode 100644 index 000000000..ed5fc74d9 --- /dev/null +++ b/src/pages/aiAssistant/tools/createDir.js @@ -0,0 +1,130 @@ +import fsOperation from "fileSystem"; +import { StructuredTool } from "@langchain/core/tools"; +import { addedFolder } from "lib/openFolder"; +import { z } from "zod"; + +/** + * Tool for creating directories in Acode + */ +class CreateDirTool extends StructuredTool { + name = "createDir"; + description = + "Creates a new directory at the specified path within the project. Returns confirmation that the directory was created. This tool creates a directory and all necessary parent directories (similar to `mkdir -p`). It should be used whenever you need to create new directories within the project."; + schema = z.object({ + path: z + .string() + .describe( + "The relative path of the directory to create. This path should never be absolute, and the first component of the path should always be a root directory in a project (opened in sidebar). For example, if root directories are 'directory1' and 'directory2', to create 'newdir' in 'directory1', use 'directory1/newdir'. To create nested directories like 'directory1/foo/bar', use 'directory1/foo/bar'.", + ), + }); + + /** + * Check if a URI is a SAF URI + */ + isSafUri(uri) { + return uri.startsWith("content://") && uri.includes("/tree/"); + } + + /** + * Check if SAF URI already has the :: separator (complete format) + */ + isCompleteSafUri(uri) { + return this.isSafUri(uri) && uri.includes("::"); + } + + /** + * Construct SAF URI for directory access + */ + constructSafDirUri(baseUri, dirPath) { + // For incomplete SAF URIs (without ::), construct the full format + // baseUri::primary:fullDirPath + return `${baseUri}::primary:${dirPath}`; + } + + /** + * Check if directory exists + */ + async directoryExists(dirUrl) { + try { + const stat = await fsOperation(dirUrl).stat(); + return stat.isDirectory; + } catch (error) { + return false; + } + } + + async _call({ path }) { + try { + // Split the path to get project name and directory path + const pathParts = path.split("/"); + const projectName = pathParts[0]; + const dirPath = pathParts.slice(1).join("/"); + + // Find the project in addedFolder array + const project = addedFolder.find( + (folder) => folder.title === projectName, + ); + if (!project) { + return `Error: Project '${projectName}' not found in opened projects`; + } + + let dirUrl; + + // Check if this is a SAF URI + if (this.isSafUri(project.url)) { + if (this.isCompleteSafUri(project.url)) { + // SAF URI already has :: separator, just append the directory path normally + // Handle both cases: with trailing slash or without + const baseUrl = project.url.endsWith("/") + ? project.url + : project.url + "/"; + dirUrl = baseUrl + dirPath; + } else { + // SAF URI without :: separator, use the special format + dirUrl = this.constructSafDirUri(project.url, path); + } + } else { + // For regular file URIs, use the normal path concatenation + dirUrl = project.url + "/" + dirPath; + } + + // Check if directory already exists + const exists = await this.directoryExists(dirUrl); + if (exists) { + return `Directory '${path}' already exists.`; + } + + // Create the directory using createDirectory method + // Extract parent directory URL and directory name + const dirName = dirPath.split("/").pop(); + const parentPath = pathParts.slice(1, -1).join("/"); + + let parentUrl; + if (this.isSafUri(project.url)) { + if (this.isCompleteSafUri(project.url)) { + const baseUrl = project.url.endsWith("/") + ? project.url + : project.url + "/"; + parentUrl = parentPath ? baseUrl + parentPath : project.url; + } else { + parentUrl = parentPath + ? this.constructSafDirUri( + project.url, + projectName + "/" + parentPath, + ) + : project.url; + } + } else { + parentUrl = parentPath ? project.url + "/" + parentPath : project.url; + } + + await fsOperation(parentUrl).createDirectory(dirName); + + return `Directory '${path}' has been successfully created.`; + } catch (error) { + return `Error creating directory: ${error.message}`; + } + } +} + +export const createDir = new CreateDirTool(); diff --git a/src/pages/aiAssistant/tools/editFile.js b/src/pages/aiAssistant/tools/editFile.js new file mode 100644 index 000000000..e5a73270c --- /dev/null +++ b/src/pages/aiAssistant/tools/editFile.js @@ -0,0 +1,251 @@ +import fsOperation from "fileSystem"; +import { StructuredTool } from "@langchain/core/tools"; +import { addedFolder } from "lib/openFolder"; +import { z } from "zod"; + +/** + * Tool for creating a new file or editing an existing file in Acode + */ +class EditFileTool extends StructuredTool { + name = "editFile"; + description = + "This is a tool for creating a new file or editing an existing file. For moving or renaming files, you should generally use the `terminal` tool with the 'mv' command instead."; + schema = z.object({ + path: z + .string() + .describe( + "The relative path of the file to edit or create. This path should never be absolute, and the first component of the path should always be a root directory in a project (opened in sidebar). For example, if root directories are 'directory1' and 'directory2', to edit 'file.txt' in 'directory1', use 'directory1/file.txt'. To edit 'file.txt' in 'directory2', use 'directory2/file.txt'.", + ), + mode: z + .enum(["edit", "create", "overwrite"]) + .describe( + "The mode of operation on the file. Possible values: 'edit' - Make granular edits to an existing file (requires oldString and newString), 'create' - Create a new file if it doesn't exist, 'overwrite' - Replace the entire contents of an existing file. When a file already exists, prefer editing it as opposed to recreating it from scratch.", + ), + content: z + .string() + .optional() + .describe( + "The content to write to the file. Required for 'create' and 'overwrite' modes.", + ), + oldString: z + .string() + .optional() + .describe( + "The text to replace (required for 'edit' mode). Must match exactly including whitespace. Can be empty string to insert text at the beginning of newString location.", + ), + newString: z + .string() + .optional() + .describe( + "The replacement text (required for 'edit' mode). Can be empty string to delete the oldString.", + ), + replaceAll: z + .boolean() + .optional() + .describe( + "If true, replace all occurrences of oldString. If false (default), replace only the first occurrence.", + ), + }); + + /** + * Check if a URI is a SAF URI + */ + isSafUri(uri) { + return uri.startsWith("content://") && uri.includes("/tree/"); + } + + /** + * Check if SAF URI already has the :: separator (complete format) + */ + isCompleteSafUri(uri) { + return this.isSafUri(uri) && uri.includes("::"); + } + + /** + * Construct SAF URI for file access + */ + constructSafFileUri(baseUri, filePath) { + // For incomplete SAF URIs (without ::), construct the full format + // baseUri::primary:fullFilePath + return `${baseUri}::primary:${filePath}`; + } + + /** + * Check if file exists + */ + async fileExists(fileUrl) { + try { + const stat = await fsOperation(fileUrl).stat(); + return stat.isFile; + } catch (error) { + return false; + } + } + + async _call({ + path, + mode, + content, + oldString, + newString, + replaceAll = false, + }) { + try { + // Validate inputs based on mode + if (mode === "edit") { + if (oldString === undefined || newString === undefined) { + return `Error: 'edit' mode requires both 'oldString' and 'newString' parameters.`; + } + } else if (mode === "create" || mode === "overwrite") { + if (content === undefined) { + return `Error: '${mode}' mode requires 'content' parameter.`; + } + } + + // Split the path to get project name and file path + const pathParts = path.split("/"); + const projectName = pathParts[0]; + const filePath = pathParts.slice(1).join("/"); + + // Find the project in addedFolder array + const project = addedFolder.find( + (folder) => folder.title === projectName, + ); + if (!project) { + return `Error: Project '${projectName}' not found in opened projects`; + } + + let fileUrl; + + // Check if this is a SAF URI + if (this.isSafUri(project.url)) { + if (this.isCompleteSafUri(project.url)) { + // SAF URI already has :: separator, just append the file path normally + // Handle both cases: with trailing slash or without + const baseUrl = project.url.endsWith("/") + ? project.url + : project.url + "/"; + fileUrl = baseUrl + filePath; + } else { + // SAF URI without :: separator, use the special format + fileUrl = this.constructSafFileUri(project.url, path); + } + } else { + // For regular file URIs, use the normal path concatenation + fileUrl = project.url + "/" + filePath; + } + + // Check if file exists + const exists = await this.fileExists(fileUrl); + + // Handle different modes + switch (mode) { + case "create": + if (exists) { + return `Error: File '${path}' already exists. Use 'edit' or 'overwrite' mode instead.`; + } + // For creating files, we need to use createFile method + // Extract directory URL and filename + const fileName = filePath.split("/").pop(); + const dirPath = pathParts.slice(1, -1).join("/"); + + let dirUrl; + if (this.isSafUri(project.url)) { + if (this.isCompleteSafUri(project.url)) { + const baseUrl = project.url.endsWith("/") + ? project.url + : project.url + "/"; + dirUrl = dirPath ? baseUrl + dirPath : project.url; + } else { + dirUrl = dirPath + ? this.constructSafFileUri( + project.url, + projectName + "/" + dirPath, + ) + : project.url; + } + } else { + dirUrl = dirPath ? project.url + "/" + dirPath : project.url; + } + + await fsOperation(dirUrl).createFile(fileName, content); + return `File '${path}' has been successfully created.`; + + case "overwrite": + if (!exists) { + return `Error: File '${path}' does not exist. Use 'create' mode instead.`; + } + await fsOperation(fileUrl).writeFile(content); + return `File '${path}' has been successfully overwritten.`; + + case "edit": + if (!exists) { + return `Error: File '${path}' does not exist. Use 'create' mode instead.`; + } + + // Read current content + const currentContent = await fsOperation(fileUrl).readFile("utf8"); + + // Handle empty oldString (insertion at beginning of file) + if (oldString === "") { + const updatedContent = newString + currentContent; + await fsOperation(fileUrl).writeFile(updatedContent); + return `File '${path}' has been successfully edited. Inserted text at beginning of file.`; + } + + // Check if oldString exists in the file + if (!currentContent.includes(oldString)) { + // Provide more helpful error message + const lines = currentContent.split("\n"); + const preview = + lines.length > 5 + ? `First 5 lines:\n${lines + .slice(0, 5) + .map((line, i) => `${i + 1}: ${line}`) + .join("\n")}` + : `File content:\n${lines.map((line, i) => `${i + 1}: ${line}`).join("\n")}`; + return `Error: The text to replace was not found in '${path}'.\n\nSearching for:\n${JSON.stringify(oldString)}\n\n${preview}`; + } + + // Count occurrences for reporting + const occurrenceCount = ( + currentContent.match( + new RegExp(oldString.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), + ) || [] + ).length; + + // Perform the replacement + let updatedContent; + if (replaceAll) { + // Replace all occurrences using replaceAll method + updatedContent = currentContent.replaceAll(oldString, newString); + } else { + // Replace only first occurrence + updatedContent = currentContent.replace(oldString, newString); + } + + // Check if replacement actually changed the content + if (updatedContent === currentContent) { + return `Warning: No changes were made to '${path}'. The 'oldString' and 'newString' are identical.`; + } + + // Write the updated content + await fsOperation(fileUrl).writeFile(updatedContent); + + const replacedCount = replaceAll ? occurrenceCount : 1; + const message = replaceAll + ? `File '${path}' has been successfully edited. Replaced ${replacedCount} occurrence(s) of the text.` + : `File '${path}' has been successfully edited. Replaced first occurrence of the text (${occurrenceCount} total found).`; + + return message; + + default: + return `Error: Invalid mode '${mode}'. Use 'create', 'edit', or 'overwrite'.`; + } + } catch (error) { + return `Error processing file: ${error.message}`; + } + } +} + +export const editFile = new EditFileTool(); diff --git a/src/pages/aiAssistant/tools/fetch.js b/src/pages/aiAssistant/tools/fetch.js new file mode 100644 index 000000000..b6ca9f247 --- /dev/null +++ b/src/pages/aiAssistant/tools/fetch.js @@ -0,0 +1,62 @@ +import { StructuredTool } from "@langchain/core/tools"; +import TurndownService from "turndown"; +import { z } from "zod"; + +/** + * Tool for fetching content from a URL + */ +class FetchTool extends StructuredTool { + name = "fetch"; + description = "Fetches a URL and returns the content as Markdown."; + schema = z.object({ + url: z.string().describe("The url to fetch."), + }); + + async _call({ url }) { + if (!url.startsWith("http://") && !url.startsWith("https://")) { + url = `https://${url}`; + } + + return new Promise((resolve, reject) => { + cordova.plugin.http.sendRequest( + url, + { + method: "get", + }, + (response) => { + const contentType = + response.headers["content-type"] || + response.headers["Content-Type"] || + ""; + + if (contentType.includes("text/html")) { + // Convert HTML to Markdown + const markdown = this.htmlToMarkdown(response.data); + resolve(markdown); + } else if (contentType.includes("application/json")) { + // Return JSON as string + const jsonString = + typeof response.data === "string" + ? response.data + : JSON.stringify(response.data); + resolve(jsonString); + } else { + // Return as plain text + resolve(response.data); + } + }, + (error) => { + console.error(error); + reject(error); + }, + ); + }); + } + + htmlToMarkdown(html) { + const turndownService = new TurndownService(); + return turndownService.turndown(html); + } +} + +export const fetchTool = new FetchTool(); diff --git a/src/pages/aiAssistant/tools/index.js b/src/pages/aiAssistant/tools/index.js new file mode 100644 index 000000000..787f32f45 --- /dev/null +++ b/src/pages/aiAssistant/tools/index.js @@ -0,0 +1,21 @@ +import { createDir } from "./createDir"; +import { editFile } from "./editFile"; +import { fetchTool } from "./fetch"; +import { listDirectory } from "./listDirectory"; +import { openUrl } from "./openUrl"; +import { readFile } from "./readFile"; +import { searchCode } from "./searchCode"; +import { interactiveTerminal, terminal } from "./terminal"; + +// Export all tools as a single object +export const allTools = { + readFile, + fetchTool, + listDirectory, + editFile, + createDir, + terminal, + interactiveTerminal, + searchCode, + openUrl, +}; diff --git a/src/pages/aiAssistant/tools/listDirectory.js b/src/pages/aiAssistant/tools/listDirectory.js new file mode 100644 index 000000000..df622a4d6 --- /dev/null +++ b/src/pages/aiAssistant/tools/listDirectory.js @@ -0,0 +1,85 @@ +import fsOperation from "fileSystem"; +import { StructuredTool } from "@langchain/core/tools"; +import { addedFolder } from "lib/openFolder"; +import { z } from "zod"; + +/** + * Tool for listing files and directories in a given path + */ +class ListDirectoryTool extends StructuredTool { + name = "listDirectory"; + description = "Lists files and directories in a given path"; + schema = z.object({ + path: z + .string() + .describe( + "The relative path of the directory to list. This path must never be absolute. The first component of the path should always be the name of a root directory in the project (as shown in the sidebar). For example, if the root directories are 'directory1' and 'directory2', you can list the contents of 'directory1' by using the path 'directory1'. If the root directories are 'foo' and 'bar', and you want to list the contents of the directory 'foo/baz', you should use the path 'foo/baz'.", + ), + }); + + async _call({ path }) { + try { + // Handle special cases: ".", "", "./", "*" + if (path === "." || path === "" || path === "./" || path === "*") { + // List all root directories (project roots) + const rootDirs = addedFolder + .filter((folder) => folder && folder.title) + .map((folder) => folder.title) + .join("\n"); + return rootDirs; + } + + // Split the path to get project name and subpath + const pathParts = path.split("/"); + const projectName = pathParts[0]; + const subPath = pathParts.slice(1).join("/"); + + // Find the project in addedFolder array + const project = addedFolder.find( + (folder) => folder.title === projectName, + ); + if (!project) { + return `Error: Path '${path}' not found in opened projects`; + } + + // Construct the full URL + const dirUrl = subPath ? project.url + "/" + subPath : project.url; + + // List directory entries + const entries = await fsOperation(dirUrl).lsDir(); + if (!Array.isArray(entries)) { + return `Error: Path not found: ${path}`; + } + + // Separate folders and files + const folders = []; + const files = []; + for (const entry of entries) { + // Skip "." and ".." + if (entry.name === "." || entry.name === "..") continue; + const entryRelPath = subPath ? subPath + "/" + entry.name : entry.name; + if (entry.isDirectory) { + folders.push(`${projectName}/${entryRelPath}`); + } else if (entry.isFile) { + files.push(`${projectName}/${entryRelPath}`); + } + } + + let output = ""; + if (folders.length > 0) { + output += `# Folders:\n${folders.join("\n")}\n`; + } + if (files.length > 0) { + output += `\n# Files:\n${files.join("\n")}\n`; + } + if (output.trim() === "") { + output = `${path} is empty.`; + } + return output.trim(); + } catch (error) { + return `Error reading directory: ${error.message}`; + } + } +} + +export const listDirectory = new ListDirectoryTool(); diff --git a/src/pages/aiAssistant/tools/openUrl.js b/src/pages/aiAssistant/tools/openUrl.js new file mode 100644 index 000000000..2865b5cdf --- /dev/null +++ b/src/pages/aiAssistant/tools/openUrl.js @@ -0,0 +1,58 @@ +import { StructuredTool } from "@langchain/core/tools"; +import browser from "plugins/browser"; +import { z } from "zod"; + +const SUPPORTED_PROTOCOL = /^https?:\/\//i; + +function normalizeTarget(target) { + if (!target) return "inApp"; + if (target === "in-app" || target === "inapp") return "inApp"; + return target; +} + +class OpenUrlTool extends StructuredTool { + name = "openUrl"; + description = + "Opens a URL in the system browser or the in-app browser. " + + "Use this to hand off documentation, dashboards, or other web resources to the user."; + + schema = z.object({ + url: z + .string() + .min(1) + .describe("Full URL including scheme (http or https)."), + target: z + .enum(["external", "inApp"]) + .default("inApp") + .describe( + "Destination: external (system browser) or inApp (Acode's built-in browser). Default inApp.", + ), + }); + + async _call({ url, target = "inApp" }) { + const trimmedUrl = url.trim(); + if (!SUPPORTED_PROTOCOL.test(trimmedUrl)) { + return "Error: Only http and https URLs are supported."; + } + + const normalizedTarget = normalizeTarget(target); + + try { + if (normalizedTarget === "inApp") { + browser.open(trimmedUrl); + return `Opened ${trimmedUrl} in the in-app browser.`; + } + + if (typeof window.system.openInBrowser !== "function") { + return "Error: External browser integration is unavailable."; + } + + window.system.openInBrowser(trimmedUrl); + return `Opened ${trimmedUrl} in the system browser.`; + } catch (error) { + return `Error opening URL: ${error.message}`; + } + } +} + +export const openUrl = new OpenUrlTool(); diff --git a/src/pages/aiAssistant/tools/readFile.js b/src/pages/aiAssistant/tools/readFile.js new file mode 100644 index 000000000..fcd7be492 --- /dev/null +++ b/src/pages/aiAssistant/tools/readFile.js @@ -0,0 +1,106 @@ +import fsOperation from "fileSystem"; +import { StructuredTool } from "@langchain/core/tools"; +import { addedFolder } from "lib/openFolder"; +import { z } from "zod"; + +/** + * Tool for reading file contents in Acode + */ +class ReadFileTool extends StructuredTool { + name = "readFile"; + description = "Reads the content of the given file in the project."; + schema = z.object({ + path: z + .string() + .describe( + "The relative path of the file to read. This path should never be absolute, and the first component of the path should always be a root directory in a project (opened in sidebar). For example, if root directories are 'directory1' and 'directory2', to access 'file.txt' in 'directory1', use 'directory1/file.txt'. To access 'file.txt' in 'directory2', use 'directory2/file.txt'.", + ), + startLine: z + .number() + .min(1) + .optional() + .describe("line number to start reading on (1-based index)"), + endLine: z + .number() + .min(1) + .optional() + .describe("line number to end reading on (1-based index, inclusive)"), + }); + + /** + * Check if a URI is a SAF URI + */ + isSafUri(uri) { + return uri.startsWith("content://") && uri.includes("/tree/"); + } + + /** + * Check if SAF URI already has the :: separator (complete format) + */ + isCompleteSafUri(uri) { + return this.isSafUri(uri) && uri.includes("::"); + } + + /** + * Construct SAF URI for file access + */ + constructSafFileUri(baseUri, filePath) { + // For incomplete SAF URIs (without ::), construct the full format + // baseUri::primary:fullFilePath + return `${baseUri}::primary:${filePath}`; + } + + async _call({ path, startLine, endLine }) { + try { + // Split the path to get project name and file path + const pathParts = path.split("/"); + const projectName = pathParts[0]; + const filePath = pathParts.slice(1).join("/"); + + // Find the project in addedFolder array + const project = addedFolder.find( + (folder) => folder.title === projectName, + ); + if (!project) { + return `Error: Project '${projectName}' not found in opened projects`; + } + + let fileUrl; + + // Check if this is a SAF URI + if (this.isSafUri(project.url)) { + if (this.isCompleteSafUri(project.url)) { + // SAF URI already has :: separator, just append the file path normally + // Handle both cases: with trailing slash or without + const baseUrl = project.url.endsWith("/") + ? project.url + : project.url + "/"; + fileUrl = baseUrl + filePath; + } else { + // SAF URI without :: separator, use the special format + fileUrl = this.constructSafFileUri(project.url, path); + } + } else { + // For regular file URIs, use the normal path concatenation + fileUrl = project.url + "/" + filePath; + } + + // Read the file content + const content = await fsOperation(fileUrl).readFile("utf8"); + + // If startLine or endLine are specified, filter the content + if (startLine !== undefined || endLine !== undefined) { + const lines = content.split("\n"); + const start = startLine ? startLine - 1 : 0; + const end = endLine ? endLine : lines.length; + return lines.slice(start, end).join("\n"); + } + + return content; + } catch (error) { + return `Error reading file: ${error.message}`; + } + } +} + +export const readFile = new ReadFileTool(); diff --git a/src/pages/aiAssistant/tools/searchCode.js b/src/pages/aiAssistant/tools/searchCode.js new file mode 100644 index 000000000..7764eb4b7 --- /dev/null +++ b/src/pages/aiAssistant/tools/searchCode.js @@ -0,0 +1,430 @@ +import fsOperation from "fileSystem"; +import { StructuredTool } from "@langchain/core/tools"; +import { addedFolder } from "lib/openFolder"; +import { z } from "zod"; + +const DEFAULT_MAX_RESULTS = 50; +const DEFAULT_CONTEXT_LINES = 2; +const MAX_RESULTS_LIMIT = 200; +const MAX_FILE_SIZE_BYTES = 1024 * 1024; // Skip files over 1MB to avoid heavy reads +const DEFAULT_EXCLUDED_DIRS = new Set([ + ".git", + ".svn", + ".hg", + "node_modules", + "build", + "dist", + ".gradle", + ".idea", + "Pods", + ".expo", + ".turbo", + ".cache", + ".output", + "android/app/build", + "ios/Pods", + "www/build", +]); + +function shellSafePreview(text) { + if (!text) return ""; + const trimmed = text.replace(/\t/g, " ").replace(/\r/g, ""); + return trimmed.length > 160 ? `${trimmed.slice(0, 159)}…` : trimmed; +} + +function formatContext(lines, matchIndex, contextLines) { + const start = Math.max(0, matchIndex - contextLines); + const end = Math.min(lines.length - 1, matchIndex + contextLines); + const formatted = []; + for (let i = start; i <= end; i++) { + const prefix = i === matchIndex ? ">" : " "; + const lineNo = String(i + 1).padStart(4, " "); + formatted.push(`${prefix}${lineNo} ${lines[i]}`); + } + return formatted.join("\n"); +} + +function normalizePathForFilters(path) { + return path.replace(/\\/g, "/"); +} + +function matchesIncludeExclude( + path, + includePatterns, + excludePatterns, + { treatAsDirectory = false } = {}, +) { + const normalized = normalizePathForFilters(path); + if (excludePatterns?.some((pattern) => normalized.includes(pattern))) { + return false; + } + if (includePatterns && includePatterns.length > 0) { + if (treatAsDirectory) { + return includePatterns.some( + (pattern) => + normalized.includes(pattern) || pattern.includes(normalized), + ); + } + return includePatterns.some((pattern) => normalized.includes(pattern)); + } + return true; +} + +async function listDirectorySafe(url) { + try { + return await fsOperation(url).lsDir(); + } catch (error) { + console.error("searchCode: failed to list directory", url, error); + return []; + } +} + +async function readFileSafe(url) { + try { + return await fsOperation(url).readFile("utf8"); + } catch (error) { + return null; + } +} + +function shouldSkipDirectory(relPath) { + if (!relPath) return false; + const normalized = normalizePathForFilters(relPath); + for (const dir of DEFAULT_EXCLUDED_DIRS) { + if (normalized === dir || normalized.endsWith(`/${dir}`)) { + return true; + } + } + return false; +} + +function buildRegex(query, caseSensitive) { + const flags = caseSensitive ? "g" : "gi"; + return new RegExp(query, flags); +} + +function findMatchesInLine({ + line, + lineIndex, + query, + regex, + caseSensitive, + path, + results, + maxResults, +}) { + if (results.length >= maxResults) return; + if (typeof line !== "string" || line.length === 0) return; + + if (regex) { + regex.lastIndex = 0; + let match = regex.exec(line); + while (match && results.length < maxResults) { + const column = match.index + 1; + results.push({ + path, + line: lineIndex + 1, + column, + lineText: line, + matchIndex: lineIndex, + }); + match = regex.exec(line); + } + return; + } + + const haystack = caseSensitive ? line : line.toLowerCase(); + const needle = caseSensitive ? query : query.toLowerCase(); + let startIndex = haystack.indexOf(needle); + while (startIndex !== -1 && results.length < maxResults) { + results.push({ + path, + line: lineIndex + 1, + column: startIndex + 1, + lineText: line, + matchIndex: lineIndex, + }); + startIndex = haystack.indexOf(needle, startIndex + needle.length); + } +} + +async function searchFile({ + fileUrl, + relativePath, + query, + regex, + caseSensitive, + contextLines, + maxResults, + results, +}) { + if (results.length >= maxResults) return; + + const content = await readFileSafe(fileUrl); + if (content === null) return; + + const lines = content.split(/\r?\n/); + const re = regex ? regex : null; + const startLength = results.length; + + for (let i = 0; i < lines.length && results.length < maxResults; i++) { + findMatchesInLine({ + line: lines[i], + lineIndex: i, + query, + regex: re, + caseSensitive, + path: relativePath, + results, + maxResults, + }); + } + + for (let idx = startLength; idx < results.length; idx++) { + const match = results[idx]; + if (!match.lineText) continue; + match.preview = shellSafePreview(match.lineText); + match.context = formatContext(lines, match.matchIndex, contextLines); + delete match.lineText; + } +} + +async function traverse({ + project, + currentUrl, + relativePath, + query, + regex, + caseSensitive, + contextLines, + maxResults, + results, + includePatterns, + excludePatterns, +}) { + if (results.length >= maxResults) return; + + const entries = await listDirectorySafe(currentUrl); + if (!entries || entries.length === 0) return; + + for (const entry of entries) { + if (results.length >= maxResults) break; + if (!entry || entry.name === "." || entry.name === "..") continue; + + const relPath = relativePath + ? `${relativePath}/${entry.name}` + : `${project.title}/${entry.name}`; + const childUrl = entry.url || `${currentUrl}/${entry.name}`; + + if (entry.isDirectory) { + const directoryAllowed = matchesIncludeExclude( + relPath, + includePatterns, + excludePatterns, + { treatAsDirectory: true }, + ); + if (shouldSkipDirectory(relPath) || !directoryAllowed) { + continue; + } + await traverse({ + project, + currentUrl: childUrl, + relativePath: relPath, + query, + regex, + caseSensitive, + contextLines, + maxResults, + results, + includePatterns, + excludePatterns, + }); + } else if (entry.isFile) { + if (!matchesIncludeExclude(relPath, includePatterns, excludePatterns)) { + continue; + } + if ( + typeof entry.length === "number" && + entry.length > MAX_FILE_SIZE_BYTES + ) { + continue; + } + await searchFile({ + fileUrl: childUrl, + relativePath: relPath, + query, + regex, + caseSensitive, + contextLines, + maxResults, + results, + }); + } + } +} + +class SearchCodeTool extends StructuredTool { + name = "searchCode"; + description = + "Searches files in the current project using a plain string or regular expression." + + " Returns the path, line, column, and a short preview for each match."; + schema = z.object({ + query: z + .string() + .min(1) + .describe("Search term or regex pattern depending on 'isRegex'."), + path: z + .string() + .optional() + .describe( + "Optional relative path to scope the search. Start with the project root name as shown in the sidebar (e.g. 'project/src').", + ), + maxResults: z + .number() + .int() + .min(1) + .max(MAX_RESULTS_LIMIT) + .optional() + .describe("Maximum number of matches to return (default 50, cap 200)."), + caseSensitive: z + .boolean() + .optional() + .describe("Perform a case-sensitive search when true."), + isRegex: z + .boolean() + .optional() + .describe("Interpret the query as a regular expression when true."), + contextLines: z + .number() + .int() + .min(0) + .max(5) + .optional() + .describe( + "Number of context lines to include before and after each match (default 2).", + ), + include: z + .array(z.string()) + .optional() + .describe( + "Optional list of path substrings to include (any match qualifies).", + ), + exclude: z + .array(z.string()) + .optional() + .describe("Optional list of path substrings to exclude."), + }); + + resolvePath(inputPath) { + if ( + !inputPath || + inputPath === "." || + inputPath === "*" || + inputPath === "./" + ) { + return null; + } + const parts = inputPath.split("/").filter(Boolean); + const projectName = parts[0]; + const project = addedFolder.find((folder) => folder.title === projectName); + if (!project) { + return { + error: `Error: Project '${projectName}' not found in opened folders.`, + }; + } + const subPath = parts.slice(1).join("/"); + const targetUrl = subPath ? `${project.url}/${subPath}` : project.url; + const relativeBase = subPath ? `${projectName}/${subPath}` : projectName; + return { project, targetUrl, relativeBase }; + } + + async _call(options) { + const { + query, + path, + maxResults = DEFAULT_MAX_RESULTS, + caseSensitive = false, + isRegex = false, + contextLines = DEFAULT_CONTEXT_LINES, + include, + exclude, + } = options; + + try { + const results = []; + let roots = []; + + if (path) { + const resolved = this.resolvePath(path.trim()); + if (resolved?.error) { + return resolved.error; + } + if (!resolved) { + // Path pointed to root wildcard; fall back to all projects + roots = addedFolder.slice(); + } else { + roots = [resolved]; + } + } else { + roots = addedFolder.map((folder) => ({ + project: folder, + targetUrl: folder.url, + relativeBase: folder.title, + })); + } + + if (!roots || roots.length === 0) { + return "No open folders to search."; + } + + let compiledRegex = null; + if (isRegex) { + try { + compiledRegex = buildRegex(query, caseSensitive); + } catch (error) { + return `Invalid regular expression: ${error.message}`; + } + } + + for (const root of roots) { + if (results.length >= maxResults) break; + const projectInfo = root.project + ? root + : { project: root, targetUrl: root.url, relativeBase: root.title }; + await traverse({ + project: projectInfo.project, + currentUrl: projectInfo.targetUrl, + relativePath: projectInfo.relativeBase, + query, + regex: compiledRegex, + caseSensitive, + contextLines, + maxResults, + results, + includePatterns: include, + excludePatterns: exclude, + }); + } + + if (results.length === 0) { + return `No matches for "${query}"${path ? ` in ${path}` : ""}.`; + } + + const formatted = results.slice(0, maxResults).map((match) => { + const header = `${match.path}:${match.line}:${match.column}`; + return `${header}\n${match.context}`; + }); + + if (results.length > maxResults) { + formatted.push(`\n… truncated after ${maxResults} matches.`); + } + + return formatted.join("\n\n"); + } catch (error) { + console.error("searchCode tool error", error); + return `Error during search: ${error.message}`; + } + } +} + +export const searchCode = new SearchCodeTool(); diff --git a/src/pages/aiAssistant/tools/terminal.js b/src/pages/aiAssistant/tools/terminal.js new file mode 100644 index 000000000..87eef2f29 --- /dev/null +++ b/src/pages/aiAssistant/tools/terminal.js @@ -0,0 +1,283 @@ +import { StructuredTool } from "@langchain/core/tools"; +import terminalManager from "components/terminal/terminalManager"; +import confirm from "dialogs/confirm"; +import { z } from "zod"; + +const executor = () => { + const ref = window.Executor; + if (!ref) { + throw new Error( + "Terminal subsystem is unavailable. Ensure the terminal plugin is installed.", + ); + } + return ref; +}; + +const DEFAULT_CWD = "/home"; +const REMOTE_PROTOCOL_REGEX = /^(?:content|ftp|sftp|smb):\/\//i; +const BLOCKED_PATTERNS = [ + /\b(npm|pnpm|yarn)\s+(run\s+)?(dev|start|serve)\b/i, + /\b(vite|expo|nx|next|nuxt|astro|svelte-kit|webpack)\b.*\b(dev|start|serve)\b/i, + /\b(pnpm|npm|yarn)\s+watch\b/i, + /\bnode\b.*\b(--watch|-w)\b/i, + /\bpython\b.*-m\s+http\.server\b/i, + /\btail\b\s+-f\b/i, +]; + +function waitForTerminalConnection(component, timeoutMs = 10000) { + if (!component || component.isConnected) { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + const start = Date.now(); + const interval = setInterval(() => { + if (component.isConnected) { + clearInterval(interval); + resolve(); + return; + } + + if (Date.now() - start > timeoutMs) { + clearInterval(interval); + reject(new Error("Timed out waiting for terminal to become ready.")); + } + }, 150); + }); +} + +function resolvePosixPath(base, target) { + const raw = target.startsWith("/") + ? target + : `${base.replace(/\/$/, "")}/${target}`; + const parts = raw.split("/"); + const stack = []; + for (const part of parts) { + if (!part || part === ".") continue; + if (part === "..") { + stack.pop(); + } else { + stack.push(part); + } + } + return `/${stack.join("/")}` || "/"; +} + +function toShellPreview(output) { + if (!output) return ""; + return output.length > 4000 + ? `${output.slice(0, 4000)}\n… (truncated)` + : output; +} + +class TerminalTool extends StructuredTool { + name = "terminal"; + description = + "Runs a single shell command inside Acode's Alpine proot environment. " + + "Long-running dev servers or watch tasks are blocked; use the interactive terminal instead."; + + schema = z.object({ + command: z + .string() + .min(1) + .describe( + "Shell command to execute. Avoid long-running dev/watch tasks.", + ), + cwd: z + .string() + .optional() + .describe( + "Optional working directory. Defaults to the last directory (initially /home). Accepts absolute or relative POSIX paths.", + ), + requireConfirmation: z + .boolean() + .default(true) + .describe("Prompt the user for confirmation before executing."), + }); + + constructor() { + super(); + this.currentWorkingDirectory = DEFAULT_CWD; + } + + isSessionAlive() { + return Promise.resolve(false); + } + + getCurrentWorkingDirectory() { + return this.currentWorkingDirectory; + } + + async resetSession() { + this.currentWorkingDirectory = DEFAULT_CWD; + } + + async stopCurrentProcess() { + await this.resetSession(); + } + + validateCommand(command) { + for (const pattern of BLOCKED_PATTERNS) { + if (pattern.test(command)) { + throw new Error( + "This command starts a long-running process. Please use the interactive terminal instead.", + ); + } + } + } + + normalizeCwd(input) { + if (!input || !input.trim()) { + return this.currentWorkingDirectory; + } + + let path = input.trim(); + + if (REMOTE_PROTOCOL_REGEX.test(path)) { + throw new Error( + "Remote or SAF paths are not accessible from the terminal tool. Only local paths are supported.", + ); + } + + if (path.startsWith("~")) { + path = path.replace(/^~(?=\/|$)/, DEFAULT_CWD); + } + + const resolved = resolvePosixPath(this.currentWorkingDirectory, path); + return resolved || DEFAULT_CWD; + } + + async confirmExecution({ command, cwd }) { + const message = + `Environment: Alpine proot sandbox
` + + `Working directory: ${cwd}

` + + `Command:
${command}
` + + `
Please confirm before executing.`; + + const userConfirmed = await confirm("Run Terminal Command", message, true); + return Boolean(userConfirmed); + } + + async runExecutor(command) { + try { + const stdout = await executor().execute( + `sh -c "${command.replace(/"/g, '\\"')}"`, + true, + ); + return { success: true, stdout: stdout || "" }; + } catch (error) { + const message = + typeof error === "string" ? error : error?.message || String(error); + return { success: false, stderr: message }; + } + } + + async _call({ command, cwd, requireConfirmation = true }) { + try { + const trimmedCommand = command.trim(); + if (!trimmedCommand) { + return "Error: Empty command provided."; + } + + this.validateCommand(trimmedCommand); + + const normalizedCwd = this.normalizeCwd(cwd); + + if (requireConfirmation) { + const consent = await this.confirmExecution({ + command: trimmedCommand, + cwd: normalizedCwd, + }); + if (!consent) { + return "Command cancelled by user."; + } + } + + const wrappedCommand = `cd "${normalizedCwd.replace(/"/g, '\\"')}" && ${trimmedCommand}`; + + const result = await this.runExecutor(wrappedCommand); + + if (result.success) { + this.currentWorkingDirectory = normalizedCwd; + } + + const lines = [ + "Environment: Alpine proot sandbox", + `Working directory: ${normalizedCwd}`, + `Command: ${trimmedCommand}`, + result.success ? "Status: SUCCESS" : "Status: FAILED", + ]; + + const body = []; + if (result.success && result.stdout) { + body.push(`STDOUT:\n${toShellPreview(result.stdout)}`); + } else if (result.success) { + body.push("STDOUT:\n(no output)\n"); + } + + if (!result.success && result.stderr) { + body.push(`STDERR:\n${toShellPreview(result.stderr)}`); + } + + if (!result.success) { + body.push( + "Hint: Use the interactive terminal tool for commands that need an ongoing session.", + ); + } + + return [...lines, "", ...body].join("\n"); + } catch (error) { + return `Error: ${error.message}`; + } + } +} + +class InteractiveTerminalTool extends StructuredTool { + name = "interactiveTerminal"; + description = + "Opens a dedicated terminal tab in the UI (server-backed) for manual interaction. " + + "Use this for long-running or interactive workflows."; + + schema = z.object({ + name: z.string().optional().describe("Optional custom tab title."), + command: z + .string() + .optional() + .describe( + "Optional command to send once the terminal is ready (a newline is appended automatically).", + ), + }); + + async _call({ name, command }) { + try { + const terminal = await terminalManager.createTerminal({ + name: name || "AI Assistant Terminal", + serverMode: true, + }); + + if (!terminal) { + return "Failed to create terminal session."; + } + + try { + await waitForTerminalConnection(terminal.component); + } catch (connectionError) { + return `Terminal tab opened, but the backend did not become ready: ${connectionError.message}`; + } + + if (command && command.trim()) { + terminalManager.writeToTerminal(terminal.id, `${command.trim()}\r\n`); + return `Interactive terminal "${terminal.name}" opened and command sent.`; + } + + return `Interactive terminal "${terminal.name}" opened. You can find it in the tab bar.`; + } catch (error) { + return `Error creating terminal: ${error.message}`; + } + } +} + +const terminalToolInstance = new TerminalTool(); + +export const terminal = terminalToolInstance; +export const interactiveTerminal = new InteractiveTerminalTool(); diff --git a/src/pages/aiAssistant/ui/messageRenderer.js b/src/pages/aiAssistant/ui/messageRenderer.js new file mode 100644 index 000000000..633c133d7 --- /dev/null +++ b/src/pages/aiAssistant/ui/messageRenderer.js @@ -0,0 +1,545 @@ +import tag from "html-tag-js"; +import settings from "lib/settings"; +import markdownIt from "markdown-it"; + +const md = markdownIt({ + html: true, + linkify: true, + typographer: true, +}); + +function formatTime(timestamp) { + return new Date(timestamp).toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + }); +} + +function copyToClipboard(text = "") { + try { + cordova.plugins.clipboard.copy(text); + } catch (error) { + console.error("Clipboard copy failed", error); + } +} + +function normalizeToolStatus(status) { + switch (status) { + case "error": + case "failed": + return "error"; + case "success": + case "completed": + return "success"; + default: + return "running"; + } +} + +function prettifyArgs({ argsObject, argsText }) { + if (argsObject) { + try { + return JSON.stringify(argsObject, null, 2); + } catch (error) { + console.warn("Failed to stringify tool args object", error); + } + } + if (argsText && argsText.trim().length) { + return argsText; + } + return "—"; +} + +export function createMessageRenderer({ messageContainerRef, onUserEdit }) { + let aiTabInstance = null; + const toolWidgets = new Map(); + const toolContainers = new Map(); + const pendingToolEvents = new Map(); + const standaloneToolWidgets = new Map(); + + function setEditorInstance(instance) { + aiTabInstance = instance; + } + + function scrollToBottom() { + const container = messageContainerRef.el; + if (!container) return; + container.scrollTop = container.scrollHeight; + } + + function renderMarkdownInto(element, content) { + if (!element) return; + element.innerHTML = md.render(content); + } + + function enhanceCodeBlocks(messageContentEl) { + if (!messageContentEl) return; + + messageContentEl.querySelectorAll("pre code").forEach((codeElement) => { + const languageMatch = codeElement.className.match(/language-(\w+)/); + let language = languageMatch ? languageMatch[1] : "plaintext"; + const langMap = { + bash: "sh", + shell: "sh", + }; + language = langMap[language] || language; + + const highlight = ace.require("ace/ext/static_highlight"); + highlight.render( + codeElement.textContent, + `ace/mode/${language}`, + settings.value.editorTheme.startsWith("ace/theme/") + ? settings.value.editorTheme + : `ace/theme/${settings.value.editorTheme}`, + 1, + true, + (highlighted) => { + if (aiTabInstance) { + aiTabInstance.addStyle(highlighted.css); + } + codeElement.innerHTML = highlighted.html; + }, + ); + }); + + messageContentEl.querySelectorAll("pre").forEach((preEl) => { + preEl.classList.add("code-block-native"); + }); + } + + function buildMessageHeader(message, messageEl) { + const header = tag("div", { className: "message-header" }); + const sender = tag("div", { + className: `message-sender ${message.role === "user" ? "user" : "ai"}`, + textContent: message.role === "user" ? "You" : "AI", + }); + const actions = tag("div", { className: "message-actions" }); + const time = tag("div", { + className: "message-time", + textContent: formatTime(message.timestamp), + }); + + actions.appendChild(time); + + if (message.role === "assistant") { + const copyBtn = tag("button", { + className: "btn btn-icon", + title: "Copy message", + onclick: () => copyToClipboard(message.content), + }); + copyBtn.appendChild(tag("i", { className: "icon copy" })); + actions.appendChild(copyBtn); + } + + if (message.role === "user" && typeof onUserEdit === "function") { + const editBtn = tag("button", { + className: "btn btn-icon", + title: "Edit message", + onclick: () => onUserEdit(message), + }); + editBtn.appendChild(tag("i", { className: "icon edit" })); + actions.appendChild(editBtn); + } + + header.appendChild(sender); + header.appendChild(actions); + messageEl.appendChild(header); + } + + function buildMessageContent(message, { renderMarkdown = true } = {}) { + const contentEl = tag("div", { className: "message-content md" }); + + if (message.role === "user" || !renderMarkdown) { + contentEl.textContent = message.content || ""; + } else if (message.role === "assistant" && message.content) { + renderMarkdownInto(contentEl, message.content); + enhanceCodeBlocks(contentEl); + } + + return contentEl; + } + + function renderMessage(message, { renderMarkdown = true } = {}) { + const roleClass = + message.role === "user" + ? "user" + : message.role === "tool" + ? "tool" + : "assistant"; + const messageEl = tag("div", { + className: `message ${roleClass}`, + id: `message-${message.id}`, + }); + + buildMessageHeader(message, messageEl); + + let toolContainer = null; + if (message.role === "assistant") { + toolContainer = tag("div", { + className: "assistant-tools", + id: `assistant-tools-${message.id}`, + }); + toolContainers.set(message.id, toolContainer); + messageEl.appendChild(toolContainer); + } + + const contentEl = buildMessageContent(message, { renderMarkdown }); + messageEl.appendChild(contentEl); + + messageContainerRef.el.appendChild(messageEl); + + if (message.role === "assistant" && pendingToolEvents.has(message.id)) { + const queued = pendingToolEvents.get(message.id) || []; + pendingToolEvents.delete(message.id); + queued.forEach((queuedEvent) => { + renderToolEvent(queuedEvent.state, { + targetMessageId: message.id, + queueIfMissing: false, + fallbackToStandalone: queuedEvent.fallbackToStandalone, + }); + }); + } + + scrollToBottom(); + return messageEl; + } + + function renderAssistantPlaceholder(message) { + const placeholderMessage = { ...message, content: "" }; + const messageEl = renderMessage(placeholderMessage, { + renderMarkdown: false, + }); + const contentEl = messageEl.querySelector(".message-content"); + if (contentEl) { + contentEl.innerHTML = ''; + } + return messageEl; + } + + function updateAssistantStreaming( + messageId, + content, + { showCursor = false } = {}, + ) { + const messageEl = messageContainerRef.el?.querySelector( + `#message-${messageId} .message-content`, + ); + if (!messageEl) return; + + const suffix = showCursor ? " ▌" : ""; + renderMarkdownInto(messageEl, `${content}${suffix}`); + } + + function finalizeAssistantMessage(messageId, content, timestamp) { + const messageEl = messageContainerRef.el?.querySelector( + `#message-${messageId}`, + ); + if (!messageEl) return; + + const contentEl = messageEl.querySelector(".message-content"); + if (contentEl) { + renderMarkdownInto(contentEl, content); + enhanceCodeBlocks(contentEl); + } + + const timeEl = messageEl.querySelector(".message-time"); + if (timeEl) { + timeEl.textContent = formatTime(timestamp); + } + } + + function clearMessages() { + if (messageContainerRef.el) { + messageContainerRef.el.innerHTML = ""; + } + toolWidgets.clear(); + toolContainers.clear(); + pendingToolEvents.clear(); + standaloneToolWidgets.clear(); + } + + function showLoadingIndicator() { + const loadingEl = tag("div", { + className: "ai_loading", + id: "loading-indicator", + }); + const loadingDots = tag("div", { className: "loading-dots" }); + + for (let i = 0; i < 3; i++) { + loadingDots.appendChild(tag("div", { className: "loading-dot" })); + } + + loadingEl.appendChild(loadingDots); + loadingEl.appendChild(tag("span", { textContent: "AI is thinking..." })); + + messageContainerRef.el.appendChild(loadingEl); + scrollToBottom(); + } + + function removeLoadingIndicator() { + const loadingEl = + messageContainerRef.el?.querySelector("#loading-indicator"); + if (loadingEl) { + loadingEl.remove(); + } + } + + function statusLabel(normalizedStatus) { + switch (normalizedStatus) { + case "error": + return "Failed"; + case "success": + return "Completed"; + default: + return "Running"; + } + } + + function truncate(text, max = 80) { + if (!text) return ""; + const trimmed = text.trim(); + return trimmed.length > max ? `${trimmed.slice(0, max - 1)}…` : trimmed; + } + + function createToolSection(label) { + const section = tag("div", { className: "assistant-tool__section" }); + section.appendChild( + tag("div", { + className: "assistant-tool__section-title", + textContent: label, + }), + ); + const content = tag("pre", { + className: "assistant-tool__section-content", + }); + section.appendChild(content); + return { section, content }; + } + + function createAttachedToolWidget(state) { + const wrapper = tag("div", { + className: "assistant-tool", + id: `tool-${state.id}`, + }); + wrapper.dataset.toolId = state.id || ""; + wrapper.dataset.parentMessageId = state.parentMessageId || ""; + + const summary = tag("button", { + className: "assistant-tool__summary", + type: "button", + }); + + const titleGroup = tag("div", { className: "assistant-tool__title" }); + const nameEl = tag("span", { + className: "assistant-tool__name", + textContent: state.name || "Tool", + }); + const previewEl = tag("span", { className: "assistant-tool__preview" }); + titleGroup.appendChild(nameEl); + titleGroup.appendChild(previewEl); + + const statusValue = normalizeToolStatus(state.status); + const statusEl = tag("span", { + className: `assistant-tool__status status-${statusValue}`, + textContent: statusLabel(statusValue), + }); + + const caretEl = tag("i", { + className: "icon keyboard_arrow_down assistant-tool__caret", + }); + + summary.appendChild(titleGroup); + summary.appendChild(statusEl); + summary.appendChild(caretEl); + + const body = tag("div", { className: "assistant-tool__body" }); + const argsSection = createToolSection("Arguments"); + const outputSection = createToolSection("Output"); + body.appendChild(argsSection.section); + body.appendChild(outputSection.section); + + summary.onclick = () => { + const expanded = body.classList.toggle("visible"); + summary.classList.toggle("expanded", expanded); + caretEl.className = expanded + ? "icon keyboard_arrow_up assistant-tool__caret" + : "icon keyboard_arrow_down assistant-tool__caret"; + }; + + wrapper.appendChild(summary); + wrapper.appendChild(body); + + wrapper._statusEl = statusEl; + wrapper._previewEl = previewEl; + wrapper._argsEl = argsSection.content; + wrapper._outputEl = outputSection.content; + wrapper._bodyEl = body; + wrapper._summaryEl = summary; + wrapper._caretEl = caretEl; + + return wrapper; + } + + function updateAttachedToolWidget(widget, state) { + if (!widget) return; + widget.dataset.parentMessageId = + state.parentMessageId || widget.dataset.parentMessageId || ""; + + const normalized = normalizeToolStatus(state.status); + if (widget._statusEl) { + widget._statusEl.textContent = statusLabel(normalized); + widget._statusEl.className = `assistant-tool__status status-${normalized}`; + } + + if (widget._argsEl && (state.isNew || state.stage?.startsWith("args"))) { + widget._argsEl.textContent = prettifyArgs(state); + } + + if (widget._outputEl) { + if (state.output && state.output.trim().length) { + widget._outputEl.textContent = state.output; + } else if (normalized === "running") { + widget._outputEl.textContent = "Pending..."; + } + } + + if (widget._previewEl) { + const previewSource = + state.output?.trim() || + state.argsText?.trim() || + (state.argsObject ? JSON.stringify(state.argsObject) : ""); + const previewText = truncate(previewSource, 80); + widget._previewEl.textContent = previewText ? `• ${previewText}` : ""; + widget._previewEl.classList.toggle("visible", Boolean(previewText)); + } + } + + function createStandaloneToolWidget(state) { + const wrapper = tag("div", { + className: "message tool", + id: `tool-${state.id}`, + }); + + const card = tag("div", { className: "tool-card" }); + const header = tag("div", { className: "tool-card-header" }); + const title = tag("div", { + className: "tool-card-title", + textContent: state.name || "Tool", + }); + const statusValue = normalizeToolStatus(state.status); + const status = tag("span", { + className: `tool-status status-${statusValue}`, + textContent: statusLabel(statusValue), + }); + header.appendChild(title); + header.appendChild(status); + + const body = tag("div", { className: "tool-card-body" }); + const argsSection = createToolSection("Arguments"); + argsSection.content.textContent = prettifyArgs(state); + + const outputSection = createToolSection("Output"); + outputSection.content.textContent = state.output?.trim()?.length + ? state.output + : "Pending..."; + + body.appendChild(argsSection.section); + body.appendChild(outputSection.section); + card.appendChild(header); + card.appendChild(body); + wrapper.appendChild(card); + + wrapper._statusEl = status; + wrapper._argsEl = argsSection.content; + wrapper._outputEl = outputSection.content; + + return wrapper; + } + + function updateStandaloneToolWidget(widget, state) { + if (!widget) return; + const statusValue = normalizeToolStatus(state.status); + widget._statusEl.textContent = statusLabel(statusValue); + widget._statusEl.className = `tool-status status-${statusValue}`; + if (state.isNew || state.stage?.startsWith("args")) { + widget._argsEl.textContent = prettifyArgs(state); + } + if (widget._outputEl) { + if (state.output && state.output.trim().length) { + widget._outputEl.textContent = state.output; + } else if (statusValue === "running") { + widget._outputEl.textContent = "Pending..."; + } + } + } + + function attachStandaloneWidget(widget) { + messageContainerRef.el.appendChild(widget); + scrollToBottom(); + } + + function renderToolEvent( + state, + { + targetMessageId, + fallbackToStandalone = false, + queueIfMissing = true, + } = {}, + ) { + const toolId = state.id || `tool-${toolWidgets.size + 1}`; + state.id = toolId; + + if (targetMessageId) { + const container = toolContainers.get(targetMessageId); + if (!container) { + if (queueIfMissing) { + const existingQueue = pendingToolEvents.get(targetMessageId) || []; + existingQueue.push({ state, fallbackToStandalone }); + pendingToolEvents.set(targetMessageId, existingQueue); + } else if (fallbackToStandalone) { + renderToolEvent(state, { + targetMessageId: null, + fallbackToStandalone: true, + queueIfMissing: false, + }); + } + return; + } + + let widget = toolWidgets.get(toolId); + if (!widget || !container.contains(widget)) { + widget = createAttachedToolWidget(state); + toolWidgets.set(toolId, widget); + container.appendChild(widget); + } + updateAttachedToolWidget(widget, state); + scrollToBottom(); + return; + } + + if (!fallbackToStandalone) { + return; + } + + let fallbackWidget = standaloneToolWidgets.get(toolId); + if (!fallbackWidget) { + fallbackWidget = createStandaloneToolWidget(state); + standaloneToolWidgets.set(toolId, fallbackWidget); + attachStandaloneWidget(fallbackWidget); + } + updateStandaloneToolWidget(fallbackWidget, state); + } + + return { + setEditorInstance, + scrollToBottom, + renderMessage, + renderAssistantPlaceholder, + updateAssistantStreaming, + finalizeAssistantMessage, + clearMessages, + showLoadingIndicator, + removeLoadingIndicator, + renderToolEvent, + }; +}