open, interoperable sandbox platform for agents and humans 📦 ✨
pocketenv.io
claude-code
atproto
sandbox
openclaw
agent
1import type { Agent } from "@atproto/api";
2import chalk from "chalk";
3import { consola } from "consola";
4import { ctx } from "context";
5import { eq } from "drizzle-orm";
6import { createAgent } from "lib/agent";
7import * as Sandbox from "../src/lexicon/types/io/pocketenv/sandbox";
8import schema from "schema";
9import type { InsertSandbox } from "schema/sandboxes";
10import { env } from "lib/env";
11
12const args = process.argv.slice(2);
13
14if (args.length === 0) {
15 consola.error("Please provide user author identifier (handle or DID).");
16 consola.info(`Usage: ${chalk.cyan("npm run seed -- <handle|did>")}`);
17 process.exit(1);
18}
19
20async function getSandboxes(agent: Agent, limit: number = 100) {
21 const res = await agent.com.atproto.repo.listRecords({
22 repo: agent.assertDid,
23 collection: "io.pocketenv.sandbox",
24 limit,
25 });
26 return res.data.records.map((record) => ({
27 ...record,
28 value: Sandbox.isRecord(record.value) ? record.value : null,
29 }));
30}
31
32let userDid = args[0];
33
34if (userDid && !userDid.startsWith("did:plc:")) {
35 userDid = await ctx.baseIdResolver.handle.resolve(userDid);
36}
37
38if (!userDid) {
39 consola.error("Could not resolve user DID.");
40 process.exit(1);
41}
42
43const agent = await createAgent(ctx.oauthClient, userDid);
44if (!agent) {
45 consola.error("Could not create agent for the provided DID.");
46 process.exit(1);
47}
48
49const [user] = await ctx.db
50 .select()
51 .from(schema.users)
52 .where(eq(schema.users.did, agent.assertDid))
53 .execute();
54
55const sandboxes = await getSandboxes(agent);
56
57for (const sandbox of sandboxes) {
58 if (!sandbox.value) continue;
59
60 await ctx.db
61 .insert(schema.sandboxes)
62 .values({
63 name: sandbox.uri.split("/").slice(-1)[0]!,
64 displayName: sandbox.value.name,
65 description: sandbox.value.description,
66 provider: "daytona",
67 status: "STOPPED",
68 uri: sandbox.uri,
69 cid: sandbox.cid,
70 publicKey: env.PUBLIC_KEY,
71 vcpus: sandbox.value.vcpus,
72 memory: sandbox.value.memory,
73 disk: sandbox.value.disk,
74 userId: user!.id,
75 } satisfies InsertSandbox)
76 .onConflictDoNothing()
77 .execute();
78 consola.info(
79 `Sandbox ${chalk.cyanBright(sandbox.value.name)} seeded successfully.`,
80 );
81}
82
83process.exit(0);