the universal sandbox runtime for agents and humans. pocketenv.io
sandbox openclaw agent claude-code vercel-sandbox deno-sandbox cloudflare-sandbox atproto sprites daytona
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add modal-sandbox app and Modal provider

Introduce a new apps/modal-sandbox service (routes, providers,
schemas, presets and utilities) to manage Modal-based sandboxes.
Update API to add MODAL provider enum, add MODAL_SANDBOX_API_URL
env var, and pass provider to ctx.sandbox calls so requests route
to the correct backend.

+5525 -23
+1
apps/api/src/consts.ts
··· 6 6 VERCEL = "vercel", 7 7 CLOUDFLARE = "cloudflare", 8 8 SPRITE = "sprite", 9 + MODAL = "modal", 9 10 } 10 11 11 12 export type Resources = {
+6 -2
apps/api/src/context.ts
··· 11 11 import type { RequestHandler } from "express"; 12 12 import axios from "axios"; 13 13 import { workers } from "cloudflare"; 14 + import { Providers } from "consts"; 14 15 15 16 const { DB_PATH } = env; 16 17 export const db = createDb(DB_PATH); ··· 38 39 }) 39 40 .connect(), 40 41 kv: new Map<string, string>(), 41 - sandbox: () => 42 + sandbox: (provider?: string) => 42 43 axios.create({ 43 - baseURL: env.SANDBOX_API_URL, 44 + baseURL: 45 + provider === Providers.MODAL 46 + ? env.MODAL_SANDBOX_API_URL 47 + : env.SANDBOX_API_URL, 44 48 }), 45 49 cfsandbox: (base: string) => 46 50 axios.create({
+1
apps/api/src/lib/env.ts
··· 24 24 PRIVATE_KEY_3: str({}), 25 25 PUBLIC_KEY: str({}), 26 26 PRIVATE_KEY: str({}), 27 + MODAL_SANDBOX_API_URL: str({ default: "http://localhost:8790" }), 27 28 SANDBOX_API_URL: str({ default: "http://localhost:8788" }), 28 29 CF_SANDBOX_API_URL: str({ default: "http://localhost:8787" }), 29 30 CF_SECRET_KEY: str({}),
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/claimSandbox.ts
··· 45 45 const sandbox = 46 46 provider === Providers.CLOUDFLARE 47 47 ? ctx.cfsandbox(base.base!) 48 - : ctx.sandbox(); 48 + : ctx.sandbox(base?.provider); 49 49 res = await sandbox.post( 50 50 "/v1/sandboxes", 51 51 {
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/createBackup.ts
··· 49 49 const sandbox = 50 50 record.sandboxes.provider === Providers.CLOUDFLARE 51 51 ? ctx.cfsandbox(record.sandboxes.base!) 52 - : ctx.sandbox(); 52 + : ctx.sandbox(record.sandboxes.provider); 53 53 54 54 try { 55 55 await sandbox.post<SelectBackup>(
+2 -2
apps/api/src/xrpc/io/pocketenv/sandbox/createSandbox.ts
··· 48 48 const sandbox = 49 49 existingSandbox.sandboxes.provider === Providers.CLOUDFLARE 50 50 ? ctx.cfsandbox(existingSandbox.sandboxes.base!) 51 - : ctx.sandbox(); 51 + : ctx.sandbox(existingSandbox.sandboxes.provider); 52 52 53 53 await sandbox.post( 54 54 `/v1/sandboxes/${existingSandbox.sandboxes.id}/start`, ··· 101 101 const sandbox = 102 102 provider === Providers.CLOUDFLARE 103 103 ? ctx.cfsandbox(input.base.split("/").pop()!) 104 - : ctx.sandbox(); 104 + : ctx.sandbox(provider); 105 105 res = await sandbox.post( 106 106 "/v1/sandboxes", 107 107 {
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/deleteSandbox.ts
··· 43 43 const sandbox = 44 44 record.provider === Providers.CLOUDFLARE 45 45 ? ctx.cfsandbox(record.base!) 46 - : ctx.sandbox(); 46 + : ctx.sandbox(record?.provider); 47 47 48 48 try { 49 49 await sandbox.delete(`/v1/sandboxes/${record.id}`, {
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/exec.ts
··· 51 51 const sandbox = 52 52 record.provider === Providers.CLOUDFLARE 53 53 ? ctx.cfsandbox(record.base!) 54 - : ctx.sandbox(); 54 + : ctx.sandbox(record?.provider); 55 55 56 56 const result = await sandbox.post<{ 57 57 stderr: string;
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/exposePort.ts
··· 87 87 const sandbox = 88 88 record.sandboxes.provider === Providers.CLOUDFLARE 89 89 ? ctx.cfsandbox(record.sandboxes.base!) 90 - : ctx.sandbox(); 90 + : ctx.sandbox(record.sandboxes.provider); 91 91 92 92 const { data } = await sandbox.post<{ previewUrl: string }>( 93 93 `/v1/sandboxes/${record.sandboxes.id}/ports`,
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/exposeVscode.ts
··· 103 103 const sandbox = 104 104 record.sandboxes.provider === Providers.CLOUDFLARE 105 105 ? ctx.cfsandbox(record.sandboxes.base!) 106 - : ctx.sandbox(); 106 + : ctx.sandbox(record.sandboxes.provider); 107 107 return { sandbox, record }; 108 108 }, 109 109 );
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/pullDirectory.ts
··· 41 41 const sandbox = 42 42 record.sandboxes.provider === Providers.CLOUDFLARE 43 43 ? ctx.cfsandbox(record.sandboxes.base!) 44 - : ctx.sandbox(); 44 + : ctx.sandbox(record.sandboxes.provider); 45 45 46 46 await sandbox.post( 47 47 `/v1/sandboxes/${record.sandboxes.id}/pull-directory`,
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/pushDirectory.ts
··· 41 41 const sandbox = 42 42 record.sandboxes.provider === Providers.CLOUDFLARE 43 43 ? ctx.cfsandbox(record.sandboxes.base!) 44 - : ctx.sandbox(); 44 + : ctx.sandbox(record.sandboxes.provider); 45 45 46 46 const response = await sandbox.post<{ uuid: string }>( 47 47 `/v1/sandboxes/${record.sandboxes.id}/push-directory`,
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/restoreBackup.ts
··· 47 47 const sandbox = 48 48 record.sandboxes.provider === Providers.CLOUDFLARE 49 49 ? ctx.cfsandbox(record.sandboxes.base!) 50 - : ctx.sandbox(); 50 + : ctx.sandbox(record.sandboxes.provider); 51 51 52 52 try { 53 53 await sandbox.post(
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/startSandbox.ts
··· 50 50 const sandbox = 51 51 record.provider === Providers.CLOUDFLARE 52 52 ? ctx.cfsandbox(record.base!) 53 - : ctx.sandbox(); 53 + : ctx.sandbox(record?.provider); 54 54 55 55 await sandbox.post( 56 56 `/v1/sandboxes/${record.id}/start`,
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/stopSandbox.ts
··· 43 43 const sandbox = 44 44 record.provider === Providers.CLOUDFLARE 45 45 ? ctx.cfsandbox(record.base!) 46 - : ctx.sandbox(); 46 + : ctx.sandbox(record?.provider); 47 47 48 48 await sandbox.post(`/v1/sandboxes/${record.id}/stop`, undefined, { 49 49 headers: {
+1 -1
apps/api/src/xrpc/io/pocketenv/sandbox/unexposePort.ts
··· 87 87 const sandbox = 88 88 record.sandboxes.provider === Providers.CLOUDFLARE 89 89 ? ctx.cfsandbox(record.sandboxes.base!) 90 - : ctx.sandbox(); 90 + : ctx.sandbox(record.sandboxes.provider); 91 91 92 92 await sandbox.delete(`/v1/sandboxes/${record.sandboxes.id}/ports`, { 93 93 params: {
+1 -1
apps/api/src/xrpc/io/pocketenv/service/addService.ts
··· 92 92 const sandbox = 93 93 record.provider === Providers.CLOUDFLARE 94 94 ? ctx.cfsandbox(record.base!) 95 - : ctx.sandbox(); 95 + : ctx.sandbox(record?.provider); 96 96 97 97 await sandbox.post( 98 98 `/v1/sandboxes/${record.id}/services/${service.id}`,
+1 -1
apps/api/src/xrpc/io/pocketenv/service/deleteService.ts
··· 37 37 const sandbox = 38 38 record.sandboxes.provider === Providers.CLOUDFLARE 39 39 ? ctx.cfsandbox(record.sandboxes.base!) 40 - : ctx.sandbox(); 40 + : ctx.sandbox(record?.provider); 41 41 await sandbox.delete( 42 42 `/v1/sandboxes/${record.sandboxes.id}/services/${params.serviceId}`, 43 43 {
+1 -1
apps/api/src/xrpc/io/pocketenv/service/restartService.ts
··· 42 42 const sandbox = 43 43 record!.sandboxes!.provider === Providers.CLOUDFLARE 44 44 ? ctx.cfsandbox(record!.sandboxes!.base!) 45 - : ctx.sandbox(); 45 + : ctx.sandbox(record?.provider); 46 46 await sandbox.delete( 47 47 `/v1/sandboxes/${record!.sandboxes!.id}/services/${params.serviceId}`, 48 48 {
+1 -1
apps/api/src/xrpc/io/pocketenv/service/startService.ts
··· 38 38 const sandbox = 39 39 record!.sandboxes!.provider === Providers.CLOUDFLARE 40 40 ? ctx.cfsandbox(record!.sandboxes!.base!) 41 - : ctx.sandbox(); 41 + : ctx.sandbox(record?.provider); 42 42 43 43 if (record?.services?.status === "RUNNING") { 44 44 consola.info("Service is already running, skipping start", {
+1 -1
apps/api/src/xrpc/io/pocketenv/service/stopService.ts
··· 38 38 const sandbox = 39 39 record!.sandboxes!.provider === Providers.CLOUDFLARE 40 40 ? ctx.cfsandbox(record!.sandboxes!.base!) 41 - : ctx.sandbox(); 41 + : ctx.sandbox(record?.provider); 42 42 43 43 if (record?.services?.status === "STOPPED") { 44 44 consola.info("Service is already stopped, skipping stop", {
+1
apps/modal-sandbox/.dockerignore
··· 1 + node_modules/
+16
apps/modal-sandbox/.env.example
··· 1 + CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE=<YOUR-CONNECTION-STRING-HERE> 2 + PRIVATE_KEY=<YOUR-KEY-HERE> 3 + PUBLIC_KEY=<YOUR-KEY-HERE> 4 + JWT_SECRET=<YOUR-KEY-HERE> 5 + DAYTONA_API_KEY=<YOUR-KEY-HERE> 6 + DAYTONA_API_URL=https://api.daytona.dev/v1 7 + DAYTONA_SNAPSHOT=<YOUR-SNAPSHOT-HERE> 8 + DAYTONA_ORGANIZATION_ID=<YOUR-ORGANIZATION-ID-HERE> 9 + VERCEL_API_TOKEN= 10 + VERCEL_PROJECT_ID= 11 + VERCEL_SNAPSHOT_ID= 12 + VERCEL_TEAM_ID= 13 + DENO_API_TOKEN= 14 + DENO_DEPLOY_TOKEN= 15 + JWT_SECRET= 16 + COOKIE_SECRET=
+199
apps/modal-sandbox/.gitignore
··· 1 + # Created by https://www.toptal.com/developers/gitignore/api/macos,node,git 2 + # Edit at https://www.toptal.com/developers/gitignore?templates=macos,node,git 3 + 4 + ### Git ### 5 + # Created by git for backups. To disable backups in Git: 6 + # $ git config --global mergetool.keepBackup false 7 + *.orig 8 + 9 + # Created by git when using merge tools for conflicts 10 + *.BACKUP.* 11 + *.BASE.* 12 + *.LOCAL.* 13 + *.REMOTE.* 14 + *_BACKUP_*.txt 15 + *_BASE_*.txt 16 + *_LOCAL_*.txt 17 + *_REMOTE_*.txt 18 + 19 + ### macOS ### 20 + # General 21 + .DS_Store 22 + .AppleDouble 23 + .LSOverride 24 + 25 + # Icon must end with two \r 26 + Icon 27 + 28 + 29 + # Thumbnails 30 + ._* 31 + 32 + # Files that might appear in the root of a volume 33 + .DocumentRevisions-V100 34 + .fseventsd 35 + .Spotlight-V100 36 + .TemporaryItems 37 + .Trashes 38 + .VolumeIcon.icns 39 + .com.apple.timemachine.donotpresent 40 + 41 + # Directories potentially created on remote AFP share 42 + .AppleDB 43 + .AppleDesktop 44 + Network Trash Folder 45 + Temporary Items 46 + .apdisk 47 + 48 + ### macOS Patch ### 49 + # iCloud generated files 50 + *.icloud 51 + 52 + ### Node ### 53 + # Logs 54 + logs 55 + *.log 56 + npm-debug.log* 57 + yarn-debug.log* 58 + yarn-error.log* 59 + lerna-debug.log* 60 + .pnpm-debug.log* 61 + 62 + # Diagnostic reports (https://nodejs.org/api/report.html) 63 + report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 64 + 65 + # Runtime data 66 + pids 67 + *.pid 68 + *.seed 69 + *.pid.lock 70 + 71 + # Directory for instrumented libs generated by jscoverage/JSCover 72 + lib-cov 73 + 74 + # Coverage directory used by tools like istanbul 75 + coverage 76 + *.lcov 77 + 78 + # nyc test coverage 79 + .nyc_output 80 + 81 + # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 82 + .grunt 83 + 84 + # Bower dependency directory (https://bower.io/) 85 + bower_components 86 + 87 + # node-waf configuration 88 + .lock-wscript 89 + 90 + # Compiled binary addons (https://nodejs.org/api/addons.html) 91 + build/Release 92 + 93 + # Dependency directories 94 + node_modules/ 95 + jspm_packages/ 96 + 97 + # Snowpack dependency directory (https://snowpack.dev/) 98 + web_modules/ 99 + 100 + # TypeScript cache 101 + *.tsbuildinfo 102 + 103 + # Optional npm cache directory 104 + .npm 105 + 106 + # Optional eslint cache 107 + .eslintcache 108 + 109 + # Optional stylelint cache 110 + .stylelintcache 111 + 112 + # Microbundle cache 113 + .rpt2_cache/ 114 + .rts2_cache_cjs/ 115 + .rts2_cache_es/ 116 + .rts2_cache_umd/ 117 + 118 + # Optional REPL history 119 + .node_repl_history 120 + 121 + # Output of 'npm pack' 122 + *.tgz 123 + 124 + # Yarn Integrity file 125 + .yarn-integrity 126 + 127 + # dotenv environment variable files 128 + .env 129 + .env.development.local 130 + .env.test.local 131 + .env.production.local 132 + .env.local 133 + 134 + # parcel-bundler cache (https://parceljs.org/) 135 + .cache 136 + .parcel-cache 137 + 138 + # Next.js build output 139 + .next 140 + out 141 + 142 + # Nuxt.js build / generate output 143 + .nuxt 144 + dist 145 + 146 + # Gatsby files 147 + .cache/ 148 + # Comment in the public line in if your project uses Gatsby and not Next.js 149 + # https://nextjs.org/blog/next-9-1#public-directory-support 150 + # public 151 + 152 + # vuepress build output 153 + .vuepress/dist 154 + 155 + # vuepress v2.x temp and cache directory 156 + .temp 157 + 158 + # Docusaurus cache and generated files 159 + .docusaurus 160 + 161 + # Serverless directories 162 + .serverless/ 163 + 164 + # FuseBox cache 165 + .fusebox/ 166 + 167 + # DynamoDB Local files 168 + .dynamodb/ 169 + 170 + # TernJS port file 171 + .tern-port 172 + 173 + # Stores VSCode versions used for testing VSCode extensions 174 + .vscode-test 175 + 176 + # yarn v2 177 + .yarn/cache 178 + .yarn/unplugged 179 + .yarn/build-state.yml 180 + .yarn/install-state.gz 181 + .pnp.* 182 + 183 + ### Node Patch ### 184 + # Serverless Webpack directories 185 + .webpack/ 186 + 187 + # Optional stylelint cache 188 + 189 + # SvelteKit build / generate output 190 + .svelte-kit 191 + 192 + # End of https://www.toptal.com/developers/gitignore/api/macos,node,git 193 + 194 + ### Wrangler ### 195 + .wrangler/ 196 + .env* 197 + !.env.example 198 + .dev.vars* 199 + !.dev.vars.example
+1
apps/modal-sandbox/.npmrc
··· 1 + @jsr:registry=https://npm.jsr.io
+25
apps/modal-sandbox/.zed/settings.json
··· 1 + { 2 + "lsp": { 3 + "deno": { 4 + "settings": { 5 + "deno": { 6 + "enable": true, 7 + "unstable": false, 8 + "lint": true, 9 + "cache": null 10 + } 11 + } 12 + } 13 + }, 14 + "languages": { 15 + "TypeScript": { 16 + "language_servers": ["deno", "!typescript-language-server"] 17 + }, 18 + "TSX": { 19 + "language_servers": ["deno", "!typescript-language-server"] 20 + }, 21 + "JavaScript": { 22 + "language_servers": ["deno", "!typescript-language-server"] 23 + } 24 + } 25 + }
+1216
apps/modal-sandbox/bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "configVersion": 1, 4 + "workspaces": { 5 + "": { 6 + "dependencies": { 7 + "@daytonaio/sdk": "^0.162.0", 8 + "@deno/sandbox": "^0.13.2", 9 + "@fly/sprites": "^0.0.1", 10 + "@std/yaml": "npm:@jsr/std__yaml", 11 + "@tsndr/cloudflare-worker-jwt": "^3.2.1", 12 + "@vercel/sandbox": "^1.9.3", 13 + "chalk": "^5.6.2", 14 + "consola": "^3.4.2", 15 + "drizzle-orm": "^0.45.2", 16 + "effect": "^3.21.0", 17 + "envalid": "^8.1.1", 18 + "hono": "^4.12.12", 19 + "libsodium-wrappers": "^0.8.2", 20 + "modal": "^0.7.4", 21 + "pg": "^8.20.0", 22 + "ramda": "^0.32.0", 23 + "unique-username-generator": "^1.5.1", 24 + "zod": "^4.3.6", 25 + }, 26 + "devDependencies": { 27 + "@types/node": "^25.5.2", 28 + "drizzle-kit": "^0.31.10", 29 + "pkgroll": "^2.27.0", 30 + "tsx": "^4.21.0", 31 + "vitest": "^4.1.4", 32 + }, 33 + }, 34 + }, 35 + "packages": { 36 + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], 37 + 38 + "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], 39 + 40 + "@aws-crypto/sha1-browser": ["@aws-crypto/sha1-browser@5.2.0", "", { "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg=="], 41 + 42 + "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], 43 + 44 + "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], 45 + 46 + "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], 47 + 48 + "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], 49 + 50 + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1027.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.27", "@aws-sdk/credential-provider-node": "^3.972.30", "@aws-sdk/middleware-bucket-endpoint": "^3.972.9", "@aws-sdk/middleware-expect-continue": "^3.972.9", "@aws-sdk/middleware-flexible-checksums": "^3.974.7", "@aws-sdk/middleware-host-header": "^3.972.9", "@aws-sdk/middleware-location-constraint": "^3.972.9", "@aws-sdk/middleware-logger": "^3.972.9", "@aws-sdk/middleware-recursion-detection": "^3.972.10", "@aws-sdk/middleware-sdk-s3": "^3.972.28", "@aws-sdk/middleware-ssec": "^3.972.9", "@aws-sdk/middleware-user-agent": "^3.972.29", "@aws-sdk/region-config-resolver": "^3.972.11", "@aws-sdk/signature-v4-multi-region": "^3.996.16", "@aws-sdk/types": "^3.973.7", "@aws-sdk/util-endpoints": "^3.996.6", "@aws-sdk/util-user-agent-browser": "^3.972.9", "@aws-sdk/util-user-agent-node": "^3.973.15", "@smithy/config-resolver": "^4.4.14", "@smithy/core": "^3.23.14", "@smithy/eventstream-serde-browser": "^4.2.13", "@smithy/eventstream-serde-config-resolver": "^4.3.13", "@smithy/eventstream-serde-node": "^4.2.13", "@smithy/fetch-http-handler": "^5.3.16", "@smithy/hash-blob-browser": "^4.2.14", "@smithy/hash-node": "^4.2.13", "@smithy/hash-stream-node": "^4.2.13", "@smithy/invalid-dependency": "^4.2.13", "@smithy/md5-js": "^4.2.13", "@smithy/middleware-content-length": "^4.2.13", "@smithy/middleware-endpoint": "^4.4.29", "@smithy/middleware-retry": "^4.5.0", "@smithy/middleware-serde": "^4.2.17", "@smithy/middleware-stack": "^4.2.13", "@smithy/node-config-provider": "^4.3.13", "@smithy/node-http-handler": "^4.5.2", "@smithy/protocol-http": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.45", "@smithy/util-defaults-mode-node": "^4.2.49", "@smithy/util-endpoints": "^3.3.4", "@smithy/util-middleware": "^4.2.13", "@smithy/util-retry": "^4.3.0", "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.15", "tslib": "^2.6.2" } }, "sha512-g6kaFE/pW0Tsoq/BYg8PfXa1hIZQBmyoKtmJTgcbdyzYWiOOu8vj4PZUE2kS8myita6avaY8Ama5IodHJ39lPA=="], 51 + 52 + "@aws-sdk/core": ["@aws-sdk/core@3.973.27", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@aws-sdk/xml-builder": "^3.972.17", "@smithy/core": "^3.23.14", "@smithy/node-config-provider": "^4.3.13", "@smithy/property-provider": "^4.2.13", "@smithy/protocol-http": "^5.3.13", "@smithy/signature-v4": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.13", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A=="], 53 + 54 + "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.972.6", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-NMbiqKdruhwwgI6nzBVe2jWMkXjaoQz2YOs3rFX+2F3gGyrJDkDPwMpV/RsTFeq2vAQ055wZNtOXFK4NYSkM8g=="], 55 + 56 + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.25", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A=="], 57 + 58 + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.27", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/types": "^3.973.7", "@smithy/fetch-http-handler": "^5.3.16", "@smithy/node-http-handler": "^4.5.2", "@smithy/property-provider": "^4.2.13", "@smithy/protocol-http": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" } }, "sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ=="], 59 + 60 + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/credential-provider-env": "^3.972.25", "@aws-sdk/credential-provider-http": "^3.972.27", "@aws-sdk/credential-provider-login": "^3.972.29", "@aws-sdk/credential-provider-process": "^3.972.25", "@aws-sdk/credential-provider-sso": "^3.972.29", "@aws-sdk/credential-provider-web-identity": "^3.972.29", "@aws-sdk/nested-clients": "^3.996.19", "@aws-sdk/types": "^3.973.7", "@smithy/credential-provider-imds": "^4.2.13", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw=="], 61 + 62 + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/nested-clients": "^3.996.19", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/protocol-http": "^5.3.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ=="], 63 + 64 + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.30", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.25", "@aws-sdk/credential-provider-http": "^3.972.27", "@aws-sdk/credential-provider-ini": "^3.972.29", "@aws-sdk/credential-provider-process": "^3.972.25", "@aws-sdk/credential-provider-sso": "^3.972.29", "@aws-sdk/credential-provider-web-identity": "^3.972.29", "@aws-sdk/types": "^3.973.7", "@smithy/credential-provider-imds": "^4.2.13", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw=="], 65 + 66 + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.25", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ=="], 67 + 68 + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/nested-clients": "^3.996.19", "@aws-sdk/token-providers": "3.1026.0", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig=="], 69 + 70 + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/nested-clients": "^3.996.19", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew=="], 71 + 72 + "@aws-sdk/lib-storage": ["@aws-sdk/lib-storage@3.1027.0", "", { "dependencies": { "@smithy/middleware-endpoint": "^4.4.29", "@smithy/protocol-http": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", "tslib": "^2.6.2" }, "peerDependencies": { "@aws-sdk/client-s3": "^3.1027.0" } }, "sha512-gw2ORkS9mLlX4WbL/auOyzvr4vTH7upSQE2kE150KDubO68wXWeUCyNB00vI00+7bU45HMr6IhqbmZDdaq/gIQ=="], 73 + 74 + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/node-config-provider": "^4.3.13", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-COToYKgquDyligbcAep7ygs48RK+mwe/IYprq4+TSrVFzNOYmzWvHf6werpnKV5VYpRiwdn+Wa5ZXkPqLVwcTg=="], 75 + 76 + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-V/FNCjFxnh4VGu+HdSiW4Yg5GELihA1MIDSAdsEPvuayXBVmr0Jaa6jdLAZLH38KYXl/vVjri9DQJWnTAujHEA=="], 77 + 78 + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.974.7", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "^3.973.27", "@aws-sdk/crc64-nvme": "^3.972.6", "@aws-sdk/types": "^3.973.7", "@smithy/is-array-buffer": "^4.2.2", "@smithy/node-config-provider": "^4.3.13", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/util-middleware": "^4.2.13", "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-uU4/ch2CLHB8Phu1oTKnnQ4e8Ujqi49zEnQYBhWYT53zfFvtJCdGsaOoypBr8Fm/pmCBssRmGoIQ4sixgdLP9w=="], 79 + 80 + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ=="], 81 + 82 + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-TyfOi2XNdOZpNKeTJwRUsVAGa+14nkyMb2VVGG+eDgcWG/ed6+NUo72N3hT6QJioxym80NSinErD+LBRF0Ir1w=="], 83 + 84 + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog=="], 85 + 86 + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.972.10", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ=="], 87 + 88 + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.972.28", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/types": "^3.973.7", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/core": "^3.23.14", "@smithy/node-config-provider": "^4.3.13", "@smithy/protocol-http": "^5.3.13", "@smithy/signature-v4": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-middleware": "^4.2.13", "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-qJHcJQH9UNPUrnPlRtCozKjtqAaypQ5IgQxTNoPsVYIQeuwNIA8Rwt3NvGij1vCDYDfCmZaPLpnJEHlZXeFqmg=="], 89 + 90 + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-wSA2BR7L0CyBNDJeSrleIIzC+DzL93YNTdfU0KPGLiocK6YsRv1nPAzPF+BFSdcs0Qa5ku5Kcf4KvQcWwKGenQ=="], 91 + 92 + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/types": "^3.973.7", "@aws-sdk/util-endpoints": "^3.996.6", "@smithy/core": "^3.23.14", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/util-retry": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ=="], 93 + 94 + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.996.19", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.27", "@aws-sdk/middleware-host-header": "^3.972.9", "@aws-sdk/middleware-logger": "^3.972.9", "@aws-sdk/middleware-recursion-detection": "^3.972.10", "@aws-sdk/middleware-user-agent": "^3.972.29", "@aws-sdk/region-config-resolver": "^3.972.11", "@aws-sdk/types": "^3.973.7", "@aws-sdk/util-endpoints": "^3.996.6", "@aws-sdk/util-user-agent-browser": "^3.972.9", "@aws-sdk/util-user-agent-node": "^3.973.15", "@smithy/config-resolver": "^4.4.14", "@smithy/core": "^3.23.14", "@smithy/fetch-http-handler": "^5.3.16", "@smithy/hash-node": "^4.2.13", "@smithy/invalid-dependency": "^4.2.13", "@smithy/middleware-content-length": "^4.2.13", "@smithy/middleware-endpoint": "^4.4.29", "@smithy/middleware-retry": "^4.5.0", "@smithy/middleware-serde": "^4.2.17", "@smithy/middleware-stack": "^4.2.13", "@smithy/node-config-provider": "^4.3.13", "@smithy/node-http-handler": "^4.5.2", "@smithy/protocol-http": "^5.3.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.45", "@smithy/util-defaults-mode-node": "^4.2.49", "@smithy/util-endpoints": "^3.3.4", "@smithy/util-middleware": "^4.2.13", "@smithy/util-retry": "^4.3.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q=="], 95 + 96 + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.972.11", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/config-resolver": "^4.4.14", "@smithy/node-config-provider": "^4.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg=="], 97 + 98 + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.16", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.28", "@aws-sdk/types": "^3.973.7", "@smithy/protocol-http": "^5.3.13", "@smithy/signature-v4": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-EMdXYB4r/k5RWq86fugjRhid5JA+Z6MpS7n4sij4u5/C+STrkvuf9aFu41rJA9MjUzxCLzv8U2XL8cH2GSRYpQ=="], 99 + 100 + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1026.0", "", { "dependencies": { "@aws-sdk/core": "^3.973.27", "@aws-sdk/nested-clients": "^3.996.19", "@aws-sdk/types": "^3.973.7", "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA=="], 101 + 102 + "@aws-sdk/types": ["@aws-sdk/types@3.973.7", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg=="], 103 + 104 + "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.972.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA=="], 105 + 106 + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.996.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "@smithy/util-endpoints": "^3.3.4", "tslib": "^2.6.2" } }, "sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg=="], 107 + 108 + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.5", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ=="], 109 + 110 + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.7", "@smithy/types": "^4.14.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw=="], 111 + 112 + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.973.15", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.29", "@aws-sdk/types": "^3.973.7", "@smithy/node-config-provider": "^4.3.13", "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w=="], 113 + 114 + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.17", "", { "dependencies": { "@smithy/types": "^4.14.0", "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" } }, "sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg=="], 115 + 116 + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], 117 + 118 + "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA=="], 119 + 120 + "@cbor-extract/cbor-extract-darwin-x64": ["@cbor-extract/cbor-extract-darwin-x64@2.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q=="], 121 + 122 + "@cbor-extract/cbor-extract-linux-arm": ["@cbor-extract/cbor-extract-linux-arm@2.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ=="], 123 + 124 + "@cbor-extract/cbor-extract-linux-arm64": ["@cbor-extract/cbor-extract-linux-arm64@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg=="], 125 + 126 + "@cbor-extract/cbor-extract-linux-x64": ["@cbor-extract/cbor-extract-linux-x64@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA=="], 127 + 128 + "@cbor-extract/cbor-extract-win32-x64": ["@cbor-extract/cbor-extract-win32-x64@2.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA=="], 129 + 130 + "@daytona/api-client": ["@daytona/api-client@0.162.0", "", { "dependencies": { "axios": "^1.6.1" } }, "sha512-cKhncpTZgTFHsrQB7AuayBwmGaNcQCY/Qcycb2VMlYUlobWEEXlqPZaVdvgeZakRwJA6DfVtMF87kek9cTRubg=="], 131 + 132 + "@daytona/toolbox-api-client": ["@daytona/toolbox-api-client@0.162.0", "", { "dependencies": { "axios": "^1.6.1" } }, "sha512-kj4qCzynGQYF5/718YVs3T3wqRhFh9NGDjHTRpUDnGXX/PyLI6O8zD6GlftJFMdgJjp8d8DFOTVvPgAO9/mXAw=="], 133 + 134 + "@daytonaio/sdk": ["@daytonaio/sdk@0.162.0", "", { "dependencies": { "@aws-sdk/client-s3": "^3.787.0", "@aws-sdk/lib-storage": "^3.798.0", "@daytona/api-client": "0.162.0", "@daytona/toolbox-api-client": "0.162.0", "@iarna/toml": "^2.2.5", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.207.0", "@opentelemetry/instrumentation-http": "^0.207.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-node": "^0.207.0", "@opentelemetry/sdk-trace-base": "^2.2.0", "@opentelemetry/semantic-conventions": "^1.37.0", "axios": "^1.13.5", "busboy": "^1.0.0", "dotenv": "^17.0.1", "expand-tilde": "^2.0.2", "fast-glob": "^3.3.0", "form-data": "^4.0.4", "isomorphic-ws": "^5.0.0", "pathe": "^2.0.3", "shell-quote": "^1.8.2", "tar": "^7.5.11" } }, "sha512-MPvYsZWEwVJymNYpH6bnFMzPb+FwqGrvBG9zkmUQzQbHSqi+urpngJSYfxCmNZkOz7SxYk07HFga9iFzWM0pww=="], 135 + 136 + "@deno/sandbox": ["@deno/sandbox@0.13.2", "", { "dependencies": { "@deno/shim-deno": "~0.18.0", "ws": "^8.18.3", "zod": "^4.1.5" } }, "sha512-hteIwQ/mqkJHLrxtcONSCntziOAEWZz0Q2m/Ps4E+HjimLaQxsqpBU0Xn6hin23yf2wOCls336PG9epbMliUOQ=="], 137 + 138 + "@deno/shim-deno": ["@deno/shim-deno@0.18.2", "", { "dependencies": { "@deno/shim-deno-test": "^0.5.0", "which": "^4.0.0" } }, "sha512-oQ0CVmOio63wlhwQF75zA4ioolPvOwAoK0yuzcS5bDC1JUvH3y1GS8xPh8EOpcoDQRU4FTG8OQfxhpR+c6DrzA=="], 139 + 140 + "@deno/shim-deno-test": ["@deno/shim-deno-test@0.5.0", "", {}, "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w=="], 141 + 142 + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], 143 + 144 + "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], 145 + 146 + "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], 147 + 148 + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], 149 + 150 + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], 151 + 152 + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], 153 + 154 + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], 155 + 156 + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], 157 + 158 + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], 159 + 160 + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], 161 + 162 + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], 163 + 164 + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], 165 + 166 + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], 167 + 168 + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], 169 + 170 + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], 171 + 172 + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], 173 + 174 + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], 175 + 176 + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], 177 + 178 + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], 179 + 180 + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], 181 + 182 + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], 183 + 184 + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], 185 + 186 + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], 187 + 188 + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], 189 + 190 + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], 191 + 192 + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], 193 + 194 + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], 195 + 196 + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], 197 + 198 + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], 199 + 200 + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], 201 + 202 + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], 203 + 204 + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], 205 + 206 + "@fly/sprites": ["@fly/sprites@0.0.1", "", {}, "sha512-1s+dIVi/pTMP4Aj4Mkg+4LoZ/+a0Kp6l9piPRxvpgEKm11b/eRiZgJwVytwAHeI/vtg2fuwcFExjtXOEfny/TA=="], 207 + 208 + "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], 209 + 210 + "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], 211 + 212 + "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], 213 + 214 + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], 215 + 216 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 217 + 218 + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], 219 + 220 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="], 221 + 222 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 223 + 224 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 225 + 226 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 227 + 228 + "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], 229 + 230 + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.207.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ=="], 231 + 232 + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.2.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ=="], 233 + 234 + "@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], 235 + 236 + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.207.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/sdk-logs": "0.207.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-K92RN+kQGTMzFDsCzsYNGqOsXRUnko/Ckk+t/yPJao72MewOLgBUTWVHhebgkNfRCYqDz1v3K0aPT9OJkemvgg=="], 237 + 238 + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/sdk-logs": "0.207.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JpOh7MguEUls8eRfkVVW3yRhClo5b9LqwWTOg8+i4gjr/+8eiCtquJnC7whvpTIGyff06cLZ2NsEj+CVP3Mjeg=="], 239 + 240 + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-logs": "0.207.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-RQJEV/K6KPbQrIUbsrRkEe0ufks1o5OGLHy6jbDD8tRjeCsbFHWfg99lYBRqBV33PYZJXsigqMaAbjWGTFYzLw=="], 241 + 242 + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.207.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-metrics": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-6flX89W54gkwmqYShdcTBR1AEF5C1Ob0O8pDgmLPikTKyEv27lByr9yBmO5WrP0+5qJuNPHrLfgFQFYi6npDGA=="], 243 + 244 + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-metrics": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-fG8FAJmvXOrKXGIRN8+y41U41IfVXxPRVwyB05LoMqYSjugx/FSBkMZUZXUT/wclTdmBKtS5MKoi0bEKkmRhSw=="], 245 + 246 + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-metrics": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kDBxiTeQjaRlUQzS1COT9ic+et174toZH6jxaVuVAvGqmxOkgjpLOjrI5ff8SMMQE69r03L3Ll3nPKekLopLwg=="], 247 + 248 + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-metrics": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Y5p1s39FvIRmU+F1++j7ly8/KSqhMmn6cMfpQqiDCqDjdDHwUtSq0XI0WwL3HYGnZeaR/VV4BNmsYQJ7GAPrhw=="], 249 + 250 + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.207.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-grpc-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7u2ZmcIx6D4KG/+5np4X2qA0o+O0K8cnUDhR4WI/vr5ZZ0la9J9RG+tkSjC7Yz+2XgL6760gSIM7/nyd3yaBLA=="], 251 + 252 + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-HSRBzXHIC7C8UfPQdu15zEEoBGv0yWkhEwxqgPCHVUKUQ9NLHVGXkVrf65Uaj7UwmAkC1gQfkuVYvLlD//AnUQ=="], 253 + 254 + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ruUQB4FkWtxHjNmSXjrhmJZFvyMm+tBzHyMm7YPQshApy4wvZUTcrpPyP/A/rCl/8M4BwoVIZdiwijMdbZaq4w=="], 255 + 256 + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-VV4QzhGCT7cWrGasBWxelBjqbNBbyHicWWS/66KoZoe9BzYwFB72SH2/kkc4uAviQlO8iwv2okIJy+/jqqEHTg=="], 257 + 258 + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "import-in-the-middle": "^2.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA=="], 259 + 260 + "@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/instrumentation": "0.207.0", "@opentelemetry/semantic-conventions": "^1.29.0", "forwarded-parse": "2.1.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-FC4i5hVixTzuhg4SV2ycTEAYx+0E2hm+GwbdoVPSA6kna0pPVI4etzaA9UkpJ9ussumQheFXP6rkGIaFJjMxsw=="], 261 + 262 + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-transformer": "0.207.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-4RQluMVVGMrHok/3SVeSJ6EnRNkA2MINcX88sh+d/7DjGUrewW/WT88IsMEci0wUM+5ykTpPPNbEOoW+jwHnbw=="], 263 + 264 + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.207.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-exporter-base": "0.207.0", "@opentelemetry/otlp-transformer": "0.207.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-eKFjKNdsPed4q9yYqeI5gBTLjXxDM/8jwhiC0icw3zKxHVGBySoDsed5J5q/PGY/3quzenTr3FiTxA3NiNT+nw=="], 265 + 266 + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-logs": "0.207.0", "@opentelemetry/sdk-metrics": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-+6DRZLqM02uTIY5GASMZWUwr52sLfNiEe20+OEaZKhztCs3+2LxoTjb6JxFRd9q1qNqckXKYlUKjbH/AhG8/ZA=="], 267 + 268 + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-9CrbTLFi5Ee4uepxg2qlpQIozoJuoAZU5sKMx0Mn7Oh+p7UrgCiEV6C02FOxxdYVRRFQVCinYR8Kf6eMSQsIsw=="], 269 + 270 + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FfeOHOrdhiNzecoB1jZKp2fybqmqMPJUXe2ZOydP7QzmTPYcfPeuaclTLYVhK3HyJf71kt8sTl92nV4YIaLaKA=="], 271 + 272 + "@opentelemetry/resources": ["@opentelemetry/resources@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A=="], 273 + 274 + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-4MEQmn04y+WFe6cyzdrXf58hZxilvY59lzZj2AccuHW/+BxLn/rGVN/Irsi/F0qfBOpMOrrCLKTExoSL2zoQmg=="], 275 + 276 + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw=="], 277 + 278 + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.207.0", "@opentelemetry/exporter-logs-otlp-http": "0.207.0", "@opentelemetry/exporter-logs-otlp-proto": "0.207.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.207.0", "@opentelemetry/exporter-metrics-otlp-http": "0.207.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.207.0", "@opentelemetry/exporter-prometheus": "0.207.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.207.0", "@opentelemetry/exporter-trace-otlp-http": "0.207.0", "@opentelemetry/exporter-trace-otlp-proto": "0.207.0", "@opentelemetry/exporter-zipkin": "2.2.0", "@opentelemetry/instrumentation": "0.207.0", "@opentelemetry/propagator-b3": "2.2.0", "@opentelemetry/propagator-jaeger": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/sdk-logs": "0.207.0", "@opentelemetry/sdk-metrics": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0", "@opentelemetry/sdk-trace-node": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-hnRsX/M8uj0WaXOBvFenQ8XsE8FLVh2uSnn1rkWu4mx+qu7EKGUZvZng6y/95cyzsqOfiaDDr08Ek4jppkIDNg=="], 279 + 280 + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw=="], 281 + 282 + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.2.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.2.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-+OaRja3f0IqGG2kptVeYsrZQK9nKRSpfFrKtRBq4uh6nIB8bTBgaGvYQrQoRrQWQMA5dK5yLhDMDc0dvYvCOIQ=="], 283 + 284 + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], 285 + 286 + "@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="], 287 + 288 + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], 289 + 290 + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], 291 + 292 + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], 293 + 294 + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], 295 + 296 + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], 297 + 298 + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], 299 + 300 + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], 301 + 302 + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], 303 + 304 + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], 305 + 306 + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], 307 + 308 + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.15", "", { "os": "android", "cpu": "arm64" }, "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA=="], 309 + 310 + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg=="], 311 + 312 + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw=="], 313 + 314 + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.15", "", { "os": "freebsd", "cpu": "x64" }, "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw=="], 315 + 316 + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15", "", { "os": "linux", "cpu": "arm" }, "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA=="], 317 + 318 + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w=="], 319 + 320 + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ=="], 321 + 322 + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15", "", { "os": "linux", "cpu": "ppc64" }, "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ=="], 323 + 324 + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15", "", { "os": "linux", "cpu": "s390x" }, "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ=="], 325 + 326 + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.15", "", { "os": "linux", "cpu": "x64" }, "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA=="], 327 + 328 + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.15", "", { "os": "linux", "cpu": "x64" }, "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw=="], 329 + 330 + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.15", "", { "os": "none", "cpu": "arm64" }, "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg=="], 331 + 332 + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.15", "", { "dependencies": { "@emnapi/core": "1.9.2", "@emnapi/runtime": "1.9.2", "@napi-rs/wasm-runtime": "^1.1.3" }, "cpu": "none" }, "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q=="], 333 + 334 + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA=="], 335 + 336 + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.15", "", { "os": "win32", "cpu": "x64" }, "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g=="], 337 + 338 + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.15", "", {}, "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g=="], 339 + 340 + "@rollup/plugin-alias": ["@rollup/plugin-alias@6.0.0", "", { "peerDependencies": { "rollup": ">=4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g=="], 341 + 342 + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg=="], 343 + 344 + "@rollup/plugin-dynamic-import-vars": ["@rollup/plugin-dynamic-import-vars@2.1.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "astring": "^1.8.5", "estree-walker": "^2.0.2", "fast-glob": "^3.2.12", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ=="], 345 + 346 + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], 347 + 348 + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="], 349 + 350 + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], 351 + 352 + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="], 353 + 354 + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="], 355 + 356 + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="], 357 + 358 + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="], 359 + 360 + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="], 361 + 362 + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="], 363 + 364 + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="], 365 + 366 + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="], 367 + 368 + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="], 369 + 370 + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="], 371 + 372 + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="], 373 + 374 + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="], 375 + 376 + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="], 377 + 378 + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="], 379 + 380 + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="], 381 + 382 + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="], 383 + 384 + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="], 385 + 386 + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="], 387 + 388 + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="], 389 + 390 + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="], 391 + 392 + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="], 393 + 394 + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="], 395 + 396 + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="], 397 + 398 + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="], 399 + 400 + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], 401 + 402 + "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw=="], 403 + 404 + "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.3", "", { "dependencies": { "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw=="], 405 + 406 + "@smithy/config-resolver": ["@smithy/config-resolver@4.4.14", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.13", "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-endpoints": "^3.3.4", "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ=="], 407 + 408 + "@smithy/core": ["@smithy/core@3.23.14", "", { "dependencies": { "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-middleware": "^4.2.13", "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg=="], 409 + 410 + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.13", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.13", "@smithy/property-provider": "^4.2.13", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ=="], 411 + 412 + "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.13", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ=="], 413 + 414 + "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.13", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg=="], 415 + 416 + "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA=="], 417 + 418 + "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.13", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A=="], 419 + 420 + "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.13", "", { "dependencies": { "@smithy/eventstream-codec": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA=="], 421 + 422 + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.16", "", { "dependencies": { "@smithy/protocol-http": "^5.3.13", "@smithy/querystring-builder": "^4.2.13", "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ=="], 423 + 424 + "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.14", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", "@smithy/chunked-blob-reader-native": "^4.2.3", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-rtQ5es8r/5v4rav7q5QTsfx9CtCyzrz/g7ZZZBH2xtMmd6G/KQrLOWfSHTvFOUPlVy59RQvxeBYJaLRoybMEyA=="], 425 + 426 + "@smithy/hash-node": ["@smithy/hash-node@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA=="], 427 + 428 + "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-WdQ7HwUjINXETeh6dqUeob1UHIYx8kAn9PSp1HhM2WWegiZBYVy2WXIs1lB07SZLan/udys9SBnQGt9MQbDpdg=="], 429 + 430 + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg=="], 431 + 432 + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow=="], 433 + 434 + "@smithy/md5-js": ["@smithy/md5-js@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-cNm7I9NXolFxtS20ojROddOEpSAeI1Obq6pd1Kj5HtHws3s9Fkk8DdHDfQSs5KuxCewZuVK6UqrJnfJmiMzDuQ=="], 435 + 436 + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.13", "", { "dependencies": { "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig=="], 437 + 438 + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.29", "", { "dependencies": { "@smithy/core": "^3.23.14", "@smithy/middleware-serde": "^4.2.17", "@smithy/node-config-provider": "^4.3.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "@smithy/url-parser": "^4.2.13", "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw=="], 439 + 440 + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.5.0", "", { "dependencies": { "@smithy/core": "^3.23.14", "@smithy/node-config-provider": "^4.3.13", "@smithy/protocol-http": "^5.3.13", "@smithy/service-error-classification": "^4.2.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "@smithy/util-middleware": "^4.2.13", "@smithy/util-retry": "^4.3.0", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-/NzISn4grj/BRFVua/xnQwF+7fakYZgimpw2dfmlPgcqecBMKxpB9g5mLYRrmBD5OrPoODokw4Vi1hrSR4zRyw=="], 441 + 442 + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.17", "", { "dependencies": { "@smithy/core": "^3.23.14", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ=="], 443 + 444 + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw=="], 445 + 446 + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.13", "", { "dependencies": { "@smithy/property-provider": "^4.2.13", "@smithy/shared-ini-file-loader": "^4.4.8", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw=="], 447 + 448 + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.5.2", "", { "dependencies": { "@smithy/protocol-http": "^5.3.13", "@smithy/querystring-builder": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA=="], 449 + 450 + "@smithy/property-provider": ["@smithy/property-provider@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ=="], 451 + 452 + "@smithy/protocol-http": ["@smithy/protocol-http@5.3.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg=="], 453 + 454 + "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ=="], 455 + 456 + "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA=="], 457 + 458 + "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0" } }, "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw=="], 459 + 460 + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.8", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw=="], 461 + 462 + "@smithy/signature-v4": ["@smithy/signature-v4@5.3.13", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-middleware": "^4.2.13", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg=="], 463 + 464 + "@smithy/smithy-client": ["@smithy/smithy-client@4.12.9", "", { "dependencies": { "@smithy/core": "^3.23.14", "@smithy/middleware-endpoint": "^4.4.29", "@smithy/middleware-stack": "^4.2.13", "@smithy/protocol-http": "^5.3.13", "@smithy/types": "^4.14.0", "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" } }, "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ=="], 465 + 466 + "@smithy/types": ["@smithy/types@4.14.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ=="], 467 + 468 + "@smithy/url-parser": ["@smithy/url-parser@4.2.13", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw=="], 469 + 470 + "@smithy/util-base64": ["@smithy/util-base64@4.3.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ=="], 471 + 472 + "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ=="], 473 + 474 + "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g=="], 475 + 476 + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q=="], 477 + 478 + "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ=="], 479 + 480 + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.45", "", { "dependencies": { "@smithy/property-provider": "^4.2.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw=="], 481 + 482 + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.49", "", { "dependencies": { "@smithy/config-resolver": "^4.4.14", "@smithy/credential-provider-imds": "^4.2.13", "@smithy/node-config-provider": "^4.3.13", "@smithy/property-provider": "^4.2.13", "@smithy/smithy-client": "^4.12.9", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ=="], 483 + 484 + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.3.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog=="], 485 + 486 + "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg=="], 487 + 488 + "@smithy/util-middleware": ["@smithy/util-middleware@4.2.13", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow=="], 489 + 490 + "@smithy/util-retry": ["@smithy/util-retry@4.3.0", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.13", "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-tSOPQNT/4KfbvqeMovWC3g23KSYy8czHd3tlN+tOYVNIDLSfxIsrPJihYi5TpNcoV789KWtgChUVedh2y6dDPg=="], 491 + 492 + "@smithy/util-stream": ["@smithy/util-stream@4.5.22", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.16", "@smithy/node-http-handler": "^4.5.2", "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew=="], 493 + 494 + "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw=="], 495 + 496 + "@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], 497 + 498 + "@smithy/util-waiter": ["@smithy/util-waiter@4.2.15", "", { "dependencies": { "@smithy/types": "^4.14.0", "tslib": "^2.6.2" } }, "sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg=="], 499 + 500 + "@smithy/uuid": ["@smithy/uuid@1.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="], 501 + 502 + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], 503 + 504 + "@std/yaml": ["@jsr/std__yaml@1.0.12", "https://npm.jsr.io/~/11/@jsr/std__yaml/1.0.12.tgz", {}, "sha512-pz/BisWZWH16JvLJBwrNwUwfIsRnf9qniMrmI6Z3vIAcVRVFcA5+i4o6z6QqsMKqFzjlB66WZE+jSyujT/RvRg=="], 505 + 506 + "@tsndr/cloudflare-worker-jwt": ["@tsndr/cloudflare-worker-jwt@3.2.1", "", {}, "sha512-1AfDEgu7DTbU0sXDSOKh4D5t7+RJ0dIRRaDmoX3LFeW0AxQdunuqTQ7AVGwNJqOnxrbxiruyvX01cf9HHqEvXQ=="], 507 + 508 + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 509 + 510 + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], 511 + 512 + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], 513 + 514 + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 515 + 516 + "@types/node": ["@types/node@25.5.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg=="], 517 + 518 + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], 519 + 520 + "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], 521 + 522 + "@vercel/sandbox": ["@vercel/sandbox@1.9.3", "", { "dependencies": { "@vercel/oidc": "3.2.0", "@workflow/serde": "4.1.0-beta.2", "async-retry": "1.3.3", "jsonlines": "0.1.1", "ms": "2.1.3", "picocolors": "^1.1.1", "tar-stream": "3.1.7", "undici": "^7.16.0", "xdg-app-paths": "5.1.0", "zod": "3.24.4" } }, "sha512-G6ef1izdlYftkmv2xxBfks76gm2oxIH3LgiASe8WMw7xoge6zFzyFjY91/dPMT0Pkd4UNX9nsaOedj98ywdk8Q=="], 523 + 524 + "@vitest/expect": ["@vitest/expect@4.1.4", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.4", "@vitest/utils": "4.1.4", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww=="], 525 + 526 + "@vitest/mocker": ["@vitest/mocker@4.1.4", "", { "dependencies": { "@vitest/spy": "4.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg=="], 527 + 528 + "@vitest/pretty-format": ["@vitest/pretty-format@4.1.4", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A=="], 529 + 530 + "@vitest/runner": ["@vitest/runner@4.1.4", "", { "dependencies": { "@vitest/utils": "4.1.4", "pathe": "^2.0.3" } }, "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ=="], 531 + 532 + "@vitest/snapshot": ["@vitest/snapshot@4.1.4", "", { "dependencies": { "@vitest/pretty-format": "4.1.4", "@vitest/utils": "4.1.4", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw=="], 533 + 534 + "@vitest/spy": ["@vitest/spy@4.1.4", "", {}, "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ=="], 535 + 536 + "@vitest/utils": ["@vitest/utils@4.1.4", "", { "dependencies": { "@vitest/pretty-format": "4.1.4", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw=="], 537 + 538 + "@workflow/serde": ["@workflow/serde@4.1.0-beta.2", "", {}, "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww=="], 539 + 540 + "abort-controller-x": ["abort-controller-x@0.4.3", "", {}, "sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA=="], 541 + 542 + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], 543 + 544 + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], 545 + 546 + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 547 + 548 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 549 + 550 + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], 551 + 552 + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], 553 + 554 + "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], 555 + 556 + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], 557 + 558 + "axios": ["axios@1.15.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="], 559 + 560 + "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], 561 + 562 + "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], 563 + 564 + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 565 + 566 + "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], 567 + 568 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 569 + 570 + "buffer": ["buffer@5.6.0", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw=="], 571 + 572 + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 573 + 574 + "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], 575 + 576 + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], 577 + 578 + "cbor-extract": ["cbor-extract@2.2.2", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2", "@cbor-extract/cbor-extract-darwin-x64": "2.2.2", "@cbor-extract/cbor-extract-linux-arm": "2.2.2", "@cbor-extract/cbor-extract-linux-arm64": "2.2.2", "@cbor-extract/cbor-extract-linux-x64": "2.2.2", "@cbor-extract/cbor-extract-win32-x64": "2.2.2" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng=="], 579 + 580 + "cbor-x": ["cbor-x@1.6.4", "", { "optionalDependencies": { "cbor-extract": "^2.2.2" } }, "sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q=="], 581 + 582 + "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], 583 + 584 + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], 585 + 586 + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], 587 + 588 + "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], 589 + 590 + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 591 + 592 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 593 + 594 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 595 + 596 + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 597 + 598 + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], 599 + 600 + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], 601 + 602 + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 603 + 604 + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 605 + 606 + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], 607 + 608 + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 609 + 610 + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 611 + 612 + "dotenv": ["dotenv@17.4.1", "", {}, "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw=="], 613 + 614 + "drizzle-kit": ["drizzle-kit@0.31.10", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw=="], 615 + 616 + "drizzle-orm": ["drizzle-orm@0.45.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q=="], 617 + 618 + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], 619 + 620 + "effect": ["effect@3.21.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ=="], 621 + 622 + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 623 + 624 + "envalid": ["envalid@8.1.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w=="], 625 + 626 + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], 627 + 628 + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], 629 + 630 + "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], 631 + 632 + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], 633 + 634 + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], 635 + 636 + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], 637 + 638 + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 639 + 640 + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 641 + 642 + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], 643 + 644 + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], 645 + 646 + "expand-tilde": ["expand-tilde@2.0.2", "", { "dependencies": { "homedir-polyfill": "^1.0.1" } }, "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw=="], 647 + 648 + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], 649 + 650 + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], 651 + 652 + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], 653 + 654 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 655 + 656 + "fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="], 657 + 658 + "fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], 659 + 660 + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], 661 + 662 + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], 663 + 664 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 665 + 666 + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], 667 + 668 + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], 669 + 670 + "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], 671 + 672 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 673 + 674 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 675 + 676 + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 677 + 678 + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], 679 + 680 + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 681 + 682 + "get-tsconfig": ["get-tsconfig@4.13.7", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q=="], 683 + 684 + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 685 + 686 + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 687 + 688 + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], 689 + 690 + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], 691 + 692 + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], 693 + 694 + "homedir-polyfill": ["homedir-polyfill@1.0.3", "", { "dependencies": { "parse-passwd": "^1.0.0" } }, "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="], 695 + 696 + "hono": ["hono@4.12.12", "", {}, "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q=="], 697 + 698 + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 699 + 700 + "import-in-the-middle": ["import-in-the-middle@2.0.6", "", { "dependencies": { "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^2.2.0", "module-details-from-path": "^1.0.4" } }, "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw=="], 701 + 702 + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 703 + 704 + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 705 + 706 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 707 + 708 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 709 + 710 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 711 + 712 + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], 713 + 714 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 715 + 716 + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], 717 + 718 + "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], 719 + 720 + "isomorphic-ws": ["isomorphic-ws@5.0.0", "", { "peerDependencies": { "ws": "*" } }, "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw=="], 721 + 722 + "jsonlines": ["jsonlines@0.1.1", "", {}, "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA=="], 723 + 724 + "libsodium": ["libsodium@0.8.2", "", {}, "sha512-TsnGYMoZtpweT+kR+lOv5TVsnJ/9U0FZOsLFzFOMWmxqOAYXjX3fsrPAW+i1LthgDKXJnI9A8dWEanT1tnJKIw=="], 725 + 726 + "libsodium-wrappers": ["libsodium-wrappers@0.8.2", "", { "dependencies": { "libsodium": "^0.8.0" } }, "sha512-VFLmfxkxo+U9q60tjcnSomQBRx2UzlRjKWJqvB4K1pUqsMQg4cu3QXA2nrcsj9A1qRsnJBbi2Ozx1hsiDoCkhw=="], 727 + 728 + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], 729 + 730 + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], 731 + 732 + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], 733 + 734 + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], 735 + 736 + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], 737 + 738 + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], 739 + 740 + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], 741 + 742 + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], 743 + 744 + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], 745 + 746 + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], 747 + 748 + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], 749 + 750 + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], 751 + 752 + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], 753 + 754 + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], 755 + 756 + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 757 + 758 + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 759 + 760 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 761 + 762 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 763 + 764 + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], 765 + 766 + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 767 + 768 + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], 769 + 770 + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], 771 + 772 + "modal": ["modal@0.7.4", "", { "dependencies": { "cbor-x": "^1.6.0", "long": "^5.3.1", "nice-grpc": "^2.1.12", "protobufjs": "^7.5.0", "smol-toml": "^1.3.3", "uuid": "^11.1.0" } }, "sha512-md/+L67tM1RazAt2xvLO+gUqRz6zllyYoNNiM8h+Eb1wLy7JzliH7vnx9f9Sq4zE3qQHENpX0Tjy/LSkIyrANA=="], 773 + 774 + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], 775 + 776 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 777 + 778 + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 779 + 780 + "nice-grpc": ["nice-grpc@2.1.14", "", { "dependencies": { "@grpc/grpc-js": "^1.14.0", "abort-controller-x": "^0.4.0", "nice-grpc-common": "^2.0.2" } }, "sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww=="], 781 + 782 + "nice-grpc-common": ["nice-grpc-common@2.0.2", "", { "dependencies": { "ts-error": "^1.0.6" } }, "sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ=="], 783 + 784 + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], 785 + 786 + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], 787 + 788 + "os-paths": ["os-paths@4.4.0", "", {}, "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg=="], 789 + 790 + "parse-passwd": ["parse-passwd@1.0.0", "", {}, "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="], 791 + 792 + "path-expression-matcher": ["path-expression-matcher@1.4.0", "", {}, "sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q=="], 793 + 794 + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 795 + 796 + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 797 + 798 + "pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], 799 + 800 + "pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="], 801 + 802 + "pg-connection-string": ["pg-connection-string@2.12.0", "", {}, "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ=="], 803 + 804 + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], 805 + 806 + "pg-pool": ["pg-pool@3.13.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA=="], 807 + 808 + "pg-protocol": ["pg-protocol@1.13.0", "", {}, "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w=="], 809 + 810 + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], 811 + 812 + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], 813 + 814 + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 815 + 816 + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 817 + 818 + "pkgroll": ["pkgroll@2.27.0", "", { "dependencies": { "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-dynamic-import-vars": "^2.1.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "cjs-module-lexer": "^2.2.0", "esbuild": "^0.26.0", "magic-string": "^0.30.21", "rollup": "^4.53.5", "rollup-plugin-import-trace": "^1.0.1", "rollup-pluginutils": "^2.8.2", "yaml": "^2.8.2" }, "peerDependencies": { "typescript": "^4.1 || ^5.0" }, "optionalPeers": ["typescript"], "bin": { "pkgroll": "dist/cli.mjs" } }, "sha512-Huw5ZRxWTWeQ0PbNNKdbkAl52bPMy009RXdB4u3qjb47AMEBLG5VVF0V6oOD+YYiZaHaFxvjEeX+A2T9ckaClQ=="], 819 + 820 + "postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], 821 + 822 + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], 823 + 824 + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], 825 + 826 + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], 827 + 828 + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], 829 + 830 + "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], 831 + 832 + "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], 833 + 834 + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], 835 + 836 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 837 + 838 + "ramda": ["ramda@0.32.0", "", {}, "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ=="], 839 + 840 + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 841 + 842 + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 843 + 844 + "require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="], 845 + 846 + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], 847 + 848 + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], 849 + 850 + "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], 851 + 852 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 853 + 854 + "rolldown": ["rolldown@1.0.0-rc.15", "", { "dependencies": { "@oxc-project/types": "=0.124.0", "@rolldown/pluginutils": "1.0.0-rc.15" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.15", "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", "@rolldown/binding-darwin-x64": "1.0.0-rc.15", "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g=="], 855 + 856 + "rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="], 857 + 858 + "rollup-plugin-import-trace": ["rollup-plugin-import-trace@1.0.1", "", { "peerDependencies": { "rollup": "^3.0.0 || ^4.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["rollup", "vite"] }, "sha512-dWOKrdYba2BXDJh82kkuM4pAR3M6r7WFp6vbVxAgvLfug2WniMFAg2uZ5sNQ/8CoQWo5l2N5EXDG8+QClKk1YQ=="], 859 + 860 + "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], 861 + 862 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 863 + 864 + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 865 + 866 + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], 867 + 868 + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], 869 + 870 + "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], 871 + 872 + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 873 + 874 + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 875 + 876 + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 877 + 878 + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], 879 + 880 + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], 881 + 882 + "std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="], 883 + 884 + "stream-browserify": ["stream-browserify@3.0.0", "", { "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA=="], 885 + 886 + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], 887 + 888 + "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], 889 + 890 + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 891 + 892 + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 893 + 894 + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 895 + 896 + "strnum": ["strnum@2.2.3", "", {}, "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg=="], 897 + 898 + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 899 + 900 + "tar": ["tar@7.5.13", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng=="], 901 + 902 + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], 903 + 904 + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], 905 + 906 + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], 907 + 908 + "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], 909 + 910 + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], 911 + 912 + "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], 913 + 914 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 915 + 916 + "ts-error": ["ts-error@1.0.6", "", {}, "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA=="], 917 + 918 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 919 + 920 + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], 921 + 922 + "undici": ["undici@7.24.7", "", {}, "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ=="], 923 + 924 + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], 925 + 926 + "unique-username-generator": ["unique-username-generator@1.5.1", "", { "bin": { "usernamegen": "dist/cli.js", "usergen": "dist/cli.js", "unique-username": "dist/cli.js", "uuname": "dist/cli.js" } }, "sha512-Q0pSKPyij4L7Tm6Bo3XsWeFG9qbyWTtwb3jTN+XgGhCFdlvQn6Fj0DCfYElw0kp/Xp7Jv1Q+CL+aA8S07RMChA=="], 927 + 928 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 929 + 930 + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], 931 + 932 + "vite": ["vite@8.0.8", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.15", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw=="], 933 + 934 + "vitest": ["vitest@4.1.4", "", { "dependencies": { "@vitest/expect": "4.1.4", "@vitest/mocker": "4.1.4", "@vitest/pretty-format": "4.1.4", "@vitest/runner": "4.1.4", "@vitest/snapshot": "4.1.4", "@vitest/spy": "4.1.4", "@vitest/utils": "4.1.4", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.4", "@vitest/browser-preview": "4.1.4", "@vitest/browser-webdriverio": "4.1.4", "@vitest/coverage-istanbul": "4.1.4", "@vitest/coverage-v8": "4.1.4", "@vitest/ui": "4.1.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg=="], 935 + 936 + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 937 + 938 + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], 939 + 940 + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 941 + 942 + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], 943 + 944 + "xdg-app-paths": ["xdg-app-paths@5.1.0", "", { "dependencies": { "xdg-portable": "^7.0.0" } }, "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA=="], 945 + 946 + "xdg-portable": ["xdg-portable@7.3.0", "", { "dependencies": { "os-paths": "^4.0.1" } }, "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw=="], 947 + 948 + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], 949 + 950 + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 951 + 952 + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], 953 + 954 + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], 955 + 956 + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 957 + 958 + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 959 + 960 + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], 961 + 962 + "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 963 + 964 + "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 965 + 966 + "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 967 + 968 + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], 969 + 970 + "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 971 + 972 + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 973 + 974 + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 975 + 976 + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 977 + 978 + "@opentelemetry/exporter-zipkin/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 979 + 980 + "@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 981 + 982 + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 983 + 984 + "@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@2.6.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g=="], 985 + 986 + "@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA=="], 987 + 988 + "@opentelemetry/sdk-trace-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 989 + 990 + "@vercel/sandbox/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], 991 + 992 + "@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], 993 + 994 + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 995 + 996 + "pkgroll/esbuild": ["esbuild@0.26.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.26.0", "@esbuild/android-arm": "0.26.0", "@esbuild/android-arm64": "0.26.0", "@esbuild/android-x64": "0.26.0", "@esbuild/darwin-arm64": "0.26.0", "@esbuild/darwin-x64": "0.26.0", "@esbuild/freebsd-arm64": "0.26.0", "@esbuild/freebsd-x64": "0.26.0", "@esbuild/linux-arm": "0.26.0", "@esbuild/linux-arm64": "0.26.0", "@esbuild/linux-ia32": "0.26.0", "@esbuild/linux-loong64": "0.26.0", "@esbuild/linux-mips64el": "0.26.0", "@esbuild/linux-ppc64": "0.26.0", "@esbuild/linux-riscv64": "0.26.0", "@esbuild/linux-s390x": "0.26.0", "@esbuild/linux-x64": "0.26.0", "@esbuild/netbsd-arm64": "0.26.0", "@esbuild/netbsd-x64": "0.26.0", "@esbuild/openbsd-arm64": "0.26.0", "@esbuild/openbsd-x64": "0.26.0", "@esbuild/openharmony-arm64": "0.26.0", "@esbuild/sunos-x64": "0.26.0", "@esbuild/win32-arm64": "0.26.0", "@esbuild/win32-ia32": "0.26.0", "@esbuild/win32-x64": "0.26.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q=="], 997 + 998 + "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], 999 + 1000 + "tsx/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], 1001 + 1002 + "vite/esbuild": ["esbuild@0.26.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.26.0", "@esbuild/android-arm": "0.26.0", "@esbuild/android-arm64": "0.26.0", "@esbuild/android-x64": "0.26.0", "@esbuild/darwin-arm64": "0.26.0", "@esbuild/darwin-x64": "0.26.0", "@esbuild/freebsd-arm64": "0.26.0", "@esbuild/freebsd-x64": "0.26.0", "@esbuild/linux-arm": "0.26.0", "@esbuild/linux-arm64": "0.26.0", "@esbuild/linux-ia32": "0.26.0", "@esbuild/linux-loong64": "0.26.0", "@esbuild/linux-mips64el": "0.26.0", "@esbuild/linux-ppc64": "0.26.0", "@esbuild/linux-riscv64": "0.26.0", "@esbuild/linux-s390x": "0.26.0", "@esbuild/linux-x64": "0.26.0", "@esbuild/netbsd-arm64": "0.26.0", "@esbuild/netbsd-x64": "0.26.0", "@esbuild/openbsd-arm64": "0.26.0", "@esbuild/openbsd-x64": "0.26.0", "@esbuild/openharmony-arm64": "0.26.0", "@esbuild/sunos-x64": "0.26.0", "@esbuild/win32-arm64": "0.26.0", "@esbuild/win32-ia32": "0.26.0", "@esbuild/win32-x64": "0.26.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q=="], 1003 + 1004 + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1005 + 1006 + "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1007 + 1008 + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1009 + 1010 + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], 1011 + 1012 + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], 1013 + 1014 + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], 1015 + 1016 + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], 1017 + 1018 + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], 1019 + 1020 + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], 1021 + 1022 + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], 1023 + 1024 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], 1025 + 1026 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], 1027 + 1028 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], 1029 + 1030 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], 1031 + 1032 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], 1033 + 1034 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], 1035 + 1036 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], 1037 + 1038 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], 1039 + 1040 + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], 1041 + 1042 + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], 1043 + 1044 + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], 1045 + 1046 + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], 1047 + 1048 + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], 1049 + 1050 + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], 1051 + 1052 + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], 1053 + 1054 + "pkgroll/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.26.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA=="], 1055 + 1056 + "pkgroll/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.26.0", "", { "os": "android", "cpu": "arm" }, "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA=="], 1057 + 1058 + "pkgroll/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.26.0", "", { "os": "android", "cpu": "arm64" }, "sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ=="], 1059 + 1060 + "pkgroll/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.26.0", "", { "os": "android", "cpu": "x64" }, "sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A=="], 1061 + 1062 + "pkgroll/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.26.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ=="], 1063 + 1064 + "pkgroll/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.26.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw=="], 1065 + 1066 + "pkgroll/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.26.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ=="], 1067 + 1068 + "pkgroll/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.26.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA=="], 1069 + 1070 + "pkgroll/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.26.0", "", { "os": "linux", "cpu": "arm" }, "sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ=="], 1071 + 1072 + "pkgroll/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.26.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ=="], 1073 + 1074 + "pkgroll/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.26.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw=="], 1075 + 1076 + "pkgroll/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg=="], 1077 + 1078 + "pkgroll/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA=="], 1079 + 1080 + "pkgroll/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.26.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg=="], 1081 + 1082 + "pkgroll/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA=="], 1083 + 1084 + "pkgroll/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.26.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw=="], 1085 + 1086 + "pkgroll/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.26.0", "", { "os": "linux", "cpu": "x64" }, "sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA=="], 1087 + 1088 + "pkgroll/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.26.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw=="], 1089 + 1090 + "pkgroll/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.26.0", "", { "os": "none", "cpu": "x64" }, "sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA=="], 1091 + 1092 + "pkgroll/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.26.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw=="], 1093 + 1094 + "pkgroll/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.26.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg=="], 1095 + 1096 + "pkgroll/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.26.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw=="], 1097 + 1098 + "pkgroll/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.26.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw=="], 1099 + 1100 + "pkgroll/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.26.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA=="], 1101 + 1102 + "pkgroll/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.26.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw=="], 1103 + 1104 + "pkgroll/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.26.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A=="], 1105 + 1106 + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], 1107 + 1108 + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], 1109 + 1110 + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], 1111 + 1112 + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], 1113 + 1114 + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], 1115 + 1116 + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], 1117 + 1118 + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], 1119 + 1120 + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], 1121 + 1122 + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], 1123 + 1124 + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], 1125 + 1126 + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], 1127 + 1128 + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], 1129 + 1130 + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], 1131 + 1132 + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], 1133 + 1134 + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], 1135 + 1136 + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], 1137 + 1138 + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], 1139 + 1140 + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], 1141 + 1142 + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], 1143 + 1144 + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], 1145 + 1146 + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], 1147 + 1148 + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], 1149 + 1150 + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], 1151 + 1152 + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], 1153 + 1154 + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], 1155 + 1156 + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], 1157 + 1158 + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.26.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA=="], 1159 + 1160 + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.26.0", "", { "os": "android", "cpu": "arm" }, "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA=="], 1161 + 1162 + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.26.0", "", { "os": "android", "cpu": "arm64" }, "sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ=="], 1163 + 1164 + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.26.0", "", { "os": "android", "cpu": "x64" }, "sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A=="], 1165 + 1166 + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.26.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ=="], 1167 + 1168 + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.26.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw=="], 1169 + 1170 + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.26.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ=="], 1171 + 1172 + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.26.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA=="], 1173 + 1174 + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.26.0", "", { "os": "linux", "cpu": "arm" }, "sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ=="], 1175 + 1176 + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.26.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ=="], 1177 + 1178 + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.26.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw=="], 1179 + 1180 + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg=="], 1181 + 1182 + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA=="], 1183 + 1184 + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.26.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg=="], 1185 + 1186 + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.26.0", "", { "os": "linux", "cpu": "none" }, "sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA=="], 1187 + 1188 + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.26.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw=="], 1189 + 1190 + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.26.0", "", { "os": "linux", "cpu": "x64" }, "sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA=="], 1191 + 1192 + "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.26.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw=="], 1193 + 1194 + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.26.0", "", { "os": "none", "cpu": "x64" }, "sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA=="], 1195 + 1196 + "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.26.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw=="], 1197 + 1198 + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.26.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg=="], 1199 + 1200 + "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.26.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw=="], 1201 + 1202 + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.26.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw=="], 1203 + 1204 + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.26.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA=="], 1205 + 1206 + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.26.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw=="], 1207 + 1208 + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.26.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A=="], 1209 + 1210 + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1211 + 1212 + "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1213 + 1214 + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1215 + } 1216 + }
+3
apps/modal-sandbox/doppler.yaml
··· 1 + setup: 2 + - project: pocketenv 3 + config: prd
+9
apps/modal-sandbox/drizzle.config.ts
··· 1 + import { defineConfig } from "drizzle-kit"; 2 + 3 + export default defineConfig({ 4 + dialect: "postgresql", 5 + schema: "./src/schema", 6 + dbCredentials: { 7 + url: Deno.env.get("POSTGRES_URL")!, 8 + }, 9 + });
+38
apps/modal-sandbox/package.json
··· 1 + { 2 + "name": "modal-sandbox", 3 + "module": "dist/index.js", 4 + "type": "module", 5 + "scripts": { 6 + "dev": "tsx --watch src/index.ts", 7 + "start": "tsx src/index.ts", 8 + "start:prod": "node dist/index.js", 9 + "build": "pkgroll" 10 + }, 11 + "dependencies": { 12 + "@daytonaio/sdk": "^0.162.0", 13 + "@deno/sandbox": "^0.13.2", 14 + "@fly/sprites": "^0.0.1", 15 + "@std/yaml": "npm:@jsr/std__yaml", 16 + "@tsndr/cloudflare-worker-jwt": "^3.2.1", 17 + "@vercel/sandbox": "^1.9.3", 18 + "chalk": "^5.6.2", 19 + "consola": "^3.4.2", 20 + "drizzle-orm": "^0.45.2", 21 + "effect": "^3.21.0", 22 + "envalid": "^8.1.1", 23 + "hono": "^4.12.12", 24 + "libsodium-wrappers": "^0.8.2", 25 + "modal": "^0.7.4", 26 + "pg": "^8.20.0", 27 + "ramda": "^0.32.0", 28 + "unique-username-generator": "^1.5.1", 29 + "zod": "^4.3.6" 30 + }, 31 + "devDependencies": { 32 + "@types/node": "^25.5.2", 33 + "drizzle-kit": "^0.31.10", 34 + "pkgroll": "^2.27.0", 35 + "tsx": "^4.21.0", 36 + "vitest": "^4.1.4" 37 + } 38 + }
+90
apps/modal-sandbox/src/clean.ts
··· 1 + import { and, inArray, isNull, lt } from "drizzle-orm"; 2 + import { getConnection } from "./drizzle"; 3 + import sandboxes from "./schema/sandboxes"; 4 + import sandboxPorts from "./schema/sandbox-ports"; 5 + import { consola } from "consola"; 6 + import chalk from "chalk"; 7 + import { workers } from "./workers"; 8 + 9 + const db = getConnection(); 10 + const API_BASE = `http://localhost:${Deno.env.get("PORT") ?? 8788}`; 11 + const CONCURRENCY = 5; 12 + 13 + async function withConcurrency<T>( 14 + tasks: (() => Promise<T>)[], 15 + limit: number, 16 + ): Promise<PromiseSettledResult<T>[]> { 17 + const results: PromiseSettledResult<T>[] = []; 18 + for (let i = 0; i < tasks.length; i += limit) { 19 + const settled = await Promise.allSettled( 20 + tasks.slice(i, i + limit).map((t) => t()), 21 + ); 22 + results.push(...settled); 23 + } 24 + return results; 25 + } 26 + 27 + Deno.cron("clean-uninitialized-sandboxes", "*/5 * * * *", async () => { 28 + const cutoff = new Date(Date.now() - 24 * 60 * 60 * 1000); 29 + 30 + const stale = await db 31 + .select({ id: sandboxes.id }) 32 + .from(sandboxes) 33 + .where( 34 + and( 35 + isNull(sandboxes.uri), 36 + lt(sandboxes.createdAt, cutoff), 37 + isNull(sandboxes.userId), 38 + ), 39 + ) 40 + .execute(); 41 + 42 + if (stale.length === 0) return; 43 + 44 + await withConcurrency( 45 + stale.map( 46 + ({ id }) => 47 + () => 48 + fetch(`${API_BASE}/v1/sandboxes/${id}/stop`, { method: "POST" }), 49 + ), 50 + CONCURRENCY, 51 + ).catch(() => { 52 + consola.warn( 53 + "Failed to stop some uninitialized sandboxes. They may have already been stopped or deleted.", 54 + ); 55 + }); 56 + 57 + await withConcurrency( 58 + stale.flatMap(({ id }) => 59 + Object.values(workers).map( 60 + (worker) => () => 61 + fetch(`${worker}/v1/sandboxes/${id}/stop`, { 62 + method: "POST", 63 + headers: { "Content-Type": "application/json" }, 64 + }), 65 + ), 66 + ), 67 + CONCURRENCY, 68 + ).catch(() => { 69 + consola.warn( 70 + "Failed to stop some uninitialized sandboxes on workers. They may have already been stopped or deleted.", 71 + ); 72 + }); 73 + 74 + const staleIds = stale.map(({ id }) => id); 75 + 76 + await db 77 + .delete(sandboxPorts) 78 + .where(inArray(sandboxPorts.sandboxId, staleIds)) 79 + .execute(); 80 + 81 + const deleted = await db 82 + .delete(sandboxes) 83 + .where(and(isNull(sandboxes.uri), lt(sandboxes.createdAt, cutoff))) 84 + .returning({ id: sandboxes.id }) 85 + .execute(); 86 + 87 + consola.success( 88 + `Cleaned ${chalk.greenBright(deleted.length)} uninitialized sandbox(es)`, 89 + ); 90 + });
+6
apps/modal-sandbox/src/context.ts
··· 1 + import { getConnection } from "./drizzle"; 2 + 3 + export type Context = { 4 + db: ReturnType<typeof getConnection>; 5 + did?: string; 6 + };
+10
apps/modal-sandbox/src/drizzle.ts
··· 1 + import { drizzle } from "drizzle-orm/node-postgres"; 2 + import pg from "pg"; 3 + 4 + export function getConnection() { 5 + const pool = new pg.Pool({ 6 + connectionString: process.env.POSTGRES_URL, 7 + max: 20, 8 + }); 9 + return drizzle(pool); 10 + }
+21
apps/modal-sandbox/src/images.ts
··· 1 + export const images: Record<string, string> = { 2 + openclaw: "ghcr.io/pocketenv-io/modal-openclaw:0.1.0", 3 + amp: "ghcr.io/pocketenv-io/modal-amp:0.1.0", 4 + claude: "ghcr.io/pocketenv-io/modal-claude:0.1.0", 5 + codex: "ghcr.io/pocketenv-io/modal-codex:0.1.0", 6 + copilot: "ghcr.io/pocketenv-io/modal-copilot:0.1.0", 7 + crush: "ghcr.io/pocketenv-io/modal-crush:0.1.0", 8 + cursor: "ghcr.io/pocketenv-io/modal-cursor:0.1.0", 9 + gemini: "ghcr.io/pocketenv-io/modal-gemini:0.1.0", 10 + kilo: "ghcr.io/pocketenv-io/modal-kilo:0.1.0", 11 + kiro: "ghcr.io/pocketenv-io/modal-kiro:0.1.0", 12 + mise: "ghcr.io/pocketenv-io/modal-mise:0.1.0", 13 + nix: "ghcr.io/pocketenv-io/modal-nix:0.1.0", 14 + nullclaw: "ghcr.io/pocketenv-io/modal-nullclaw:0.1.0", 15 + opencode: "ghcr.io/pocketenv-io/modal-opencode:0.1.0", 16 + opencrust: "ghcr.io/pocketenv-io/modal-opencrust:0.1.0", 17 + picoclaw: "ghcr.io/pocketenv-io/modal-picoclaw:0.1.0", 18 + pkgx: "ghcr.io/pocketenv-io/modal-pkgx:0.1.0", 19 + wasmer: "ghcr.io/pocketenv-io/modal-wasmer:0.1.0", 20 + zeroclaw: "ghcr.io/pocketenv-io/modal-zeroclaw:0.1.0", 21 + };
+34
apps/modal-sandbox/src/index.ts
··· 1 + import { Hono } from "hono"; 2 + import type { Context } from "./context"; 3 + import { logger } from "hono/logger"; 4 + import { consola } from "consola"; 5 + import chalk from "chalk"; 6 + import { authMiddleware } from "./middleware/auth"; 7 + import { sandboxRouter } from "./routes/sandboxes"; 8 + 9 + export { getSandbox, saveSecrets, saveVariables } from "./lib/sandbox-db"; 10 + 11 + const app = new Hono<{ Variables: Context }>(); 12 + 13 + app.use("*", authMiddleware); 14 + app.use(logger()); 15 + 16 + app.get("/", (c) => { 17 + return c.text(` 18 + _____ ____ 19 + / ___/____ _____ ____/ / /_ ____ _ __ 20 + \\__ \\/ __ \`/ __ \\/ __ / __ \\/ __ \\| |/_/ 21 + ___/ / /_/ / / / / /_/ / /_/ / /_/ /> < 22 + /____/\\__,_/_/ /_/\\__,_/_.___/\\____/_/|_| 23 + 24 + `); 25 + }); 26 + 27 + app.route("/v1/sandboxes", sandboxRouter); 28 + 29 + const PORT = 8790; 30 + 31 + const url = chalk.greenBright(`http://localhost:${PORT}`); 32 + consola.info(`Starting server on ${url}`); 33 + 34 + app.listen(process.env.MODAL_SANDBOX_PORT || PORT);
+21
apps/modal-sandbox/src/lib/decrypt.ts
··· 1 + import sodium from "libsodium-wrappers"; 2 + import process from "node:process"; 3 + 4 + await sodium.ready; 5 + 6 + export default function decrypt(value?: string): string | undefined { 7 + if (!value) { 8 + return undefined; 9 + } 10 + 11 + const sealed = sodium.from_base64( 12 + value, 13 + sodium.base64_variants.URLSAFE_NO_PADDING, 14 + ); 15 + const decryptedBytes = sodium.crypto_box_seal_open( 16 + sealed, 17 + sodium.from_hex(process.env.PUBLIC_KEY!), 18 + sodium.from_hex(process.env.PRIVATE_KEY!), 19 + ); 20 + return sodium.to_string(decryptedBytes); 21 + }
+92
apps/modal-sandbox/src/lib/prepare-sandbox.ts
··· 1 + import { parse } from "@std/yaml"; 2 + import amp from "../presets/amp.yaml" with { type: "text" }; 3 + import claude from "../presets/claude.yaml" with { type: "text" }; 4 + import codex from "../presets/codex.yaml" with { type: "text" }; 5 + import copilot from "../presets/copilot.yaml" with { type: "text" }; 6 + import crush from "../presets/crush.yaml" with { type: "text" }; 7 + import cursor from "../presets/cursor.yaml" with { type: "text" }; 8 + import gemini from "../presets/gemini.yaml" with { type: "text" }; 9 + import kilo from "../presets/kilo.yaml" with { type: "text" }; 10 + import kiro from "../presets/kiro.yaml" with { type: "text" }; 11 + import mise from "../presets/mise.yaml" with { type: "text" }; 12 + import nix from "../presets/nix.yaml" with { type: "text" }; 13 + import nullclaw from "../presets/nullclaw.yaml" with { type: "text" }; 14 + import openclaw from "../presets/openclaw.yaml" with { type: "text" }; 15 + import opencode from "../presets/opencode.yaml" with { type: "text" }; 16 + import opencrust from "../presets/opencrust.yaml" with { type: "text" }; 17 + import picoclaw from "../presets/picoclaw.yaml" with { type: "text" }; 18 + import pkgx from "../presets/pkgx.yaml" with { type: "text" }; 19 + import wasmer from "../presets/wasmer.yaml" with { type: "text" }; 20 + import zeroclaw from "../presets/zeroclaw.yaml" with { type: "text" }; 21 + import chalk from "chalk"; 22 + import { BaseSandbox } from "../providers"; 23 + import { type Preset, PresetSchema } from "../types/preset"; 24 + import { consola } from "consola"; 25 + 26 + const presets: Record<string, string> = { 27 + amp, 28 + claude, 29 + codex, 30 + copilot, 31 + crush, 32 + cursor, 33 + gemini, 34 + kilo, 35 + kiro, 36 + mise, 37 + nix, 38 + nullclaw, 39 + openclaw, 40 + opencode, 41 + opencrust, 42 + picoclaw, 43 + pkgx, 44 + wasmer, 45 + zeroclaw, 46 + }; 47 + 48 + async function prepareSandbox(sandbox: BaseSandbox, base: string) { 49 + if (!presets[base]) { 50 + console.warn( 51 + chalk.yellow( 52 + `No preset found for base "${base}". Skipping sandbox preparation.`, 53 + ), 54 + ); 55 + return; 56 + } 57 + 58 + const preset = parse(presets[base]) as Preset; 59 + PresetSchema.parse(preset); // Validate preset structure 60 + 61 + for (const item of preset) { 62 + console.info(`${chalk.rgb(0, 232, 198)(item.name)}`); 63 + 64 + if (item.if) { 65 + try { 66 + const { exitCode } = await sandbox.sh`${item.if}`; 67 + if (exitCode !== 0) { 68 + console.info( 69 + chalk.yellow( 70 + `Condition "${chalk.rgb(100, 232, 130)(item.if)}" met. Skipping commands for "${chalk.rgb(100, 232, 130)(item.name)}".`, 71 + ), 72 + ); 73 + continue; 74 + } 75 + } catch { 76 + // If the command fails, we assume the condition is not met and proceed with the commands. 77 + } 78 + } 79 + 80 + for (const line of item.run.trim().split("\n")) { 81 + console.log(`${chalk.rgb(100, 232, 130)("exec")} ${line}`); 82 + const result = await sandbox.sh`${line}`; 83 + if (result.exitCode !== 0) { 84 + consola.warn( 85 + `Command "${chalk.rgb(100, 232, 130)(line)}" failed with exit code ${result.exitCode} ${result.stderr} ${result.stdout}.`, 86 + ); 87 + } 88 + } 89 + } 90 + } 91 + 92 + export default prepareSandbox;
+73
apps/modal-sandbox/src/lib/sandbox-db.ts
··· 1 + import type { Context } from "../context"; 2 + import { eq, or } from "drizzle-orm"; 3 + import { 4 + sandboxes, 5 + sandboxSecrets, 6 + sandboxVariables, 7 + secrets, 8 + variables, 9 + } from "../schema"; 10 + import type { SelectSandbox } from "../schema/sandboxes"; 11 + import type { PgTransaction } from "drizzle-orm/pg-core"; 12 + import type { NodePgQueryResultHKT } from "drizzle-orm/node-postgres"; 13 + import type { ExtractTablesWithRelations } from "drizzle-orm"; 14 + 15 + type Tx = PgTransaction< 16 + NodePgQueryResultHKT, 17 + Record<string, never>, 18 + ExtractTablesWithRelations<Record<string, never>> 19 + >; 20 + 21 + export const getSandbox = async (db: Context["db"], sandboxId: string) => { 22 + const [record] = await db 23 + .select() 24 + .from(sandboxes) 25 + .where(or(eq(sandboxes.id, sandboxId), eq(sandboxes.sandboxId, sandboxId))) 26 + .execute(); 27 + return record; 28 + }; 29 + 30 + export const saveSecrets = async ( 31 + tx: Tx, 32 + sandbox: SelectSandbox, 33 + values: { secrets: { name: string; value: string }[] }, 34 + ) => { 35 + const insertedSecrets = await tx 36 + .insert(secrets) 37 + .values(values.secrets) 38 + .returning() 39 + .execute(); 40 + 41 + await tx 42 + .insert(sandboxSecrets) 43 + .values( 44 + insertedSecrets.map((secret) => ({ 45 + sandboxId: sandbox.id, 46 + secretId: secret.id, 47 + })), 48 + ) 49 + .execute(); 50 + }; 51 + 52 + export const saveVariables = async ( 53 + tx: Tx, 54 + sandbox: SelectSandbox, 55 + values: { variables: { name: string; value: string }[] }, 56 + ) => { 57 + const insertedVariables = await tx 58 + .insert(variables) 59 + .values(values.variables) 60 + .returning() 61 + .execute(); 62 + 63 + await tx 64 + .insert(sandboxVariables) 65 + .values( 66 + insertedVariables.map((variable) => ({ 67 + sandboxId: sandbox.id, 68 + variableId: variable.id, 69 + name: variable.name, 70 + })), 71 + ) 72 + .execute(); 73 + };
+121
apps/modal-sandbox/src/lib/sandbox-helpers.ts
··· 1 + import { eq } from "drizzle-orm"; 2 + import type { Context } from "../context"; 3 + import { 4 + sandboxes, 5 + spriteAuth, 6 + daytonaAuth, 7 + denoAuth, 8 + vercelAuth, 9 + modalAuth, 10 + } from "../schema"; 11 + import { 12 + BaseSandbox, 13 + createSandbox, 14 + getSandboxById, 15 + type Provider, 16 + type SandboxOptions, 17 + } from "../providers"; 18 + import type { SelectSandbox } from "../schema/sandboxes"; 19 + import decrypt from "./decrypt"; 20 + 21 + export interface AuthParams { 22 + spriteAuthParams?: { spriteToken?: string } | null; 23 + daytonaAuthParams?: { apiKey?: string; organizationId?: string } | null; 24 + denoAuthParams?: { deployToken?: string } | null; 25 + vercelAuthParams?: { 26 + vercelToken?: string; 27 + projectId?: string; 28 + teamId?: string; 29 + } | null; 30 + modalAuthParams?: { 31 + tokenId?: string; 32 + tokenSecret?: string; 33 + } | null; 34 + } 35 + 36 + export async function getAuthParams( 37 + db: Context["db"], 38 + sandboxDbId: string, 39 + ): Promise<AuthParams> { 40 + const [ 41 + [spriteAuthParams], 42 + [daytonaAuthParams], 43 + [denoAuthParams], 44 + [vercelAuthParams], 45 + [modalAuthParams], 46 + ] = await Promise.all([ 47 + db 48 + .select() 49 + .from(spriteAuth) 50 + .where(eq(spriteAuth.sandboxId, sandboxDbId)) 51 + .execute(), 52 + db 53 + .select() 54 + .from(daytonaAuth) 55 + .where(eq(daytonaAuth.sandboxId, sandboxDbId)) 56 + .execute(), 57 + db 58 + .select() 59 + .from(denoAuth) 60 + .where(eq(denoAuth.sandboxId, sandboxDbId)) 61 + .execute(), 62 + db 63 + .select() 64 + .from(vercelAuth) 65 + .where(eq(vercelAuth.sandboxId, sandboxDbId)) 66 + .execute(), 67 + db 68 + .select() 69 + .from(modalAuth) 70 + .where(eq(modalAuth.sandboxId, sandboxDbId)) 71 + .execute(), 72 + ]); 73 + return { 74 + spriteAuthParams, 75 + daytonaAuthParams, 76 + denoAuthParams, 77 + vercelAuthParams, 78 + modalAuthParams, 79 + }; 80 + } 81 + 82 + export function buildCredentials(auth: AuthParams): SandboxOptions { 83 + return { 84 + daytonaApiKey: decrypt(auth.daytonaAuthParams?.apiKey), 85 + organizationId: auth.daytonaAuthParams?.organizationId, 86 + spriteToken: decrypt(auth.spriteAuthParams?.spriteToken), 87 + denoDeployToken: decrypt(auth.denoAuthParams?.deployToken), 88 + vercelApiToken: decrypt(auth.vercelAuthParams?.vercelToken), 89 + vercelProjectId: auth.vercelAuthParams?.projectId, 90 + vercelTeamId: auth.vercelAuthParams?.teamId, 91 + modalTokenId: decrypt(auth.modalAuthParams?.tokenId), 92 + modalTokenSecret: decrypt(auth.modalAuthParams?.tokenSecret), 93 + }; 94 + } 95 + 96 + export async function resolveSandboxInstance( 97 + db: Context["db"], 98 + record: SelectSandbox, 99 + credentials: SandboxOptions, 100 + ): Promise<BaseSandbox> { 101 + if (!record.sandboxId) { 102 + const sandbox = await createSandbox(record.provider as Provider, { 103 + id: record.id, 104 + modalAppName: record.name, 105 + ...credentials, 106 + }); 107 + const sandboxId = await sandbox.id(); 108 + await db 109 + .update(sandboxes) 110 + .set({ sandboxId }) 111 + .where(eq(sandboxes.id, record.id)) 112 + .execute(); 113 + record.sandboxId = sandboxId; 114 + } 115 + 116 + return getSandboxById( 117 + record.provider as Provider, 118 + record.sandboxId!, 119 + credentials, 120 + ); 121 + }
+30
apps/modal-sandbox/src/middleware/auth.ts
··· 1 + import type { Context } from "../context"; 2 + import { consola } from "consola"; 3 + import type { MiddlewareHandler } from "hono"; 4 + import { getConnection } from "../drizzle"; 5 + import jwt from "@tsndr/cloudflare-worker-jwt"; 6 + import process from "node:process"; 7 + 8 + export const authMiddleware: MiddlewareHandler<{ Variables: Context }> = async ( 9 + c, 10 + next, 11 + ) => { 12 + c.set("db", getConnection()); 13 + const token = c.req.header("Authorization")?.split(" ")[1]?.trim(); 14 + if (token) { 15 + try { 16 + const decoded = await jwt.verify(token, process.env.JWT_SECRET!); 17 + c.set("did", decoded?.payload.sub); 18 + } catch (err) { 19 + consola.error("JWT verification failed:", err); 20 + return c.json({ error: "Unauthorized" }, 401); 21 + } 22 + } else { 23 + if (c.req.path === "/") { 24 + await next(); 25 + return; 26 + } 27 + return c.json({ error: "Unauthorized" }, 401); 28 + } 29 + await next(); 30 + };
+50
apps/modal-sandbox/src/presets/amp.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install AMP and Tailscale 6 + if: "[ ! -f $HOME/.amp-setup-done ] || ! command -v amp &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @sourcegraph/amp pm2 11 + touch $HOME/.amp-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+50
apps/modal-sandbox/src/presets/claude.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Claude and Tailscale 6 + if: "[ ! -f $HOME/.claude-setup-done ]" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @anthropic-ai/claude-code pm2 11 + touch $HOME/.claude-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+50
apps/modal-sandbox/src/presets/codex.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Codex and Tailscale 6 + if: "[ ! -f $HOME/.codex-setup-done ]" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @openai/codex pm2 11 + touch $HOME/.codex-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+49
apps/modal-sandbox/src/presets/copilot.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Copilot and Tailscale 6 + if: "[ ! -f $HOME/.copilot-setup-done ]" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @github/copilot pm2 11 + touch $HOME/.copilot-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + 36 + - name: Setup Zerobrew 37 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 38 + run: | 39 + curl -fsSL https://zerobrew.rs/install | bash 40 + touch $HOME/.zerobrew-setup-done 41 + 42 + - name: Setup tigrisfs 43 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 44 + run: | 45 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 46 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 47 + rm /tmp/tigrisfs.tar.gz 48 + chmod +x $HOME/.local/bin/tigrisfs 49 + touch $HOME/.tigrisfs-setup-done
+50
apps/modal-sandbox/src/presets/crush.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Crush and Tailscale 6 + if: "[ ! -f $HOME/.crush-setup-done ] || ! command -v crush >/dev/null 2>&1" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @charmland/crush pm2 11 + touch $HOME/.crush-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server >/dev/null 2>&1" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide >/dev/null 2>&1" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb >/dev/null 2>&1" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/cursor.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Cursor and Tailscale 6 + if: "[ ! -f $HOME/.cursor-setup-done ] || ! command -v cursor &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + curl https://cursor.com/install -fsS | bash 12 + touch $HOME/.cursor-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+50
apps/modal-sandbox/src/presets/gemini.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Gemini and Tailscale 6 + if: "[ ! -f $HOME/.gemini-setup-done ]" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @google/gemini-cli pm2 11 + touch $HOME/.gemini-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+50
apps/modal-sandbox/src/presets/kilo.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Kilo and Tailscale 6 + if: "[ ! -f $HOME/.kilo-setup-done ] || ! command -v kilo &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g @kilocode/cli pm2 11 + touch $HOME/.kilo-setup-done 12 + 13 + - name: Install code-server and Cascadia Mono Nerd Font 14 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 15 + run: | 16 + mkdir -p $HOME/.local/share/fonts 17 + curl -fsSL https://code-server.dev/install.sh | sh 18 + code-server --install-extension bastndev.lynx-theme --force 19 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 20 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 21 + fc-cache -fv 22 + rm /tmp/CascadiaMono.zip 23 + touch $HOME/.vscode-setup-done 24 + 25 + - name: Setup Zoxide 26 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 27 + run: | 28 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 29 + mkdir -p ~/.local/bin 30 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 31 + chmod +x ~/.local/bin/zoxide 32 + rm /tmp/zoxide.tar.gz 33 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 34 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 35 + touch $HOME/.zoxide-setup-done 36 + 37 + - name: Setup Zerobrew 38 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 39 + run: | 40 + curl -fsSL https://zerobrew.rs/install | bash 41 + touch $HOME/.zerobrew-setup-done 42 + 43 + - name: Setup tigrisfs 44 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 45 + run: | 46 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 47 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 48 + rm /tmp/tigrisfs.tar.gz 49 + chmod +x $HOME/.local/bin/tigrisfs 50 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/kiro.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Kiro and Tailscale 6 + if: "[ ! -f $HOME/.kiro-setup-done ]" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + curl -fsSL https://cli.kiro.dev/install | bash 12 + touch $HOME/.kiro-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/mise.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Mise and Tailscale 6 + if: "[ ! -f $HOME/.mise-setup-done ] || ! command -v mise &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + curl https://mise.run | sh 12 + touch $HOME/.mise-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/nix.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Nix and Tailscale 6 + if: "[ ! -f $HOME/.mise-setup-done ] || ! command -v nix &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --extra-conf "sandbox = false" --init none --no-confirm 12 + touch $HOME/.nix-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+54
apps/modal-sandbox/src/presets/nullclaw.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install NullClaw and Tailscale 6 + if: "[ ! -f $HOME/.nullclaw-setup-done ] || ! command -v nullclaw &>/dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + wget -qO nullclaw "https://github.com/nullclaw/nullclaw/releases/latest/download/nullclaw-linux-x86_64.bin" 12 + mkdir -p $HOME/.local/bin 13 + mv nullclaw $HOME/.local/bin 14 + chmod +x $HOME/.local/bin/nullclaw 15 + touch $HOME/.nullclaw-setup-done 16 + 17 + - name: Install code-server and Cascadia Mono Nerd Font 18 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &>/dev/null" 19 + run: | 20 + mkdir -p $HOME/.local/share/fonts 21 + curl -fsSL https://code-server.dev/install.sh | sh 22 + code-server --install-extension bastndev.lynx-theme --force 23 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 24 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 25 + fc-cache -fv 26 + rm /tmp/CascadiaMono.zip 27 + touch $HOME/.vscode-setup-done 28 + 29 + - name: Setup Zoxide 30 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &>/dev/null" 31 + run: | 32 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 33 + mkdir -p ~/.local/bin 34 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 35 + chmod +x ~/.local/bin/zoxide 36 + rm /tmp/zoxide.tar.gz 37 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 38 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 39 + touch $HOME/.zoxide-setup-done 40 + 41 + - name: Setup Zerobrew 42 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &>/dev/null" 43 + run: | 44 + curl -fsSL https://zerobrew.rs/install | bash 45 + touch $HOME/.zerobrew-setup-done 46 + 47 + - name: Setup tigrisfs 48 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 49 + run: | 50 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 51 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 52 + rm /tmp/tigrisfs.tar.gz 53 + chmod +x $HOME/.local/bin/tigrisfs 54 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/openclaw.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install OpenClaw and Tailscale 6 + if: "[ ! -f $HOME/.openclaw-setup-done ] || ! command -v openclaw &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + curl -fsSL https://openclaw.ai/install.sh | bash || true 11 + npm install -g @chrysb/alphaclaw pm2 12 + touch $HOME/.openclaw-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/opencode.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install OpenCode and Tailscale 6 + if: "[ ! -f $HOME/.opencode-setup-done ] || ! command -v opencode &>/dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailescale || curl -fsSL https://tailscale.com/install.sh | sh 10 + curl -fsSL https://openclaw.ai/install.sh | bash || true 11 + npm install -g opencode-ai pm2 12 + touch $HOME/.opencode-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &>/dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &>/dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &>/dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+54
apps/modal-sandbox/src/presets/opencrust.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Opencrust and Tailscale 6 + if: "[ ! -f $HOME/.opencrust-setup-done ] || ! command -v opencrust &>/dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + OPENCRUST_VERISON=v0.1.21 OPENCRUST_ARCH=x86_64 wget -qO opencrust "https://github.com/opencrust-org/opencrust/releases/download/${OPENCRUST_VERSION}/opencrust-linux-${OPENCRUST_ARCH}" 12 + mkdir -p $HOME/.local/bin 13 + mv opencrust $HOME/.local/bin 14 + chmod +x $HOME/.local/bin/opencrust 15 + touch $HOME/.opencrust-setup-done 16 + 17 + - name: Install code-server and Cascadia Mono Nerd Font 18 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &>/dev/null" 19 + run: | 20 + mkdir -p $HOME/.local/share/fonts 21 + curl -fsSL https://code-server.dev/install.sh | sh 22 + code-server --install-extension bastndev.lynx-theme --force 23 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 24 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 25 + fc-cache -fv 26 + rm /tmp/CascadiaMono.zip 27 + touch $HOME/.vscode-setup-done 28 + 29 + - name: Setup Zoxide 30 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &>/dev/null" 31 + run: | 32 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 33 + mkdir -p ~/.local/bin 34 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 35 + chmod +x ~/.local/bin/zoxide 36 + rm /tmp/zoxide.tar.gz 37 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 38 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 39 + touch $HOME/.zoxide-setup-done 40 + 41 + - name: Setup Zerobrew 42 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &>/dev/null" 43 + run: | 44 + curl -fsSL https://zerobrew.rs/install | bash 45 + touch $HOME/.zerobrew-setup-done 46 + 47 + - name: Setup tigrisfs 48 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 49 + run: | 50 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 51 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 52 + rm /tmp/tigrisfs.tar.gz 53 + chmod +x $HOME/.local/bin/tigrisfs 54 + touch $HOME/.tigrisfs-setup-done
+54
apps/modal-sandbox/src/presets/picoclaw.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install PicoClaw and Tailscale 6 + if: "[ ! -f $HOME/.picoclaw-setup-done ] || ! command -v picoclaw &>/dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + PICOCLAW_VERSION=v0.2.2 PICOCLAW_ARCH=x86_64 wget -qO /tmp/picoclaw.tar.gz "https://github.com/sipeed/picoclaw/releases/download/${PICOCLAW_VERSION}/picoclaw_Linux_${PICOCLAW_ARCH}.tar.gz" 12 + mkdir -p $HOME/.local/bin 13 + tar -xzf /tmp/picoclaw.tar.gz -C $HOME/.local/bin 14 + chmod +x $HOME/.local/bin/picoclaw 15 + touch $HOME/.picoclaw-setup-done 16 + 17 + - name: Install code-server and Cascadia Mono Nerd Font 18 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &>/dev/null" 19 + run: | 20 + mkdir -p $HOME/.local/share/fonts 21 + curl -fsSL https://code-server.dev/install.sh | sh 22 + code-server --install-extension bastndev.lynx-theme --force 23 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 24 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 25 + fc-cache -fv 26 + rm /tmp/CascadiaMono.zip 27 + touch $HOME/.vscode-setup-done 28 + 29 + - name: Setup Zoxide 30 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &>/dev/null" 31 + run: | 32 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 33 + mkdir -p ~/.local/bin 34 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 35 + chmod +x ~/.local/bin/zoxide 36 + rm /tmp/zoxide.tar.gz 37 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 38 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 39 + touch $HOME/.zoxide-setup-done 40 + 41 + - name: Setup Zerobrew 42 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &>/dev/null" 43 + run: | 44 + curl -fsSL https://zerobrew.rs/install | bash 45 + touch $HOME/.zerobrew-setup-done 46 + 47 + - name: Setup tigrisfs 48 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 49 + run: | 50 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 51 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 52 + rm /tmp/tigrisfs.tar.gz 53 + chmod +x $HOME/.local/bin/tigrisfs 54 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/pkgx.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Pkgx and Tailscale 6 + if: "[ ! -f $HOME/.pkgx-setup-done ] || ! command -v pkgx &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + command -v tailscale || curl -fsSL https://tailscale.com/install.sh | sh 10 + curl -fsSL https://openclaw.ai/install.sh | bash || true 11 + npm install -g pm2 12 + curl https://pkgx.sh | sh 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+51
apps/modal-sandbox/src/presets/wasmer.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install Wasmer and Tailscale 6 + if: "[ ! -f $HOME/.wasmer-setup-done ] || ! command -v wasmer &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + curl -fsSL https://tailscale.com/install.sh | sh 10 + npm install -g pm2 11 + curl https://get.wasmer.io -sSfL | sh 12 + touch $HOME/.wasmer-setup-done 13 + 14 + - name: Install code-server and Cascadia Mono Nerd Font 15 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 16 + run: | 17 + mkdir -p $HOME/.local/share/fonts 18 + curl -fsSL https://code-server.dev/install.sh | sh 19 + code-server --install-extension bastndev.lynx-theme --force 20 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 21 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 22 + fc-cache -fv 23 + rm /tmp/CascadiaMono.zip 24 + touch $HOME/.vscode-setup-done 25 + 26 + - name: Setup Zoxide 27 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 28 + run: | 29 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 30 + mkdir -p ~/.local/bin 31 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 32 + chmod +x ~/.local/bin/zoxide 33 + rm /tmp/zoxide.tar.gz 34 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 35 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 36 + touch $HOME/.zoxide-setup-done 37 + 38 + - name: Setup Zerobrew 39 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 40 + run: | 41 + curl -fsSL https://zerobrew.rs/install | bash 42 + touch $HOME/.zerobrew-setup-done 43 + 44 + - name: Setup tigrisfs 45 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 46 + run: | 47 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 48 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 49 + rm /tmp/tigrisfs.tar.gz 50 + chmod +x $HOME/.local/bin/tigrisfs 51 + touch $HOME/.tigrisfs-setup-done
+54
apps/modal-sandbox/src/presets/zeroclaw.yaml
··· 1 + - name: Install Dependencies 2 + run: | 3 + sudo apt-get update && sudo apt-get install -y curl unzip wget fontconfig || apt-get update && apt-get install -y curl unzip wget fontconfig 4 + 5 + - name: Install ZeroClaw and Tailscale 6 + if: "[ ! -f $HOME/.zeroclaw-setup-done ] || ! command -v zeroclaw &> /dev/null" 7 + run: | 8 + mkdir -p $HOME/.npm-global && npm config set prefix $HOME/.npm-global 9 + curl -fsSL https://tailscale.com/install.sh | sh 10 + curl -fsSL https://openclaw.ai/install.sh | bash || true 11 + npm install -g pm2 12 + ZEROCLAW_VERSION=v0.1.7 ZEROCLAW_ARCH=x86_64 wget -qO /tmp/zeroclaw.tar.gz "https://github.com/zeroclaw-labs/zeroclaw/releases/download/${ZEROCLAW_VERSION}/zeroclaw-${ZEROCLAW_ARCH}-unknown-linux-gnu.tar.gz" 13 + mkdir -p $HOME/.local/bin 14 + tar -xzf /tmp/zeroclaw.tar.gz -C $HOME/.local/bin 15 + chmod +x $HOME/.local/bin/zeroclaw 16 + 17 + - name: Install code-server and Cascadia Mono Nerd Font 18 + if: "[ ! -f $HOME/.vscode-setup-done ] || ! command -v code-server &> /dev/null" 19 + run: | 20 + mkdir -p $HOME/.local/share/fonts 21 + curl -fsSL https://code-server.dev/install.sh | sh 22 + code-server --install-extension bastndev.lynx-theme --force 23 + curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip 24 + unzip -o /tmp/CascadiaMono.zip -d $HOME/.local/share/fonts/CascadiaMono 25 + fc-cache -fv 26 + rm /tmp/CascadiaMono.zip 27 + touch $HOME/.vscode-setup-done 28 + 29 + - name: Setup Zoxide 30 + if: "[ ! -f $HOME/.zoxide-setup-done ] || ! command -v zoxide &> /dev/null" 31 + run: | 32 + curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz 33 + mkdir -p ~/.local/bin 34 + tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide 35 + chmod +x ~/.local/bin/zoxide 36 + rm /tmp/zoxide.tar.gz 37 + echo 'export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc 38 + echo 'eval "$(zoxide init bash)"' >> ~/.bashrc 39 + touch $HOME/.zoxide-setup-done 40 + 41 + - name: Setup Zerobrew 42 + if: "[ ! -f $HOME/.zerobrew-setup-done ] || ! command -v zb &> /dev/null" 43 + run: | 44 + curl -fsSL https://zerobrew.rs/install | bash 45 + touch $HOME/.zerobrew-setup-done 46 + 47 + - name: Setup tigrisfs 48 + if: "[ ! -f $HOME/.tigrisfs-setup-done ] || ! command -v tigrisfs &> /dev/null" 49 + run: | 50 + ARCH=amd64 VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz 51 + tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin/ 52 + rm /tmp/tigrisfs.tar.gz 53 + chmod +x $HOME/.local/bin/tigrisfs 54 + touch $HOME/.tigrisfs-setup-done
+175
apps/modal-sandbox/src/providers/daytona/index.ts
··· 1 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 2 + import { Daytona } from "@daytonaio/sdk"; 3 + import type { Sandbox } from "@daytonaio/sdk"; 4 + import process, { env } from "node:process"; 5 + import { consola } from "consola"; 6 + import path from "node:path"; 7 + 8 + export class DaytonaSandbox implements BaseSandbox { 9 + constructor(private sandbox: Sandbox) {} 10 + 11 + async start(): Promise<void> { 12 + await this.sandbox.start(); 13 + } 14 + 15 + async stop(): Promise<void> { 16 + try { 17 + consola.info("Stopping Daytona sandbox with ID:", await this.id()); 18 + await this.sandbox.stop(); 19 + } catch (error) { 20 + consola.error("Error stopping Daytona sandbox:", error); 21 + } 22 + } 23 + 24 + async delete(): Promise<void> { 25 + await this.sandbox.delete(); 26 + } 27 + 28 + // deno-lint-ignore no-explicit-any 29 + async sh( 30 + strings: TemplateStringsArray, 31 + ...values: any[] 32 + ): Promise<{ 33 + stdout?: string | Buffer<ArrayBufferLike>; 34 + stderr?: string | Buffer<ArrayBufferLike>; 35 + exitCode: number; 36 + }> { 37 + const command = strings.reduce((acc, str, i) => { 38 + return acc + str + (values[i] || ""); 39 + }, ""); 40 + const result = await this.sandbox.process.executeCommand(command); 41 + return { 42 + stdout: result.result, 43 + exitCode: result.exitCode, 44 + }; 45 + } 46 + 47 + id(): Promise<string | null> { 48 + return Promise.resolve(this.sandbox.id); 49 + } 50 + 51 + async ssh(): Promise<{ 52 + username: string; 53 + hostname: string; 54 + }> { 55 + const sshAccess = await this.sandbox.createSshAccess(); 56 + return { 57 + username: sshAccess.token, 58 + hostname: "ssh.app.daytona.io", 59 + }; 60 + } 61 + 62 + async mkdir(dir: string): Promise<void> { 63 + await this.sh`mkdir -p ${dir}`; 64 + } 65 + 66 + async writeFile(absolutePath: string, content: string): Promise<void> { 67 + const basePath = path.dirname(absolutePath); 68 + if (basePath !== "/" && basePath != ".") { 69 + await this.mkdir(basePath); 70 + } 71 + await this.sh`echo '${content}' > ${absolutePath}`; 72 + } 73 + 74 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 75 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 76 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 77 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 78 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 79 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 80 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 81 + } 82 + 83 + async setupDefaultSshKeys(): Promise<void> { 84 + await this 85 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 86 + } 87 + 88 + async setupTailscale(authKey: string): Promise<void> { 89 + await this 90 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 91 + await this.sh`pm2 start tailscaled || true`; 92 + await this.sh`tailscale up --auth-key=${authKey} || true`; 93 + } 94 + 95 + clone(repoUrl: string): Promise<any> { 96 + const dir = repoUrl.split("/").pop()?.replace(".git", ""); 97 + return this.sh`git clone ${repoUrl} || git -C ${dir} pull`; 98 + } 99 + 100 + async mount(path: string, prefix?: string): Promise<void> { 101 + const VERSION = "v1.2.1"; 102 + const ARCH = "amd64"; 103 + await this.sh`mkdir -p $HOME/.local/bin`; 104 + await this 105 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 106 + await this 107 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin`; 108 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 109 + await this.sh`command -v tigrisfs || chmod +x $HOME/.local/bin/tigrisfs`; 110 + await this 111 + .sh`cp $HOME/.local/bin/tigrisfs /usr/bin || sudo cp $HOME/.local/bin/tigrisfs /usr/bin || true`; 112 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 113 + 114 + await this.mkdir(path); 115 + 116 + const bucketPath = prefix 117 + ? `${env.VOLUME_BUCKET}:${prefix}` 118 + : env.VOLUME_BUCKET; 119 + 120 + await this.sandbox.process.executeCommand( 121 + `nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || sudo nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || true`, 122 + undefined, 123 + { 124 + AWS_ACCESS_KEY_ID: env.R2_ACCESS_KEY_ID!, 125 + AWS_SECRET_ACCESS_KEY: env.R2_SECRET_ACCESS_KEY!, 126 + }, 127 + ); 128 + } 129 + 130 + async unmount(path: string): Promise<void> { 131 + await this 132 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 133 + } 134 + } 135 + 136 + class DaytonaProvider implements BaseProvider { 137 + async create(options: SandboxOptions): Promise<BaseSandbox> { 138 + if (!options.organizationId) { 139 + throw new Error("Organisation ID is required for Daytona provider"); 140 + } 141 + const daytona = new Daytona({ 142 + organizationId: options.organizationId, 143 + apiKey: options.daytonaApiKey, 144 + apiUrl: process.env.DAYTONA_API_URL, 145 + _experimental: {}, 146 + }); 147 + 148 + const sandbox = await daytona.create({ 149 + language: "typescript", 150 + // snapshot: process.env.DAYTONA_SNAPSHOT, 151 + snapshot: "daytona-medium", 152 + envVars: options.envVars, 153 + }); 154 + 155 + return new DaytonaSandbox(sandbox); 156 + } 157 + 158 + async get( 159 + id: string, 160 + apiKey?: string, 161 + organizationId?: string, 162 + ): Promise<BaseSandbox> { 163 + const daytona = new Daytona({ 164 + apiKey, 165 + apiUrl: process.env.DAYTONA_API_URL, 166 + organizationId, 167 + _experimental: {}, 168 + }); 169 + 170 + const sandbox = await daytona.get(id); 171 + return new DaytonaSandbox(sandbox); 172 + } 173 + } 174 + 175 + export default DaytonaProvider;
+170
apps/modal-sandbox/src/providers/deno/index.ts
··· 1 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 2 + import { Sandbox } from "@deno/sandbox"; 3 + import { env } from "node:process"; 4 + import { consola } from "consola"; 5 + import path from "node:path"; 6 + 7 + export class DenoSandbox implements BaseSandbox { 8 + constructor(private sandbox: Sandbox) {} 9 + 10 + async start(): Promise<void> { 11 + // Deno's sandbox starts immediately upon creation, so we can just return here. 12 + } 13 + 14 + async stop(): Promise<void> { 15 + try { 16 + consola.info("Stopping Deno sandbox with ID:", await this.id()); 17 + await this.sandbox.close(); 18 + await this.sandbox.kill(); 19 + } catch (error) { 20 + consola.error("Error killing sandbox:", error); 21 + } 22 + } 23 + 24 + async delete(): Promise<void> { 25 + await this.sandbox.close(); 26 + await this.sandbox.kill(); 27 + } 28 + 29 + async sh( 30 + strings: TemplateStringsArray, 31 + ...values: any[] 32 + ): Promise<{ 33 + stdout?: string | Buffer<ArrayBufferLike>; 34 + stderr?: string | Buffer<ArrayBufferLike>; 35 + exitCode: number; 36 + }> { 37 + const command = strings.reduce((acc, str, i) => { 38 + return acc + str + (values[i] || ""); 39 + }, ""); 40 + const result = await this.sandbox.spawn("sh", { 41 + args: ["-c", command], 42 + stdin: "null", 43 + stdout: "piped", 44 + stderr: "piped", 45 + }); 46 + const output = await result.output(); 47 + const decoder = new TextDecoder(); 48 + return { 49 + stdout: decoder.decode(output.stdout || new Uint8Array()), 50 + stderr: decoder.decode(output.stderr || new Uint8Array()), 51 + exitCode: (await result.status).code, 52 + }; 53 + } 54 + 55 + id(): Promise<string | null> { 56 + return Promise.resolve(this.sandbox.id); 57 + } 58 + 59 + async ssh(): Promise<{ 60 + username: string; 61 + hostname: string; 62 + }> { 63 + const HOME = await this.sandbox.env.get("HOME"); 64 + const PATH = await this.sandbox.env.get("PATH"); 65 + await this.sandbox.env.set( 66 + "PATH", 67 + `${HOME}/.npm-global/bin:/usr/bin:${PATH}`, 68 + ); 69 + return this.sandbox.exposeSsh(); 70 + } 71 + 72 + async mkdir(dir: string): Promise<void> { 73 + await this.sh`mkdir -p ${dir}`; 74 + } 75 + 76 + async writeFile(absolutePath: string, content: string): Promise<void> { 77 + const basePath = path.dirname(absolutePath); 78 + if (basePath !== "/" && basePath != ".") { 79 + await this.mkdir(basePath); 80 + } 81 + await this.sh`echo '${content}' > ${absolutePath}`; 82 + } 83 + 84 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 85 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 86 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 87 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 88 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 89 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 90 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 91 + } 92 + 93 + async setupDefaultSshKeys(): Promise<void> { 94 + await this 95 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 96 + } 97 + 98 + async setupTailscale(authKey: string): Promise<void> { 99 + await this 100 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 101 + await this.sh`pm2 start tailscaled || true`; 102 + await this.sh`tailscale up --auth-key=${authKey} || true`; 103 + } 104 + 105 + clone(repoUrl: string): Promise<any> { 106 + const dir = repoUrl.split("/").pop()?.replace(".git", ""); 107 + return this.sh`git clone ${repoUrl} || git -C ${dir} pull`; 108 + } 109 + 110 + async mount(path: string, prefix?: string): Promise<void> { 111 + const VERSION = "v1.2.1"; 112 + const ARCH = "amd64"; 113 + await this.sh`mkdir -p $HOME/.local/bin`; 114 + await this 115 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 116 + await this 117 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin`; 118 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 119 + await this.sh`command -v tigrisfs || chmod +x $HOME/.local/bin/tigrisfs`; 120 + await this 121 + .sh`cp $HOME/.local/bin/tigrisfs /usr/bin || sudo cp $HOME/.local/bin/tigrisfs /usr/bin || true`; 122 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 123 + 124 + await this.mkdir(path); 125 + 126 + const bucketPath = prefix 127 + ? `${env.VOLUME_BUCKET}:${prefix}` 128 + : env.VOLUME_BUCKET; 129 + 130 + await this.sandbox.spawn("sh", { 131 + args: [ 132 + "-c", 133 + `noup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || sudo nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || true`, 134 + ], 135 + stdin: "null", 136 + stdout: "piped", 137 + stderr: "piped", 138 + env: { 139 + AWS_ACCESS_KEY_ID: env.R2_ACCESS_KEY_ID!, 140 + AWS_SECRET_ACCESS_KEY: env.R2_SECRET_ACCESS_KEY!, 141 + }, 142 + }); 143 + } 144 + 145 + async unmount(path: string): Promise<void> { 146 + await this 147 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 148 + } 149 + } 150 + 151 + class DenoProvider implements BaseProvider { 152 + async create(options: SandboxOptions): Promise<BaseSandbox> { 153 + const sandbox = await Sandbox.create({ 154 + root: options.snapshotRoot, 155 + port: options.port, 156 + memory: options.memory, 157 + env: options.envVars, 158 + token: options.denoDeployToken, 159 + }); 160 + 161 + return new DenoSandbox(sandbox); 162 + } 163 + 164 + async get(id: string, token?: string): Promise<BaseSandbox> { 165 + const sandbox = await Sandbox.connect(id, { token }); 166 + return new DenoSandbox(sandbox); 167 + } 168 + } 169 + 170 + export default DenoProvider;
+145
apps/modal-sandbox/src/providers/index.ts
··· 1 + import type { Memory } from "@deno/sandbox"; 2 + import { consola } from "consola"; 3 + 4 + export abstract class BaseSandbox { 5 + abstract start(): Promise<void>; 6 + abstract stop(): Promise<void>; 7 + abstract delete(): Promise<void>; 8 + abstract sh( 9 + strings: TemplateStringsArray, 10 + ...values: any[] 11 + ): Promise<{ 12 + stdout?: string | Buffer<ArrayBufferLike>; 13 + stderr?: string | Buffer<ArrayBufferLike>; 14 + exitCode: number; 15 + }>; 16 + abstract id(): Promise<string | null>; 17 + abstract ssh(): Promise<any>; 18 + abstract mkdir(dir: string): Promise<void>; 19 + abstract writeFile(path: string, content: string): Promise<void>; 20 + abstract setupSshKeys(privateKey: string, publicKey: string): Promise<void>; 21 + abstract setupTailscale(authKey: string): Promise<void>; 22 + abstract clone(repoUrl: string): Promise<any>; 23 + abstract setupDefaultSshKeys(): Promise<void>; 24 + abstract mount(path: string, prefix?: string): Promise<void>; 25 + abstract unmount(path: string): Promise<void>; 26 + } 27 + 28 + abstract class BaseProvider { 29 + abstract create(options: SandboxOptions): Promise<BaseSandbox>; 30 + } 31 + 32 + export type Provider = "daytona" | "deno" | "vercel" | "sprites" | "modal"; 33 + 34 + export interface SandboxOptions { 35 + id?: string; 36 + keepAlive?: boolean; 37 + sleepAfter?: string; 38 + envVars?: Record<string, string>; 39 + secretVars?: Record<string, string>; 40 + snapshotId?: string; 41 + ports?: number[]; 42 + snapshotRoot?: string; 43 + port?: number; 44 + memory?: Memory; 45 + spriteToken?: string; 46 + spriteName?: string; 47 + daytonaApiKey?: string; 48 + organizationId?: string; 49 + denoDeployToken?: string; 50 + vercelApiToken?: string; 51 + vercelProjectId?: string; 52 + vercelTeamId?: string; 53 + modalTokenId?: string; 54 + modalTokenSecret?: string; 55 + modalAppName?: string; 56 + image?: string; 57 + [key: string]: any; 58 + } 59 + 60 + export async function createSandbox( 61 + provider: Provider, 62 + options: SandboxOptions = {}, 63 + ): Promise<BaseSandbox> { 64 + switch (provider) { 65 + case "daytona": 66 + return import("./daytona").then((module) => 67 + new module.default().create(options), 68 + ); 69 + case "deno": 70 + return import("./deno").then((module) => 71 + new module.default().create(options), 72 + ); 73 + case "vercel": 74 + return import("./vercel").then((module) => 75 + new module.default().create(options), 76 + ); 77 + case "sprites": 78 + return import("./sprites").then((module) => 79 + new module.default().create(options), 80 + ); 81 + case "modal": 82 + return import("./modal").then((module) => 83 + new module.default().create(options), 84 + ); 85 + default: 86 + console.log(`Provider ${provider} is not supported yet.`); 87 + throw new Error(`Unsupported provider: ${provider}`); 88 + } 89 + } 90 + 91 + export async function getSandboxById( 92 + provider: Provider, 93 + id: string, 94 + options?: SandboxOptions, 95 + ): Promise<BaseSandbox> { 96 + switch (provider) { 97 + case "daytona": { 98 + const module = await import("./daytona"); 99 + try { 100 + return new module.default().get( 101 + id, 102 + options?.daytonaApiKey, 103 + options?.organizationId, 104 + ); 105 + } catch (err) { 106 + console.error(`Error getting Daytona sandbox with ID ${id}:`, err); 107 + return createSandbox("daytona", { 108 + id, 109 + daytonaApiKey: options?.daytonaApiKey, 110 + organizationId: options?.organizationId, 111 + }); 112 + } 113 + } 114 + case "deno": { 115 + const module = await import("./deno"); 116 + try { 117 + return await new module.default().get(id, options?.denoDeployToken); 118 + } catch (err) { 119 + console.error(`Error getting Deno sandbox with ID ${id}:`, err); 120 + return createSandbox("deno", { 121 + id, 122 + denoDeployToken: options?.denoDeployToken, 123 + // snapshotRoot: process.env.DENO_SNAPSHOT_ROOT, 124 + }); 125 + } 126 + } 127 + case "vercel": 128 + return import("./vercel").then((module) => 129 + new module.default().get(id, options!), 130 + ); 131 + case "sprites": 132 + return import("./sprites").then((module) => 133 + new module.default().get(id, options?.spriteToken), 134 + ); 135 + case "modal": 136 + return import("./modal").then((module) => 137 + new module.default().get(id, options), 138 + ); 139 + default: 140 + consola.error(`Provider ${provider} is not supported yet.`); 141 + throw new Error(`Unsupported provider: ${provider}`); 142 + } 143 + } 144 + 145 + export default BaseProvider;
+178
apps/modal-sandbox/src/providers/modal/index.ts
··· 1 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 2 + import { ModalClient } from "modal"; 3 + import type { Sandbox } from "modal"; 4 + import { consola } from "consola"; 5 + import path from "node:path"; 6 + import { env } from "node:process"; 7 + import { 8 + adjectives, 9 + generateUniqueAsync, 10 + nouns, 11 + } from "unique-username-generator"; 12 + 13 + export class ModalSandbox implements BaseSandbox { 14 + constructor(private sandbox: Sandbox) {} 15 + 16 + async start(): Promise<void> { 17 + // Modal's sandbox starts immediately upon creation, so we can just return here. 18 + } 19 + 20 + async stop(): Promise<void> { 21 + try { 22 + consola.info("Stopping Modal sandbox with ID:", await this.id()); 23 + await this.sandbox.terminate(); 24 + } catch (error) { 25 + consola.error("Error stopping Modal sandbox:", error); 26 + } 27 + } 28 + 29 + async delete(): Promise<void> { 30 + // Modal's sandbox does not have a separate delete method, so we just stop it. 31 + try { 32 + consola.info("Deleting Modal sandbox with ID:", await this.id()); 33 + await this.stop(); 34 + } catch (error) { 35 + consola.error("Error deleting Modal sandbox:", error); 36 + } 37 + } 38 + 39 + async sh( 40 + strings: TemplateStringsArray, 41 + ...values: any[] 42 + ): Promise<{ 43 + stdout?: string | Buffer<ArrayBufferLike>; 44 + stderr?: string | Buffer<ArrayBufferLike>; 45 + exitCode: number; 46 + }> { 47 + const command = strings.reduce((acc, str, i) => { 48 + return acc + str + (values[i] || ""); 49 + }, ""); 50 + const result = await this.sandbox.exec(["bash", "-c", command]); 51 + 52 + consola.info(`exec command: ${command}`); 53 + const [stdout, stderr, exitCode] = await Promise.all([ 54 + result.stdout.readText(), 55 + result.stderr.readText(), 56 + result.wait(), 57 + ]); 58 + consola.info(`exitCode=${exitCode}`); 59 + 60 + return { ...result, stdout, stderr, exitCode }; 61 + } 62 + 63 + async id(): Promise<string | null> { 64 + return this.sandbox.sandboxId; 65 + } 66 + 67 + async ssh(): Promise<any> {} 68 + 69 + async mkdir(dir: string): Promise<void> { 70 + await this.sh`mkdir -p ${dir}`; 71 + } 72 + 73 + async writeFile(absolutePath: string, content: string): Promise<void> { 74 + const basePath = path.dirname(absolutePath); 75 + if (basePath !== "/" && basePath != ".") { 76 + await this.mkdir(basePath); 77 + } 78 + await this.sh`echo '${content}' > ${absolutePath}`; 79 + } 80 + 81 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 82 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 83 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 84 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 85 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 86 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 87 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 88 + } 89 + 90 + async setupDefaultSshKeys(): Promise<void> { 91 + await this 92 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 93 + } 94 + 95 + async setupTailscale(authKey: string): Promise<void> { 96 + await this 97 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 98 + await this.sh`pm2 start tailscaled || true`; 99 + await this.sh`tailscale up --auth-key=${authKey} || true`; 100 + } 101 + clone(repoUrl: string): Promise<any> { 102 + return this.sh`git clone ${repoUrl}`; 103 + } 104 + async mount(path: string, prefix?: string): Promise<void> { 105 + const VERSION = "v1.2.1"; 106 + const ARCH = "amd64"; 107 + await this.sh`mkdir -p $HOME/.local/bin`; 108 + await this 109 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 110 + await this 111 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C ~/.local/bin`; 112 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 113 + await this.sh`command -v tigrisfs || chmod +x ~/.local/bin/tigrisfs`; 114 + await this 115 + .sh`cp ~/.local/bin/tigrisfs /usr/bin || sudo cp ~/.local/bin/tigrisfs /usr/bin || true`; 116 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 117 + // install fuse ? 118 + 119 + await this.mkdir(path); 120 + 121 + const bucketPath = prefix 122 + ? `${env.VOLUME_BUCKET}:${prefix}` 123 + : env.VOLUME_BUCKET; 124 + 125 + await this 126 + .sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 127 + } 128 + 129 + async unmount(path: string): Promise<void> { 130 + await this 131 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 132 + } 133 + } 134 + 135 + class ModalProvider implements BaseProvider { 136 + async create(options: SandboxOptions): Promise<BaseSandbox> { 137 + const suffix = Math.random().toString(36).substring(2, 6); 138 + let modalAppName = await generateUniqueAsync( 139 + { dictionaries: [adjectives, nouns], separator: "-" }, 140 + () => false, 141 + ); 142 + modalAppName = `${modalAppName}-${suffix}`; 143 + consola.info("Connecting to Modal with app name:", modalAppName); 144 + const modal = new ModalClient({ 145 + tokenId: options.modalTokenId || env.MODAL_TOKEN_ID!, 146 + tokenSecret: options.modalTokenSecret || env.MODAL_TOKEN_SECRET!, 147 + }); 148 + consola.info("Creating Modal sandbox with app name:", modalAppName); 149 + const app = await modal.apps.fromName( 150 + options.modalAppName || modalAppName, 151 + { 152 + createIfMissing: true, 153 + }, 154 + ); 155 + consola.info("Setup image for Modal sandbox with app name:", modalAppName); 156 + const image = modal.images.fromRegistry( 157 + options.image || "ghcr.io/pocketenv-io/daytona-openclaw:0.1.0", 158 + ); 159 + consola.info("Creating Modal sandbox with app name:", modalAppName); 160 + const sandbox = await modal.sandboxes.create(app, image); 161 + consola.info("Created Modal sandbox with ID:", sandbox.sandboxId); 162 + 163 + return new ModalSandbox(sandbox); 164 + } 165 + 166 + async get(id: string, options?: SandboxOptions): Promise<BaseSandbox> { 167 + const modal = new ModalClient({ 168 + tokenId: options?.modalTokenId || env.MODAL_TOKEN_ID!, 169 + tokenSecret: options?.modalTokenSecret || env.MODAL_TOKEN_SECRET!, 170 + }); 171 + consola.log("Getting Modal sandbox with ID:", id); 172 + const sandbox = await modal.sandboxes.fromId(id); 173 + consola.log("Got Modal sandbox with ID:", id, sandbox); 174 + return new ModalSandbox(sandbox); 175 + } 176 + } 177 + 178 + export default ModalProvider;
+204
apps/modal-sandbox/src/providers/sprites/index.ts
··· 1 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 2 + import { env } from "node:process"; 3 + import { consola } from "consola"; 4 + import { ExecError, SpritesClient } from "@fly/sprites"; 5 + import type { Sprite } from "@fly/sprites"; 6 + import path from "node:path"; 7 + 8 + export class SpriteSandbox implements BaseSandbox { 9 + constructor( 10 + private sprite: Sprite, 11 + private spriteToken: string, 12 + ) {} 13 + 14 + async start(): Promise<void> { 15 + const client = new SpritesClient(this.spriteToken); 16 + const name = await this.id(); 17 + if (!name) { 18 + consola.error("Sprite name is not available"); 19 + return; 20 + } 21 + const sprite = client.sprite(name); 22 + await sprite.exec("uname -a"); 23 + // Sprite doesn't have a separate start method, so we do nothing here. 24 + // we just exec a command to make sure the sprite is running. 25 + } 26 + 27 + async stop(): Promise<void> { 28 + consola.info("Stopping Sprite with ID:", await this.id()); 29 + // Sprites does not have a separate stop method, so we do nothing here. 30 + } 31 + 32 + async delete(): Promise<void> { 33 + await this.sprite.delete(); 34 + } 35 + 36 + async sh( 37 + strings: TemplateStringsArray, 38 + ...values: any[] 39 + ): Promise<{ 40 + stdout: string | Buffer<ArrayBufferLike>; 41 + stderr: string | Buffer<ArrayBufferLike>; 42 + exitCode: number; 43 + }> { 44 + const command = strings.reduce((acc, str, i) => { 45 + return acc + str + (values[i] || ""); 46 + }, ""); 47 + try { 48 + return await this.sprite.execFile("bash", ["-c", command]); 49 + } catch (e) { 50 + if (e instanceof ExecError) { 51 + return e.result; 52 + } 53 + throw e; 54 + } 55 + } 56 + 57 + id(): Promise<string | null> { 58 + return Promise.resolve(this.sprite.name); 59 + } 60 + 61 + async ssh(): Promise<any> {} 62 + 63 + async mkdir(dir: string): Promise<void> { 64 + await this.sprite.exec(`mkdir -p ${dir}`); 65 + } 66 + 67 + async writeFile(absolutePath: string, content: string): Promise<void> { 68 + const basePath = path.dirname(absolutePath); 69 + if (basePath !== "/" && basePath != ".") { 70 + await this.mkdir(basePath); 71 + } 72 + await this.sprite.execFile("sh", [ 73 + "-c", 74 + `echo '${content}' > ${absolutePath}`, 75 + ]); 76 + } 77 + 78 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 79 + await this.writeFile("/home/sprite/.ssh/id_ed25519", privateKey); 80 + await this.writeFile("/home/sprite/.ssh/id_ed25519.pub", publicKey); 81 + await this.sprite.execFile("chmod", [ 82 + "600", 83 + "/home/sprite/.ssh/id_ed25519", 84 + ]); 85 + await this.sprite.exec("rm -f /home/sprite/.ssh/known_hosts"); 86 + await this.sprite.execFile("chmod", [ 87 + "644", 88 + "/home/sprite/.ssh/id_ed25519.pub", 89 + ]); 90 + await this.sprite.execFile("bash", [ 91 + "-c", 92 + "ssh-keyscan -t rsa tangled.org >> /home/sprite/.ssh/known_hosts", 93 + ]); 94 + await this.sprite.execFile("bash", [ 95 + "-c", 96 + "ssh-keyscan -t rsa github.com >> /home/sprite/.ssh/known_hosts", 97 + ]); 98 + } 99 + 100 + async setupDefaultSshKeys(): Promise<void> { 101 + await this 102 + .sh`[ -f /home/sprite/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f /home/sprite/.ssh/id_ed25519 -q -N "" || true`; 103 + } 104 + 105 + async setupTailscale(authKey: string): Promise<void> { 106 + await this.sprite.execFile("bash", [ 107 + "-c", 108 + "PATH=$(cat /etc/profile.d/languages_paths):$PATH type pm2 || npm install -g pm2", 109 + ]); 110 + await this.sprite.execFile("bash", [ 111 + "-c", 112 + `type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh `, 113 + ]); 114 + await this.sprite.execFile("bash", [ 115 + "-c", 116 + `PATH=$(cat /etc/profile.d/languages_paths):$PATH pm2 start tailscaled`, 117 + ]); 118 + await this.sprite.execFile("bash", [ 119 + "-c", 120 + `tailscale up --auth-key=${authKey}`, 121 + ]); 122 + } 123 + 124 + clone(repoUrl: string): Promise<any> { 125 + const dir = repoUrl.split("/").pop()?.replace(".git", ""); 126 + return this.sprite.execFile("bash", [ 127 + "-c", 128 + `git clone ${repoUrl} || git -C ${dir} pull`, 129 + ]); 130 + } 131 + 132 + async mount(path: string, prefix?: string): Promise<void> { 133 + try { 134 + const VERSION = "v1.2.1"; 135 + const ARCH = "amd64"; 136 + await this 137 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 138 + await this 139 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C $HOME/.local/bin`; 140 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 141 + await this.sh`command -v tigrisfs || chmod +x $HOME/.local/bin/tigrisfs`; 142 + await this 143 + .sh`cp $HOME/.local/bin/tigrisfs /usr/bin || sudo cp $HOME/.local/bin/tigrisfs /usr/bin || true`; 144 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 145 + 146 + await this.mkdir(path); 147 + 148 + const bucketPath = prefix 149 + ? `${env.VOLUME_BUCKET}:${prefix}` 150 + : env.VOLUME_BUCKET; 151 + 152 + await this.sprite.execFile("bash", [ 153 + "-c", 154 + "PATH=$(cat /etc/profile.d/languages_paths):$PATH type pm2 || npm install -g pm2", 155 + ]); 156 + 157 + await this.sprite.execFile( 158 + "bash", 159 + [ 160 + "-c", 161 + `nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || sudo nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || true`, 162 + ], 163 + { 164 + env: { 165 + AWS_ACCESS_KEY_ID: env.R2_ACCESS_KEY_ID!, 166 + AWS_SECRET_ACCESS_KEY: env.R2_SECRET_ACCESS_KEY!, 167 + }, 168 + }, 169 + ); 170 + } catch (error) { 171 + consola.error("Error mounting S3 bucket:", error); 172 + } 173 + } 174 + 175 + async unmount(path: string): Promise<void> { 176 + try { 177 + await this 178 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 179 + } catch (error) { 180 + consola.error("Error unmounting S3 bucket:", error); 181 + } 182 + } 183 + } 184 + 185 + class SpritesProvider implements BaseProvider { 186 + async create(options: SandboxOptions): Promise<BaseSandbox> { 187 + const client = new SpritesClient(options.spriteToken!); 188 + 189 + if (!options.spriteName) { 190 + throw new Error("spriteName is required"); 191 + } 192 + 193 + const sprite = await client.createSprite(options.spriteName); 194 + return new SpriteSandbox(sprite, options.spriteToken!); 195 + } 196 + 197 + async get(id: string, token?: string): Promise<BaseSandbox> { 198 + const client = new SpritesClient(token!); 199 + const sprite = client.sprite(id); 200 + return new SpriteSandbox(sprite, token!); 201 + } 202 + } 203 + 204 + export default SpritesProvider;
+168
apps/modal-sandbox/src/providers/vercel/index.ts
··· 1 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 2 + import { Sandbox } from "@vercel/sandbox"; 3 + import { consola } from "consola"; 4 + import path from "node:path"; 5 + import { env } from "node:process"; 6 + 7 + export class VercelSandbox implements BaseSandbox { 8 + constructor(private sandbox: Sandbox) {} 9 + 10 + async start(): Promise<void> { 11 + // Vercel's sandbox starts immediately upon creation, so we can just return here. 12 + } 13 + 14 + async stop(): Promise<void> { 15 + try { 16 + consola.info("Stopping Vercel sandbox with ID:", await this.id()); 17 + await this.sandbox.stop(); 18 + } catch (error) { 19 + consola.error("Error stopping Vercel sandbox:", error); 20 + } 21 + } 22 + 23 + async delete(): Promise<void> { 24 + await this.sandbox.stop(); 25 + // Vercel's sandbox does not have a separate delete method, so we just stop it. 26 + } 27 + 28 + async sh( 29 + strings: TemplateStringsArray, 30 + ...values: any[] 31 + ): Promise<{ 32 + stdout?: string | Buffer<ArrayBufferLike>; 33 + stderr?: string | Buffer<ArrayBufferLike>; 34 + exitCode: number; 35 + }> { 36 + const command = strings.reduce((acc, str, i) => { 37 + return acc + str + (values[i] || ""); 38 + }, ""); 39 + const result = await this.sandbox.runCommand("sh", ["-c", command]); 40 + 41 + return { 42 + ...result, 43 + stdout: await result.stdout(), 44 + stderr: await result.stderr(), 45 + }; 46 + } 47 + 48 + async id(): Promise<string | null> { 49 + return this.sandbox.sandboxId; 50 + } 51 + 52 + async ssh(): Promise<any> {} 53 + 54 + async mkdir(dir: string): Promise<void> { 55 + await this.sh`mkdir -p ${dir}`; 56 + } 57 + 58 + async writeFile(absolutePath: string, content: string): Promise<void> { 59 + const basePath = path.dirname(absolutePath); 60 + if (basePath !== "/" && basePath != ".") { 61 + await this.mkdir(basePath); 62 + } 63 + await this.sh`echo '${content}' > ${absolutePath}`; 64 + } 65 + 66 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 67 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 68 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 69 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 70 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 71 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 72 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 73 + } 74 + 75 + async setupDefaultSshKeys(): Promise<void> { 76 + await this 77 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 78 + } 79 + 80 + async setupTailscale(authKey: string): Promise<void> { 81 + await this 82 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 83 + await this.sh`pm2 start tailscaled || true`; 84 + await this.sh`tailscale up --auth-key=${authKey} || true`; 85 + } 86 + clone(repoUrl: string): Promise<any> { 87 + return this.sh`git clone ${repoUrl}`; 88 + } 89 + async mount(path: string, prefix?: string): Promise<void> { 90 + const VERSION = "v1.2.1"; 91 + const ARCH = "amd64"; 92 + await this.sh`mkdir -p $HOME/.local/bin`; 93 + await this 94 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 95 + await this 96 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C ~/.local/bin`; 97 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 98 + await this.sh`command -v tigrisfs || chmod +x ~/.local/bin/tigrisfs`; 99 + await this 100 + .sh`cp ~/.local/bin/tigrisfs /usr/bin || sudo cp ~/.local/bin/tigrisfs /usr/bin || true`; 101 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 102 + await this.sh`sudo dnf install -y fuse3 fuse3-libs`; 103 + await this.sh`sudo modprobe fuse`; 104 + 105 + await this.mkdir(path); 106 + 107 + const bucketPath = prefix 108 + ? `${env.VOLUME_BUCKET}:${prefix}` 109 + : env.VOLUME_BUCKET; 110 + 111 + await this.sandbox.runCommand({ 112 + cmd: "sh", 113 + args: [ 114 + "-c", 115 + `tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} || sudo tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path}`, 116 + ], 117 + env: { 118 + AWS_ACCESS_KEY_ID: env.R2_ACCESS_KEY_ID!, 119 + AWS_SECRET_ACCESS_KEY: env.R2_SECRET_ACCESS_KEY!, 120 + }, 121 + detached: true, 122 + }); 123 + } 124 + 125 + async unmount(path: string): Promise<void> { 126 + await this 127 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 128 + } 129 + } 130 + 131 + class VercelProvider implements BaseProvider { 132 + async create(options: SandboxOptions): Promise<BaseSandbox> { 133 + const credentials = { 134 + token: options.vercelApiToken, 135 + projectId: options.vercelProjectId, 136 + teamId: options.vercelTeamId, 137 + }; 138 + const ports = { 139 + ports: [...(options.ports || []), 26661], 140 + }; 141 + const sandbox = await Sandbox.create( 142 + options.snapshotId 143 + ? { 144 + source: { 145 + type: "snapshot", 146 + snapshotId: options.snapshotId, 147 + }, 148 + ...credentials, 149 + ...ports, 150 + } 151 + : { ...ports, ...credentials }, 152 + ); 153 + 154 + return new VercelSandbox(sandbox); 155 + } 156 + 157 + async get(id: string, options: SandboxOptions): Promise<BaseSandbox> { 158 + const sandbox = await Sandbox.get({ 159 + sandboxId: id, 160 + token: options.vercelApiToken, 161 + projectId: options.vercelProjectId, 162 + teamId: options.vercelTeamId, 163 + }); 164 + return new VercelSandbox(sandbox); 165 + } 166 + } 167 + 168 + export default VercelProvider;
+539
apps/modal-sandbox/src/routes/sandboxes.ts
··· 1 + import { Hono } from "hono"; 2 + import type { Context } from "../context"; 3 + import { consola } from "consola"; 4 + import { 5 + adjectives, 6 + nouns, 7 + generateUniqueAsync, 8 + } from "unique-username-generator"; 9 + import { eq } from "drizzle-orm"; 10 + import { 11 + files, 12 + sandboxes, 13 + sandboxCp, 14 + sandboxFiles, 15 + sandboxVolumes, 16 + sshKeys, 17 + tailscaleAuthKeys, 18 + users, 19 + spriteAuth, 20 + denoAuth, 21 + vercelAuth, 22 + modalAuth, 23 + } from "../schema"; 24 + import { 25 + type SandboxConfig, 26 + SandboxConfigSchema, 27 + type StartSandboxInput, 28 + StartSandboxInputSchema, 29 + } from "../types/sandbox"; 30 + import { createSandbox } from "../providers"; 31 + import { getSandbox, saveSecrets, saveVariables } from "../lib/sandbox-db"; 32 + import { 33 + getAuthParams, 34 + buildCredentials, 35 + resolveSandboxInstance, 36 + } from "../lib/sandbox-helpers"; 37 + import decrypt from "../lib/decrypt"; 38 + import type { InsertSpriteAuth } from "../schema/sprite-auth"; 39 + import daytonaAuth, { type InsertDaytonaAuth } from "../schema/daytona-auth"; 40 + import type { InsertDenoAuth } from "../schema/deno-auth"; 41 + import { type PullDirectoryParams, pullSchema } from "../types/pull"; 42 + import { type PushDirectoryParams, pushSchema } from "../types/push"; 43 + import crypto from "node:crypto"; 44 + import process from "node:process"; 45 + import prepareSandbox from "../lib/prepare-sandbox"; 46 + import { images } from "../images"; 47 + 48 + const SUPPORTED_PROVIDERS = ["daytona", "vercel", "deno", "sprites", "modal"]; 49 + 50 + const sandboxRouter = new Hono<{ Variables: Context }>(); 51 + 52 + sandboxRouter.post("/", async (c) => { 53 + const body = await c.req.json<SandboxConfig>(); 54 + 55 + let suffix = Math.random().toString(36).substring(2, 6); 56 + let name = await generateUniqueAsync( 57 + { dictionaries: [adjectives, nouns], separator: "-" }, 58 + () => false, 59 + ); 60 + let spriteName = await generateUniqueAsync( 61 + { dictionaries: [adjectives, nouns], separator: "-" }, 62 + () => false, 63 + ); 64 + spriteName = `${spriteName}-${suffix}`; 65 + 66 + try { 67 + const params = SandboxConfigSchema.parse(body); 68 + name = params.name || `${name}-${suffix}`; 69 + 70 + do { 71 + const existing = await c.var.db 72 + .select() 73 + .from(sandboxes) 74 + .where(eq(sandboxes.name, name)) 75 + .execute(); 76 + if (existing.length === 0) break; 77 + 78 + name = await generateUniqueAsync( 79 + { dictionaries: [adjectives, nouns], separator: "-" }, 80 + () => false, 81 + ); 82 + suffix = Math.random().toString(36).substring(2, 6); 83 + name = `${name}-${suffix}`; 84 + } while (true); 85 + 86 + const { record: initialRecord, user } = await c.var.db.transaction( 87 + async (tx) => { 88 + const user = await tx 89 + .select() 90 + .from(users) 91 + .where(eq(users.did, c.var.did || "")) 92 + .execute() 93 + .then((res) => res[0]); 94 + 95 + const [record] = await tx 96 + .insert(sandboxes) 97 + .values({ 98 + base: params.base, 99 + name, 100 + provider: params.provider, 101 + publicKey: process.env.PUBLIC_KEY!, 102 + userId: user?.id, 103 + instanceType: "standard-1", 104 + keepAlive: params.keepAlive, 105 + sleepAfter: params.sleepAfter, 106 + status: "INITIALIZING", 107 + }) 108 + .returning() 109 + .execute(); 110 + 111 + if (params.secrets.length > 0) { 112 + await saveSecrets(tx, record!, { secrets: params.secrets }); 113 + } 114 + 115 + if (params.variables.length > 0) { 116 + await saveVariables(tx, record!, { variables: params.variables }); 117 + } 118 + 119 + if (params.spriteToken && user?.id) { 120 + await tx 121 + .insert(spriteAuth) 122 + .values({ 123 + sandboxId: record!.id, 124 + spriteToken: params.spriteToken, 125 + redactedSpriteToken: params.redactedSpriteToken ?? "", 126 + userId: user.id, 127 + } satisfies InsertSpriteAuth) 128 + .execute(); 129 + } 130 + 131 + if (params.daytonaApiKey && user?.id) { 132 + await tx 133 + .insert(daytonaAuth) 134 + .values({ 135 + sandboxId: record!.id, 136 + apiKey: params.daytonaApiKey, 137 + redactedApiKey: params.redactedDaytonaApiKey ?? "", 138 + userId: user.id, 139 + organizationId: params.daytonaOrganizationId!, 140 + } satisfies InsertDaytonaAuth) 141 + .execute(); 142 + } 143 + 144 + if (params.denoDeployToken && user?.id) { 145 + await tx 146 + .insert(denoAuth) 147 + .values({ 148 + sandboxId: record!.id, 149 + deployToken: params.denoDeployToken, 150 + redactedDenoToken: params.redactedDenoDeployToken ?? "", 151 + userId: user.id, 152 + } satisfies InsertDenoAuth) 153 + .execute(); 154 + } 155 + 156 + if (params.vercelApiToken && user?.id) { 157 + await tx 158 + .insert(vercelAuth) 159 + .values({ 160 + sandboxId: record!.id, 161 + vercelToken: params.vercelApiToken, 162 + redactedVercelToken: params.redactedVercelApiToken ?? "", 163 + userId: user.id, 164 + projectId: params.vercelProjectId!, 165 + teamId: params.vercelTeamId!, 166 + }) 167 + .execute(); 168 + } 169 + 170 + if (params.modalTokenId && user?.id) { 171 + await tx 172 + .insert(modalAuth) 173 + .values({ 174 + sandboxId: record!.id, 175 + tokenId: params.modalTokenId!, 176 + redactedTokenId: params.redactedModalTokenId!, 177 + tokenSecret: params.modalTokenSecret!, 178 + redactedTokenSecret: params.redactedModalTokenSecret!, 179 + userId: user.id, 180 + }) 181 + .execute(); 182 + } 183 + 184 + return { record, user }; 185 + }, 186 + ); 187 + 188 + const sandbox = await createSandbox(params.provider, { 189 + id: initialRecord?.id, 190 + keepAlive: params.keepAlive, 191 + sleepAfter: params.sleepAfter, 192 + snapshotRoot: process.env.DENO_SNAPSHOT_ROOT, 193 + spriteToken: decrypt(params.spriteToken), 194 + spriteName, 195 + daytonaApiKey: decrypt(params.daytonaApiKey), 196 + organizationId: params.daytonaOrganizationId, 197 + denoDeployToken: decrypt(params.denoDeployToken), 198 + vercelApiToken: decrypt(params.vercelApiToken), 199 + vercelProjectId: params.vercelProjectId, 200 + vercelTeamId: params.vercelTeamId, 201 + modalTokenId: decrypt(params.modalTokenId), 202 + modalTokenSecret: decrypt(params.modalTokenSecret), 203 + image: images[params.base] || images["openclaw"], 204 + }); 205 + const sandboxId = await sandbox.id(); 206 + 207 + const [record] = await c.var.db 208 + .update(sandboxes) 209 + .set({ 210 + status: "RUNNING", 211 + sandboxId: sandboxId, 212 + startedAt: new Date(), 213 + vcpus: params.vcpus, 214 + memory: params.memory, 215 + disk: params.disk, 216 + }) 217 + .where(eq(sandboxes.id, initialRecord!.id)) 218 + .returning() 219 + .execute(); 220 + 221 + return c.json(record); 222 + } catch (err) { 223 + console.log(err); 224 + return c.json( 225 + { error: err instanceof Error ? err.message : "Unknown error" }, 226 + 400, 227 + ); 228 + } 229 + }); 230 + 231 + sandboxRouter.get("/", async (c) => { 232 + const records = await c.var.db.select().from(sandboxes).execute(); 233 + return c.json(records); 234 + }); 235 + 236 + sandboxRouter.get("/:sandboxId", async (c) => { 237 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 238 + return c.json(record); 239 + }); 240 + 241 + sandboxRouter.put("/:sandboxId", async (c) => { 242 + return c.json({}); 243 + }); 244 + 245 + sandboxRouter.post("/:sandboxId/start", async (c) => { 246 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 247 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 248 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 249 + return c.json({ error: "Sandbox provider not supported" }, 400); 250 + } 251 + 252 + const { repo } = StartSandboxInputSchema.parse( 253 + await c.req.json<StartSandboxInput>(), 254 + ); 255 + 256 + const auth = await getAuthParams(c.var.db, record.id); 257 + const credentials = buildCredentials(auth); 258 + const sandbox = await resolveSandboxInstance(c.var.db, record, credentials); 259 + 260 + await sandbox.start(); 261 + 262 + // prepareSandbox in background since it can take a while and we want to return 200 OK as soon as possible to avoid timeouts on the client side 263 + prepareSandbox(sandbox, record.base || "openclaw") 264 + .then(() => 265 + consola.success(`Sandbox ${c.req.param("sandboxId")} is prepared`), 266 + ) 267 + .catch((e) => 268 + consola.warn( 269 + `Failed to prepare sandbox ${c.req.param("sandboxId")}: ${e}`, 270 + ), 271 + ); 272 + 273 + c.var.db 274 + .update(sandboxes) 275 + .set({ 276 + sandboxId: 277 + record.provider === "deno" ? await sandbox.id() : record.sandboxId, 278 + }) 279 + .where(eq(sandboxes.id, record.id)) 280 + .execute() 281 + .catch((e) => 282 + consola.error( 283 + `Failed to update SSH info for sandbox ${c.req.param("sandboxId")}: ${e}`, 284 + ), 285 + ); 286 + 287 + const [sandboxFileRecords, sshKeyRecords, tailscaleRecords, volumeRecords] = 288 + await Promise.all([ 289 + c.var.db 290 + .select() 291 + .from(sandboxFiles) 292 + .leftJoin(files, eq(files.id, sandboxFiles.fileId)) 293 + .where(eq(sandboxFiles.sandboxId, c.req.param("sandboxId"))) 294 + .execute(), 295 + c.var.db 296 + .select() 297 + .from(sshKeys) 298 + .where(eq(sshKeys.sandboxId, c.req.param("sandboxId"))) 299 + .execute(), 300 + c.var.db 301 + .select() 302 + .from(tailscaleAuthKeys) 303 + .where(eq(tailscaleAuthKeys.sandboxId, c.req.param("sandboxId"))) 304 + .execute(), 305 + c.var.db 306 + .select() 307 + .from(sandboxVolumes) 308 + .leftJoin(sandboxes, eq(sandboxes.id, sandboxVolumes.sandboxId)) 309 + .leftJoin(users, eq(users.id, sandboxes.userId)) 310 + .where(eq(sandboxVolumes.sandboxId, c.req.param("sandboxId"))) 311 + .execute(), 312 + ]); 313 + 314 + Promise.all([ 315 + sandbox.setupDefaultSshKeys(), 316 + ...sandboxFileRecords 317 + .filter((x) => x.files !== null) 318 + .map((r) => 319 + sandbox.writeFile(r.sandbox_files.path, decrypt(r.files!.content)!), 320 + ), 321 + ...sshKeyRecords.map((r) => 322 + sandbox.setupSshKeys(decrypt(r.privateKey)!, r.publicKey), 323 + ), 324 + tailscaleRecords.length > 0 && 325 + sandbox.setupTailscale(decrypt(tailscaleRecords[0]?.authKey)!), 326 + ...volumeRecords.map((v) => 327 + sandbox.mount( 328 + v.sandbox_volumes.path, 329 + `/${v.users?.did || ""}${v.users?.did ? "/" : ""}${v.sandbox_volumes.id}/`, 330 + ), 331 + ), 332 + ]) 333 + .then(() => consola.success(`Sandbox ${c.req.param("sandboxId")} is ready`)) 334 + .catch((e) => 335 + consola.error( 336 + `Failed to set up sandbox ${c.req.param("sandboxId")}: ${e}`, 337 + ), 338 + ); 339 + 340 + if (record.repo) { 341 + sandbox 342 + .clone(record.repo) 343 + .then(() => 344 + consola.success(`Git Repository successfully cloned: ${record.repo}`), 345 + ) 346 + .catch((e) => consola.error(`Failed to Clone Repository: ${e}`)); 347 + } 348 + 349 + if (repo) { 350 + sandbox 351 + .clone(repo) 352 + .then(() => 353 + consola.success(`Git Repository successfully cloned: ${repo}`), 354 + ) 355 + .catch((e) => consola.error(`Failed to Clone Repository: ${e}`)); 356 + } 357 + 358 + await c.var.db 359 + .update(sandboxes) 360 + .set({ 361 + status: "RUNNING", 362 + startedAt: new Date(), 363 + sandboxId: 364 + record.provider === "deno" ? await sandbox.id() : record.sandboxId, 365 + }) 366 + .where(eq(sandboxes.id, c.req.param("sandboxId"))) 367 + .execute(); 368 + 369 + return c.json({}); 370 + }); 371 + 372 + sandboxRouter.post("/:sandboxId/stop", async (c) => { 373 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 374 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 375 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 376 + return c.json({ error: "Sandbox provider not supported" }, 400); 377 + } 378 + 379 + const auth = await getAuthParams(c.var.db, record.id); 380 + const sandbox = await resolveSandboxInstance( 381 + c.var.db, 382 + record, 383 + buildCredentials(auth), 384 + ); 385 + 386 + await sandbox.stop(); 387 + await c.var.db 388 + .update(sandboxes) 389 + .set({ 390 + status: "STOPPED", 391 + sandboxId: ["deno", "vercel"].includes(record.provider) 392 + ? null 393 + : record.sandboxId, 394 + }) 395 + .where(eq(sandboxes.id, c.req.param("sandboxId"))) 396 + .execute(); 397 + 398 + return c.json({}); 399 + }); 400 + 401 + sandboxRouter.post("/:sandboxId/runs", async (c) => { 402 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 403 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 404 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 405 + return c.json({ error: "Sandbox provider not supported" }, 400); 406 + } 407 + 408 + const auth = await getAuthParams(c.var.db, record.id); 409 + const sandbox = await resolveSandboxInstance( 410 + c.var.db, 411 + record, 412 + buildCredentials(auth), 413 + ); 414 + 415 + const { command } = await c.req.json(); 416 + const res = await sandbox.sh`${command}`; 417 + return c.json(res); 418 + }); 419 + 420 + sandboxRouter.delete("/:sandboxId", async (c) => { 421 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 422 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 423 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 424 + return c.json({ error: "Sandbox provider not supported" }, 400); 425 + } 426 + 427 + const auth = await getAuthParams(c.var.db, record.id); 428 + const sandbox = await resolveSandboxInstance( 429 + c.var.db, 430 + record, 431 + buildCredentials(auth), 432 + ); 433 + 434 + await sandbox.delete(); 435 + await c.var.db 436 + .delete(sandboxes) 437 + .where(eq(sandboxes.id, c.req.param("sandboxId"))) 438 + .execute(); 439 + 440 + return c.json({ success: true }, 200); 441 + }); 442 + 443 + sandboxRouter.get("/:sandboxId/ssh", async (c) => { 444 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 445 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 446 + if (!["daytona", "deno"].includes(record.provider)) { 447 + return c.json({ error: "Sandbox provider not supported" }, 400); 448 + } 449 + 450 + const auth = await getAuthParams(c.var.db, record.id); 451 + const sandbox = await resolveSandboxInstance( 452 + c.var.db, 453 + record, 454 + buildCredentials(auth), 455 + ); 456 + 457 + c.var.db 458 + .update(sandboxes) 459 + .set({ 460 + sandboxId: 461 + record.provider === "deno" ? await sandbox.id() : record.sandboxId, 462 + }) 463 + .where(eq(sandboxes.id, record.id)) 464 + .execute() 465 + .catch((e) => 466 + consola.error( 467 + `Failed to update SSH info for sandbox ${c.req.param("sandboxId")}: ${e}`, 468 + ), 469 + ); 470 + 471 + return c.json(await sandbox.ssh()); 472 + }); 473 + 474 + sandboxRouter.post("/:sandboxId/ports", async (c) => { 475 + // TODO: Implement expose port 476 + return c.json({}); 477 + }); 478 + 479 + sandboxRouter.delete("/:sandboxId/ports", async (c) => { 480 + // TODO: Implement unexpose port 481 + return c.json({}); 482 + }); 483 + 484 + sandboxRouter.post("/:sandboxId/pull-directory", async (c) => { 485 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 486 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 487 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 488 + return c.json({ error: "Sandbox provider not supported" }, 400); 489 + } 490 + 491 + const auth = await getAuthParams(c.var.db, record.id); 492 + const sandbox = await resolveSandboxInstance( 493 + c.var.db, 494 + record, 495 + buildCredentials(auth), 496 + ); 497 + 498 + const token = c.req.header("Authorization"); 499 + const params = await c.req.json<PullDirectoryParams>(); 500 + await pullSchema.parseAsync(params); 501 + 502 + const outdir = crypto.randomUUID(); 503 + await sandbox.sh`mkdir -p /tmp/${outdir} && cd /tmp/${outdir} && curl https://sandbox.pocketenv.io/cp/${params.uuid} -H "Authorization: ${token}" --output - | tar xzvf -`; 504 + await sandbox.sh`mkdir -p ${params.directoryPath} || sudo mkdir -p ${params.directoryPath}`; 505 + await sandbox.sh`(shopt -s dotglob && cp -r /tmp/${outdir}/* ${params.directoryPath}) || (shopt -s dotglob && sudo cp -r /tmp/${outdir}/* ${params.directoryPath})`; 506 + 507 + await c.var.db 508 + .delete(sandboxCp) 509 + .where(eq(sandboxCp.copyUuid, params.uuid)) 510 + .execute(); 511 + 512 + return c.json({ success: true }); 513 + }); 514 + 515 + sandboxRouter.post("/:sandboxId/push-directory", async (c) => { 516 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 517 + if (!record) return c.json({ error: "Sandbox not found" }, 404); 518 + if (!SUPPORTED_PROVIDERS.includes(record.provider)) { 519 + return c.json({ error: "Sandbox provider not supported" }, 400); 520 + } 521 + 522 + const auth = await getAuthParams(c.var.db, record.id); 523 + const sandbox = await resolveSandboxInstance( 524 + c.var.db, 525 + record, 526 + buildCredentials(auth), 527 + ); 528 + 529 + const token = c.req.header("Authorization"); 530 + const params = await c.req.json<PushDirectoryParams>(); 531 + await pushSchema.parseAsync(params); 532 + 533 + const uuid = crypto.randomUUID(); 534 + await sandbox.sh`cd /tmp && tar czvf ${uuid}.tar.gz -C $(dirname ${params.directoryPath}) $(basename ${params.directoryPath}) && curl -X POST "https://sandbox.pocketenv.io/cp?uuid=${uuid}" -H "Authorization: ${token}" -F "file=@${uuid}.tar.gz" && rm ${uuid}.tar.gz`; 535 + 536 + return c.json({ success: true, uuid: uuid.toString() }); 537 + }); 538 + 539 + export { sandboxRouter };
+17
apps/modal-sandbox/src/schema/authorized-keys.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const authorizedKeys = pgTable("authorized_keys", { 6 + id: text("id") 7 + .primaryKey() 8 + .default(sql`xata_id()`), 9 + sandboxId: text("sandbox_id").references(() => sandboxes.id), 10 + publicKey: text("public_key").notNull(), 11 + createdAt: timestamp("created_at").defaultNow().notNull(), 12 + }); 13 + 14 + export type SelectAuthorizedKey = InferSelectModel<typeof authorizedKeys>; 15 + export type InsertAuthorizedKey = InferInsertModel<typeof authorizedKeys>; 16 + 17 + export default authorizedKeys;
+22
apps/modal-sandbox/src/schema/backups.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const backups = pgTable("backups", { 6 + id: text("id") 7 + .primaryKey() 8 + .default(sql`xata_id()`), 9 + sandboxId: text("sandbox_id") 10 + .notNull() 11 + .references(() => sandboxes.id, { onDelete: "cascade" }), 12 + backupId: text("backup_id").notNull(), 13 + directory: text("directory").notNull(), 14 + description: text("description"), 15 + expiresAt: timestamp("expires_at"), 16 + createdAt: timestamp("created_at").defaultNow().notNull(), 17 + }); 18 + 19 + export type SelectBakcup = InferSelectModel<typeof backups>; 20 + export type InsertBackup = InferInsertModel<typeof backups>; 21 + 22 + export default backups;
+29
apps/modal-sandbox/src/schema/daytona-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const daytonaAuth = pgTable( 7 + "daytona_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + organizationId: text("organization_id").notNull(), 21 + createdAt: timestamp("created_at").defaultNow().notNull(), 22 + }, 23 + (t) => [uniqueIndex("unique_daytona_auth").on(t.sandboxId, t.userId)], 24 + ); 25 + 26 + export type SelectDaytonaAuth = InferSelectModel<typeof daytonaAuth>; 27 + export type InsertDaytonaAuth = InferInsertModel<typeof daytonaAuth>; 28 + 29 + export default daytonaAuth;
+28
apps/modal-sandbox/src/schema/deno-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const denoAuth = pgTable( 7 + "deno_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + deployToken: text("deploy_token").notNull(), 16 + userId: text("user_id") 17 + .notNull() 18 + .references(() => users.id), 19 + redactedDenoToken: text("redacted_deno_token").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_deno_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectDenoAuth = InferSelectModel<typeof denoAuth>; 26 + export type InsertDenoAuth = InferInsertModel<typeof denoAuth>; 27 + 28 + export default denoAuth;
+16
apps/modal-sandbox/src/schema/files.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const files = pgTable("files", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`xata_id()`), 8 + content: text("content").notNull(), 9 + createdAt: timestamp("created_at").defaultNow().notNull(), 10 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 11 + }); 12 + 13 + export type SelectFile = InferSelectModel<typeof files>; 14 + export type InsertFile = InferInsertModel<typeof files>; 15 + 16 + export default files;
+47
apps/modal-sandbox/src/schema/index.ts
··· 1 + import sandboxes from "./sandboxes"; 2 + import secrets from "./secrets"; 3 + import snapshots from "./snapshots"; 4 + import users from "./users"; 5 + import variables from "./variables"; 6 + import volumes from "./volumes"; 7 + import sandboxSecrets from "./sandbox-secrets"; 8 + import sandboxVariables from "./sandbox-variables"; 9 + import sandboxVolumes from "./sandbox-volumes"; 10 + import files from "./files"; 11 + import sandboxFiles from "./sandbox-files"; 12 + import sshKeys from "./ssh-keys"; 13 + import tailscaleAuthKeys from "./tailscale-auth-keys"; 14 + import sandboxPorts from "./sandbox-ports"; 15 + import services from "./services"; 16 + import daytonaAuth from "./daytona-auth"; 17 + import denoAuth from "./deno-auth"; 18 + import spriteAuth from "./sprite-auth"; 19 + import vercelAuth from "./vercel-auth"; 20 + import sandboxCp from "./sandbox-cp"; 21 + import backups from "./backups"; 22 + import modalAuth from "./modal-auth"; 23 + 24 + export { 25 + sandboxes, 26 + secrets, 27 + snapshots, 28 + users, 29 + variables, 30 + volumes, 31 + sandboxSecrets, 32 + sandboxVariables, 33 + sandboxVolumes, 34 + files, 35 + sandboxFiles, 36 + sshKeys, 37 + tailscaleAuthKeys, 38 + sandboxPorts, 39 + services, 40 + daytonaAuth, 41 + denoAuth, 42 + spriteAuth, 43 + vercelAuth, 44 + sandboxCp, 45 + backups, 46 + modalAuth, 47 + };
+25
apps/modal-sandbox/src/schema/integrations.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const integrations = pgTable( 6 + "integrations", 7 + { 8 + id: text("id") 9 + .primaryKey() 10 + .default(sql`xata_id()`), 11 + sandboxId: text("sandbox_id") 12 + .notNull() 13 + .references(() => sandboxes.id, { onDelete: "cascade" }), 14 + name: text("name").notNull(), 15 + description: text("description"), 16 + webhookUrl: text("webhook_url").notNull(), 17 + createdAt: timestamp("created_at").defaultNow().notNull(), 18 + }, 19 + (t) => [uniqueIndex("unique_sandbox_integration").on(t.sandboxId, t.name)], 20 + ); 21 + 22 + export type SelectIntegration = InferSelectModel<typeof integrations>; 23 + export type InsertIntegration = InferInsertModel<typeof integrations>; 24 + 25 + export default integrations;
+30
apps/modal-sandbox/src/schema/modal-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const modalAuth = pgTable( 7 + "modal_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + tokenId: text("token_id").notNull(), 19 + redactedTokenId: text("redacted_token_id").notNull(), 20 + tokenSecret: text("token_secret").notNull(), 21 + redactedTokenSecret: text("redacted_token_secret").notNull(), 22 + createdAt: timestamp("created_at").defaultNow().notNull(), 23 + }, 24 + (t) => [uniqueIndex("unique_modal_auth").on(t.sandboxId, t.userId)], 25 + ); 26 + 27 + export type SelectModalAuth = InferSelectModel<typeof modalAuth>; 28 + export type InsertModalAuth = InferInsertModel<typeof modalAuth>; 29 + 30 + export default modalAuth;
+15
apps/modal-sandbox/src/schema/sandbox-cp.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const sandboxCp = pgTable("sandbox_cp", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`xata_id()`), 8 + copyUuid: text("copy_uuid").unique().notNull(), 9 + createdAt: timestamp("created_at").defaultNow().notNull(), 10 + }); 11 + 12 + export type SelectSandboxCp = InferSelectModel<typeof sandboxCp>; 13 + export type InsertSandboxCp = InferInsertModel<typeof sandboxCp>; 14 + 15 + export default sandboxCp;
+28
apps/modal-sandbox/src/schema/sandbox-files.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import files from "./files"; 5 + 6 + const sandboxFiles = pgTable( 7 + "sandbox_files", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`file_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + fileId: text("file_id") 16 + .notNull() 17 + .references(() => files.id), 18 + path: text("path").notNull(), 19 + createdAt: timestamp("created_at").defaultNow().notNull(), 20 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_sandbox_file_path").on(t.sandboxId, t.path)], 23 + ); 24 + 25 + export type SelectSandboxFile = InferSelectModel<typeof sandboxFiles>; 26 + export type InsertSandboxFile = InferInsertModel<typeof sandboxFiles>; 27 + 28 + export default sandboxFiles;
+34
apps/modal-sandbox/src/schema/sandbox-ports.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { 3 + pgTable, 4 + text, 5 + timestamp, 6 + uniqueIndex, 7 + integer, 8 + } from "drizzle-orm/pg-core"; 9 + import sandboxes from "./sandboxes"; 10 + import services from "./services"; 11 + 12 + const sandboxPorts = pgTable( 13 + "sandbox_ports", 14 + { 15 + id: text("id") 16 + .primaryKey() 17 + .default(sql`xata_id()`), 18 + sandboxId: text("sandbox_id") 19 + .notNull() 20 + .references(() => sandboxes.id, { onDelete: "cascade" }), 21 + exposedPort: integer("exposed_port").notNull(), 22 + previewUrl: text("preview_url"), 23 + description: text("description"), 24 + serviceId: text("service_id").references(() => services.id), 25 + createdAt: timestamp("created_at").defaultNow().notNull(), 26 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 27 + }, 28 + (t) => [uniqueIndex("unique_sandbox_port").on(t.sandboxId, t.exposedPort)], 29 + ); 30 + 31 + export type SelectSandboxPort = InferSelectModel<typeof sandboxPorts>; 32 + export type InsertSandboxPort = InferInsertModel<typeof sandboxPorts>; 33 + 34 + export default sandboxPorts;
+28
apps/modal-sandbox/src/schema/sandbox-secrets.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import secrets from "./secrets"; 5 + 6 + const sandboxSecrets = pgTable( 7 + "sandbox_secrets", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + secretId: text("secret_id") 16 + .notNull() 17 + .references(() => secrets.id), 18 + name: text("name"), 19 + createdAt: timestamp("created_at").defaultNow().notNull(), 20 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_sandbox_secret_by_name").on(t.sandboxId, t.name)], 23 + ); 24 + 25 + export type SelectSandboxSecret = InferSelectModel<typeof sandboxSecrets>; 26 + export type InsertSandboxSecret = InferInsertModel<typeof sandboxSecrets>; 27 + 28 + export default sandboxSecrets;
+29
apps/modal-sandbox/src/schema/sandbox-variables.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import variables from "./variables"; 5 + 6 + const sandboxVariables = pgTable( 7 + "sandbox_variables", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + variableId: text("variable_id") 16 + .notNull() 17 + .references(() => variables.id), 18 + name: text("name").notNull(), 19 + createdAt: timestamp("created_at").defaultNow().notNull(), 20 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 21 + }, 22 + (t) => [ 23 + uniqueIndex("unique_sandbox_variables_by_name").on(t.sandboxId, t.name), 24 + ], 25 + ); 26 + 27 + export type SelectSandboxVariable = InferSelectModel<typeof sandboxVariables>; 28 + export type InsertSandboxVariable = InferInsertModel<typeof sandboxVariables>; 29 + export default sandboxVariables;
+29
apps/modal-sandbox/src/schema/sandbox-volumes.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import volumes from "./volumes"; 5 + 6 + const sandboxVolumes = pgTable( 7 + "sandbox_volumes", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`volume_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + volumeId: text("volume_id") 16 + .notNull() 17 + .references(() => volumes.id), 18 + name: text("name"), 19 + path: text("path").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 22 + }, 23 + (t) => [uniqueIndex("unique_sandbox_volume_path").on(t.sandboxId, t.path)], 24 + ); 25 + 26 + export type SelectSandboxVolume = InferSelectModel<typeof sandboxVolumes>; 27 + export type InsertSandboxVolume = InferInsertModel<typeof sandboxVolumes>; 28 + 29 + export default sandboxVolumes;
+44
apps/modal-sandbox/src/schema/sandboxes.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { 3 + pgTable, 4 + text, 5 + timestamp, 6 + boolean, 7 + integer, 8 + } from "drizzle-orm/pg-core"; 9 + import users from "./users"; 10 + 11 + const sandboxes = pgTable("sandboxes", { 12 + id: text("id") 13 + .primaryKey() 14 + .default(sql`sandbox_id()`), 15 + base: text("base"), 16 + name: text("name").unique().notNull(), 17 + uri: text("uri").unique(), 18 + cid: text("cid").unique(), 19 + repo: text("repo"), 20 + provider: text("provider").default("cloudflare").notNull(), 21 + description: text("description"), 22 + topics: text("topics").array(), 23 + logo: text("logo"), 24 + readme: text("readme"), 25 + publicKey: text("public_key").notNull(), 26 + userId: text("user_id").references(() => users.id), 27 + instanceType: text("instance_type"), 28 + vcpus: integer("vcpus"), 29 + memory: integer("memory"), 30 + disk: integer("disk"), 31 + status: text("status").notNull(), 32 + keepAlive: boolean("keep_alive").default(false).notNull(), 33 + sleepAfter: text("sleep_after"), 34 + sandboxId: text("sandbox_id"), 35 + installs: integer("installs").default(0).notNull(), 36 + startedAt: timestamp("started_at"), 37 + createdAt: timestamp("created_at").defaultNow().notNull(), 38 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 39 + }); 40 + 41 + export type SelectSandbox = InferSelectModel<typeof sandboxes>; 42 + export type InsertSandbox = InferInsertModel<typeof sandboxes>; 43 + 44 + export default sandboxes;
+17
apps/modal-sandbox/src/schema/secrets.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const secrets = pgTable("secrets", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`secret_id()`), 8 + name: text("name").notNull(), 9 + value: text("value").notNull(), 10 + redacted: text("redacted"), 11 + createdAt: timestamp("created_at").defaultNow().notNull(), 12 + }); 13 + 14 + export type SelectSecret = InferSelectModel<typeof secrets>; 15 + export type InsertSecret = InferInsertModel<typeof secrets>; 16 + 17 + export default secrets;
+28
apps/modal-sandbox/src/schema/services.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const services = pgTable( 6 + "services", 7 + { 8 + id: text("id") 9 + .primaryKey() 10 + .default(sql`xata_id()`), 11 + sandboxId: text("sandbox_id") 12 + .notNull() 13 + .references(() => sandboxes.id, { onDelete: "cascade" }), 14 + name: text("name").notNull(), 15 + command: text("command").notNull(), 16 + description: text("description"), 17 + serviceId: text("service_id"), 18 + status: text("status").notNull().default("STOPPED"), 19 + createdAt: timestamp("created_at").defaultNow().notNull(), 20 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_sandbox_service").on(t.name, t.sandboxId)], 23 + ); 24 + 25 + export type SelectService = InferSelectModel<typeof services>; 26 + export type InsertService = InferInsertModel<typeof services>; 27 + 28 + export default services;
+15
apps/modal-sandbox/src/schema/snapshots.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const snapshots = pgTable("snapshots", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`snapshot_id()`), 8 + slug: text("slug").unique().notNull(), 9 + createdAt: timestamp("created_at").defaultNow().notNull(), 10 + }); 11 + 12 + export type SelectSnapshot = InferSelectModel<typeof snapshots>; 13 + export type InsertSnapshot = InferInsertModel<typeof snapshots>; 14 + 15 + export default snapshots;
+28
apps/modal-sandbox/src/schema/sprite-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const spriteAuth = pgTable( 7 + "sprite_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + spriteToken: text("sprite_token").notNull(), 19 + redactedSpriteToken: text("redacted_sprite_token").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_sprite_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectSpriteAuth = InferSelectModel<typeof spriteAuth>; 26 + export type InsertSpriteAuth = InferInsertModel<typeof spriteAuth>; 27 + 28 + export default spriteAuth;
+25
apps/modal-sandbox/src/schema/ssh-keys.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const sshKeys = pgTable( 6 + "ssh_keys", 7 + { 8 + id: text("id") 9 + .primaryKey() 10 + .default(sql`xata_id()`), 11 + sandboxId: text("sandbox_id") 12 + .notNull() 13 + .references(() => sandboxes.id, { onDelete: "cascade" }), 14 + publicKey: text("public_key").notNull(), 15 + privateKey: text("private_key").notNull(), 16 + redacted: text("redacted").notNull(), 17 + createdAt: timestamp("created_at").defaultNow().notNull(), 18 + }, 19 + (t) => [uniqueIndex("unique_sandbox_ssh_key").on(t.publicKey, t.sandboxId)], 20 + ); 21 + 22 + export type SelectSshKey = InferSelectModel<typeof sshKeys>; 23 + export type InsertSshKey = InferInsertModel<typeof sshKeys>; 24 + 25 + export default sshKeys;
+20
apps/modal-sandbox/src/schema/tailscale-auth-keys.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + 5 + const tailscaleAuthKey = pgTable("tailscale_auth_keys", { 6 + id: text("id") 7 + .primaryKey() 8 + .default(sql`xata_id()`), 9 + sandboxId: text("sandbox_id") 10 + .notNull() 11 + .references(() => sandboxes.id, { onDelete: "cascade" }), 12 + authKey: text("auth_key").notNull(), 13 + redacted: text("redacted").notNull(), 14 + createdAt: timestamp("created_at").defaultNow().notNull(), 15 + }); 16 + 17 + export type SelectTailscaleAuthKey = InferSelectModel<typeof tailscaleAuthKey>; 18 + export type InsertTailscaleAuthKey = InferInsertModel<typeof tailscaleAuthKey>; 19 + 20 + export default tailscaleAuthKey;
+19
apps/modal-sandbox/src/schema/users.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const users = pgTable("users", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`xata_id()`), 8 + did: text("did").unique().notNull(), 9 + displayName: text("display_name"), 10 + handle: text("handle").unique().notNull(), 11 + avatar: text("avatar"), 12 + createdAt: timestamp("created_at").defaultNow().notNull(), 13 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 14 + }); 15 + 16 + export type SelectUser = InferSelectModel<typeof users>; 17 + export type InsertUser = InferInsertModel<typeof users>; 18 + 19 + export default users;
+17
apps/modal-sandbox/src/schema/variables.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const variables = pgTable("variables", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`variable_id()`), 8 + name: text("name").notNull(), 9 + value: text("value").notNull(), 10 + createdAt: timestamp("created_at").defaultNow().notNull(), 11 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 12 + }); 13 + 14 + export type SelectVariable = InferSelectModel<typeof variables>; 15 + export type InsertVariable = InferInsertModel<typeof variables>; 16 + 17 + export default variables;
+30
apps/modal-sandbox/src/schema/vercel-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const vercelAuth = pgTable( 7 + "vercel_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + vercelToken: text("vercel_token").notNull(), 19 + redactedVercelToken: text("redacted_vercel_token").notNull(), 20 + projectId: text("project_id").notNull(), 21 + teamId: text("team_id").notNull(), 22 + createdAt: timestamp("created_at").defaultNow().notNull(), 23 + }, 24 + (t) => [uniqueIndex("unique_vercel_auth").on(t.sandboxId, t.userId)], 25 + ); 26 + 27 + export type SelectVercelAuth = InferSelectModel<typeof vercelAuth>; 28 + export type InsertVercelAuth = InferInsertModel<typeof vercelAuth>; 29 + 30 + export default vercelAuth;
+18
apps/modal-sandbox/src/schema/volumes.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { integer, pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 + 4 + const volumes = pgTable("volumes", { 5 + id: text("id") 6 + .primaryKey() 7 + .default(sql`volume_id()`), 8 + slug: text("slug").unique().notNull(), 9 + size: integer("size").notNull(), 10 + sizeUnit: text("size_unit").notNull(), 11 + createdAt: timestamp("created_at").defaultNow().notNull(), 12 + updatedAt: timestamp("updated_at").defaultNow().notNull(), 13 + }); 14 + 15 + export type SelectVolume = InferSelectModel<typeof volumes>; 16 + export type InsertVolume = InferInsertModel<typeof volumes>; 17 + 18 + export default volumes;
+11
apps/modal-sandbox/src/types/preset.ts
··· 1 + import z from "zod"; 2 + 3 + export const PresetSchema = z.array( 4 + z.object({ 5 + name: z.string().optional(), 6 + if: z.string().optional(), 7 + run: z.string(), 8 + }), 9 + ); 10 + 11 + export type Preset = z.infer<typeof PresetSchema>;
+8
apps/modal-sandbox/src/types/pull.ts
··· 1 + import { z } from "zod"; 2 + 3 + export const pullSchema = z.object({ 4 + uuid: z.string(), 5 + directoryPath: z.string(), 6 + }); 7 + 8 + export type PullDirectoryParams = z.infer<typeof pullSchema>;
+7
apps/modal-sandbox/src/types/push.ts
··· 1 + import { z } from "zod"; 2 + 3 + export const pushSchema = z.object({ 4 + directoryPath: z.string(), 5 + }); 6 + 7 + export type PushDirectoryParams = z.infer<typeof pushSchema>;
+213
apps/modal-sandbox/src/types/sandbox.ts
··· 1 + import * as R from "ramda"; 2 + import { z } from "zod"; 3 + 4 + const enforceUniqueNames = (items: Array<{ name: string }>) => { 5 + const duplicates = R.pipe( 6 + R.groupBy<{ name: string }, string>(R.prop("name")), 7 + R.filter((group: any) => group.length > 1), 8 + R.keys, 9 + )(items); 10 + 11 + if (duplicates.length > 0) { 12 + throw new Error(`Duplicate names found: ${duplicates.join(", ")}`); 13 + } 14 + 15 + return items; 16 + }; 17 + 18 + export const SecretSchema = z.object({ 19 + name: z.string(), 20 + value: z.string(), 21 + }); 22 + 23 + export type Secret = z.infer<typeof SecretSchema>; 24 + 25 + export const VariableSchema = z.object({ 26 + name: z.string(), 27 + value: z.string(), 28 + }); 29 + 30 + export const SandboxConfigSchema = z 31 + .object({ 32 + name: z.string().optional(), 33 + description: z.string().optional(), 34 + provider: z 35 + .enum(["daytona", "vercel", "deno", "sprites", "modal"]) 36 + .optional() 37 + .default("deno"), 38 + base: z.enum(["openclaw"]).optional().default("openclaw"), 39 + keepAlive: z.boolean().optional().default(false), 40 + spriteToken: z.string().optional(), 41 + redactedSpriteToken: z.string().optional(), 42 + daytonaOrganizationId: z.string().optional(), 43 + denoDeployToken: z.string().optional(), 44 + redactedDenoDeployToken: z.string().optional(), 45 + redactedDaytonaApiKey: z.string().optional(), 46 + daytonaApiKey: z.string().optional(), 47 + vercelApiToken: z.string().optional(), 48 + redactedVercelApiToken: z.string().optional(), 49 + vercelProjectId: z.string().optional(), 50 + vercelTeamId: z.string().optional(), 51 + modalTokenId: z.string().optional(), 52 + redactedModalTokenId: z.string().optional(), 53 + modalTokenSecret: z.string().optional(), 54 + redactedModalTokenSecret: z.string().optional(), 55 + vcpus: z.number().optional().default(2), 56 + memory: z.number().optional().default(4), 57 + disk: z.number().optional().default(3), 58 + sleepAfter: z 59 + .string() 60 + .regex( 61 + /^\d+(h|m|s)$/, 62 + "Invalid format. Use a number followed by 'h', 'm', or 's' (e.g., '1h', '30m', '15s').", 63 + ) 64 + .optional(), 65 + variables: z 66 + .array(VariableSchema) 67 + .optional() 68 + .default([]) 69 + .refine( 70 + (secrets) => { 71 + enforceUniqueNames(secrets); 72 + return true; 73 + }, 74 + { message: "Duplicate secret names are not allowed." }, 75 + ), 76 + secrets: z 77 + .array(SecretSchema) 78 + .optional() 79 + .default([]) 80 + .refine( 81 + (secrets) => { 82 + enforceUniqueNames(secrets); 83 + return true; 84 + }, 85 + { message: "Duplicate secret names are not allowed." }, 86 + ), 87 + }) 88 + .superRefine((data, ctx) => { 89 + if (data.provider === "sprites") { 90 + if (!data.spriteToken) { 91 + ctx.addIssue({ 92 + code: z.ZodIssueCode.custom, 93 + message: "spriteToken is required when provider is 'sprites'", 94 + path: ["spriteToken"], 95 + }); 96 + } 97 + if (!data.redactedSpriteToken) { 98 + ctx.addIssue({ 99 + code: z.ZodIssueCode.custom, 100 + message: "redactedSpriteToken is required when provider is 'sprites'", 101 + path: ["redactedSpriteToken"], 102 + }); 103 + } 104 + } 105 + 106 + if (data.provider === "daytona") { 107 + if (!data.daytonaApiKey) { 108 + ctx.addIssue({ 109 + code: z.ZodIssueCode.custom, 110 + message: "daytonaApiKey is required when provider is 'daytona'", 111 + path: ["daytonaApiKey"], 112 + }); 113 + } 114 + if (!data.redactedDaytonaApiKey) { 115 + ctx.addIssue({ 116 + code: z.ZodIssueCode.custom, 117 + message: 118 + "redactedDaytonaApiKey is required when provider is 'daytona'", 119 + path: ["redactedDaytonaApiKey"], 120 + }); 121 + } 122 + if (!data.daytonaOrganizationId) { 123 + ctx.addIssue({ 124 + code: z.ZodIssueCode.custom, 125 + message: 126 + "daytonaOrganizationId is required when provider is 'daytona'", 127 + path: ["daytonaOrganizationId"], 128 + }); 129 + } 130 + } 131 + 132 + if (data.provider === "deno") { 133 + if (!data.denoDeployToken) { 134 + ctx.addIssue({ 135 + code: z.ZodIssueCode.custom, 136 + message: "denoDeployToken is required when provider is 'deno'", 137 + path: ["denoDeployToken"], 138 + }); 139 + } 140 + if (!data.redactedDenoDeployToken) { 141 + ctx.addIssue({ 142 + code: z.ZodIssueCode.custom, 143 + message: 144 + "redactedDenoDeployToken is required when provider is 'deno'", 145 + path: ["redactedDenoDeployToken"], 146 + }); 147 + } 148 + } 149 + 150 + if (data.provider === "vercel") { 151 + if (!data.vercelApiToken) { 152 + ctx.addIssue({ 153 + code: z.ZodIssueCode.custom, 154 + message: "vercelApiKey is required when provider is 'vercel'", 155 + path: ["vercelApiKey"], 156 + }); 157 + } 158 + if (!data.redactedVercelApiToken) { 159 + ctx.addIssue({ 160 + code: z.ZodIssueCode.custom, 161 + message: "redactedVercelApiKey is required when provider is 'vercel'", 162 + path: ["redactedVercelApiKey"], 163 + }); 164 + } 165 + if (!data.vercelProjectId) { 166 + ctx.addIssue({ 167 + code: z.ZodIssueCode.custom, 168 + message: "vercelProjectId is required when provider is 'vercel'", 169 + path: ["vercelProjectId"], 170 + }); 171 + } 172 + } 173 + 174 + if (data.provider === "modal") { 175 + if (!data.modalTokenId) { 176 + ctx.addIssue({ 177 + code: z.ZodIssueCode.custom, 178 + message: "modalTokenId is required when provider is 'modal'", 179 + path: ["modalTokenId"], 180 + }); 181 + } 182 + if (!data.redactedModalTokenId) { 183 + ctx.addIssue({ 184 + code: z.ZodIssueCode.custom, 185 + message: "redactedModalTokenId is required when provider is 'modal'", 186 + path: ["redactedModalTokenId"], 187 + }); 188 + } 189 + if (!data.modalTokenSecret) { 190 + ctx.addIssue({ 191 + code: z.ZodIssueCode.custom, 192 + message: "modalTokenSecret is required when provider is 'modal'", 193 + path: ["modalTokenSecret"], 194 + }); 195 + } 196 + if (!data.redactedModalTokenSecret) { 197 + ctx.addIssue({ 198 + code: z.ZodIssueCode.custom, 199 + message: 200 + "redactedModalTokenSecret is required when provider is 'modal'", 201 + path: ["redactedModalTokenSecret"], 202 + }); 203 + } 204 + } 205 + }); 206 + 207 + export const StartSandboxInputSchema = z.object({ 208 + repo: z.string().optional(), 209 + }); 210 + 211 + export type SandboxConfig = z.infer<typeof SandboxConfigSchema>; 212 + 213 + export type StartSandboxInput = z.infer<typeof StartSandboxInputSchema>;
+23
apps/modal-sandbox/src/workers.ts
··· 1 + export const workers: Record<string, string> = { 2 + amp: "https://amp.pocketenv.io", 3 + "claude-code": "https://claudecode.pocketenv.io", 4 + codex: "https://codex.pocketenv.io", 5 + copilot: "https://copilot.pocketenv.io", 6 + crush: "https://crush.pocketenv.io", 7 + docker: "https://docker.pocketenv.io", 8 + gemini: "https://gemini.pocketenv.io", 9 + kilo: "https://kilo.pocketenv.io", 10 + kiro: "https://kiro.pocketenv.io", 11 + mise: "https://mise.pocketenv.io", 12 + nix: "https://nix.pocketenv.io", 13 + nullclaw: "https://nullclaw.pocketenv.io", 14 + openclaw: "https://openclaw.pocketenv.io", 15 + opencode: "https://opencode.pocketenv.io", 16 + opencrust: "https://opencrust.pocketenv.io", 17 + picoclaw: "https://picoclaw.pocketenv.io", 18 + pkgx: "https://pkgx.pocketenv.io", 19 + zeroclaw: "https://zeroclaw.pocketenv.io", 20 + wasmer: "https://wasmer.pocketenv.io", 21 + nanoclaw: "https://nanoclaw.pocketenv.io", 22 + cursor: "https://cursor.pocketenv.io", 23 + };
+36
apps/modal-sandbox/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + // Environment setup & latest features 4 + "lib": ["ESNext"], 5 + "target": "ESNext", 6 + "module": "ESNext", 7 + "moduleDetection": "force", 8 + "jsx": "react-jsx", 9 + "allowJs": true, 10 + "allowSyntheticDefaultImports": true, 11 + 12 + // Bundler mode 13 + "moduleResolution": "bundler", 14 + "allowImportingTsExtensions": true, 15 + "allowArbitraryExtensions": true, 16 + "verbatimModuleSyntax": true, 17 + "noEmit": true, 18 + 19 + "rootDir": ".", 20 + "baseUrl": "src", 21 + 22 + // Best practices 23 + "strict": true, 24 + "skipLibCheck": true, 25 + "noFallthroughCasesInSwitch": true, 26 + "noUncheckedIndexedAccess": true, 27 + "noImplicitOverride": true, 28 + 29 + // Some stricter flags (disabled by default) 30 + "noUnusedLocals": false, 31 + "noUnusedParameters": false, 32 + "noPropertyAccessFromIndexSignature": false, 33 + }, 34 + "exclude": ["node_modules", "dist", "tests"], 35 + "include": ["src", "scripts", "types"], 36 + }
+4
apps/modal-sandbox/types/yaml.d.ts
··· 1 + declare module "*.yaml" { 2 + const content: string; 3 + export default content; 4 + }
-2
apps/sandbox/src/providers/modal/mod.ts
··· 145 145 tokenId: options.modalTokenId || env.MODAL_TOKEN_ID!, 146 146 tokenSecret: options.modalTokenSecret || env.MODAL_TOKEN_SECRET!, 147 147 }); 148 - consola.log(options.modalTokenId, env.MODAL_TOKEN_ID); 149 - consola.log(options.modalTokenSecret, env.MODAL_TOKEN_SECRET); 150 148 consola.info("Creating Modal sandbox with app name:", modalAppName); 151 149 const app = await modal.apps.fromName( 152 150 options.modalAppName || modalAppName,