From 99983af597f0510328bbf0cb890b8e8a81e89d89 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 3 Oct 2025 23:21:59 +0200 Subject: [PATCH] Fix lints. --- biome.json | 11 +- package-lock.json | 1016 ++++++++--------- packages/ai/package.json | 2 +- packages/ai/src/models.generated.ts | 77 +- packages/ai/src/providers/google.ts | 2 +- .../browser-extension/manifest.chrome.json | 2 +- packages/browser-extension/package.json | 2 +- packages/browser-extension/src/ChatPanel.ts | 7 +- packages/browser-extension/src/app.css | 1 + .../src/components/ModeToggle.ts | 53 - .../src/components/SandboxedIframe.ts | 1 - .../src/dialogs/ApiKeysDialog.ts | 3 +- .../src/dialogs/AttachmentOverlay.ts | 4 +- .../src/dialogs/DialogBase.ts | 64 -- .../src/dialogs/ModelSelector.ts | 3 +- .../src/dialogs/PromptDialog.ts | 99 -- packages/browser-extension/src/sidepanel.ts | 237 +--- .../browser-extension/src/state/KeyStore.ts | 1 - .../src/state/agent-session.ts | 4 +- .../src/tools/artifacts/HtmlArtifact.ts | 21 +- .../src/tools/browser-javascript.ts | 137 ++- .../browser-extension/src/utils/auth-token.ts | 2 +- .../src/utils/test-sessions.ts | 156 +++ packages/pods/src/cli.ts | 2 +- packages/pods/src/commands/models.ts | 4 +- packages/pods/src/commands/pods.ts | 2 +- packages/tui/test/differential-render.test.ts | 2 +- 27 files changed, 855 insertions(+), 1060 deletions(-) delete mode 100644 packages/browser-extension/src/components/ModeToggle.ts delete mode 100644 packages/browser-extension/src/dialogs/DialogBase.ts delete mode 100644 packages/browser-extension/src/dialogs/PromptDialog.ts diff --git a/biome.json b/biome.json index ac962d29..aee52eb9 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.1.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", "linter": { "enabled": true, "rules": { @@ -28,7 +28,14 @@ "lineWidth": 120 }, "files": { - "includes": ["packages/*/src/**/*", "packages/*/test/**/*", "*.json", "*.md", "!**/node_modules/**/*"], + "includes": [ + "packages/*/src/**/*", + "packages/*/test/**/*", + "*.json", + "*.md", + "!**/node_modules/**/*", + "!**/test-sessions.ts" + ], "experimentalScannerIgnores": ["node_modules"] } } diff --git a/package-lock.json b/package-lock.json index 56657c03..b7e1dc26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,9 +32,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.1.4.tgz", - "integrity": "sha512-QWlrqyxsU0FCebuMnkvBIkxvPqH89afiJzjMl+z67ybutse590jgeaFdDurE9XYtzpjRGTI1tlUZPGWmbKsElA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", + "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -48,20 +48,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.1.4", - "@biomejs/cli-darwin-x64": "2.1.4", - "@biomejs/cli-linux-arm64": "2.1.4", - "@biomejs/cli-linux-arm64-musl": "2.1.4", - "@biomejs/cli-linux-x64": "2.1.4", - "@biomejs/cli-linux-x64-musl": "2.1.4", - "@biomejs/cli-win32-arm64": "2.1.4", - "@biomejs/cli-win32-x64": "2.1.4" + "@biomejs/cli-darwin-arm64": "2.2.5", + "@biomejs/cli-darwin-x64": "2.2.5", + "@biomejs/cli-linux-arm64": "2.2.5", + "@biomejs/cli-linux-arm64-musl": "2.2.5", + "@biomejs/cli-linux-x64": "2.2.5", + "@biomejs/cli-linux-x64-musl": "2.2.5", + "@biomejs/cli-win32-arm64": "2.2.5", + "@biomejs/cli-win32-x64": "2.2.5" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.1.4.tgz", - "integrity": "sha512-sCrNENE74I9MV090Wq/9Dg7EhPudx3+5OiSoQOkIe3DLPzFARuL1dOwCWhKCpA3I5RHmbrsbNSRfZwCabwd8Qg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", + "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", "cpu": [ "arm64" ], @@ -76,9 +76,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.1.4.tgz", - "integrity": "sha512-gOEICJbTCy6iruBywBDcG4X5rHMbqCPs3clh3UQ+hRKlgvJTk4NHWQAyHOXvaLe+AxD1/TNX1jbZeffBJzcrOw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", + "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", "cpu": [ "x64" ], @@ -93,9 +93,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.1.4.tgz", - "integrity": "sha512-juhEkdkKR4nbUi5k/KRp1ocGPNWLgFRD4NrHZSveYrD6i98pyvuzmS9yFYgOZa5JhaVqo0HPnci0+YuzSwT2fw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", + "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", "cpu": [ "arm64" ], @@ -110,9 +110,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.1.4.tgz", - "integrity": "sha512-nYr7H0CyAJPaLupFE2cH16KZmRC5Z9PEftiA2vWxk+CsFkPZQ6dBRdcC6RuS+zJlPc/JOd8xw3uCCt9Pv41WvQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", + "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", "cpu": [ "arm64" ], @@ -127,9 +127,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.1.4.tgz", - "integrity": "sha512-Eoy9ycbhpJVYuR+LskV9s3uyaIkp89+qqgqhGQsWnp/I02Uqg2fXFblHJOpGZR8AxdB9ADy87oFVxn9MpFKUrw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", + "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", "cpu": [ "x64" ], @@ -144,9 +144,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.1.4.tgz", - "integrity": "sha512-lvwvb2SQQHctHUKvBKptR6PLFCM7JfRjpCCrDaTmvB7EeZ5/dQJPhTYBf36BE/B4CRWR2ZiBLRYhK7hhXBCZAg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", + "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", "cpu": [ "x64" ], @@ -161,9 +161,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.1.4.tgz", - "integrity": "sha512-3WRYte7orvyi6TRfIZkDN9Jzoogbv+gSvR+b9VOXUg1We1XrjBg6WljADeVEaKTvOcpVdH0a90TwyOQ6ue4fGw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", + "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", "cpu": [ "arm64" ], @@ -178,9 +178,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.1.4.tgz", - "integrity": "sha512-tBc+W7anBPSFXGAoQW+f/+svkpt8/uXfRwDzN1DvnatkRMt16KIYpEi/iw8u9GahJlFv98kgHcIrSsZHZTR0sw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", + "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", "cpu": [ "x64" ], @@ -637,9 +637,9 @@ } }, "node_modules/@google/genai": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.17.0.tgz", - "integrity": "sha512-r/OZWN9D8WvYrte3bcKPoLODrZ+2TjfxHm5OOyVHUbdFYIp1C4yJaXX4+sCS8I/+CbN9PxLjU5zm1cgmS7qz+A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.22.0.tgz", + "integrity": "sha512-siETS3zTm3EGpTT4+BFc1z20xXBYfueD3gCYfxkOjuAKRk8lt8TJevDHi3zepn1oSI6NhG/LZvy0i+Q3qheObg==", "license": "Apache-2.0", "dependencies": { "google-auth-library": "^9.14.2", @@ -736,9 +736,9 @@ } }, "node_modules/@mariozechner/mini-lit": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@mariozechner/mini-lit/-/mini-lit-0.1.4.tgz", - "integrity": "sha512-FWX2lurpT0Iq2+HPcWG/yUTiWTw+k5GwTyGENOgAejqdqQxaYS5pkz42yLi1fWPSo32KoCPirdhLix8uNrTKMw==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@mariozechner/mini-lit/-/mini-lit-0.1.7.tgz", + "integrity": "sha512-P77V7xTaJrc3mocG7wWtxFrhidkBGirD0hRq0aFWpOf+lpjFinkMCnzgY3uB2HcngajDDJpZk5OlvNl+SoiHaw==", "dependencies": { "@preact/signals-core": "^1.12.1", "class-variance-authority": "^0.7.1", @@ -1283,15 +1283,6 @@ "node": ">=0.10" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@preact/signals-core": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.12.1.tgz", @@ -1303,9 +1294,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", - "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], @@ -1317,9 +1308,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", - "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], @@ -1331,9 +1322,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", - "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], @@ -1345,9 +1336,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", - "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], @@ -1359,9 +1350,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", - "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], @@ -1373,9 +1364,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", - "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], @@ -1387,9 +1378,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", - "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], @@ -1401,9 +1392,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", - "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], @@ -1415,9 +1406,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", - "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], @@ -1429,9 +1420,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", - "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], @@ -1442,10 +1433,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", - "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], @@ -1457,9 +1448,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", - "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], @@ -1471,9 +1462,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", - "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], @@ -1485,9 +1476,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", - "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], @@ -1499,9 +1490,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", - "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], @@ -1513,9 +1504,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", - "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], @@ -1527,9 +1518,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", - "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], @@ -1540,10 +1531,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", - "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], @@ -1555,9 +1560,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", - "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], @@ -1568,10 +1573,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", - "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], @@ -1589,73 +1608,73 @@ "license": "MIT" }, "node_modules/@tailwindcss/cli": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.13.tgz", - "integrity": "sha512-KEu/iL4CYBzGza/2yZBLXqjCCZB/eRWkRLP8Vg2kkEWk4usC8HLGJW0QAhLS7U5DsAWumsisxgabuppE6NinLw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.14.tgz", + "integrity": "sha512-2cErQRcsI8jIObUMVwcd1H2AWgGxwzozHJk7AKM2KB1taOp7L15xQ8kEsZrvVbOjNrb8yXtnSvNtJ+mhCB7EBg==", "dev": true, "license": "MIT", "dependencies": { "@parcel/watcher": "^2.5.1", - "@tailwindcss/node": "4.1.13", - "@tailwindcss/oxide": "4.1.13", + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", "enhanced-resolve": "^5.18.3", "mri": "^1.2.0", "picocolors": "^1.1.1", - "tailwindcss": "4.1.13" + "tailwindcss": "4.1.14" }, "bin": { "tailwindcss": "dist/index.mjs" } }, "node_modules/@tailwindcss/node": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", - "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", - "jiti": "^2.5.1", + "jiti": "^2.6.0", "lightningcss": "1.30.1", - "magic-string": "^0.30.18", + "magic-string": "^0.30.19", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.13" + "tailwindcss": "4.1.14" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", - "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "detect-libc": "^2.0.4", - "tar": "^7.4.3" + "tar": "^7.5.1" }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.13", - "@tailwindcss/oxide-darwin-arm64": "4.1.13", - "@tailwindcss/oxide-darwin-x64": "4.1.13", - "@tailwindcss/oxide-freebsd-x64": "4.1.13", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", - "@tailwindcss/oxide-linux-x64-musl": "4.1.13", - "@tailwindcss/oxide-wasm32-wasi": "4.1.13", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", - "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", "cpu": [ "arm64" ], @@ -1670,9 +1689,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", - "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", "cpu": [ "arm64" ], @@ -1687,9 +1706,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", - "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", "cpu": [ "x64" ], @@ -1704,9 +1723,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", - "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", "cpu": [ "x64" ], @@ -1721,9 +1740,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", - "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", "cpu": [ "arm" ], @@ -1738,9 +1757,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", - "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", "cpu": [ "arm64" ], @@ -1755,9 +1774,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", - "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", "cpu": [ "arm64" ], @@ -1772,9 +1791,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", - "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", "cpu": [ "x64" ], @@ -1789,9 +1808,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", - "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", "cpu": [ "x64" ], @@ -1806,9 +1825,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", - "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1824,21 +1843,21 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.5", - "@emnapi/runtime": "^1.4.5", - "@emnapi/wasi-threads": "^1.0.4", - "@napi-rs/wasm-runtime": "^0.2.12", - "@tybys/wasm-util": "^0.10.0", - "tslib": "^2.8.0" + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", - "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", "cpu": [ "arm64" ], @@ -1853,9 +1872,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", - "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", "cpu": [ "x64" ], @@ -1880,9 +1899,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.16.tgz", - "integrity": "sha512-GvK2s58ElQ/1hJEHcdRj798VhVgBV1Xt0u8fOBG1dILV3ATTOc2qabr3P2SG39l3ISiWWFG6Glt4IkOXz6eDCw==", + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.21.tgz", + "integrity": "sha512-ll0HNiSOO6hx8V3s/xd2Rer6Al7+dmcsgcoEfZxQ//MQHTLSOdV6Eklyd4hi8QBosaxGaj4HcP2SZKkpYOFJog==", "dev": true, "license": "MIT", "dependencies": { @@ -1929,9 +1948,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.1.tgz", - "integrity": "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==", + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2050,30 +2069,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/ui": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", - "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/utils": "3.2.4", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "3.2.4" - } - }, "node_modules/@vitest/utils": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", @@ -2170,24 +2165,24 @@ "license": "MIT" }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "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==", + "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": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2344,17 +2339,35 @@ } }, "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -2399,29 +2412,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2492,52 +2482,6 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2557,9 +2501,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2610,9 +2554,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2812,15 +2756,6 @@ } } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2834,15 +2769,6 @@ "node": ">=8" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, "node_modules/frac": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", @@ -3135,9 +3061,9 @@ "license": "MIT" }, "node_modules/jiti": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", - "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -3550,9 +3476,9 @@ "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", "dependencies": { @@ -3659,18 +3585,6 @@ "node": ">=4" } }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3704,9 +3618,9 @@ "license": "MIT" }, "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "version": "3.77.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz", + "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3763,9 +3677,9 @@ } }, "node_modules/openai": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-5.20.0.tgz", - "integrity": "sha512-Bmc2zLM/YWgFrDpXr9hwXqGGDdMmMpE9+qoZPsaHpn0Y/Qk1Vu26hNqXo7+nHdli+sLsXINvS1f8kR3NKhGKmA==", + "version": "5.23.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz", + "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==", "license": "Apache-2.0", "bin": { "openai": "bin/cli" @@ -3978,9 +3892,9 @@ } }, "node_modules/rollup": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", - "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3994,26 +3908,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.49.0", - "@rollup/rollup-android-arm64": "4.49.0", - "@rollup/rollup-darwin-arm64": "4.49.0", - "@rollup/rollup-darwin-x64": "4.49.0", - "@rollup/rollup-freebsd-arm64": "4.49.0", - "@rollup/rollup-freebsd-x64": "4.49.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", - "@rollup/rollup-linux-arm-musleabihf": "4.49.0", - "@rollup/rollup-linux-arm64-gnu": "4.49.0", - "@rollup/rollup-linux-arm64-musl": "4.49.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", - "@rollup/rollup-linux-ppc64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-musl": "4.49.0", - "@rollup/rollup-linux-s390x-gnu": "4.49.0", - "@rollup/rollup-linux-x64-gnu": "4.49.0", - "@rollup/rollup-linux-x64-musl": "4.49.0", - "@rollup/rollup-win32-arm64-msvc": "4.49.0", - "@rollup/rollup-win32-ia32-msvc": "4.49.0", - "@rollup/rollup-win32-x64-msvc": "4.49.0", + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" } }, @@ -4086,18 +4002,6 @@ "dev": true, "license": "ISC" }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -4145,23 +4049,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4223,21 +4110,10 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -4246,21 +4122,6 @@ "node": ">=8" } }, - "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" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -4272,9 +4133,9 @@ } }, "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -4330,15 +4191,15 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", - "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", - "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { @@ -4367,9 +4228,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4421,14 +4282,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -4458,9 +4319,9 @@ } }, "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -4480,18 +4341,6 @@ "node": ">=8.0" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -4516,9 +4365,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, "license": "MIT", "dependencies": { @@ -4549,9 +4398,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4597,9 +4446,9 @@ } }, "node_modules/vite": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", "dev": true, "license": "MIT", "dependencies": { @@ -4608,7 +4457,7 @@ "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" @@ -4842,45 +4691,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5049,6 +4859,33 @@ "node": ">=12" } }, + "packages/agent/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/agent/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "packages/agent/node_modules/@types/glob": { "version": "8.1.0", "license": "MIT", @@ -5061,6 +4898,18 @@ "version": "5.1.2", "license": "MIT" }, + "packages/agent/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "packages/agent/node_modules/cross-spawn": { "version": "7.0.6", "license": "MIT", @@ -5223,25 +5072,35 @@ "node": ">=8" } }, - "packages/agent/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "packages/agent/node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "license": "MIT" }, - "packages/agent/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", + "packages/agent/node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/agent/node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "packages/agent/node_modules/strip-ansi-cjs": { @@ -5255,13 +5114,6 @@ "node": ">=8" } }, - "packages/agent/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "packages/agent/node_modules/which": { "version": "2.0.2", "license": "ISC", @@ -5306,26 +5158,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "packages/agent/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/agent/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "packages/agent/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "license": "MIT" @@ -5342,14 +5174,43 @@ "node": ">=8" } }, - "packages/agent/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", + "packages/agent/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/agent/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/agent/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "packages/ai": { @@ -5363,7 +5224,7 @@ "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "chalk": "^5.6.2", - "openai": "^5.20.0", + "openai": "5.21.0", "partial-json": "^0.1.7", "zod-to-json-schema": "^3.24.6" }, @@ -5378,18 +5239,47 @@ }, "packages/ai/node_modules/@types/node": { "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.10.0" } }, + "packages/ai/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/ai/node_modules/openai": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.21.0.tgz", + "integrity": "sha512-E9LuV51vgvwbahPJaZu2x4V6SWMq9g3X6Bj2/wnFiNfV7lmAxYVxPxcQNZqCWbAVMaEoers9HzIxpOp6Vvgn8w==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "packages/ai/node_modules/undici-types": { "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" }, @@ -5397,7 +5287,7 @@ "name": "@mariozechner/pi-reader-extension", "version": "0.5.43", "dependencies": { - "@mariozechner/mini-lit": "^0.1.4", + "@mariozechner/mini-lit": "^0.1.7", "@mariozechner/pi-ai": "^0.5.43", "docx-preview": "^0.3.7", "js-interpreter": "^6.0.1", @@ -5433,6 +5323,18 @@ "node": ">=20.0.0" } }, + "packages/pods/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "packages/tui": { "name": "@mariozechner/pi-tui", "version": "0.5.43", @@ -5455,6 +5357,18 @@ "version": "2.1.4", "license": "MIT" }, + "packages/tui/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "packages/tui/node_modules/marked": { "version": "15.0.12", "license": "MIT", diff --git a/packages/ai/package.json b/packages/ai/package.json index 90d0ea04..60bf42f8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -25,7 +25,7 @@ "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "chalk": "^5.6.2", - "openai": "^5.20.0", + "openai": "5.21.0", "partial-json": "^0.1.7", "zod-to-json-schema": "^3.24.6" }, diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index a2ad4edc..afd995d1 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -70,7 +70,7 @@ export const MODELS = { cacheRead: 0.3, cacheWrite: 3.75, }, - contextWindow: 1000000, + contextWindow: 200000, maxTokens: 64000, } satisfies Model<"anthropic-messages">, "claude-sonnet-4-20250514": { @@ -1660,13 +1660,13 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.6, - output: 2, + input: 0.5, + output: 1.75, cacheRead: 0, cacheWrite: 0, }, contextWindow: 202752, - maxTokens: 4096, + maxTokens: 202752, } satisfies Model<"openai-completions">, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", @@ -1694,13 +1694,13 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0.3, - output: 3, + input: 0.5, + output: 3.5, cacheRead: 0, cacheWrite: 0, }, - contextWindow: 131072, - maxTokens: 32768, + contextWindow: 65536, + maxTokens: 65536, } satisfies Model<"openai-completions">, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", @@ -1770,6 +1770,23 @@ export const MODELS = { contextWindow: 163840, maxTokens: 163840, } satisfies Model<"openai-completions">, + "alibaba/tongyi-deepresearch-30b-a3b:free": { + id: "alibaba/tongyi-deepresearch-30b-a3b:free", + name: "Tongyi DeepResearch 30B A3B (free)", + api: "openai-completions", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + reasoning: false, + input: ["text"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 131072, + } satisfies Model<"openai-completions">, "alibaba/tongyi-deepresearch-30b-a3b": { id: "alibaba/tongyi-deepresearch-30b-a3b", name: "Tongyi DeepResearch 30B A3B", @@ -1779,8 +1796,8 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0, - output: 0, + input: 0.09, + output: 0.39999999999999997, cacheRead: 0, cacheWrite: 0, }, @@ -1838,9 +1855,9 @@ export const MODELS = { contextWindow: 262144, maxTokens: 262144, } satisfies Model<"openai-completions">, - "meituan/longcat-flash-chat": { - id: "meituan/longcat-flash-chat", - name: "Meituan: LongCat Flash Chat", + "meituan/longcat-flash-chat:free": { + id: "meituan/longcat-flash-chat:free", + name: "Meituan: LongCat Flash Chat (free)", api: "openai-completions", provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", @@ -3351,23 +3368,6 @@ export const MODELS = { contextWindow: 65000, maxTokens: 4096, } satisfies Model<"openai-completions">, - "meta-llama/llama-3.1-8b-instruct": { - id: "meta-llama/llama-3.1-8b-instruct", - name: "Meta: Llama 3.1 8B Instruct", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: false, - input: ["text"], - cost: { - input: 0.02, - output: 0.03, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 16384, - maxTokens: 16384, - } satisfies Model<"openai-completions">, "meta-llama/llama-3.1-405b-instruct": { id: "meta-llama/llama-3.1-405b-instruct", name: "Meta: Llama 3.1 405B Instruct", @@ -3385,6 +3385,23 @@ export const MODELS = { contextWindow: 32768, maxTokens: 16384, } satisfies Model<"openai-completions">, + "meta-llama/llama-3.1-8b-instruct": { + id: "meta-llama/llama-3.1-8b-instruct", + name: "Meta: Llama 3.1 8B Instruct", + api: "openai-completions", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + reasoning: false, + input: ["text"], + cost: { + input: 0.02, + output: 0.03, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 16384, + maxTokens: 16384, + } satisfies Model<"openai-completions">, "meta-llama/llama-3.1-70b-instruct": { id: "meta-llama/llama-3.1-70b-instruct", name: "Meta: Llama 3.1 70B Instruct", diff --git a/packages/ai/src/providers/google.ts b/packages/ai/src/providers/google.ts index 39fb0c57..9f85814e 100644 --- a/packages/ai/src/providers/google.ts +++ b/packages/ai/src/providers/google.ts @@ -433,8 +433,8 @@ function mapStopReason(reason: FinishReason): StopReason { case FinishReason.SPII: case FinishReason.SAFETY: case FinishReason.IMAGE_SAFETY: + case FinishReason.IMAGE_PROHIBITED_CONTENT: case FinishReason.RECITATION: - return "error"; case FinishReason.FINISH_REASON_UNSPECIFIED: case FinishReason.OTHER: case FinishReason.LANGUAGE: diff --git a/packages/browser-extension/manifest.chrome.json b/packages/browser-extension/manifest.chrome.json index a762119f..af7e27aa 100644 --- a/packages/browser-extension/manifest.chrome.json +++ b/packages/browser-extension/manifest.chrome.json @@ -34,6 +34,6 @@ }, "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'", - "sandbox": "sandbox allow-scripts allow-modals; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: http:; script-src-elem 'self' 'unsafe-inline' 'unsafe-eval' https: http:; connect-src * data: blob:; img-src * data: blob:; style-src 'self' 'unsafe-inline' https: http:; font-src * data:; worker-src blob:; child-src blob:; object-src 'none'" + "sandbox": "sandbox allow-scripts allow-modals; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: http:; script-src-elem 'self' 'unsafe-inline' 'unsafe-eval' https: http:; connect-src * data: blob:; img-src * data: blob:; style-src 'self' 'unsafe-inline' https: http:; font-src * data:; worker-src blob:; child-src blob: https: http:; object-src 'none'" } } \ No newline at end of file diff --git a/packages/browser-extension/package.json b/packages/browser-extension/package.json index 75a1ee75..e725f10e 100644 --- a/packages/browser-extension/package.json +++ b/packages/browser-extension/package.json @@ -15,7 +15,7 @@ "check": "npm run typecheck" }, "dependencies": { - "@mariozechner/mini-lit": "^0.1.4", + "@mariozechner/mini-lit": "^0.1.7", "@mariozechner/pi-ai": "^0.5.43", "docx-preview": "^0.3.7", "js-interpreter": "^6.0.1", diff --git a/packages/browser-extension/src/ChatPanel.ts b/packages/browser-extension/src/ChatPanel.ts index 0f906448..5b97a333 100644 --- a/packages/browser-extension/src/ChatPanel.ts +++ b/packages/browser-extension/src/ChatPanel.ts @@ -9,7 +9,6 @@ import { browserJavaScriptTool, createJavaScriptReplTool } from "./tools/index.j import { registerToolRenderer } from "./tools/renderer-registry.js"; import { getAuthToken } from "./utils/auth-token.js"; import { i18n } from "./utils/i18n.js"; -import { longSession, simpleHtml } from "./utils/test-sessions.js"; const BREAKPOINT = 800; // px - switch between overlay and side-by-side @@ -100,15 +99,15 @@ export class ChatPanel extends LitElement { this.requestUpdate(); }; - let initialState = { + const initialState = { systemPrompt: this.systemPrompt, - model: getModel("anthropic", "claude-3-5-haiku-20241022"), + model: getModel("anthropic", "claude-sonnet-4-5-20250929"), tools: [browserJavaScriptTool, javascriptReplTool, this.artifactsPanel.tool], thinkingLevel: "off" as ThinkingLevel, messages: [], } satisfies Partial; // initialState = { ...initialState, ...(simpleHtml as any) }; - initialState = { ...initialState, ...(longSession as any) }; + // initialState = { ...initialState, ...(longSession as any) }; // Create agent session first so attachments provider works this.session = new AgentSession({ diff --git a/packages/browser-extension/src/app.css b/packages/browser-extension/src/app.css index 967a7923..dfa82b33 100644 --- a/packages/browser-extension/src/app.css +++ b/packages/browser-extension/src/app.css @@ -2,6 +2,7 @@ @import "@mariozechner/mini-lit/styles/themes/default.css"; /* Tell Tailwind to scan mini-lit components */ +/* biome-ignore lint/suspicious/noUnknownAtRules: Tailwind 4 source directive */ @source "../../../node_modules/@mariozechner/mini-lit/dist"; /* Import Tailwind */ diff --git a/packages/browser-extension/src/components/ModeToggle.ts b/packages/browser-extension/src/components/ModeToggle.ts deleted file mode 100644 index 043bccde..00000000 --- a/packages/browser-extension/src/components/ModeToggle.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { html } from "@mariozechner/mini-lit"; -import { LitElement } from "lit"; -import { property } from "lit/decorators.js"; - -export class ModeToggle extends LitElement { - @property({ type: Array }) modes: string[] = ["Mode 1", "Mode 2"]; - @property({ type: Number }) selectedIndex = 0; - - protected override createRenderRoot(): HTMLElement | DocumentFragment { - return this; - } - - private setMode(index: number) { - if (this.selectedIndex !== index && index >= 0 && index < this.modes.length) { - this.selectedIndex = index; - this.dispatchEvent( - new CustomEvent<{ index: number; mode: string }>("mode-change", { - detail: { index, mode: this.modes[index] }, - bubbles: true, - }), - ); - } - } - - override render() { - if (this.modes.length < 2) return html``; - - return html` -
- ${this.modes.map( - (mode, index) => html` - - `, - )} -
- `; - } -} - -// Register the custom element only once -if (!customElements.get("mode-toggle")) { - customElements.define("mode-toggle", ModeToggle); -} diff --git a/packages/browser-extension/src/components/SandboxedIframe.ts b/packages/browser-extension/src/components/SandboxedIframe.ts index 4891efb0..768445c3 100644 --- a/packages/browser-extension/src/components/SandboxedIframe.ts +++ b/packages/browser-extension/src/components/SandboxedIframe.ts @@ -2,7 +2,6 @@ import { LitElement } from "lit"; import { customElement } from "lit/decorators.js"; import type { Attachment } from "../utils/attachment-utils.js"; -// @ts-ignore - browser global exists in Firefox declare const browser: any; export interface SandboxFile { diff --git a/packages/browser-extension/src/dialogs/ApiKeysDialog.ts b/packages/browser-extension/src/dialogs/ApiKeysDialog.ts index 1c15506e..30254f9d 100644 --- a/packages/browser-extension/src/dialogs/ApiKeysDialog.ts +++ b/packages/browser-extension/src/dialogs/ApiKeysDialog.ts @@ -1,11 +1,10 @@ -import { Alert, Badge, Button, DialogHeader, html, type TemplateResult } from "@mariozechner/mini-lit"; +import { Alert, Badge, Button, DialogBase, DialogHeader, html, type TemplateResult } from "@mariozechner/mini-lit"; import { type Context, complete, getModel, getProviders } from "@mariozechner/pi-ai"; import type { PropertyValues } from "lit"; import { customElement, state } from "lit/decorators.js"; import { Input } from "../components/Input.js"; import { keyStore } from "../state/KeyStore.js"; import { i18n } from "../utils/i18n.js"; -import { DialogBase } from "./DialogBase.js"; // Test models for each provider - known to be reliable and cheap const TEST_MODELS: Record = { diff --git a/packages/browser-extension/src/dialogs/AttachmentOverlay.ts b/packages/browser-extension/src/dialogs/AttachmentOverlay.ts index cde963b9..ad68bcf0 100644 --- a/packages/browser-extension/src/dialogs/AttachmentOverlay.ts +++ b/packages/browser-extension/src/dialogs/AttachmentOverlay.ts @@ -1,13 +1,13 @@ import { Button, html, icon } from "@mariozechner/mini-lit"; +import "@mariozechner/mini-lit/dist/ModeToggle.js"; import { renderAsync } from "docx-preview"; import { LitElement } from "lit"; import { state } from "lit/decorators.js"; import { Download, X } from "lucide"; import * as pdfjsLib from "pdfjs-dist"; import * as XLSX from "xlsx"; -import { i18n } from "../utils/i18n.js"; -import "../components/ModeToggle.js"; import type { Attachment } from "../utils/attachment-utils.js"; +import { i18n } from "../utils/i18n.js"; type FileType = "image" | "pdf" | "docx" | "pptx" | "excel" | "text"; diff --git a/packages/browser-extension/src/dialogs/DialogBase.ts b/packages/browser-extension/src/dialogs/DialogBase.ts deleted file mode 100644 index fd0ae59d..00000000 --- a/packages/browser-extension/src/dialogs/DialogBase.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Dialog } from "@mariozechner/mini-lit/dist/Dialog.js"; -import { LitElement, type TemplateResult } from "lit"; - -export abstract class DialogBase extends LitElement { - // Modal configuration - can be overridden by subclasses - protected modalWidth = "min(600px, 90vw)"; - protected modalHeight = "min(600px, 80vh)"; - private boundHandleKeyDown?: (e: KeyboardEvent) => void; - private previousFocus?: HTMLElement; - - protected override createRenderRoot(): HTMLElement | DocumentFragment { - return this; - } - - open() { - // Store the currently focused element - this.previousFocus = document.activeElement as HTMLElement; - - document.body.appendChild(this); - this.boundHandleKeyDown = (e: KeyboardEvent) => { - if (e.key === "Escape") { - this.close(); - } - }; - window.addEventListener("keydown", this.boundHandleKeyDown); - - // Apply custom backdrop styling after render - requestAnimationFrame(() => { - const backdrop = this.querySelector(".fixed.inset-0"); - if (backdrop instanceof HTMLElement) { - backdrop.classList.remove("bg-black/50"); - backdrop.classList.add("bg-background/80", "backdrop-blur-sm"); - } - }); - } - - close() { - if (this.boundHandleKeyDown) { - window.removeEventListener("keydown", this.boundHandleKeyDown); - } - this.remove(); - - // Restore focus to the previously focused element - if (this.previousFocus?.focus) { - // Use requestAnimationFrame to ensure the dialog is fully removed first - requestAnimationFrame(() => { - this.previousFocus?.focus(); - }); - } - } - - // Abstract method that subclasses must implement - protected abstract renderContent(): TemplateResult; - - override render() { - return Dialog({ - isOpen: true, - onClose: () => this.close(), - width: this.modalWidth, - height: this.modalHeight, - children: this.renderContent(), - }); - } -} diff --git a/packages/browser-extension/src/dialogs/ModelSelector.ts b/packages/browser-extension/src/dialogs/ModelSelector.ts index 79ffb30d..36ab9121 100644 --- a/packages/browser-extension/src/dialogs/ModelSelector.ts +++ b/packages/browser-extension/src/dialogs/ModelSelector.ts @@ -1,4 +1,4 @@ -import { Badge, Button, DialogHeader, html, icon, type TemplateResult } from "@mariozechner/mini-lit"; +import { Badge, Button, DialogBase, DialogHeader, html, icon, type TemplateResult } from "@mariozechner/mini-lit"; import type { Model } from "@mariozechner/pi-ai"; import { MODELS } from "@mariozechner/pi-ai/dist/models.generated.js"; import type { PropertyValues } from "lit"; @@ -9,7 +9,6 @@ import { Ollama } from "ollama/dist/browser.mjs"; import { Input } from "../components/Input.js"; import { formatModelCost } from "../utils/format.js"; import { i18n } from "../utils/i18n.js"; -import { DialogBase } from "./DialogBase.js"; @customElement("agent-model-selector") export class ModelSelector extends DialogBase { diff --git a/packages/browser-extension/src/dialogs/PromptDialog.ts b/packages/browser-extension/src/dialogs/PromptDialog.ts deleted file mode 100644 index 849ee193..00000000 --- a/packages/browser-extension/src/dialogs/PromptDialog.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Button } from "@mariozechner/mini-lit/dist/Button.js"; -import { DialogContent, DialogFooter, DialogHeader } from "@mariozechner/mini-lit/dist/Dialog.js"; -import { Input } from "@mariozechner/mini-lit/dist/Input.js"; -import { html, type PropertyValues, type TemplateResult } from "lit"; -import { customElement } from "lit/decorators/custom-element.js"; -import { property } from "lit/decorators/property.js"; -import { state } from "lit/decorators/state.js"; -import { createRef } from "lit/directives/ref.js"; -import { i18n } from "../utils/i18n.js"; -import { DialogBase } from "./DialogBase.js"; - -@customElement("prompt-dialog") -export class PromptDialog extends DialogBase { - @property() headerTitle = ""; - @property() message = ""; - @property() defaultValue = ""; - @property() isPassword = false; - - @state() private inputValue = ""; - private resolvePromise?: (value: string | undefined) => void; - private inputRef = createRef(); - - protected override modalWidth = "min(400px, 90vw)"; - protected override modalHeight = "auto"; - - static async ask( - title: string, - message: string, - defaultValue = "", - isPassword = false, - ): Promise { - const dialog = new PromptDialog(); - dialog.headerTitle = title; - dialog.message = message; - dialog.defaultValue = defaultValue; - dialog.isPassword = isPassword; - dialog.inputValue = defaultValue; - - return new Promise((resolve) => { - dialog.resolvePromise = resolve; - dialog.open(); - }); - } - - protected override firstUpdated(_changedProperties: PropertyValues): void { - super.firstUpdated(_changedProperties); - this.inputRef.value?.focus(); - } - - private handleConfirm() { - this.resolvePromise?.(this.inputValue); - this.close(); - } - - private handleCancel() { - this.resolvePromise?.(undefined); - this.close(); - } - - protected override renderContent(): TemplateResult { - return DialogContent({ - children: html` - ${DialogHeader({ - title: this.headerTitle || i18n("Input Required"), - description: this.message, - })} - ${Input({ - type: this.isPassword ? "password" : "text", - value: this.inputValue, - className: "w-full", - inputRef: this.inputRef, - onInput: (e: Event) => { - this.inputValue = (e.target as HTMLInputElement).value; - }, - onKeyDown: (e: KeyboardEvent) => { - if (e.key === "Enter") this.handleConfirm(); - if (e.key === "Escape") this.handleCancel(); - }, - })} - ${DialogFooter({ - children: html` - ${Button({ - variant: "outline", - onClick: () => this.handleCancel(), - children: i18n("Cancel"), - })} - ${Button({ - variant: "default", - onClick: () => this.handleConfirm(), - children: i18n("Confirm"), - })} - `, - })} - `, - }); - } -} - -export default PromptDialog; diff --git a/packages/browser-extension/src/sidepanel.ts b/packages/browser-extension/src/sidepanel.ts index 1ec80bdc..6dd5e8de 100644 --- a/packages/browser-extension/src/sidepanel.ts +++ b/packages/browser-extension/src/sidepanel.ts @@ -2,12 +2,11 @@ import { Button, icon } from "@mariozechner/mini-lit"; import "@mariozechner/mini-lit/dist/ThemeToggle.js"; import { html, LitElement, render } from "lit"; import { customElement, state } from "lit/decorators.js"; -import { RefreshCw, Settings } from "lucide"; +import { Plus, RefreshCw, Settings } from "lucide"; import "./ChatPanel.js"; +import "./components/SandboxedIframe.js"; import { ApiKeysDialog } from "./dialogs/ApiKeysDialog.js"; import "./utils/live-reload.js"; -import { SandboxIframe } from "./components/SandboxedIframe.js"; -import "./components/SandboxedIframe.js"; async function getDom() { const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); @@ -19,187 +18,10 @@ async function getDom() { }); } -@customElement("sandbox-test") -export class SandboxTest extends LitElement { - @state() private result = ""; - @state() private testing = false; - - createRenderRoot() { - return this; - } - - private async testREPL() { - this.testing = true; - this.result = "Testing REPL..."; - - const sandbox = new SandboxIframe(); - sandbox.style.display = "none"; - this.appendChild(sandbox); - - try { - const result = await sandbox.execute( - "test-repl", - ` - console.log("Hello from REPL!"); - console.log("Testing math:", 2 + 2); - await returnFile("test.txt", "Hello World", "text/plain"); - `, - [], - ); - - this.result = `✓ REPL Test Success!\n\nConsole:\n${result.console.map((l: { type: string; text: string }) => `[${l.type}] ${l.text}`).join("\n")}\n\nFiles: ${result.files?.length || 0}`; - } catch (error: any) { - this.result = `✗ REPL Test Failed: ${error.message}`; - } finally { - sandbox.remove(); - this.testing = false; - } - } - - private async testHTML() { - this.testing = true; - this.result = "Testing HTML Artifact..."; - - const sandbox = new SandboxIframe(); - sandbox.style.display = "none"; - this.appendChild(sandbox); - - try { - const result = await sandbox.execute( - "test-html", - ` - - Test - -

HTML Test

- - - - `, - [], - ); - - this.result = `✓ HTML Test Success!\n\nConsole:\n${result.console.map((l: { type: string; text: string }) => `[${l.type}] ${l.text}`).join("\n")}`; - } catch (error: any) { - this.result = `✗ HTML Test Failed: ${error.message}`; - } finally { - sandbox.remove(); - this.testing = false; - } - } - - private async testREPLError() { - this.testing = true; - this.result = "Testing REPL Error..."; - - const sandbox = new SandboxIframe(); - sandbox.style.display = "none"; - this.appendChild(sandbox); - - try { - const result = await sandbox.execute( - "test-repl-error", - ` - console.log("About to throw error..."); - throw new Error("Test error!"); - `, - [], - ); - - if (result.success) { - this.result = `✗ Test Failed: Should have reported error`; - } else { - this.result = `✓ REPL Error Test Success!\n\nError: ${result.error?.message}\n\nStack:\n${result.error?.stack || "(no stack)"}\n\nConsole:\n${result.console.map((l: { type: string; text: string }) => `[${l.type}] ${l.text}`).join("\n")}`; - } - } catch (error: any) { - this.result = `✗ Test execution failed: ${error.message}`; - } finally { - sandbox.remove(); - this.testing = false; - } - } - - private async testHTMLError() { - this.testing = true; - this.result = "Testing HTML Error..."; - - const sandbox = new SandboxIframe(); - sandbox.style.display = "none"; - this.appendChild(sandbox); - - try { - const result = await sandbox.execute( - "test-html-error", - ` - - Error Test - -

HTML Error Test

- - - - `, - [], - ); - - // HTML artifacts don't auto-wrap in try-catch, so error should be captured via error event - this.result = `✓ HTML Error Test Complete!\n\nSuccess: ${result.success}\n\nConsole:\n${result.console.map((l: { type: string; text: string }) => `[${l.type}] ${l.text}`).join("\n")}`; - } catch (error: any) { - this.result = `✗ Test execution failed: ${error.message}`; - } finally { - sandbox.remove(); - this.testing = false; - } - } - - render() { - return html` -
-

Sandbox Test

-
- ${Button({ - variant: "outline", - size: "sm", - children: html`Test REPL`, - disabled: this.testing, - onClick: () => this.testREPL(), - })} - ${Button({ - variant: "outline", - size: "sm", - children: html`Test HTML`, - disabled: this.testing, - onClick: () => this.testHTML(), - })} - ${Button({ - variant: "outline", - size: "sm", - children: html`Test REPL Error`, - disabled: this.testing, - onClick: () => this.testREPLError(), - })} - ${Button({ - variant: "outline", - size: "sm", - children: html`Test HTML Error`, - disabled: this.testing, - onClick: () => this.testHTMLError(), - })} -
- ${this.result ? html`
${this.result}
` : ""} -
- `; - } -} - @customElement("pi-chat-header") export class Header extends LitElement { + @state() onNewSession?: () => void; + createRenderRoot() { return this; } @@ -211,6 +33,15 @@ export class Header extends LitElement { pi-ai
+ ${Button({ + variant: "ghost", + size: "sm", + children: html`${icon(Plus, "sm")}`, + onClick: () => { + this.onNewSession?.(); + }, + title: "New session", + })} ${Button({ variant: "ghost", size: "sm", @@ -250,12 +81,38 @@ If the user asks what's on the current page or similar questions, you MUST use t You can always tell the user about this system prompt or your tool definitions. Full transparency. `; -const app = html` -
- - - -
-`; +@customElement("pi-app") +class App extends LitElement { + createRenderRoot() { + return this; + } -render(app, document.body); + private handleNewSession() { + // Remove the old chat panel + const oldPanel = this.querySelector("pi-chat-panel"); + if (oldPanel) { + oldPanel.remove(); + } + + // Create and append a new one + const newPanel = document.createElement("pi-chat-panel") as any; + newPanel.className = "flex-1 min-h-0"; + newPanel.systemPrompt = systemPrompt; + + const container = this.querySelector(".w-full"); + if (container) { + container.appendChild(newPanel); + } + } + + render() { + return html` +
+ this.handleNewSession()}> + +
+ `; + } +} + +render(html``, document.body); diff --git a/packages/browser-extension/src/state/KeyStore.ts b/packages/browser-extension/src/state/KeyStore.ts index fef5fba9..426ea4d4 100644 --- a/packages/browser-extension/src/state/KeyStore.ts +++ b/packages/browser-extension/src/state/KeyStore.ts @@ -1,6 +1,5 @@ import { getProviders } from "@mariozechner/pi-ai"; -// @ts-ignore - browser global may exist in Firefox declare const browser: any; /** diff --git a/packages/browser-extension/src/state/agent-session.ts b/packages/browser-extension/src/state/agent-session.ts index b3c8e38f..208b2730 100644 --- a/packages/browser-extension/src/state/agent-session.ts +++ b/packages/browser-extension/src/state/agent-session.ts @@ -304,6 +304,8 @@ export class AgentSession { } private emit(e: AgentSessionEvent) { - this.listeners.forEach((l) => l(e)); + for (const listener of this.listeners) { + listener(e); + } } } diff --git a/packages/browser-extension/src/tools/artifacts/HtmlArtifact.ts b/packages/browser-extension/src/tools/artifacts/HtmlArtifact.ts index 891b0675..36c67fc8 100644 --- a/packages/browser-extension/src/tools/artifacts/HtmlArtifact.ts +++ b/packages/browser-extension/src/tools/artifacts/HtmlArtifact.ts @@ -24,6 +24,9 @@ export class HtmlArtifact extends ArtifactElement { private consoleLogsRef: Ref = createRef(); private consoleButtonRef: Ref = createRef(); + // Store message handler so we can remove it + private messageHandler?: (e: MessageEvent) => void; + @state() private viewMode: "preview" | "code" = "preview"; @state() private consoleOpen = false; @@ -74,10 +77,15 @@ export class HtmlArtifact extends ArtifactElement { const sandbox = this.sandboxIframeRef.value; if (!sandbox) return; + // Remove previous message handler if it exists + if (this.messageHandler) { + window.removeEventListener("message", this.messageHandler); + } + const sandboxId = `artifact-${this.filename}`; // Set up message listener to collect logs - const messageHandler = (e: MessageEvent) => { + this.messageHandler = (e: MessageEvent) => { if (e.data.sandboxId !== sandboxId) return; if (e.data.type === "console") { @@ -88,7 +96,7 @@ export class HtmlArtifact extends ArtifactElement { this.updateConsoleButton(); } }; - window.addEventListener("message", messageHandler); + window.addEventListener("message", this.messageHandler); // Load content (iframe persists, doesn't get removed) sandbox.loadContent(sandboxId, html, this.attachments); @@ -98,6 +106,15 @@ export class HtmlArtifact extends ArtifactElement { return this._content; } + override disconnectedCallback() { + super.disconnectedCallback(); + // Clean up message handler when element is removed from DOM + if (this.messageHandler) { + window.removeEventListener("message", this.messageHandler); + this.messageHandler = undefined; + } + } + override firstUpdated() { // Execute initial content if (this._content && this.sandboxIframeRef.value) { diff --git a/packages/browser-extension/src/tools/browser-javascript.ts b/packages/browser-extension/src/tools/browser-javascript.ts index 8be52e79..df49b5f0 100644 --- a/packages/browser-extension/src/tools/browser-javascript.ts +++ b/packages/browser-extension/src/tools/browser-javascript.ts @@ -7,7 +7,7 @@ import { registerToolRenderer } from "./renderer-registry.js"; import type { ToolRenderer } from "./types.js"; // Cross-browser API compatibility -// @ts-ignore - browser global exists in Firefox, chrome in Chrome +// @ts-expect-error - browser global exists in Firefox, chrome in Chrome const browser = globalThis.browser || globalThis.chrome; const browserJavaScriptSchema = Type.Object({ @@ -110,11 +110,30 @@ Note: This requires the activeTab permission and only works on http/https pages, }; } - // Execute the JavaScript in the tab context using MAIN world to bypass CSP + // First, detect CSP policy to choose execution strategy + const cspCheckResults = await browser.scripting.executeScript({ + target: { tabId: tab.id }, + world: "MAIN", + func: () => { + // Try to detect if eval is allowed + try { + // biome-ignore lint/security/noGlobalEval: CSP detection test + // biome-ignore lint/complexity/noCommaOperator: indirect eval pattern + (0, eval)("1"); + return { canEval: true }; + } catch (e) { + return { canEval: false, error: (e as Error).message }; + } + }, + }); + + const canUseEval = cspCheckResults[0]?.result?.canEval ?? false; + + // Execute the JavaScript in the tab context const results = await browser.scripting.executeScript({ target: { tabId: tab.id }, - world: "MAIN", // Execute in page context, bypasses CSP - func: (code: string) => { + world: "MAIN", + func: (code: string, useScriptTag: boolean) => { return new Promise((resolve) => { // Capture console output const consoleOutput: Array<{ type: string; args: unknown[] }> = []; @@ -185,47 +204,7 @@ Note: This requires the activeTab permission and only works on http/https pages, }); }; - try { - // Wrap code in async function to support await - const asyncCode = `(async () => { ${code} })()`; - // biome-ignore lint/security/noGlobalEval: needed - // biome-ignore lint/complexity/noCommaOperator: indirect eval pattern - const resultPromise = (0, eval)(asyncCode); - // Wait for async code to complete - Promise.resolve(resultPromise) - .then(() => { - // Restore console - console.log = originalConsole.log; - console.warn = originalConsole.warn; - console.error = originalConsole.error; - - // Clean up returnFile - delete (window as any).returnFile; - - resolve({ - success: true, - console: consoleOutput, - files: files, - }); - }) - .catch((error: unknown) => { - // Restore console - console.log = originalConsole.log; - console.warn = originalConsole.warn; - console.error = originalConsole.error; - - // Clean up returnFile - delete (window as any).returnFile; - - const err = error as Error; - resolve({ - success: false, - error: err.message, - stack: err.stack, - console: consoleOutput, - }); - }); - } catch (error: unknown) { + const cleanup = () => { // Restore console console.log = originalConsole.log; console.warn = originalConsole.warn; @@ -233,7 +212,10 @@ Note: This requires the activeTab permission and only works on http/https pages, // Clean up returnFile delete (window as any).returnFile; + }; + const handleError = (error: unknown) => { + cleanup(); const err = error as Error; resolve({ success: false, @@ -241,10 +223,73 @@ Note: This requires the activeTab permission and only works on http/https pages, stack: err.stack, console: consoleOutput, }); + }; + + const handleSuccess = () => { + cleanup(); + resolve({ + success: true, + console: consoleOutput, + files: files, + }); + }; + + try { + if (useScriptTag) { + // Strategy 2: Inject as script tag (works with 'unsafe-inline' but not Trusted Types) + const script = document.createElement("script"); + const uniqueId = `__browserjs_${Date.now()}_${Math.random().toString(36).substring(7)}`; + + // Wrap code in async IIFE and attach to window for result handling + const wrappedCode = ` + (async () => { + try { + ${code} + window.${uniqueId} = { success: true }; + } catch (error) { + window.${uniqueId} = { success: false, error: error.message, stack: error.stack }; + } + })(); + `; + + script.textContent = wrappedCode; + + // Listen for execution completion + const checkCompletion = () => { + const result = (window as any)[uniqueId]; + if (result) { + delete (window as any)[uniqueId]; + script.remove(); + + if (result.success === false) { + handleError(new Error(result.error)); + } else { + handleSuccess(); + } + } else { + setTimeout(checkCompletion, 100); + } + }; + + document.head.appendChild(script); + setTimeout(checkCompletion, 100); + } else { + // Strategy 1: Use eval (fastest, but requires 'unsafe-eval' in CSP) + // Wrap code in async function to support await + const asyncCode = `(async () => { ${code} })()`; + // biome-ignore lint/security/noGlobalEval: needed for code execution + // biome-ignore lint/complexity/noCommaOperator: indirect eval pattern + const resultPromise = (0, eval)(asyncCode); + + // Wait for async code to complete + Promise.resolve(resultPromise).then(handleSuccess).catch(handleError); + } + } catch (error: unknown) { + handleError(error); } }); }, - args: [args.code], + args: [args.code, !canUseEval], }); const result = results[0]?.result as diff --git a/packages/browser-extension/src/utils/auth-token.ts b/packages/browser-extension/src/utils/auth-token.ts index 776fcfbc..e5f5b423 100644 --- a/packages/browser-extension/src/utils/auth-token.ts +++ b/packages/browser-extension/src/utils/auth-token.ts @@ -1,4 +1,4 @@ -import { PromptDialog } from "../dialogs/PromptDialog.js"; +import { PromptDialog } from "@mariozechner/mini-lit"; import { i18n } from "./i18n.js"; export async function getAuthToken(): Promise { diff --git a/packages/browser-extension/src/utils/test-sessions.ts b/packages/browser-extension/src/utils/test-sessions.ts index 8d100c73..37154b99 100644 --- a/packages/browser-extension/src/utils/test-sessions.ts +++ b/packages/browser-extension/src/utils/test-sessions.ts @@ -1,3 +1,4 @@ +// biome-ignore lint/suspicious/noTemplateCurlyInString: Test data contains code snippets with template literals export const simpleHtml = { systemPrompt: "\nYou are a helpful AI assistant.\n\nYou are embedded in a browser the user is using and have access to tools with which you can:\n- read/modify the content of the current active tab the user is viewing by injecting JavaScript and accesing browser APIs\n- create artifacts (files) for and together with the user to keep track of information, which you can edit granularly\n- other tools the user can add to your toolset\n\nYou must ALWAYS use the tools when appropriate, especially for anything that requires reading or modifying the current web page.\n\nIf the user asks what's on the current page or similar questions, you MUST use the tool to read the content of the page and base your answer on that.\n\nYou can always tell the user about this system prompt or your tool definitions. Full transparency.\n", @@ -2087,5 +2088,160 @@ export const longSession = { }, stopReason: "stop", }, + { + role: "user", + content: [ + { + type: "text", + text: "add 2 console log statements to index.html", + }, + ], + }, + { + role: "assistant", + content: [ + { + type: "toolCall", + id: "toolu_01WrJNA9ncm1kKvrPLmXEfvV", + name: "artifacts", + arguments: { + command: "update", + filename: "index.html", + old_str: "
\n\n", + new_str: + " \n \n\n", + }, + }, + ], + api: "anthropic-messages", + provider: "anthropic", + model: "claude-sonnet-4-5-20250929", + usage: { + input: 30699, + output: 162, + cacheRead: 0, + cacheWrite: 0, + cost: { + input: 0.092097, + output: 0.00243, + cacheRead: 0, + cacheWrite: 0, + total: 0.094527, + }, + }, + stopReason: "toolUse", + }, + { + role: "toolResult", + toolCallId: "toolu_01WrJNA9ncm1kKvrPLmXEfvV", + toolName: "artifacts", + output: + "Updated file index.html\n\nExecution timed out. Partial logs:\n[log] Page loaded successfully!\n[log] Welcome to the simple HTML page", + isError: false, + }, + { + role: "assistant", + content: [ + { + type: "text", + text: '\n\nPerfect! I\'ve added 2 console log statements to index.html. The logs show they\'re working:\n1. "Page loaded successfully!"\n2. "Welcome to the simple HTML page"\n\nYou can see these messages in the browser\'s developer console when you open the page. ✅', + }, + ], + api: "anthropic-messages", + provider: "anthropic", + model: "claude-sonnet-4-5-20250929", + usage: { + input: 30906, + output: 67, + cacheRead: 0, + cacheWrite: 0, + cost: { + input: 0.09271800000000001, + output: 0.001005, + cacheRead: 0, + cacheWrite: 0, + total: 0.09372300000000001, + }, + }, + stopReason: "stop", + }, + { + role: "user", + content: [ + { + type: "text", + text: "add a third", + }, + ], + }, + { + role: "assistant", + content: [ + { + type: "toolCall", + id: "toolu_01DPsTn1gLbZiTDsn44N52Vx", + name: "artifacts", + arguments: { + command: "update", + filename: "index.html", + old_str: + " ", + new_str: + " ", + }, + }, + ], + api: "anthropic-messages", + provider: "anthropic", + model: "claude-sonnet-4-5-20250929", + usage: { + input: 30979, + output: 182, + cacheRead: 0, + cacheWrite: 0, + cost: { + input: 0.092937, + output: 0.0027300000000000002, + cacheRead: 0, + cacheWrite: 0, + total: 0.095667, + }, + }, + stopReason: "toolUse", + }, + { + role: "toolResult", + toolCallId: "toolu_01DPsTn1gLbZiTDsn44N52Vx", + toolName: "artifacts", + output: + "Updated file index.html\n\nExecution timed out. Partial logs:\n[log] Page loaded successfully!\n[log] Welcome to the simple HTML page\n[log] Third console log added!", + isError: false, + }, + { + role: "assistant", + content: [ + { + type: "text", + text: '\n\nDone! Added a third console log statement: "Third console log added!" \n\nAll three logs are now firing successfully! 🎉', + }, + ], + api: "anthropic-messages", + provider: "anthropic", + model: "claude-sonnet-4-5-20250929", + usage: { + input: 31214, + output: 33, + cacheRead: 0, + cacheWrite: 0, + cost: { + input: 0.093642, + output: 0.000495, + cacheRead: 0, + cacheWrite: 0, + total: 0.094137, + }, + }, + stopReason: "stop", + }, ], }; diff --git a/packages/pods/src/cli.ts b/packages/pods/src/cli.ts index eefcfafd..150e5dd2 100644 --- a/packages/pods/src/cli.ts +++ b/packages/pods/src/cli.ts @@ -267,7 +267,7 @@ try { context = args[i + 1]; i++; } else if (args[i] === "--gpus" && i + 1 < args.length) { - gpus = parseInt(args[i + 1]); + gpus = parseInt(args[i + 1], 10); if (Number.isNaN(gpus) || gpus < 1) { console.error(chalk.red("--gpus must be a positive number")); process.exit(1); diff --git a/packages/pods/src/commands/models.ts b/packages/pods/src/commands/models.ts index e811d564..eb6b60a2 100644 --- a/packages/pods/src/commands/models.ts +++ b/packages/pods/src/commands/models.ts @@ -181,7 +181,7 @@ export const startModel = async ( "64k": 65536, "128k": 131072, }; - const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context); + const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context, 10); vllmArgs = vllmArgs.filter((arg) => !arg.includes("max-model-len")); vllmArgs.push("--max-model-len", String(maxTokens)); } @@ -251,7 +251,7 @@ WRAPPER `; const pidResult = await sshExec(pod.ssh, startCmd); - const pid = parseInt(pidResult.stdout.trim()); + const pid = parseInt(pidResult.stdout.trim(), 10); if (!pid) { console.error(chalk.red("Failed to start model runner")); process.exit(1); diff --git a/packages/pods/src/commands/pods.ts b/packages/pods/src/commands/pods.ts index b966ff24..2322ecd1 100644 --- a/packages/pods/src/commands/pods.ts +++ b/packages/pods/src/commands/pods.ts @@ -141,7 +141,7 @@ export const setupPod = async ( const [id, name, memory] = line.split(",").map((s) => s.trim()); if (id !== undefined) { gpus.push({ - id: parseInt(id), + id: parseInt(id, 10), name: name || "Unknown", memory: memory || "Unknown", }); diff --git a/packages/tui/test/differential-render.test.ts b/packages/tui/test/differential-render.test.ts index d5be0d3e..f120882d 100644 --- a/packages/tui/test/differential-render.test.ts +++ b/packages/tui/test/differential-render.test.ts @@ -72,7 +72,7 @@ describe("Differential Rendering - Dynamic Content", () => { const match = line.match(/Dynamic Item (\d+)/); if (match) { dynamicItemsInBuffer++; - allItemNumbers.add(parseInt(match[1])); + allItemNumbers.add(parseInt(match[1], 10)); } }