open, interoperable sandbox platform for agents and humans 📦 ✨ pocketenv.io
claude-code atproto sandbox openclaw agent
at main 60 lines 1.6 kB view raw
1import { env } from "lib/env"; 2import { getConnection } from "./drizzle"; 3import { createDb, migrateToLatest } from "db"; 4import { createStorage } from "unstorage"; 5import sqliteKv from "sqliteKv"; 6import { createBidirectionalResolver, createIdResolver } from "lib/idResolver"; 7import { createClient } from "auth/client"; 8import { consola } from "consola"; 9import authVerifier from "lib/authVerfifier"; 10import redis from "redis"; 11import type { RequestHandler } from "express"; 12import axios from "axios"; 13import { workers } from "cloudflare"; 14 15const { DB_PATH } = env; 16export const db = createDb(DB_PATH); 17await migrateToLatest(db); 18 19const kv = createStorage({ 20 driver: sqliteKv({ location: env.KV_DB_PATH, table: "kv" }), 21}); 22 23const baseIdResolver = createIdResolver(kv); 24 25export const ctx = { 26 oauthClient: await createClient(db), 27 resolver: createBidirectionalResolver(baseIdResolver), 28 baseIdResolver, 29 db: getConnection(), 30 authVerifier, 31 sqliteDb: db, 32 sqliteKv: kv, 33 redis: await redis 34 .createClient({ url: env.REDIS_URL }) 35 .on("error", (err) => { 36 consola.error("Uncaught Redis Client Error", err); 37 process.exit(1); 38 }) 39 .connect(), 40 kv: new Map<string, string>(), 41 sandbox: () => 42 axios.create({ 43 baseURL: env.SANDBOX_API_URL, 44 }), 45 cfsandbox: (base: string) => 46 axios.create({ 47 baseURL: 48 base && !env.CF_LOCAL && workers[base] 49 ? workers[base] 50 : env.CF_SANDBOX_API_URL, 51 }), 52}; 53 54export const contextMiddleware: RequestHandler = (req, _res, next) => { 55 req.ctx = ctx; 56 57 next(); 58}; 59 60export type Context = typeof ctx;