From 7e3f9a95562480addc6ad699fa4f56db6eb3497c Mon Sep 17 00:00:00 2001 From: Sunil Pai Date: Wed, 29 Oct 2025 14:09:11 +0000 Subject: [PATCH 1/2] Update dependencies --- .changeset/chilly-pugs-cross.md | 5 + biome.json | 2 +- examples/basic/package.json | 2 +- examples/claude-code/package-lock.json | 1599 ----------------- examples/claude-code/package.json | 6 +- examples/code-interpreter/package.json | 8 +- examples/minimal/package.json | 6 +- package-lock.json | 2099 ++++++----------------- package.json | 40 +- packages/sandbox-container/package.json | 6 +- packages/sandbox/package.json | 2 +- packages/shared/package.json | 2 +- 12 files changed, 569 insertions(+), 3208 deletions(-) create mode 100644 .changeset/chilly-pugs-cross.md delete mode 100644 examples/claude-code/package-lock.json diff --git a/.changeset/chilly-pugs-cross.md b/.changeset/chilly-pugs-cross.md new file mode 100644 index 00000000..5c528f2a --- /dev/null +++ b/.changeset/chilly-pugs-cross.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/sandbox": patch +--- + +Update dependencies diff --git a/biome.json b/biome.json index 8bf7a949..6481e336 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.2/schema.json", "assist": { "actions": { "source": { diff --git a/examples/basic/package.json b/examples/basic/package.json index fce77872..da0a07ba 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -12,7 +12,7 @@ "license": "MIT", "dependencies": { "@cloudflare/sandbox": "*", - "katex": "^0.16.22", + "katex": "^0.16.25", "react-katex": "^3.1.0", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1" diff --git a/examples/claude-code/package-lock.json b/examples/claude-code/package-lock.json deleted file mode 100644 index a644ab5a..00000000 --- a/examples/claude-code/package-lock.json +++ /dev/null @@ -1,1599 +0,0 @@ -{ - "name": "@cloudflare/sandbox-claude-code-example", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@cloudflare/sandbox-claude-code-example", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@cloudflare/sandbox": "^0.4.3", - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" - } - }, - "node_modules/@cloudflare/containers": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@cloudflare/containers/-/containers-0.0.28.tgz", - "integrity": "sha512-wzR9UWcGvZ9znd4elkXklilPcHX6srncsjSkx696SZRZyTygNbWsLlHegvc1C+e9gn28HRZU3dLiAzXiC9IY1w==", - "dev": true, - "license": "ISC" - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", - "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@cloudflare/sandbox": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@cloudflare/sandbox/-/sandbox-0.4.4.tgz", - "integrity": "sha512-aO2JZnNzWE7Flr8pMaNQeddg9RWraFU2QWCj45oHl9KhDin3GQqiQCREFR4qmz6sDlv7OfPbQ+IApAqk9jmUfQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@cloudflare/containers": "^0.0.28" - } - }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.8.tgz", - "integrity": "sha512-Ky929MfHh+qPhwCapYrRPwPVHtA2Ioex/DbGZyskGyNRDe9Ru3WThYZivyNVaPy5ergQSgMs9OKrM9Ajtz9F6w==", - "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.21", - "workerd": "^1.20250927.0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } - } - }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251011.0.tgz", - "integrity": "sha512-0DirVP+Z82RtZLlK2B+VhLOkk+ShBqDYO/jhcRw4oVlp0TOvk3cOVZChrt3+y3NV8Y/PYgTEywzLKFSziK4wCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251011.0.tgz", - "integrity": "sha512-1WuFBGwZd15p4xssGN/48OE2oqokIuc51YvHvyNivyV8IYnAs3G9bJNGWth1X7iMDPe4g44pZrKhRnISS2+5dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251011.0.tgz", - "integrity": "sha512-BccMiBzFlWZyFghIw2szanmYJrJGBGHomw2y/GV6pYXChFzMGZkeCEMfmCyJj29xczZXxcZmUVJxNy4eJxO8QA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251011.0.tgz", - "integrity": "sha512-79o/216lsbAbKEVDZYXR24ivEIE2ysDL9jvo0rDTkViLWju9dAp3CpyetglpJatbSi3uWBPKZBEOqN68zIjVsQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251011.0.tgz", - "integrity": "sha512-RIXUQRchFdqEvaUqn1cXZXSKjpqMaSaVAkI5jNZ8XzAw/bw2bcdOVUtakrflgxDprltjFb0PTNtuss1FKtH9Jg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", - "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@poppinss/colors": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz", - "integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/@poppinss/dumper": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.4.tgz", - "integrity": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" - } - }, - "node_modules/@poppinss/exception": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz", - "integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.1.0.tgz", - "integrity": "sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@speed-highlight/core": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz", - "integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@types/node": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", - "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true, - "license": "MIT" - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/error-stack-parser-es": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", - "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/miniflare": { - "version": "4.20251011.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251011.0.tgz", - "integrity": "sha512-DlZ7vR5q/RE9eLsxsrXzfSZIF2f6O5k0YsFrSKhWUtdefyGtJt4sSpR6V+Af/waaZ6+zIFy9lsknHBCm49sEYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "8.14.0", - "acorn-walk": "8.3.2", - "exit-hook": "2.2.1", - "glob-to-regexp": "0.4.1", - "sharp": "^0.33.5", - "stoppable": "1.1.0", - "undici": "7.14.0", - "workerd": "1.20251011.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "3.22.3" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" - } - }, - "node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/typescript": { - "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": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", - "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unenv": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.21.tgz", - "integrity": "sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "exsolve": "^1.0.7", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "ufo": "^1.6.1" - } - }, - "node_modules/workerd": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251011.0.tgz", - "integrity": "sha512-Dq35TLPEJAw7BuYQMkN3p9rge34zWMU2Gnd4DSJFeVqld4+DAO2aPG7+We2dNIAyM97S8Y9BmHulbQ00E0HC7Q==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20251011.0", - "@cloudflare/workerd-darwin-arm64": "1.20251011.0", - "@cloudflare/workerd-linux-64": "1.20251011.0", - "@cloudflare/workerd-linux-arm64": "1.20251011.0", - "@cloudflare/workerd-windows-64": "1.20251011.0" - } - }, - "node_modules/wrangler": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.44.0.tgz", - "integrity": "sha512-BLOUigckcWZ0r4rm7b5PuaTpb9KP9as0XeCRSJ8kqcNgXcKoUD3Ij8FlPvN25KybLnFnetaO0ZdfRYUPWle4qw==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.0", - "@cloudflare/unenv-preset": "2.7.8", - "blake3-wasm": "2.1.5", - "esbuild": "0.25.4", - "miniflare": "4.20251011.0", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.21", - "workerd": "1.20251011.0" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20251011.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/youch": { - "version": "4.1.0-beta.10", - "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", - "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@poppinss/dumper": "^0.6.4", - "@speed-highlight/core": "^1.2.7", - "cookie": "^1.0.2", - "youch-core": "^0.3.3" - } - }, - "node_modules/youch-core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", - "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/exception": "^1.2.2", - "error-stack-parser-es": "^1.0.5" - } - }, - "node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/examples/claude-code/package.json b/examples/claude-code/package.json index c6d4a6c2..ddcf297c 100644 --- a/examples/claude-code/package.json +++ b/examples/claude-code/package.json @@ -13,9 +13,9 @@ }, "devDependencies": { "@cloudflare/sandbox": "*", - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" }, "author": "", "license": "MIT" diff --git a/examples/code-interpreter/package.json b/examples/code-interpreter/package.json index 1a62171d..16237f6d 100644 --- a/examples/code-interpreter/package.json +++ b/examples/code-interpreter/package.json @@ -15,11 +15,11 @@ "license": "MIT", "dependencies": { "@cloudflare/sandbox": "*", - "openai": "^5.12.0" + "openai": "^6.7.0" }, "devDependencies": { - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" } } diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 7734cd4e..8108977c 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -13,9 +13,9 @@ }, "devDependencies": { "@cloudflare/sandbox": "*", - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" }, "author": "", "license": "MIT" diff --git a/package-lock.json b/package-lock.json index 34d9676a..7c4298fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,31 +14,33 @@ "examples/*" ], "devDependencies": { - "@biomejs/biome": "^2.1.2", + "@biomejs/biome": "^2.3.2", "@changesets/changelog-github": "^0.5.1", - "@changesets/cli": "^2.29.5", - "@cloudflare/vite-plugin": "^1.13.12", - "@cloudflare/vitest-pool-workers": "^0.9.12", - "@cloudflare/workers-types": "^4.20250725.0", - "@types/bun": "^1.2.19", - "@types/node": "^24.9.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@changesets/cli": "^2.29.7", + "@cloudflare/vite-plugin": "^1.13.17", + "@cloudflare/vitest-pool-workers": "^0.10.2", + "@cloudflare/workers-types": "^4.20251014.0", + "@types/bun": "^1.3.1", + "@types/node": "^24.9.2", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", "@types/ws": "^8.18.1", - "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react": "^5.1.0", "@vitest/ui": "^3.2.4", "fast-glob": "^3.3.3", - "happy-dom": "^20.0.0", + "happy-dom": "^20.0.10", "pkg-pr-new": "^0.0.60", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "prettier": "^3.6.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sherif": "^1.7.0", "tsdown": "^0.15.11", - "tsx": "^4.20.3", + "tsx": "^4.20.6", "turbo": "^2.5.8", - "typescript": "^5.8.3", - "vite": "^7.1.11", + "typescript": "^5.9.3", + "vite": "^7.1.12", "vitest": "^3.2.4", - "wrangler": "^4.44.0", + "wrangler": "^4.45.2", "ws": "^8.18.3" } }, @@ -48,7 +50,7 @@ "license": "MIT", "dependencies": { "@cloudflare/sandbox": "*", - "katex": "^0.16.22", + "katex": "^0.16.25", "react-katex": "^3.1.0", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1" @@ -577,9 +579,9 @@ "license": "MIT", "devDependencies": { "@cloudflare/sandbox": "*", - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" } }, "examples/code-interpreter": { @@ -588,12 +590,12 @@ "license": "MIT", "dependencies": { "@cloudflare/sandbox": "*", - "openai": "^5.12.0" + "openai": "^6.7.0" }, "devDependencies": { - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" } }, "examples/minimal": { @@ -602,9 +604,9 @@ "license": "MIT", "devDependencies": { "@cloudflare/sandbox": "*", - "@types/node": "^24.9.1", - "typescript": "^5.8.3", - "wrangler": "^4.44.0" + "@types/node": "^24.9.2", + "typescript": "^5.9.3", + "wrangler": "^4.45.2" } }, "examples/minimal/node_modules/@cloudflare/containers": { @@ -989,9 +991,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", - "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.2.tgz", + "integrity": "sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -1005,20 +1007,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@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" + "@biomejs/cli-darwin-arm64": "2.3.2", + "@biomejs/cli-darwin-x64": "2.3.2", + "@biomejs/cli-linux-arm64": "2.3.2", + "@biomejs/cli-linux-arm64-musl": "2.3.2", + "@biomejs/cli-linux-x64": "2.3.2", + "@biomejs/cli-linux-x64-musl": "2.3.2", + "@biomejs/cli-win32-arm64": "2.3.2", + "@biomejs/cli-win32-x64": "2.3.2" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz", + "integrity": "sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew==", "cpu": [ "arm64" ], @@ -1033,9 +1035,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.2.tgz", + "integrity": "sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA==", "cpu": [ "x64" ], @@ -1050,9 +1052,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.2.tgz", + "integrity": "sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw==", "cpu": [ "arm64" ], @@ -1067,9 +1069,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.2.tgz", + "integrity": "sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw==", "cpu": [ "arm64" ], @@ -1084,9 +1086,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", - "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.2.tgz", + "integrity": "sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA==", "cpu": [ "x64" ], @@ -1101,9 +1103,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.2.tgz", + "integrity": "sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA==", "cpu": [ "x64" ], @@ -1118,9 +1120,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", - "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.2.tgz", + "integrity": "sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg==", "cpu": [ "arm64" ], @@ -1135,9 +1137,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.2.tgz", + "integrity": "sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ==", "cpu": [ "x64" ], @@ -1173,6 +1175,22 @@ "semver": "^7.5.3" } }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@changesets/assemble-release-plan": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", @@ -1360,1189 +1378,203 @@ "node_modules/@changesets/pre": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", - "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.1", - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "human-id": "^4.1.1", - "prettier": "^2.7.1" - } - }, - "node_modules/@cloudflare/containers": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@cloudflare/containers/-/containers-0.0.29.tgz", - "integrity": "sha512-tiVCbS7p2SBWNZd4Ym6zx2gMJdQqq7VhWStID0DkQ1iCyqmLis1hDUNmeVbHCYKSnsyZq/SUxFspRwrXNaA3Yg==", - "license": "ISC" - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", - "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@cloudflare/sandbox": { - "resolved": "packages/sandbox", - "link": true - }, - "node_modules/@cloudflare/sandbox-claude-code-example": { - "resolved": "examples/claude-code", - "link": true - }, - "node_modules/@cloudflare/sandbox-code-interpreter-example": { - "resolved": "examples/code-interpreter", - "link": true - }, - "node_modules/@cloudflare/sandbox-example": { - "resolved": "examples/basic", - "link": true - }, - "node_modules/@cloudflare/sandbox-minimal-example": { - "resolved": "examples/minimal", - "link": true - }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.7.7", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.7.tgz", - "integrity": "sha512-HtZuh166y0Olbj9bqqySckz0Rw9uHjggJeoGbDx5x+sgezBXlxO6tQSig2RZw5tgObF8mWI8zaPvQMkQZtAODw==", - "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.21", - "workerd": "^1.20250927.0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } - } - }, - "node_modules/@cloudflare/vite-plugin": { - "version": "1.13.12", - "resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.13.12.tgz", - "integrity": "sha512-JEcrUF1uXxMQfp+RcGw7ov5K8uOGX0arFYdyO3QfHrjWspHnsw0zOYL+4083itEInRVnZjS5LunpsNpxSVbCEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cloudflare/unenv-preset": "2.7.7", - "@remix-run/node-fetch-server": "^0.8.0", - "get-port": "^7.1.0", - "miniflare": "4.20251008.0", - "picocolors": "^1.1.1", - "tinyglobby": "^0.2.12", - "unenv": "2.0.0-rc.21", - "wrangler": "4.42.2", - "ws": "8.18.0" - }, - "peerDependencies": { - "vite": "^6.1.0 || ^7.0.0", - "wrangler": "^4.42.2" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/wrangler": { - "version": "4.42.2", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.42.2.tgz", - "integrity": "sha512-1iTnbjB4F12KSP1zbfxQL495xarS+vdrZnulQP2SEcAxDTUGn7N9zk1O2WtFOc+Fhcgl+9/sdz/4AL9pF34Pwg==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.0", - "@cloudflare/unenv-preset": "2.7.7", - "blake3-wasm": "2.1.5", - "esbuild": "0.25.4", - "miniflare": "4.20251008.0", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.21", - "workerd": "1.20251008.0" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20251008.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "node_modules/@cloudflare/vite-plugin/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@cloudflare/vitest-pool-workers": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.9.12.tgz", - "integrity": "sha512-MTHFgqyhji3VhdjNQX/CcKNYchAyaQMbjh23Hif8LFq2YaMCISSVoVAUBXoGMMS/+RblwqZOWfH2ZojTVhEr+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "birpc": "0.2.14", - "cjs-module-lexer": "^1.2.3", - "devalue": "^5.3.2", - "miniflare": "4.20251008.0", - "semver": "^7.7.1", - "wrangler": "4.42.2", - "zod": "^3.22.3" - }, - "peerDependencies": { - "@vitest/runner": "2.0.x - 3.2.x", - "@vitest/snapshot": "2.0.x - 3.2.x", - "vitest": "2.0.x - 3.2.x" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" } }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], + "node_modules/@changesets/read": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", + "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.1", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" } }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" } }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" } }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "hasInstallScript": true, "license": "MIT", "bin": { - "esbuild": "bin/esbuild" + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=18" + "node": ">=10.13.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@cloudflare/vitest-pool-workers/node_modules/wrangler": { - "version": "4.42.2", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.42.2.tgz", - "integrity": "sha512-1iTnbjB4F12KSP1zbfxQL495xarS+vdrZnulQP2SEcAxDTUGn7N9zk1O2WtFOc+Fhcgl+9/sdz/4AL9pF34Pwg==", + "node_modules/@cloudflare/containers": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@cloudflare/containers/-/containers-0.0.30.tgz", + "integrity": "sha512-i148xBgmyn/pje82ZIyuTr/Ae0BT/YWwa1/GTJcw6DxEjUHAzZLaBCiX446U9OeuJ2rBh/L/9FIzxX5iYNt1AQ==", + "license": "ISC" + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", + "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.0", - "@cloudflare/unenv-preset": "2.7.7", - "blake3-wasm": "2.1.5", - "esbuild": "0.25.4", - "miniflare": "4.20251008.0", - "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.21", - "workerd": "1.20251008.0" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" + "mime": "^3.0.0" }, "engines": { "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/sandbox": { + "resolved": "packages/sandbox", + "link": true + }, + "node_modules/@cloudflare/sandbox-claude-code-example": { + "resolved": "examples/claude-code", + "link": true + }, + "node_modules/@cloudflare/sandbox-code-interpreter-example": { + "resolved": "examples/code-interpreter", + "link": true + }, + "node_modules/@cloudflare/sandbox-example": { + "resolved": "examples/basic", + "link": true + }, + "node_modules/@cloudflare/sandbox-minimal-example": { + "resolved": "examples/minimal", + "link": true + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.8.tgz", + "integrity": "sha512-Ky929MfHh+qPhwCapYrRPwPVHtA2Ioex/DbGZyskGyNRDe9Ru3WThYZivyNVaPy5ergQSgMs9OKrM9Ajtz9F6w==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.21", + "workerd": "^1.20250927.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vite-plugin": { + "version": "1.13.17", + "resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.13.17.tgz", + "integrity": "sha512-JYBs+KwN/fcqcOwa4hZ5SPLUAZ2idksZ4umeja4TWPPUWvO2f0Lm0bOjVHI+rFuq72b2vixx2coNJSyntEBUsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cloudflare/unenv-preset": "2.7.8", + "@remix-run/node-fetch-server": "^0.8.0", + "get-port": "^7.1.0", + "miniflare": "4.20251011.1", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.12", + "unenv": "2.0.0-rc.21", + "wrangler": "4.45.2", + "ws": "8.18.0" + }, + "peerDependencies": { + "vite": "^6.1.0 || ^7.0.0", + "wrangler": "^4.45.2" + } + }, + "node_modules/@cloudflare/vite-plugin/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20251008.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@cloudflare/workers-types": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, + "node_modules/@cloudflare/vitest-pool-workers": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.10.2.tgz", + "integrity": "sha512-JbLDzZ40vcXUHw8VVoMAQpCAmZ/mN3KqsY25DIcUJR8cc/a2R3IGC5F9IE6u6ns1mnRlqRYB6ChYh1afnLUiAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "0.2.14", + "cjs-module-lexer": "^1.2.3", + "devalue": "^5.3.2", + "miniflare": "4.20251011.1", + "semver": "^7.7.1", + "wrangler": "4.45.2", + "zod": "^3.22.3" + }, + "peerDependencies": { + "@vitest/runner": "2.0.x - 3.2.x", + "@vitest/snapshot": "2.0.x - 3.2.x", + "vitest": "2.0.x - 3.2.x" + } + }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251008.0.tgz", - "integrity": "sha512-yph0H+8mMOK5Z9oDwjb8rI96oTVt4no5lZ43aorcbzsWG9VUIaXSXlBBoB3von6p4YCRW+J3n36fBM9XZ6TLaA==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251011.0.tgz", + "integrity": "sha512-0DirVP+Z82RtZLlK2B+VhLOkk+ShBqDYO/jhcRw4oVlp0TOvk3cOVZChrt3+y3NV8Y/PYgTEywzLKFSziK4wCg==", "cpu": [ "x64" ], @@ -2557,9 +1589,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251008.0.tgz", - "integrity": "sha512-Yc4lMGSbM4AEtYRpyDpmk77MsHb6X2BSwJgMgGsLVPmckM7ZHivZkJChfcNQjZ/MGR6nkhYc4iF6TcVS+UMEVw==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251011.0.tgz", + "integrity": "sha512-1WuFBGwZd15p4xssGN/48OE2oqokIuc51YvHvyNivyV8IYnAs3G9bJNGWth1X7iMDPe4g44pZrKhRnISS2+5dA==", "cpu": [ "arm64" ], @@ -2574,9 +1606,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251008.0.tgz", - "integrity": "sha512-AjoQnylw4/5G6SmfhZRsli7EuIK7ZMhmbxtU0jkpciTlVV8H01OsFOgS1d8zaTXMfkWamEfMouy8oH/L7B9YcQ==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251011.0.tgz", + "integrity": "sha512-BccMiBzFlWZyFghIw2szanmYJrJGBGHomw2y/GV6pYXChFzMGZkeCEMfmCyJj29xczZXxcZmUVJxNy4eJxO8QA==", "cpu": [ "x64" ], @@ -2591,9 +1623,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251008.0.tgz", - "integrity": "sha512-hRy9yyvzVq1HsqHZUmFkAr0C8JGjAD/PeeVEGCKL3jln3M9sNCKIrbDXiL+efe+EwajJNNlDxpO+s30uVWVaRg==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251011.0.tgz", + "integrity": "sha512-79o/216lsbAbKEVDZYXR24ivEIE2ysDL9jvo0rDTkViLWju9dAp3CpyetglpJatbSi3uWBPKZBEOqN68zIjVsQ==", "cpu": [ "arm64" ], @@ -2608,9 +1640,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251008.0.tgz", - "integrity": "sha512-Gm0RR+ehfNMsScn2pUcn3N9PDUpy7FyvV9ecHEyclKttvztyFOcmsF14bxEaSVv7iM4TxWEBn1rclmYHxDM4ow==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251011.0.tgz", + "integrity": "sha512-RIXUQRchFdqEvaUqn1cXZXSKjpqMaSaVAkI5jNZ8XzAw/bw2bcdOVUtakrflgxDprltjFb0PTNtuss1FKtH9Jg==", "cpu": [ "x64" ], @@ -2625,9 +1657,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251011.0.tgz", - "integrity": "sha512-gQpih+pbq3sP4uXltUeCSbPgZxTNp2gQd8639SaIbQMwgA6oJNHLhIART1fWy6DQACngiRzDVULA2x0ohmkGTQ==", + "version": "4.20251014.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251014.0.tgz", + "integrity": "sha512-tEW98J/kOa0TdylIUOrLKRdwkUw0rvvYVlo+Ce0mqRH3c8kSoxLzUH9gfCvwLe0M89z1RkzFovSKAW2Nwtyn3w==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -2690,9 +1722,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ "ppc64" ], @@ -2706,9 +1738,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", "cpu": [ "arm" ], @@ -2722,9 +1754,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", "cpu": [ "arm64" ], @@ -2738,9 +1770,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", "cpu": [ "x64" ], @@ -2754,9 +1786,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", "cpu": [ "arm64" ], @@ -2770,9 +1802,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", "cpu": [ "x64" ], @@ -2786,9 +1818,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", "cpu": [ "arm64" ], @@ -2802,9 +1834,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", "cpu": [ "x64" ], @@ -2818,9 +1850,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", "cpu": [ "arm" ], @@ -2834,9 +1866,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", "cpu": [ "arm64" ], @@ -2850,9 +1882,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", "cpu": [ "ia32" ], @@ -2866,9 +1898,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", "cpu": [ "loong64" ], @@ -2882,9 +1914,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", "cpu": [ "mips64el" ], @@ -2898,9 +1930,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", "cpu": [ "ppc64" ], @@ -2914,9 +1946,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", "cpu": [ "riscv64" ], @@ -2930,9 +1962,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", "cpu": [ "s390x" ], @@ -2946,9 +1978,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", "cpu": [ "x64" ], @@ -2962,9 +1994,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", "cpu": [ "arm64" ], @@ -2978,9 +2010,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", "cpu": [ "x64" ], @@ -2994,9 +2026,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ "arm64" ], @@ -3010,9 +2042,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ "x64" ], @@ -3026,9 +2058,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], @@ -3042,9 +2074,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], @@ -3058,9 +2090,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], @@ -3074,9 +2106,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ "ia32" ], @@ -3090,9 +2122,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ "x64" ], @@ -4328,9 +3360,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz", + "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==", "dev": true, "license": "MIT" }, @@ -4719,13 +3751,13 @@ } }, "node_modules/@types/bun": { - "version": "1.2.23", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.2.23.tgz", - "integrity": "sha512-le8ueOY5b6VKYf19xT3McVbXqLqmxzPXHsQT/q9JHgikJ2X22wyTW3g3ohz2ZMnp7dod6aduIiq8A14Xyimm0A==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.1.tgz", + "integrity": "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ==", "dev": true, "license": "MIT", "dependencies": { - "bun-types": "1.2.23" + "bun-types": "1.3.1" } }, "node_modules/@types/chai": { @@ -4795,18 +3827,18 @@ } }, "node_modules/@types/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.0.tgz", - "integrity": "sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-brtBs0MnE9SMx7px208g39lRmC5uHZs96caOJfTjFcYSLHNamvaSMfJNagChVNkup2SdtOxKX1FDBkRSJe1ZAg==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4853,21 +3885,21 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz", + "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", + "@babel/core": "^7.28.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", + "@rolldown/pluginutils": "1.0.0-beta.43", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "react-refresh": "^0.18.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" @@ -5205,9 +4237,9 @@ } }, "node_modules/bun-types": { - "version": "1.2.23", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.2.23.tgz", - "integrity": "sha512-R9f0hKAZXgFU3mlrA0YpE/fiDvwV0FT9rORApt2aQVWSuJDzZOyB5QLc0N/4HF57CS8IXJ6+L5E4W1bW6NS2Aw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.1.tgz", + "integrity": "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw==", "dev": true, "license": "MIT", "dependencies": { @@ -5671,9 +4703,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -5683,32 +4715,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/escalade": { @@ -5994,9 +5026,9 @@ "license": "ISC" }, "node_modules/happy-dom": { - "version": "20.0.5", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.5.tgz", - "integrity": "sha512-AiqA0rfS7WR1kihXt9W9aA5LFLaOKzwiL+QoI7BkOQ0r21C7VHTOf4k8QNlnWYaHLhpI2tZzJPLV1lY1obDTmw==", + "version": "20.0.10", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz", + "integrity": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==", "dev": true, "license": "MIT", "dependencies": { @@ -6308,9 +5340,9 @@ } }, "node_modules/katex": { - "version": "0.16.23", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.23.tgz", - "integrity": "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==", + "version": "0.16.25", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", + "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -7740,9 +6772,9 @@ } }, "node_modules/miniflare": { - "version": "4.20251008.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251008.0.tgz", - "integrity": "sha512-sKCNYNzXG6l8qg0Oo7y8WcDKcpbgw0qwZsxNpdZilFTR4EavRow2TlcwuPSVN99jqAjhz0M4VXvTdSGdtJ2VfQ==", + "version": "4.20251011.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251011.1.tgz", + "integrity": "sha512-Qbw1Z8HTYM1adWl6FAtzhrj34/6dPRDPwdYOx21dkae8a/EaxbMzRIPbb4HKVGMVvtqbK1FaRCgDLVLolNzGHg==", "dev": true, "license": "MIT", "dependencies": { @@ -7754,7 +6786,7 @@ "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", - "workerd": "1.20251008.0", + "workerd": "1.20251011.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" @@ -7925,16 +6957,16 @@ } }, "node_modules/openai": { - "version": "5.23.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz", - "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.7.0.tgz", + "integrity": "sha512-mgSQXa3O/UXTbA8qFzoa7aydbXBJR5dbLQXCRapAOtoNT+v69sLdKMZzgiakpqhclRnhPggPAXoniVGn2kMY2A==", "license": "Apache-2.0", "bin": { "openai": "bin/cli" }, "peerDependencies": { "ws": "^8.18.0", - "zod": "^3.23.8" + "zod": "^3.25 || ^4.0" }, "peerDependenciesMeta": { "ws": { @@ -8170,16 +7202,16 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -8559,9 +7591,9 @@ } }, "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", "dev": true, "license": "MIT", "engines": { @@ -9180,6 +8212,108 @@ "node": ">=8" } }, + "node_modules/sherif": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif/-/sherif-1.7.0.tgz", + "integrity": "sha512-kf+WTg/oEpG7O5QX1t67LsY+dXB4hkdqbR/nNNepVPH6OsKuZ4lIR74OESuQkvRGdU2vytrRTmWTXLQrx4Kc/A==", + "dev": true, + "license": "MIT", + "bin": { + "sherif": "index.js" + }, + "optionalDependencies": { + "sherif-darwin-arm64": "1.7.0", + "sherif-darwin-x64": "1.7.0", + "sherif-linux-arm64": "1.7.0", + "sherif-linux-x64": "1.7.0", + "sherif-windows-arm64": "1.7.0", + "sherif-windows-x64": "1.7.0" + } + }, + "node_modules/sherif-darwin-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-darwin-arm64/-/sherif-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-ziIJoGx+VFcP6G01XwOJh8cNLfDXj3CWSdDtaj9kXHaGT9oPj68z1xAoFuKHQCukj2jhmwyBrSZy4Zvli9MmaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/sherif-darwin-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-darwin-x64/-/sherif-darwin-x64-1.7.0.tgz", + "integrity": "sha512-GKQw0zFqUWGbYrk+HU1Nzhr93p8VlEsjAkUhJ5UQVPxGtAf8VyRHQFJKWdoqYdhs0kckV04LfSfOHeaj/VFu5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/sherif-linux-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-linux-arm64/-/sherif-linux-arm64-1.7.0.tgz", + "integrity": "sha512-qW08gpfjhrURkKoi0OaLlk+O/xvMqpD1oVRpeHLtyFqTof6msBqmfPKdQful2tPLWFVmNoU27emOgRUh5pAPBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/sherif-linux-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-linux-x64/-/sherif-linux-x64-1.7.0.tgz", + "integrity": "sha512-1yPKSPXXZqIbbIbQPjoxO8yL8ASNy3lbRXpEvj+NT7rk6KNkGqarG3BlI6PtNdN2JZnFPwIp0FAVNVGTv01yqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/sherif-windows-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-windows-arm64/-/sherif-windows-arm64-1.7.0.tgz", + "integrity": "sha512-edVI8PScUI42i11IH3SP9CIqLVrHS9CNzXFJHgbbSAZ/EC7B0ixcFYQxD4eiYpz/K2QIVZOPYXTt+FMQWqgyGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/sherif-windows-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sherif-windows-x64/-/sherif-windows-x64-1.7.0.tgz", + "integrity": "sha512-QKzMkpk6S1Tp8Q6L/wChA44ZHyJ1Uah+WuM4X+O6+vSG4cQ/xWGCF+7AqDJpuC0y6D1k7GgC1lUEt0ZwTEuHLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -10029,9 +9163,9 @@ } }, "node_modules/vite": { - "version": "7.1.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", - "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -10305,9 +9439,9 @@ } }, "node_modules/workerd": { - "version": "1.20251008.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251008.0.tgz", - "integrity": "sha512-HwaJmXO3M1r4S8x2ea2vy8Rw/y/38HRQuK/gNDRQ7w9cJXn6xSl1sIIqKCffULSUjul3wV3I3Nd/GfbmsRReEA==", + "version": "1.20251011.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251011.0.tgz", + "integrity": "sha512-Dq35TLPEJAw7BuYQMkN3p9rge34zWMU2Gnd4DSJFeVqld4+DAO2aPG7+We2dNIAyM97S8Y9BmHulbQ00E0HC7Q==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -10318,17 +9452,17 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20251008.0", - "@cloudflare/workerd-darwin-arm64": "1.20251008.0", - "@cloudflare/workerd-linux-64": "1.20251008.0", - "@cloudflare/workerd-linux-arm64": "1.20251008.0", - "@cloudflare/workerd-windows-64": "1.20251008.0" + "@cloudflare/workerd-darwin-64": "1.20251011.0", + "@cloudflare/workerd-darwin-arm64": "1.20251011.0", + "@cloudflare/workerd-linux-64": "1.20251011.0", + "@cloudflare/workerd-linux-arm64": "1.20251011.0", + "@cloudflare/workerd-windows-64": "1.20251011.0" } }, "node_modules/wrangler": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.45.1.tgz", - "integrity": "sha512-SmmbDl6NUkv6mHT8/Scb09lvxXy0Y2hD98oZHswCysrYbs4JW5LP1eTuroE23Z2jK75D7TEzv2MXmwcDIytxhg==", + "version": "4.45.2", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.45.2.tgz", + "integrity": "sha512-+G24gD+Rh7iBus5QiVBhNgSLzyAiyuZSm+3Ih5li8+PEA+gosAXfDSZlNZwsVmXd8VJTjq+BR4vhUiruQRWgTw==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { @@ -10360,107 +9494,6 @@ } } }, - "node_modules/wrangler/node_modules/@cloudflare/unenv-preset": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.8.tgz", - "integrity": "sha512-Ky929MfHh+qPhwCapYrRPwPVHtA2Ioex/DbGZyskGyNRDe9Ru3WThYZivyNVaPy5ergQSgMs9OKrM9Ajtz9F6w==", - "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.21", - "workerd": "^1.20250927.0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } - } - }, - "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251011.0.tgz", - "integrity": "sha512-0DirVP+Z82RtZLlK2B+VhLOkk+ShBqDYO/jhcRw4oVlp0TOvk3cOVZChrt3+y3NV8Y/PYgTEywzLKFSziK4wCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251011.0.tgz", - "integrity": "sha512-1WuFBGwZd15p4xssGN/48OE2oqokIuc51YvHvyNivyV8IYnAs3G9bJNGWth1X7iMDPe4g44pZrKhRnISS2+5dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251011.0.tgz", - "integrity": "sha512-BccMiBzFlWZyFghIw2szanmYJrJGBGHomw2y/GV6pYXChFzMGZkeCEMfmCyJj29xczZXxcZmUVJxNy4eJxO8QA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251011.0.tgz", - "integrity": "sha512-79o/216lsbAbKEVDZYXR24ivEIE2ysDL9jvo0rDTkViLWju9dAp3CpyetglpJatbSi3uWBPKZBEOqN68zIjVsQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/wrangler/node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251011.0.tgz", - "integrity": "sha512-RIXUQRchFdqEvaUqn1cXZXSKjpqMaSaVAkI5jNZ8XzAw/bw2bcdOVUtakrflgxDprltjFb0PTNtuss1FKtH9Jg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", @@ -10927,86 +9960,6 @@ "@esbuild/win32-x64": "0.25.4" } }, - "node_modules/wrangler/node_modules/miniflare": { - "version": "4.20251011.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251011.1.tgz", - "integrity": "sha512-Qbw1Z8HTYM1adWl6FAtzhrj34/6dPRDPwdYOx21dkae8a/EaxbMzRIPbb4HKVGMVvtqbK1FaRCgDLVLolNzGHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "8.14.0", - "acorn-walk": "8.3.2", - "exit-hook": "2.2.1", - "glob-to-regexp": "0.4.1", - "sharp": "^0.33.5", - "stoppable": "1.1.0", - "undici": "7.14.0", - "workerd": "1.20251011.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "3.22.3" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/wrangler/node_modules/workerd": { - "version": "1.20251011.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251011.0.tgz", - "integrity": "sha512-Dq35TLPEJAw7BuYQMkN3p9rge34zWMU2Gnd4DSJFeVqld4+DAO2aPG7+We2dNIAyM97S8Y9BmHulbQ00E0HC7Q==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20251011.0", - "@cloudflare/workerd-darwin-arm64": "1.20251011.0", - "@cloudflare/workerd-linux-64": "1.20251011.0", - "@cloudflare/workerd-linux-arm64": "1.20251011.0", - "@cloudflare/workerd-windows-64": "1.20251011.0" - } - }, - "node_modules/wrangler/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wrangler/node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11095,7 +10048,7 @@ "version": "0.4.12", "license": "ISC", "dependencies": { - "@cloudflare/containers": "^0.0.29" + "@cloudflare/containers": "^0.0.30" }, "devDependencies": { "@repo/shared": "*" @@ -11106,13 +10059,13 @@ "version": "0.0.2", "dependencies": { "@repo/shared": "*", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "zod": "^3.22.3" }, "devDependencies": { "@repo/typescript-config": "*", - "@types/bun": "^1.2.19", - "typescript": "^5.8.3" + "@types/bun": "^1.3.1", + "typescript": "^5.9.3" } }, "packages/shared": { @@ -11120,7 +10073,7 @@ "version": "0.0.0", "devDependencies": { "@repo/typescript-config": "*", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } }, "tooling/typescript-config": { diff --git a/package.json b/package.json index 2fe944fe..41189e93 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "an api for computers", "scripts": { "typecheck": "turbo run typecheck", - "check": "biome check && turbo run typecheck", + "check": "sherif && biome check && turbo run typecheck", "fix": "biome check --fix && turbo run typecheck", "build": "turbo run build", "build:clean": "turbo run build --force", @@ -22,33 +22,35 @@ "examples/*" ], "devDependencies": { - "@biomejs/biome": "^2.1.2", + "@biomejs/biome": "^2.3.2", "@changesets/changelog-github": "^0.5.1", - "@changesets/cli": "^2.29.5", - "@cloudflare/vite-plugin": "^1.13.12", - "@cloudflare/vitest-pool-workers": "^0.9.12", - "@cloudflare/workers-types": "^4.20250725.0", - "@types/bun": "^1.2.19", - "@types/node": "^24.9.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@changesets/cli": "^2.29.7", + "@cloudflare/vite-plugin": "^1.13.17", + "@cloudflare/vitest-pool-workers": "^0.10.2", + "@cloudflare/workers-types": "^4.20251014.0", + "@types/bun": "^1.3.1", + "@types/node": "^24.9.2", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", "@types/ws": "^8.18.1", - "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react": "^5.1.0", "@vitest/ui": "^3.2.4", "fast-glob": "^3.3.3", - "happy-dom": "^20.0.0", + "happy-dom": "^20.0.10", "pkg-pr-new": "^0.0.60", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "prettier": "^3.6.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sherif": "^1.7.0", "tsdown": "^0.15.11", - "tsx": "^4.20.3", + "tsx": "^4.20.6", "turbo": "^2.5.8", - "typescript": "^5.8.3", - "vite": "^7.1.11", + "typescript": "^5.9.3", + "vite": "^7.1.12", "vitest": "^3.2.4", - "wrangler": "^4.44.0", + "wrangler": "^4.45.2", "ws": "^8.18.3" }, "private": true, - "packageManager": "npm@11.5.1" + "packageManager": "npm@11.6.2" } diff --git a/packages/sandbox-container/package.json b/packages/sandbox-container/package.json index 4796f590..c2d0237d 100644 --- a/packages/sandbox-container/package.json +++ b/packages/sandbox-container/package.json @@ -13,12 +13,12 @@ }, "dependencies": { "@repo/shared": "*", - "esbuild": "^0.25.10", + "esbuild": "^0.25.11", "zod": "^3.22.3" }, "devDependencies": { "@repo/typescript-config": "*", - "@types/bun": "^1.2.19", - "typescript": "^5.8.3" + "@types/bun": "^1.3.1", + "typescript": "^5.9.3" } } diff --git a/packages/sandbox/package.json b/packages/sandbox/package.json index cd2e3e7c..f7254b2e 100644 --- a/packages/sandbox/package.json +++ b/packages/sandbox/package.json @@ -8,7 +8,7 @@ "description": "A sandboxed environment for running commands", "type": "module", "dependencies": { - "@cloudflare/containers": "^0.0.29" + "@cloudflare/containers": "^0.0.30" }, "devDependencies": { "@repo/shared": "*" diff --git a/packages/shared/package.json b/packages/shared/package.json index 5422d06a..7d4101f2 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -22,6 +22,6 @@ }, "devDependencies": { "@repo/typescript-config": "*", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } From 376f71a21ffb762be5aae39edc5469fa3db4a5bf Mon Sep 17 00:00:00 2001 From: Sunil Pai Date: Wed, 29 Oct 2025 14:19:06 +0000 Subject: [PATCH 2/2] formatting --- .changeset/chilly-pugs-cross.md | 2 +- .changeset/giant-paths-enjoy.md | 2 +- .github/changeset-publish.ts | 10 +- .github/changeset-version.ts | 83 +- .github/resolve-workspace-versions.ts | 20 +- .github/version-script.ts | 14 +- .github/workflows/claude-code-review.yml | 1 - .github/workflows/claude.yml | 1 - .github/workflows/cleanup-stale.yml | 2 +- .github/workflows/cleanup.yml | 2 +- .github/workflows/pkg-pr-new.yml | 3 +- .github/workflows/pullrequest.yml | 4 +- .github/workflows/release.yml | 6 +- .mcp.json | 2 +- .prettierignore | 1 + .prettierrc | 4 + .vscode/settings.json | 28 +- CLAUDE.md | 24 +- biome.json | 124 +- docs/JUPYTER_NOTEBOOKS.md | 61 +- docs/SESSION_EXECUTION.md | 11 + examples/basic/README.md | 4 + .../basic/app/components/LaTeXRenderer.tsx | 44 +- .../basic/app/components/MarkdownRenderer.tsx | 208 ++- examples/basic/app/index.tsx | 1438 +++++++++-------- examples/basic/app/style.css | 166 +- examples/basic/index.html | 2 +- examples/basic/shared/examples.ts | 122 +- .../basic/src/endpoints/createTestBinary.ts | 20 +- examples/basic/src/endpoints/execute.ts | 37 +- examples/basic/src/endpoints/executeStream.ts | 93 +- examples/basic/src/endpoints/fileDelete.ts | 14 +- examples/basic/src/endpoints/fileList.ts | 14 +- examples/basic/src/endpoints/fileMove.ts | 14 +- examples/basic/src/endpoints/fileRead.ts | 10 +- .../basic/src/endpoints/fileReadStream.ts | 65 +- examples/basic/src/endpoints/fileRename.ts | 14 +- examples/basic/src/endpoints/gitCheckout.ts | 18 +- examples/basic/src/endpoints/index.ts | 36 +- examples/basic/src/endpoints/mkdir.ts | 19 +- examples/basic/src/endpoints/notebook.ts | 90 +- examples/basic/src/endpoints/ports.ts | 48 +- examples/basic/src/endpoints/processGet.ts | 31 +- examples/basic/src/endpoints/processKill.ts | 50 +- examples/basic/src/endpoints/processList.ts | 21 +- examples/basic/src/endpoints/processLogs.ts | 195 ++- examples/basic/src/endpoints/processStart.ts | 46 +- examples/basic/src/endpoints/templates.ts | 140 +- examples/basic/src/http.ts | 10 +- examples/basic/src/index.ts | 272 ++-- examples/basic/vite.config.ts | 8 +- examples/claude-code/README.md | 4 +- examples/claude-code/package.json | 40 +- examples/claude-code/src/index.ts | 54 +- examples/claude-code/tsconfig.json | 26 +- examples/claude-code/wrangler.jsonc | 124 +- examples/code-interpreter/README.md | 3 + examples/code-interpreter/src/index.ts | 260 +-- examples/code-interpreter/tsconfig.json | 26 +- examples/minimal/README.md | 4 + examples/minimal/package.json | 40 +- examples/minimal/src/index.ts | 22 +- examples/minimal/tsconfig.json | 26 +- examples/minimal/wrangler.jsonc | 60 +- package.json | 1 + packages/sandbox-container/src/config.ts | 32 +- .../sandbox-container/src/core/container.ts | 39 +- packages/sandbox-container/src/core/router.ts | 67 +- packages/sandbox-container/src/core/types.ts | 66 +- .../src/handlers/base-handler.ts | 32 +- .../src/handlers/execute-handler.ts | 66 +- .../src/handlers/file-handler.ts | 140 +- .../src/handlers/git-handler.ts | 24 +- .../src/handlers/interpreter-handler.ts | 58 +- .../src/handlers/misc-handler.ts | 44 +- .../src/handlers/port-handler.ts | 95 +- .../src/handlers/process-handler.ts | 110 +- .../src/handlers/session-handler.ts | 31 +- packages/sandbox-container/src/index.ts | 25 +- .../src/interpreter-service.ts | 119 +- .../src/managers/file-manager.ts | 46 +- .../src/managers/git-manager.ts | 56 +- .../src/managers/port-manager.ts | 28 +- .../src/managers/process-manager.ts | 4 +- .../sandbox-container/src/middleware/cors.ts | 8 +- .../src/middleware/logging.ts | 22 +- .../sandbox-container/src/mime-processor.ts | 441 ++--- .../sandbox-container/src/routes/setup.ts | 124 +- .../executors/javascript/node_executor.ts | 42 +- .../executors/typescript/ts_executor.ts | 44 +- .../src/runtime/process-pool.ts | 169 +- .../src/security/security-adapter.ts | 12 +- .../src/security/security-service.ts | 45 +- .../src/services/file-service.ts | 416 ++++- .../src/services/git-service.ts | 227 ++- .../src/services/interpreter-service.ts | 93 +- .../src/services/port-service.ts | 160 +- .../src/services/process-service.ts | 234 ++- .../src/services/session-manager.ts | 228 ++- packages/sandbox-container/src/session.ts | 186 ++- .../sandbox-container/src/shell-escape.ts | 8 +- .../src/validation/request-validator.ts | 51 +- .../src/validation/schemas.ts | 38 +- .../tests/handlers/execute-handler.test.ts | 103 +- .../tests/handlers/file-handler.test.ts | 150 +- .../tests/handlers/git-handler.test.ts | 97 +- .../handlers/interpreter-handler.test.ts | 177 +- .../tests/handlers/misc-handler.test.ts | 124 +- .../tests/handlers/port-handler.test.ts | 197 ++- .../tests/handlers/process-handler.test.ts | 209 ++- .../tests/handlers/session-handler.test.ts | 123 +- .../tests/managers/file-manager.test.ts | 219 ++- .../tests/managers/git-manager.test.ts | 139 +- .../tests/managers/port-manager.test.ts | 144 +- .../tests/managers/process-manager.test.ts | 8 +- .../tests/security/security-service.test.ts | 38 +- .../tests/services/file-service.test.ts | 179 +- .../tests/services/git-service.test.ts | 125 +- .../tests/services/port-service.test.ts | 66 +- .../tests/services/process-service.test.ts | 99 +- .../sandbox-container/tests/session.test.ts | 74 +- .../sandbox-container/tests/test-utils.ts | 5 +- .../validation/request-validator.test.ts | 35 +- packages/sandbox/src/clients/base-client.ts | 59 +- .../sandbox/src/clients/command-client.ts | 16 +- packages/sandbox/src/clients/file-client.ts | 57 +- packages/sandbox/src/clients/git-client.ts | 7 +- packages/sandbox/src/clients/index.ts | 28 +- .../sandbox/src/clients/interpreter-client.ts | 98 +- packages/sandbox/src/clients/port-client.ts | 16 +- .../sandbox/src/clients/process-client.ts | 19 +- .../sandbox/src/clients/sandbox-client.ts | 6 +- packages/sandbox/src/clients/types.ts | 8 +- .../sandbox/src/clients/utility-client.ts | 16 +- packages/sandbox/src/errors/adapter.ts | 122 +- packages/sandbox/src/errors/classes.ts | 253 ++- packages/sandbox/src/errors/index.ts | 14 +- packages/sandbox/src/file-stream.ts | 17 +- packages/sandbox/src/index.ts | 37 +- packages/sandbox/src/interpreter.ts | 91 +- packages/sandbox/src/request-handler.ts | 45 +- packages/sandbox/src/sandbox.ts | 432 +++-- packages/sandbox/src/security.ts | 27 +- packages/sandbox/src/sse-parser.ts | 7 +- packages/sandbox/tests/base-client.test.ts | 196 ++- packages/sandbox/tests/command-client.test.ts | 261 +-- packages/sandbox/tests/file-client.test.ts | 506 +++--- packages/sandbox/tests/file-stream.test.ts | 44 +- packages/sandbox/tests/get-sandbox.test.ts | 20 +- packages/sandbox/tests/git-client.test.ts | 289 ++-- packages/sandbox/tests/port-client.test.ts | 208 ++- packages/sandbox/tests/process-client.test.ts | 383 +++-- .../sandbox/tests/request-handler.test.ts | 182 ++- packages/sandbox/tests/sandbox.test.ts | 178 +- packages/sandbox/tests/sse-parser.test.ts | 33 +- packages/sandbox/tests/utility-client.test.ts | 151 +- packages/sandbox/tsdown.config.ts | 8 +- packages/sandbox/vitest.config.ts | 12 +- packages/shared/src/errors/codes.ts | 4 +- packages/shared/src/errors/contexts.ts | 12 +- packages/shared/src/errors/index.ts | 4 +- packages/shared/src/errors/status-map.ts | 2 +- packages/shared/src/errors/types.ts | 6 +- packages/shared/src/index.ts | 9 +- packages/shared/src/interpreter-types.ts | 64 +- packages/shared/src/logger/index.ts | 13 +- packages/shared/src/logger/logger.ts | 22 +- packages/shared/src/logger/types.ts | 2 +- packages/shared/src/types.ts | 128 +- packages/shared/tests/logger.test.ts | 54 +- packages/shared/vitest.config.ts | 6 +- tests/e2e/build-test-workflow.test.ts | 39 +- tests/e2e/code-interpreter-workflow.test.ts | 287 ++-- tests/e2e/environment-workflow.test.ts | 136 +- tests/e2e/file-operations-workflow.test.ts | 539 +++--- tests/e2e/fixtures/websocket-echo-server.ts | 4 +- tests/e2e/git-clone-workflow.test.ts | 187 ++- tests/e2e/helpers/test-fixtures.ts | 25 +- tests/e2e/helpers/wrangler-runner.ts | 33 +- tests/e2e/keepalive-workflow.test.ts | 129 +- tests/e2e/process-lifecycle-workflow.test.ts | 599 ++++--- .../session-state-isolation-workflow.test.ts | 278 ++-- .../e2e/streaming-operations-workflow.test.ts | 277 ++-- tests/e2e/test-worker/index.ts | 209 ++- tests/e2e/websocket-workflow.test.ts | 54 +- turbo.json | 16 +- vitest.e2e.config.ts | 8 +- 187 files changed, 10314 insertions(+), 6963 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.changeset/chilly-pugs-cross.md b/.changeset/chilly-pugs-cross.md index 5c528f2a..2488cfb3 100644 --- a/.changeset/chilly-pugs-cross.md +++ b/.changeset/chilly-pugs-cross.md @@ -1,5 +1,5 @@ --- -"@cloudflare/sandbox": patch +'@cloudflare/sandbox': patch --- Update dependencies diff --git a/.changeset/giant-paths-enjoy.md b/.changeset/giant-paths-enjoy.md index 3bcffb15..79151b1f 100644 --- a/.changeset/giant-paths-enjoy.md +++ b/.changeset/giant-paths-enjoy.md @@ -1,5 +1,5 @@ --- -"@cloudflare/sandbox": patch +'@cloudflare/sandbox': patch --- Fix type generation diff --git a/.github/changeset-publish.ts b/.github/changeset-publish.ts index 7bac72e9..b5d011c6 100644 --- a/.github/changeset-publish.ts +++ b/.github/changeset-publish.ts @@ -1,8 +1,8 @@ -import { execSync } from "node:child_process"; +import { execSync } from 'node:child_process'; -execSync("npx tsx ./.github/resolve-workspace-versions.ts", { - stdio: "inherit", +execSync('npx tsx ./.github/resolve-workspace-versions.ts', { + stdio: 'inherit' }); -execSync("npx changeset publish", { - stdio: "inherit", +execSync('npx changeset publish', { + stdio: 'inherit' }); diff --git a/.github/changeset-version.ts b/.github/changeset-version.ts index ff5737a3..c1548f71 100644 --- a/.github/changeset-version.ts +++ b/.github/changeset-version.ts @@ -1,25 +1,29 @@ -import { execSync } from "node:child_process"; -import * as fs from "node:fs"; -import fg from "fast-glob"; +import { execSync } from 'node:child_process'; +import * as fs from 'node:fs'; +import fg from 'fast-glob'; // This script is used by the `release.yml` workflow to update the version of the packages being released. // The standard step is only to run `changeset version` but this does not update the package-lock.json file. // So we also run `npm install`, which does this update. // This is a workaround until this is handled automatically by `changeset version`. // See https://github.com/changesets/changesets/issues/421. -execSync("npx changeset version", { - stdio: "inherit", +execSync('npx changeset version', { + stdio: 'inherit' }); -execSync("npm install", { - stdio: "inherit", +execSync('npm install', { + stdio: 'inherit' }); // Update all version references across the codebase after changeset updates package.json try { - const packageJson = JSON.parse(fs.readFileSync("./packages/sandbox/package.json", "utf-8")); + const packageJson = JSON.parse( + fs.readFileSync('./packages/sandbox/package.json', 'utf-8') + ); const newVersion = packageJson.version; - console.log(`\n🔍 Searching for version references to update to ${newVersion}...\n`); + console.log( + `\n🔍 Searching for version references to update to ${newVersion}...\n` + ); // Patterns to match version references in different contexts const versionPatterns = [ @@ -27,69 +31,69 @@ try { { pattern: /export const SDK_VERSION = '[\d.]+';/g, replacement: `export const SDK_VERSION = '${newVersion}';`, - description: "SDK version constant in version.ts", + description: 'SDK version constant in version.ts' }, // Docker image versions (production and test) { pattern: /FROM docker\.io\/cloudflare\/sandbox:[\d.]+/g, replacement: `FROM docker.io/cloudflare/sandbox:${newVersion}`, - description: "Production Docker image", + description: 'Production Docker image' }, { pattern: /# FROM docker\.io\/cloudflare\/sandbox:[\d.]+/g, replacement: `# FROM docker.io/cloudflare/sandbox:${newVersion}`, - description: "Commented production Docker image", + description: 'Commented production Docker image' }, { pattern: /FROM cloudflare\/sandbox-test:[\d.]+/g, replacement: `FROM cloudflare/sandbox-test:${newVersion}`, - description: "Test Docker image", + description: 'Test Docker image' }, { pattern: /docker\.io\/cloudflare\/sandbox-test:[\d.]+/g, replacement: `docker.io/cloudflare/sandbox-test:${newVersion}`, - description: "Test Docker image (docker.io)", + description: 'Test Docker image (docker.io)' }, // Image tags in docker commands { pattern: /cloudflare\/sandbox:[\d.]+/g, replacement: `cloudflare/sandbox:${newVersion}`, - description: "Docker image reference", + description: 'Docker image reference' }, { pattern: /cloudflare\/sandbox-test:[\d.]+/g, replacement: `cloudflare/sandbox-test:${newVersion}`, - description: "Test Docker image reference", - }, + description: 'Test Docker image reference' + } ]; // Files to search and update const filePatterns = [ - "**/*.md", // All markdown files - "**/Dockerfile", // All Dockerfiles - "**/Dockerfile.*", // Dockerfile variants - "**/*.ts", // TypeScript files (for documentation comments) - "**/*.js", // JavaScript files - "**/*.json", // JSON configs (but not package.json/package-lock.json) - "**/*.yaml", // YAML configs - "**/*.yml", // YML configs + '**/*.md', // All markdown files + '**/Dockerfile', // All Dockerfiles + '**/Dockerfile.*', // Dockerfile variants + '**/*.ts', // TypeScript files (for documentation comments) + '**/*.js', // JavaScript files + '**/*.json', // JSON configs (but not package.json/package-lock.json) + '**/*.yaml', // YAML configs + '**/*.yml' // YML configs ]; // Ignore patterns const ignorePatterns = [ - "**/node_modules/**", - "**/dist/**", - "**/build/**", - "**/.git/**", - "**/package.json", // Don't modify package.json (changeset does this) - "**/package-lock.json", // Don't modify package-lock.json (npm install does this) - "**/.github/changeset-version.ts", // Don't modify this script itself + '**/node_modules/**', + '**/dist/**', + '**/build/**', + '**/.git/**', + '**/package.json', // Don't modify package.json (changeset does this) + '**/package-lock.json', // Don't modify package-lock.json (npm install does this) + '**/.github/changeset-version.ts' // Don't modify this script itself ]; // Find all matching files const files = await fg(filePatterns, { ignore: ignorePatterns, - onlyFiles: true, + onlyFiles: true }); console.log(`📁 Found ${files.length} files to check\n`); @@ -98,7 +102,7 @@ try { let totalReplacementsCount = 0; for (const file of files) { - let content = fs.readFileSync(file, "utf-8"); + let content = fs.readFileSync(file, 'utf-8'); let fileModified = false; let fileReplacementsCount = 0; @@ -116,14 +120,17 @@ try { fs.writeFileSync(file, content); updatedFilesCount++; totalReplacementsCount += fileReplacementsCount; - console.log(` ✅ ${file} (${fileReplacementsCount} replacement${fileReplacementsCount > 1 ? 's' : ''})`); + console.log( + ` ✅ ${file} (${fileReplacementsCount} replacement${fileReplacementsCount > 1 ? 's' : ''})` + ); } } - console.log(`\n✨ Updated ${totalReplacementsCount} version reference${totalReplacementsCount !== 1 ? 's' : ''} across ${updatedFilesCount} file${updatedFilesCount !== 1 ? 's' : ''}`); + console.log( + `\n✨ Updated ${totalReplacementsCount} version reference${totalReplacementsCount !== 1 ? 's' : ''} across ${updatedFilesCount} file${updatedFilesCount !== 1 ? 's' : ''}` + ); console.log(` New version: ${newVersion}\n`); - } catch (error) { - console.error("❌ Failed to update file versions:", error); + console.error('❌ Failed to update file versions:', error); // Don't fail the whole release for this } diff --git a/.github/resolve-workspace-versions.ts b/.github/resolve-workspace-versions.ts index 73617beb..6db5b214 100644 --- a/.github/resolve-workspace-versions.ts +++ b/.github/resolve-workspace-versions.ts @@ -1,8 +1,8 @@ // this looks for all package.jsons in /packages/**/package.json // and replaces it with the actual version ids -import * as fs from "node:fs"; -import fg from "fast-glob"; +import * as fs from 'node:fs'; +import fg from 'fast-glob'; // we do this in 2 passes // first let's cycle through all packages and get thier version numbers @@ -11,12 +11,12 @@ import fg from "fast-glob"; const packageJsons: Record = {}; for await (const file of await fg.glob( - "./(packages|examples|guides)/*/package.json" + './(packages|examples|guides)/*/package.json' )) { - const packageJson = JSON.parse(fs.readFileSync(file, "utf8")); + const packageJson = JSON.parse(fs.readFileSync(file, 'utf8')); packageJsons[packageJson.name] = { file, - packageJson, + packageJson }; } @@ -28,17 +28,17 @@ for (const [packageName, { file, packageJson }] of Object.entries( )) { let changed = false; for (const field of [ - "dependencies", - "devDependencies", - "peerDependencies", - "optionalDependencies", + 'dependencies', + 'devDependencies', + 'peerDependencies', + 'optionalDependencies' ]) { for (const [dependencyName, dependencyVersion] of Object.entries( packageJson[field] || {} )) { if (dependencyName in packageJsons) { let actualVersion = packageJsons[dependencyName].packageJson.version; - if (!actualVersion.startsWith("0.0.0-")) { + if (!actualVersion.startsWith('0.0.0-')) { actualVersion = `^${actualVersion}`; } diff --git a/.github/version-script.ts b/.github/version-script.ts index e2d45b54..d32db679 100644 --- a/.github/version-script.ts +++ b/.github/version-script.ts @@ -1,13 +1,13 @@ -import * as fs from "node:fs"; -import { execSync } from "node:child_process"; +import * as fs from 'node:fs'; +import { execSync } from 'node:child_process'; async function main() { try { - console.log("Getting current git hash..."); - const stdout = execSync("git rev-parse --short HEAD").toString(); - console.log("Git hash:", stdout.trim()); + console.log('Getting current git hash...'); + const stdout = execSync('git rev-parse --short HEAD').toString(); + console.log('Git hash:', stdout.trim()); - for (const path of ["./packages/sandbox/package.json"]) { - const packageJson = JSON.parse(fs.readFileSync(path, "utf-8")); + for (const path of ['./packages/sandbox/package.json']) { + const packageJson = JSON.parse(fs.readFileSync(path, 'utf-8')); packageJson.version = `0.0.0-${stdout.trim()}`; fs.writeFileSync(path, `${JSON.stringify(packageJson, null, 2)}\n`); } diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index deeefd50..7a5d267e 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -64,4 +64,3 @@ jobs: # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options claude_args: '--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh api:*)"' - diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index f8188951..501e5358 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -55,4 +55,3 @@ jobs: # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options # claude_args: '--allowed-tools Bash(gh pr:*)' - diff --git a/.github/workflows/cleanup-stale.yml b/.github/workflows/cleanup-stale.yml index bf49cf3b..9ae4f9c2 100644 --- a/.github/workflows/cleanup-stale.yml +++ b/.github/workflows/cleanup-stale.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - name: Install dependencies run: npm ci diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 5def40d6..345101b2 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - name: Install dependencies run: npm ci diff --git a/.github/workflows/pkg-pr-new.yml b/.github/workflows/pkg-pr-new.yml index f057bdd5..da272cb8 100644 --- a/.github/workflows/pkg-pr-new.yml +++ b/.github/workflows/pkg-pr-new.yml @@ -12,7 +12,6 @@ on: - '!**/*.md' - '!.changeset/**' - jobs: publish-preview: runs-on: ubuntu-latest @@ -28,7 +27,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index ba355458..a6d520a0 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - uses: oven-sh/setup-bun@v2 with: @@ -72,7 +72,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - uses: oven-sh/setup-bun@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 69d2ee5f..82a791d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - uses: oven-sh/setup-bun@v2 with: @@ -78,7 +78,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - uses: oven-sh/setup-bun@v2 with: @@ -131,7 +131,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 24 - cache: "npm" + cache: 'npm' - uses: oven-sh/setup-bun@v2 with: diff --git a/.mcp.json b/.mcp.json index 0bad8dd3..c8b6435a 100644 --- a/.mcp.json +++ b/.mcp.json @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..76a47069 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +packages/sandbox/CHANGELOG.md diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..e9c0f50f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "trailingComma": "none", + "singleQuote": true +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 164341b5..9182bec3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,15 +1,15 @@ { - "[javascript]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[json]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[typescript]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "editor.codeActionsOnSave": { - "source.fixAll.biome": "explicit", - "source.organizeImports.biome": "explicit" - } -} \ No newline at end of file + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" + } +} diff --git a/CLAUDE.md b/CLAUDE.md index 4344aa10..bb84ca3d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,6 +5,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Documentation Resources **Always consult the Cloudflare Docs MCP when working on this repository.** The MCP provides comprehensive documentation about: + - API usage patterns and examples - Architecture concepts and best practices - Configuration reference (wrangler, Dockerfile) @@ -92,6 +93,7 @@ npm run docker:rebuild # Rebuild container image locally (includes clean bui ``` **Note:** Docker images are automatically built and published by CI (`release.yml`): + - Beta images on every main commit - Stable images when "Version Packages" PR is merged - Multi-arch builds (amd64, arm64) handled by CI @@ -101,6 +103,7 @@ npm run docker:rebuild # Rebuild container image locally (includes clean bui ### Development Server From an example directory (e.g., `examples/minimal/`): + ```bash npm run dev # Start wrangler dev server (builds Docker on first run) ``` @@ -116,12 +119,15 @@ npm run dev # Start wrangler dev server (builds Docker on first r 1. Make your changes 2. **Run code quality checks after any meaningful change:** + ```bash npm run check # Runs Biome linter + typecheck ``` + This catches type errors that often expose real issues with code changes. Fix any issues before proceeding. 3. **Run unit tests to verify your changes:** + ```bash npm test ``` @@ -129,9 +135,10 @@ npm run dev # Start wrangler dev server (builds Docker on first r 4. Create a changeset if your change affects published packages: Create a new file in `.changeset/` directory (e.g., `.changeset/your-feature-name.md`): + ```markdown --- - "@cloudflare/sandbox": patch + '@cloudflare/sandbox': patch --- Brief description of your change @@ -159,6 +166,7 @@ npm run dev # Start wrangler dev server (builds Docker on first r **Tests are critical** - they verify functionality at multiple levels and run on every PR. **Development practice:** After making any meaningful code change: + 1. Run `npm run check` to catch type errors (these often expose real issues) 2. Run `npm test` to verify unit tests pass 3. Run E2E tests if touching core functionality @@ -177,6 +185,7 @@ npm test -w @repo/sandbox-container # Container runtime tests (Bun) ``` **Architecture:** + - **SDK tests** (`packages/sandbox/tests/`) run in Workers runtime via `@cloudflare/vitest-pool-workers` - **Container tests** (`packages/sandbox-container/tests/`) run in Bun runtime - Mock container for isolated testing (SDK), no Docker required @@ -200,6 +209,7 @@ npm run test:e2e -- -- tests/e2e/git-clone-workflow.test.ts -t 'should handle cl ``` **Architecture:** + - Tests in `tests/e2e/` run against real Cloudflare Workers + Docker containers - **In CI**: Tests deploy to actual Cloudflare infrastructure and run against deployed workers - **Locally**: Each test file spawns its own `wrangler dev` instance @@ -208,6 +218,7 @@ npm run test:e2e -- -- tests/e2e/git-clone-workflow.test.ts -t 'should handle cl - Longer timeouts (2min per test) for container operations **CI behavior:** E2E tests in CI (`pullrequest.yml`): + 1. Build Docker image locally (`npm run docker:local`) 2. Deploy test worker to Cloudflare with unique name (pr-XXX) 3. Run E2E tests against deployed worker URL @@ -238,6 +249,7 @@ Entry point: `packages/sandbox-container/src/index.ts` starts Bun HTTP server on ## Monorepo Structure Uses npm workspaces + Turbo: + - `packages/sandbox`: Main SDK package - `packages/shared`: Shared types - `packages/sandbox-container`: Container runtime @@ -251,6 +263,7 @@ Turbo handles task orchestration (`turbo.json`) with dependency-aware builds. ### TypeScript **Never use the `any` type** unless absolutely necessary (which should be a final resort): + - First, look for existing types that can be reused appropriately - If no suitable type exists, define a proper type in the right location: - Shared types → `packages/shared/src/types.ts` or relevant subdirectory @@ -274,6 +287,7 @@ Turbo handles task orchestration (`turbo.json`) with dependency-aware builds. **Be concise, not verbose.** Every word should add value. Avoid unnecessary details about implementation mechanics - focus on what changed and why it matters. Example: + ``` Add session isolation for concurrent executions @@ -289,25 +303,29 @@ different users share the same sandbox instance. ## Important Patterns ### Error Handling + - Custom error classes in `packages/shared/src/errors/` - Errors flow from container → Sandbox DO → Worker - Use `ErrorCode` enum for consistent error types ### Logging + - Centralized logger from `@repo/shared` - Structured logging with component context - Configurable via `SANDBOX_LOG_LEVEL` and `SANDBOX_LOG_FORMAT` env vars ### Session Management + - Sessions isolate execution contexts (working directory, env vars, etc.) - Default session created automatically - Multiple sessions per sandbox supported ### Port Management + - Expose internal services via preview URLs - Token-based authentication for exposed ports - Automatic cleanup on sandbox sleep -- **Production requirement**: Preview URLs require custom domain with wildcard DNS (*.yourdomain.com) +- **Production requirement**: Preview URLs require custom domain with wildcard DNS (\*.yourdomain.com) - `.workers.dev` domains do NOT support the subdomain patterns needed for preview URLs - See Cloudflare docs for "Deploy to Production" guide when ready to expose services @@ -328,12 +346,14 @@ different users share the same sandbox instance. ## Container Base Image The container runtime uses Ubuntu 22.04 with: + - Python 3.11 (with matplotlib, numpy, pandas, ipython) - Node.js 20 LTS - Bun 1.x runtime (powers the container HTTP server) - Git, curl, wget, jq, and other common utilities When modifying the base image (`packages/sandbox/Dockerfile`), remember: + - Keep images lean - every MB affects cold start time - Pin versions for reproducibility - Clean up package manager caches to reduce image size diff --git a/biome.json b/biome.json index 6481e336..fe7078e8 100644 --- a/biome.json +++ b/biome.json @@ -1,64 +1,64 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.2/schema.json", - "assist": { - "actions": { - "source": { - "useSortedKeys": "off" - } - }, - "enabled": true - }, - "files": { - "ignoreUnknown": false, - "includes": [ - "packages/**", - "!node_modules", - "!**/node_modules", - "!package.json", - "!**/package.json", - "!dist", - "!**/dist", - "!.wrangler", - "!**/.wrangler", - "!wrangler.jsonc", - "!**/wrangler.jsonc", - "!./tsconfig.json", - "!**/tsconfig.json", - "!**/normalize.css", - "!coverage", - "!**/coverage" - ] - }, - "formatter": { - "enabled": false, - "indentStyle": "tab" - }, - "linter": { - "enabled": true, - "rules": { - "a11y": { - "useKeyWithClickEvents": "off" - }, - "complexity": { - "noBannedTypes": "off" - }, - "correctness": { - "noUnusedFunctionParameters": "off", - "noUnusedImports": "off", - "noUnusedVariables": "off" - }, - "recommended": true, - "style": { - "noNonNullAssertion": "off" - }, - "suspicious": { - "noExplicitAny": "off" - } - } - }, - "vcs": { - "clientKind": "git", - "enabled": false, - "useIgnoreFile": false - } + "$schema": "https://biomejs.dev/schemas/2.3.2/schema.json", + "assist": { + "actions": { + "source": { + "useSortedKeys": "off" + } + }, + "enabled": true + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "packages/**", + "!node_modules", + "!**/node_modules", + "!package.json", + "!**/package.json", + "!dist", + "!**/dist", + "!.wrangler", + "!**/.wrangler", + "!wrangler.jsonc", + "!**/wrangler.jsonc", + "!./tsconfig.json", + "!**/tsconfig.json", + "!**/normalize.css", + "!coverage", + "!**/coverage" + ] + }, + "formatter": { + "enabled": false, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "a11y": { + "useKeyWithClickEvents": "off" + }, + "complexity": { + "noBannedTypes": "off" + }, + "correctness": { + "noUnusedFunctionParameters": "off", + "noUnusedImports": "off", + "noUnusedVariables": "off" + }, + "recommended": true, + "style": { + "noNonNullAssertion": "off" + }, + "suspicious": { + "noExplicitAny": "off" + } + } + }, + "vcs": { + "clientKind": "git", + "enabled": false, + "useIgnoreFile": false + } } diff --git a/docs/JUPYTER_NOTEBOOKS.md b/docs/JUPYTER_NOTEBOOKS.md index b9b438fb..ddaaaaf7 100644 --- a/docs/JUPYTER_NOTEBOOKS.md +++ b/docs/JUPYTER_NOTEBOOKS.md @@ -5,6 +5,7 @@ The Sandbox SDK provides lightweight code interpreters by default for optimal pe ## Overview This guide shows how to extend your sandbox container with Jupyter server to enable: + - Full Jupyter notebook interface at `http://your-preview-url:8888` - Interactive Python and JavaScript kernels - Rich visualizations and data analysis tools @@ -100,14 +101,14 @@ exec /container-server/startup.sh Once deployed, access Jupyter through your sandbox: ```typescript -import { getSandbox } from "@cloudflare/sandbox"; +import { getSandbox } from '@cloudflare/sandbox'; export default { async fetch(request, env) { - const sandbox = getSandbox(env.Sandbox, "jupyter-env"); + const sandbox = getSandbox(env.Sandbox, 'jupyter-env'); // Expose Jupyter port - const preview = await sandbox.exposePort(8888, { name: "jupyter" }); + const preview = await sandbox.exposePort(8888, { name: 'jupyter' }); return new Response(`Jupyter available at: ${preview.url}`); } @@ -118,38 +119,44 @@ export default { ```typescript // Create sample data files for analysis -await sandbox.writeFile("/workspace/sample_data.csv", ` +await sandbox.writeFile( + '/workspace/sample_data.csv', + ` date,sales,marketing_spend 2024-01-01,1200,450 2024-01-02,980,520 2024-01-03,1100,480 2024-01-04,1350,600 2024-01-05,1050,400 -`); +` +); // Create a starter notebook -await sandbox.writeFile("/workspace/analysis.ipynb", JSON.stringify({ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\nimport matplotlib.pyplot as plt\n\n# Load the sample data\ndf = pd.read_csv('sample_data.csv')\nprint(\"Data loaded successfully!\")\ndf.head()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -})); +await sandbox.writeFile( + '/workspace/analysis.ipynb', + JSON.stringify({ + cells: [ + { + cell_type: 'code', + execution_count: null, + metadata: {}, + outputs: [], + source: [ + 'import pandas as pd\nimport matplotlib.pyplot as plt\n\n# Load the sample data\ndf = pd.read_csv(\'sample_data.csv\')\nprint("Data loaded successfully!")\ndf.head()' + ] + } + ], + metadata: { + kernelspec: { + display_name: 'Python 3', + language: 'python', + name: 'python3' + } + }, + nbformat: 4, + nbformat_minor: 4 + }) +); // Expose Jupyter interface const preview = await sandbox.exposePort(8888); diff --git a/docs/SESSION_EXECUTION.md b/docs/SESSION_EXECUTION.md index 465f6df1..3a4d44f6 100644 --- a/docs/SESSION_EXECUTION.md +++ b/docs/SESSION_EXECUTION.md @@ -3,6 +3,7 @@ This document explains how the container session executes commands reliably while preserving shell state and separating stdout/stderr. ## Goals + - Preserve session state across commands (cwd, env vars, shell functions) - Cleanly separate stdout and stderr for each command - Be robust to commands that produce no output (e.g., `cd`, `mkdir`, variable assignment) @@ -11,6 +12,7 @@ This document explains how the container session executes commands reliably whil ## Two Execution Modes ### Foreground (`exec`) + - Runs in the main bash shell so state persists across commands. - Uses bash process substitution to prefix stdout/stderr inline and append to the per-command log file. - After the command returns, we `wait` to ensure process-substitution consumers finish writing to the log before we write the exit code file. @@ -19,6 +21,7 @@ This document explains how the container session executes commands reliably whil - Process substitution keeps execution local to the main shell and avoids FIFO semantics entirely. Pseudo: + ``` # Foreground { command; } \ @@ -32,6 +35,7 @@ echo "$EXIT_CODE" > "$exit.tmp" && mv "$exit.tmp" "$exit" ``` ### Background (`execStream` / `startProcess`) + - Uses named FIFOs and background labelers: - Create two FIFOs (stdout/stderr) - Start two background readers (labelers) that read each FIFO and prepend a binary prefix per line, appending to the log @@ -40,6 +44,7 @@ echo "$EXIT_CODE" > "$exit.tmp" && mv "$exit.tmp" "$exit" - This pattern works well for concurrent streaming and avoids blocking the main shell. Pseudo: + ``` mkfifo "$sp" "$ep" ( while read; printf "\x01\x01\x01%s\n" "$REPLY"; done < "$sp" ) >> "$log" & r1=$! @@ -54,6 +59,7 @@ mkfifo "$sp" "$ep" ``` ## Binary Prefix Contract + - We use short binary prefixes per line to distinguish streams: - Stdout lines: `\x01\x01\x01` - Stderr lines: `\x02\x02\x02` @@ -61,25 +67,30 @@ mkfifo "$sp" "$ep" - Unprefixed lines (should not occur) are ignored. ## Completion Signaling + - For each command we write an exit code file: `.exit` with the numeric exit code. - The container waits for this file using a hybrid `fs.watch` + polling approach to be robust on tmpfs/overlayfs where rename events may be missed. - Exit file writes are performed via `tmp` + `mv` for atomicity. ## Error Handling and Limits + - Invalid `cwd` (foreground): we write a prefixed stderr line (binary prefix) indicating the failure and return exit code `1`. - Output size limit: large logs are rejected during parsing to protect memory (`MAX_OUTPUT_SIZE_BYTES`). - Timeouts: foreground commands can be configured to time out; an error is raised if the exit file does not appear in time. ## Why Two Patterns? + - Foreground requires state persistence in the main shell. Process substitution provides reliable separation without cross-process FIFO races. - Background requires concurrent streaming and process tracking (PID etc.), which is well-served by FIFOs + labelers without blocking the main shell. ## Testing Notes + - Foreground tests cover silent commands (`cd`, variable assignment), error scenarios, multiline output, and size limits. - Background/streaming tests cover concurrent output, stderr separation, and completion events. - The previous hang class was caused by FIFO open/close races in foreground on silent commands; process substitution removes this class entirely. ## FAQ + - Why not unify on a single mechanism? - Foreground needs state persistence and deterministic completion without cross-process scheduling hazards; process substitution is ideal. - Background needs streaming and concurrency; FIFOs provide clean decoupling. diff --git a/examples/basic/README.md b/examples/basic/README.md index e88e2319..bfeba457 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -49,18 +49,21 @@ This example demonstrates the proper 3-layer architecture for Sandbox SDK applic ### Layer Responsibilities **Frontend (`app/index.tsx`)** + - React-based UI with tabbed interface - HTTP requests to Worker API endpoints - Server-Sent Events for real-time streaming - State management for commands, processes, and ports **Worker (`src/index.ts`)** + - HTTP API gateway with endpoint routing - Direct calls to Sandbox SDK methods - SSE streaming for real-time updates - CORS handling and error responses **Sandbox Durable Object** + - Implements ISandbox interface methods - Process lifecycle management - AsyncIterable streaming capabilities @@ -77,6 +80,7 @@ npm run deploy ## Development ### Project Structure + ``` examples/basic/ ├── src/ diff --git a/examples/basic/app/components/LaTeXRenderer.tsx b/examples/basic/app/components/LaTeXRenderer.tsx index f9ff30ce..096e075a 100644 --- a/examples/basic/app/components/LaTeXRenderer.tsx +++ b/examples/basic/app/components/LaTeXRenderer.tsx @@ -1,6 +1,6 @@ -import React from "react"; -import { InlineMath, BlockMath } from "react-katex"; -import "katex/dist/katex.min.css"; +import React from 'react'; +import { InlineMath, BlockMath } from 'react-katex'; +import 'katex/dist/katex.min.css'; interface LaTeXRendererProps { content: string; @@ -10,13 +10,13 @@ export function LaTeXRenderer({ content }: LaTeXRendererProps) { // Parse the entire content at once to handle multi-line LaTeX const parseContent = (): React.ReactNode[] => { const elements: React.ReactNode[] = []; - + // Regular expressions for finding LaTeX delimiters const combinedRegex = /(\$\$[\s\S]*?\$\$|\$[^\$\n]+?\$)/g; - + let lastIndex = 0; let match; - + while ((match = combinedRegex.exec(content)) !== null) { // Add any text before the match if (match.index > lastIndex) { @@ -37,19 +37,19 @@ export function LaTeXRenderer({ content }: LaTeXRendererProps) { }); } } - + const matchedText = match[0]; - + // Check if it's display math ($$...$$) or inline math ($...$) if (matchedText.startsWith('$$') && matchedText.endsWith('$$')) { // Display math - extract content between $$ const formula = matchedText.slice(2, -2).trim(); elements.push(
- ( -
+
Error rendering LaTeX: {error.message}
{formula}
@@ -61,27 +61,27 @@ export function LaTeXRenderer({ content }: LaTeXRendererProps) { // Inline math - extract content between $ const formula = matchedText.slice(1, -1).trim(); elements.push( - ( - + [Error: {formula}] )} /> ); } - + lastIndex = match.index + matchedText.length; - + // Check if there's a newline immediately after this formula if (content[lastIndex] === '\n') { elements.push(
); lastIndex++; // Skip the newline } } - + // Add any remaining text after the last match if (lastIndex < content.length) { const remainingText = content.substring(lastIndex); @@ -101,18 +101,14 @@ export function LaTeXRenderer({ content }: LaTeXRendererProps) { }); } } - + // If no LaTeX was found, return the original content if (elements.length === 0) { elements.push({content}); } - + return elements; }; - - return ( -
- {parseContent()} -
- ); -} \ No newline at end of file + + return
{parseContent()}
; +} diff --git a/examples/basic/app/components/MarkdownRenderer.tsx b/examples/basic/app/components/MarkdownRenderer.tsx index b48ec06e..3a443315 100644 --- a/examples/basic/app/components/MarkdownRenderer.tsx +++ b/examples/basic/app/components/MarkdownRenderer.tsx @@ -1,5 +1,5 @@ -import ReactMarkdown from "react-markdown"; -import remarkGfm from "remark-gfm"; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; interface MarkdownRendererProps { content: string; @@ -8,100 +8,182 @@ interface MarkdownRendererProps { export function MarkdownRenderer({ content }: MarkdownRendererProps) { return (
-

{children}

, - h2: ({children}) =>

{children}

, - h3: ({children}) =>

{children}

, - - table: ({children}) => ( - + h1: ({ children }) => ( +

+ {children} +

+ ), + h2: ({ children }) => ( +

+ {children} +

+ ), + h3: ({ children }) => ( +

+ {children} +

+ ), + + table: ({ children }) => ( +
{children}
), - - th: ({children}) => ( - + + th: ({ children }) => ( + {children} ), - - td: ({children}) => ( - + + td: ({ children }) => ( + {children} ), - - code({className, children, ...props}) { + + code({ className, children, ...props }) { // Detect inline vs block code by checking if there's a language class const isBlock = className && className.startsWith('language-'); - + if (!isBlock) { return ( - + {children} ); } return ( -
+              
                 
                   {children}
                 
               
); }, - - blockquote: ({children}) => ( -
+ + blockquote: ({ children }) => ( +
{children}
), - - ul: ({children}) =>
    {children}
, - ol: ({children}) =>
    {children}
, - li: ({children}) =>
  • {children}
  • , - hr: () =>
    , - p: ({children}) =>

    {children}

    , - strong: ({children}) => {children}, - em: ({children}) => {children}, + + ul: ({ children }) => ( +
      + {children} +
    + ), + ol: ({ children }) => ( +
      + {children} +
    + ), + li: ({ children }) => ( +
  • + {children} +
  • + ), + hr: () => ( +
    + ), + p: ({ children }) => ( +

    + {children} +

    + ), + strong: ({ children }) => ( + {children} + ), + em: ({ children }) => ( + {children} + ) }} > {content}
    ); -} \ No newline at end of file +} diff --git a/examples/basic/app/index.tsx b/examples/basic/app/index.tsx index 1d9c312b..281c81eb 100644 --- a/examples/basic/app/index.tsx +++ b/examples/basic/app/index.tsx @@ -1,11 +1,11 @@ -import type React from "react"; -import { useEffect, useRef, useState } from "react"; -import { createRoot } from "react-dom/client"; -import "katex/dist/katex.min.css"; -import "./style.css"; -import { codeExamples } from "../shared/examples"; -import { LaTeXRenderer } from "./components/LaTeXRenderer"; -import { MarkdownRenderer } from "./components/MarkdownRenderer"; +import type React from 'react'; +import { useEffect, useRef, useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import 'katex/dist/katex.min.css'; +import './style.css'; +import { codeExamples } from '../shared/examples'; +import { LaTeXRenderer } from './components/LaTeXRenderer'; +import { MarkdownRenderer } from './components/MarkdownRenderer'; // Type definitions interface FileInfo { @@ -90,11 +90,11 @@ class SandboxApiClient { private async doFetch(url: string, options: RequestInit): Promise { const response = await fetch(`${this.baseUrl}${url}`, { headers: { - "Content-Type": "application/json", - "X-Sandbox-Client-Id": this.sandboxId, - ...options.headers, + 'Content-Type': 'application/json', + 'X-Sandbox-Client-Id': this.sandboxId, + ...options.headers }, - ...options, + ...options }); if (!response.ok) { @@ -110,12 +110,12 @@ class SandboxApiClient { } try { - const result = await this.doFetch("/api/execute", { - method: "POST", + const result = await this.doFetch('/api/execute', { + method: 'POST', body: JSON.stringify({ - command: `${command} ${args.join(" ")}`, - ...options, - }), + command: `${command} ${args.join(' ')}`, + ...options + }) }); if (this.onCommandComplete) { @@ -138,78 +138,81 @@ class SandboxApiClient { } async listProcesses() { - return this.doFetch("/api/process/list", { - method: "GET", + return this.doFetch('/api/process/list', { + method: 'GET' }); } async startProcess(command: string, args: string[], options: any = {}) { - return this.doFetch("/api/process/start", { - method: "POST", + return this.doFetch('/api/process/start', { + method: 'POST', body: JSON.stringify({ command, args, - ...options, - }), + ...options + }) }); } async killProcess(processId: string) { return this.doFetch(`/api/process/${processId}`, { - method: "DELETE", + method: 'DELETE' }); } async killAllProcesses() { - return this.doFetch("/api/process/kill-all", { - method: "DELETE", + return this.doFetch('/api/process/kill-all', { + method: 'DELETE' }); } async getProcess(processId: string) { return this.doFetch(`/api/process/${processId}`, { - method: "GET", + method: 'GET' }); } async getProcessLogs(processId: string) { return this.doFetch(`/api/process/${processId}/logs`, { - method: "GET", + method: 'GET' }); } async exposePort(port: number, options: any = {}) { - return this.doFetch("/api/expose-port", { - method: "POST", + return this.doFetch('/api/expose-port', { + method: 'POST', body: JSON.stringify({ port, - ...options, - }), + ...options + }) }); } async unexposePort(port: number) { - return this.doFetch("/api/unexpose-port", { - method: "POST", - body: JSON.stringify({ port }), + return this.doFetch('/api/unexpose-port', { + method: 'POST', + body: JSON.stringify({ port }) }); } async getExposedPorts() { - return this.doFetch("/api/exposed-ports", { - method: "GET", + return this.doFetch('/api/exposed-ports', { + method: 'GET' }); } - async *streamProcessLogs(processId: string, options?: { signal?: AbortSignal }): AsyncGenerator { + async *streamProcessLogs( + processId: string, + options?: { signal?: AbortSignal } + ): AsyncGenerator { const response = await fetch( `${this.baseUrl}/api/process/${processId}/stream`, { headers: { - Accept: "text/event-stream", - "X-Sandbox-Client-Id": this.sandboxId, + Accept: 'text/event-stream', + 'X-Sandbox-Client-Id': this.sandboxId }, - signal: options?.signal, // Pass the abort signal to fetch + signal: options?.signal // Pass the abort signal to fetch } ); @@ -219,7 +222,7 @@ class SandboxApiClient { const reader = response.body!.getReader(); const decoder = new TextDecoder(); - let buffer = ""; // Buffer for incomplete lines + let buffer = ''; // Buffer for incomplete lines try { while (true) { @@ -231,21 +234,21 @@ class SandboxApiClient { // Process complete SSE events while (true) { - const eventEnd = buffer.indexOf("\n\n"); + const eventEnd = buffer.indexOf('\n\n'); if (eventEnd === -1) break; // No complete event yet const eventData = buffer.substring(0, eventEnd); buffer = buffer.substring(eventEnd + 2); // Parse the SSE event - const lines = eventData.split("\n"); + const lines = eventData.split('\n'); for (const line of lines) { - if (line.startsWith("data: ")) { + if (line.startsWith('data: ')) { try { const event = JSON.parse(line.substring(6)); yield event; } catch (e) { - console.warn("Failed to parse SSE event:", line, e); + console.warn('Failed to parse SSE event:', line, e); } } } @@ -257,23 +260,23 @@ class SandboxApiClient { } async writeFile(path: string, content: string, options: any = {}) { - return this.doFetch("/api/write", { - method: "POST", + return this.doFetch('/api/write', { + method: 'POST', body: JSON.stringify({ path, content, - ...options, - }), + ...options + }) }); } async readFile(path: string, options: any = {}) { - return this.doFetch("/api/read", { - method: "POST", + return this.doFetch('/api/read', { + method: 'POST', body: JSON.stringify({ path, - ...options, - }), + ...options + }) }); } @@ -286,12 +289,12 @@ class SandboxApiClient { content: string; }> { const response = await fetch(`${this.baseUrl}/api/read/stream`, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json", - "X-Sandbox-Client-Id": this.sandboxId, + 'Content-Type': 'application/json', + 'X-Sandbox-Client-Id': this.sandboxId }, - body: JSON.stringify({ path }), + body: JSON.stringify({ path }) }); if (!response.ok) { @@ -301,13 +304,13 @@ class SandboxApiClient { // Parse SSE stream with proper buffering to handle chunk splitting const reader = response.body?.getReader(); if (!reader) { - throw new Error("No response body"); + throw new Error('No response body'); } const decoder = new TextDecoder(); let metadata: any = null; - let content = ""; - let buffer = ""; // Buffer for incomplete lines + let content = ''; + let buffer = ''; // Buffer for incomplete lines try { while (true) { @@ -321,53 +324,57 @@ class SandboxApiClient { if (done) break; // Process complete lines from buffer - let newlineIndex = buffer.indexOf("\n"); + let newlineIndex = buffer.indexOf('\n'); while (newlineIndex !== -1) { const line = buffer.slice(0, newlineIndex).trim(); buffer = buffer.slice(newlineIndex + 1); - if (line.startsWith("data: ")) { + if (line.startsWith('data: ')) { try { const data = JSON.parse(line.slice(6)); - if (data.type === "metadata") { + if (data.type === 'metadata') { metadata = data; - } else if (data.type === "chunk") { + } else if (data.type === 'chunk') { content += data.data; - } else if (data.type === "complete") { + } else if (data.type === 'complete') { return { path, - mimeType: metadata?.mimeType || "unknown", + mimeType: metadata?.mimeType || 'unknown', size: metadata?.size || 0, isBinary: metadata?.isBinary || false, - encoding: metadata?.encoding || "utf-8", - content, + encoding: metadata?.encoding || 'utf-8', + content }; - } else if (data.type === "error") { + } else if (data.type === 'error') { throw new Error(data.error); } } catch (parseError) { - console.error("Failed to parse SSE line:", line.substring(0, 100), parseError); + console.error( + 'Failed to parse SSE line:', + line.substring(0, 100), + parseError + ); // Skip malformed lines } } - newlineIndex = buffer.indexOf("\n"); + newlineIndex = buffer.indexOf('\n'); } } // Process any remaining data in buffer - if (buffer.trim().startsWith("data: ")) { + if (buffer.trim().startsWith('data: ')) { try { const data = JSON.parse(buffer.trim().slice(6)); - if (data.type === "complete") { + if (data.type === 'complete') { return { path, - mimeType: metadata?.mimeType || "unknown", + mimeType: metadata?.mimeType || 'unknown', size: metadata?.size || 0, isBinary: metadata?.isBinary || false, - encoding: metadata?.encoding || "utf-8", - content, + encoding: metadata?.encoding || 'utf-8', + content }; } } catch (e) { @@ -378,85 +385,88 @@ class SandboxApiClient { reader.releaseLock(); } - throw new Error("Stream ended unexpectedly"); + throw new Error('Stream ended unexpectedly'); } async deleteFile(path: string) { - return this.doFetch("/api/delete", { - method: "POST", - body: JSON.stringify({ path }), + return this.doFetch('/api/delete', { + method: 'POST', + body: JSON.stringify({ path }) }); } async renameFile(oldPath: string, newPath: string) { - return this.doFetch("/api/rename", { - method: "POST", - body: JSON.stringify({ oldPath, newPath }), + return this.doFetch('/api/rename', { + method: 'POST', + body: JSON.stringify({ oldPath, newPath }) }); } async moveFile(sourcePath: string, destinationPath: string) { - return this.doFetch("/api/move", { - method: "POST", - body: JSON.stringify({ sourcePath, destinationPath }), + return this.doFetch('/api/move', { + method: 'POST', + body: JSON.stringify({ sourcePath, destinationPath }) }); } - async listFiles(path: string, options: ListFilesOptions = {}): Promise { - return this.doFetch("/api/list-files", { - method: "POST", - body: JSON.stringify({ path, options }), + async listFiles( + path: string, + options: ListFilesOptions = {} + ): Promise { + return this.doFetch('/api/list-files', { + method: 'POST', + body: JSON.stringify({ path, options }) }); } async mkdir(path: string, options: any = {}) { - return this.doFetch("/api/mkdir", { - method: "POST", + return this.doFetch('/api/mkdir', { + method: 'POST', body: JSON.stringify({ path, - ...options, - }), + ...options + }) }); } async gitCheckout(repoUrl: string, branch?: string, targetDir?: string) { - return this.doFetch("/api/git/checkout", { - method: "POST", - body: JSON.stringify({ repoUrl, branch, targetDir }), + return this.doFetch('/api/git/checkout', { + method: 'POST', + body: JSON.stringify({ repoUrl, branch, targetDir }) }); } async createTestBinaryFile() { - return this.doFetch("/api/create-test-binary", { - method: "POST", + return this.doFetch('/api/create-test-binary', { + method: 'POST' }); } async setupNextjs(projectName?: string) { - return this.doFetch("/api/templates/nextjs", { - method: "POST", - body: JSON.stringify({ projectName }), + return this.doFetch('/api/templates/nextjs', { + method: 'POST', + body: JSON.stringify({ projectName }) }); } async setupReact(projectName?: string) { - return this.doFetch("/api/templates/react", { - method: "POST", - body: JSON.stringify({ projectName }), + return this.doFetch('/api/templates/react', { + method: 'POST', + body: JSON.stringify({ projectName }) }); } async setupVue(projectName?: string) { - return this.doFetch("/api/templates/vue", { - method: "POST", - body: JSON.stringify({ projectName }), + return this.doFetch('/api/templates/vue', { + method: 'POST', + body: JSON.stringify({ projectName }) }); } async setupStatic(projectName?: string) { - return this.doFetch("/api/templates/static", { - method: "POST", - body: JSON.stringify({ projectName }), + return this.doFetch('/api/templates/static', { + method: 'POST', + body: JSON.stringify({ projectName }) }); } @@ -466,16 +476,16 @@ class SandboxApiClient { options: any = {} ): AsyncGenerator { const response = await fetch(`${this.baseUrl}/api/execute/stream`, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - "X-Sandbox-Client-Id": this.sandboxId, + 'Content-Type': 'application/json', + Accept: 'text/event-stream', + 'X-Sandbox-Client-Id': this.sandboxId }, body: JSON.stringify({ - command: `${command} ${args.join(" ")}`, - ...options, - }), + command: `${command} ${args.join(' ')}`, + ...options + }) }); if (!response.ok) { @@ -484,7 +494,7 @@ class SandboxApiClient { const reader = response.body!.getReader(); const decoder = new TextDecoder(); - let buffer = ""; // Buffer for incomplete lines + let buffer = ''; // Buffer for incomplete lines try { while (true) { @@ -496,21 +506,21 @@ class SandboxApiClient { // Process complete SSE events while (true) { - const eventEnd = buffer.indexOf("\n\n"); + const eventEnd = buffer.indexOf('\n\n'); if (eventEnd === -1) break; // No complete event yet const eventData = buffer.substring(0, eventEnd); buffer = buffer.substring(eventEnd + 2); // Parse the SSE event - const lines = eventData.split("\n"); + const lines = eventData.split('\n'); for (const line of lines) { - if (line.startsWith("data: ")) { + if (line.startsWith('data: ')) { try { const event = JSON.parse(line.substring(6)); yield event; } catch (e) { - console.warn("Failed to parse SSE event:", line, e); + console.warn('Failed to parse SSE event:', line, e); } } } @@ -526,45 +536,45 @@ class SandboxApiClient { } async ping() { - return this.doFetch("/api/ping", { - method: "GET", + return this.doFetch('/api/ping', { + method: 'GET' }); } async createSession(sessionId?: string) { - return this.doFetch("/api/session/create", { - method: "POST", - body: JSON.stringify({ sessionId }), + return this.doFetch('/api/session/create', { + method: 'POST', + body: JSON.stringify({ sessionId }) }); } async clearSession(sessionId: string) { return this.doFetch(`/api/session/clear/${sessionId}`, { - method: "POST", + method: 'POST' }); } // Notebook API methods - async createNotebookSession(language: string = "python") { - return this.doFetch("/api/notebook/session", { - method: "POST", - body: JSON.stringify({ language }), + async createNotebookSession(language: string = 'python') { + return this.doFetch('/api/notebook/session', { + method: 'POST', + body: JSON.stringify({ language }) }); } async *executeNotebookCell( code: string, sessionId: string, - language: string = "python" + language: string = 'python' ): AsyncGenerator { const response = await fetch(`${this.baseUrl}/api/notebook/execute`, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - "X-Sandbox-Client-Id": this.sandboxId, + 'Content-Type': 'application/json', + Accept: 'text/event-stream', + 'X-Sandbox-Client-Id': this.sandboxId }, - body: JSON.stringify({ code, sessionId, language }), + body: JSON.stringify({ code, sessionId, language }) }); if (!response.ok) { @@ -573,7 +583,7 @@ class SandboxApiClient { const reader = response.body!.getReader(); const decoder = new TextDecoder(); - let buffer = ""; + let buffer = ''; try { while (true) { @@ -581,19 +591,19 @@ class SandboxApiClient { if (done) break; buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split("\n"); - buffer = lines.pop() || ""; + const lines = buffer.split('\n'); + buffer = lines.pop() || ''; for (const line of lines) { - if (line.startsWith("data: ")) { + if (line.startsWith('data: ')) { const data = line.slice(6); - if (data === "[DONE]") continue; + if (data === '[DONE]') continue; try { const event = JSON.parse(data); yield event; } catch (e) { - console.warn("Failed to parse SSE event:", line, e); + console.warn('Failed to parse SSE event:', line, e); } } } @@ -604,9 +614,9 @@ class SandboxApiClient { } async deleteNotebookSession(sessionId: string) { - return this.doFetch("/api/notebook/session", { - method: "DELETE", - body: JSON.stringify({ sessionId }), + return this.doFetch('/api/notebook/session', { + method: 'DELETE', + body: JSON.stringify({ sessionId }) }); } } @@ -614,7 +624,7 @@ class SandboxApiClient { interface CommandResult { id: string; command: string; - status: "running" | "completed" | "error"; + status: 'running' | 'completed' | 'error'; stdout: string; stderr: string; exitCode?: number; @@ -622,19 +632,19 @@ interface CommandResult { } type TabType = - | "commands" - | "processes" - | "ports" - | "streaming" - | "files" - | "notebook" - | "examples"; + | 'commands' + | 'processes' + | 'ports' + | 'streaming' + | 'files' + | 'notebook' + | 'examples'; interface ProcessInfo { id: string; pid?: number; command: string; - status: "starting" | "running" | "completed" | "failed" | "killed" | "error"; + status: 'starting' | 'running' | 'completed' | 'failed' | 'killed' | 'error'; startTime: string; endTime?: string; exitCode?: number; @@ -649,20 +659,20 @@ interface ProcessLogs { function ProcessManagementTab({ client, connectionStatus, - sessionId, + sessionId }: { client: SandboxApiClient | null; - connectionStatus: "disconnected" | "connecting" | "connected"; + connectionStatus: 'disconnected' | 'connecting' | 'connected'; sessionId: string | null; }) { const [processes, setProcesses] = useState([]); const [isLoading, setIsLoading] = useState(false); - const [processCommand, setProcessCommand] = useState(""); + const [processCommand, setProcessCommand] = useState(''); const [processOptions, setProcessOptions] = useState({ - env: "", - cwd: "", - timeout: "", - processId: "", + env: '', + cwd: '', + timeout: '', + processId: '' }); const [selectedProcess, setSelectedProcess] = useState(null); const [processLogs, setProcessLogs] = useState(null); @@ -670,14 +680,14 @@ function ProcessManagementTab({ // Refresh processes list const refreshProcesses = async () => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; try { setIsLoading(true); const response = await client.listProcesses(); setProcesses(response.processes); } catch (error) { - console.error("Failed to refresh processes:", error); + console.error('Failed to refresh processes:', error); } finally { setIsLoading(false); } @@ -685,7 +695,7 @@ function ProcessManagementTab({ // Auto-refresh processes every 2 seconds useEffect(() => { - if (connectionStatus === "connected") { + if (connectionStatus === 'connected') { refreshProcesses(); const interval = setInterval(refreshProcesses, 2000); return () => clearInterval(interval); @@ -694,7 +704,7 @@ function ProcessManagementTab({ // Start a background process const startProcess = async () => { - if (!client || connectionStatus !== "connected" || !processCommand.trim()) + if (!client || connectionStatus !== 'connected' || !processCommand.trim()) return; try { @@ -711,8 +721,8 @@ function ProcessManagementTab({ // Parse environment variables if (processOptions.env.trim()) { const env: Record = {}; - processOptions.env.split(",").forEach((pair) => { - const [key, value] = pair.split("="); + processOptions.env.split(',').forEach((pair) => { + const [key, value] = pair.split('='); if (key && value) env[key.trim()] = value.trim(); }); options.env = env; @@ -722,16 +732,16 @@ function ProcessManagementTab({ processCommand.trim(), options ); - console.log("Process started:", response); + console.log('Process started:', response); // Clear form - setProcessCommand(""); - setProcessOptions({ env: "", cwd: "", timeout: "", processId: "" }); + setProcessCommand(''); + setProcessOptions({ env: '', cwd: '', timeout: '', processId: '' }); // Refresh processes list await refreshProcesses(); } catch (error: any) { - console.error("Failed to start process:", error); + console.error('Failed to start process:', error); alert(`Failed to start process: ${error.message || error}`); } finally { setIsStartingProcess(false); @@ -740,81 +750,81 @@ function ProcessManagementTab({ // Kill a process const killProcess = async (processId: string) => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; try { await client.killProcess(processId); - console.log("Process killed:", processId); + console.log('Process killed:', processId); await refreshProcesses(); } catch (error: any) { - console.error("Failed to kill process:", error); + console.error('Failed to kill process:', error); alert(`Failed to kill process: ${error.message || error}`); } }; // Kill all processes const killAllProcesses = async () => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; - if (!confirm("Are you sure you want to kill all processes?")) return; + if (!confirm('Are you sure you want to kill all processes?')) return; try { const response = await client.killAllProcesses(); - console.log("Killed processes:", response.killedCount); + console.log('Killed processes:', response.killedCount); await refreshProcesses(); } catch (error: any) { - console.error("Failed to kill all processes:", error); + console.error('Failed to kill all processes:', error); alert(`Failed to kill all processes: ${error.message || error}`); } }; // Get process logs const getProcessLogs = async (processId: string) => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; try { const response = await client.getProcessLogs(processId); setProcessLogs(response); setSelectedProcess(processId); } catch (error: any) { - console.error("Failed to get process logs:", error); + console.error('Failed to get process logs:', error); alert(`Failed to get process logs: ${error.message || error}`); } }; - const getStatusColor = (status: ProcessInfo["status"]) => { + const getStatusColor = (status: ProcessInfo['status']) => { switch (status) { - case "starting": - return "text-yellow-500"; - case "running": - return "text-blue-500"; - case "completed": - return "text-green-500"; - case "failed": - case "error": - return "text-red-500"; - case "killed": - return "text-orange-500"; + case 'starting': + return 'text-yellow-500'; + case 'running': + return 'text-blue-500'; + case 'completed': + return 'text-green-500'; + case 'failed': + case 'error': + return 'text-red-500'; + case 'killed': + return 'text-orange-500'; default: - return "text-gray-500"; + return 'text-gray-500'; } }; - const getStatusIcon = (status: ProcessInfo["status"]) => { + const getStatusIcon = (status: ProcessInfo['status']) => { switch (status) { - case "starting": - return "⏳"; - case "running": - return "🟢"; - case "completed": - return "✅"; - case "failed": - case "error": - return "❌"; - case "killed": - return "🔶"; + case 'starting': + return '⏳'; + case 'running': + return '🟢'; + case 'completed': + return '✅'; + case 'failed': + case 'error': + return '❌'; + case 'killed': + return '🔶'; default: - return "⏳"; + return '⏳'; } }; @@ -828,7 +838,7 @@ function ProcessManagementTab({ disabled={isLoading} className="btn btn-refresh" > - {isLoading ? "Refreshing..." : "Refresh"} + {isLoading ? 'Refreshing...' : 'Refresh'}
    @@ -921,10 +931,10 @@ function ProcessManagementTab({
    {process.id}
    {process.command}
    -
    {process.pid || "N/A"}
    +
    {process.pid || 'N/A'}
    {new Date(process.startTime).toLocaleString()}
    @@ -1001,7 +1011,7 @@ function ProcessManagementTab({ > Logs - {process.status === "running" && ( + {process.status === 'running' && (
    @@ -1385,11 +1395,11 @@ with socketserver.TCPServer(("", PORT), MyHandler) as httpd: disabled={ !portNumber.trim() || isExposing || - connectionStatus !== "connected" + connectionStatus !== 'connected' } className="btn btn-expose-port" > - {isExposing ? "Exposing..." : "Expose Port"} + {isExposing ? 'Exposing...' : 'Expose Port'} @@ -1399,21 +1409,21 @@ with socketserver.TCPServer(("", PORT), MyHandler) as httpd:
    {fileContent && ( @@ -1833,7 +1848,7 @@ function FilesTab({ @@ -2255,8 +2283,8 @@ function FilesTab({

    {useStreaming - ? "📡 Streams file in chunks via SSE - better for large files" - : "📄 Reads entire file at once - simpler but loads all into memory"} + ? '📡 Streams file in chunks via SSE - better for large files' + : '📄 Reads entire file at once - simpler but loads all into memory'}

    @@ -2269,10 +2297,14 @@ function FilesTab({ />
    @@ -2285,7 +2317,8 @@ function FilesTab({
    File Type: - {binaryFileMetadata.isBinary ? "🖼️" : "📄"} {binaryFileMetadata.mimeType} + {binaryFileMetadata.isBinary ? '🖼️' : '📄'}{' '} + {binaryFileMetadata.mimeType}
    @@ -2302,8 +2335,10 @@ function FilesTab({
    Binary: - - {binaryFileMetadata.isBinary ? "✓ Yes" : "✗ No"} + + {binaryFileMetadata.isBinary ? '✓ Yes' : '✗ No'}
    @@ -2311,7 +2346,8 @@ function FilesTab({ {/* File Preview */}

    🔍 Preview

    - {binaryFileMetadata.isBinary && binaryFileMetadata.mimeType.startsWith("image/") ? ( + {binaryFileMetadata.isBinary && + binaryFileMetadata.mimeType.startsWith('image/') ? (
    ) : (
    -
    -                    {binaryFileMetadata.content}
    -                  
    +
    {binaryFileMetadata.content}

    Text file content

    )} @@ -2357,7 +2391,7 @@ function FilesTab({ {result.timestamp.toLocaleTimeString()} - {result.type === "success" ? "✓" : "✗"} + {result.type === 'success' ? '✓' : '✗'} {result.message}
    @@ -2371,31 +2405,31 @@ function FilesTab({ function StreamingTab({ client, connectionStatus, - sessionId, + sessionId }: { client: SandboxApiClient | null; - connectionStatus: "disconnected" | "connecting" | "connected"; + connectionStatus: 'disconnected' | 'connecting' | 'connected'; sessionId: string | null; }) { const [activeStreams, setActiveStreams] = useState([]); - const [commandInput, setCommandInput] = useState(""); + const [commandInput, setCommandInput] = useState(''); const [isStreaming, setIsStreaming] = useState(false); const [processes, setProcesses] = useState([]); // Refresh processes for log streaming useEffect(() => { const refreshProcesses = async () => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; try { const response = await client.listProcesses(); setProcesses(response.processes); } catch (error) { - console.error("Failed to refresh processes:", error); + console.error('Failed to refresh processes:', error); } }; - if (connectionStatus === "connected") { + if (connectionStatus === 'connected') { refreshProcesses(); const interval = setInterval(refreshProcesses, 3000); return () => clearInterval(interval); @@ -2406,7 +2440,7 @@ function StreamingTab({ const startCommandStream = async () => { if ( !client || - connectionStatus !== "connected" || + connectionStatus !== 'connected' || !commandInput.trim() || isStreaming ) @@ -2416,45 +2450,45 @@ function StreamingTab({ const command = commandInput.trim(); setIsStreaming(true); - setCommandInput(""); + setCommandInput(''); // Add stream to active streams const newStream: ActiveStream = { id: streamId, - type: "command", + type: 'command', title: `Command: ${command}`, command: command, isActive: true, events: [], - startTime: new Date(), + startTime: new Date() }; setActiveStreams((prev) => [...prev, newStream]); try { // Use the new execStream AsyncIterable method - const commandParts = command.split(" "); + const commandParts = command.split(' '); const cmd = commandParts[0]; const args = commandParts.slice(1); const streamIterable = client.execStream(cmd, args, { sessionId: sessionId || undefined, - signal: new AbortController().signal, + signal: new AbortController().signal }); for await (const event of streamIterable) { const streamEvent: StreamEvent = { id: `${streamId}_${Date.now()}_${Math.random()}`, type: event.type as - | "start" - | "stdout" - | "stderr" - | "complete" - | "error", + | 'start' + | 'stdout' + | 'stderr' + | 'complete' + | 'error', timestamp: event.timestamp, data: event.data, command: event.command, exitCode: event.exitCode, - error: event.error, + error: event.error }; setActiveStreams((prev) => @@ -2463,25 +2497,25 @@ function StreamingTab({ ? { ...stream, events: [...stream.events, streamEvent], - isActive: event.type !== "complete" && event.type !== "error", + isActive: event.type !== 'complete' && event.type !== 'error' } : stream ) ); // Break on completion or error - if (event.type === "complete" || event.type === "error") { + if (event.type === 'complete' || event.type === 'error') { break; } } } catch (error) { - console.error("Streaming error:", error); + console.error('Streaming error:', error); const errorEvent: StreamEvent = { id: `${streamId}_error_${Date.now()}`, - type: "error", + type: 'error', timestamp: new Date().toISOString(), - error: error instanceof Error ? error : new Error(String(error)), + error: error instanceof Error ? error : new Error(String(error)) }; setActiveStreams((prev) => @@ -2490,7 +2524,7 @@ function StreamingTab({ ? { ...stream, events: [...stream.events, errorEvent], - isActive: false, + isActive: false } : stream ) @@ -2504,28 +2538,28 @@ function StreamingTab({ const startProcessLogStream = async (selectedProcessId: string) => { if ( !client || - connectionStatus !== "connected" || + connectionStatus !== 'connected' || !selectedProcessId.trim() ) return; const streamId = `logs_${selectedProcessId}_${Date.now()}`; - + // Create an AbortController for this stream const abortController = new AbortController(); - + // Store the abort controller so it can be aborted when user clicks stop streamAbortControllers.current.set(streamId, abortController); // Add stream to active streams const newStream: ActiveStream = { id: streamId, - type: "process-logs", + type: 'process-logs', title: `Process Logs: ${selectedProcessId}`, processId: selectedProcessId, isActive: true, events: [], - startTime: new Date(), + startTime: new Date() }; setActiveStreams((prev) => [...prev, newStream]); @@ -2539,11 +2573,11 @@ function StreamingTab({ for await (const logEvent of logStreamIterable) { const streamEvent: LogStreamEvent = { id: `${streamId}_${Date.now()}_${Math.random()}`, - type: logEvent.type as "stdout" | "stderr" | "status" | "error", + type: logEvent.type as 'stdout' | 'stderr' | 'status' | 'error', timestamp: logEvent.timestamp, data: logEvent.data, processId: logEvent.processId, - sessionId: logEvent.sessionId, + sessionId: logEvent.sessionId }; setActiveStreams((prev) => @@ -2554,37 +2588,35 @@ function StreamingTab({ ) ); } - + // Clean up abort controller when stream completes naturally streamAbortControllers.current.delete(streamId); } catch (error) { // Clean up abort controller on error streamAbortControllers.current.delete(streamId); - + // Don't log abort errors or add error events for user cancellation if (error instanceof Error && error.name === 'AbortError') { - console.log("Log streaming aborted by user"); + console.log('Log streaming aborted by user'); // Just mark the stream as inactive without adding error event setActiveStreams((prev) => prev.map((stream) => - stream.id === streamId - ? { ...stream, isActive: false } - : stream + stream.id === streamId ? { ...stream, isActive: false } : stream ) ); return; } - - console.error("Log streaming error:", error); + + console.error('Log streaming error:', error); const errorEvent: LogStreamEvent = { id: `${streamId}_error_${Date.now()}`, - type: "error", + type: 'error', timestamp: new Date().toISOString(), data: `Error: ${ error instanceof Error ? error.message : String(error) }`, - processId: selectedProcessId, + processId: selectedProcessId }; setActiveStreams((prev) => @@ -2593,7 +2625,7 @@ function StreamingTab({ ? { ...stream, events: [...stream.events, errorEvent], - isActive: false, + isActive: false } : stream ) @@ -2602,8 +2634,10 @@ function StreamingTab({ }; // Map to store abort controllers for active streams - const streamAbortControllers = useRef>(new Map()); - + const streamAbortControllers = useRef>( + new Map() + ); + // Stop a stream const stopStream = (streamId: string) => { setActiveStreams((prev) => @@ -2611,7 +2645,7 @@ function StreamingTab({ stream.id === streamId ? { ...stream, isActive: false } : stream ) ); - + // Abort the fetch if an abort controller exists const controller = streamAbortControllers.current.get(streamId); if (controller) { @@ -2633,20 +2667,20 @@ function StreamingTab({ // Get event color const getEventColor = (type: string) => { switch (type) { - case "start": - return "text-blue-500"; - case "stdout": - return "text-green-500"; - case "stderr": - return "text-red-500"; - case "complete": - return "text-green-500"; - case "error": - return "text-red-500"; - case "status": - return "text-yellow-500"; + case 'start': + return 'text-blue-500'; + case 'stdout': + return 'text-green-500'; + case 'stderr': + return 'text-red-500'; + case 'complete': + return 'text-green-500'; + case 'error': + return 'text-red-500'; + case 'status': + return 'text-yellow-500'; default: - return "text-gray-500"; + return 'text-gray-500'; } }; @@ -2682,7 +2716,7 @@ function StreamingTab({ onChange={(e) => setCommandInput(e.target.value)} className="stream-input" onKeyPress={(e) => { - if (e.key === "Enter") { + if (e.key === 'Enter') { startCommandStream(); } }} @@ -2692,11 +2726,11 @@ function StreamingTab({ disabled={ !commandInput.trim() || isStreaming || - connectionStatus !== "connected" + connectionStatus !== 'connected' } className="btn btn-stream-start" > - {isStreaming ? "Starting..." : "Start Stream"} + {isStreaming ? 'Starting...' : 'Start Stream'}
    @@ -2706,7 +2740,7 @@ function StreamingTab({

    Quick Stream Commands:

    ))}
    @@ -2885,29 +2919,29 @@ interface NotebookCell { id: string; code: string; output: any[]; - status: "idle" | "running" | "completed" | "error"; + status: 'idle' | 'running' | 'completed' | 'error'; executionCount: number; } function NotebookTab({ client, - connectionStatus, + connectionStatus }: { client: SandboxApiClient | null; - connectionStatus: "disconnected" | "connecting" | "connected"; + connectionStatus: 'disconnected' | 'connecting' | 'connected'; }) { const [cells, setCells] = useState([]); const [notebookSessionId, setNotebookSessionId] = useState( null ); - const [language, setLanguage] = useState<"python" | "javascript">("python"); + const [language, setLanguage] = useState<'python' | 'javascript'>('python'); const [activeCell, setActiveCell] = useState(null); const cellRefs = useRef<{ [key: string]: HTMLTextAreaElement | null }>({}); // Initialize notebook session useEffect(() => { const initSession = async () => { - if (!client || connectionStatus !== "connected") return; + if (!client || connectionStatus !== 'connected') return; try { const session = await client.createNotebookSession(language); @@ -2915,11 +2949,11 @@ function NotebookTab({ // Add first cell automatically addCell(); } catch (error) { - console.error("Failed to create notebook session:", error); + console.error('Failed to create notebook session:', error); } }; - if (connectionStatus === "connected") { + if (connectionStatus === 'connected') { initSession(); } @@ -2933,10 +2967,10 @@ function NotebookTab({ const addCell = () => { const newCell: NotebookCell = { id: `cell-${Date.now()}`, - code: "", + code: '', output: [], - status: "idle", - executionCount: 0, + status: 'idle', + executionCount: 0 }; setCells((prev) => [...prev, newCell]); @@ -2960,7 +2994,7 @@ function NotebookTab({ }; const runCell = async (cellId: string, runAndAddNew: boolean = false) => { - if (!client || !notebookSessionId || connectionStatus !== "connected") + if (!client || !notebookSessionId || connectionStatus !== 'connected') return; const cell = cells.find((c) => c.id === cellId); @@ -2972,9 +3006,9 @@ function NotebookTab({ c.id === cellId ? { ...c, - status: "running", + status: 'running', output: [], - executionCount: c.executionCount + 1, + executionCount: c.executionCount + 1 } : c ) @@ -2990,28 +3024,28 @@ function NotebookTab({ language )) { switch (event.type) { - case "stdout": - outputs.push({ type: "stdout", text: event.text }); + case 'stdout': + outputs.push({ type: 'stdout', text: event.text }); break; - case "stderr": - outputs.push({ type: "stderr", text: event.text }); + case 'stderr': + outputs.push({ type: 'stderr', text: event.text }); break; - case "result": + case 'result': outputs.push({ - type: "result", + type: 'result', data: event, png: event.png, html: event.html, text: event.text, - json: event.json, + json: event.json }); break; - case "error": + case 'error': outputs.push({ - type: "error", + type: 'error', ename: event.ename, evalue: event.evalue, - traceback: event.traceback, + traceback: event.traceback }); break; } @@ -3026,27 +3060,27 @@ function NotebookTab({ // Mark as completed setCells((prev) => - prev.map((c) => (c.id === cellId ? { ...c, status: "completed" } : c)) + prev.map((c) => (c.id === cellId ? { ...c, status: 'completed' } : c)) ); if (runAndAddNew) { addCell(); } } catch (error) { - console.error("Cell execution error:", error); + console.error('Cell execution error:', error); setCells((prev) => prev.map((c) => c.id === cellId ? { ...c, - status: "error", + status: 'error', output: [ ...c.output, { - type: "error", - text: `Execution error: ${error}`, - }, - ], + type: 'error', + text: `Execution error: ${error}` + } + ] } : c ) @@ -3055,10 +3089,10 @@ function NotebookTab({ }; const handleKeyDown = (e: React.KeyboardEvent, cellId: string) => { - if (e.ctrlKey && e.key === "Enter") { + if (e.ctrlKey && e.key === 'Enter') { e.preventDefault(); runCell(cellId); - } else if (e.shiftKey && e.key === "Enter") { + } else if (e.shiftKey && e.key === 'Enter') { e.preventDefault(); runCell(cellId, true); } @@ -3066,13 +3100,13 @@ function NotebookTab({ const renderOutput = (output: any) => { switch (output.type) { - case "stdout": + case 'stdout': return
    {output.text}
    ; - case "stderr": + case 'stderr': return
    {output.text}
    ; - case "error": + case 'error': return (
    @@ -3080,13 +3114,13 @@ function NotebookTab({
    {output.traceback && (
    -                {output.traceback.join("\n")}
    +                {output.traceback.join('\n')}
                   
    )}
    ); - case "result": + case 'result': if (output.png) { return ( { + const loadExample = (type: 'plot' | 'data' | 'js') => { const examples = { plot: { - lang: "python" as const, + lang: 'python' as const, code: `# Create a beautiful visualization import matplotlib.pyplot as plt import numpy as np @@ -3145,10 +3179,10 @@ plt.xlabel('x', fontsize=12) plt.ylabel('y', fontsize=12) plt.legend(loc='upper right') plt.grid(True, alpha=0.3) -plt.show()`, +plt.show()` }, data: { - lang: "python" as const, + lang: 'python' as const, code: `# Data analysis with pandas import pandas as pd import numpy as np @@ -3187,10 +3221,10 @@ plt.tight_layout() plt.show() # Show data table -df.head()`, +df.head()` }, js: { - lang: "javascript" as const, + lang: 'javascript' as const, code: `// JavaScript example with console output console.log("Hello from JavaScript!"); @@ -3221,8 +3255,8 @@ console.log("\\nDemo Info:"); console.log(JSON.stringify(data, null, 2)); // Return a result -{ fibonacci: fib, info: data }`, - }, +{ fibonacci: fib, info: data }` + } }; const example = examples[type]; @@ -3237,8 +3271,8 @@ console.log(JSON.stringify(data, null, 2)); id: `cell-${Date.now()}`, code: example.code, output: [], - status: "idle", - executionCount: 0, + status: 'idle', + executionCount: 0 }; setCells((prev) => [...prev, newCell]); }; @@ -3251,7 +3285,7 @@ console.log(JSON.stringify(data, null, 2));