Something went wrong. Try again.
A local-first event pipeline for independent agents, built on Jazz.
Something went wrong. Try again.
2.4 kB · 32 lines
TypeScript
123456789101112131415161718192021222324252627282930313233import fs from "node:fs/promises";import path from "node:path";import { LettaAgentClient } from "@thoughtstream/chat-sdk/client";import { CoChat, chatDeadline } from "./co-chat.js";import type { CoChatWeb } from "./co-chat-http.js";
/** No ambient local-worker/Cloud fallback: Co's existing provider is host-backed. */export async function configureCoChat(options: { origin: string; directory: string; key: Buffer; projectRoot: string }, env: NodeJS.ProcessEnv = process.env): Promise<CoChatWeb | undefined> { const enabled = env.THOUGHTSTREAM_CO_CHAT_ENABLED; if (enabled === undefined || enabled === "false") return undefined; if (enabled !== "true") throw new Error("Invalid Co chat enablement"); if (env.LETTA_BASE_URL !== "https://api.letta.com" || !env.LETTA_API_KEY) throw new Error("Co chat requires verified API authority"); // Trusted deployment bindings, never accepted from browser arguments. const deviceId = env.THOUGHTSTREAM_CO_COMPUTER_DEVICE_ID; if (!deviceId || !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(deviceId)) throw new Error("Co chat requires a configured computer"); const agentId = env.THOUGHTSTREAM_CO_AGENT_ID; if (!agentId || !/^agent-[a-zA-Z0-9-]+$/.test(agentId)) throw new Error("Co chat requires a configured agent"); const client = new LettaAgentClient({ backend: "cloud", apiKey: env.LETTA_API_KEY, computer: { deviceId }, requestTimeoutMs: 30 * 60_000 }); const javascript = await fs.readFile(path.join(options.projectRoot, "dist/co-chat/app.js"), "utf8"); const stylesheet = await fs.readFile(path.join(options.projectRoot, "dist/co-chat/app.css"), "utf8"); const chat = await CoChat.open({ directory: options.directory, key: options.key, agentId, runtime: { create: async () => { const session = client.createSession(agentId, { permissionMode: "unrestricted" }); try { await chatDeadline(session.getDeviceStatus({ timeoutMs: 30_000 })); return session; } catch { session.close(); throw new Error("Runtime unavailable"); } }, resume: async (conversationId) => { const session = client.resumeSession(conversationId, { permissionMode: "unrestricted" }); try { await chatDeadline(session.getDeviceStatus({ timeoutMs: 30_000 })); return session; } catch { session.close(); throw new Error("Runtime unavailable"); } }, } }); return { chat, origin: options.origin, javascript, stylesheet };}