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.

Expose service status and update it on start

Return status in service listing and set serviceId/status to RUNNING
when sandbox starts a service. Adjust CLI to accept ports as strings,
join command array into a single string, and convert ports to integers
before sending.

+14 -4
+1
apps/api/src/xrpc/io/pocketenv/service/getServices.ts
··· 43 43 name: record.name, 44 44 description: record.description!, 45 45 command: record.command, 46 + status: record.status, 46 47 createdAt: record.createdAt.toISOString(), 47 48 })), 48 49 } satisfies OutputSchema;
+10 -1
apps/cf-sandbox/src/index.ts
··· 481 481 482 482 c.executionCtx.waitUntil( 483 483 Promise.all( 484 - params[7].map((service) => sandbox?.startService(service.command)), 484 + params[7].map(async (service) => { 485 + const id = await sandbox?.startService(service.command); 486 + if (id) { 487 + await c.var.db 488 + .update(services) 489 + .set({ serviceId: id, status: "RUNNING" }) 490 + .where(eq(services.id, service.id)) 491 + .execute(); 492 + } 493 + }), 485 494 ), 486 495 ); 487 496 } catch (err) {
+3 -3
apps/cli/src/cmd/service.ts
··· 12 12 dayjs.extend(relativeTime); 13 13 14 14 type CreateServiceOptions = { 15 - ports?: number[]; 15 + ports?: string[]; 16 16 description?: string; 17 17 }; 18 18 ··· 30 30 { 31 31 service: { 32 32 name, 33 - command, 33 + command: command.join(" "), 34 34 description, 35 - ports, 35 + ports: ports?.map((port) => parseInt(port)), 36 36 }, 37 37 }, 38 38 {