open, interoperable sandbox platform for agents and humans 📦 ✨ pocketenv.io
claude-code atproto sandbox openclaw agent
at main 83 lines 2.2 kB view raw
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);