the universal sandbox runtime for agents and humans.
pocketenv.io
sandbox
openclaw
agent
claude-code
vercel-sandbox
deno-sandbox
cloudflare-sandbox
atproto
sprites
daytona
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";
14import { Providers } from "consts";
15import type { Message } from "pty/pty-tunnel/messages";
16import type { WebSocket } from "ws";
17import type express from "express";
18
19const { DB_PATH } = env;
20export const db = createDb(DB_PATH);
21await migrateToLatest(db);
22
23const kv = createStorage({
24 driver: sqliteKv({ location: env.KV_DB_PATH, table: "kv" }),
25});
26
27const baseIdResolver = createIdResolver(kv);
28
29export interface TerminalSocket {
30 sendMessage(message: Message): void;
31}
32
33export type Session = {
34 socket: TerminalSocket;
35 clients: Set<express.Response>;
36 wsClients: Set<WebSocket>;
37};
38
39const sessions = new Map<string, Session>();
40
41export const ctx = {
42 oauthClient: await createClient(db),
43 resolver: createBidirectionalResolver(baseIdResolver),
44 baseIdResolver,
45 db: getConnection(),
46 authVerifier,
47 sqliteDb: db,
48 sqliteKv: kv,
49 redis: await redis
50 .createClient({ url: env.REDIS_URL })
51 .on("error", (err) => {
52 consola.error("Uncaught Redis Client Error", err);
53 process.exit(1);
54 })
55 .connect(),
56 kv: new Map<string, string>(),
57 sandbox: (provider?: string) =>
58 axios.create({
59 baseURL: [
60 Providers.MODAL,
61 Providers.E2B,
62 Providers.BLAXEL,
63 Providers.HOPX,
64 Providers.RUNLOOP,
65 ].includes(provider as Providers)
66 ? env.MODAL_SANDBOX_API_URL
67 : env.SANDBOX_API_URL,
68 }),
69 cfsandbox: (base: string) =>
70 axios.create({
71 baseURL:
72 base && !env.CF_LOCAL && workers[base]
73 ? workers[base]
74 : env.CF_SANDBOX_API_URL,
75 }),
76 sessions,
77};
78
79export const contextMiddleware: RequestHandler = (req, _res, next) => {
80 req.ctx = ctx;
81
82 next();
83};
84
85export type Context = typeof ctx;