open, interoperable sandbox platform for agents and humans 📦 ✨
pocketenv.io
claude-code
atproto
sandbox
openclaw
agent
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;