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 push/pull directory functionality

Add sandbox API lexicons and xrpc handlers for pushDirectory and
pullDirectory. Implement CLI support to compress and upload directories
and trigger pulls into sandboxes. Add Cloudflare Workers R2 bucket
bindings, types, and schema updates, plus small related refactors.

+1269 -299
+34
apps/api/lexicons/sandbox/pullDirectory.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.pocketenv.sandbox.pullDirectory", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Pull a directory from the cp storage into a Sandbox.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "sandboxId", 14 + "directoryPath" 15 + ], 16 + "properties": { 17 + "sandboxId": { 18 + "type": "string", 19 + "description": "ID of the Sandbox into which to pull the directory." 20 + }, 21 + "uuid": { 22 + "type": "string", 23 + "description": "ID of the directory in cp storage to pull into the Sandbox." 24 + }, 25 + "directoryPath": { 26 + "type": "string", 27 + "description": "Destination path within the Sandbox where the directory should be pulled. This should be an absolute path." 28 + } 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+42
apps/api/lexicons/sandbox/pushDirectory.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.pocketenv.sandbox.pushDirectory", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Push a directory from a Sandbox to the cp Storage.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "sandboxId", 14 + "directoryPath" 15 + ], 16 + "properties": { 17 + "sandboxId": { 18 + "type": "string", 19 + "description": "ID of the source Sandbox to read the directory from." 20 + }, 21 + "directoryPath": { 22 + "type": "string", 23 + "description": "Path of the directory within the Sandbox to push to cp storage. This should be an absolute path." 24 + } 25 + } 26 + } 27 + }, 28 + "output": { 29 + "encoding": "application/json", 30 + "schema": { 31 + "type": "object", 32 + "properties": { 33 + "uuid": { 34 + "type": "string", 35 + "description": "The UUID of the pushed directory in cp storage. This can be used to reference the directory in other API calls, such as creating a file from the directory or sharing the directory with another sandbox." 36 + } 37 + } 38 + } 39 + } 40 + } 41 + } 42 + }
+32
apps/api/pkl/defs/sandbox/pullDirectory.pkl
··· 1 + amends "../../schema/lexicon.pkl" 2 + 3 + lexicon = 1 4 + id = "io.pocketenv.sandbox.pullDirectory" 5 + defs = new Mapping<String, Procedure> { 6 + ["main"] { 7 + type = "procedure" 8 + description = "Pull a directory from the cp storage into a Sandbox." 9 + input { 10 + encoding = "application/json" 11 + schema = new ObjectType { 12 + type = "object" 13 + required = List("sandboxId", "directoryPath") 14 + properties { 15 + ["sandboxId"] = new StringType { 16 + type = "string" 17 + description = "ID of the Sandbox into which to pull the directory." 18 + } 19 + ["uuid"] = new StringType { 20 + type = "string" 21 + description = "ID of the directory in cp storage to pull into the Sandbox." 22 + } 23 + ["directoryPath"] = new StringType { 24 + type = "string" 25 + description = 26 + "Destination path within the Sandbox where the directory should be pulled. This should be an absolute path." 27 + } 28 + } 29 + } 30 + } 31 + } 32 + }
+41
apps/api/pkl/defs/sandbox/pushDirectory.pkl
··· 1 + amends "../../schema/lexicon.pkl" 2 + 3 + lexicon = 1 4 + id = "io.pocketenv.sandbox.pushDirectory" 5 + defs = new Mapping<String, Procedure> { 6 + ["main"] { 7 + type = "procedure" 8 + description = "Push a directory from a Sandbox to the cp Storage." 9 + input { 10 + encoding = "application/json" 11 + schema = new ObjectType { 12 + type = "object" 13 + required = List("sandboxId", "directoryPath") 14 + properties { 15 + ["sandboxId"] = new StringType { 16 + type = "string" 17 + description = "ID of the source Sandbox to read the directory from." 18 + } 19 + ["directoryPath"] = new StringType { 20 + type = "string" 21 + description = 22 + "Path of the directory within the Sandbox to push to cp storage. This should be an absolute path." 23 + } 24 + } 25 + } 26 + } 27 + output { 28 + encoding = "application/json" 29 + schema = new ObjectType { 30 + type = "object" 31 + properties { 32 + ["uuid"] = new StringType { 33 + type = "string" 34 + description = 35 + "The UUID of the pushed directory in cp storage. This can be used to reference the directory in other API calls, such as creating a file from the directory or sharing the directory with another sandbox." 36 + } 37 + } 38 + } 39 + } 40 + } 41 + }
+24
apps/api/src/lexicon/index.ts
··· 32 32 import type * as IoPocketenvSandboxGetSshKeys from "./types/io/pocketenv/sandbox/getSshKeys"; 33 33 import type * as IoPocketenvSandboxGetTailscaleAuthKey from "./types/io/pocketenv/sandbox/getTailscaleAuthKey"; 34 34 import type * as IoPocketenvSandboxGetTailscaleToken from "./types/io/pocketenv/sandbox/getTailscaleToken"; 35 + import type * as IoPocketenvSandboxPullDirectory from "./types/io/pocketenv/sandbox/pullDirectory"; 36 + import type * as IoPocketenvSandboxPushDirectory from "./types/io/pocketenv/sandbox/pushDirectory"; 35 37 import type * as IoPocketenvSandboxPutPreferences from "./types/io/pocketenv/sandbox/putPreferences"; 36 38 import type * as IoPocketenvSandboxPutSshKeys from "./types/io/pocketenv/sandbox/putSshKeys"; 37 39 import type * as IoPocketenvSandboxPutTailscaleAuthKey from "./types/io/pocketenv/sandbox/putTailscaleAuthKey"; ··· 386 388 >, 387 389 ) { 388 390 const nsid = "io.pocketenv.sandbox.getTailscaleToken"; // @ts-ignore 391 + return this._server.xrpc.method(nsid, cfg); 392 + } 393 + 394 + pullDirectory<AV extends AuthVerifier>( 395 + cfg: ConfigOf< 396 + AV, 397 + IoPocketenvSandboxPullDirectory.Handler<ExtractAuth<AV>>, 398 + IoPocketenvSandboxPullDirectory.HandlerReqCtx<ExtractAuth<AV>> 399 + >, 400 + ) { 401 + const nsid = "io.pocketenv.sandbox.pullDirectory"; // @ts-ignore 402 + return this._server.xrpc.method(nsid, cfg); 403 + } 404 + 405 + pushDirectory<AV extends AuthVerifier>( 406 + cfg: ConfigOf< 407 + AV, 408 + IoPocketenvSandboxPushDirectory.Handler<ExtractAuth<AV>>, 409 + IoPocketenvSandboxPushDirectory.HandlerReqCtx<ExtractAuth<AV>> 410 + >, 411 + ) { 412 + const nsid = "io.pocketenv.sandbox.pushDirectory"; // @ts-ignore 389 413 return this._server.xrpc.method(nsid, cfg); 390 414 } 391 415
+78
apps/api/src/lexicon/lexicons.ts
··· 1518 1518 }, 1519 1519 }, 1520 1520 }, 1521 + IoPocketenvSandboxPullDirectory: { 1522 + lexicon: 1, 1523 + id: "io.pocketenv.sandbox.pullDirectory", 1524 + defs: { 1525 + main: { 1526 + type: "procedure", 1527 + description: "Pull a directory from the cp storage into a Sandbox.", 1528 + input: { 1529 + encoding: "application/json", 1530 + schema: { 1531 + type: "object", 1532 + required: ["sandboxId", "directoryPath"], 1533 + properties: { 1534 + sandboxId: { 1535 + type: "string", 1536 + description: 1537 + "ID of the Sandbox into which to pull the directory.", 1538 + }, 1539 + uuid: { 1540 + type: "string", 1541 + description: 1542 + "ID of the directory in cp storage to pull into the Sandbox.", 1543 + }, 1544 + directoryPath: { 1545 + type: "string", 1546 + description: 1547 + "Destination path within the Sandbox where the directory should be pulled. This should be an absolute path.", 1548 + }, 1549 + }, 1550 + }, 1551 + }, 1552 + }, 1553 + }, 1554 + }, 1555 + IoPocketenvSandboxPushDirectory: { 1556 + lexicon: 1, 1557 + id: "io.pocketenv.sandbox.pushDirectory", 1558 + defs: { 1559 + main: { 1560 + type: "procedure", 1561 + description: "Push a directory from a Sandbox to the cp Storage.", 1562 + input: { 1563 + encoding: "application/json", 1564 + schema: { 1565 + type: "object", 1566 + required: ["sandboxId", "directoryPath"], 1567 + properties: { 1568 + sandboxId: { 1569 + type: "string", 1570 + description: 1571 + "ID of the source Sandbox to read the directory from.", 1572 + }, 1573 + directoryPath: { 1574 + type: "string", 1575 + description: 1576 + "Path of the directory within the Sandbox to push to cp storage. This should be an absolute path.", 1577 + }, 1578 + }, 1579 + }, 1580 + }, 1581 + output: { 1582 + encoding: "application/json", 1583 + schema: { 1584 + type: "object", 1585 + properties: { 1586 + uuid: { 1587 + type: "string", 1588 + description: 1589 + "The UUID of the pushed directory in cp storage. This can be used to reference the directory in other API calls, such as creating a file from the directory or sharing the directory with another sandbox.", 1590 + }, 1591 + }, 1592 + }, 1593 + }, 1594 + }, 1595 + }, 1596 + }, 1521 1597 IoPocketenvSandboxPutPreferences: { 1522 1598 lexicon: 1, 1523 1599 id: "io.pocketenv.sandbox.putPreferences", ··· 2935 3011 IoPocketenvSandboxGetTailscaleAuthKey: 2936 3012 "io.pocketenv.sandbox.getTailscaleAuthKey", 2937 3013 IoPocketenvSandboxGetTailscaleToken: "io.pocketenv.sandbox.getTailscaleToken", 3014 + IoPocketenvSandboxPullDirectory: "io.pocketenv.sandbox.pullDirectory", 3015 + IoPocketenvSandboxPushDirectory: "io.pocketenv.sandbox.pushDirectory", 2938 3016 IoPocketenvSandboxPutPreferences: "io.pocketenv.sandbox.putPreferences", 2939 3017 IoPocketenvSandboxPutSshKeys: "io.pocketenv.sandbox.putSshKeys", 2940 3018 IoPocketenvSandboxPutTailscaleAuthKey:
+44
apps/api/src/lexicon/types/io/pocketenv/sandbox/pullDirectory.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import type express from "express"; 5 + import { ValidationResult, BlobRef } from "@atproto/lexicon"; 6 + import { lexicons } from "../../../../lexicons"; 7 + import { isObj, hasProp } from "../../../../util"; 8 + import { CID } from "multiformats/cid"; 9 + import { type HandlerAuth, HandlerPipeThrough } from "@atproto/xrpc-server"; 10 + 11 + export type QueryParams = {}; 12 + 13 + export interface InputSchema { 14 + /** ID of the Sandbox into which to pull the directory. */ 15 + sandboxId: string; 16 + /** ID of the directory in cp storage to pull into the Sandbox. */ 17 + uuid?: string; 18 + /** Destination path within the Sandbox where the directory should be pulled. This should be an absolute path. */ 19 + directoryPath: string; 20 + [k: string]: unknown; 21 + } 22 + 23 + export interface HandlerInput { 24 + encoding: "application/json"; 25 + body: InputSchema; 26 + } 27 + 28 + export interface HandlerError { 29 + status: number; 30 + message?: string; 31 + } 32 + 33 + export type HandlerOutput = HandlerError | void; 34 + export type HandlerReqCtx<HA extends HandlerAuth = never> = { 35 + auth: HA; 36 + params: QueryParams; 37 + input: HandlerInput; 38 + req: express.Request; 39 + res: express.Response; 40 + resetRouteRateLimits: () => Promise<void>; 41 + }; 42 + export type Handler<HA extends HandlerAuth = never> = ( 43 + ctx: HandlerReqCtx<HA>, 44 + ) => Promise<HandlerOutput> | HandlerOutput;
+54
apps/api/src/lexicon/types/io/pocketenv/sandbox/pushDirectory.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import type express from "express"; 5 + import { ValidationResult, BlobRef } from "@atproto/lexicon"; 6 + import { lexicons } from "../../../../lexicons"; 7 + import { isObj, hasProp } from "../../../../util"; 8 + import { CID } from "multiformats/cid"; 9 + import type { HandlerAuth, HandlerPipeThrough } from "@atproto/xrpc-server"; 10 + 11 + export type QueryParams = {}; 12 + 13 + export interface InputSchema { 14 + /** ID of the source Sandbox to read the directory from. */ 15 + sandboxId: string; 16 + /** Path of the directory within the Sandbox to push to cp storage. This should be an absolute path. */ 17 + directoryPath: string; 18 + [k: string]: unknown; 19 + } 20 + 21 + export interface OutputSchema { 22 + /** The UUID of the pushed directory in cp storage. This can be used to reference the directory in other API calls, such as creating a file from the directory or sharing the directory with another sandbox. */ 23 + uuid?: string; 24 + [k: string]: unknown; 25 + } 26 + 27 + export interface HandlerInput { 28 + encoding: "application/json"; 29 + body: InputSchema; 30 + } 31 + 32 + export interface HandlerSuccess { 33 + encoding: "application/json"; 34 + body: OutputSchema; 35 + headers?: { [key: string]: string }; 36 + } 37 + 38 + export interface HandlerError { 39 + status: number; 40 + message?: string; 41 + } 42 + 43 + export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough; 44 + export type HandlerReqCtx<HA extends HandlerAuth = never> = { 45 + auth: HA; 46 + params: QueryParams; 47 + input: HandlerInput; 48 + req: express.Request; 49 + res: express.Response; 50 + resetRouteRateLimits: () => Promise<void>; 51 + }; 52 + export type Handler<HA extends HandlerAuth = never> = ( 53 + ctx: HandlerReqCtx<HA>, 54 + ) => Promise<HandlerOutput> | HandlerOutput;
+1 -1
apps/api/src/pty/pty-tunnel/index.ts
··· 1 - export { type Message } from "./messages"; 1 + export type { Message } from "./messages"; 2 2 export { createListener, type Listener } from "./websocket";
+1 -3
apps/api/src/schema/sandbox-cp.ts
··· 2 2 import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; 3 3 4 4 const sandboxCp = pgTable("sandbox_cp", { 5 - id: text("id") 6 - .primaryKey() 7 - .default(sql`xata_id()`), 5 + id: text("id").primaryKey().default(sql`xata_id()`), 8 6 copyUuid: text("copy_uuid").unique().notNull(), 9 7 createdAt: timestamp("created_at").defaultNow().notNull(), 10 8 });
+4
apps/api/src/xrpc/index.ts
··· 50 50 import updateService from "./io/pocketenv/service/updateService"; 51 51 import startService from "./io/pocketenv/service/startService"; 52 52 import stopService from "./io/pocketenv/service/stopService"; 53 + import pushDirectory from "./io/pocketenv/sandbox/pushDirectory"; 54 + import pullDirectory from "./io/pocketenv/sandbox/pullDirectory"; 53 55 54 56 export default function (server: Server, ctx: Context) { 55 57 // io.pocketenv ··· 106 108 updateService(server, ctx); 107 109 startService(server, ctx); 108 110 stopService(server, ctx); 111 + pushDirectory(server, ctx); 112 + pullDirectory(server, ctx); 109 113 110 114 return server; 111 115 }
+61
apps/api/src/xrpc/io/pocketenv/sandbox/pullDirectory.ts
··· 1 + import { XRPCError, type HandlerAuth } from "@atproto/xrpc-server"; 2 + import { Providers } from "consts"; 3 + import type { Context } from "context"; 4 + import { and, eq, or } from "drizzle-orm"; 5 + import type { Server } from "lexicon"; 6 + import type { InputSchema } from "lexicon/types/io/pocketenv/sandbox/pullDirectory"; 7 + import generateJwt from "lib/generateJwt"; 8 + import schema from "schema"; 9 + 10 + export default function (server: Server, ctx: Context) { 11 + const pullDirectory = async (input: InputSchema, auth: HandlerAuth) => { 12 + if (!auth.credentials) { 13 + throw new XRPCError(401, "Unauthorized"); 14 + } 15 + 16 + const record = await ctx.db 17 + .select() 18 + .from(schema.sandboxes) 19 + .leftJoin(schema.users, eq(schema.users.id, schema.sandboxes.userId)) 20 + .where( 21 + and( 22 + or( 23 + eq(schema.sandboxes.id, input.sandboxId), 24 + eq(schema.sandboxes.name, input.sandboxId), 25 + eq(schema.sandboxes.uri, input.sandboxId), 26 + ), 27 + eq(schema.users.did, auth.credentials.did), 28 + ), 29 + ) 30 + .execute() 31 + .then(([row]) => row); 32 + 33 + if (!record) { 34 + throw new XRPCError(404, "Sandbox not found"); 35 + } 36 + 37 + const sandbox = 38 + record.sandboxes.provider === Providers.CLOUDFLARE 39 + ? ctx.cfsandbox(record.sandboxes.base!) 40 + : ctx.sandbox(); 41 + 42 + await sandbox.post( 43 + `/v1/sandboxes/${record.sandboxes.id}/pull-directory`, 44 + { 45 + uuid: input.uuid, 46 + directoryPath: input.directoryPath, 47 + }, 48 + { 49 + headers: { 50 + Authorization: `Bearer ${await generateJwt(auth?.credentials?.did || "")}`, 51 + }, 52 + }, 53 + ); 54 + }; 55 + server.io.pocketenv.sandbox.pullDirectory({ 56 + auth: ctx.authVerifier, 57 + handler: async ({ input, auth }) => { 58 + await pullDirectory(input.body, auth); 59 + }, 60 + }); 61 + }
+66
apps/api/src/xrpc/io/pocketenv/sandbox/pushDirectory.ts
··· 1 + import { XRPCError, type HandlerAuth } from "@atproto/xrpc-server"; 2 + import { Providers } from "consts"; 3 + import type { Context } from "context"; 4 + import { and, eq, or } from "drizzle-orm"; 5 + import type { Server } from "lexicon"; 6 + import type { InputSchema } from "lexicon/types/io/pocketenv/sandbox/pushDirectory"; 7 + import generateJwt from "lib/generateJwt"; 8 + import schema from "schema"; 9 + 10 + export default function (server: Server, ctx: Context) { 11 + const pushDirectory = async (input: InputSchema, auth: HandlerAuth) => { 12 + if (!auth.credentials) { 13 + throw new XRPCError(401, "Unauthorized"); 14 + } 15 + 16 + const record = await ctx.db 17 + .select() 18 + .from(schema.sandboxes) 19 + .leftJoin(schema.users, eq(schema.users.id, schema.sandboxes.userId)) 20 + .where( 21 + and( 22 + or( 23 + eq(schema.sandboxes.id, input.sandboxId), 24 + eq(schema.sandboxes.name, input.sandboxId), 25 + eq(schema.sandboxes.uri, input.sandboxId), 26 + ), 27 + eq(schema.users.did, auth.credentials.did), 28 + ), 29 + ) 30 + .execute() 31 + .then(([row]) => row); 32 + 33 + if (!record) { 34 + throw new XRPCError(404, "Sandbox not found"); 35 + } 36 + 37 + const sandbox = 38 + record.sandboxes.provider === Providers.CLOUDFLARE 39 + ? ctx.cfsandbox(record.sandboxes.base!) 40 + : ctx.sandbox(); 41 + 42 + const response = await sandbox.post<{ uuid: string }>( 43 + `/v1/sandboxes/${record.sandboxes.id}/push-directory`, 44 + { 45 + directoryPath: input.directoryPath, 46 + }, 47 + { 48 + headers: { 49 + Authorization: `Bearer ${await generateJwt(auth?.credentials?.did || "")}`, 50 + }, 51 + }, 52 + ); 53 + 54 + return response.data.uuid; 55 + }; 56 + server.io.pocketenv.sandbox.pushDirectory({ 57 + auth: ctx.authVerifier, 58 + handler: async ({ input, auth }) => { 59 + const uuid = await pushDirectory(input.body, auth); 60 + return { 61 + encoding: "application/json", 62 + body: { uuid }, 63 + }; 64 + }, 65 + }); 66 + }
+38 -38
apps/cf-sandbox/bun.lock
··· 26 26 "@types/pg": "^8.16.0", 27 27 "drizzle-kit": "^0.31.9", 28 28 "typescript": "^5.9.3", 29 - "wrangler": "^4.63.0", 29 + "wrangler": "^4.76.0", 30 30 }, 31 31 }, 32 32 }, ··· 37 37 38 38 "@cloudflare/sandbox": ["@cloudflare/sandbox@0.7.5", "", { "dependencies": { "@cloudflare/containers": "^0.0.30", "aws4fetch": "^1.0.20" }, "peerDependencies": { "@openai/agents": "^0.3.3", "@opencode-ai/sdk": "^1.1.40", "@xterm/xterm": ">=5.0.0" }, "optionalPeers": ["@openai/agents", "@opencode-ai/sdk", "@xterm/xterm"] }, "sha512-lOegEUL6eDsHrsxEMxqRcftsp46hn+ilQryCLuSDghHvnCdDAenzyN/E3nVjQdYAZnoh5xsLzis/G295LcZr1w=="], 39 39 40 - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.12.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20260115.0" } }, "sha512-NK4vN+2Z/GbfGS4BamtbbVk1rcu5RmqaYGiyHJQrA09AoxdZPHDF3W/EhgI0YSK8p3vRo/VNCtbSJFPON7FWMQ=="], 40 + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg=="], 41 41 42 - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260205.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ToOItqcirmWPwR+PtT+Q4bdjTn/63ZxhJKEfW4FNn7FxMTS1Tw5dml0T0mieOZbCpcvY8BdvPKFCSlJuI8IVHQ=="], 42 + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260401.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZSmceM70jH6k+/62VkEcmMNzrpr4kSctkX5Lsgqv38KktfhPY/hsh75y1lRoPWS3H3kgMa4p2pUSlidZR1u2hw=="], 43 43 44 - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260205.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-402ZqLz+LrG0NDXp7Hn7IZbI0DyhjNfjAlVenb0K3yod9KCuux0u3NksNBvqJx0mIGHvVR4K05h+jfT5BTHqGA=="], 44 + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260401.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7UKWF+IUZ3NXMVPsDg8Cjg0r58b+uYlfvs5Yt8bvtU+geCtW4P2MxRHmRSEo8SryckXOJjb/b8tcncgCykFu8g=="], 45 45 46 - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260205.0", "", { "os": "linux", "cpu": "x64" }, "sha512-rz9jBzazIA18RHY+osa19hvsPfr0LZI1AJzIjC6UqkKKphcTpHBEQ25Xt8cIA34ivMIqeENpYnnmpDFesLkfcQ=="], 46 + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260401.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MDWUH/0bvL/l9aauN8zEddyYOXId1OueqrUCXXENNJ95R/lSmF6OgGVuXaYhoIhxQkNiEJ/0NOlnVYj9mJq4dw=="], 47 47 48 - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260205.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jr6cKpMM/DBEbL+ATJ9rYue758CKp0SfA/nXt5vR32iINVJrb396ye9iat2y9Moa/PgPKnTrFgmT6urUmG3IUg=="], 48 + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260401.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-UgkzpMzVWM/bwbo3vjCTg2aoKfGcUhiEoQoDdo6RGWvbHRJyLVZ4VQCG9ZcISiztkiS2ICCoYOtPy6M/lV6Gcw=="], 49 49 50 - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260205.0", "", { "os": "win32", "cpu": "x64" }, "sha512-SMPW5jCZYOG7XFIglSlsgN8ivcl0pCrSAYxCwxtWvZ88whhcDB/aISNtiQiDZujPH8tIo2hE5dEkxW7tGEwc3A=="], 50 + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260401.1", "", { "os": "win32", "cpu": "x64" }, "sha512-HBLzcQF5iF4Qv20tQ++pG7xs3OsCnaIbc+GAi6fmhUKZhvmzvml/jwrQzLJ+MPm0cQo41K5OO/U3T4S8tvJetQ=="], 51 51 52 52 "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], 53 53 ··· 237 237 238 238 "libsodium-wrappers": ["libsodium-wrappers@0.8.2", "", { "dependencies": { "libsodium": "^0.8.0" } }, "sha512-VFLmfxkxo+U9q60tjcnSomQBRx2UzlRjKWJqvB4K1pUqsMQg4cu3QXA2nrcsj9A1qRsnJBbi2Ozx1hsiDoCkhw=="], 239 239 240 - "miniflare": ["miniflare@4.20260205.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.18.2", "workerd": "1.20260205.0", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": "bootstrap.js" }, "sha512-jG1TknEDeFqcq/z5gsOm1rKeg4cNG7ruWxEuiPxl3pnQumavxo8kFpeQC6XKVpAhh2PI9ODGyIYlgd77sTHl5g=="], 240 + "miniflare": ["miniflare@4.20260401.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.24.4", "workerd": "1.20260401.1", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-lngHPzZFN9sxYG/mhzvnWiBMNVAN5MsO/7g32ttJ07rymtiK/ZBalODTKb8Od+BQdlU5DOR4CjVt9NydjnUyYg=="], 241 241 242 242 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 243 243 ··· 295 295 296 296 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], 297 297 298 - "undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="], 298 + "undici": ["undici@7.24.4", "", {}, "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w=="], 299 299 300 300 "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], 301 301 ··· 303 303 304 304 "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=="], 305 305 306 - "workerd": ["workerd@1.20260205.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260205.0", "@cloudflare/workerd-darwin-arm64": "1.20260205.0", "@cloudflare/workerd-linux-64": "1.20260205.0", "@cloudflare/workerd-linux-arm64": "1.20260205.0", "@cloudflare/workerd-windows-64": "1.20260205.0" }, "bin": "bin/workerd" }, "sha512-CcMH5clHwrH8VlY7yWS9C/G/C8g9czIz1yU3akMSP9Z3CkEMFSoC3GGdj5G7Alw/PHEeez1+1IrlYger4pwu+w=="], 306 + "workerd": ["workerd@1.20260401.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260401.1", "@cloudflare/workerd-darwin-arm64": "1.20260401.1", "@cloudflare/workerd-linux-64": "1.20260401.1", "@cloudflare/workerd-linux-arm64": "1.20260401.1", "@cloudflare/workerd-windows-64": "1.20260401.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-mUYCd+ohaWJWF5nhDzxugWaAD/DM8Dw0ze3B7bu8JaA7S70+XQJXcvcvwE8C4qGcxSdCyqjsrFzqxKubECDwzg=="], 307 307 308 - "wrangler": ["wrangler@4.63.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.12.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260205.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260205.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260205.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-+R04jF7Eb8K3KRMSgoXpcIdLb8GC62eoSGusYh1pyrSMm/10E0hbKkd7phMJO4HxXc6R7mOHC5SSoX9eof30Uw=="], 308 + "wrangler": ["wrangler@4.80.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.16.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260401.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260401.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260401.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-2ZKF7uPeOZy65BGk3YfvqBCPo/xH1MrAlMmH9mVP+tCNBrTUMnwOHSj1HrZHgR8LttkAqhko0fGz+I4ax1rzyQ=="], 309 309 310 310 "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], 311 311 ··· 323 323 324 324 "@types/pg/@types/node": ["@types/node@24.10.12", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw=="], 325 325 326 - "wrangler/esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": "bin/esbuild" }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], 326 + "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], 327 327 328 328 "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], 329 329 ··· 369 369 370 370 "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], 371 371 372 - "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], 372 + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], 373 373 374 - "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="], 374 + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], 375 375 376 - "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="], 376 + "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], 377 377 378 - "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.0", "", { "os": "android", "cpu": "x64" }, "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="], 378 + "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], 379 379 380 - "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="], 380 + "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], 381 381 382 - "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="], 382 + "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], 383 383 384 - "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="], 384 + "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], 385 385 386 - "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="], 386 + "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], 387 387 388 - "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="], 388 + "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], 389 389 390 - "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="], 390 + "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], 391 391 392 - "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="], 392 + "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], 393 393 394 - "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="], 394 + "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], 395 395 396 - "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="], 396 + "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], 397 397 398 - "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="], 398 + "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], 399 399 400 - "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="], 400 + "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], 401 401 402 - "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="], 402 + "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], 403 403 404 - "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="], 404 + "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], 405 405 406 - "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="], 406 + "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], 407 407 408 - "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.0", "", { "os": "none", "cpu": "x64" }, "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="], 408 + "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], 409 409 410 - "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="], 410 + "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], 411 411 412 - "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="], 412 + "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], 413 413 414 - "wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="], 414 + "wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], 415 415 416 - "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="], 416 + "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], 417 417 418 - "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="], 418 + "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], 419 419 420 - "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="], 420 + "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], 421 421 422 - "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="], 422 + "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], 423 423 } 424 424 }
+6
apps/cf-sandbox/deploy/amp/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/claude/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/codex/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/copilot/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/crush/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/cursor/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/docker/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/gemini/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/kilo/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/kiro/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/mise/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/nanoclaw/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/nix/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/nullclaw/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/openclaw/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/opencode/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/opencrust/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/picoclaw/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/pkgx/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/wasmer/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+6
apps/cf-sandbox/deploy/zeroclaw/wrangler.jsonc
··· 15 15 "observability": { 16 16 "enabled": true, 17 17 }, 18 + "r2_buckets": [ 19 + { 20 + "binding": "POCKETENV_COPY", 21 + "bucket_name": "pocketenv-copy", 22 + }, 23 + ], 18 24 /** 19 25 * Smart Placement 20 26 * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
+84 -1
apps/cf-sandbox/src/index.ts
··· 4 4 import { getSandbox, proxyToSandbox, Sandbox } from "@cloudflare/sandbox"; 5 5 import { 6 6 files, 7 + sandboxCp, 7 8 sandboxes, 8 9 sandboxFiles, 9 10 sandboxPorts, ··· 39 40 import decrypt from "./lib/decrypt"; 40 41 import crypto from "node:crypto"; 41 42 import services from "./schema/services"; 43 + import { PushDirectoryParams, pushSchema } from "./types/push"; 44 + import { PullDirectoryParams, pullSchema } from "./types/pull"; 42 45 43 46 type Bindings = { 44 47 Sandbox: DurableObjectNamespace<Sandbox<Env>>; ··· 104 107 } 105 108 106 109 const fileBuffer = await file.arrayBuffer(); 107 - const uuid = crypto.randomUUID(); 110 + const uuid = c.req.query("uuid") || crypto.randomUUID(); 108 111 await env.POCKETENV_COPY.put(uuid, fileBuffer); 109 112 113 + c.executionCtx.waitUntil( 114 + c.var.db 115 + .insert(sandboxCp) 116 + .values({ 117 + copyUuid: uuid, 118 + }) 119 + .execute(), 120 + ); 121 + 110 122 return c.json({ uuid }); 123 + }); 124 + 125 + app.get("/cp/:uuid", async (c) => { 126 + const { uuid } = c.req.param(); 127 + const file = await env.POCKETENV_COPY.get(uuid); 128 + if (!file) { 129 + return c.json({ error: "File not found" }, 404); 130 + } 131 + return c.body(file.body, 200, { 132 + "Content-Type": "application/gzip", 133 + "Content-Disposition": `attachment; filename="${uuid}.tar.gz"`, 134 + }); 111 135 }); 112 136 113 137 app.post("/v1/sandboxes", async (c) => { ··· 958 982 console.log(`Failed to stop service:`, err); 959 983 } 960 984 return c.json({}); 985 + }); 986 + 987 + app.post("/v1/sandboxes/:sandboxId/pull-directory", async (c) => { 988 + const { sandboxes: record } = await getSandboxById( 989 + c.var.db, 990 + c.req.param("sandboxId"), 991 + ); 992 + 993 + if (!record) { 994 + return c.json({ error: "Sandbox not found" }, 404); 995 + } 996 + 997 + if (record.provider !== "cloudflare") { 998 + return c.json({ error: "Sandbox provider not supported" }, 400); 999 + } 1000 + 1001 + const params = await c.req.json<PullDirectoryParams>(); 1002 + await pullSchema.parseAsync(params); 1003 + 1004 + const outdir = crypto.randomUUID(); 1005 + 1006 + let sandbox: BaseSandbox | null = null; 1007 + 1008 + sandbox = await createSandbox("cloudflare", { 1009 + id: record.sandboxId!, 1010 + }); 1011 + await sandbox.sh`mkdir -p /tmp/${outdir} && cd /tmp/${outdir} && curl https://sandbox.pocketenv.io/cp/${params.uuid} -H "Authorization: ${token}" | tar xvf -`; 1012 + await sandbox.sh`cp -r /tmp/${outdir}/* ${params.directoryPath} || sudo cp -r /tmp/${outdir}/* ${params.directoryPath}`; 1013 + }); 1014 + 1015 + app.post("/v1/sandboxes/:sandboxId/push-directory", async (c) => { 1016 + const { sandboxes: record } = await getSandboxById( 1017 + c.var.db, 1018 + c.req.param("sandboxId"), 1019 + ); 1020 + 1021 + if (!record) { 1022 + return c.json({ error: "Sandbox not found" }, 404); 1023 + } 1024 + 1025 + if (record.provider !== "cloudflare") { 1026 + return c.json({ error: "Sandbox provider not supported" }, 400); 1027 + } 1028 + 1029 + const params = await c.req.json<PushDirectoryParams>(); 1030 + await pushSchema.parseAsync(params); 1031 + 1032 + const token = c.req.header("Authorization"); 1033 + await pushSchema.parseAsync(params); 1034 + const uuid = crypto.randomUUID(); 1035 + 1036 + let sandbox: BaseSandbox | null = null; 1037 + 1038 + sandbox = await createSandbox("cloudflare", { 1039 + id: record.sandboxId!, 1040 + }); 1041 + await sandbox.sh`cd /tmp && tar czvf ${uuid}.tar.gz ${params.directoryPath} && curl -X POST "https://sandbox.pocketenv.io/cp?uuid=${uuid}" -H "Authorization: ${token}" -F "file=@${uuid}.tar.gz" && rm ${uuid}.tar.gz`; 1042 + 1043 + return c.json({ uuid }); 961 1044 }); 962 1045 963 1046 export const getSandboxById = async (db: Context["db"], sandboxId: string) => {
+8
apps/cf-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/cf-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>;
+2
apps/cli/.gitignore
··· 32 32 33 33 # Finder (MacOS) folder config 34 34 .DS_Store 35 + 36 + result
+3 -13
apps/cli/bun.lock
··· 17 17 "envalid": "^8.1.1", 18 18 "eventsource": "^4.1.0", 19 19 "express": "^5.2.1", 20 - "glob": "^13.0.6", 20 + "ignore": "^7.0.5", 21 21 "libsodium-wrappers": "^0.8.2", 22 22 "open": "^11.0.0", 23 23 "ora": "^9.3.0", ··· 239 239 240 240 "axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], 241 241 242 - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 243 - 244 242 "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], 245 - 246 - "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 247 243 248 244 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 249 245 ··· 376 372 "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 377 373 378 374 "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], 379 - 380 - "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], 381 375 382 376 "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 383 377 ··· 393 387 394 388 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], 395 389 390 + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 391 + 396 392 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 397 393 398 394 "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], ··· 430 426 "libsodium-wrappers": ["libsodium-wrappers@0.8.2", "", { "dependencies": { "libsodium": "^0.8.0" } }, "sha512-VFLmfxkxo+U9q60tjcnSomQBRx2UzlRjKWJqvB4K1pUqsMQg4cu3QXA2nrcsj9A1qRsnJBbi2Ozx1hsiDoCkhw=="], 431 427 432 428 "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="], 433 - 434 - "lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], 435 429 436 430 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 437 431 ··· 451 445 452 446 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], 453 447 454 - "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 455 - 456 448 "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], 457 449 458 450 "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], ··· 480 472 "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 481 473 482 474 "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 483 - 484 - "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], 485 475 486 476 "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], 487 477
+1 -1
apps/cli/package.json
··· 50 50 "envalid": "^8.1.1", 51 51 "eventsource": "^4.1.0", 52 52 "express": "^5.2.1", 53 - "glob": "^13.0.6", 53 + "ignore": "^7.0.5", 54 54 "libsodium-wrappers": "^0.8.2", 55 55 "open": "^11.0.0", 56 56 "ora": "^9.3.0",
+116 -8
apps/cli/src/cmd/copy.ts
··· 1 - import consola from "consola"; 2 1 import ora from "ora"; 3 2 import { c } from "../theme"; 3 + import { glob, unlink } from "node:fs/promises"; 4 + import ignore from "ignore"; 5 + import { readFile, lstat } from "node:fs/promises"; 6 + import { join } from "node:path"; 7 + import * as tar from "tar"; 8 + import crypto from "node:crypto"; 9 + import consola from "consola"; 10 + import getAccessToken from "../lib/getAccessToken"; 11 + import { client } from "../client"; 4 12 5 13 async function copy(source: string, destination: string) { 6 14 const spinner = ora( 7 - `Copying sandbox from ${c.primary(source)} to ${c.primary(destination)}...`, 15 + `Copying files from ${c.primary(source)} to ${c.primary(destination)}...`, 8 16 ).start(); 9 17 10 - setTimeout(() => { 11 - spinner.color = "yellow"; 12 - spinner.text = "Loading rainbows"; 13 - spinner.stopAndPersist({ 14 - text: `Copied files from ${c.primary(source)} to ${c.primary(destination)}`, 18 + if (!source.includes(":/")) { 19 + const output = await compressDirectory(source); 20 + const uuid = await uploadToStorage(output); 21 + consola.info(`Uploaded to storage with UUID: ${uuid}`); 22 + await unlink(output); 23 + const sandboxId = destination.split(":/")[0]; 24 + await client.post( 25 + "/xrpc/io.pocketenv.sandbox.pullDirectory", 26 + { 27 + uuid, 28 + sandboxId, 29 + }, 30 + { 31 + headers: { 32 + Authorization: `Bearer ${process.env.POCKETENV_TOKEN || (await getAccessToken())}`, 33 + }, 34 + }, 35 + ); 36 + } 37 + 38 + spinner.stopAndPersist({ 39 + text: `Copied files from ${c.primary(source)} to ${c.primary(destination)}`, 40 + }); 41 + } 42 + 43 + async function loadIgnore(...files: string[]) { 44 + const ig = ignore(); 45 + for (const file of files) { 46 + try { 47 + ig.add(await readFile(file, "utf8")); 48 + } catch { 49 + // Ignore if the file doesn't exist 50 + } 51 + } 52 + return ig; 53 + } 54 + 55 + async function compressDirectory(source: string): Promise<string> { 56 + try { 57 + const ig = await loadIgnore( 58 + ".pocketenvignore", 59 + ".gitignore", 60 + ".npmignore", 61 + ".dockerignore", 62 + ); 63 + const allFiles = await Array.fromAsync( 64 + glob("**/*", { cwd: source, exclude: (path) => ig.ignores(path) }), 65 + ); 66 + const files = ( 67 + await Promise.all( 68 + allFiles.map(async (file) => { 69 + const stat = await lstat(join(source, file)); 70 + return stat.isSymbolicLink() ? null : file; 71 + }), 72 + ) 73 + ).filter((f): f is string => f !== null); 74 + 75 + const output = `${crypto 76 + .createHash("sha256") 77 + .update(source) 78 + .digest("hex")}.tar.gz`; 79 + 80 + await tar.create( 81 + { 82 + cwd: source, 83 + file: output, 84 + portable: true, 85 + gzip: { 86 + level: 6, 87 + }, 88 + }, 89 + files, 90 + ); 91 + 92 + return output; 93 + } catch (error) { 94 + consola.error("Failed to compress directory:", error); 95 + process.exit(1); 96 + } 97 + } 98 + 99 + async function uploadToStorage(filePath: string): Promise<string> { 100 + try { 101 + const token = await getAccessToken(); 102 + 103 + const fileBuffer = await readFile(filePath); 104 + const form = new FormData(); 105 + form.append( 106 + "file", 107 + new Blob([fileBuffer], { type: "application/gzip" }), 108 + "archive.tar.gz", 109 + ); 110 + 111 + const BASE_URL = "https://sandbox.pocketenv.io"; 112 + const response = await fetch(`${BASE_URL}/cp`, { 113 + method: "POST", 114 + headers: { 115 + Authorization: `Bearer ${process.env.POCKETENV_TOKEN || token}`, 116 + }, 117 + body: form, 15 118 }); 16 - }, 1000); 119 + const data = (await response.json()) as { uuid: string }; 120 + return data.uuid; 121 + } catch (error) { 122 + consola.error("Failed to upload", error); 123 + process.exit(1); 124 + } 17 125 } 18 126 19 127 export default copy;
+205 -234
apps/sandbox/deno.lock
··· 7 7 "jsr:@std/internal@^1.0.12": "1.0.12", 8 8 "jsr:@std/path@^1.1.2": "1.1.4", 9 9 "jsr:@std/path@^1.1.4": "1.1.4", 10 + "npm:@aws-sdk/client-s3@^3.1024.0": "3.1024.0", 10 11 "npm:@daytonaio/sdk@0.141": "0.141.0_@aws-sdk+client-s3@3.988.0_@opentelemetry+api@1.9.0_ws@8.19.0", 11 12 "npm:@fly/sprites@^0.0.1": "0.0.1", 12 13 "npm:@tsndr/cloudflare-worker-jwt@^3.2.1": "3.2.1", ··· 123 124 "tslib" 124 125 ] 125 126 }, 126 - "@aws-sdk/client-s3@3.988.0": { 127 - "integrity": "sha512-mt7AdkieJJ5hEKeCxH4sdTTd679shUjo/cUvNY0fUHgQIPZa1jRuekTXnRytRrEwdrZWJDx56n1S8ism2uX7jg==", 127 + "@aws-sdk/client-s3@3.1024.0": { 128 + "integrity": "sha512-8qdO5aLCzaf9l0RdrSBW1iIroRKP2QBqtZ6lkrtHKiaaH0B18xEn+lrEgiN/eCf3uRAYk4cqbnI2XcWzm+7dDQ==", 128 129 "dependencies": [ 129 130 "@aws-crypto/sha1-browser", 130 131 "@aws-crypto/sha256-browser", ··· 178 179 "@smithy/util-middleware", 179 180 "@smithy/util-retry", 180 181 "@smithy/util-stream", 181 - "@smithy/util-utf8@4.2.0", 182 + "@smithy/util-utf8@4.2.2", 182 183 "@smithy/util-waiter", 183 184 "tslib" 184 185 ] 185 186 }, 186 - "@aws-sdk/client-sso@3.988.0": { 187 - "integrity": "sha512-ThqQ7aF1k0Zz4yJRwegHw+T1rM3a7ZPvvEUSEdvn5Z8zTeWgJAbtqW/6ejPsMLmFOlHgNcwDQN/e69OvtEOoIQ==", 188 - "dependencies": [ 189 - "@aws-crypto/sha256-browser", 190 - "@aws-crypto/sha256-js", 191 - "@aws-sdk/core", 192 - "@aws-sdk/middleware-host-header", 193 - "@aws-sdk/middleware-logger", 194 - "@aws-sdk/middleware-recursion-detection", 195 - "@aws-sdk/middleware-user-agent", 196 - "@aws-sdk/region-config-resolver", 197 - "@aws-sdk/types", 198 - "@aws-sdk/util-endpoints", 199 - "@aws-sdk/util-user-agent-browser", 200 - "@aws-sdk/util-user-agent-node", 201 - "@smithy/config-resolver", 202 - "@smithy/core", 203 - "@smithy/fetch-http-handler", 204 - "@smithy/hash-node", 205 - "@smithy/invalid-dependency", 206 - "@smithy/middleware-content-length", 207 - "@smithy/middleware-endpoint", 208 - "@smithy/middleware-retry", 209 - "@smithy/middleware-serde", 210 - "@smithy/middleware-stack", 211 - "@smithy/node-config-provider", 212 - "@smithy/node-http-handler", 213 - "@smithy/protocol-http", 214 - "@smithy/smithy-client", 215 - "@smithy/types", 216 - "@smithy/url-parser", 217 - "@smithy/util-base64", 218 - "@smithy/util-body-length-browser", 219 - "@smithy/util-body-length-node", 220 - "@smithy/util-defaults-mode-browser", 221 - "@smithy/util-defaults-mode-node", 222 - "@smithy/util-endpoints", 223 - "@smithy/util-middleware", 224 - "@smithy/util-retry", 225 - "@smithy/util-utf8@4.2.0", 226 - "tslib" 227 - ] 228 - }, 229 - "@aws-sdk/core@3.973.8": { 230 - "integrity": "sha512-WeYJ2sfvRLbbUIrjGMUXcEHGu5SJk53jz3K9F8vFP42zWyROzPJ2NB6lMu9vWl5hnMwzwabX7pJc9Euh3JyMGw==", 187 + "@aws-sdk/core@3.973.26": { 188 + "integrity": "sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==", 231 189 "dependencies": [ 232 190 "@aws-sdk/types", 233 191 "@aws-sdk/xml-builder", ··· 240 198 "@smithy/types", 241 199 "@smithy/util-base64", 242 200 "@smithy/util-middleware", 243 - "@smithy/util-utf8@4.2.0", 201 + "@smithy/util-utf8@4.2.2", 244 202 "tslib" 245 203 ] 246 204 }, 247 - "@aws-sdk/crc64-nvme@3.972.0": { 248 - "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", 205 + "@aws-sdk/crc64-nvme@3.972.5": { 206 + "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", 249 207 "dependencies": [ 250 208 "@smithy/types", 251 209 "tslib" 252 210 ] 253 211 }, 254 - "@aws-sdk/credential-provider-env@3.972.6": { 255 - "integrity": "sha512-+dYEBWgTqkQQHFUllvBL8SLyXyLKWdxLMD1LmKJRvmb0NMJuaJFG/qg78C+LE67eeGbipYcE+gJ48VlLBGHlMw==", 212 + "@aws-sdk/credential-provider-env@3.972.24": { 213 + "integrity": "sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==", 256 214 "dependencies": [ 257 215 "@aws-sdk/core", 258 216 "@aws-sdk/types", ··· 261 219 "tslib" 262 220 ] 263 221 }, 264 - "@aws-sdk/credential-provider-http@3.972.8": { 265 - "integrity": "sha512-z3QkozMV8kOFisN2pgRag/f0zPDrw96mY+ejAM0xssV/+YQ2kklbylRNI/TcTQUDnGg0yPxNjyV6F2EM2zPTwg==", 222 + "@aws-sdk/credential-provider-http@3.972.26": { 223 + "integrity": "sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==", 266 224 "dependencies": [ 267 225 "@aws-sdk/core", 268 226 "@aws-sdk/types", ··· 276 234 "tslib" 277 235 ] 278 236 }, 279 - "@aws-sdk/credential-provider-ini@3.972.6": { 280 - "integrity": "sha512-6tkIYFv3sZH1XsjQq+veOmx8XWRnyqTZ5zx/sMtdu/xFRIzrJM1Y2wAXeCJL1rhYSB7uJSZ1PgALI2WVTj78ow==", 237 + "@aws-sdk/credential-provider-ini@3.972.28": { 238 + "integrity": "sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==", 281 239 "dependencies": [ 282 240 "@aws-sdk/core", 283 241 "@aws-sdk/credential-provider-env", ··· 295 253 "tslib" 296 254 ] 297 255 }, 298 - "@aws-sdk/credential-provider-login@3.972.6": { 299 - "integrity": "sha512-LXsoBoaTSGHdRCQXlWSA0CHHh05KWncb592h9ElklnPus++8kYn1Ic6acBR4LKFQ0RjjMVgwe5ypUpmTSUOjPA==", 256 + "@aws-sdk/credential-provider-login@3.972.28": { 257 + "integrity": "sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==", 300 258 "dependencies": [ 301 259 "@aws-sdk/core", 302 260 "@aws-sdk/nested-clients", ··· 308 266 "tslib" 309 267 ] 310 268 }, 311 - "@aws-sdk/credential-provider-node@3.972.7": { 312 - "integrity": "sha512-PuJ1IkISG7ZDpBFYpGotaay6dYtmriBYuHJ/Oko4VHxh8YN5vfoWnMNYFEWuzOfyLmP7o9kDVW0BlYIpb3skvw==", 269 + "@aws-sdk/credential-provider-node@3.972.29": { 270 + "integrity": "sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==", 313 271 "dependencies": [ 314 272 "@aws-sdk/credential-provider-env", 315 273 "@aws-sdk/credential-provider-http", ··· 325 283 "tslib" 326 284 ] 327 285 }, 328 - "@aws-sdk/credential-provider-process@3.972.6": { 329 - "integrity": "sha512-Yf34cjIZJHVnD92jnVYy3tNjM+Q4WJtffLK2Ehn0nKpZfqd1m7SI0ra22Lym4C53ED76oZENVSS2wimoXJtChQ==", 286 + "@aws-sdk/credential-provider-process@3.972.24": { 287 + "integrity": "sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==", 330 288 "dependencies": [ 331 289 "@aws-sdk/core", 332 290 "@aws-sdk/types", ··· 336 294 "tslib" 337 295 ] 338 296 }, 339 - "@aws-sdk/credential-provider-sso@3.972.6": { 340 - "integrity": "sha512-2+5UVwUYdD4BBOkLpKJ11MQ8wQeyJGDVMDRH5eWOULAh9d6HJq07R69M/mNNMC9NTjr3mB1T0KGDn4qyQh5jzg==", 297 + "@aws-sdk/credential-provider-sso@3.972.28": { 298 + "integrity": "sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==", 341 299 "dependencies": [ 342 - "@aws-sdk/client-sso", 343 300 "@aws-sdk/core", 301 + "@aws-sdk/nested-clients", 344 302 "@aws-sdk/token-providers", 345 303 "@aws-sdk/types", 346 304 "@smithy/property-provider", ··· 349 307 "tslib" 350 308 ] 351 309 }, 352 - "@aws-sdk/credential-provider-web-identity@3.972.6": { 353 - "integrity": "sha512-pdJzwKtlDxBnvZ04pWMqttijmkUIlwOsS0GcxCjzEVyUMpARysl0S0ks74+gs2Pdev3Ujz+BTAjOc1tQgAxGqA==", 310 + "@aws-sdk/credential-provider-web-identity@3.972.28": { 311 + "integrity": "sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==", 354 312 "dependencies": [ 355 313 "@aws-sdk/core", 356 314 "@aws-sdk/nested-clients", ··· 364 322 "@aws-sdk/lib-storage@3.988.0_@aws-sdk+client-s3@3.988.0": { 365 323 "integrity": "sha512-EZ6US/oV1n7WtvVZ5FR80g8pA7xU92lBsvjibANVm/uHr8FOqPmSqQV9KvwzRmSdp0O6J1kXxi9LqmwgJVlN/A==", 366 324 "dependencies": [ 367 - "@aws-sdk/client-s3", 368 325 "@smithy/abort-controller", 369 326 "@smithy/middleware-endpoint", 370 327 "@smithy/smithy-client", ··· 374 331 "tslib" 375 332 ] 376 333 }, 377 - "@aws-sdk/middleware-bucket-endpoint@3.972.3": { 378 - "integrity": "sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==", 334 + "@aws-sdk/middleware-bucket-endpoint@3.972.8": { 335 + "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", 379 336 "dependencies": [ 380 337 "@aws-sdk/types", 381 338 "@aws-sdk/util-arn-parser", ··· 386 343 "tslib" 387 344 ] 388 345 }, 389 - "@aws-sdk/middleware-expect-continue@3.972.3": { 390 - "integrity": "sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==", 346 + "@aws-sdk/middleware-expect-continue@3.972.8": { 347 + "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", 391 348 "dependencies": [ 392 349 "@aws-sdk/types", 393 350 "@smithy/protocol-http", ··· 395 352 "tslib" 396 353 ] 397 354 }, 398 - "@aws-sdk/middleware-flexible-checksums@3.972.6": { 399 - "integrity": "sha512-g5DadWO58IgQKuq+uLL3pLohOwLiA67gB49xj8694BW+LpHLNu/tjCqwLfIaWvZyABbv0LXeNiiTuTnjdgkZWw==", 355 + "@aws-sdk/middleware-flexible-checksums@3.974.6": { 356 + "integrity": "sha512-YckB8k1ejbyCg/g36gUMFLNzE4W5cERIa4MtsdO+wpTmJEP0+TB7okWIt7d8TDOvnb7SwvxJ21E4TGOBxFpSWQ==", 400 357 "dependencies": [ 401 358 "@aws-crypto/crc32", 402 359 "@aws-crypto/crc32c", ··· 404 361 "@aws-sdk/core", 405 362 "@aws-sdk/crc64-nvme", 406 363 "@aws-sdk/types", 407 - "@smithy/is-array-buffer@4.2.0", 364 + "@smithy/is-array-buffer@4.2.2", 408 365 "@smithy/node-config-provider", 409 366 "@smithy/protocol-http", 410 367 "@smithy/types", 411 368 "@smithy/util-middleware", 412 369 "@smithy/util-stream", 413 - "@smithy/util-utf8@4.2.0", 370 + "@smithy/util-utf8@4.2.2", 414 371 "tslib" 415 372 ] 416 373 }, 417 - "@aws-sdk/middleware-host-header@3.972.3": { 418 - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", 374 + "@aws-sdk/middleware-host-header@3.972.8": { 375 + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", 419 376 "dependencies": [ 420 377 "@aws-sdk/types", 421 378 "@smithy/protocol-http", ··· 423 380 "tslib" 424 381 ] 425 382 }, 426 - "@aws-sdk/middleware-location-constraint@3.972.3": { 427 - "integrity": "sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==", 383 + "@aws-sdk/middleware-location-constraint@3.972.8": { 384 + "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", 428 385 "dependencies": [ 429 386 "@aws-sdk/types", 430 387 "@smithy/types", 431 388 "tslib" 432 389 ] 433 390 }, 434 - "@aws-sdk/middleware-logger@3.972.3": { 435 - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", 391 + "@aws-sdk/middleware-logger@3.972.8": { 392 + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", 436 393 "dependencies": [ 437 394 "@aws-sdk/types", 438 395 "@smithy/types", 439 396 "tslib" 440 397 ] 441 398 }, 442 - "@aws-sdk/middleware-recursion-detection@3.972.3": { 443 - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", 399 + "@aws-sdk/middleware-recursion-detection@3.972.9": { 400 + "integrity": "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==", 444 401 "dependencies": [ 445 402 "@aws-sdk/types", 446 403 "@aws/lambda-invoke-store", ··· 449 406 "tslib" 450 407 ] 451 408 }, 452 - "@aws-sdk/middleware-sdk-s3@3.972.8": { 453 - "integrity": "sha512-/yJdahpN/q3Dc88qXBTQVZfnXryLnxfCoP4hGClbKjuF0VCMxrz3il7sj0GhIkEQt5OM5+lA88XrvbjjuwSxIg==", 409 + "@aws-sdk/middleware-sdk-s3@3.972.27": { 410 + "integrity": "sha512-gomO6DZwx+1D/9mbCpcqO5tPBqYBK7DtdgjTIjZ4yvfh/S7ETwAPS0XbJgP2JD8Ycr5CwVrEkV1sFtu3ShXeOw==", 454 411 "dependencies": [ 455 412 "@aws-sdk/core", 456 413 "@aws-sdk/types", ··· 464 421 "@smithy/util-config-provider", 465 422 "@smithy/util-middleware", 466 423 "@smithy/util-stream", 467 - "@smithy/util-utf8@4.2.0", 424 + "@smithy/util-utf8@4.2.2", 468 425 "tslib" 469 426 ] 470 427 }, 471 - "@aws-sdk/middleware-ssec@3.972.3": { 472 - "integrity": "sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==", 428 + "@aws-sdk/middleware-ssec@3.972.8": { 429 + "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", 473 430 "dependencies": [ 474 431 "@aws-sdk/types", 475 432 "@smithy/types", 476 433 "tslib" 477 434 ] 478 435 }, 479 - "@aws-sdk/middleware-user-agent@3.972.8": { 480 - "integrity": "sha512-3PGL+Kvh1PhB0EeJeqNqOWQgipdqFheO4OUKc6aYiFwEpM5t9AyE5hjjxZ5X6iSj8JiduWFZLPwASzF6wQRgFg==", 436 + "@aws-sdk/middleware-user-agent@3.972.28": { 437 + "integrity": "sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==", 481 438 "dependencies": [ 482 439 "@aws-sdk/core", 483 440 "@aws-sdk/types", ··· 485 442 "@smithy/core", 486 443 "@smithy/protocol-http", 487 444 "@smithy/types", 445 + "@smithy/util-retry", 488 446 "tslib" 489 447 ] 490 448 }, 491 - "@aws-sdk/nested-clients@3.988.0": { 492 - "integrity": "sha512-OgYV9k1oBCQ6dOM+wWAMNNehXA8L4iwr7ydFV+JDHyuuu0Ko7tDXnLEtEmeQGYRcAFU3MGasmlBkMB8vf4POrg==", 449 + "@aws-sdk/nested-clients@3.996.18": { 450 + "integrity": "sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==", 493 451 "dependencies": [ 494 452 "@aws-crypto/sha256-browser", 495 453 "@aws-crypto/sha256-js", ··· 527 485 "@smithy/util-endpoints", 528 486 "@smithy/util-middleware", 529 487 "@smithy/util-retry", 530 - "@smithy/util-utf8@4.2.0", 488 + "@smithy/util-utf8@4.2.2", 531 489 "tslib" 532 490 ] 533 491 }, 534 - "@aws-sdk/region-config-resolver@3.972.3": { 535 - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", 492 + "@aws-sdk/region-config-resolver@3.972.10": { 493 + "integrity": "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==", 536 494 "dependencies": [ 537 495 "@aws-sdk/types", 538 496 "@smithy/config-resolver", ··· 541 499 "tslib" 542 500 ] 543 501 }, 544 - "@aws-sdk/signature-v4-multi-region@3.988.0": { 545 - "integrity": "sha512-SXwhbe2v0Jno7QLIBmZWAL2eVzGmXkfLLy0WkM6ZJVhE0SFUcnymDwMUA1oMDUvyArzvKBiU8khQ2ImheCKOHQ==", 502 + "@aws-sdk/signature-v4-multi-region@3.996.15": { 503 + "integrity": "sha512-Ukw2RpqvaL96CjfH/FgfBmy/ZosHBqoHBCFsN61qGg99F33vpntIVii8aNeh65XuOja73arSduskoa4OJea9RQ==", 546 504 "dependencies": [ 547 505 "@aws-sdk/middleware-sdk-s3", 548 506 "@aws-sdk/types", ··· 552 510 "tslib" 553 511 ] 554 512 }, 555 - "@aws-sdk/token-providers@3.988.0": { 556 - "integrity": "sha512-xvXVlRVKHnF2h6fgWBm64aPP5J+58aJyGfRrQa/uFh8a9mcK68mLfJOYq+ZSxQy/UN3McafJ2ILAy7IWzT9kRw==", 513 + "@aws-sdk/token-providers@3.1021.0": { 514 + "integrity": "sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==", 557 515 "dependencies": [ 558 516 "@aws-sdk/core", 559 517 "@aws-sdk/nested-clients", ··· 564 522 "tslib" 565 523 ] 566 524 }, 567 - "@aws-sdk/types@3.973.1": { 568 - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", 525 + "@aws-sdk/types@3.973.6": { 526 + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", 569 527 "dependencies": [ 570 528 "@smithy/types", 571 529 "tslib" 572 530 ] 573 531 }, 574 - "@aws-sdk/util-arn-parser@3.972.2": { 575 - "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", 532 + "@aws-sdk/util-arn-parser@3.972.3": { 533 + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", 576 534 "dependencies": [ 577 535 "tslib" 578 536 ] 579 537 }, 580 - "@aws-sdk/util-endpoints@3.988.0": { 581 - "integrity": "sha512-HuXu4boeUWU0DQiLslbgdvuQ4ZMCo4Lsk97w8BIUokql2o9MvjE5dwqI5pzGt0K7afO1FybjidUQVTMLuZNTOA==", 538 + "@aws-sdk/util-endpoints@3.996.5": { 539 + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", 582 540 "dependencies": [ 583 541 "@aws-sdk/types", 584 542 "@smithy/types", ··· 593 551 "tslib" 594 552 ] 595 553 }, 596 - "@aws-sdk/util-user-agent-browser@3.972.3": { 597 - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", 554 + "@aws-sdk/util-user-agent-browser@3.972.8": { 555 + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", 598 556 "dependencies": [ 599 557 "@aws-sdk/types", 600 558 "@smithy/types", ··· 602 560 "tslib" 603 561 ] 604 562 }, 605 - "@aws-sdk/util-user-agent-node@3.972.6": { 606 - "integrity": "sha512-966xH8TPqkqOXP7EwnEThcKKz0SNP9kVJBKd9M8bNXE4GSqVouMKKnFBwYnzbWVKuLXubzX5seokcX4a0JLJIA==", 563 + "@aws-sdk/util-user-agent-node@3.973.14": { 564 + "integrity": "sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==", 607 565 "dependencies": [ 608 566 "@aws-sdk/middleware-user-agent", 609 567 "@aws-sdk/types", 610 568 "@smithy/node-config-provider", 611 569 "@smithy/types", 570 + "@smithy/util-config-provider", 612 571 "tslib" 613 572 ] 614 573 }, 615 - "@aws-sdk/xml-builder@3.972.4": { 616 - "integrity": "sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==", 574 + "@aws-sdk/xml-builder@3.972.16": { 575 + "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==", 617 576 "dependencies": [ 618 577 "@smithy/types", 619 578 "fast-xml-parser", ··· 1299 1258 "tslib" 1300 1259 ] 1301 1260 }, 1302 - "@smithy/chunked-blob-reader-native@4.2.1": { 1303 - "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", 1261 + "@smithy/chunked-blob-reader-native@4.2.3": { 1262 + "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", 1304 1263 "dependencies": [ 1305 1264 "@smithy/util-base64", 1306 1265 "tslib" 1307 1266 ] 1308 1267 }, 1309 - "@smithy/chunked-blob-reader@5.2.0": { 1310 - "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", 1268 + "@smithy/chunked-blob-reader@5.2.2": { 1269 + "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", 1311 1270 "dependencies": [ 1312 1271 "tslib" 1313 1272 ] 1314 1273 }, 1315 - "@smithy/config-resolver@4.4.6": { 1316 - "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", 1274 + "@smithy/config-resolver@4.4.13": { 1275 + "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==", 1317 1276 "dependencies": [ 1318 1277 "@smithy/node-config-provider", 1319 1278 "@smithy/types", ··· 1323 1282 "tslib" 1324 1283 ] 1325 1284 }, 1326 - "@smithy/core@3.23.0": { 1327 - "integrity": "sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==", 1285 + "@smithy/core@3.23.13": { 1286 + "integrity": "sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==", 1328 1287 "dependencies": [ 1329 - "@smithy/middleware-serde", 1330 1288 "@smithy/protocol-http", 1331 1289 "@smithy/types", 1290 + "@smithy/url-parser", 1332 1291 "@smithy/util-base64", 1333 1292 "@smithy/util-body-length-browser", 1334 1293 "@smithy/util-middleware", 1335 1294 "@smithy/util-stream", 1336 - "@smithy/util-utf8@4.2.0", 1295 + "@smithy/util-utf8@4.2.2", 1337 1296 "@smithy/uuid", 1338 1297 "tslib" 1339 1298 ] 1340 1299 }, 1341 - "@smithy/credential-provider-imds@4.2.8": { 1342 - "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", 1300 + "@smithy/credential-provider-imds@4.2.12": { 1301 + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", 1343 1302 "dependencies": [ 1344 1303 "@smithy/node-config-provider", 1345 1304 "@smithy/property-provider", ··· 1348 1307 "tslib" 1349 1308 ] 1350 1309 }, 1351 - "@smithy/eventstream-codec@4.2.8": { 1352 - "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", 1310 + "@smithy/eventstream-codec@4.2.12": { 1311 + "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", 1353 1312 "dependencies": [ 1354 1313 "@aws-crypto/crc32", 1355 1314 "@smithy/types", ··· 1357 1316 "tslib" 1358 1317 ] 1359 1318 }, 1360 - "@smithy/eventstream-serde-browser@4.2.8": { 1361 - "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", 1319 + "@smithy/eventstream-serde-browser@4.2.12": { 1320 + "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", 1362 1321 "dependencies": [ 1363 1322 "@smithy/eventstream-serde-universal", 1364 1323 "@smithy/types", 1365 1324 "tslib" 1366 1325 ] 1367 1326 }, 1368 - "@smithy/eventstream-serde-config-resolver@4.3.8": { 1369 - "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", 1327 + "@smithy/eventstream-serde-config-resolver@4.3.12": { 1328 + "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", 1370 1329 "dependencies": [ 1371 1330 "@smithy/types", 1372 1331 "tslib" 1373 1332 ] 1374 1333 }, 1375 - "@smithy/eventstream-serde-node@4.2.8": { 1376 - "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", 1334 + "@smithy/eventstream-serde-node@4.2.12": { 1335 + "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", 1377 1336 "dependencies": [ 1378 1337 "@smithy/eventstream-serde-universal", 1379 1338 "@smithy/types", 1380 1339 "tslib" 1381 1340 ] 1382 1341 }, 1383 - "@smithy/eventstream-serde-universal@4.2.8": { 1384 - "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", 1342 + "@smithy/eventstream-serde-universal@4.2.12": { 1343 + "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", 1385 1344 "dependencies": [ 1386 1345 "@smithy/eventstream-codec", 1387 1346 "@smithy/types", 1388 1347 "tslib" 1389 1348 ] 1390 1349 }, 1391 - "@smithy/fetch-http-handler@5.3.9": { 1392 - "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", 1350 + "@smithy/fetch-http-handler@5.3.15": { 1351 + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", 1393 1352 "dependencies": [ 1394 1353 "@smithy/protocol-http", 1395 1354 "@smithy/querystring-builder", ··· 1398 1357 "tslib" 1399 1358 ] 1400 1359 }, 1401 - "@smithy/hash-blob-browser@4.2.9": { 1402 - "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", 1360 + "@smithy/hash-blob-browser@4.2.13": { 1361 + "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", 1403 1362 "dependencies": [ 1404 1363 "@smithy/chunked-blob-reader", 1405 1364 "@smithy/chunked-blob-reader-native", ··· 1407 1366 "tslib" 1408 1367 ] 1409 1368 }, 1410 - "@smithy/hash-node@4.2.8": { 1411 - "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", 1369 + "@smithy/hash-node@4.2.12": { 1370 + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", 1412 1371 "dependencies": [ 1413 1372 "@smithy/types", 1414 - "@smithy/util-buffer-from@4.2.0", 1415 - "@smithy/util-utf8@4.2.0", 1373 + "@smithy/util-buffer-from@4.2.2", 1374 + "@smithy/util-utf8@4.2.2", 1416 1375 "tslib" 1417 1376 ] 1418 1377 }, 1419 - "@smithy/hash-stream-node@4.2.8": { 1420 - "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", 1378 + "@smithy/hash-stream-node@4.2.12": { 1379 + "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", 1421 1380 "dependencies": [ 1422 1381 "@smithy/types", 1423 - "@smithy/util-utf8@4.2.0", 1382 + "@smithy/util-utf8@4.2.2", 1424 1383 "tslib" 1425 1384 ] 1426 1385 }, 1427 - "@smithy/invalid-dependency@4.2.8": { 1428 - "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", 1386 + "@smithy/invalid-dependency@4.2.12": { 1387 + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", 1429 1388 "dependencies": [ 1430 1389 "@smithy/types", 1431 1390 "tslib" ··· 1437 1396 "tslib" 1438 1397 ] 1439 1398 }, 1440 - "@smithy/is-array-buffer@4.2.0": { 1441 - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", 1399 + "@smithy/is-array-buffer@4.2.2": { 1400 + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", 1442 1401 "dependencies": [ 1443 1402 "tslib" 1444 1403 ] 1445 1404 }, 1446 - "@smithy/md5-js@4.2.8": { 1447 - "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", 1405 + "@smithy/md5-js@4.2.12": { 1406 + "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", 1448 1407 "dependencies": [ 1449 1408 "@smithy/types", 1450 - "@smithy/util-utf8@4.2.0", 1409 + "@smithy/util-utf8@4.2.2", 1451 1410 "tslib" 1452 1411 ] 1453 1412 }, 1454 - "@smithy/middleware-content-length@4.2.8": { 1455 - "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", 1413 + "@smithy/middleware-content-length@4.2.12": { 1414 + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", 1456 1415 "dependencies": [ 1457 1416 "@smithy/protocol-http", 1458 1417 "@smithy/types", 1459 1418 "tslib" 1460 1419 ] 1461 1420 }, 1462 - "@smithy/middleware-endpoint@4.4.14": { 1463 - "integrity": "sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==", 1421 + "@smithy/middleware-endpoint@4.4.28": { 1422 + "integrity": "sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==", 1464 1423 "dependencies": [ 1465 1424 "@smithy/core", 1466 1425 "@smithy/middleware-serde", ··· 1472 1431 "tslib" 1473 1432 ] 1474 1433 }, 1475 - "@smithy/middleware-retry@4.4.31": { 1476 - "integrity": "sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==", 1434 + "@smithy/middleware-retry@4.4.46": { 1435 + "integrity": "sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==", 1477 1436 "dependencies": [ 1478 1437 "@smithy/node-config-provider", 1479 1438 "@smithy/protocol-http", ··· 1486 1445 "tslib" 1487 1446 ] 1488 1447 }, 1489 - "@smithy/middleware-serde@4.2.9": { 1490 - "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", 1448 + "@smithy/middleware-serde@4.2.16": { 1449 + "integrity": "sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==", 1491 1450 "dependencies": [ 1451 + "@smithy/core", 1492 1452 "@smithy/protocol-http", 1493 1453 "@smithy/types", 1494 1454 "tslib" 1495 1455 ] 1496 1456 }, 1497 - "@smithy/middleware-stack@4.2.8": { 1498 - "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", 1457 + "@smithy/middleware-stack@4.2.12": { 1458 + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", 1499 1459 "dependencies": [ 1500 1460 "@smithy/types", 1501 1461 "tslib" 1502 1462 ] 1503 1463 }, 1504 - "@smithy/node-config-provider@4.3.8": { 1505 - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", 1464 + "@smithy/node-config-provider@4.3.12": { 1465 + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", 1506 1466 "dependencies": [ 1507 1467 "@smithy/property-provider", 1508 1468 "@smithy/shared-ini-file-loader", ··· 1510 1470 "tslib" 1511 1471 ] 1512 1472 }, 1513 - "@smithy/node-http-handler@4.4.10": { 1514 - "integrity": "sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==", 1473 + "@smithy/node-http-handler@4.5.1": { 1474 + "integrity": "sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==", 1515 1475 "dependencies": [ 1516 - "@smithy/abort-controller", 1517 1476 "@smithy/protocol-http", 1518 1477 "@smithy/querystring-builder", 1519 1478 "@smithy/types", 1520 1479 "tslib" 1521 1480 ] 1522 1481 }, 1523 - "@smithy/property-provider@4.2.8": { 1524 - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", 1482 + "@smithy/property-provider@4.2.12": { 1483 + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", 1525 1484 "dependencies": [ 1526 1485 "@smithy/types", 1527 1486 "tslib" 1528 1487 ] 1529 1488 }, 1530 - "@smithy/protocol-http@5.3.8": { 1531 - "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", 1489 + "@smithy/protocol-http@5.3.12": { 1490 + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", 1532 1491 "dependencies": [ 1533 1492 "@smithy/types", 1534 1493 "tslib" 1535 1494 ] 1536 1495 }, 1537 - "@smithy/querystring-builder@4.2.8": { 1538 - "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", 1496 + "@smithy/querystring-builder@4.2.12": { 1497 + "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", 1539 1498 "dependencies": [ 1540 1499 "@smithy/types", 1541 1500 "@smithy/util-uri-escape", 1542 1501 "tslib" 1543 1502 ] 1544 1503 }, 1545 - "@smithy/querystring-parser@4.2.8": { 1546 - "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", 1504 + "@smithy/querystring-parser@4.2.12": { 1505 + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", 1547 1506 "dependencies": [ 1548 1507 "@smithy/types", 1549 1508 "tslib" 1550 1509 ] 1551 1510 }, 1552 - "@smithy/service-error-classification@4.2.8": { 1553 - "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", 1511 + "@smithy/service-error-classification@4.2.12": { 1512 + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", 1554 1513 "dependencies": [ 1555 1514 "@smithy/types" 1556 1515 ] 1557 1516 }, 1558 - "@smithy/shared-ini-file-loader@4.4.3": { 1559 - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", 1517 + "@smithy/shared-ini-file-loader@4.4.7": { 1518 + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", 1560 1519 "dependencies": [ 1561 1520 "@smithy/types", 1562 1521 "tslib" 1563 1522 ] 1564 1523 }, 1565 - "@smithy/signature-v4@5.3.8": { 1566 - "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", 1524 + "@smithy/signature-v4@5.3.12": { 1525 + "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", 1567 1526 "dependencies": [ 1568 - "@smithy/is-array-buffer@4.2.0", 1527 + "@smithy/is-array-buffer@4.2.2", 1569 1528 "@smithy/protocol-http", 1570 1529 "@smithy/types", 1571 1530 "@smithy/util-hex-encoding", 1572 1531 "@smithy/util-middleware", 1573 1532 "@smithy/util-uri-escape", 1574 - "@smithy/util-utf8@4.2.0", 1533 + "@smithy/util-utf8@4.2.2", 1575 1534 "tslib" 1576 1535 ] 1577 1536 }, 1578 - "@smithy/smithy-client@4.11.3": { 1579 - "integrity": "sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==", 1537 + "@smithy/smithy-client@4.12.8": { 1538 + "integrity": "sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==", 1580 1539 "dependencies": [ 1581 1540 "@smithy/core", 1582 1541 "@smithy/middleware-endpoint", ··· 1587 1546 "tslib" 1588 1547 ] 1589 1548 }, 1590 - "@smithy/types@4.12.0": { 1591 - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", 1549 + "@smithy/types@4.13.1": { 1550 + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", 1592 1551 "dependencies": [ 1593 1552 "tslib" 1594 1553 ] 1595 1554 }, 1596 - "@smithy/url-parser@4.2.8": { 1597 - "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", 1555 + "@smithy/url-parser@4.2.12": { 1556 + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", 1598 1557 "dependencies": [ 1599 1558 "@smithy/querystring-parser", 1600 1559 "@smithy/types", 1601 1560 "tslib" 1602 1561 ] 1603 1562 }, 1604 - "@smithy/util-base64@4.3.0": { 1605 - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", 1563 + "@smithy/util-base64@4.3.2": { 1564 + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", 1606 1565 "dependencies": [ 1607 - "@smithy/util-buffer-from@4.2.0", 1608 - "@smithy/util-utf8@4.2.0", 1566 + "@smithy/util-buffer-from@4.2.2", 1567 + "@smithy/util-utf8@4.2.2", 1609 1568 "tslib" 1610 1569 ] 1611 1570 }, 1612 - "@smithy/util-body-length-browser@4.2.0": { 1613 - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", 1571 + "@smithy/util-body-length-browser@4.2.2": { 1572 + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", 1614 1573 "dependencies": [ 1615 1574 "tslib" 1616 1575 ] 1617 1576 }, 1618 - "@smithy/util-body-length-node@4.2.1": { 1619 - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", 1577 + "@smithy/util-body-length-node@4.2.3": { 1578 + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", 1620 1579 "dependencies": [ 1621 1580 "tslib" 1622 1581 ] ··· 1628 1587 "tslib" 1629 1588 ] 1630 1589 }, 1631 - "@smithy/util-buffer-from@4.2.0": { 1632 - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", 1590 + "@smithy/util-buffer-from@4.2.2": { 1591 + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", 1633 1592 "dependencies": [ 1634 - "@smithy/is-array-buffer@4.2.0", 1593 + "@smithy/is-array-buffer@4.2.2", 1635 1594 "tslib" 1636 1595 ] 1637 1596 }, 1638 - "@smithy/util-config-provider@4.2.0": { 1639 - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", 1597 + "@smithy/util-config-provider@4.2.2": { 1598 + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", 1640 1599 "dependencies": [ 1641 1600 "tslib" 1642 1601 ] 1643 1602 }, 1644 - "@smithy/util-defaults-mode-browser@4.3.30": { 1645 - "integrity": "sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==", 1603 + "@smithy/util-defaults-mode-browser@4.3.44": { 1604 + "integrity": "sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==", 1646 1605 "dependencies": [ 1647 1606 "@smithy/property-provider", 1648 1607 "@smithy/smithy-client", ··· 1650 1609 "tslib" 1651 1610 ] 1652 1611 }, 1653 - "@smithy/util-defaults-mode-node@4.2.33": { 1654 - "integrity": "sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==", 1612 + "@smithy/util-defaults-mode-node@4.2.48": { 1613 + "integrity": "sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==", 1655 1614 "dependencies": [ 1656 1615 "@smithy/config-resolver", 1657 1616 "@smithy/credential-provider-imds", ··· 1662 1621 "tslib" 1663 1622 ] 1664 1623 }, 1665 - "@smithy/util-endpoints@3.2.8": { 1666 - "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", 1624 + "@smithy/util-endpoints@3.3.3": { 1625 + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", 1667 1626 "dependencies": [ 1668 1627 "@smithy/node-config-provider", 1669 1628 "@smithy/types", 1670 1629 "tslib" 1671 1630 ] 1672 1631 }, 1673 - "@smithy/util-hex-encoding@4.2.0": { 1674 - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", 1632 + "@smithy/util-hex-encoding@4.2.2": { 1633 + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", 1675 1634 "dependencies": [ 1676 1635 "tslib" 1677 1636 ] 1678 1637 }, 1679 - "@smithy/util-middleware@4.2.8": { 1680 - "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", 1638 + "@smithy/util-middleware@4.2.12": { 1639 + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", 1681 1640 "dependencies": [ 1682 1641 "@smithy/types", 1683 1642 "tslib" 1684 1643 ] 1685 1644 }, 1686 - "@smithy/util-retry@4.2.8": { 1687 - "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", 1645 + "@smithy/util-retry@4.2.13": { 1646 + "integrity": "sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==", 1688 1647 "dependencies": [ 1689 1648 "@smithy/service-error-classification", 1690 1649 "@smithy/types", 1691 1650 "tslib" 1692 1651 ] 1693 1652 }, 1694 - "@smithy/util-stream@4.5.12": { 1695 - "integrity": "sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==", 1653 + "@smithy/util-stream@4.5.21": { 1654 + "integrity": "sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==", 1696 1655 "dependencies": [ 1697 1656 "@smithy/fetch-http-handler", 1698 1657 "@smithy/node-http-handler", 1699 1658 "@smithy/types", 1700 1659 "@smithy/util-base64", 1701 - "@smithy/util-buffer-from@4.2.0", 1660 + "@smithy/util-buffer-from@4.2.2", 1702 1661 "@smithy/util-hex-encoding", 1703 - "@smithy/util-utf8@4.2.0", 1662 + "@smithy/util-utf8@4.2.2", 1704 1663 "tslib" 1705 1664 ] 1706 1665 }, 1707 - "@smithy/util-uri-escape@4.2.0": { 1708 - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", 1666 + "@smithy/util-uri-escape@4.2.2": { 1667 + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", 1709 1668 "dependencies": [ 1710 1669 "tslib" 1711 1670 ] ··· 1717 1676 "tslib" 1718 1677 ] 1719 1678 }, 1720 - "@smithy/util-utf8@4.2.0": { 1721 - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", 1679 + "@smithy/util-utf8@4.2.2": { 1680 + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", 1722 1681 "dependencies": [ 1723 - "@smithy/util-buffer-from@4.2.0", 1682 + "@smithy/util-buffer-from@4.2.2", 1724 1683 "tslib" 1725 1684 ] 1726 1685 }, 1727 - "@smithy/util-waiter@4.2.8": { 1728 - "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", 1686 + "@smithy/util-waiter@4.2.14": { 1687 + "integrity": "sha512-2zqq5o/oizvMaFUlNiTyZ7dbgYv1a893aGut2uaxtbzTx/VYYnRxWzDHuD/ftgcw94ffenua+ZNLrbqwUYE+Bg==", 1729 1688 "dependencies": [ 1730 - "@smithy/abort-controller", 1731 1689 "@smithy/types", 1732 1690 "tslib" 1733 1691 ] 1734 1692 }, 1735 - "@smithy/uuid@1.1.0": { 1736 - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", 1693 + "@smithy/uuid@1.1.2": { 1694 + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", 1737 1695 "dependencies": [ 1738 1696 "tslib" 1739 1697 ] ··· 2077 2035 "micromatch" 2078 2036 ] 2079 2037 }, 2080 - "fast-xml-parser@5.3.4": { 2081 - "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", 2038 + "fast-xml-builder@1.1.4": { 2039 + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", 2040 + "dependencies": [ 2041 + "path-expression-matcher" 2042 + ] 2043 + }, 2044 + "fast-xml-parser@5.5.8": { 2045 + "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==", 2082 2046 "dependencies": [ 2047 + "fast-xml-builder", 2048 + "path-expression-matcher", 2083 2049 "strnum" 2084 2050 ], 2085 2051 "bin": true ··· 2276 2242 "parse-passwd@1.0.0": { 2277 2243 "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" 2278 2244 }, 2245 + "path-expression-matcher@1.2.1": { 2246 + "integrity": "sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==" 2247 + }, 2279 2248 "pathe@2.0.3": { 2280 2249 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" 2281 2250 }, ··· 2467 2436 "ansi-regex" 2468 2437 ] 2469 2438 }, 2470 - "strnum@2.1.2": { 2471 - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==" 2439 + "strnum@2.2.2": { 2440 + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==" 2472 2441 }, 2473 2442 "tar-stream@3.1.7": { 2474 2443 "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", ··· 2486 2455 "minipass", 2487 2456 "minizlib", 2488 2457 "yallist" 2489 - ] 2458 + ], 2459 + "deprecated": true 2490 2460 }, 2491 2461 "text-decoder@1.2.3": { 2492 2462 "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", ··· 2592 2562 ], 2593 2563 "packageJson": { 2594 2564 "dependencies": [ 2565 + "npm:@aws-sdk/client-s3@^3.1024.0", 2595 2566 "npm:@fly/sprites@^0.0.1" 2596 2567 ] 2597 2568 }
+1
apps/sandbox/package.json
··· 1 1 { 2 2 "dependencies": { 3 + "@aws-sdk/client-s3": "^3.1024.0", 3 4 "@fly/sprites": "^0.0.1" 4 5 } 5 6 }
+181
apps/sandbox/src/index.ts
··· 47 47 import { InsertSpriteAuth } from "./schema/sprite-auth.ts"; 48 48 import daytonaAuth, { InsertDaytonaAuth } from "./schema/daytona-auth.ts"; 49 49 import { InsertDenoAuth } from "./schema/deno-auth.ts"; 50 + import crypto from "node:crypto"; 51 + import { PullDirectoryParams, pullSchema } from "./types/pull.ts"; 52 + import { PushDirectoryParams, pushSchema } from "./types/push.ts"; 50 53 51 54 const app = new Hono<{ Variables: Context }>(); 52 55 ··· 820 823 app.delete("/v1/sandboxes/:sandboxId/ports", async (c) => { 821 824 // TODO: Implement unexpose port 822 825 return c.json({}); 826 + }); 827 + 828 + app.post("/v1/sandboxes/:sandboxId/pull-directory", async (c) => { 829 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 830 + 831 + if (!record) { 832 + return c.json({ error: "Sandbox not found" }, 404); 833 + } 834 + 835 + let sandbox: BaseSandbox | null = null; 836 + 837 + if (!["daytona", "vercel", "deno", "sprites"].includes(record.provider)) { 838 + return c.json({ error: "Sandbox provider not supported" }, 400); 839 + } 840 + 841 + const [ 842 + [spriteAuthParams], 843 + [daytonaAuthParams], 844 + [denoAuthParams], 845 + [vercelAuthParams], 846 + ] = await Promise.all([ 847 + c.var.db 848 + .select() 849 + .from(spriteAuth) 850 + .where(eq(spriteAuth.sandboxId, record.id)) 851 + .execute(), 852 + c.var.db 853 + .select() 854 + .from(daytonaAuth) 855 + .where(eq(daytonaAuth.sandboxId, record.id)) 856 + .execute(), 857 + c.var.db 858 + .select() 859 + .from(denoAuth) 860 + .where(eq(denoAuth.sandboxId, record.id)) 861 + .execute(), 862 + c.var.db 863 + .select() 864 + .from(vercelAuth) 865 + .where(eq(vercelAuth.sandboxId, record.id)) 866 + .execute(), 867 + ]); 868 + 869 + if (!record.sandboxId) { 870 + sandbox = await createSandbox(record.provider as Provider, { 871 + id: record.id, 872 + daytonaApiKey: decrypt(daytonaAuthParams?.apiKey), 873 + organizationId: daytonaAuthParams?.organizationId, 874 + spriteToken: decrypt(spriteAuthParams?.spriteToken), 875 + denoDeployToken: decrypt(denoAuthParams?.deployToken), 876 + vercelApiToken: decrypt(vercelAuthParams?.vercelToken), 877 + vercelProjectId: vercelAuthParams?.projectId, 878 + vercelTeamId: vercelAuthParams?.teamId, 879 + }); 880 + const sandboxId = await sandbox.id(); 881 + await c.var.db 882 + .update(sandboxes) 883 + .set({ sandboxId }) 884 + .where(eq(sandboxes.id, record.id)) 885 + .execute(); 886 + record.sandboxId = sandboxId; 887 + } 888 + 889 + sandbox = await getSandboxById( 890 + record.provider as Provider, 891 + record.sandboxId!, 892 + { 893 + daytonaApiKey: decrypt(daytonaAuthParams?.apiKey), 894 + spriteToken: decrypt(spriteAuthParams?.spriteToken), 895 + denoDeployToken: decrypt(denoAuthParams?.deployToken), 896 + organizationId: daytonaAuthParams?.organizationId, 897 + vercelApiToken: decrypt(vercelAuthParams?.vercelToken), 898 + vercelProjectId: vercelAuthParams?.projectId, 899 + vercelTeamId: vercelAuthParams?.teamId, 900 + }, 901 + ); 902 + 903 + if (!sandbox) { 904 + return c.json({ error: "Sandbox provider not supported" }, 400); 905 + } 906 + 907 + const token = c.req.header("Authorization"); 908 + const params = await c.req.json<PullDirectoryParams>(); 909 + await pullSchema.parseAsync(params); 910 + 911 + const outdir = crypto.randomUUID(); 912 + 913 + await sandbox.sh`mkdir -p /tmp/${outdir} && cd /tmp/${outdir} && curl https://sandbox.pocketenv.io/cp/${params.uuid} -H "Authorization: ${token}" | tar xvf -`; 914 + await sandbox.sh`cp -r /tmp/${outdir}/* ${params.directoryPath} || sudo cp -r /tmp/${outdir}/* ${params.directoryPath}`; 915 + 916 + return c.json({ success: true }); 917 + }); 918 + 919 + app.post("/v1/sandboxes/:sandboxId/push-directory", async (c) => { 920 + const record = await getSandbox(c.var.db, c.req.param("sandboxId")); 921 + 922 + if (!record) { 923 + return c.json({ error: "Sandbox not found" }, 404); 924 + } 925 + 926 + let sandbox: BaseSandbox | null = null; 927 + 928 + if (!["daytona", "vercel", "deno", "sprites"].includes(record.provider)) { 929 + return c.json({ error: "Sandbox provider not supported" }, 400); 930 + } 931 + 932 + const [ 933 + [spriteAuthParams], 934 + [daytonaAuthParams], 935 + [denoAuthParams], 936 + [vercelAuthParams], 937 + ] = await Promise.all([ 938 + c.var.db 939 + .select() 940 + .from(spriteAuth) 941 + .where(eq(spriteAuth.sandboxId, record.id)) 942 + .execute(), 943 + c.var.db 944 + .select() 945 + .from(daytonaAuth) 946 + .where(eq(daytonaAuth.sandboxId, record.id)) 947 + .execute(), 948 + c.var.db 949 + .select() 950 + .from(denoAuth) 951 + .where(eq(denoAuth.sandboxId, record.id)) 952 + .execute(), 953 + c.var.db 954 + .select() 955 + .from(vercelAuth) 956 + .where(eq(vercelAuth.sandboxId, record.id)) 957 + .execute(), 958 + ]); 959 + 960 + if (!record.sandboxId) { 961 + sandbox = await createSandbox(record.provider as Provider, { 962 + id: record.id, 963 + daytonaApiKey: decrypt(daytonaAuthParams?.apiKey), 964 + organizationId: daytonaAuthParams?.organizationId, 965 + spriteToken: decrypt(spriteAuthParams?.spriteToken), 966 + denoDeployToken: decrypt(denoAuthParams?.deployToken), 967 + vercelApiToken: decrypt(vercelAuthParams?.vercelToken), 968 + vercelProjectId: vercelAuthParams?.projectId, 969 + vercelTeamId: vercelAuthParams?.teamId, 970 + }); 971 + const sandboxId = await sandbox.id(); 972 + await c.var.db 973 + .update(sandboxes) 974 + .set({ sandboxId }) 975 + .where(eq(sandboxes.id, record.id)) 976 + .execute(); 977 + record.sandboxId = sandboxId; 978 + } 979 + 980 + sandbox = await getSandboxById( 981 + record.provider as Provider, 982 + record.sandboxId!, 983 + { 984 + daytonaApiKey: decrypt(daytonaAuthParams?.apiKey), 985 + spriteToken: decrypt(spriteAuthParams?.spriteToken), 986 + denoDeployToken: decrypt(denoAuthParams?.deployToken), 987 + organizationId: daytonaAuthParams?.organizationId, 988 + vercelApiToken: decrypt(vercelAuthParams?.vercelToken), 989 + vercelProjectId: vercelAuthParams?.projectId, 990 + vercelTeamId: vercelAuthParams?.teamId, 991 + }, 992 + ); 993 + 994 + if (!sandbox) { 995 + return c.json({ error: "Sandbox provider not supported" }, 400); 996 + } 997 + 998 + const token = c.req.header("Authorization"); 999 + const params = await c.req.json<PushDirectoryParams>(); 1000 + await pushSchema.parseAsync(params); 1001 + const uuid = crypto.randomUUID(); 1002 + await sandbox.sh`cd /tmp && tar czvf ${uuid}.tar.gz ${params.directoryPath} && curl -X POST "https://sandbox.pocketenv.io/cp?uuid=${uuid}" -H "Authorization: ${token}" -F "file=@${uuid}.tar.gz" && rm ${uuid}.tar.gz`; 1003 + return c.json({ success: true, uuid: uuid.toString() }); 823 1004 }); 824 1005 825 1006 export const getSandbox = async (db: Context["db"], sandboxId: string) => {
+8
apps/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/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>;