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 Hopx, Runloop and Blaxel providers

+4325 -202
+20 -1
apps/api/lexicons/sandbox/createSandbox.json
··· 36 36 "deno", 37 37 "sprites", 38 38 "modal", 39 - "e2b" 39 + "e2b", 40 + "blaxel", 41 + "hopx", 42 + "runloop" 40 43 ] 41 44 }, 42 45 "topics": { ··· 152 155 "redactedE2bApiKey": { 153 156 "type": "string", 154 157 "description": "A redacted API KEY for accessing E2B resources" 158 + }, 159 + "hopxApiKey": { 160 + "type": "string", 161 + "description": "An API KEY (encrypted) for accessing hopx resources" 162 + }, 163 + "redactedHopxApiKey": { 164 + "type": "string", 165 + "description": "A redacted API KEY for accessing hopx resources" 166 + }, 167 + "runloopApiKey": { 168 + "type": "string", 169 + "description": "An API KEY (encrypted) for accessing Runloop resources" 170 + }, 171 + "redactedRunloopApiKey": { 172 + "type": "string", 173 + "description": "A redacted API KEY for accessing Runloop resources" 155 174 } 156 175 } 157 176 }
+16
apps/api/lexicons/sandbox/defs.json
··· 354 354 "redactedE2bApiKey": { 355 355 "type": "string", 356 356 "description": "The redacted API KEY for E2B, returned in API responses when the sandbox provider is E2B. This can be used to identify which E2B API KEY is being used without exposing the actual API KEY." 357 + }, 358 + "hopxApiKey": { 359 + "type": "string", 360 + "description": "The API KEY for hopx, if the sandbox provider is hopx. This is used to determine which hopx API KEY to use when creating the sandbox." 361 + }, 362 + "redactedHopxApiKey": { 363 + "type": "string", 364 + "description": "The redacted API KEY for hopx, returned in API responses when the sandbox provider is hopx. This can be used to identify which hopx API KEY is being used without exposing the actual API KEY." 365 + }, 366 + "runloopApiKey": { 367 + "type": "string", 368 + "description": "The API KEY for Runloop, if the sandbox provider is Runloop. This is used to determine which Runloop API KEY to use when creating the sandbox." 369 + }, 370 + "redactedRunloopApiKey": { 371 + "type": "string", 372 + "description": "The redacted API KEY for Runloop, returned in API responses when the sandbox provider is Runloop. This can be used to identify which Runloop API KEY is being used without exposing the actual API KEY." 357 373 } 358 374 } 359 375 },
+29 -1
apps/api/pkl/defs/sandbox/createSandbox.pkl
··· 28 28 } 29 29 ["provider"] = new StringType { 30 30 type = "string" 31 - enum = List("daytona", "vercel", "cloudflare", "deno", "sprites", "modal", "e2b") 31 + enum = 32 + List( 33 + "daytona", 34 + "vercel", 35 + "cloudflare", 36 + "deno", 37 + "sprites", 38 + "modal", 39 + "e2b", 40 + "blaxel", 41 + "hopx", 42 + "runloop", 43 + ) 32 44 description = 33 45 "The provider to create the sandbox on, e.g. 'daytona', 'vercel', 'cloudflare', etc." 34 46 } ··· 147 159 ["redactedE2bApiKey"] = new StringType { 148 160 type = "string" 149 161 description = "A redacted API KEY for accessing E2B resources" 162 + } 163 + ["hopxApiKey"] = new StringType { 164 + type = "string" 165 + description = "An API KEY (encrypted) for accessing hopx resources" 166 + } 167 + ["redactedHopxApiKey"] = new StringType { 168 + type = "string" 169 + description = "A redacted API KEY for accessing hopx resources" 170 + } 171 + ["runloopApiKey"] = new StringType { 172 + type = "string" 173 + description = "An API KEY (encrypted) for accessing Runloop resources" 174 + } 175 + ["redactedRunloopApiKey"] = new StringType { 176 + type = "string" 177 + description = "A redacted API KEY for accessing Runloop resources" 150 178 } 151 179 } 152 180 }
+20
apps/api/pkl/defs/sandbox/defs.pkl
··· 365 365 description = 366 366 "The redacted API KEY for E2B, returned in API responses when the sandbox provider is E2B. This can be used to identify which E2B API KEY is being used without exposing the actual API KEY." 367 367 } 368 + ["hopxApiKey"] = new StringType { 369 + type = "string" 370 + description = 371 + "The API KEY for hopx, if the sandbox provider is hopx. This is used to determine which hopx API KEY to use when creating the sandbox." 372 + } 373 + ["redactedHopxApiKey"] = new StringType { 374 + type = "string" 375 + description = 376 + "The redacted API KEY for hopx, returned in API responses when the sandbox provider is hopx. This can be used to identify which hopx API KEY is being used without exposing the actual API KEY." 377 + } 378 + ["runloopApiKey"] = new StringType { 379 + type = "string" 380 + description = 381 + "The API KEY for Runloop, if the sandbox provider is Runloop. This is used to determine which Runloop API KEY to use when creating the sandbox." 382 + } 383 + ["redactedRunloopApiKey"] = new StringType { 384 + type = "string" 385 + description = 386 + "The redacted API KEY for Runloop, returned in API responses when the sandbox provider is Runloop. This can be used to identify which Runloop API KEY is being used without exposing the actual API KEY." 387 + } 368 388 } 369 389 } 370 390 ["preferences"] = new Array {
+5 -2
apps/api/src/__tests__/consts.test.ts
··· 16 16 expect(Providers.SPRITE).toBe("sprite"); 17 17 expect(Providers.MODAL).toBe("modal"); 18 18 expect(Providers.E2B).toBe("e2b"); 19 + expect(Providers.HOPX).toBe("hopx"); 20 + expect(Providers.RUNLOOP).toBe("runloop"); 21 + expect(Providers.BLAXEL).toBe("blaxel"); 19 22 }); 20 23 21 - it("has exactly 7 providers", () => { 24 + it("has exactly 10 providers", () => { 22 25 const values = Object.values(Providers); 23 - expect(values).toHaveLength(7); 26 + expect(values).toHaveLength(10); 24 27 }); 25 28 }); 26 29
+18
apps/api/src/consts.ts
··· 8 8 SPRITE = "sprite", 9 9 MODAL = "modal", 10 10 E2B = "e2b", 11 + HOPX = "hopx", 12 + RUNLOOP = "runloop", 13 + BLAXEL = "blaxel", 11 14 } 12 15 13 16 export type Resources = { ··· 51 54 vcpus: 2, 52 55 memory: 8, 53 56 disk: 16, 57 + }, 58 + hopx: { 59 + vcpus: 2, 60 + memory: 8, 61 + disk: 16, 62 + }, 63 + runloop: { 64 + vcpus: 2, 65 + memory: 8, 66 + disk: 16, 67 + }, 68 + blaxel: { 69 + vcpus: 2, 70 + memory: 4, 71 + disk: 8, 54 72 }, 55 73 };
+8 -2
apps/api/src/context.ts
··· 14 14 import { Providers } from "consts"; 15 15 import type { Message } from "pty/pty-tunnel/messages"; 16 16 import type { WebSocket } from "ws"; 17 - import express from "express"; 17 + import type express from "express"; 18 18 19 19 const { DB_PATH } = env; 20 20 export const db = createDb(DB_PATH); ··· 56 56 kv: new Map<string, string>(), 57 57 sandbox: (provider?: string) => 58 58 axios.create({ 59 - baseURL: [Providers.MODAL, Providers.E2B].includes(provider as Providers) 59 + baseURL: [ 60 + Providers.MODAL, 61 + Providers.E2B, 62 + Providers.BLAXEL, 63 + Providers.HOPX, 64 + Providers.RUNLOOP, 65 + ].includes(provider as Providers) 60 66 ? env.MODAL_SANDBOX_API_URL 61 67 : env.SANDBOX_API_URL, 62 68 }),
+17 -14
apps/api/src/index.ts
··· 68 68 attachSshWebSocket("/ssh"), 69 69 ]; 70 70 71 - httpServer.on("upgrade", (req: IncomingMessage, socket: Duplex, head: Buffer) => { 72 - const pathname = new URL(req.url ?? "", "http://localhost").pathname; 73 - for (const { wss, pathRegex } of wsHandlers) { 74 - const match = pathname.match(pathRegex); 75 - if (match) { 76 - wss.handleUpgrade(req, socket, head, (ws) => { 77 - wss.emit("connection", ws, req, match[1]!); 78 - }); 79 - return; 71 + httpServer.on( 72 + "upgrade", 73 + (req: IncomingMessage, socket: Duplex, head: Buffer) => { 74 + const pathname = new URL(req.url ?? "", "http://localhost").pathname; 75 + for (const { wss, pathRegex } of wsHandlers) { 76 + const match = pathname.match(pathRegex); 77 + if (match) { 78 + wss.handleUpgrade(req, socket, head, (ws) => { 79 + wss.emit("connection", ws, req, match[1]!); 80 + }); 81 + return; 82 + } 80 83 } 81 - } 82 - // No handler matched — reject cleanly 83 - socket.write("HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n"); 84 - socket.destroy(); 85 - }); 84 + // No handler matched — reject cleanly 85 + socket.write("HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n"); 86 + socket.destroy(); 87 + }, 88 + ); 86 89 87 90 httpServer.listen(process.env.POCKETENV_XPRC_PORT || 8789, () => { 88 91 consola.log(chalk.greenBright(banner));
+42
apps/api/src/lexicon/lexicons.ts
··· 585 585 "sprites", 586 586 "modal", 587 587 "e2b", 588 + "blaxel", 589 + "hopx", 590 + "runloop", 588 591 ], 589 592 }, 590 593 topics: { ··· 715 718 redactedE2bApiKey: { 716 719 type: "string", 717 720 description: "A redacted API KEY for accessing E2B resources", 721 + }, 722 + hopxApiKey: { 723 + type: "string", 724 + description: 725 + "An API KEY (encrypted) for accessing hopx resources", 726 + }, 727 + redactedHopxApiKey: { 728 + type: "string", 729 + description: "A redacted API KEY for accessing hopx resources", 730 + }, 731 + runloopApiKey: { 732 + type: "string", 733 + description: 734 + "An API KEY (encrypted) for accessing Runloop resources", 735 + }, 736 + redactedRunloopApiKey: { 737 + type: "string", 738 + description: 739 + "A redacted API KEY for accessing Runloop resources", 718 740 }, 719 741 }, 720 742 }, ··· 1107 1129 type: "string", 1108 1130 description: 1109 1131 "The redacted API KEY for E2B, returned in API responses when the sandbox provider is E2B. This can be used to identify which E2B API KEY is being used without exposing the actual API KEY.", 1132 + }, 1133 + hopxApiKey: { 1134 + type: "string", 1135 + description: 1136 + "The API KEY for hopx, if the sandbox provider is hopx. This is used to determine which hopx API KEY to use when creating the sandbox.", 1137 + }, 1138 + redactedHopxApiKey: { 1139 + type: "string", 1140 + description: 1141 + "The redacted API KEY for hopx, returned in API responses when the sandbox provider is hopx. This can be used to identify which hopx API KEY is being used without exposing the actual API KEY.", 1142 + }, 1143 + runloopApiKey: { 1144 + type: "string", 1145 + description: 1146 + "The API KEY for Runloop, if the sandbox provider is Runloop. This is used to determine which Runloop API KEY to use when creating the sandbox.", 1147 + }, 1148 + redactedRunloopApiKey: { 1149 + type: "string", 1150 + description: 1151 + "The redacted API KEY for Runloop, returned in API responses when the sandbox provider is Runloop. This can be used to identify which Runloop API KEY is being used without exposing the actual API KEY.", 1110 1152 }, 1111 1153 }, 1112 1154 },
+12 -1
apps/api/src/lexicon/types/io/pocketenv/sandbox/createSandbox.ts
··· 26 26 | "deno" 27 27 | "sprites" 28 28 | "modal" 29 - | "e2b"; 29 + | "e2b" 30 + | "blaxel" 31 + | "hopx" 32 + | "runloop"; 30 33 /** A list of topics/tags to associate with the sandbox */ 31 34 topics?: string[]; 32 35 /** A git repository URL to clone into the sandbox, e.g. a GitHub/Tangled repo. */ ··· 77 80 e2bApiKey?: string; 78 81 /** A redacted API KEY for accessing E2B resources */ 79 82 redactedE2bApiKey?: string; 83 + /** An API KEY (encrypted) for accessing hopx resources */ 84 + hopxApiKey?: string; 85 + /** A redacted API KEY for accessing hopx resources */ 86 + redactedHopxApiKey?: string; 87 + /** An API KEY (encrypted) for accessing Runloop resources */ 88 + runloopApiKey?: string; 89 + /** A redacted API KEY for accessing Runloop resources */ 90 + redactedRunloopApiKey?: string; 80 91 [k: string]: unknown; 81 92 } 82 93
+8
apps/api/src/lexicon/types/io/pocketenv/sandbox/defs.ts
··· 241 241 e2bApiKey?: string; 242 242 /** The redacted API KEY for E2B, returned in API responses when the sandbox provider is E2B. This can be used to identify which E2B API KEY is being used without exposing the actual API KEY. */ 243 243 redactedE2bApiKey?: string; 244 + /** The API KEY for hopx, if the sandbox provider is hopx. This is used to determine which hopx API KEY to use when creating the sandbox. */ 245 + hopxApiKey?: string; 246 + /** The redacted API KEY for hopx, returned in API responses when the sandbox provider is hopx. This can be used to identify which hopx API KEY is being used without exposing the actual API KEY. */ 247 + redactedHopxApiKey?: string; 248 + /** The API KEY for Runloop, if the sandbox provider is Runloop. This is used to determine which Runloop API KEY to use when creating the sandbox. */ 249 + runloopApiKey?: string; 250 + /** The redacted API KEY for Runloop, returned in API responses when the sandbox provider is Runloop. This can be used to identify which Runloop API KEY is being used without exposing the actual API KEY. */ 251 + redactedRunloopApiKey?: string; 244 252 [k: string]: unknown; 245 253 } 246 254
+5 -1
apps/api/src/pty/e2b/index.ts
··· 6 6 import decrypt from "lib/decrypt"; 7 7 import type { Message } from "pty/pty-tunnel/messages"; 8 8 9 - export async function createTerminalSession(ctx: Context, id: string, key = id): Promise<Session> { 9 + export async function createTerminalSession( 10 + ctx: Context, 11 + id: string, 12 + key = id, 13 + ): Promise<Session> { 10 14 const [record] = await ctx.db 11 15 .select() 12 16 .from(schema.sandboxes)
+30 -8
apps/api/src/pty/modal/index.ts
··· 2 2 import { eq, or } from "drizzle-orm"; 3 3 import schema from "schema"; 4 4 import { consola } from "consola"; 5 - import { ContainerProcess, ModalClient, Sandbox } from "modal"; 5 + import { type ContainerProcess, ModalClient, type Sandbox } from "modal"; 6 6 import decrypt from "lib/decrypt"; 7 7 import { createListener } from "pty/pty-tunnel"; 8 8 import chalk from "chalk"; ··· 40 40 const sandbox = await modal.sandboxes.fromId(options.id); 41 41 consola.info("Modal: sandbox fetched", chalk.greenBright(options.id)); 42 42 43 - consola.info("Modal: checking pty-tunnel-server", chalk.greenBright(options.id)); 43 + consola.info( 44 + "Modal: checking pty-tunnel-server", 45 + chalk.greenBright(options.id), 46 + ); 44 47 if (!(await checkIfServerInstalled(sandbox))) { 45 48 await $`bash -c "type /tmp/${SERVER_BIN_NAME} || curl -L ${PTY_SERVER_DOWNLOAD_URL} | tar xz -C /tmp"`; 46 49 ··· 92 95 }, 93 96 ); 94 97 95 - consola.info("Modal: pty-tunnel-server process started", chalk.greenBright(options.id)); 98 + consola.info( 99 + "Modal: pty-tunnel-server process started", 100 + chalk.greenBright(options.id), 101 + ); 96 102 97 103 return { sandbox, cmd }; 98 104 } 99 105 100 - export async function createTerminalSession(ctx: Context, id: string, key = id) { 106 + export async function createTerminalSession( 107 + ctx: Context, 108 + id: string, 109 + key = id, 110 + ) { 101 111 const [record] = await ctx.db 102 112 .select() 103 113 .from(schema.sandboxes) ··· 161 171 throw new Error(`PTY port ${PTY_PORT} not found in sandbox tunnels`); 162 172 } 163 173 164 - consola.info("Modal: awaiting pty-tunnel connection info", chalk.greenBright(id)); 174 + consola.info( 175 + "Modal: awaiting pty-tunnel connection info", 176 + chalk.greenBright(id), 177 + ); 165 178 const details = await listener.connection; 166 - consola.info("Modal: pty-tunnel connection info received", chalk.greenBright(id)); 179 + consola.info( 180 + "Modal: pty-tunnel connection info received", 181 + chalk.greenBright(id), 182 + ); 167 183 168 184 const url = `wss://${port.url.replace(/^https?:\/\//, "")}` as const; 169 185 consola.info("Connecting to WebSocket URL:", url); ··· 196 212 session.wsClients.clear(); 197 213 }); 198 214 199 - consola.info("Modal: waiting for pty-tunnel socket to open", chalk.greenBright(id)); 215 + consola.info( 216 + "Modal: waiting for pty-tunnel socket to open", 217 + chalk.greenBright(id), 218 + ); 200 219 await socket.waitForOpen(); 201 - consola.info("Modal: pty-tunnel socket open, sending ready", chalk.greenBright(id)); 220 + consola.info( 221 + "Modal: pty-tunnel socket open, sending ready", 222 + chalk.greenBright(id), 223 + ); 202 224 socket.sendMessage({ type: "ready" }); 203 225 204 226 ctx.sessions.set(key, session);
+5 -1
apps/api/src/pty/vercel/index.ts
··· 108 108 return { sandbox, cmd }; 109 109 } 110 110 111 - export async function createTerminalSession(ctx: Context, id: string, key = id) { 111 + export async function createTerminalSession( 112 + ctx: Context, 113 + id: string, 114 + key = id, 115 + ) { 112 116 const [record] = await ctx.db 113 117 .select() 114 118 .from(schema.sandboxes)
+28
apps/api/src/schema/hopx-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const hopxAuth = pgTable( 7 + "hopx_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_hopx_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectHopxAuth = InferSelectModel<typeof hopxAuth>; 26 + export type InsertHopxAuth = InferInsertModel<typeof hopxAuth>; 27 + 28 + export default hopxAuth;
+4
apps/api/src/schema/index.ts
··· 21 21 import backups from "./backups"; 22 22 import modalAuth from "./modal-auth"; 23 23 import e2bAuth from "./e2b-auth"; 24 + import hopxAuth from "./hopx-auth"; 25 + import runloopAuth from "./runloop-auth"; 24 26 25 27 export default { 26 28 sandboxes, ··· 46 48 backups, 47 49 modalAuth, 48 50 e2bAuth, 51 + hopxAuth, 52 + runloopAuth, 49 53 };
+28
apps/api/src/schema/runloop-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const runloopAuth = pgTable( 7 + "runloop_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_runloop_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectRunloopAuth = InferSelectModel<typeof runloopAuth>; 26 + export type InsertRunloopAuth = InferInsertModel<typeof runloopAuth>; 27 + 28 + export default runloopAuth;
+47 -40
apps/api/src/ssh/index.ts
··· 274 274 const pathRegex = new RegExp(`^${base}/([^/]+)/ws$`); 275 275 const wss = new WebSocketServer({ noServer: true }); 276 276 277 - wss.on("connection", async (ws: WebSocket, req: IncomingMessage, sessionId: string) => { 278 - const url = new URL(req.url ?? "", "http://localhost"); 279 - const tokenParam = url.searchParams.get("token"); 280 - const authHeader = req.headers.authorization; 281 - const bearer = tokenParam ?? authHeader?.split("Bearer ")[1]?.trim(); 282 - if (bearer && bearer !== "null") { 283 - try { 284 - jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }); 285 - } catch (err) { 286 - consola.error("WS: Invalid JWT token:", err); 287 - ws.close(1008, "Invalid token"); 277 + wss.on( 278 + "connection", 279 + async (ws: WebSocket, req: IncomingMessage, sessionId: string) => { 280 + const url = new URL(req.url ?? "", "http://localhost"); 281 + const tokenParam = url.searchParams.get("token"); 282 + const authHeader = req.headers.authorization; 283 + const bearer = tokenParam ?? authHeader?.split("Bearer ")[1]?.trim(); 284 + if (bearer && bearer !== "null") { 285 + try { 286 + jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }); 287 + } catch (err) { 288 + consola.error("WS: Invalid JWT token:", err); 289 + ws.close(1008, "Invalid token"); 290 + return; 291 + } 292 + } 293 + 294 + const session = sessions.get(sessionId); 295 + if (!session) { 296 + ws.close(1011, "Session not found"); 288 297 return; 289 298 } 290 - } 291 299 292 - const session = sessions.get(sessionId); 293 - if (!session) { 294 - ws.close(1011, "Session not found"); 295 - return; 296 - } 300 + session.wsClients.add(ws); 297 301 298 - session.wsClients.add(ws); 302 + // Flush buffered output that arrived before the WS client connected 303 + for (const encoded of session.buffer) { 304 + ws.send(encoded); 305 + } 299 306 300 - // Flush buffered output that arrived before the WS client connected 301 - for (const encoded of session.buffer) { 302 - ws.send(encoded); 303 - } 304 - 305 - ws.on("message", (data) => { 306 - if (!session.stream) return; 307 - const text = data.toString("utf-8"); 308 - try { 309 - const msg = JSON.parse(text); 310 - if (msg?.type === "resize" && Number.isInteger(msg.cols) && Number.isInteger(msg.rows)) { 311 - (session.stream as any).setWindow(msg.rows, msg.cols, 0, 0); 312 - return; 307 + ws.on("message", (data) => { 308 + if (!session.stream) return; 309 + const text = data.toString("utf-8"); 310 + try { 311 + const msg = JSON.parse(text); 312 + if ( 313 + msg?.type === "resize" && 314 + Number.isInteger(msg.cols) && 315 + Number.isInteger(msg.rows) 316 + ) { 317 + (session.stream as any).setWindow(msg.rows, msg.cols, 0, 0); 318 + return; 319 + } 320 + } catch { 321 + // not JSON — treat as raw input 313 322 } 314 - } catch { 315 - // not JSON — treat as raw input 316 - } 317 - session.stream.write(text); 318 - }); 323 + session.stream.write(text); 324 + }); 319 325 320 - ws.on("close", () => { 321 - session.wsClients.delete(ws); 322 - }); 323 - }); 326 + ws.on("close", () => { 327 + session.wsClients.delete(ws); 328 + }); 329 + }, 330 + ); 324 331 325 332 return { wss, pathRegex }; 326 333 }
+59 -52
apps/api/src/tty/index.tsx
··· 383 383 const pathRegex = new RegExp(`^${base}/([^/]+)/ws$`); 384 384 const wss = new WebSocketServer({ noServer: true }); 385 385 386 - wss.on("connection", async (ws: WebSocket, req: IncomingMessage, id: string) => { 387 - const url = new URL(req.url ?? "", "http://localhost"); 388 - const tokenParam = url.searchParams.get("token"); 389 - const authHeader = req.headers.authorization; 390 - const bearer = tokenParam ?? authHeader?.split("Bearer ")[1]?.trim(); 391 - if (bearer && bearer !== "null") { 386 + wss.on( 387 + "connection", 388 + async (ws: WebSocket, req: IncomingMessage, id: string) => { 389 + const url = new URL(req.url ?? "", "http://localhost"); 390 + const tokenParam = url.searchParams.get("token"); 391 + const authHeader = req.headers.authorization; 392 + const bearer = tokenParam ?? authHeader?.split("Bearer ")[1]?.trim(); 393 + if (bearer && bearer !== "null") { 394 + try { 395 + jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }); 396 + } catch (err) { 397 + consola.error("WS: Invalid JWT token:", err); 398 + ws.close(1008, "Invalid token"); 399 + return; 400 + } 401 + } 402 + 403 + const shareId = url.searchParams.get("sessionId") ?? undefined; 404 + const key = shareId ?? id; 405 + 406 + // Buffer messages that arrive before the session is ready. 407 + const pendingMessages: Buffer[] = []; 408 + const bufferMessage = (data: Buffer) => pendingMessages.push(data); 409 + ws.on("message", bufferMessage); 410 + 411 + let session: Session; 392 412 try { 393 - jwt.verify(bearer, env.JWT_SECRET, { ignoreExpiration: true }); 413 + session = await getSession(context.ctx, id, key); 394 414 } catch (err) { 395 - consola.error("WS: Invalid JWT token:", err); 396 - ws.close(1008, "Invalid token"); 415 + consola.error("WS: Failed to get session:", err); 416 + ws.close(1011, "Session error"); 397 417 return; 398 418 } 399 - } 400 419 401 - const shareId = url.searchParams.get("sessionId") ?? undefined; 402 - const key = shareId ?? id; 420 + session.wsClients.add(ws); 421 + ws.off("message", bufferMessage); 403 422 404 - // Buffer messages that arrive before the session is ready. 405 - const pendingMessages: Buffer[] = []; 406 - const bufferMessage = (data: Buffer) => pendingMessages.push(data); 407 - ws.on("message", bufferMessage); 408 - 409 - let session: Session; 410 - try { 411 - session = await getSession(context.ctx, id, key); 412 - } catch (err) { 413 - consola.error("WS: Failed to get session:", err); 414 - ws.close(1011, "Session error"); 415 - return; 416 - } 417 - 418 - session.wsClients.add(ws); 419 - ws.off("message", bufferMessage); 423 + const handleMessage = (data: Buffer) => { 424 + const text = data.toString("utf-8"); 425 + try { 426 + const msg = JSON.parse(text); 427 + if ( 428 + msg?.type === "resize" && 429 + Number.isInteger(msg.cols) && 430 + Number.isInteger(msg.rows) 431 + ) { 432 + session.cmd.resize(msg.cols, msg.rows); 433 + return; 434 + } 435 + } catch { 436 + // not JSON — treat as raw input 437 + } 438 + session.cmd.stdin.write(text); 439 + }; 420 440 421 - const handleMessage = (data: Buffer) => { 422 - const text = data.toString("utf-8"); 423 - try { 424 - const msg = JSON.parse(text); 425 - if (msg?.type === "resize" && Number.isInteger(msg.cols) && Number.isInteger(msg.rows)) { 426 - session.cmd.resize(msg.cols, msg.rows); 427 - return; 428 - } 429 - } catch { 430 - // not JSON — treat as raw input 441 + // Replay messages buffered during session setup (e.g. the initial resize). 442 + for (const data of pendingMessages) { 443 + handleMessage(data); 431 444 } 432 - session.cmd.stdin.write(text); 433 - }; 434 445 435 - // Replay messages buffered during session setup (e.g. the initial resize). 436 - for (const data of pendingMessages) { 437 - handleMessage(data); 438 - } 446 + ws.on("message", (data) => handleMessage(data as Buffer)); 439 447 440 - ws.on("message", (data) => handleMessage(data as Buffer)); 448 + ws.on("close", () => { 449 + session.wsClients.delete(ws); 450 + }); 441 451 442 - ws.on("close", () => { 443 - session.wsClients.delete(ws); 444 - }); 445 - 446 - // Trigger a fresh prompt redraw (initial output was lost while wsClients was empty). 447 - session.cmd.stdin.write("\n"); 448 - }); 452 + // Trigger a fresh prompt redraw (initial output was lost while wsClients was empty). 453 + session.cmd.stdin.write("\n"); 454 + }, 455 + ); 449 456 450 457 return { wss, pathRegex }; 451 458 }
+26 -9
apps/api/src/xrpc/io/pocketenv/sandbox/createSandbox.ts
··· 21 21 export default function (server: Server, ctx: Context) { 22 22 const createSandbox = async (input: InputSchema, auth: HandlerAuth) => { 23 23 let res; 24 + 25 + const { credentials, artifacts } = auth; 26 + if (!credentials && !artifacts) { 27 + throw new XRPCError( 28 + 401, 29 + "Authentication failed, invalid challenge", 30 + "AuthenticationError", 31 + ); 32 + } 33 + 34 + // disallow braxel sandboxes for users other than the designated test account 35 + if ( 36 + credentials?.did !== "did:plc:7vdlgi2bflelz7mmuxoqjfcr" && 37 + input.provider === Providers.BLAXEL 38 + ) { 39 + throw new XRPCError( 40 + 403, 41 + "Braxel sandboxes are only available to designated test accounts", 42 + "SandboxProviderError", 43 + ); 44 + } 45 + 24 46 try { 25 - const { credentials, artifacts } = auth; 26 - if (!credentials && !artifacts) { 27 - throw new XRPCError( 28 - 401, 29 - "Authentication failed, invalid challenge", 30 - "AuthenticationError", 31 - ); 32 - } 33 - 34 47 if (input.repo && credentials?.did) { 35 48 const [existingSandbox] = await ctx.db 36 49 .select() ··· 126 139 redactedModalTokenSecret: input.redactedModalTokenSecret, 127 140 e2bApiKey: input.e2bApiKey, 128 141 redactedE2bApiKey: input.redactedE2bApiKey, 142 + hopxApiKey: input.hopxApiKey, 143 + redactedHopxApiKey: input.redactedHopxApiKey, 144 + runloopApiKey: input.runloopApiKey, 145 + redactedRunloopApiKey: input.redactedRunloopApiKey, 129 146 }, 130 147 { 131 148 headers: {
+71 -44
apps/api/src/xrpc/io/pocketenv/sandbox/getPreferences.ts
··· 10 10 import daytonaAuth from "schema/daytona-auth"; 11 11 import denoAuth from "schema/deno-auth"; 12 12 import e2bAuth from "schema/e2b-auth"; 13 + import hopxAuth from "schema/hopx-auth"; 13 14 import modalAuth from "schema/modal-auth"; 15 + import runloopAuth from "schema/runloop-auth"; 14 16 import sandboxes from "schema/sandboxes"; 15 17 import spriteAuth from "schema/sprite-auth"; 16 18 import users from "schema/users"; ··· 38 40 eq(sandboxes.name, params.id), 39 41 ); 40 42 41 - const [daytona, deno, sprite, vercel, modal, e2b] = await Promise.all([ 42 - ctx.db 43 - .select() 44 - .from(daytonaAuth) 45 - .leftJoin(sandboxes, eq(daytonaAuth.sandboxId, sandboxes.id)) 46 - .where(and(eq(daytonaAuth.userId, user.id), sandboxFilter)) 47 - .execute() 48 - .then(([row]) => row?.daytona_auth), 49 - ctx.db 50 - .select() 51 - .from(denoAuth) 52 - .leftJoin(sandboxes, eq(denoAuth.sandboxId, sandboxes.id)) 53 - .where(and(eq(denoAuth.userId, user.id), sandboxFilter)) 54 - .execute() 55 - .then(([row]) => row?.deno_auth), 56 - ctx.db 57 - .select() 58 - .from(spriteAuth) 59 - .leftJoin(sandboxes, eq(spriteAuth.sandboxId, sandboxes.id)) 60 - .where(and(eq(spriteAuth.userId, user.id), sandboxFilter)) 61 - .execute() 62 - .then(([row]) => row?.sprite_auth), 63 - ctx.db 64 - .select() 65 - .from(vercelAuth) 66 - .leftJoin(sandboxes, eq(vercelAuth.sandboxId, sandboxes.id)) 67 - .where(and(eq(vercelAuth.userId, user.id), sandboxFilter)) 68 - .execute() 69 - .then(([row]) => row?.vercel_auth), 70 - ctx.db 71 - .select() 72 - .from(modalAuth) 73 - .leftJoin(sandboxes, eq(modalAuth.sandboxId, sandboxes.id)) 74 - .where(and(eq(modalAuth.userId, user.id), sandboxFilter)) 75 - .execute() 76 - .then(([row]) => row?.modal_auth), 77 - ctx.db 78 - .select() 79 - .from(e2bAuth) 80 - .leftJoin(sandboxes, eq(e2bAuth.sandboxId, sandboxes.id)) 81 - .where(and(eq(e2bAuth.userId, user.id), sandboxFilter)) 82 - .execute() 83 - .then(([row]) => row?.e2b_auth), 84 - ]); 43 + const [daytona, deno, sprite, vercel, modal, e2b, hopx, runloop] = 44 + await Promise.all([ 45 + ctx.db 46 + .select() 47 + .from(daytonaAuth) 48 + .leftJoin(sandboxes, eq(daytonaAuth.sandboxId, sandboxes.id)) 49 + .where(and(eq(daytonaAuth.userId, user.id), sandboxFilter)) 50 + .execute() 51 + .then(([row]) => row?.daytona_auth), 52 + ctx.db 53 + .select() 54 + .from(denoAuth) 55 + .leftJoin(sandboxes, eq(denoAuth.sandboxId, sandboxes.id)) 56 + .where(and(eq(denoAuth.userId, user.id), sandboxFilter)) 57 + .execute() 58 + .then(([row]) => row?.deno_auth), 59 + ctx.db 60 + .select() 61 + .from(spriteAuth) 62 + .leftJoin(sandboxes, eq(spriteAuth.sandboxId, sandboxes.id)) 63 + .where(and(eq(spriteAuth.userId, user.id), sandboxFilter)) 64 + .execute() 65 + .then(([row]) => row?.sprite_auth), 66 + ctx.db 67 + .select() 68 + .from(vercelAuth) 69 + .leftJoin(sandboxes, eq(vercelAuth.sandboxId, sandboxes.id)) 70 + .where(and(eq(vercelAuth.userId, user.id), sandboxFilter)) 71 + .execute() 72 + .then(([row]) => row?.vercel_auth), 73 + ctx.db 74 + .select() 75 + .from(modalAuth) 76 + .leftJoin(sandboxes, eq(modalAuth.sandboxId, sandboxes.id)) 77 + .where(and(eq(modalAuth.userId, user.id), sandboxFilter)) 78 + .execute() 79 + .then(([row]) => row?.modal_auth), 80 + ctx.db 81 + .select() 82 + .from(e2bAuth) 83 + .leftJoin(sandboxes, eq(e2bAuth.sandboxId, sandboxes.id)) 84 + .where(and(eq(e2bAuth.userId, user.id), sandboxFilter)) 85 + .execute() 86 + .then(([row]) => row?.e2b_auth), 87 + ctx.db 88 + .select() 89 + .from(hopxAuth) 90 + .leftJoin(sandboxes, eq(hopxAuth.sandboxId, sandboxes.id)) 91 + .where(and(eq(hopxAuth.userId, user.id), sandboxFilter)) 92 + .execute() 93 + .then(([row]) => row?.hopx_auth), 94 + ctx.db 95 + .select() 96 + .from(runloopAuth) 97 + .leftJoin(sandboxes, eq(runloopAuth.sandboxId, sandboxes.id)) 98 + .where(and(eq(runloopAuth.userId, user.id), sandboxFilter)) 99 + .execute() 100 + .then(([row]) => row?.runloop_auth), 101 + ]); 85 102 86 103 if (!daytona && !deno && !sprite && !vercel && !modal && !e2b) { 87 104 return []; ··· 120 137 $type: "io.pocketenv.sandbox.defs#sandboxProviderPref" as const, 121 138 name: "e2b" as const, 122 139 redactedE2bApiKey: e2b.redactedApiKey, 140 + }) || 141 + (hopx && { 142 + $type: "io.pocketenv.sandbox.defs#sandboxProviderPref" as const, 143 + name: "hopx" as const, 144 + redactedHopxApiKey: hopx.redactedApiKey, 145 + }) || 146 + (runloop && { 147 + $type: "io.pocketenv.sandbox.defs#sandboxProviderPref" as const, 148 + name: "runloop" as const, 149 + redactedRunloopApiKey: runloop.redactedApiKey, 123 150 }))!; 124 151 125 152 return [provider satisfies SandboxProviderPref];
+62
apps/api/src/xrpc/io/pocketenv/sandbox/putPreferences.ts
··· 21 21 import type { NodePgQueryResultHKT } from "drizzle-orm/node-postgres"; 22 22 import modalAuth, { type InsertModalAuth } from "schema/modal-auth"; 23 23 import e2bAuth, { type InsertE2BAuth } from "schema/e2b-auth"; 24 + import hopxAuth from "schema/hopx-auth"; 25 + import runloopAuth from "schema/runloop-auth"; 24 26 25 27 export default function (server: Server, ctx: Context) { 26 28 const putPreferences = async (input: HandlerInput, auth: HandlerAuth) => { ··· 258 260 }) 259 261 .execute(); 260 262 break; 263 + case "hopx": 264 + await tx 265 + .insert(hopxAuth) 266 + .values({ 267 + userId: user.id, 268 + sandboxId: input.body.sandboxId, 269 + apiKey: pref.hopxApiKey!, 270 + redactedApiKey: pref.redactedHopxApiKey!, 271 + }) 272 + .onConflictDoUpdate({ 273 + target: [hopxAuth.sandboxId, hopxAuth.userId], 274 + set: { 275 + apiKey: pref.hopxApiKey!, 276 + redactedApiKey: pref.redactedHopxApiKey!, 277 + }, 278 + }) 279 + .execute(); 280 + break; 281 + case "runloop": 282 + await tx 283 + .insert(runloopAuth) 284 + .values({ 285 + userId: user.id, 286 + sandboxId: input.body.sandboxId, 287 + apiKey: pref.runloopApiKey!, 288 + redactedApiKey: pref.redactedRunloopApiKey!, 289 + }) 290 + .onConflictDoUpdate({ 291 + target: [runloopAuth.sandboxId, runloopAuth.userId], 292 + set: { 293 + apiKey: pref.runloopApiKey!, 294 + redactedApiKey: pref.redactedRunloopApiKey!, 295 + }, 296 + }) 297 + .execute(); 298 + break; 261 299 case "cloudflare": { 262 300 const [record] = await tx 263 301 .select() ··· 316 354 and( 317 355 eq(modalAuth.userId, user.id), 318 356 eq(modalAuth.sandboxId, record!.id), 357 + ), 358 + ) 359 + .execute(), 360 + tx 361 + .delete(e2bAuth) 362 + .where( 363 + and(eq(e2bAuth.userId, user.id), eq(e2bAuth.sandboxId, record!.id)), 364 + ) 365 + .execute(), 366 + tx 367 + .delete(hopxAuth) 368 + .where( 369 + and( 370 + eq(hopxAuth.userId, user.id), 371 + eq(hopxAuth.sandboxId, record!.id), 372 + ), 373 + ) 374 + .execute(), 375 + tx 376 + .delete(runloopAuth) 377 + .where( 378 + and( 379 + eq(runloopAuth.userId, user.id), 380 + eq(runloopAuth.sandboxId, record!.id), 319 381 ), 320 382 ) 321 383 .execute(),
+24
apps/cf-sandbox/drizzle/0046_strong_carlie_cooper.sql
··· 1 + CREATE TABLE "hopx_auth" ( 2 + "id" text PRIMARY KEY DEFAULT xata_id() NOT NULL, 3 + "sandbox_id" text NOT NULL, 4 + "user_id" text NOT NULL, 5 + "api_key" text NOT NULL, 6 + "redacted_api_key" text NOT NULL, 7 + "created_at" timestamp DEFAULT now() NOT NULL 8 + ); 9 + --> statement-breakpoint 10 + CREATE TABLE "runloop_auth" ( 11 + "id" text PRIMARY KEY DEFAULT xata_id() NOT NULL, 12 + "sandbox_id" text NOT NULL, 13 + "user_id" text NOT NULL, 14 + "api_key" text NOT NULL, 15 + "redacted_api_key" text NOT NULL, 16 + "created_at" timestamp DEFAULT now() NOT NULL 17 + ); 18 + --> statement-breakpoint 19 + ALTER TABLE "hopx_auth" ADD CONSTRAINT "hopx_auth_sandbox_id_sandboxes_id_fk" FOREIGN KEY ("sandbox_id") REFERENCES "public"."sandboxes"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint 20 + ALTER TABLE "hopx_auth" ADD CONSTRAINT "hopx_auth_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint 21 + ALTER TABLE "runloop_auth" ADD CONSTRAINT "runloop_auth_sandbox_id_sandboxes_id_fk" FOREIGN KEY ("sandbox_id") REFERENCES "public"."sandboxes"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint 22 + ALTER TABLE "runloop_auth" ADD CONSTRAINT "runloop_auth_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint 23 + CREATE UNIQUE INDEX "unique_hopx_auth" ON "hopx_auth" USING btree ("sandbox_id","user_id");--> statement-breakpoint 24 + CREATE UNIQUE INDEX "unique_runloop_auth" ON "runloop_auth" USING btree ("sandbox_id","user_id");
+2393
apps/cf-sandbox/drizzle/meta/0046_snapshot.json
··· 1 + { 2 + "id": "ae9f57dc-48bb-499b-b686-8c2481f13460", 3 + "prevId": "6d8b3f4b-ebed-47dc-b77d-3d0b6a95c883", 4 + "version": "7", 5 + "dialect": "postgresql", 6 + "tables": { 7 + "public.authorized_keys": { 8 + "name": "authorized_keys", 9 + "schema": "", 10 + "columns": { 11 + "id": { 12 + "name": "id", 13 + "type": "text", 14 + "primaryKey": true, 15 + "notNull": true, 16 + "default": "xata_id()" 17 + }, 18 + "sandbox_id": { 19 + "name": "sandbox_id", 20 + "type": "text", 21 + "primaryKey": false, 22 + "notNull": false 23 + }, 24 + "public_key": { 25 + "name": "public_key", 26 + "type": "text", 27 + "primaryKey": false, 28 + "notNull": true 29 + }, 30 + "created_at": { 31 + "name": "created_at", 32 + "type": "timestamp", 33 + "primaryKey": false, 34 + "notNull": true, 35 + "default": "now()" 36 + } 37 + }, 38 + "indexes": {}, 39 + "foreignKeys": { 40 + "authorized_keys_sandbox_id_sandboxes_id_fk": { 41 + "name": "authorized_keys_sandbox_id_sandboxes_id_fk", 42 + "tableFrom": "authorized_keys", 43 + "tableTo": "sandboxes", 44 + "columnsFrom": [ 45 + "sandbox_id" 46 + ], 47 + "columnsTo": [ 48 + "id" 49 + ], 50 + "onDelete": "no action", 51 + "onUpdate": "no action" 52 + } 53 + }, 54 + "compositePrimaryKeys": {}, 55 + "uniqueConstraints": {}, 56 + "policies": {}, 57 + "checkConstraints": {}, 58 + "isRLSEnabled": false 59 + }, 60 + "public.backups": { 61 + "name": "backups", 62 + "schema": "", 63 + "columns": { 64 + "id": { 65 + "name": "id", 66 + "type": "text", 67 + "primaryKey": true, 68 + "notNull": true, 69 + "default": "xata_id()" 70 + }, 71 + "sandbox_id": { 72 + "name": "sandbox_id", 73 + "type": "text", 74 + "primaryKey": false, 75 + "notNull": true 76 + }, 77 + "backup_id": { 78 + "name": "backup_id", 79 + "type": "text", 80 + "primaryKey": false, 81 + "notNull": true 82 + }, 83 + "directory": { 84 + "name": "directory", 85 + "type": "text", 86 + "primaryKey": false, 87 + "notNull": true 88 + }, 89 + "description": { 90 + "name": "description", 91 + "type": "text", 92 + "primaryKey": false, 93 + "notNull": false 94 + }, 95 + "expires_at": { 96 + "name": "expires_at", 97 + "type": "timestamp", 98 + "primaryKey": false, 99 + "notNull": false 100 + }, 101 + "created_at": { 102 + "name": "created_at", 103 + "type": "timestamp", 104 + "primaryKey": false, 105 + "notNull": true, 106 + "default": "now()" 107 + } 108 + }, 109 + "indexes": {}, 110 + "foreignKeys": { 111 + "backups_sandbox_id_sandboxes_id_fk": { 112 + "name": "backups_sandbox_id_sandboxes_id_fk", 113 + "tableFrom": "backups", 114 + "tableTo": "sandboxes", 115 + "columnsFrom": [ 116 + "sandbox_id" 117 + ], 118 + "columnsTo": [ 119 + "id" 120 + ], 121 + "onDelete": "cascade", 122 + "onUpdate": "no action" 123 + } 124 + }, 125 + "compositePrimaryKeys": {}, 126 + "uniqueConstraints": {}, 127 + "policies": {}, 128 + "checkConstraints": {}, 129 + "isRLSEnabled": false 130 + }, 131 + "public.daytona_auth": { 132 + "name": "daytona_auth", 133 + "schema": "", 134 + "columns": { 135 + "id": { 136 + "name": "id", 137 + "type": "text", 138 + "primaryKey": true, 139 + "notNull": true, 140 + "default": "xata_id()" 141 + }, 142 + "sandbox_id": { 143 + "name": "sandbox_id", 144 + "type": "text", 145 + "primaryKey": false, 146 + "notNull": true 147 + }, 148 + "user_id": { 149 + "name": "user_id", 150 + "type": "text", 151 + "primaryKey": false, 152 + "notNull": true 153 + }, 154 + "api_key": { 155 + "name": "api_key", 156 + "type": "text", 157 + "primaryKey": false, 158 + "notNull": true 159 + }, 160 + "organization_id": { 161 + "name": "organization_id", 162 + "type": "text", 163 + "primaryKey": false, 164 + "notNull": true 165 + }, 166 + "redacted_api_key": { 167 + "name": "redacted_api_key", 168 + "type": "text", 169 + "primaryKey": false, 170 + "notNull": true 171 + }, 172 + "created_at": { 173 + "name": "created_at", 174 + "type": "timestamp", 175 + "primaryKey": false, 176 + "notNull": true, 177 + "default": "now()" 178 + } 179 + }, 180 + "indexes": { 181 + "unique_daytona_auth": { 182 + "name": "unique_daytona_auth", 183 + "columns": [ 184 + { 185 + "expression": "sandbox_id", 186 + "isExpression": false, 187 + "asc": true, 188 + "nulls": "last" 189 + }, 190 + { 191 + "expression": "user_id", 192 + "isExpression": false, 193 + "asc": true, 194 + "nulls": "last" 195 + } 196 + ], 197 + "isUnique": true, 198 + "concurrently": false, 199 + "method": "btree", 200 + "with": {} 201 + } 202 + }, 203 + "foreignKeys": { 204 + "daytona_auth_sandbox_id_sandboxes_id_fk": { 205 + "name": "daytona_auth_sandbox_id_sandboxes_id_fk", 206 + "tableFrom": "daytona_auth", 207 + "tableTo": "sandboxes", 208 + "columnsFrom": [ 209 + "sandbox_id" 210 + ], 211 + "columnsTo": [ 212 + "id" 213 + ], 214 + "onDelete": "cascade", 215 + "onUpdate": "no action" 216 + }, 217 + "daytona_auth_user_id_users_id_fk": { 218 + "name": "daytona_auth_user_id_users_id_fk", 219 + "tableFrom": "daytona_auth", 220 + "tableTo": "users", 221 + "columnsFrom": [ 222 + "user_id" 223 + ], 224 + "columnsTo": [ 225 + "id" 226 + ], 227 + "onDelete": "no action", 228 + "onUpdate": "no action" 229 + } 230 + }, 231 + "compositePrimaryKeys": {}, 232 + "uniqueConstraints": {}, 233 + "policies": {}, 234 + "checkConstraints": {}, 235 + "isRLSEnabled": false 236 + }, 237 + "public.deno_auth": { 238 + "name": "deno_auth", 239 + "schema": "", 240 + "columns": { 241 + "id": { 242 + "name": "id", 243 + "type": "text", 244 + "primaryKey": true, 245 + "notNull": true, 246 + "default": "xata_id()" 247 + }, 248 + "sandbox_id": { 249 + "name": "sandbox_id", 250 + "type": "text", 251 + "primaryKey": false, 252 + "notNull": true 253 + }, 254 + "deploy_token": { 255 + "name": "deploy_token", 256 + "type": "text", 257 + "primaryKey": false, 258 + "notNull": true 259 + }, 260 + "user_id": { 261 + "name": "user_id", 262 + "type": "text", 263 + "primaryKey": false, 264 + "notNull": true 265 + }, 266 + "redacted_deno_token": { 267 + "name": "redacted_deno_token", 268 + "type": "text", 269 + "primaryKey": false, 270 + "notNull": true 271 + }, 272 + "created_at": { 273 + "name": "created_at", 274 + "type": "timestamp", 275 + "primaryKey": false, 276 + "notNull": true, 277 + "default": "now()" 278 + } 279 + }, 280 + "indexes": { 281 + "unique_deno_auth": { 282 + "name": "unique_deno_auth", 283 + "columns": [ 284 + { 285 + "expression": "sandbox_id", 286 + "isExpression": false, 287 + "asc": true, 288 + "nulls": "last" 289 + }, 290 + { 291 + "expression": "user_id", 292 + "isExpression": false, 293 + "asc": true, 294 + "nulls": "last" 295 + } 296 + ], 297 + "isUnique": true, 298 + "concurrently": false, 299 + "method": "btree", 300 + "with": {} 301 + } 302 + }, 303 + "foreignKeys": { 304 + "deno_auth_sandbox_id_sandboxes_id_fk": { 305 + "name": "deno_auth_sandbox_id_sandboxes_id_fk", 306 + "tableFrom": "deno_auth", 307 + "tableTo": "sandboxes", 308 + "columnsFrom": [ 309 + "sandbox_id" 310 + ], 311 + "columnsTo": [ 312 + "id" 313 + ], 314 + "onDelete": "cascade", 315 + "onUpdate": "no action" 316 + }, 317 + "deno_auth_user_id_users_id_fk": { 318 + "name": "deno_auth_user_id_users_id_fk", 319 + "tableFrom": "deno_auth", 320 + "tableTo": "users", 321 + "columnsFrom": [ 322 + "user_id" 323 + ], 324 + "columnsTo": [ 325 + "id" 326 + ], 327 + "onDelete": "no action", 328 + "onUpdate": "no action" 329 + } 330 + }, 331 + "compositePrimaryKeys": {}, 332 + "uniqueConstraints": {}, 333 + "policies": {}, 334 + "checkConstraints": {}, 335 + "isRLSEnabled": false 336 + }, 337 + "public.e2b_auth": { 338 + "name": "e2b_auth", 339 + "schema": "", 340 + "columns": { 341 + "id": { 342 + "name": "id", 343 + "type": "text", 344 + "primaryKey": true, 345 + "notNull": true, 346 + "default": "xata_id()" 347 + }, 348 + "sandbox_id": { 349 + "name": "sandbox_id", 350 + "type": "text", 351 + "primaryKey": false, 352 + "notNull": true 353 + }, 354 + "user_id": { 355 + "name": "user_id", 356 + "type": "text", 357 + "primaryKey": false, 358 + "notNull": true 359 + }, 360 + "api_key": { 361 + "name": "api_key", 362 + "type": "text", 363 + "primaryKey": false, 364 + "notNull": true 365 + }, 366 + "redacted_api_key": { 367 + "name": "redacted_api_key", 368 + "type": "text", 369 + "primaryKey": false, 370 + "notNull": true 371 + }, 372 + "created_at": { 373 + "name": "created_at", 374 + "type": "timestamp", 375 + "primaryKey": false, 376 + "notNull": true, 377 + "default": "now()" 378 + } 379 + }, 380 + "indexes": { 381 + "unique_e2b_auth": { 382 + "name": "unique_e2b_auth", 383 + "columns": [ 384 + { 385 + "expression": "sandbox_id", 386 + "isExpression": false, 387 + "asc": true, 388 + "nulls": "last" 389 + }, 390 + { 391 + "expression": "user_id", 392 + "isExpression": false, 393 + "asc": true, 394 + "nulls": "last" 395 + } 396 + ], 397 + "isUnique": true, 398 + "concurrently": false, 399 + "method": "btree", 400 + "with": {} 401 + } 402 + }, 403 + "foreignKeys": { 404 + "e2b_auth_sandbox_id_sandboxes_id_fk": { 405 + "name": "e2b_auth_sandbox_id_sandboxes_id_fk", 406 + "tableFrom": "e2b_auth", 407 + "tableTo": "sandboxes", 408 + "columnsFrom": [ 409 + "sandbox_id" 410 + ], 411 + "columnsTo": [ 412 + "id" 413 + ], 414 + "onDelete": "cascade", 415 + "onUpdate": "no action" 416 + }, 417 + "e2b_auth_user_id_users_id_fk": { 418 + "name": "e2b_auth_user_id_users_id_fk", 419 + "tableFrom": "e2b_auth", 420 + "tableTo": "users", 421 + "columnsFrom": [ 422 + "user_id" 423 + ], 424 + "columnsTo": [ 425 + "id" 426 + ], 427 + "onDelete": "no action", 428 + "onUpdate": "no action" 429 + } 430 + }, 431 + "compositePrimaryKeys": {}, 432 + "uniqueConstraints": {}, 433 + "policies": {}, 434 + "checkConstraints": {}, 435 + "isRLSEnabled": false 436 + }, 437 + "public.files": { 438 + "name": "files", 439 + "schema": "", 440 + "columns": { 441 + "id": { 442 + "name": "id", 443 + "type": "text", 444 + "primaryKey": true, 445 + "notNull": true, 446 + "default": "xata_id()" 447 + }, 448 + "content": { 449 + "name": "content", 450 + "type": "text", 451 + "primaryKey": false, 452 + "notNull": true 453 + }, 454 + "created_at": { 455 + "name": "created_at", 456 + "type": "timestamp", 457 + "primaryKey": false, 458 + "notNull": true, 459 + "default": "now()" 460 + }, 461 + "updated_at": { 462 + "name": "updated_at", 463 + "type": "timestamp", 464 + "primaryKey": false, 465 + "notNull": true, 466 + "default": "now()" 467 + } 468 + }, 469 + "indexes": {}, 470 + "foreignKeys": {}, 471 + "compositePrimaryKeys": {}, 472 + "uniqueConstraints": {}, 473 + "policies": {}, 474 + "checkConstraints": {}, 475 + "isRLSEnabled": false 476 + }, 477 + "public.hopx_auth": { 478 + "name": "hopx_auth", 479 + "schema": "", 480 + "columns": { 481 + "id": { 482 + "name": "id", 483 + "type": "text", 484 + "primaryKey": true, 485 + "notNull": true, 486 + "default": "xata_id()" 487 + }, 488 + "sandbox_id": { 489 + "name": "sandbox_id", 490 + "type": "text", 491 + "primaryKey": false, 492 + "notNull": true 493 + }, 494 + "user_id": { 495 + "name": "user_id", 496 + "type": "text", 497 + "primaryKey": false, 498 + "notNull": true 499 + }, 500 + "api_key": { 501 + "name": "api_key", 502 + "type": "text", 503 + "primaryKey": false, 504 + "notNull": true 505 + }, 506 + "redacted_api_key": { 507 + "name": "redacted_api_key", 508 + "type": "text", 509 + "primaryKey": false, 510 + "notNull": true 511 + }, 512 + "created_at": { 513 + "name": "created_at", 514 + "type": "timestamp", 515 + "primaryKey": false, 516 + "notNull": true, 517 + "default": "now()" 518 + } 519 + }, 520 + "indexes": { 521 + "unique_hopx_auth": { 522 + "name": "unique_hopx_auth", 523 + "columns": [ 524 + { 525 + "expression": "sandbox_id", 526 + "isExpression": false, 527 + "asc": true, 528 + "nulls": "last" 529 + }, 530 + { 531 + "expression": "user_id", 532 + "isExpression": false, 533 + "asc": true, 534 + "nulls": "last" 535 + } 536 + ], 537 + "isUnique": true, 538 + "concurrently": false, 539 + "method": "btree", 540 + "with": {} 541 + } 542 + }, 543 + "foreignKeys": { 544 + "hopx_auth_sandbox_id_sandboxes_id_fk": { 545 + "name": "hopx_auth_sandbox_id_sandboxes_id_fk", 546 + "tableFrom": "hopx_auth", 547 + "tableTo": "sandboxes", 548 + "columnsFrom": [ 549 + "sandbox_id" 550 + ], 551 + "columnsTo": [ 552 + "id" 553 + ], 554 + "onDelete": "cascade", 555 + "onUpdate": "no action" 556 + }, 557 + "hopx_auth_user_id_users_id_fk": { 558 + "name": "hopx_auth_user_id_users_id_fk", 559 + "tableFrom": "hopx_auth", 560 + "tableTo": "users", 561 + "columnsFrom": [ 562 + "user_id" 563 + ], 564 + "columnsTo": [ 565 + "id" 566 + ], 567 + "onDelete": "no action", 568 + "onUpdate": "no action" 569 + } 570 + }, 571 + "compositePrimaryKeys": {}, 572 + "uniqueConstraints": {}, 573 + "policies": {}, 574 + "checkConstraints": {}, 575 + "isRLSEnabled": false 576 + }, 577 + "public.modal_auth": { 578 + "name": "modal_auth", 579 + "schema": "", 580 + "columns": { 581 + "id": { 582 + "name": "id", 583 + "type": "text", 584 + "primaryKey": true, 585 + "notNull": true, 586 + "default": "xata_id()" 587 + }, 588 + "sandbox_id": { 589 + "name": "sandbox_id", 590 + "type": "text", 591 + "primaryKey": false, 592 + "notNull": true 593 + }, 594 + "user_id": { 595 + "name": "user_id", 596 + "type": "text", 597 + "primaryKey": false, 598 + "notNull": true 599 + }, 600 + "token_id": { 601 + "name": "token_id", 602 + "type": "text", 603 + "primaryKey": false, 604 + "notNull": true 605 + }, 606 + "redacted_token_id": { 607 + "name": "redacted_token_id", 608 + "type": "text", 609 + "primaryKey": false, 610 + "notNull": true 611 + }, 612 + "token_secret": { 613 + "name": "token_secret", 614 + "type": "text", 615 + "primaryKey": false, 616 + "notNull": true 617 + }, 618 + "redacted_token_secret": { 619 + "name": "redacted_token_secret", 620 + "type": "text", 621 + "primaryKey": false, 622 + "notNull": true 623 + }, 624 + "created_at": { 625 + "name": "created_at", 626 + "type": "timestamp", 627 + "primaryKey": false, 628 + "notNull": true, 629 + "default": "now()" 630 + } 631 + }, 632 + "indexes": { 633 + "unique_modal_auth": { 634 + "name": "unique_modal_auth", 635 + "columns": [ 636 + { 637 + "expression": "sandbox_id", 638 + "isExpression": false, 639 + "asc": true, 640 + "nulls": "last" 641 + }, 642 + { 643 + "expression": "user_id", 644 + "isExpression": false, 645 + "asc": true, 646 + "nulls": "last" 647 + } 648 + ], 649 + "isUnique": true, 650 + "concurrently": false, 651 + "method": "btree", 652 + "with": {} 653 + } 654 + }, 655 + "foreignKeys": { 656 + "modal_auth_sandbox_id_sandboxes_id_fk": { 657 + "name": "modal_auth_sandbox_id_sandboxes_id_fk", 658 + "tableFrom": "modal_auth", 659 + "tableTo": "sandboxes", 660 + "columnsFrom": [ 661 + "sandbox_id" 662 + ], 663 + "columnsTo": [ 664 + "id" 665 + ], 666 + "onDelete": "cascade", 667 + "onUpdate": "no action" 668 + }, 669 + "modal_auth_user_id_users_id_fk": { 670 + "name": "modal_auth_user_id_users_id_fk", 671 + "tableFrom": "modal_auth", 672 + "tableTo": "users", 673 + "columnsFrom": [ 674 + "user_id" 675 + ], 676 + "columnsTo": [ 677 + "id" 678 + ], 679 + "onDelete": "no action", 680 + "onUpdate": "no action" 681 + } 682 + }, 683 + "compositePrimaryKeys": {}, 684 + "uniqueConstraints": {}, 685 + "policies": {}, 686 + "checkConstraints": {}, 687 + "isRLSEnabled": false 688 + }, 689 + "public.runloop_auth": { 690 + "name": "runloop_auth", 691 + "schema": "", 692 + "columns": { 693 + "id": { 694 + "name": "id", 695 + "type": "text", 696 + "primaryKey": true, 697 + "notNull": true, 698 + "default": "xata_id()" 699 + }, 700 + "sandbox_id": { 701 + "name": "sandbox_id", 702 + "type": "text", 703 + "primaryKey": false, 704 + "notNull": true 705 + }, 706 + "user_id": { 707 + "name": "user_id", 708 + "type": "text", 709 + "primaryKey": false, 710 + "notNull": true 711 + }, 712 + "api_key": { 713 + "name": "api_key", 714 + "type": "text", 715 + "primaryKey": false, 716 + "notNull": true 717 + }, 718 + "redacted_api_key": { 719 + "name": "redacted_api_key", 720 + "type": "text", 721 + "primaryKey": false, 722 + "notNull": true 723 + }, 724 + "created_at": { 725 + "name": "created_at", 726 + "type": "timestamp", 727 + "primaryKey": false, 728 + "notNull": true, 729 + "default": "now()" 730 + } 731 + }, 732 + "indexes": { 733 + "unique_runloop_auth": { 734 + "name": "unique_runloop_auth", 735 + "columns": [ 736 + { 737 + "expression": "sandbox_id", 738 + "isExpression": false, 739 + "asc": true, 740 + "nulls": "last" 741 + }, 742 + { 743 + "expression": "user_id", 744 + "isExpression": false, 745 + "asc": true, 746 + "nulls": "last" 747 + } 748 + ], 749 + "isUnique": true, 750 + "concurrently": false, 751 + "method": "btree", 752 + "with": {} 753 + } 754 + }, 755 + "foreignKeys": { 756 + "runloop_auth_sandbox_id_sandboxes_id_fk": { 757 + "name": "runloop_auth_sandbox_id_sandboxes_id_fk", 758 + "tableFrom": "runloop_auth", 759 + "tableTo": "sandboxes", 760 + "columnsFrom": [ 761 + "sandbox_id" 762 + ], 763 + "columnsTo": [ 764 + "id" 765 + ], 766 + "onDelete": "cascade", 767 + "onUpdate": "no action" 768 + }, 769 + "runloop_auth_user_id_users_id_fk": { 770 + "name": "runloop_auth_user_id_users_id_fk", 771 + "tableFrom": "runloop_auth", 772 + "tableTo": "users", 773 + "columnsFrom": [ 774 + "user_id" 775 + ], 776 + "columnsTo": [ 777 + "id" 778 + ], 779 + "onDelete": "no action", 780 + "onUpdate": "no action" 781 + } 782 + }, 783 + "compositePrimaryKeys": {}, 784 + "uniqueConstraints": {}, 785 + "policies": {}, 786 + "checkConstraints": {}, 787 + "isRLSEnabled": false 788 + }, 789 + "public.sandbox_cp": { 790 + "name": "sandbox_cp", 791 + "schema": "", 792 + "columns": { 793 + "id": { 794 + "name": "id", 795 + "type": "text", 796 + "primaryKey": true, 797 + "notNull": true, 798 + "default": "xata_id()" 799 + }, 800 + "copy_uuid": { 801 + "name": "copy_uuid", 802 + "type": "text", 803 + "primaryKey": false, 804 + "notNull": true 805 + }, 806 + "created_at": { 807 + "name": "created_at", 808 + "type": "timestamp", 809 + "primaryKey": false, 810 + "notNull": true, 811 + "default": "now()" 812 + } 813 + }, 814 + "indexes": {}, 815 + "foreignKeys": {}, 816 + "compositePrimaryKeys": {}, 817 + "uniqueConstraints": { 818 + "sandbox_cp_copy_uuid_unique": { 819 + "name": "sandbox_cp_copy_uuid_unique", 820 + "nullsNotDistinct": false, 821 + "columns": [ 822 + "copy_uuid" 823 + ] 824 + } 825 + }, 826 + "policies": {}, 827 + "checkConstraints": {}, 828 + "isRLSEnabled": false 829 + }, 830 + "public.sandbox_files": { 831 + "name": "sandbox_files", 832 + "schema": "", 833 + "columns": { 834 + "id": { 835 + "name": "id", 836 + "type": "text", 837 + "primaryKey": true, 838 + "notNull": true, 839 + "default": "file_id()" 840 + }, 841 + "sandbox_id": { 842 + "name": "sandbox_id", 843 + "type": "text", 844 + "primaryKey": false, 845 + "notNull": true 846 + }, 847 + "file_id": { 848 + "name": "file_id", 849 + "type": "text", 850 + "primaryKey": false, 851 + "notNull": true 852 + }, 853 + "path": { 854 + "name": "path", 855 + "type": "text", 856 + "primaryKey": false, 857 + "notNull": true 858 + }, 859 + "created_at": { 860 + "name": "created_at", 861 + "type": "timestamp", 862 + "primaryKey": false, 863 + "notNull": true, 864 + "default": "now()" 865 + }, 866 + "updated_at": { 867 + "name": "updated_at", 868 + "type": "timestamp", 869 + "primaryKey": false, 870 + "notNull": true, 871 + "default": "now()" 872 + } 873 + }, 874 + "indexes": { 875 + "unique_sandbox_file_path": { 876 + "name": "unique_sandbox_file_path", 877 + "columns": [ 878 + { 879 + "expression": "sandbox_id", 880 + "isExpression": false, 881 + "asc": true, 882 + "nulls": "last" 883 + }, 884 + { 885 + "expression": "path", 886 + "isExpression": false, 887 + "asc": true, 888 + "nulls": "last" 889 + } 890 + ], 891 + "isUnique": true, 892 + "concurrently": false, 893 + "method": "btree", 894 + "with": {} 895 + } 896 + }, 897 + "foreignKeys": { 898 + "sandbox_files_sandbox_id_sandboxes_id_fk": { 899 + "name": "sandbox_files_sandbox_id_sandboxes_id_fk", 900 + "tableFrom": "sandbox_files", 901 + "tableTo": "sandboxes", 902 + "columnsFrom": [ 903 + "sandbox_id" 904 + ], 905 + "columnsTo": [ 906 + "id" 907 + ], 908 + "onDelete": "cascade", 909 + "onUpdate": "no action" 910 + }, 911 + "sandbox_files_file_id_files_id_fk": { 912 + "name": "sandbox_files_file_id_files_id_fk", 913 + "tableFrom": "sandbox_files", 914 + "tableTo": "files", 915 + "columnsFrom": [ 916 + "file_id" 917 + ], 918 + "columnsTo": [ 919 + "id" 920 + ], 921 + "onDelete": "no action", 922 + "onUpdate": "no action" 923 + } 924 + }, 925 + "compositePrimaryKeys": {}, 926 + "uniqueConstraints": {}, 927 + "policies": {}, 928 + "checkConstraints": {}, 929 + "isRLSEnabled": false 930 + }, 931 + "public.sandbox_ports": { 932 + "name": "sandbox_ports", 933 + "schema": "", 934 + "columns": { 935 + "id": { 936 + "name": "id", 937 + "type": "text", 938 + "primaryKey": true, 939 + "notNull": true, 940 + "default": "xata_id()" 941 + }, 942 + "sandbox_id": { 943 + "name": "sandbox_id", 944 + "type": "text", 945 + "primaryKey": false, 946 + "notNull": true 947 + }, 948 + "exposed_port": { 949 + "name": "exposed_port", 950 + "type": "integer", 951 + "primaryKey": false, 952 + "notNull": true 953 + }, 954 + "preview_url": { 955 + "name": "preview_url", 956 + "type": "text", 957 + "primaryKey": false, 958 + "notNull": false 959 + }, 960 + "description": { 961 + "name": "description", 962 + "type": "text", 963 + "primaryKey": false, 964 + "notNull": false 965 + }, 966 + "service_id": { 967 + "name": "service_id", 968 + "type": "text", 969 + "primaryKey": false, 970 + "notNull": false 971 + }, 972 + "created_at": { 973 + "name": "created_at", 974 + "type": "timestamp", 975 + "primaryKey": false, 976 + "notNull": true, 977 + "default": "now()" 978 + }, 979 + "updated_at": { 980 + "name": "updated_at", 981 + "type": "timestamp", 982 + "primaryKey": false, 983 + "notNull": true, 984 + "default": "now()" 985 + } 986 + }, 987 + "indexes": { 988 + "unique_sandbox_port": { 989 + "name": "unique_sandbox_port", 990 + "columns": [ 991 + { 992 + "expression": "sandbox_id", 993 + "isExpression": false, 994 + "asc": true, 995 + "nulls": "last" 996 + }, 997 + { 998 + "expression": "exposed_port", 999 + "isExpression": false, 1000 + "asc": true, 1001 + "nulls": "last" 1002 + } 1003 + ], 1004 + "isUnique": true, 1005 + "concurrently": false, 1006 + "method": "btree", 1007 + "with": {} 1008 + } 1009 + }, 1010 + "foreignKeys": { 1011 + "sandbox_ports_sandbox_id_sandboxes_id_fk": { 1012 + "name": "sandbox_ports_sandbox_id_sandboxes_id_fk", 1013 + "tableFrom": "sandbox_ports", 1014 + "tableTo": "sandboxes", 1015 + "columnsFrom": [ 1016 + "sandbox_id" 1017 + ], 1018 + "columnsTo": [ 1019 + "id" 1020 + ], 1021 + "onDelete": "cascade", 1022 + "onUpdate": "no action" 1023 + }, 1024 + "sandbox_ports_service_id_services_id_fk": { 1025 + "name": "sandbox_ports_service_id_services_id_fk", 1026 + "tableFrom": "sandbox_ports", 1027 + "tableTo": "services", 1028 + "columnsFrom": [ 1029 + "service_id" 1030 + ], 1031 + "columnsTo": [ 1032 + "id" 1033 + ], 1034 + "onDelete": "no action", 1035 + "onUpdate": "no action" 1036 + } 1037 + }, 1038 + "compositePrimaryKeys": {}, 1039 + "uniqueConstraints": {}, 1040 + "policies": {}, 1041 + "checkConstraints": {}, 1042 + "isRLSEnabled": false 1043 + }, 1044 + "public.sandbox_secrets": { 1045 + "name": "sandbox_secrets", 1046 + "schema": "", 1047 + "columns": { 1048 + "id": { 1049 + "name": "id", 1050 + "type": "text", 1051 + "primaryKey": true, 1052 + "notNull": true, 1053 + "default": "xata_id()" 1054 + }, 1055 + "sandbox_id": { 1056 + "name": "sandbox_id", 1057 + "type": "text", 1058 + "primaryKey": false, 1059 + "notNull": true 1060 + }, 1061 + "secret_id": { 1062 + "name": "secret_id", 1063 + "type": "text", 1064 + "primaryKey": false, 1065 + "notNull": true 1066 + }, 1067 + "name": { 1068 + "name": "name", 1069 + "type": "text", 1070 + "primaryKey": false, 1071 + "notNull": false 1072 + }, 1073 + "created_at": { 1074 + "name": "created_at", 1075 + "type": "timestamp", 1076 + "primaryKey": false, 1077 + "notNull": true, 1078 + "default": "now()" 1079 + }, 1080 + "updated_at": { 1081 + "name": "updated_at", 1082 + "type": "timestamp", 1083 + "primaryKey": false, 1084 + "notNull": true, 1085 + "default": "now()" 1086 + } 1087 + }, 1088 + "indexes": { 1089 + "unique_sandbox_secret_by_name": { 1090 + "name": "unique_sandbox_secret_by_name", 1091 + "columns": [ 1092 + { 1093 + "expression": "sandbox_id", 1094 + "isExpression": false, 1095 + "asc": true, 1096 + "nulls": "last" 1097 + }, 1098 + { 1099 + "expression": "name", 1100 + "isExpression": false, 1101 + "asc": true, 1102 + "nulls": "last" 1103 + } 1104 + ], 1105 + "isUnique": true, 1106 + "concurrently": false, 1107 + "method": "btree", 1108 + "with": {} 1109 + } 1110 + }, 1111 + "foreignKeys": { 1112 + "sandbox_secrets_sandbox_id_sandboxes_id_fk": { 1113 + "name": "sandbox_secrets_sandbox_id_sandboxes_id_fk", 1114 + "tableFrom": "sandbox_secrets", 1115 + "tableTo": "sandboxes", 1116 + "columnsFrom": [ 1117 + "sandbox_id" 1118 + ], 1119 + "columnsTo": [ 1120 + "id" 1121 + ], 1122 + "onDelete": "cascade", 1123 + "onUpdate": "no action" 1124 + }, 1125 + "sandbox_secrets_secret_id_secrets_id_fk": { 1126 + "name": "sandbox_secrets_secret_id_secrets_id_fk", 1127 + "tableFrom": "sandbox_secrets", 1128 + "tableTo": "secrets", 1129 + "columnsFrom": [ 1130 + "secret_id" 1131 + ], 1132 + "columnsTo": [ 1133 + "id" 1134 + ], 1135 + "onDelete": "no action", 1136 + "onUpdate": "no action" 1137 + } 1138 + }, 1139 + "compositePrimaryKeys": {}, 1140 + "uniqueConstraints": {}, 1141 + "policies": {}, 1142 + "checkConstraints": {}, 1143 + "isRLSEnabled": false 1144 + }, 1145 + "public.sandbox_variables": { 1146 + "name": "sandbox_variables", 1147 + "schema": "", 1148 + "columns": { 1149 + "id": { 1150 + "name": "id", 1151 + "type": "text", 1152 + "primaryKey": true, 1153 + "notNull": true, 1154 + "default": "xata_id()" 1155 + }, 1156 + "sandbox_id": { 1157 + "name": "sandbox_id", 1158 + "type": "text", 1159 + "primaryKey": false, 1160 + "notNull": true 1161 + }, 1162 + "variable_id": { 1163 + "name": "variable_id", 1164 + "type": "text", 1165 + "primaryKey": false, 1166 + "notNull": true 1167 + }, 1168 + "name": { 1169 + "name": "name", 1170 + "type": "text", 1171 + "primaryKey": false, 1172 + "notNull": true 1173 + }, 1174 + "created_at": { 1175 + "name": "created_at", 1176 + "type": "timestamp", 1177 + "primaryKey": false, 1178 + "notNull": true, 1179 + "default": "now()" 1180 + }, 1181 + "updated_at": { 1182 + "name": "updated_at", 1183 + "type": "timestamp", 1184 + "primaryKey": false, 1185 + "notNull": true, 1186 + "default": "now()" 1187 + } 1188 + }, 1189 + "indexes": { 1190 + "unique_sandbox_variables_by_name": { 1191 + "name": "unique_sandbox_variables_by_name", 1192 + "columns": [ 1193 + { 1194 + "expression": "sandbox_id", 1195 + "isExpression": false, 1196 + "asc": true, 1197 + "nulls": "last" 1198 + }, 1199 + { 1200 + "expression": "name", 1201 + "isExpression": false, 1202 + "asc": true, 1203 + "nulls": "last" 1204 + } 1205 + ], 1206 + "isUnique": true, 1207 + "concurrently": false, 1208 + "method": "btree", 1209 + "with": {} 1210 + } 1211 + }, 1212 + "foreignKeys": { 1213 + "sandbox_variables_sandbox_id_sandboxes_id_fk": { 1214 + "name": "sandbox_variables_sandbox_id_sandboxes_id_fk", 1215 + "tableFrom": "sandbox_variables", 1216 + "tableTo": "sandboxes", 1217 + "columnsFrom": [ 1218 + "sandbox_id" 1219 + ], 1220 + "columnsTo": [ 1221 + "id" 1222 + ], 1223 + "onDelete": "cascade", 1224 + "onUpdate": "no action" 1225 + }, 1226 + "sandbox_variables_variable_id_variables_id_fk": { 1227 + "name": "sandbox_variables_variable_id_variables_id_fk", 1228 + "tableFrom": "sandbox_variables", 1229 + "tableTo": "variables", 1230 + "columnsFrom": [ 1231 + "variable_id" 1232 + ], 1233 + "columnsTo": [ 1234 + "id" 1235 + ], 1236 + "onDelete": "no action", 1237 + "onUpdate": "no action" 1238 + } 1239 + }, 1240 + "compositePrimaryKeys": {}, 1241 + "uniqueConstraints": {}, 1242 + "policies": {}, 1243 + "checkConstraints": {}, 1244 + "isRLSEnabled": false 1245 + }, 1246 + "public.sandbox_volumes": { 1247 + "name": "sandbox_volumes", 1248 + "schema": "", 1249 + "columns": { 1250 + "id": { 1251 + "name": "id", 1252 + "type": "text", 1253 + "primaryKey": true, 1254 + "notNull": true, 1255 + "default": "volume_id()" 1256 + }, 1257 + "sandbox_id": { 1258 + "name": "sandbox_id", 1259 + "type": "text", 1260 + "primaryKey": false, 1261 + "notNull": true 1262 + }, 1263 + "volume_id": { 1264 + "name": "volume_id", 1265 + "type": "text", 1266 + "primaryKey": false, 1267 + "notNull": true 1268 + }, 1269 + "name": { 1270 + "name": "name", 1271 + "type": "text", 1272 + "primaryKey": false, 1273 + "notNull": false 1274 + }, 1275 + "path": { 1276 + "name": "path", 1277 + "type": "text", 1278 + "primaryKey": false, 1279 + "notNull": true 1280 + }, 1281 + "created_at": { 1282 + "name": "created_at", 1283 + "type": "timestamp", 1284 + "primaryKey": false, 1285 + "notNull": true, 1286 + "default": "now()" 1287 + }, 1288 + "updated_at": { 1289 + "name": "updated_at", 1290 + "type": "timestamp", 1291 + "primaryKey": false, 1292 + "notNull": true, 1293 + "default": "now()" 1294 + } 1295 + }, 1296 + "indexes": { 1297 + "unique_sandbox_volume_path": { 1298 + "name": "unique_sandbox_volume_path", 1299 + "columns": [ 1300 + { 1301 + "expression": "sandbox_id", 1302 + "isExpression": false, 1303 + "asc": true, 1304 + "nulls": "last" 1305 + }, 1306 + { 1307 + "expression": "path", 1308 + "isExpression": false, 1309 + "asc": true, 1310 + "nulls": "last" 1311 + } 1312 + ], 1313 + "isUnique": true, 1314 + "concurrently": false, 1315 + "method": "btree", 1316 + "with": {} 1317 + } 1318 + }, 1319 + "foreignKeys": { 1320 + "sandbox_volumes_sandbox_id_sandboxes_id_fk": { 1321 + "name": "sandbox_volumes_sandbox_id_sandboxes_id_fk", 1322 + "tableFrom": "sandbox_volumes", 1323 + "tableTo": "sandboxes", 1324 + "columnsFrom": [ 1325 + "sandbox_id" 1326 + ], 1327 + "columnsTo": [ 1328 + "id" 1329 + ], 1330 + "onDelete": "cascade", 1331 + "onUpdate": "no action" 1332 + }, 1333 + "sandbox_volumes_volume_id_volumes_id_fk": { 1334 + "name": "sandbox_volumes_volume_id_volumes_id_fk", 1335 + "tableFrom": "sandbox_volumes", 1336 + "tableTo": "volumes", 1337 + "columnsFrom": [ 1338 + "volume_id" 1339 + ], 1340 + "columnsTo": [ 1341 + "id" 1342 + ], 1343 + "onDelete": "no action", 1344 + "onUpdate": "no action" 1345 + } 1346 + }, 1347 + "compositePrimaryKeys": {}, 1348 + "uniqueConstraints": {}, 1349 + "policies": {}, 1350 + "checkConstraints": {}, 1351 + "isRLSEnabled": false 1352 + }, 1353 + "public.sandboxes": { 1354 + "name": "sandboxes", 1355 + "schema": "", 1356 + "columns": { 1357 + "id": { 1358 + "name": "id", 1359 + "type": "text", 1360 + "primaryKey": true, 1361 + "notNull": true, 1362 + "default": "sandbox_id()" 1363 + }, 1364 + "base": { 1365 + "name": "base", 1366 + "type": "text", 1367 + "primaryKey": false, 1368 + "notNull": false 1369 + }, 1370 + "name": { 1371 + "name": "name", 1372 + "type": "text", 1373 + "primaryKey": false, 1374 + "notNull": true 1375 + }, 1376 + "display_name": { 1377 + "name": "display_name", 1378 + "type": "text", 1379 + "primaryKey": false, 1380 + "notNull": false 1381 + }, 1382 + "uri": { 1383 + "name": "uri", 1384 + "type": "text", 1385 + "primaryKey": false, 1386 + "notNull": false 1387 + }, 1388 + "cid": { 1389 + "name": "cid", 1390 + "type": "text", 1391 + "primaryKey": false, 1392 + "notNull": false 1393 + }, 1394 + "repo": { 1395 + "name": "repo", 1396 + "type": "text", 1397 + "primaryKey": false, 1398 + "notNull": false 1399 + }, 1400 + "provider": { 1401 + "name": "provider", 1402 + "type": "text", 1403 + "primaryKey": false, 1404 + "notNull": true, 1405 + "default": "'cloudflare'" 1406 + }, 1407 + "description": { 1408 + "name": "description", 1409 + "type": "text", 1410 + "primaryKey": false, 1411 + "notNull": false 1412 + }, 1413 + "topics": { 1414 + "name": "topics", 1415 + "type": "text[]", 1416 + "primaryKey": false, 1417 + "notNull": false 1418 + }, 1419 + "logo": { 1420 + "name": "logo", 1421 + "type": "text", 1422 + "primaryKey": false, 1423 + "notNull": false 1424 + }, 1425 + "readme": { 1426 + "name": "readme", 1427 + "type": "text", 1428 + "primaryKey": false, 1429 + "notNull": false 1430 + }, 1431 + "public_key": { 1432 + "name": "public_key", 1433 + "type": "text", 1434 + "primaryKey": false, 1435 + "notNull": true 1436 + }, 1437 + "user_id": { 1438 + "name": "user_id", 1439 + "type": "text", 1440 + "primaryKey": false, 1441 + "notNull": false 1442 + }, 1443 + "instance_type": { 1444 + "name": "instance_type", 1445 + "type": "text", 1446 + "primaryKey": false, 1447 + "notNull": false 1448 + }, 1449 + "vcpus": { 1450 + "name": "vcpus", 1451 + "type": "integer", 1452 + "primaryKey": false, 1453 + "notNull": false 1454 + }, 1455 + "memory": { 1456 + "name": "memory", 1457 + "type": "integer", 1458 + "primaryKey": false, 1459 + "notNull": false 1460 + }, 1461 + "disk": { 1462 + "name": "disk", 1463 + "type": "integer", 1464 + "primaryKey": false, 1465 + "notNull": false 1466 + }, 1467 + "status": { 1468 + "name": "status", 1469 + "type": "text", 1470 + "primaryKey": false, 1471 + "notNull": true 1472 + }, 1473 + "keep_alive": { 1474 + "name": "keep_alive", 1475 + "type": "boolean", 1476 + "primaryKey": false, 1477 + "notNull": true, 1478 + "default": false 1479 + }, 1480 + "sleep_after": { 1481 + "name": "sleep_after", 1482 + "type": "text", 1483 + "primaryKey": false, 1484 + "notNull": false 1485 + }, 1486 + "sandbox_id": { 1487 + "name": "sandbox_id", 1488 + "type": "text", 1489 + "primaryKey": false, 1490 + "notNull": false 1491 + }, 1492 + "installs": { 1493 + "name": "installs", 1494 + "type": "integer", 1495 + "primaryKey": false, 1496 + "notNull": true, 1497 + "default": 0 1498 + }, 1499 + "started_at": { 1500 + "name": "started_at", 1501 + "type": "timestamp", 1502 + "primaryKey": false, 1503 + "notNull": false 1504 + }, 1505 + "created_at": { 1506 + "name": "created_at", 1507 + "type": "timestamp", 1508 + "primaryKey": false, 1509 + "notNull": true, 1510 + "default": "now()" 1511 + }, 1512 + "updated_at": { 1513 + "name": "updated_at", 1514 + "type": "timestamp", 1515 + "primaryKey": false, 1516 + "notNull": true, 1517 + "default": "now()" 1518 + } 1519 + }, 1520 + "indexes": {}, 1521 + "foreignKeys": { 1522 + "sandboxes_user_id_users_id_fk": { 1523 + "name": "sandboxes_user_id_users_id_fk", 1524 + "tableFrom": "sandboxes", 1525 + "tableTo": "users", 1526 + "columnsFrom": [ 1527 + "user_id" 1528 + ], 1529 + "columnsTo": [ 1530 + "id" 1531 + ], 1532 + "onDelete": "no action", 1533 + "onUpdate": "no action" 1534 + } 1535 + }, 1536 + "compositePrimaryKeys": {}, 1537 + "uniqueConstraints": { 1538 + "sandboxes_name_unique": { 1539 + "name": "sandboxes_name_unique", 1540 + "nullsNotDistinct": false, 1541 + "columns": [ 1542 + "name" 1543 + ] 1544 + }, 1545 + "sandboxes_uri_unique": { 1546 + "name": "sandboxes_uri_unique", 1547 + "nullsNotDistinct": false, 1548 + "columns": [ 1549 + "uri" 1550 + ] 1551 + }, 1552 + "sandboxes_cid_unique": { 1553 + "name": "sandboxes_cid_unique", 1554 + "nullsNotDistinct": false, 1555 + "columns": [ 1556 + "cid" 1557 + ] 1558 + } 1559 + }, 1560 + "policies": {}, 1561 + "checkConstraints": {}, 1562 + "isRLSEnabled": false 1563 + }, 1564 + "public.secrets": { 1565 + "name": "secrets", 1566 + "schema": "", 1567 + "columns": { 1568 + "id": { 1569 + "name": "id", 1570 + "type": "text", 1571 + "primaryKey": true, 1572 + "notNull": true, 1573 + "default": "secret_id()" 1574 + }, 1575 + "name": { 1576 + "name": "name", 1577 + "type": "text", 1578 + "primaryKey": false, 1579 + "notNull": true 1580 + }, 1581 + "value": { 1582 + "name": "value", 1583 + "type": "text", 1584 + "primaryKey": false, 1585 + "notNull": true 1586 + }, 1587 + "redacted": { 1588 + "name": "redacted", 1589 + "type": "text", 1590 + "primaryKey": false, 1591 + "notNull": false 1592 + }, 1593 + "created_at": { 1594 + "name": "created_at", 1595 + "type": "timestamp", 1596 + "primaryKey": false, 1597 + "notNull": true, 1598 + "default": "now()" 1599 + } 1600 + }, 1601 + "indexes": {}, 1602 + "foreignKeys": {}, 1603 + "compositePrimaryKeys": {}, 1604 + "uniqueConstraints": {}, 1605 + "policies": {}, 1606 + "checkConstraints": {}, 1607 + "isRLSEnabled": false 1608 + }, 1609 + "public.services": { 1610 + "name": "services", 1611 + "schema": "", 1612 + "columns": { 1613 + "id": { 1614 + "name": "id", 1615 + "type": "text", 1616 + "primaryKey": true, 1617 + "notNull": true, 1618 + "default": "xata_id()" 1619 + }, 1620 + "sandbox_id": { 1621 + "name": "sandbox_id", 1622 + "type": "text", 1623 + "primaryKey": false, 1624 + "notNull": true 1625 + }, 1626 + "name": { 1627 + "name": "name", 1628 + "type": "text", 1629 + "primaryKey": false, 1630 + "notNull": true 1631 + }, 1632 + "command": { 1633 + "name": "command", 1634 + "type": "text", 1635 + "primaryKey": false, 1636 + "notNull": true 1637 + }, 1638 + "description": { 1639 + "name": "description", 1640 + "type": "text", 1641 + "primaryKey": false, 1642 + "notNull": false 1643 + }, 1644 + "service_id": { 1645 + "name": "service_id", 1646 + "type": "text", 1647 + "primaryKey": false, 1648 + "notNull": false 1649 + }, 1650 + "status": { 1651 + "name": "status", 1652 + "type": "text", 1653 + "primaryKey": false, 1654 + "notNull": true, 1655 + "default": "'STOPPED'" 1656 + }, 1657 + "created_at": { 1658 + "name": "created_at", 1659 + "type": "timestamp", 1660 + "primaryKey": false, 1661 + "notNull": true, 1662 + "default": "now()" 1663 + }, 1664 + "updated_at": { 1665 + "name": "updated_at", 1666 + "type": "timestamp", 1667 + "primaryKey": false, 1668 + "notNull": true, 1669 + "default": "now()" 1670 + } 1671 + }, 1672 + "indexes": { 1673 + "unique_sandbox_service": { 1674 + "name": "unique_sandbox_service", 1675 + "columns": [ 1676 + { 1677 + "expression": "name", 1678 + "isExpression": false, 1679 + "asc": true, 1680 + "nulls": "last" 1681 + }, 1682 + { 1683 + "expression": "sandbox_id", 1684 + "isExpression": false, 1685 + "asc": true, 1686 + "nulls": "last" 1687 + } 1688 + ], 1689 + "isUnique": true, 1690 + "concurrently": false, 1691 + "method": "btree", 1692 + "with": {} 1693 + } 1694 + }, 1695 + "foreignKeys": { 1696 + "services_sandbox_id_sandboxes_id_fk": { 1697 + "name": "services_sandbox_id_sandboxes_id_fk", 1698 + "tableFrom": "services", 1699 + "tableTo": "sandboxes", 1700 + "columnsFrom": [ 1701 + "sandbox_id" 1702 + ], 1703 + "columnsTo": [ 1704 + "id" 1705 + ], 1706 + "onDelete": "cascade", 1707 + "onUpdate": "no action" 1708 + } 1709 + }, 1710 + "compositePrimaryKeys": {}, 1711 + "uniqueConstraints": {}, 1712 + "policies": {}, 1713 + "checkConstraints": {}, 1714 + "isRLSEnabled": false 1715 + }, 1716 + "public.snapshots": { 1717 + "name": "snapshots", 1718 + "schema": "", 1719 + "columns": { 1720 + "id": { 1721 + "name": "id", 1722 + "type": "text", 1723 + "primaryKey": true, 1724 + "notNull": true, 1725 + "default": "snapshot_id()" 1726 + }, 1727 + "slug": { 1728 + "name": "slug", 1729 + "type": "text", 1730 + "primaryKey": false, 1731 + "notNull": true 1732 + }, 1733 + "created_at": { 1734 + "name": "created_at", 1735 + "type": "timestamp", 1736 + "primaryKey": false, 1737 + "notNull": true, 1738 + "default": "now()" 1739 + } 1740 + }, 1741 + "indexes": {}, 1742 + "foreignKeys": {}, 1743 + "compositePrimaryKeys": {}, 1744 + "uniqueConstraints": { 1745 + "snapshots_slug_unique": { 1746 + "name": "snapshots_slug_unique", 1747 + "nullsNotDistinct": false, 1748 + "columns": [ 1749 + "slug" 1750 + ] 1751 + } 1752 + }, 1753 + "policies": {}, 1754 + "checkConstraints": {}, 1755 + "isRLSEnabled": false 1756 + }, 1757 + "public.sprite_auth": { 1758 + "name": "sprite_auth", 1759 + "schema": "", 1760 + "columns": { 1761 + "id": { 1762 + "name": "id", 1763 + "type": "text", 1764 + "primaryKey": true, 1765 + "notNull": true, 1766 + "default": "xata_id()" 1767 + }, 1768 + "sandbox_id": { 1769 + "name": "sandbox_id", 1770 + "type": "text", 1771 + "primaryKey": false, 1772 + "notNull": true 1773 + }, 1774 + "user_id": { 1775 + "name": "user_id", 1776 + "type": "text", 1777 + "primaryKey": false, 1778 + "notNull": true 1779 + }, 1780 + "sprite_token": { 1781 + "name": "sprite_token", 1782 + "type": "text", 1783 + "primaryKey": false, 1784 + "notNull": true 1785 + }, 1786 + "redacted_sprite_token": { 1787 + "name": "redacted_sprite_token", 1788 + "type": "text", 1789 + "primaryKey": false, 1790 + "notNull": true 1791 + }, 1792 + "created_at": { 1793 + "name": "created_at", 1794 + "type": "timestamp", 1795 + "primaryKey": false, 1796 + "notNull": true, 1797 + "default": "now()" 1798 + } 1799 + }, 1800 + "indexes": { 1801 + "unique_sprite_auth": { 1802 + "name": "unique_sprite_auth", 1803 + "columns": [ 1804 + { 1805 + "expression": "sandbox_id", 1806 + "isExpression": false, 1807 + "asc": true, 1808 + "nulls": "last" 1809 + }, 1810 + { 1811 + "expression": "user_id", 1812 + "isExpression": false, 1813 + "asc": true, 1814 + "nulls": "last" 1815 + } 1816 + ], 1817 + "isUnique": true, 1818 + "concurrently": false, 1819 + "method": "btree", 1820 + "with": {} 1821 + } 1822 + }, 1823 + "foreignKeys": { 1824 + "sprite_auth_sandbox_id_sandboxes_id_fk": { 1825 + "name": "sprite_auth_sandbox_id_sandboxes_id_fk", 1826 + "tableFrom": "sprite_auth", 1827 + "tableTo": "sandboxes", 1828 + "columnsFrom": [ 1829 + "sandbox_id" 1830 + ], 1831 + "columnsTo": [ 1832 + "id" 1833 + ], 1834 + "onDelete": "cascade", 1835 + "onUpdate": "no action" 1836 + }, 1837 + "sprite_auth_user_id_users_id_fk": { 1838 + "name": "sprite_auth_user_id_users_id_fk", 1839 + "tableFrom": "sprite_auth", 1840 + "tableTo": "users", 1841 + "columnsFrom": [ 1842 + "user_id" 1843 + ], 1844 + "columnsTo": [ 1845 + "id" 1846 + ], 1847 + "onDelete": "no action", 1848 + "onUpdate": "no action" 1849 + } 1850 + }, 1851 + "compositePrimaryKeys": {}, 1852 + "uniqueConstraints": {}, 1853 + "policies": {}, 1854 + "checkConstraints": {}, 1855 + "isRLSEnabled": false 1856 + }, 1857 + "public.ssh_keys": { 1858 + "name": "ssh_keys", 1859 + "schema": "", 1860 + "columns": { 1861 + "id": { 1862 + "name": "id", 1863 + "type": "text", 1864 + "primaryKey": true, 1865 + "notNull": true, 1866 + "default": "xata_id()" 1867 + }, 1868 + "sandbox_id": { 1869 + "name": "sandbox_id", 1870 + "type": "text", 1871 + "primaryKey": false, 1872 + "notNull": true 1873 + }, 1874 + "public_key": { 1875 + "name": "public_key", 1876 + "type": "text", 1877 + "primaryKey": false, 1878 + "notNull": true 1879 + }, 1880 + "private_key": { 1881 + "name": "private_key", 1882 + "type": "text", 1883 + "primaryKey": false, 1884 + "notNull": true 1885 + }, 1886 + "redacted": { 1887 + "name": "redacted", 1888 + "type": "text", 1889 + "primaryKey": false, 1890 + "notNull": false 1891 + }, 1892 + "created_at": { 1893 + "name": "created_at", 1894 + "type": "timestamp", 1895 + "primaryKey": false, 1896 + "notNull": true, 1897 + "default": "now()" 1898 + } 1899 + }, 1900 + "indexes": { 1901 + "unique_sandbox_ssh_key": { 1902 + "name": "unique_sandbox_ssh_key", 1903 + "columns": [ 1904 + { 1905 + "expression": "public_key", 1906 + "isExpression": false, 1907 + "asc": true, 1908 + "nulls": "last" 1909 + }, 1910 + { 1911 + "expression": "sandbox_id", 1912 + "isExpression": false, 1913 + "asc": true, 1914 + "nulls": "last" 1915 + } 1916 + ], 1917 + "isUnique": true, 1918 + "concurrently": false, 1919 + "method": "btree", 1920 + "with": {} 1921 + } 1922 + }, 1923 + "foreignKeys": { 1924 + "ssh_keys_sandbox_id_sandboxes_id_fk": { 1925 + "name": "ssh_keys_sandbox_id_sandboxes_id_fk", 1926 + "tableFrom": "ssh_keys", 1927 + "tableTo": "sandboxes", 1928 + "columnsFrom": [ 1929 + "sandbox_id" 1930 + ], 1931 + "columnsTo": [ 1932 + "id" 1933 + ], 1934 + "onDelete": "cascade", 1935 + "onUpdate": "no action" 1936 + } 1937 + }, 1938 + "compositePrimaryKeys": {}, 1939 + "uniqueConstraints": {}, 1940 + "policies": {}, 1941 + "checkConstraints": {}, 1942 + "isRLSEnabled": false 1943 + }, 1944 + "public.tailscale_auth_keys": { 1945 + "name": "tailscale_auth_keys", 1946 + "schema": "", 1947 + "columns": { 1948 + "id": { 1949 + "name": "id", 1950 + "type": "text", 1951 + "primaryKey": true, 1952 + "notNull": true, 1953 + "default": "xata_id()" 1954 + }, 1955 + "sandbox_id": { 1956 + "name": "sandbox_id", 1957 + "type": "text", 1958 + "primaryKey": false, 1959 + "notNull": true 1960 + }, 1961 + "auth_key": { 1962 + "name": "auth_key", 1963 + "type": "text", 1964 + "primaryKey": false, 1965 + "notNull": true 1966 + }, 1967 + "redacted": { 1968 + "name": "redacted", 1969 + "type": "text", 1970 + "primaryKey": false, 1971 + "notNull": true 1972 + }, 1973 + "created_at": { 1974 + "name": "created_at", 1975 + "type": "timestamp", 1976 + "primaryKey": false, 1977 + "notNull": true, 1978 + "default": "now()" 1979 + } 1980 + }, 1981 + "indexes": {}, 1982 + "foreignKeys": { 1983 + "tailscale_auth_keys_sandbox_id_sandboxes_id_fk": { 1984 + "name": "tailscale_auth_keys_sandbox_id_sandboxes_id_fk", 1985 + "tableFrom": "tailscale_auth_keys", 1986 + "tableTo": "sandboxes", 1987 + "columnsFrom": [ 1988 + "sandbox_id" 1989 + ], 1990 + "columnsTo": [ 1991 + "id" 1992 + ], 1993 + "onDelete": "cascade", 1994 + "onUpdate": "no action" 1995 + } 1996 + }, 1997 + "compositePrimaryKeys": {}, 1998 + "uniqueConstraints": {}, 1999 + "policies": {}, 2000 + "checkConstraints": {}, 2001 + "isRLSEnabled": false 2002 + }, 2003 + "public.users": { 2004 + "name": "users", 2005 + "schema": "", 2006 + "columns": { 2007 + "id": { 2008 + "name": "id", 2009 + "type": "text", 2010 + "primaryKey": true, 2011 + "notNull": true, 2012 + "default": "xata_id()" 2013 + }, 2014 + "did": { 2015 + "name": "did", 2016 + "type": "text", 2017 + "primaryKey": false, 2018 + "notNull": true 2019 + }, 2020 + "display_name": { 2021 + "name": "display_name", 2022 + "type": "text", 2023 + "primaryKey": false, 2024 + "notNull": false 2025 + }, 2026 + "handle": { 2027 + "name": "handle", 2028 + "type": "text", 2029 + "primaryKey": false, 2030 + "notNull": true 2031 + }, 2032 + "avatar": { 2033 + "name": "avatar", 2034 + "type": "text", 2035 + "primaryKey": false, 2036 + "notNull": false 2037 + }, 2038 + "created_at": { 2039 + "name": "created_at", 2040 + "type": "timestamp", 2041 + "primaryKey": false, 2042 + "notNull": true, 2043 + "default": "now()" 2044 + }, 2045 + "updated_at": { 2046 + "name": "updated_at", 2047 + "type": "timestamp", 2048 + "primaryKey": false, 2049 + "notNull": true, 2050 + "default": "now()" 2051 + } 2052 + }, 2053 + "indexes": {}, 2054 + "foreignKeys": {}, 2055 + "compositePrimaryKeys": {}, 2056 + "uniqueConstraints": { 2057 + "users_did_unique": { 2058 + "name": "users_did_unique", 2059 + "nullsNotDistinct": false, 2060 + "columns": [ 2061 + "did" 2062 + ] 2063 + }, 2064 + "users_handle_unique": { 2065 + "name": "users_handle_unique", 2066 + "nullsNotDistinct": false, 2067 + "columns": [ 2068 + "handle" 2069 + ] 2070 + } 2071 + }, 2072 + "policies": {}, 2073 + "checkConstraints": {}, 2074 + "isRLSEnabled": false 2075 + }, 2076 + "public.variables": { 2077 + "name": "variables", 2078 + "schema": "", 2079 + "columns": { 2080 + "id": { 2081 + "name": "id", 2082 + "type": "text", 2083 + "primaryKey": true, 2084 + "notNull": true, 2085 + "default": "variable_id()" 2086 + }, 2087 + "name": { 2088 + "name": "name", 2089 + "type": "text", 2090 + "primaryKey": false, 2091 + "notNull": true 2092 + }, 2093 + "value": { 2094 + "name": "value", 2095 + "type": "text", 2096 + "primaryKey": false, 2097 + "notNull": true 2098 + }, 2099 + "created_at": { 2100 + "name": "created_at", 2101 + "type": "timestamp", 2102 + "primaryKey": false, 2103 + "notNull": true, 2104 + "default": "now()" 2105 + }, 2106 + "updated_at": { 2107 + "name": "updated_at", 2108 + "type": "timestamp", 2109 + "primaryKey": false, 2110 + "notNull": true, 2111 + "default": "now()" 2112 + } 2113 + }, 2114 + "indexes": {}, 2115 + "foreignKeys": {}, 2116 + "compositePrimaryKeys": {}, 2117 + "uniqueConstraints": {}, 2118 + "policies": {}, 2119 + "checkConstraints": {}, 2120 + "isRLSEnabled": false 2121 + }, 2122 + "public.vercel_auth": { 2123 + "name": "vercel_auth", 2124 + "schema": "", 2125 + "columns": { 2126 + "id": { 2127 + "name": "id", 2128 + "type": "text", 2129 + "primaryKey": true, 2130 + "notNull": true, 2131 + "default": "xata_id()" 2132 + }, 2133 + "sandbox_id": { 2134 + "name": "sandbox_id", 2135 + "type": "text", 2136 + "primaryKey": false, 2137 + "notNull": true 2138 + }, 2139 + "user_id": { 2140 + "name": "user_id", 2141 + "type": "text", 2142 + "primaryKey": false, 2143 + "notNull": true 2144 + }, 2145 + "vercel_token": { 2146 + "name": "vercel_token", 2147 + "type": "text", 2148 + "primaryKey": false, 2149 + "notNull": true 2150 + }, 2151 + "redacted_vercel_token": { 2152 + "name": "redacted_vercel_token", 2153 + "type": "text", 2154 + "primaryKey": false, 2155 + "notNull": true 2156 + }, 2157 + "project_id": { 2158 + "name": "project_id", 2159 + "type": "text", 2160 + "primaryKey": false, 2161 + "notNull": true 2162 + }, 2163 + "team_id": { 2164 + "name": "team_id", 2165 + "type": "text", 2166 + "primaryKey": false, 2167 + "notNull": true 2168 + }, 2169 + "created_at": { 2170 + "name": "created_at", 2171 + "type": "timestamp", 2172 + "primaryKey": false, 2173 + "notNull": true, 2174 + "default": "now()" 2175 + } 2176 + }, 2177 + "indexes": { 2178 + "unique_vercel_auth": { 2179 + "name": "unique_vercel_auth", 2180 + "columns": [ 2181 + { 2182 + "expression": "sandbox_id", 2183 + "isExpression": false, 2184 + "asc": true, 2185 + "nulls": "last" 2186 + }, 2187 + { 2188 + "expression": "user_id", 2189 + "isExpression": false, 2190 + "asc": true, 2191 + "nulls": "last" 2192 + } 2193 + ], 2194 + "isUnique": true, 2195 + "concurrently": false, 2196 + "method": "btree", 2197 + "with": {} 2198 + } 2199 + }, 2200 + "foreignKeys": { 2201 + "vercel_auth_sandbox_id_sandboxes_id_fk": { 2202 + "name": "vercel_auth_sandbox_id_sandboxes_id_fk", 2203 + "tableFrom": "vercel_auth", 2204 + "tableTo": "sandboxes", 2205 + "columnsFrom": [ 2206 + "sandbox_id" 2207 + ], 2208 + "columnsTo": [ 2209 + "id" 2210 + ], 2211 + "onDelete": "cascade", 2212 + "onUpdate": "no action" 2213 + }, 2214 + "vercel_auth_user_id_users_id_fk": { 2215 + "name": "vercel_auth_user_id_users_id_fk", 2216 + "tableFrom": "vercel_auth", 2217 + "tableTo": "users", 2218 + "columnsFrom": [ 2219 + "user_id" 2220 + ], 2221 + "columnsTo": [ 2222 + "id" 2223 + ], 2224 + "onDelete": "no action", 2225 + "onUpdate": "no action" 2226 + } 2227 + }, 2228 + "compositePrimaryKeys": {}, 2229 + "uniqueConstraints": {}, 2230 + "policies": {}, 2231 + "checkConstraints": {}, 2232 + "isRLSEnabled": false 2233 + }, 2234 + "public.volumes": { 2235 + "name": "volumes", 2236 + "schema": "", 2237 + "columns": { 2238 + "id": { 2239 + "name": "id", 2240 + "type": "text", 2241 + "primaryKey": true, 2242 + "notNull": true, 2243 + "default": "volume_id()" 2244 + }, 2245 + "slug": { 2246 + "name": "slug", 2247 + "type": "text", 2248 + "primaryKey": false, 2249 + "notNull": true 2250 + }, 2251 + "size": { 2252 + "name": "size", 2253 + "type": "integer", 2254 + "primaryKey": false, 2255 + "notNull": true 2256 + }, 2257 + "size_unit": { 2258 + "name": "size_unit", 2259 + "type": "text", 2260 + "primaryKey": false, 2261 + "notNull": true 2262 + }, 2263 + "created_at": { 2264 + "name": "created_at", 2265 + "type": "timestamp", 2266 + "primaryKey": false, 2267 + "notNull": true, 2268 + "default": "now()" 2269 + }, 2270 + "updated_at": { 2271 + "name": "updated_at", 2272 + "type": "timestamp", 2273 + "primaryKey": false, 2274 + "notNull": true, 2275 + "default": "now()" 2276 + } 2277 + }, 2278 + "indexes": {}, 2279 + "foreignKeys": {}, 2280 + "compositePrimaryKeys": {}, 2281 + "uniqueConstraints": { 2282 + "volumes_slug_unique": { 2283 + "name": "volumes_slug_unique", 2284 + "nullsNotDistinct": false, 2285 + "columns": [ 2286 + "slug" 2287 + ] 2288 + } 2289 + }, 2290 + "policies": {}, 2291 + "checkConstraints": {}, 2292 + "isRLSEnabled": false 2293 + }, 2294 + "public.integrations": { 2295 + "name": "integrations", 2296 + "schema": "", 2297 + "columns": { 2298 + "id": { 2299 + "name": "id", 2300 + "type": "text", 2301 + "primaryKey": true, 2302 + "notNull": true, 2303 + "default": "xata_id()" 2304 + }, 2305 + "sandbox_id": { 2306 + "name": "sandbox_id", 2307 + "type": "text", 2308 + "primaryKey": false, 2309 + "notNull": true 2310 + }, 2311 + "name": { 2312 + "name": "name", 2313 + "type": "text", 2314 + "primaryKey": false, 2315 + "notNull": true 2316 + }, 2317 + "description": { 2318 + "name": "description", 2319 + "type": "text", 2320 + "primaryKey": false, 2321 + "notNull": false 2322 + }, 2323 + "webhook_url": { 2324 + "name": "webhook_url", 2325 + "type": "text", 2326 + "primaryKey": false, 2327 + "notNull": true 2328 + }, 2329 + "created_at": { 2330 + "name": "created_at", 2331 + "type": "timestamp", 2332 + "primaryKey": false, 2333 + "notNull": true, 2334 + "default": "now()" 2335 + } 2336 + }, 2337 + "indexes": { 2338 + "unique_sandbox_integration": { 2339 + "name": "unique_sandbox_integration", 2340 + "columns": [ 2341 + { 2342 + "expression": "sandbox_id", 2343 + "isExpression": false, 2344 + "asc": true, 2345 + "nulls": "last" 2346 + }, 2347 + { 2348 + "expression": "name", 2349 + "isExpression": false, 2350 + "asc": true, 2351 + "nulls": "last" 2352 + } 2353 + ], 2354 + "isUnique": true, 2355 + "concurrently": false, 2356 + "method": "btree", 2357 + "with": {} 2358 + } 2359 + }, 2360 + "foreignKeys": { 2361 + "integrations_sandbox_id_sandboxes_id_fk": { 2362 + "name": "integrations_sandbox_id_sandboxes_id_fk", 2363 + "tableFrom": "integrations", 2364 + "tableTo": "sandboxes", 2365 + "columnsFrom": [ 2366 + "sandbox_id" 2367 + ], 2368 + "columnsTo": [ 2369 + "id" 2370 + ], 2371 + "onDelete": "cascade", 2372 + "onUpdate": "no action" 2373 + } 2374 + }, 2375 + "compositePrimaryKeys": {}, 2376 + "uniqueConstraints": {}, 2377 + "policies": {}, 2378 + "checkConstraints": {}, 2379 + "isRLSEnabled": false 2380 + } 2381 + }, 2382 + "enums": {}, 2383 + "schemas": {}, 2384 + "sequences": {}, 2385 + "roles": {}, 2386 + "policies": {}, 2387 + "views": {}, 2388 + "_meta": { 2389 + "columns": {}, 2390 + "schemas": {}, 2391 + "tables": {} 2392 + } 2393 + }
+7
apps/cf-sandbox/drizzle/meta/_journal.json
··· 323 323 "when": 1775928677824, 324 324 "tag": "0045_windy_sinister_six", 325 325 "breakpoints": true 326 + }, 327 + { 328 + "idx": 46, 329 + "version": "7", 330 + "when": 1776001210819, 331 + "tag": "0046_strong_carlie_cooper", 332 + "breakpoints": true 326 333 } 327 334 ] 328 335 }
+28
apps/cf-sandbox/src/schema/hopx-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const hopxAuth = pgTable( 7 + "hopx_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_hopx_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectHopxAuth = InferSelectModel<typeof hopxAuth>; 26 + export type InsertHopxAuth = InferInsertModel<typeof hopxAuth>; 27 + 28 + export default hopxAuth;
+4
apps/cf-sandbox/src/schema/index.ts
··· 21 21 import backups from "./backups"; 22 22 import modalAuth from "./modal-auth"; 23 23 import e2bAuth from "./e2b-auth"; 24 + import hopxAuth from "./hopx-auth"; 25 + import runloopAuth from "./runloop-auth"; 24 26 25 27 export { 26 28 sandboxes, ··· 46 48 backups, 47 49 modalAuth, 48 50 e2bAuth, 51 + hopxAuth, 52 + runloopAuth, 49 53 };
+28
apps/cf-sandbox/src/schema/runloop-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const runloopAuth = pgTable( 7 + "runloop_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_runloop_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectRunloopAuth = InferSelectModel<typeof runloopAuth>; 26 + export type InsertRunloopAuth = InferInsertModel<typeof runloopAuth>; 27 + 28 + export default runloopAuth;
+27
apps/cli/src/cmd/create.ts
··· 35 35 "cloudflare", 36 36 "modal", 37 37 "e2b", 38 + "hopx", 39 + "runloop", 40 + "blaxel", 38 41 ].includes(provider ?? "cloudflare") 39 42 ) { 40 43 consola.error( ··· 122 125 } 123 126 providerOptions.e2bApiKey = await encrypt(e2bApiKey); 124 127 providerOptions.redactedE2bApiKey = redact(e2bApiKey); 128 + } 129 + 130 + if (provider == "hopx") { 131 + const hopxApiKey = process.env.HOPX_API_KEY; 132 + if (!hopxApiKey) { 133 + consola.error( 134 + "HOPX_API_KEY environment variable is required for HopX provider.", 135 + ); 136 + process.exit(1); 137 + } 138 + providerOptions.hopxApiKey = await encrypt(hopxApiKey); 139 + providerOptions.redactedHopxApiKey = redact(hopxApiKey); 140 + } 141 + 142 + if (provider == "runloop") { 143 + const runloopApiKey = process.env.RUNLOOP_API_KEY; 144 + if (!runloopApiKey) { 145 + consola.error( 146 + "RUNLOOP_API_KEY environment variable is required for RunLoop provider.", 147 + ); 148 + process.exit(1); 149 + } 150 + providerOptions.runloopApiKey = await encrypt(runloopApiKey); 151 + providerOptions.redactedRunloopApiKey = redact(runloopApiKey); 125 152 } 126 153 127 154 try {
+4 -1
apps/cli/src/types/providers.ts
··· 5 5 | "vercel" 6 6 | "sprites" 7 7 | "modal" 8 - | "e2b"; 8 + | "e2b" 9 + | "hopx" 10 + | "runloop" 11 + | "blaxel";
+419 -16
apps/modal-sandbox/bun.lock
··· 4 4 "workspaces": { 5 5 "": { 6 6 "dependencies": { 7 + "@blaxel/core": "^0.2.79", 7 8 "@daytonaio/sdk": "^0.162.0", 8 9 "@deno/sandbox": "^0.13.2", 9 10 "@fly/sprites": "^0.0.1", 10 11 "@hono/node-server": "^1.19.13", 12 + "@hopx-ai/sdk": "^0.5.1", 13 + "@runloop/api-client": "^1.18.1", 11 14 "@std/yaml": "npm:@jsr/std__yaml", 12 15 "@tsndr/cloudflare-worker-jwt": "^3.2.1", 13 16 "@vercel/sandbox": "^1.9.3", ··· 117 120 118 121 "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], 119 122 123 + "@blaxel/core": ["@blaxel/core@0.2.79", "", { "dependencies": { "@hey-api/client-fetch": "^0.10.0", "@modelcontextprotocol/sdk": "^1.20.0", "archiver": "^7.0.1", "axios": "^1.9.0", "dockerfile-ast": "^0.7.1", "dotenv": "^16.5.0", "form-data": "^4.0.2", "jwt-decode": "^4.0.0", "toml": "^3.0.0", "uuid": "^11.1.0", "ws": "^8.18.2", "yaml": "^2.7.1", "zod": "^3.24.3" } }, "sha512-J5sIkil1yrg2JLsbVPORCyHukIT1ND4H4phvMfBemHxcI12a6Ih7stmVQnLppMMYYFssEy+k0wcuLk6poNWAZA=="], 124 + 120 125 "@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="], 121 126 122 127 "@cbor-extract/cbor-extract-darwin-arm64": ["@cbor-extract/cbor-extract-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA=="], ··· 217 222 218 223 "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], 219 224 225 + "@hey-api/client-fetch": ["@hey-api/client-fetch@0.10.2", "", { "peerDependencies": { "@hey-api/openapi-ts": "< 2" } }, "sha512-AGiFYDx+y8VT1wlQ3EbzzZtfU8EfV+hLLRTtr8Y/tjYZaxIECwJagVZf24YzNbtEBXONFV50bwcU1wLVGXe1ow=="], 226 + 227 + "@hey-api/codegen-core": ["@hey-api/codegen-core@0.7.4", "", { "dependencies": { "@hey-api/types": "0.1.4", "ansi-colors": "4.1.3", "c12": "3.3.3", "color-support": "1.1.3" } }, "sha512-DGd9yeSQzflOWO3Y5mt1GRXkXH9O/yIMgbxPjwLI3jwu/3nAjoXXD26lEeFb6tclYlg0JAqTIs5d930G/qxHeA=="], 228 + 229 + "@hey-api/json-schema-ref-parser": ["@hey-api/json-schema-ref-parser@1.3.1", "", { "dependencies": { "@jsdevtools/ono": "7.1.3", "@types/json-schema": "7.0.15", "js-yaml": "4.1.1" } }, "sha512-7atnpUkT8TyUPHYPLk91j/GyaqMuwTEHanLOe50Dlx0EEvNuQqFD52Yjg8x4KU0UFL1mWlyhE+sUE/wAtQ1N2A=="], 230 + 231 + "@hey-api/openapi-ts": ["@hey-api/openapi-ts@0.95.0", "", { "dependencies": { "@hey-api/codegen-core": "0.7.4", "@hey-api/json-schema-ref-parser": "1.3.1", "@hey-api/shared": "0.3.0", "@hey-api/spec-types": "0.1.0", "@hey-api/types": "0.1.4", "ansi-colors": "4.1.3", "color-support": "1.1.3", "commander": "14.0.3", "get-tsconfig": "4.13.6" }, "peerDependencies": { "typescript": ">=5.5.3 || >=6.0.0 || 6.0.1-rc" }, "bin": { "openapi-ts": "bin/run.js" } }, "sha512-lk5C+WKl5yqEmliQihEyhX/jNcWlAykTSEqkDeKa9xSq5YDAzOFvx7oos8YTqiIzdc4TemtlEaB8Rns7+8A0qg=="], 232 + 233 + "@hey-api/shared": ["@hey-api/shared@0.3.0", "", { "dependencies": { "@hey-api/codegen-core": "0.7.4", "@hey-api/json-schema-ref-parser": "1.3.1", "@hey-api/spec-types": "0.1.0", "@hey-api/types": "0.1.4", "ansi-colors": "4.1.3", "cross-spawn": "7.0.6", "open": "11.0.0", "semver": "7.7.3" } }, "sha512-G+4GPojdLEh9bUwRG88teMPM1HdqMm/IsJ38cbnNxhyDu1FkFGwilkA1EqnULCzfTam/ZoZkaLdmAd8xEh4Xsw=="], 234 + 235 + "@hey-api/spec-types": ["@hey-api/spec-types@0.1.0", "", { "dependencies": { "@hey-api/types": "0.1.4" } }, "sha512-StS4RrAO5pyJCBwe6uF9MAuPflkztriW+FPnVb7oEjzDYv1sxPwP+f7fL6u6D+UVrKpZ/9bPNx/xXVdkeWPU6A=="], 236 + 237 + "@hey-api/types": ["@hey-api/types@0.1.4", "", {}, "sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg=="], 238 + 220 239 "@hono/node-server": ["@hono/node-server@1.19.13", "", { "peerDependencies": { "hono": "^4" } }, "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ=="], 240 + 241 + "@hopx-ai/sdk": ["@hopx-ai/sdk@0.5.1", "", { "dependencies": { "axios": "^1.6.2", "form-data": "^4.0.0", "glob": "^10.3.10", "tar": "^7.5.4", "ws": "^8.14.2" } }, "sha512-28FBFXEcXblxhY3Old/zSr/H9WUdvOPftedCfGwgHmuMo2/HLUFon1Pkc3C5d195WHqy2KCSGJh577jW91Ck7w=="], 221 242 222 243 "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], 223 244 224 - "@isaacs/cliui": ["@isaacs/cliui@9.0.0", "", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="], 245 + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 225 246 226 247 "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], 227 248 228 249 "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 229 250 230 251 "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], 252 + 253 + "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], 254 + 255 + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], 231 256 232 257 "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="], 233 258 ··· 297 322 298 323 "@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="], 299 324 325 + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], 326 + 300 327 "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], 301 328 302 329 "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], ··· 411 438 412 439 "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], 413 440 441 + "@runloop/api-client": ["@runloop/api-client@1.18.1", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7", "tar": "^7.5.2", "uuidv7": "^1.0.2", "zod": "^3.24.1" } }, "sha512-ku08FDuFPi/2T2JdryNl61FSh9zok4lzkiFyJuAbB6/tDobK9qt2AdlNr4KYaq3rwtNycIoBcy2GOomAlgwP7w=="], 442 + 414 443 "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw=="], 415 444 416 445 "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.3", "", { "dependencies": { "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw=="], ··· 525 554 526 555 "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 527 556 557 + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 558 + 528 559 "@types/node": ["@types/node@25.5.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg=="], 560 + 561 + "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], 529 562 530 563 "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], 531 564 ··· 549 582 550 583 "@workflow/serde": ["@workflow/serde@4.1.0-beta.2", "", {}, "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww=="], 551 584 585 + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], 586 + 552 587 "abort-controller-x": ["abort-controller-x@0.4.3", "", {}, "sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA=="], 588 + 589 + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], 553 590 554 591 "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], 555 592 556 593 "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], 557 594 558 - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 595 + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], 596 + 597 + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], 598 + 599 + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], 600 + 601 + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], 602 + 603 + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], 604 + 605 + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], 606 + 607 + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], 608 + 609 + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], 559 610 560 - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 611 + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 561 612 562 613 "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], 563 614 564 615 "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], 616 + 617 + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], 565 618 566 619 "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], 567 620 ··· 571 624 572 625 "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], 573 626 574 - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 627 + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 575 628 576 629 "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], 577 630 578 631 "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 579 632 633 + "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=="], 634 + 580 635 "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], 581 636 582 - "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 637 + "brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], 583 638 584 639 "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 585 640 586 641 "buffer": ["buffer@5.6.0", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw=="], 587 642 643 + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], 644 + 588 645 "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 646 + 647 + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], 589 648 590 649 "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], 591 650 651 + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], 652 + 653 + "c12": ["c12@3.3.3", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.8", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q=="], 654 + 592 655 "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], 656 + 657 + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], 593 658 594 659 "cbor-extract": ["cbor-extract@2.2.2", "", { "dependencies": { "node-gyp-build-optional-packages": "5.1.1" }, "optionalDependencies": { "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2", "@cbor-extract/cbor-extract-darwin-x64": "2.2.2", "@cbor-extract/cbor-extract-linux-arm": "2.2.2", "@cbor-extract/cbor-extract-linux-arm64": "2.2.2", "@cbor-extract/cbor-extract-linux-x64": "2.2.2", "@cbor-extract/cbor-extract-win32-x64": "2.2.2" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" } }, "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng=="], 595 660 ··· 599 664 600 665 "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], 601 666 667 + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], 668 + 602 669 "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], 670 + 671 + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], 603 672 604 673 "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], 605 674 ··· 609 678 610 679 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 611 680 681 + "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], 682 + 612 683 "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], 613 684 685 + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], 686 + 614 687 "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], 615 688 616 689 "compare-versions": ["compare-versions@6.1.1", "", {}, "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg=="], 617 690 691 + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], 692 + 693 + "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], 694 + 618 695 "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], 619 696 697 + "content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="], 698 + 699 + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], 700 + 620 701 "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 621 702 703 + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], 704 + 705 + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], 706 + 707 + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], 708 + 709 + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], 710 + 711 + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], 712 + 713 + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], 714 + 622 715 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 623 716 624 717 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 625 718 626 719 "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], 627 720 721 + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], 722 + 723 + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], 724 + 725 + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], 726 + 727 + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], 728 + 628 729 "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], 629 730 731 + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 732 + 733 + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], 734 + 630 735 "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 631 736 632 737 "dockerfile-ast": ["dockerfile-ast@0.7.1", "", { "dependencies": { "vscode-languageserver-textdocument": "^1.0.8", "vscode-languageserver-types": "^3.17.3" } }, "sha512-oX/A4I0EhSkGqrFv0YuvPkBUSYp1XiY8O8zAKc8Djglx8ocz+JfOr8gP0ryRMC2myqvDLagmnZaU9ot1vG2ijw=="], 633 738 634 - "dotenv": ["dotenv@17.4.1", "", {}, "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw=="], 739 + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], 635 740 636 741 "drizzle-kit": ["drizzle-kit@0.31.10", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw=="], 637 742 ··· 641 746 642 747 "e2b": ["e2b@2.19.0", "", { "dependencies": { "@bufbuild/protobuf": "^2.6.2", "@connectrpc/connect": "2.0.0-rc.3", "@connectrpc/connect-web": "2.0.0-rc.3", "chalk": "^5.3.0", "compare-versions": "^6.1.0", "dockerfile-ast": "^0.7.1", "glob": "^11.1.0", "openapi-fetch": "^0.14.1", "platform": "^1.3.6", "tar": "^7.5.11" } }, "sha512-Tpm5F6BJAkRoSXqBA1/VLHn/OP4mCsDTX0FWP6UMxC2MU26nJ2fXgPZNdYOyTvi4gyNd1GeEQzUCbAmODh/GuQ=="], 643 748 749 + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 750 + 751 + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], 752 + 644 753 "effect": ["effect@3.21.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ=="], 645 754 646 - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 755 + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 756 + 757 + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], 647 758 648 759 "envalid": ["envalid@8.1.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w=="], 649 760 ··· 661 772 662 773 "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 663 774 775 + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], 776 + 664 777 "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 665 778 779 + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 780 + 781 + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], 782 + 666 783 "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], 667 784 668 785 "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], 669 786 787 + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], 788 + 789 + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], 790 + 670 791 "expand-tilde": ["expand-tilde@2.0.2", "", { "dependencies": { "homedir-polyfill": "^1.0.1" } }, "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw=="], 671 792 672 793 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], 673 794 795 + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], 796 + 797 + "express-rate-limit": ["express-rate-limit@8.3.2", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg=="], 798 + 799 + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], 800 + 674 801 "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], 675 802 803 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 804 + 676 805 "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], 677 806 678 807 "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 679 808 809 + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], 810 + 680 811 "fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="], 681 812 682 813 "fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], ··· 687 818 688 819 "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 689 820 821 + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], 822 + 690 823 "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], 691 824 692 825 "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], 693 826 694 827 "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], 695 828 829 + "form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], 830 + 831 + "formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], 832 + 833 + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], 834 + 696 835 "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], 836 + 837 + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], 697 838 698 839 "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 699 840 ··· 707 848 708 849 "get-tsconfig": ["get-tsconfig@4.13.7", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q=="], 709 850 710 - "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], 851 + "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], 852 + 853 + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], 711 854 712 855 "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 713 856 714 857 "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 858 + 859 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 715 860 716 861 "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], 717 862 ··· 723 868 724 869 "hono": ["hono@4.12.12", "", {}, "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q=="], 725 870 871 + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], 872 + 873 + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], 874 + 875 + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], 876 + 726 877 "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 727 878 728 879 "import-in-the-middle": ["import-in-the-middle@2.0.6", "", { "dependencies": { "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^2.2.0", "module-details-from-path": "^1.0.4" } }, "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw=="], 729 880 730 881 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 882 + 883 + "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], 884 + 885 + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], 731 886 732 887 "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 733 888 889 + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], 890 + 734 891 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 735 892 736 893 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 737 894 738 895 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 739 896 897 + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], 898 + 899 + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], 900 + 740 901 "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], 741 902 742 903 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 743 904 905 + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], 906 + 744 907 "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], 908 + 909 + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 910 + 911 + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], 912 + 913 + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], 745 914 746 915 "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], 747 916 748 917 "isomorphic-ws": ["isomorphic-ws@5.0.0", "", { "peerDependencies": { "ws": "*" } }, "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw=="], 749 918 750 - "jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="], 919 + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], 920 + 921 + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], 922 + 923 + "jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], 924 + 925 + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], 926 + 927 + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], 928 + 929 + "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], 751 930 752 931 "jsonlines": ["jsonlines@0.1.1", "", {}, "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA=="], 932 + 933 + "jwt-decode": ["jwt-decode@4.0.0", "", {}, "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="], 934 + 935 + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], 753 936 754 937 "libsodium": ["libsodium@0.8.2", "", {}, "sha512-TsnGYMoZtpweT+kR+lOv5TVsnJ/9U0FZOsLFzFOMWmxqOAYXjX3fsrPAW+i1LthgDKXJnI9A8dWEanT1tnJKIw=="], 755 938 ··· 779 962 780 963 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], 781 964 965 + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], 966 + 782 967 "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], 783 968 784 969 "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], 785 970 786 - "lru-cache": ["lru-cache@11.3.3", "", {}, "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ=="], 971 + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 787 972 788 973 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 789 974 790 975 "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 791 976 977 + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], 978 + 979 + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], 980 + 792 981 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 793 982 794 983 "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], ··· 797 986 798 987 "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], 799 988 800 - "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 989 + "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], 801 990 802 991 "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], 803 992 ··· 811 1000 812 1001 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 813 1002 1003 + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], 1004 + 814 1005 "nice-grpc": ["nice-grpc@2.1.14", "", { "dependencies": { "@grpc/grpc-js": "^1.14.0", "abort-controller-x": "^0.4.0", "nice-grpc-common": "^2.0.2" } }, "sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww=="], 815 1006 816 1007 "nice-grpc-common": ["nice-grpc-common@2.0.2", "", { "dependencies": { "ts-error": "^1.0.6" } }, "sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ=="], 817 1008 1009 + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], 1010 + 1011 + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], 1012 + 1013 + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], 1014 + 818 1015 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.1.1", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-test": "build-test.js", "node-gyp-build-optional-packages-optional": "optional.js" } }, "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw=="], 819 1016 1017 + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 1018 + 1019 + "nypm": ["nypm@0.6.5", "", { "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", "tinyexec": "^1.0.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ=="], 1020 + 1021 + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], 1022 + 1023 + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], 1024 + 820 1025 "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], 821 1026 1027 + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], 1028 + 1029 + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], 1030 + 1031 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 1032 + 1033 + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], 1034 + 822 1035 "openapi-fetch": ["openapi-fetch@0.14.1", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-l7RarRHxlEZYjMLd/PR0slfMVse2/vvIAGm75/F7J6MlQ8/b9uUQmUF2kCPrQhJqMXSxmYWObVgeYXbFYzZR+A=="], 823 1036 824 1037 "openapi-typescript-helpers": ["openapi-typescript-helpers@0.0.15", "", {}, "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw=="], ··· 829 1042 830 1043 "parse-passwd": ["parse-passwd@1.0.0", "", {}, "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="], 831 1044 1045 + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 1046 + 832 1047 "path-expression-matcher": ["path-expression-matcher@1.4.0", "", {}, "sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q=="], 833 1048 834 1049 "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 835 1050 836 1051 "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 837 1052 838 - "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=="], 1053 + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], 1054 + 1055 + "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], 839 1056 840 1057 "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 1058 + 1059 + "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], 841 1060 842 1061 "pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], 843 1062 ··· 859 1078 860 1079 "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], 861 1080 1081 + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], 1082 + 1083 + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], 1084 + 862 1085 "pkgroll": ["pkgroll@2.27.0", "", { "dependencies": { "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-dynamic-import-vars": "^2.1.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "cjs-module-lexer": "^2.2.0", "esbuild": "^0.26.0", "magic-string": "^0.30.21", "rollup": "^4.53.5", "rollup-plugin-import-trace": "^1.0.1", "rollup-pluginutils": "^2.8.2", "yaml": "^2.8.2" }, "peerDependencies": { "typescript": "^4.1 || ^5.0" }, "optionalPeers": ["typescript"], "bin": { "pkgroll": "dist/cli.mjs" } }, "sha512-Huw5ZRxWTWeQ0PbNNKdbkAl52bPMy009RXdB4u3qjb47AMEBLG5VVF0V6oOD+YYiZaHaFxvjEeX+A2T9ckaClQ=="], 863 1086 864 1087 "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], ··· 872 1095 "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], 873 1096 874 1097 "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], 1098 + 1099 + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], 1100 + 1101 + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], 1102 + 1103 + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], 875 1104 876 1105 "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], 877 1106 1107 + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], 1108 + 878 1109 "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], 879 1110 880 1111 "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], 1112 + 1113 + "qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], 881 1114 882 1115 "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 883 1116 884 1117 "ramda": ["ramda@0.32.0", "", {}, "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ=="], 885 1118 886 - "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 1119 + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], 1120 + 1121 + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], 1122 + 1123 + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], 1124 + 1125 + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], 1126 + 1127 + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], 1128 + 1129 + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], 887 1130 888 1131 "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 1132 + 1133 + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], 889 1134 890 1135 "require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="], 891 1136 ··· 905 1150 906 1151 "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], 907 1152 1153 + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], 1154 + 1155 + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], 1156 + 908 1157 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 909 1158 910 1159 "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 911 1160 1161 + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 1162 + 1163 + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], 1164 + 1165 + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], 1166 + 1167 + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], 1168 + 1169 + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], 1170 + 912 1171 "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 913 1172 914 1173 "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 915 1174 916 1175 "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], 917 1176 1177 + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], 1178 + 1179 + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], 1180 + 1181 + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], 1182 + 1183 + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], 1184 + 918 1185 "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], 919 1186 920 1187 "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], ··· 931 1198 932 1199 "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], 933 1200 1201 + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], 1202 + 934 1203 "std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="], 935 1204 936 1205 "stream-browserify": ["stream-browserify@3.0.0", "", { "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA=="], ··· 939 1208 940 1209 "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], 941 1210 942 - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1211 + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 1212 + 1213 + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 943 1214 944 1215 "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 945 1216 946 - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1217 + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], 1218 + 1219 + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 947 1220 948 1221 "strnum": ["strnum@2.2.3", "", {}, "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg=="], 949 1222 ··· 965 1238 966 1239 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 967 1240 1241 + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 1242 + 1243 + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], 1244 + 1245 + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], 1246 + 968 1247 "ts-error": ["ts-error@1.0.6", "", {}, "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA=="], 969 1248 970 1249 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 971 1250 972 1251 "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], 973 1252 1253 + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], 1254 + 1255 + "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], 1256 + 974 1257 "undici": ["undici@7.24.7", "", {}, "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ=="], 975 1258 976 1259 "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], 977 1260 978 1261 "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=="], 979 1262 1263 + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], 1264 + 980 1265 "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 981 1266 982 1267 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], 983 1268 1269 + "uuidv7": ["uuidv7@1.2.1", "", { "bin": { "uuidv7": "cli.js" } }, "sha512-4kPkK3/XTQW9Hbm4CaqfICn+kY9LJtDVEOfgsRRra/+n2Ofg4NqzRFceAkxvQ/Ud/6BpHOPzj8cirqM7TzTN5Q=="], 1270 + 1271 + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 1272 + 984 1273 "vite": ["vite@8.0.8", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.15", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw=="], 985 1274 986 1275 "vitest": ["vitest@4.1.4", "", { "dependencies": { "@vitest/expect": "4.1.4", "@vitest/mocker": "4.1.4", "@vitest/pretty-format": "4.1.4", "@vitest/runner": "4.1.4", "@vitest/snapshot": "4.1.4", "@vitest/spy": "4.1.4", "@vitest/utils": "4.1.4", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.4", "@vitest/browser-preview": "4.1.4", "@vitest/browser-webdriverio": "4.1.4", "@vitest/coverage-istanbul": "4.1.4", "@vitest/coverage-v8": "4.1.4", "@vitest/ui": "4.1.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg=="], ··· 989 1278 990 1279 "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], 991 1280 1281 + "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], 1282 + 1283 + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], 1284 + 1285 + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], 1286 + 992 1287 "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 993 1288 994 1289 "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], 995 1290 996 - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1291 + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], 1292 + 1293 + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1294 + 1295 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 997 1296 998 1297 "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], 1298 + 1299 + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], 999 1300 1000 1301 "xdg-app-paths": ["xdg-app-paths@5.1.0", "", { "dependencies": { "xdg-portable": "^7.0.0" } }, "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA=="], 1001 1302 ··· 1013 1314 1014 1315 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 1015 1316 1317 + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], 1318 + 1016 1319 "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], 1320 + 1321 + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], 1017 1322 1018 1323 "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 1019 1324 1020 1325 "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 1021 1326 1022 1327 "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 1328 + 1329 + "@blaxel/core/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], 1330 + 1331 + "@daytonaio/sdk/dotenv": ["dotenv@17.4.1", "", {}, "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw=="], 1023 1332 1024 1333 "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], 1025 1334 1335 + "@hey-api/openapi-ts/get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], 1336 + 1026 1337 "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 1027 1338 1028 1339 "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], ··· 1043 1354 1044 1355 "@opentelemetry/sdk-trace-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], 1045 1356 1357 + "@runloop/api-client/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], 1358 + 1359 + "@runloop/api-client/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], 1360 + 1046 1361 "@vercel/sandbox/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], 1047 1362 1048 1363 "@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], 1049 1364 1365 + "accepts/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], 1366 + 1367 + "c12/dotenv": ["dotenv@17.4.1", "", {}, "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw=="], 1368 + 1369 + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1370 + 1371 + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1372 + 1373 + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1374 + 1050 1375 "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 1051 1376 1377 + "e2b/glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], 1378 + 1379 + "express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], 1380 + 1381 + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], 1382 + 1052 1383 "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 1384 + 1385 + "nypm/citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], 1053 1386 1054 1387 "pkgroll/esbuild": ["esbuild@0.26.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.26.0", "@esbuild/android-arm": "0.26.0", "@esbuild/android-arm64": "0.26.0", "@esbuild/android-x64": "0.26.0", "@esbuild/darwin-arm64": "0.26.0", "@esbuild/darwin-x64": "0.26.0", "@esbuild/freebsd-arm64": "0.26.0", "@esbuild/freebsd-x64": "0.26.0", "@esbuild/linux-arm": "0.26.0", "@esbuild/linux-arm64": "0.26.0", "@esbuild/linux-ia32": "0.26.0", "@esbuild/linux-loong64": "0.26.0", "@esbuild/linux-mips64el": "0.26.0", "@esbuild/linux-ppc64": "0.26.0", "@esbuild/linux-riscv64": "0.26.0", "@esbuild/linux-s390x": "0.26.0", "@esbuild/linux-x64": "0.26.0", "@esbuild/netbsd-arm64": "0.26.0", "@esbuild/netbsd-x64": "0.26.0", "@esbuild/openbsd-arm64": "0.26.0", "@esbuild/openbsd-x64": "0.26.0", "@esbuild/openharmony-arm64": "0.26.0", "@esbuild/sunos-x64": "0.26.0", "@esbuild/win32-arm64": "0.26.0", "@esbuild/win32-ia32": "0.26.0", "@esbuild/win32-x64": "0.26.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q=="], 1055 1388 1389 + "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], 1390 + 1391 + "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], 1392 + 1056 1393 "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], 1057 1394 1395 + "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], 1396 + 1397 + "stream-browserify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 1398 + 1399 + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 1400 + 1401 + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1402 + 1403 + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1404 + 1058 1405 "tsx/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], 1406 + 1407 + "type-is/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], 1059 1408 1060 1409 "vite/esbuild": ["esbuild@0.26.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.26.0", "@esbuild/android-arm": "0.26.0", "@esbuild/android-arm64": "0.26.0", "@esbuild/android-x64": "0.26.0", "@esbuild/darwin-arm64": "0.26.0", "@esbuild/darwin-x64": "0.26.0", "@esbuild/freebsd-arm64": "0.26.0", "@esbuild/freebsd-x64": "0.26.0", "@esbuild/linux-arm": "0.26.0", "@esbuild/linux-arm64": "0.26.0", "@esbuild/linux-ia32": "0.26.0", "@esbuild/linux-loong64": "0.26.0", "@esbuild/linux-mips64el": "0.26.0", "@esbuild/linux-ppc64": "0.26.0", "@esbuild/linux-riscv64": "0.26.0", "@esbuild/linux-s390x": "0.26.0", "@esbuild/linux-x64": "0.26.0", "@esbuild/netbsd-arm64": "0.26.0", "@esbuild/netbsd-x64": "0.26.0", "@esbuild/openbsd-arm64": "0.26.0", "@esbuild/openbsd-x64": "0.26.0", "@esbuild/openharmony-arm64": "0.26.0", "@esbuild/sunos-x64": "0.26.0", "@esbuild/win32-arm64": "0.26.0", "@esbuild/win32-ia32": "0.26.0", "@esbuild/win32-x64": "0.26.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q=="], 1061 1410 1411 + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 1412 + 1413 + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1414 + 1415 + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1416 + 1417 + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1418 + 1062 1419 "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1063 1420 1064 1421 "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], ··· 1109 1466 1110 1467 "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], 1111 1468 1469 + "@runloop/api-client/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], 1470 + 1471 + "accepts/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 1472 + 1473 + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 1474 + 1475 + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1476 + 1477 + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 1478 + 1112 1479 "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 1113 1480 1481 + "e2b/glob/jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="], 1482 + 1483 + "e2b/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], 1484 + 1485 + "e2b/glob/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=="], 1486 + 1487 + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 1488 + 1489 + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], 1490 + 1491 + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], 1492 + 1114 1493 "pkgroll/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.26.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA=="], 1115 1494 1116 1495 "pkgroll/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.26.0", "", { "os": "android", "cpu": "arm" }, "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA=="], ··· 1162 1541 "pkgroll/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.26.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw=="], 1163 1542 1164 1543 "pkgroll/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.26.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A=="], 1544 + 1545 + "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 1546 + 1547 + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1165 1548 1166 1549 "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], 1167 1550 ··· 1215 1598 1216 1599 "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], 1217 1600 1601 + "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 1602 + 1218 1603 "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.26.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA=="], 1219 1604 1220 1605 "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.26.0", "", { "os": "android", "cpu": "arm" }, "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA=="], ··· 1267 1652 1268 1653 "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.26.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A=="], 1269 1654 1655 + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 1656 + 1657 + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1658 + 1659 + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 1660 + 1661 + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1662 + 1270 1663 "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1271 1664 1272 1665 "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1273 1666 1274 1667 "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], 1668 + 1669 + "e2b/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@9.0.0", "", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="], 1670 + 1671 + "e2b/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], 1672 + 1673 + "e2b/glob/path-scurry/lru-cache": ["lru-cache@11.3.3", "", {}, "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ=="], 1674 + 1675 + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 1676 + 1677 + "e2b/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 1275 1678 } 1276 1679 }
+3
apps/modal-sandbox/package.json
··· 10 10 "test": "vitest run" 11 11 }, 12 12 "dependencies": { 13 + "@blaxel/core": "^0.2.79", 13 14 "@daytonaio/sdk": "^0.162.0", 14 15 "@deno/sandbox": "^0.13.2", 15 16 "@fly/sprites": "^0.0.1", 16 17 "@hono/node-server": "^1.19.13", 18 + "@hopx-ai/sdk": "^0.5.1", 19 + "@runloop/api-client": "^1.18.1", 17 20 "@std/yaml": "npm:@jsr/std__yaml", 18 21 "@tsndr/cloudflare-worker-jwt": "^3.2.1", 19 22 "@vercel/sandbox": "^1.9.3",
+29
apps/modal-sandbox/src/lib/sandbox-helpers.ts
··· 8 8 vercelAuth, 9 9 modalAuth, 10 10 e2bAuth, 11 + hopxAuth, 12 + runloopAuth, 11 13 } from "../schema"; 12 14 import { 13 15 BaseSandbox, ··· 18 20 } from "../providers"; 19 21 import type { SelectSandbox } from "../schema/sandboxes"; 20 22 import decrypt from "./decrypt"; 23 + import { env } from "node:process"; 21 24 22 25 export interface AuthParams { 23 26 spriteAuthParams?: { spriteToken?: string } | null; ··· 35 38 e2bAuthParams?: { 36 39 apiKey?: string; 37 40 } | null; 41 + hopxAuthParams?: { 42 + apiKey?: string; 43 + } | null; 44 + runloopAuthParams?: { 45 + apiKey?: string; 46 + } | null; 38 47 } 39 48 40 49 export async function getAuthParams( ··· 48 57 [vercelAuthParams], 49 58 [modalAuthParams], 50 59 [e2bAuthParams], 60 + [hopxAuthParams], 61 + [runloopAuthParams], 51 62 ] = await Promise.all([ 52 63 db 53 64 .select() ··· 79 90 .from(e2bAuth) 80 91 .where(eq(e2bAuth.sandboxId, sandboxDbId)) 81 92 .execute(), 93 + db 94 + .select() 95 + .from(hopxAuth) 96 + .where(eq(hopxAuth.sandboxId, sandboxDbId)) 97 + .execute(), 98 + db 99 + .select() 100 + .from(runloopAuth) 101 + .where(eq(runloopAuth.sandboxId, sandboxDbId)) 102 + .execute(), 82 103 ]); 83 104 return { 84 105 spriteAuthParams, ··· 87 108 vercelAuthParams, 88 109 modalAuthParams, 89 110 e2bAuthParams, 111 + hopxAuthParams, 112 + runloopAuthParams, 90 113 }; 91 114 } 92 115 ··· 102 125 modalTokenId: decrypt(auth.modalAuthParams?.tokenId), 103 126 modalTokenSecret: decrypt(auth.modalAuthParams?.tokenSecret), 104 127 e2bApiKey: decrypt(auth.e2bAuthParams?.apiKey), 128 + hopxApiKey: decrypt(auth.hopxAuthParams?.apiKey), 129 + runloopApiKey: decrypt(auth.runloopAuthParams?.apiKey), 130 + blaxelApiKey: env.BL_API_KEY, 131 + blaxelWorkspace: env.BL_WORKSPACE, 105 132 }; 106 133 } 107 134 ··· 114 141 const sandbox = await createSandbox(record.provider as Provider, { 115 142 id: record.id, 116 143 modalAppName: record.name, 144 + blaxelName: record.name, 117 145 ...credentials, 118 146 }); 119 147 const sandboxId = await sandbox.id(); ··· 127 155 128 156 return getSandboxById(record.provider as Provider, record.sandboxId!, { 129 157 modalAppName: record.name, 158 + blaxelName: record.name, 130 159 ...credentials, 131 160 }); 132 161 }
+187
apps/modal-sandbox/src/providers/blaxel/index.ts
··· 1 + import { SandboxInstance } from "@blaxel/core"; 2 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 3 + import { consola } from "consola"; 4 + import path from "node:path"; 5 + import { env } from "node:process"; 6 + 7 + const PTY_PORT = 26661; 8 + export const VSCODE_PORT = 1024; 9 + 10 + export class BlaxelSandbox implements BaseSandbox { 11 + constructor( 12 + private sandbox: SandboxInstance, 13 + private name: string, 14 + ) {} 15 + 16 + async start(): Promise<void> { 17 + // Blaxel's sandbox starts immediately upon creation, so we can just return here. 18 + } 19 + 20 + async stop(): Promise<void> { 21 + try { 22 + await this.sandbox.delete(); 23 + } catch (error) { 24 + consola.error("Error stopping blaxel Sandbox:", error); 25 + } 26 + } 27 + 28 + async delete(): Promise<void> { 29 + try { 30 + await this.stop(); 31 + } catch (error) { 32 + consola.error("Error deleting blaxel Sandbox:", error); 33 + } 34 + } 35 + 36 + async sh( 37 + strings: TemplateStringsArray, 38 + ...values: any[] 39 + ): Promise<{ 40 + stdout?: string | Buffer<ArrayBufferLike>; 41 + stderr?: string | Buffer<ArrayBufferLike>; 42 + exitCode: number; 43 + }> { 44 + const command = strings.reduce((acc, str, i) => { 45 + return acc + str + (values[i] || ""); 46 + }, ""); 47 + const result = await this.sandbox.process.exec({ 48 + command: `bash -c ${command}`, 49 + waitForCompletion: true, 50 + }); 51 + 52 + return { 53 + stdout: result.stdout, 54 + stderr: result.stderr, 55 + exitCode: result.exitCode, 56 + }; 57 + } 58 + 59 + async id(): Promise<string | null> { 60 + return this.name; 61 + } 62 + 63 + async ssh(): Promise<any> {} 64 + 65 + async mkdir(dir: string): Promise<void> { 66 + await this.sh`mkdir -p ${dir}`; 67 + } 68 + 69 + async writeFile(absolutePath: string, content: string): Promise<void> { 70 + const basePath = path.dirname(absolutePath); 71 + if (basePath !== "/" && basePath != ".") { 72 + await this.mkdir(basePath); 73 + } 74 + await this.sh`echo '${content}' > ${absolutePath}`; 75 + } 76 + 77 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 78 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 79 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 80 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 81 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 82 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 83 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 84 + } 85 + 86 + async setupDefaultSshKeys(): Promise<void> { 87 + await this 88 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 89 + } 90 + 91 + async setupTailscale(authKey: string): Promise<void> { 92 + await this 93 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 94 + await this.sh`pm2 start tailscaled || true`; 95 + await this.sh`tailscale up --auth-key=${authKey} || true`; 96 + } 97 + clone(repoUrl: string): Promise<any> { 98 + return this.sh`git clone ${repoUrl}`; 99 + } 100 + async mount(path: string, prefix?: string): Promise<void> { 101 + const VERSION = "v1.2.1"; 102 + const ARCH = "amd64"; 103 + await this.sh`mkdir -p $HOME/.local/bin`; 104 + await this 105 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 106 + await this 107 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C ~/.local/bin`; 108 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 109 + await this.sh`command -v tigrisfs || chmod +x ~/.local/bin/tigrisfs`; 110 + await this 111 + .sh`cp ~/.local/bin/tigrisfs /usr/bin || sudo cp ~/.local/bin/tigrisfs /usr/bin || true`; 112 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 113 + // install fuse ? 114 + 115 + await this.mkdir(path); 116 + 117 + const bucketPath = prefix 118 + ? `${env.VOLUME_BUCKET}:${prefix}` 119 + : env.VOLUME_BUCKET; 120 + 121 + await this 122 + .sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 123 + } 124 + 125 + async unmount(path: string): Promise<void> { 126 + await this 127 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 128 + } 129 + } 130 + 131 + class BlaxelProvider implements BaseProvider { 132 + async create(options: SandboxOptions): Promise<BaseSandbox> { 133 + if (!options.blaxelApiKey || !options.blaxelWorkspace) { 134 + throw new Error( 135 + "Blaxel API KEY and Workspace are required to create a Sandbox", 136 + ); 137 + } 138 + if (!options.blaxelName) { 139 + throw new Error("Blaxel Sandbox name is required to create a Sandbox"); 140 + } 141 + const image = options.image || "ghcr.io/pocketenv-io/modal-openclaw:0.1.0"; 142 + const sandbox = await SandboxInstance.createIfNotExists({ 143 + name: options.blaxelName, 144 + image, 145 + memory: 4096, 146 + ports: [ 147 + { 148 + target: PTY_PORT, 149 + protocol: "TCP", 150 + }, 151 + { 152 + target: VSCODE_PORT, 153 + protocol: "HTTP", 154 + }, 155 + { 156 + target: 3000, 157 + protocol: "TCP", 158 + }, 159 + { 160 + target: 4000, 161 + protocol: "TCP", 162 + }, 163 + { 164 + target: 8000, 165 + protocol: "TCP", 166 + }, 167 + ], 168 + }); 169 + return new BlaxelSandbox(sandbox, options.blaxelName); 170 + } 171 + 172 + async get(id: string, options?: SandboxOptions): Promise<BaseSandbox> { 173 + try { 174 + const sandbox = await SandboxInstance.get(id); 175 + return new BlaxelSandbox(sandbox, id); 176 + } catch { 177 + if (!options?.blaxelApiKey || !options?.blaxelWorkspace) { 178 + throw new Error( 179 + "Blaxel API KEY and Workspace are required to get a Sandbox", 180 + ); 181 + } 182 + return this.create(options!); 183 + } 184 + } 185 + } 186 + 187 + export default BlaxelProvider;
+4 -4
apps/modal-sandbox/src/providers/e2b/index.ts
··· 9 9 constructor(private sandbox: Sandbox) {} 10 10 11 11 async start(): Promise<void> { 12 - // Modal's sandbox starts immediately upon creation, so we can just return here. 12 + // E2B's sandbox starts immediately upon creation, so we can just return here. 13 13 } 14 14 15 15 async stop(): Promise<void> { 16 16 try { 17 17 await this.sandbox.kill(); 18 18 } catch (error) { 19 - consola.error("Error stopping e2b sandbox:", error); 19 + consola.error("Error stopping e2b Sandbox:", error); 20 20 } 21 21 } 22 22 ··· 24 24 try { 25 25 await this.stop(); 26 26 } catch (error) { 27 - consola.error("Error deleting e2b sandbox:", error); 27 + consola.error("Error deleting e2b Sandbox:", error); 28 28 } 29 29 } 30 30 ··· 123 123 class E2bProvider implements BaseProvider { 124 124 async create(options: SandboxOptions): Promise<BaseSandbox> { 125 125 if (!options.e2bApiKey) { 126 - throw new Error("E2B API KEY is required to create a sandbox"); 126 + throw new Error("E2B API KEY is required to create a Sandbox"); 127 127 } 128 128 const image = options.image || "ghcr.io/pocketenv-io/modal-openclaw:0.1.0"; 129 129 const template = Template().fromImage(image);
+161
apps/modal-sandbox/src/providers/hopx/index.ts
··· 1 + import { Sandbox, Template } from "@hopx-ai/sdk"; 2 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 3 + import { consola } from "consola"; 4 + import path from "node:path"; 5 + import { env } from "node:process"; 6 + import parseImageRef from "lib/parseImageRef"; 7 + 8 + export class HopxSandbox implements BaseSandbox { 9 + constructor(private sandbox: Sandbox) {} 10 + 11 + async start(): Promise<void> { 12 + // Hopx's sandbox starts immediately upon creation, so we can just return here. 13 + } 14 + 15 + async stop(): Promise<void> { 16 + try { 17 + await this.sandbox.kill(); 18 + } catch (error) { 19 + consola.error("Error stopping hopx Sandbox:", error); 20 + } 21 + } 22 + 23 + async delete(): Promise<void> { 24 + try { 25 + await this.stop(); 26 + } catch (error) { 27 + consola.error("Error deleting hopx Sandbox:", error); 28 + } 29 + } 30 + 31 + async sh( 32 + strings: TemplateStringsArray, 33 + ...values: any[] 34 + ): Promise<{ 35 + stdout?: string | Buffer<ArrayBufferLike>; 36 + stderr?: string | Buffer<ArrayBufferLike>; 37 + exitCode: number; 38 + }> { 39 + const command = strings.reduce((acc, str, i) => { 40 + return acc + str + (values[i] || ""); 41 + }, ""); 42 + const result = await this.sandbox.commands.run(command); 43 + 44 + return { 45 + stdout: result.stdout, 46 + stderr: result.stderr, 47 + exitCode: result.exit_code, 48 + }; 49 + } 50 + 51 + async id(): Promise<string | null> { 52 + return this.sandbox.sandboxId; 53 + } 54 + 55 + async ssh(): Promise<any> {} 56 + 57 + async mkdir(dir: string): Promise<void> { 58 + await this.sh`mkdir -p ${dir}`; 59 + } 60 + 61 + async writeFile(absolutePath: string, content: string): Promise<void> { 62 + const basePath = path.dirname(absolutePath); 63 + if (basePath !== "/" && basePath != ".") { 64 + await this.mkdir(basePath); 65 + } 66 + await this.sh`echo '${content}' > ${absolutePath}`; 67 + } 68 + 69 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 70 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 71 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 72 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 73 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 74 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 75 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 76 + } 77 + 78 + async setupDefaultSshKeys(): Promise<void> { 79 + await this 80 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 81 + } 82 + 83 + async setupTailscale(authKey: string): Promise<void> { 84 + await this 85 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 86 + await this.sh`pm2 start tailscaled || true`; 87 + await this.sh`tailscale up --auth-key=${authKey} || true`; 88 + } 89 + clone(repoUrl: string): Promise<any> { 90 + return this.sh`git clone ${repoUrl}`; 91 + } 92 + async mount(path: string, prefix?: string): Promise<void> { 93 + const VERSION = "v1.2.1"; 94 + const ARCH = "amd64"; 95 + await this.sh`mkdir -p $HOME/.local/bin`; 96 + await this 97 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 98 + await this 99 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C ~/.local/bin`; 100 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 101 + await this.sh`command -v tigrisfs || chmod +x ~/.local/bin/tigrisfs`; 102 + await this 103 + .sh`cp ~/.local/bin/tigrisfs /usr/bin || sudo cp ~/.local/bin/tigrisfs /usr/bin || true`; 104 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 105 + // install fuse ? 106 + 107 + await this.mkdir(path); 108 + 109 + const bucketPath = prefix 110 + ? `${env.VOLUME_BUCKET}:${prefix}` 111 + : env.VOLUME_BUCKET; 112 + 113 + await this 114 + .sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 115 + } 116 + 117 + async unmount(path: string): Promise<void> { 118 + await this 119 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 120 + } 121 + } 122 + 123 + class HopxProvider implements BaseProvider { 124 + async create(options: SandboxOptions): Promise<BaseSandbox> { 125 + if (!options.hopxApiKey) { 126 + throw new Error("Hopx API KEY is required to create a sandbox"); 127 + } 128 + const image = options.image || "ghcr.io/pocketenv-io/modal-openclaw:0.1.0"; 129 + const template = new Template(image); 130 + const { name } = parseImageRef(image); 131 + const templateName = name.split("/").pop()!; 132 + await Template.build(template, { 133 + name: templateName, 134 + apiKey: options.hopxApiKey, 135 + cpu: 2, 136 + memory: 4096, 137 + diskGB: 10, 138 + }); 139 + const sandbox = await Sandbox.create({ 140 + template: templateName, 141 + apiKey: options.hopxApiKey, 142 + }); 143 + return new HopxSandbox(sandbox); 144 + } 145 + 146 + async get(id: string, options?: SandboxOptions): Promise<BaseSandbox> { 147 + if (!options?.hopxApiKey) { 148 + throw new Error("Hopx API KEY is required to get a sandbox"); 149 + } 150 + 151 + try { 152 + const sandbox = await Sandbox.connect(id, options.hopxApiKey); 153 + return new HopxSandbox(sandbox); 154 + } catch { 155 + consola.warn(`Sandbox with id ${id} not found, creating a new one...`); 156 + return this.create(options!); 157 + } 158 + } 159 + } 160 + 161 + export default HopxProvider;
+33 -1
apps/modal-sandbox/src/providers/index.ts
··· 35 35 | "vercel" 36 36 | "sprites" 37 37 | "modal" 38 - | "e2b"; 38 + | "e2b" 39 + | "hopx" 40 + | "runloop" 41 + | "blaxel"; 39 42 40 43 export interface SandboxOptions { 41 44 id?: string; ··· 61 64 modalAppName?: string; 62 65 image?: string; 63 66 e2bApiKey?: string; 67 + hopxApiKey?: string; 68 + runloopApiKey?: string; 69 + blaxelWorkspace?: string; 70 + blaxelApiKey?: string; 71 + blaxelName?: string; 64 72 [key: string]: any; 65 73 } 66 74 ··· 93 101 return import("./e2b").then((module) => 94 102 new module.default().create(options), 95 103 ); 104 + case "hopx": 105 + return import("./hopx").then((module) => 106 + new module.default().create(options), 107 + ); 108 + case "runloop": 109 + return import("./runloop").then((module) => 110 + new module.default().create(options), 111 + ); 112 + case "blaxel": 113 + return import("./blaxel").then((module) => 114 + new module.default().create(options), 115 + ); 96 116 default: 97 117 console.log(`Provider ${provider} is not supported yet.`); 98 118 throw new Error(`Unsupported provider: ${provider}`); ··· 149 169 ); 150 170 case "e2b": 151 171 return import("./e2b").then((module) => 172 + new module.default().get(id, options), 173 + ); 174 + case "hopx": 175 + return import("./hopx").then((module) => 176 + new module.default().get(id, options), 177 + ); 178 + case "runloop": 179 + return import("./runloop").then((module) => 180 + new module.default().get(id, options), 181 + ); 182 + case "blaxel": 183 + return import("./blaxel").then((module) => 152 184 new module.default().get(id, options), 153 185 ); 154 186 default:
+162
apps/modal-sandbox/src/providers/runloop/index.ts
··· 1 + import { RunloopSDK, Devbox } from "@runloop/api-client"; 2 + import BaseProvider, { BaseSandbox, type SandboxOptions } from ".."; 3 + import { consola } from "consola"; 4 + import path from "node:path"; 5 + import { env } from "node:process"; 6 + import parseImageRef from "lib/parseImageRef"; 7 + 8 + export class RunloopSandbox implements BaseSandbox { 9 + constructor(private sandbox: Devbox) {} 10 + 11 + async start(): Promise<void> { 12 + // Runloop's sandbox starts immediately upon creation, so we can just return here. 13 + } 14 + 15 + async stop(): Promise<void> { 16 + try { 17 + await this.sandbox.shutdown(); 18 + } catch (error) { 19 + consola.error("Error stopping Runloop Sandbox:", error); 20 + } 21 + } 22 + 23 + async delete(): Promise<void> { 24 + try { 25 + await this.stop(); 26 + } catch (error) { 27 + consola.error("Error deleting Runloop Sandbox:", error); 28 + } 29 + } 30 + 31 + async sh( 32 + strings: TemplateStringsArray, 33 + ...values: any[] 34 + ): Promise<{ 35 + stdout?: string | Buffer<ArrayBufferLike>; 36 + stderr?: string | Buffer<ArrayBufferLike>; 37 + exitCode: number; 38 + }> { 39 + const command = strings.reduce((acc, str, i) => { 40 + return acc + str + (values[i] || ""); 41 + }, ""); 42 + const result = await this.sandbox.cmd.exec(`bash -c ${command}`); 43 + 44 + return { 45 + stdout: await result.stdout(), 46 + stderr: await result.stderr(), 47 + exitCode: result.exitCode || 0, 48 + }; 49 + } 50 + 51 + async id(): Promise<string | null> { 52 + return this.sandbox.id; 53 + } 54 + 55 + async ssh(): Promise<any> {} 56 + 57 + async mkdir(dir: string): Promise<void> { 58 + await this.sh`mkdir -p ${dir}`; 59 + } 60 + 61 + async writeFile(absolutePath: string, content: string): Promise<void> { 62 + const basePath = path.dirname(absolutePath); 63 + if (basePath !== "/" && basePath != ".") { 64 + await this.mkdir(basePath); 65 + } 66 + await this.sh`echo '${content}' > ${absolutePath}`; 67 + } 68 + 69 + async setupSshKeys(privateKey: string, publicKey: string): Promise<void> { 70 + await this.writeFile("~/.ssh/id_ed25519", privateKey); 71 + await this.writeFile("~/.ssh/id_ed25519.pub", publicKey); 72 + await this.sh`chmod 600 ~/.ssh/id_ed25519`; 73 + await this.sh`chmod 644 ~/.ssh/id_ed25519.pub`; 74 + await this.sh`ssh-keyscan -t rsa tangled.org >> $HOME/.ssh/known_hosts`; 75 + await this.sh`ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts`; 76 + } 77 + 78 + async setupDefaultSshKeys(): Promise<void> { 79 + await this 80 + .sh`[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -q -N "" || true`; 81 + } 82 + 83 + async setupTailscale(authKey: string): Promise<void> { 84 + await this 85 + .sh`type tailscaled || curl -fsSL https://tailscale.com/install.sh | sh || true`; 86 + await this.sh`pm2 start tailscaled || true`; 87 + await this.sh`tailscale up --auth-key=${authKey} || true`; 88 + } 89 + clone(repoUrl: string): Promise<any> { 90 + return this.sh`git clone ${repoUrl}`; 91 + } 92 + async mount(path: string, prefix?: string): Promise<void> { 93 + const VERSION = "v1.2.1"; 94 + const ARCH = "amd64"; 95 + await this.sh`mkdir -p $HOME/.local/bin`; 96 + await this 97 + .sh`command -v tigrisfs || ARCH=amd64 && curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION.replace("v", "")}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz`; 98 + await this 99 + .sh`command -v tigrisfs || tar -xzf /tmp/tigrisfs.tar.gz -C ~/.local/bin`; 100 + await this.sh`command -v tigrisfs || rm -rf /tmp/tigrisfs.tar.gz`; 101 + await this.sh`command -v tigrisfs || chmod +x ~/.local/bin/tigrisfs`; 102 + await this 103 + .sh`cp ~/.local/bin/tigrisfs /usr/bin || sudo cp ~/.local/bin/tigrisfs /usr/bin || true`; 104 + await this.sh`mkdir -p ${path} || sudo mkdir -p ${path}`; 105 + // install fuse ? 106 + 107 + await this.mkdir(path); 108 + 109 + const bucketPath = prefix 110 + ? `${env.VOLUME_BUCKET}:${prefix}` 111 + : env.VOLUME_BUCKET; 112 + 113 + await this 114 + .sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 115 + } 116 + 117 + async unmount(path: string): Promise<void> { 118 + await this 119 + .sh`fusermount -u ${path} || sudo fusermount -u ${path} || umount ${path}`; 120 + } 121 + } 122 + 123 + class RunloopProvider implements BaseProvider { 124 + async create(options: SandboxOptions): Promise<BaseSandbox> { 125 + if (!options.runloopApiKey) { 126 + throw new Error("Runloop API KEY is required to create a sandbox"); 127 + } 128 + const image = options.image || "ghcr.io/pocketenv-io/modal-openclaw:0.1.0"; 129 + const { name } = parseImageRef(image); 130 + const templateName = name.split("/").pop()!; 131 + const sdk = new RunloopSDK({ 132 + bearerToken: options.runloopApiKey, 133 + }); 134 + 135 + await sdk.blueprint.create({ 136 + name: templateName, 137 + dockerfile: `FROM ${image}`, 138 + }); 139 + 140 + const sandbox = await sdk.devbox.create({ 141 + blueprint_name: templateName, 142 + }); 143 + return new RunloopSandbox(sandbox); 144 + } 145 + 146 + async get(id: string, options?: SandboxOptions): Promise<BaseSandbox> { 147 + if (!options?.runloopApiKey) { 148 + throw new Error("Runloop API KEY is required to get a sandbox"); 149 + } 150 + try { 151 + const sdk = new RunloopSDK({ 152 + bearerToken: options?.runloopApiKey, 153 + }); 154 + const sandbox = sdk.devbox.fromId(id); 155 + return new RunloopSandbox(sandbox); 156 + } catch { 157 + return this.create(options!); 158 + } 159 + } 160 + } 161 + 162 + export default RunloopProvider;
+35 -1
apps/modal-sandbox/src/routes/sandboxes.ts
··· 21 21 vercelAuth, 22 22 modalAuth, 23 23 e2bAuth, 24 + runloopAuth, 25 + hopxAuth, 24 26 } from "../schema"; 25 27 import { 26 28 type SandboxConfig, ··· 42 44 import { type PullDirectoryParams, pullSchema } from "../types/pull"; 43 45 import { type PushDirectoryParams, pushSchema } from "../types/push"; 44 46 import crypto from "node:crypto"; 45 - import process from "node:process"; 47 + import process, { env } from "node:process"; 46 48 import prepareSandbox from "../lib/prepare-sandbox"; 47 49 import { images } from "../images"; 48 50 import type { InsertSandbox } from "schema/sandboxes"; ··· 54 56 "sprites", 55 57 "modal", 56 58 "e2b", 59 + "hopx", 60 + "blaxel", 61 + "runloop", 57 62 ]; 58 63 59 64 const sandboxRouter = new Hono<{ Variables: Context }>(); ··· 202 207 .execute(); 203 208 } 204 209 210 + if (params.runloopApiKey && user?.id) { 211 + await tx 212 + .insert(runloopAuth) 213 + .values({ 214 + sandboxId: record!.id, 215 + apiKey: params.runloopApiKey!, 216 + redactedApiKey: params.redactedRunloopApiKey ?? "", 217 + userId: user.id, 218 + }) 219 + .execute(); 220 + } 221 + 222 + if (params.hopxApiKey && user?.id) { 223 + await tx 224 + .insert(hopxAuth) 225 + .values({ 226 + sandboxId: record!.id, 227 + apiKey: params.hopxApiKey!, 228 + redactedApiKey: params.redactedHopxApiKey ?? "", 229 + userId: user.id, 230 + }) 231 + .execute(); 232 + } 233 + 205 234 return { record, user }; 206 235 }, 207 236 ); ··· 224 253 modalTokenSecret: decrypt(params.modalTokenSecret), 225 254 image: images[params.base] || images["openclaw"], 226 255 e2bApiKey: decrypt(params.e2bApiKey), 256 + hopxApiKey: decrypt(params.hopxApiKey), 257 + runloopApiKey: decrypt(params.runloopApiKey), 258 + blaxelApiKey: env.BL_API_KEY, 259 + blaxelWorkspace: env.BL_WORKSPACE, 260 + blaxelName: name, 227 261 }); 228 262 const sandboxId = await sandbox.id(); 229 263
+28
apps/modal-sandbox/src/schema/hopx-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const hopxAuth = pgTable( 7 + "hopx_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_hopx_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectHopxAuth = InferSelectModel<typeof hopxAuth>; 26 + export type InsertHopxAuth = InferInsertModel<typeof hopxAuth>; 27 + 28 + export default hopxAuth;
+4
apps/modal-sandbox/src/schema/index.ts
··· 21 21 import backups from "./backups"; 22 22 import modalAuth from "./modal-auth"; 23 23 import e2bAuth from "./e2b-auth"; 24 + import hopxAuth from "./hopx-auth"; 25 + import runloopAuth from "./runloop-auth"; 24 26 25 27 export { 26 28 sandboxes, ··· 46 48 backups, 47 49 modalAuth, 48 50 e2bAuth, 51 + hopxAuth, 52 + runloopAuth, 49 53 };
+28
apps/modal-sandbox/src/schema/runloop-auth.ts
··· 1 + import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm"; 2 + import { pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core"; 3 + import sandboxes from "./sandboxes"; 4 + import users from "./users"; 5 + 6 + const runloopAuth = pgTable( 7 + "runloop_auth", 8 + { 9 + id: text("id") 10 + .primaryKey() 11 + .default(sql`xata_id()`), 12 + sandboxId: text("sandbox_id") 13 + .notNull() 14 + .references(() => sandboxes.id, { onDelete: "cascade" }), 15 + userId: text("user_id") 16 + .notNull() 17 + .references(() => users.id), 18 + apiKey: text("api_key").notNull(), 19 + redactedApiKey: text("redacted_api_key").notNull(), 20 + createdAt: timestamp("created_at").defaultNow().notNull(), 21 + }, 22 + (t) => [uniqueIndex("unique_runloop_auth").on(t.sandboxId, t.userId)], 23 + ); 24 + 25 + export type SelectRunloopAuth = InferSelectModel<typeof runloopAuth>; 26 + export type InsertRunloopAuth = InferInsertModel<typeof runloopAuth>; 27 + 28 + export default runloopAuth;
+50 -1
apps/modal-sandbox/src/types/sandbox.ts
··· 32 32 name: z.string().optional(), 33 33 description: z.string().optional(), 34 34 provider: z 35 - .enum(["daytona", "vercel", "deno", "sprites", "modal", "e2b"]) 35 + .enum([ 36 + "daytona", 37 + "vercel", 38 + "deno", 39 + "sprites", 40 + "modal", 41 + "e2b", 42 + "hopx", 43 + "runloop", 44 + "blaxel", 45 + ]) 36 46 .optional() 37 47 .default("deno"), 38 48 base: z.enum(["openclaw"]).optional().default("openclaw"), ··· 54 64 redactedModalTokenSecret: z.string().optional(), 55 65 e2bApiKey: z.string().optional(), 56 66 redactedE2bApiKey: z.string().optional(), 67 + hopxApiKey: z.string().optional(), 68 + redactedHopxApiKey: z.string().optional(), 69 + runloopApiKey: z.string().optional(), 70 + redactedRunloopApiKey: z.string().optional(), 57 71 vcpus: z.number().optional().default(2), 58 72 memory: z.number().optional().default(4), 59 73 disk: z.number().optional().default(3), ··· 218 232 code: z.ZodIssueCode.custom, 219 233 message: "redactedE2bApiKey is required when provider is 'e2b'", 220 234 path: ["redactedE2bApiKey"], 235 + }); 236 + } 237 + } 238 + 239 + if (data.provider === "hopx") { 240 + if (!data.hopxApiKey) { 241 + ctx.addIssue({ 242 + code: z.ZodIssueCode.custom, 243 + message: "hopxApiKey is required when provider is 'hopx'", 244 + path: ["hopxApiKey"], 245 + }); 246 + } 247 + if (!data.redactedHopxApiKey) { 248 + ctx.addIssue({ 249 + code: z.ZodIssueCode.custom, 250 + message: "redactedHopxApiKey is required when provider is 'hopx'", 251 + path: ["redactedHopxApiKey"], 252 + }); 253 + } 254 + } 255 + 256 + if (data.provider === "runloop") { 257 + if (!data.runloopApiKey) { 258 + ctx.addIssue({ 259 + code: z.ZodIssueCode.custom, 260 + message: "runloopApiKey is required when provider is 'runloop'", 261 + path: ["runloopApiKey"], 262 + }); 263 + } 264 + if (!data.redactedRunloopApiKey) { 265 + ctx.addIssue({ 266 + code: z.ZodIssueCode.custom, 267 + message: 268 + "redactedRunloopApiKey is required when provider is 'runloop'", 269 + path: ["redactedRunloopApiKey"], 221 270 }); 222 271 } 223 272 }
+103 -2
apps/web/src/pages/settings/provider/Provider.tsx
··· 24 24 e2b: "E2B Access Token", 25 25 } as const; 26 26 27 - type Provider = keyof typeof LABELS | "cloudflare" | "modal"; 27 + type Provider = 28 + | keyof typeof LABELS 29 + | "cloudflare" 30 + | "modal" 31 + | "hopx" 32 + | "runloop"; 28 33 29 34 const schema = z 30 35 .object({ ··· 36 41 "sprites", 37 42 "modal", 38 43 "e2b", 44 + "hopx", 45 + "runloop", 39 46 ]), 40 47 apiKey: z.string().optional(), 41 48 organizationId: z.string().optional(), ··· 44 51 tokenId: z.string().optional(), 45 52 tokenSecret: z.string().optional(), 46 53 e2bApiKey: z.string().optional(), 54 + hopxApiKey: z.string().optional(), 55 + runloopApiKey: z.string().optional(), 47 56 }) 48 57 .superRefine((data, ctx) => { 49 58 if ( 50 59 data.provider !== "cloudflare" && 51 60 data.provider !== "modal" && 52 61 data.provider !== "e2b" && 62 + data.provider !== "hopx" && 63 + data.provider !== "runloop" && 53 64 !data.apiKey?.trim() 54 65 ) { 55 66 ctx.addIssue({ ··· 98 109 code: z.ZodIssueCode.custom, 99 110 message: "E2B Access Token is required", 100 111 path: ["e2bApiKey"], 112 + }); 113 + } 114 + if (data.provider === "hopx" && !data.hopxApiKey?.trim()) { 115 + ctx.addIssue({ 116 + code: z.ZodIssueCode.custom, 117 + message: "HopX API Key is required", 118 + path: ["hopxApiKey"], 119 + }); 120 + } 121 + if (data.provider === "runloop" && !data.runloopApiKey?.trim()) { 122 + ctx.addIssue({ 123 + code: z.ZodIssueCode.custom, 124 + message: "Runloop API Key is required", 125 + path: ["runloopApiKey"], 101 126 }); 102 127 } 103 128 }); ··· 134 159 tokenId: "", 135 160 tokenSecret: "", 136 161 e2bApiKey: "", 162 + hopxApiKey: "", 163 + runloopApiKey: "", 137 164 }, 138 165 }); 139 166 ··· 152 179 setValue("tokenId", providerPref.redactedModalTokenId ?? ""); 153 180 setValue("tokenSecret", providerPref.redactedModalTokenSecret ?? ""); 154 181 setValue("e2bApiKey", providerPref.redactedE2bApiKey ?? ""); 182 + setValue("hopxApiKey", providerPref.redactedHopxApiKey ?? ""); 183 + setValue("runloopApiKey", providerPref.redactedRunloopApiKey ?? ""); 155 184 } 156 185 }, [preferences, setValue]); 157 186 ··· 225 254 values.e2bApiKey.slice(-3) 226 255 : values.e2bApiKey; 227 256 } 257 + } else if (values.provider === "hopx") { 258 + if (values.hopxApiKey && !values.hopxApiKey.includes("**")) { 259 + const sealed = sodium.cryptoBoxSeal( 260 + sodium.fromString(values.hopxApiKey.trim()), 261 + sodium.fromHex(PUBLIC_KEY), 262 + ); 263 + pref.hopxApiKey = sodium.toBase64( 264 + sealed, 265 + sodium.base64Variants.URLSAFE_NO_PADDING, 266 + ); 267 + pref.redactedHopxApiKey = 268 + values.hopxApiKey.length > 14 269 + ? values.hopxApiKey.slice(0, 11) + 270 + "*".repeat(24) + 271 + values.hopxApiKey.slice(-3) 272 + : values.hopxApiKey; 273 + } 274 + } else if (values.provider === "runloop") { 275 + if (values.runloopApiKey && !values.runloopApiKey.includes("**")) { 276 + const sealed = sodium.cryptoBoxSeal( 277 + sodium.fromString(values.runloopApiKey.trim()), 278 + sodium.fromHex(PUBLIC_KEY), 279 + ); 280 + pref.runloopApiKey = sodium.toBase64( 281 + sealed, 282 + sodium.base64Variants.URLSAFE_NO_PADDING, 283 + ); 284 + pref.redactedRunloopApiKey = 285 + values.runloopApiKey.length > 14 286 + ? values.runloopApiKey.slice(0, 11) + 287 + "*".repeat(24) + 288 + values.runloopApiKey.slice(-3) 289 + : values.runloopApiKey; 290 + } 228 291 } else if ( 229 292 values.apiKey?.includes("**") && 230 293 values.provider !== "cloudflare" ··· 237 300 if ( 238 301 values.provider !== "modal" && 239 302 values.provider !== "e2b" && 303 + values.provider !== "hopx" && 304 + values.provider !== "runloop" && 240 305 values.apiKey && 241 306 !values.apiKey.includes("**") 242 307 ) { ··· 301 366 setValue("tokenId", ""); 302 367 setValue("tokenSecret", ""); 303 368 setValue("e2bApiKey", ""); 369 + setValue("hopxApiKey", ""); 370 + setValue("runloopApiKey", ""); 304 371 }} 305 372 className="select select-lg font-medium text-[15px]" 306 373 > ··· 313 380 <option value="sprites">Sprites</option> 314 381 <option value="modal">Modal</option> 315 382 <option value="e2b">E2B</option> 383 + <option value="hopx">Hopx</option> 384 + <option value="runloop">Runloop</option> 316 385 </select> 317 386 </div> 318 387 {provider !== "cloudflare" && 319 388 provider !== "modal" && 320 - provider !== "e2b" && ( 389 + provider !== "e2b" && 390 + provider !== "hopx" && 391 + provider !== "runloop" && ( 321 392 <div className="w-96"> 322 393 <label className="label-text"> 323 394 {LABELS[provider as keyof typeof LABELS]} ··· 393 464 {errors.e2bApiKey && ( 394 465 <p className="text-error text-sm mt-1"> 395 466 {errors.e2bApiKey.message} 467 + </p> 468 + )} 469 + </div> 470 + )} 471 + {provider === "hopx" && ( 472 + <div className="w-96 mt-4"> 473 + <label className="label-text">Hopx API Key</label> 474 + <input 475 + {...register("hopxApiKey")} 476 + type="text" 477 + className="input input-lg font-medium text-[15px]" 478 + /> 479 + {errors.hopxApiKey && ( 480 + <p className="text-error text-sm mt-1"> 481 + {errors.hopxApiKey.message} 482 + </p> 483 + )} 484 + </div> 485 + )} 486 + {provider === "runloop" && ( 487 + <div className="w-96 mt-4"> 488 + <label className="label-text">Runloop API Key</label> 489 + <input 490 + {...register("runloopApiKey")} 491 + type="text" 492 + className="input input-lg font-medium text-[15px]" 493 + /> 494 + {errors.runloopApiKey && ( 495 + <p className="text-error text-sm mt-1"> 496 + {errors.runloopApiKey.message} 396 497 </p> 397 498 )} 398 499 </div>
+4
apps/web/src/types/preferences.ts
··· 19 19 redactedModalTokenSecret?: string; 20 20 e2bApiKey?: string; 21 21 redactedE2bApiKey?: string; 22 + hopxApiKey?: string; 23 + redactedHopxApiKey?: string; 24 + runloopApiKey?: string; 25 + redactedRunloopApiKey?: string; 22 26 $type: "io.pocketenv.sandbox.defs#sandboxProviderPref"; 23 27 }; 24 28