agent-theatre 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/web/assets/browserAll-_PYs9KFW.js +2 -0
- package/web/assets/{browserAll-CMoOQnrX.js.map → browserAll-_PYs9KFW.js.map} +1 -1
- package/web/assets/{index-ohIE_3ZI.js → index-DIO7cHQv.js} +4 -4
- package/web/assets/{index-ohIE_3ZI.js.map → index-DIO7cHQv.js.map} +1 -1
- package/web/assets/webworkerAll-n9V3fDyi.js +2 -0
- package/web/assets/{webworkerAll-_PJ-7VL2.js.map → webworkerAll-n9V3fDyi.js.map} +1 -1
- package/web/index.html +1 -1
- package/web/assets/browserAll-CMoOQnrX.js +0 -2
- package/web/assets/webworkerAll-_PJ-7VL2.js +0 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../../core/src/events/guards.ts","../../core/src/events/ids.ts","../../core/src/adapters/paths.ts","../../core/src/adapters/bash-intent.ts","../../core/src/adapters/test-summary.ts","../../core/src/adapters/tool-call.ts","../../core/src/director/claims.ts","../../core/src/adapters/transcript.ts","../../core/src/adapters/hook.ts","../../core/src/privacy/leaks.ts","../../core/src/world/prng.ts","../../core/src/world/relevance.ts","../../core/src/world/profile.ts","../../core/src/world/generate.ts","../../core/src/world/ascii.ts","../../core/src/director/mood.ts","../../core/src/director/direct.ts","../../core/src/world/from-events.ts","../src/sessions.ts","../src/scan.ts","../src/hooks/install.ts","../src/hooks/patch.ts","../src/hooks/script.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { Theatre } from \"./server.js\";\nimport { repoIdFor, scanRepo } from \"./scan.js\";\nimport { listSessions } from \"./sessions.js\";\nimport { hooksStatus, installHooks, uninstallHooks } from \"./hooks/install.js\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf8\")) as { version: string };\nconst webDir = [join(here, \"..\", \"web\"), join(here, \"..\", \"..\", \"web\", \"dist\")].find((d) => existsSync(join(d, \"index.html\")));\n\nasync function openBrowser(url: string): Promise<void> {\n try { const { default: open } = await import(\"open\"); await open(url); } catch { /* print the URL instead */ }\n}\n\nconst program = new Command().name(\"agent-theatre\").description(\"Watch your coding agent work — as a film, not a log.\").version(pkg.version);\n\nprogram\n .option(\"-p, --port <n>\", \"port to listen on (default: a free one)\", \"0\")\n .option(\"--no-open\", \"don't open the browser\")\n .option(\"--set <id>\", \"stage set: island | orbit | metropolis\")\n .action(async (o: { port: string; open: boolean; set?: string }) => {\n const cwd = process.cwd();\n const st = hooksStatus();\n if (!st.installed) console.log(pc.yellow(\"Hooks are not installed — the scene will stay empty until you run:\"), pc.bold(\"agent-theatre hooks install\"));\n const files = scanRepo(cwd);\n const theatre = new Theatre({ cwd, repoId: repoIdFor(cwd), files, ...(webDir ? { webDir } : {}) });\n await theatre.listen(Number(o.port) || 0);\n const url = `${theatre.url}?live=1${o.set ? `&set=${o.set}` : \"\"}`;\n console.log(`${pc.bold(\"Agent Theatre\")} · ${pc.dim(theatre.name)} · ${files.length} files`);\n console.log(`${pc.green(\"▶\")} ${url}`);\n if (!webDir) console.log(pc.yellow(\"web bundle not found — API only. Run `pnpm -F @agent-theatre/web build` or use the Vite dev server with a proxy.\"));\n if (o.open) await openBrowser(url);\n const bye = async () => { await theatre.close(); process.exit(0); };\n process.on(\"SIGINT\", bye); process.on(\"SIGTERM\", bye);\n });\n\nprogram\n .command(\"replay [session]\")\n .description(\"replay a past Claude Code session for this repo (default: pick from a list)\")\n .option(\"--latest\", \"replay the newest session without asking\")\n .option(\"--no-open\", \"don't open the browser\")\n .option(\"--set <id>\", \"stage set\")\n .action(async (session: string | undefined, o: { latest?: boolean; open: boolean; set?: string }) => {\n const cwd = process.cwd();\n const sessions = listSessions(cwd);\n if (!sessions.length) { console.log(pc.yellow(`No Claude Code sessions found for ${cwd}.`)); process.exit(1); }\n let id = session;\n if (!id && (o.latest || !process.stdin.isTTY)) id = sessions[0]!.id;\n if (!id) {\n console.log(pc.bold(\"Sessions for this repo, newest first:\\n\"));\n sessions.slice(0, 15).forEach((s, i) => console.log(` ${pc.dim(String(i + 1).padStart(2))} ${new Date(s.mtime).toLocaleString()} ${pc.dim((s.bytes / 1024).toFixed(0).padStart(6) + \" KB\")} ${s.title || pc.dim(s.id)}`));\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ans = (await rl.question(`\\nWhich one? [1] `)).trim() || \"1\";\n rl.close();\n const pick = sessions[Math.max(0, Math.min(sessions.length - 1, (parseInt(ans, 10) || 1) - 1))]!;\n id = pick.id;\n }\n const found = sessions.find((s) => s.id === id || s.id.startsWith(id!));\n if (!found) { console.log(pc.red(`No session ${id}`)); process.exit(1); }\n const files = scanRepo(cwd);\n const theatre = new Theatre({ cwd, repoId: repoIdFor(cwd), files, ...(webDir ? { webDir } : {}) });\n await theatre.listen(0);\n const url = `${theatre.url}?session=${found.id}${o.set ? `&set=${o.set}` : \"\"}`;\n console.log(`${pc.bold(\"Agent Theatre\")} · replay · ${found.title || found.id}`);\n console.log(`${pc.green(\"▶\")} ${url}`);\n if (o.open) await openBrowser(url);\n const bye = async () => { await theatre.close(); process.exit(0); };\n process.on(\"SIGINT\", bye); process.on(\"SIGTERM\", bye);\n });\n\nconst hooks = program.command(\"hooks\").description(\"install, remove or inspect the Claude Code hooks\");\nhooks.command(\"install\").description(\"merge our hooks into ~/.claude/settings.json (backup kept, nothing else touched)\").action(() => {\n const r = installHooks();\n console.log(r.changed ? pc.green(\"Hooks installed.\") : pc.dim(\"Hooks were already installed.\"), r.backup ? pc.dim(`backup: ${r.backup}`) : \"\");\n console.log(pc.dim(\"Claude Code picks up settings changes automatically; no restart needed.\"));\n});\nhooks.command(\"uninstall\").description(\"remove only our hook entries\").action(() => {\n const r = uninstallHooks();\n console.log(r.changed ? pc.green(\"Hooks removed.\") : pc.dim(\"Nothing to remove.\"));\n});\nhooks.command(\"status\").action(() => {\n const s = hooksStatus();\n console.log(`settings: ${s.settings}\\ninstalled: ${s.installed ? pc.green(\"yes\") : pc.yellow(\"no\")}\\nscript present: ${s.scriptPresent ? \"yes\" : \"no\"}`);\n});\n\nprogram.parseAsync(process.argv).catch((err) => { console.error(pc.red(String(err?.message ?? err))); process.exit(1); });\n","import { createServer, type Server } from \"node:http\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, basename, resolve, sep } from \"node:path\";\nimport { Hono } from \"hono\";\nimport { getRequestListener } from \"@hono/node-server\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\nimport { Director, direct, filesFromEvents, generateWorld, hookPayloadToEvents, parseTranscript, type AgentEvent, type Beat, type FileNode, type World } from \"@agent-theatre/core\";\nimport { listSessions } from \"./sessions.js\";\n\nexport interface TheatreOptions {\n cwd: string;\n repoId: string;\n files: FileNode[];\n /** Directory of the built web bundle (index.html + assets). Optional in tests. */\n webDir?: string;\n /** Where to write the port file. Default ~/.agent-theatre */\n home?: string;\n /** No hook events for this long while a session is open → \"lost\" signal. */\n lostAfterMs?: number;\n}\n\ninterface Live { world: World; director: Director; events: AgentEvent[]; beats: Beat[]; lastEventAt: number; sessionOpen: boolean }\n\n/**\n * The local theatre. Loopback only. Receives hook payloads, directs them into\n * beats, and streams events + beats to the browser. Serves the web bundle and\n * replay payloads. Never logs or forwards tool input/output: the hook payload\n * is reduced to AgentEvents at the door and discarded.\n */\nexport class Theatre {\n readonly app = new Hono();\n private server: Server | null = null;\n private wss: WebSocketServer | null = null;\n private live: Live;\n private signal: \"ok\" | \"lost\" = \"ok\";\n private timer: NodeJS.Timeout | null = null;\n port = 0;\n\n constructor(private readonly opts: TheatreOptions) {\n const world = generateWorld({ repoId: opts.repoId, files: opts.files });\n this.live = { world, director: new Director(world), events: [], beats: [], lastEventAt: 0, sessionOpen: false };\n this.routes();\n }\n\n private routes(): void {\n const a = this.app;\n a.post(\"/hook\", async (c) => {\n let payload: unknown;\n try { payload = await c.req.json(); } catch { return c.body(null, 204); }\n // hooks are global to Claude Code: only this repo's sessions belong on this stage\n const cwd = typeof (payload as { cwd?: unknown })?.cwd === \"string\" ? (payload as { cwd: string }).cwd : \"\";\n if (cwd && !isWithin(cwd, this.opts.cwd)) return c.body(null, 204);\n const { events } = hookPayloadToEvents(payload, { home: homedir() });\n if (events.length) this.ingest(events);\n return c.body(null, 204);\n });\n a.use(\"/api/*\", async (c, next) => { await next(); c.header(\"access-control-allow-origin\", \"*\"); });\n a.options(\"/api/*\", (c) => c.body(null, 204, { \"access-control-allow-origin\": \"*\", \"access-control-allow-headers\": \"content-type\" }));\n a.get(\"/api/scene\", (c) => c.json({ mode: \"live\", repoId: this.opts.repoId, world: this.live.world, events: this.live.events, beats: this.live.beats, signal: this.signal }));\n a.get(\"/api/sessions\", (c) => c.json(listSessions(this.opts.cwd).map((s) => ({ id: s.id, title: s.title, mtime: s.mtime, bytes: s.bytes }))));\n a.get(\"/api/replay/:id\", (c) => {\n const id = c.req.param(\"id\");\n const s = listSessions(this.opts.cwd).find((x) => x.id === id);\n if (!s) return c.json({ error: \"no such session\" }, 404);\n const { events, warnings } = parseTranscript(readFileSync(s.path, \"utf8\"), { home: homedir() });\n const inferred = filesFromEvents(events);\n const known = new Set(this.opts.files.map((f) => f.path));\n const files = [...this.opts.files, ...inferred.files.filter((f) => !known.has(f.path))];\n const world = generateWorld({ repoId: this.opts.repoId, files, touched: inferred.touched });\n const beats = direct(events, world);\n return c.json({ mode: \"replay\", repoId: this.opts.repoId, title: s.title, world, events, beats, warnings: warnings.length });\n });\n a.get(\"/healthz\", (c) => c.json({ ok: true, port: this.port, events: this.live.events.length }));\n if (this.opts.webDir) {\n const dir = this.opts.webDir;\n a.get(\"/*\", (c) => {\n const p = c.req.path === \"/\" ? \"/index.html\" : c.req.path;\n const file = join(dir, p);\n if (!file.startsWith(dir) || !existsSync(file)) return c.text(\"not found\", 404);\n const ext = p.slice(p.lastIndexOf(\".\") + 1);\n const type: Record<string, string> = { html: \"text/html; charset=utf-8\", js: \"text/javascript\", css: \"text/css\", json: \"application/json\", jsonl: \"application/x-ndjson\", svg: \"image/svg+xml\", png: \"image/png\", woff2: \"font/woff2\", webp: \"image/webp\" };\n return c.body(readFileSync(file), 200, { \"content-type\": type[ext] ?? \"application/octet-stream\", \"cache-control\": p.includes(\"/assets/\") ? \"public, max-age=31536000, immutable\" : \"no-cache\" });\n });\n }\n }\n\n /** Append events to the live session, direct them, and broadcast. */\n ingest(events: AgentEvent[]): Beat[] {\n const l = this.live;\n const out: Beat[] = [];\n for (const e of events) {\n if (e.kind === \"session_start\") l.sessionOpen = true;\n if (e.kind === \"session_end\") l.sessionOpen = false;\n l.events.push(e);\n out.push(...l.director.feed(e));\n }\n l.beats.push(...out);\n l.lastEventAt = Date.now();\n if (this.signal !== \"ok\") { this.signal = \"ok\"; this.broadcast({ type: \"signal\", state: \"ok\" }); }\n this.broadcast({ type: \"beats\", beats: out, events });\n return out;\n }\n\n private broadcast(msg: unknown): void {\n const data = JSON.stringify(msg);\n for (const ws of this.wss?.clients ?? []) if (ws.readyState === 1) ws.send(data);\n }\n\n async listen(port = 0): Promise<number> {\n const listener = getRequestListener(this.app.fetch);\n this.server = createServer(listener);\n this.wss = new WebSocketServer({ noServer: true });\n this.server.on(\"upgrade\", (req, socket, head) => {\n if (req.url?.startsWith(\"/live\")) this.wss!.handleUpgrade(req, socket, head, (ws: WebSocket) => { this.wss!.emit(\"connection\", ws, req); ws.send(JSON.stringify({ type: \"hello\", signal: this.signal })); });\n else socket.destroy();\n });\n await new Promise<void>((res) => this.server!.listen(port, \"127.0.0.1\", res));\n const addr = this.server.address();\n this.port = typeof addr === \"object\" && addr ? addr.port : port;\n const home = this.opts.home ?? join(homedir(), \".agent-theatre\");\n mkdirSync(home, { recursive: true });\n writeFileSync(join(home, \"port\"), String(this.port));\n const lostAfter = this.opts.lostAfterMs ?? 90_000;\n this.timer = setInterval(() => {\n const l = this.live;\n if (l.sessionOpen && l.lastEventAt && Date.now() - l.lastEventAt > lostAfter && this.signal === \"ok\") { this.signal = \"lost\"; this.broadcast({ type: \"signal\", state: \"lost\" }); }\n }, 5_000);\n this.timer.unref();\n return this.port;\n }\n\n async close(): Promise<void> {\n if (this.timer) clearInterval(this.timer);\n const home = this.opts.home ?? join(homedir(), \".agent-theatre\");\n try { if (readFileSync(join(home, \"port\"), \"utf8\").trim() === String(this.port)) rmSync(join(home, \"port\")); } catch { /* already gone */ }\n for (const ws of this.wss?.clients ?? []) ws.close();\n this.wss?.close();\n await new Promise<void>((res) => (this.server ? this.server.close(() => res()) : res()));\n }\n\n get url(): string { return `http://127.0.0.1:${this.port}/`; }\n get name(): string { return basename(this.opts.cwd); }\n}\n\n/** True when `dir` is `root` or inside it (symlinks resolved when they exist). */\nexport function isWithin(dir: string, root: string): boolean {\n const norm = (p: string) => { try { return realpathSync(p); } catch { return resolve(p); } };\n const d = norm(dir), r = norm(root);\n return d === r || d.startsWith(r.endsWith(sep) ? r : r + sep);\n}\n","import type { AgentEvent, AgentEventKind } from \"./types.js\";\n\nconst KINDS: ReadonlySet<string> = new Set<AgentEventKind>([\n \"session_start\",\n \"read_file\",\n \"edit_file\",\n \"write_file\",\n \"run_command\",\n \"test_result\",\n \"search\",\n \"subagent_start\",\n \"subagent_stop\",\n \"waiting_for_user\",\n \"turn_end\",\n \"error\",\n \"session_end\",\n]);\n\nexport function isAgentEvent(x: unknown): x is AgentEvent {\n if (!x || typeof x !== \"object\") return false;\n const e = x as Record<string, unknown>;\n return (\n typeof e.id === \"string\" &&\n typeof e.seq === \"number\" &&\n typeof e.ts === \"number\" &&\n typeof e.sessionId === \"string\" &&\n typeof e.kind === \"string\" &&\n KINDS.has(e.kind)\n );\n}\n","/**\n * Tiny monotonic id for events that have no natural id (hook-minted events).\n * Not a full ULID — just time-ordered and unique within a process, with no\n * dependency on node:crypto so core stays runtime-neutral.\n */\nlet last = 0;\nlet counter = 0;\nconst ALPHA = \"0123456789abcdefghjkmnpqrstvwxyz\";\n\nexport function mintId(now: number = Date.now()): string {\n if (now === last) counter++;\n else {\n last = now;\n counter = 0;\n }\n let t = now;\n let s = \"\";\n for (let i = 0; i < 10; i++) {\n s = ALPHA[t % 32] + s;\n t = Math.floor(t / 32);\n }\n return `ev_${s}${counter.toString(32).padStart(3, \"0\")}`;\n}\n","/**\n * Path redaction. Repo-relative when inside the repo; home-relative (~/…)\n * when inside the home directory (so a username never leaves the machine);\n * otherwise only the basename, prefixed so it is recognisably external.\n */\nexport interface PathContext {\n cwd: string;\n home?: string;\n}\n\nfunction norm(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nexport function relativizePath(abs: string, ctx: PathContext): string {\n const p = norm(abs);\n const cwd = norm(ctx.cwd);\n if (cwd && (p === cwd || p.startsWith(cwd + \"/\"))) return p.slice(cwd.length + 1) || \".\";\n if (ctx.home) {\n const home = norm(ctx.home);\n if (home && (p === home || p.startsWith(home + \"/\"))) return \"~/\" + p.slice(home.length + 1);\n }\n if (!p.startsWith(\"/\")) return p; // already relative\n const base = p.slice(p.lastIndexOf(\"/\") + 1);\n return `//ext/${base}`;\n}\n\nexport function basename(p: string): string {\n const n = norm(p);\n return n.slice(n.lastIndexOf(\"/\") + 1);\n}\n\nexport function isTestPath(p: string): boolean {\n return /(^|\\/)(tests?|__tests__|spec|specs)\\//i.test(p) || /\\.(test|spec)\\.[cm]?[jt]sx?$/i.test(p) || /(^|\\/)test_[^/]+\\.py$/i.test(p) || /_test\\.(go|rs|py)$/i.test(p);\n}\n","import type { CommandIntent } from \"../events/types.js\";\n\n/**\n * Classify a shell command and extract the files it writes or reads, from the\n * command text alone. The text itself never leaves this function.\n *\n * Extraction is deliberately conservative: a missed target degrades to a\n * forge beat; a wrong target would send Pip to the wrong building.\n */\nexport interface BashIntent {\n argv0: string;\n intent: CommandIntent;\n /** Files the command writes (redirect/tee/sed -i/cp/mv destinations/heredoc targets). */\n writes: string[];\n /** Files the command reads (cat/head/tail/less/sed -n first arg). */\n reads: string[];\n}\n\nconst TEST_RUNNERS = /\\b(vitest|jest|mocha|pytest|py\\.test|go\\s+test|cargo\\s+test|npm\\s+test|pnpm\\s+test|yarn\\s+test|bun\\s+test|npx\\s+(vitest|jest|playwright)|rspec|phpunit|dotnet\\s+test|mvn\\s+test|gradle\\s+test|make\\s+test)\\b/;\nconst BUILD = /\\b(tsc|tsup|vite\\s+build|webpack|esbuild|rollup|next\\s+build|cargo\\s+build|go\\s+build|make\\b(?!\\s+test)|npm\\s+run\\s+build|pnpm\\s+(run\\s+)?build|yarn\\s+build|gradle\\s+build|mvn\\s+package|docker\\s+build)\\b/;\nconst INSTALL = /\\b(npm\\s+(i|install|ci)|pnpm\\s+(i|install|add)|yarn(\\s+add|\\s+install)?|pip3?\\s+install|poetry\\s+(add|install)|cargo\\s+add|go\\s+get|brew\\s+install|apt(-get)?\\s+install|bun\\s+(i|install|add))\\b/;\nconst SEARCH = /\\b(grep|rg|ag|ack|find|fd|locate)\\b/;\nconst READ = /^\\s*(cat|head|tail|less|more|bat|wc|stat|jq)\\b/;\n\n/** First word of the first simple command, after env assignments and cd. */\nexport function argv0Of(command: string): string {\n const first = command.split(/\\s*(?:&&|\\|\\||;|\\|)\\s*/)[0] ?? \"\";\n const toks = first.trim().split(/\\s+/).map((t) => t.replace(/^[({]+/, \"\")).filter(Boolean);\n let i = 0;\n while (i < toks.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(toks[i]!)) i++;\n if (toks[i] === \"cd\" && toks.length > i + 1) {\n // `cd x && real` — argv0 is the real command, found in the next segment\n const rest = command.split(/\\s*&&\\s*/)[1];\n if (rest) return argv0Of(rest);\n }\n const a = toks[i] ?? \"\";\n return a.replace(/^.*\\//, \"\").slice(0, 40) || \"sh\";\n}\n\nfunction cleanTarget(t: string): string | null {\n const s = t.replace(/^[\"']|[\"']$/g, \"\").trim();\n if (!s || s.startsWith(\"-\") || s === \"/dev/null\" || s.includes(\"$(\") || s.startsWith(\"$\")) return null;\n if (/^\\/dev\\//.test(s) || /^&\\d/.test(s)) return null;\n return s;\n}\n\nexport function extractWrites(command: string): string[] {\n const out = new Set<string>();\n // Redirections: > file, >> file, 1> file, 2>file is stderr (still a write target)\n for (const m of command.matchAll(/(?:^|[\\s)])\\d?>{1,2}\\s*([^\\s|&;<>]+)/g)) {\n const t = cleanTarget(m[1] ?? \"\");\n if (t) out.add(t);\n }\n // tee [-a] file...\n for (const m of command.matchAll(/\\btee\\s+(?:-[a-z]+\\s+)*((?:[^\\s|&;<>]+\\s*)+)/g)) {\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n // sed -i[.bak] [expr] file... (last non-flag, non-expression token is the file)\n for (const m of command.matchAll(/\\bsed\\s+-i\\S*\\s+(.+?)(?=\\s*(?:&&|\\|\\||;|\\||$))/g)) {\n const toks = (m[1] ?? \"\").match(/\"[^\"]*\"|'[^']*'|\\S+/g) ?? [];\n const files = toks.filter((t) => !t.startsWith(\"-\") && !t.startsWith(\"'\") && !t.startsWith('\"') && !/^s[/|#]/.test(t) && !/^-e$/.test(t));\n for (const f of files) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n // cp/mv src dest (dest = last token)\n for (const m of command.matchAll(/\\b(?:cp|mv)\\s+(?:-[a-zA-Z]+\\s+)*((?:[^\\s|&;<>]+\\s+)+)([^\\s|&;<>]+)/g)) {\n const t = cleanTarget(m[2] ?? \"\");\n if (t) out.add(t);\n }\n // touch/mkdir -p are creations too\n for (const m of command.matchAll(/\\btouch\\s+((?:[^\\s|&;<>]+\\s*)+)/g)) {\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n return [...out];\n}\n\nexport function extractReads(command: string): string[] {\n const out = new Set<string>();\n for (const seg of command.split(/\\s*(?:&&|\\|\\||;|\\|)\\s*/)) {\n const m = seg.match(/^\\s*(?:cat|head|tail|less|more|bat|wc)\\s+(?:-[^\\s]+\\s+)*((?:[^\\s|&;<>]+\\s*)+)/);\n if (!m) continue;\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t && !/^\\d+$/.test(t)) out.add(t);\n }\n }\n return [...out];\n}\n\nexport function classifyBash(command: string): BashIntent {\n const argv0 = argv0Of(command);\n const writes = extractWrites(command);\n const reads = extractReads(command);\n let intent: CommandIntent = \"other\";\n if (TEST_RUNNERS.test(command)) intent = \"test\";\n else if (BUILD.test(command)) intent = \"build\";\n else if (INSTALL.test(command)) intent = \"install\";\n else if (/^\\s*git\\b/.test(command) || argv0 === \"git\" || argv0 === \"gh\") intent = \"git\";\n else if (writes.length) intent = \"write_file\";\n else if (SEARCH.test(command) && argv0 !== \"cd\") intent = \"search\";\n else if (READ.test(command) && reads.length) intent = \"read_file\";\n return { argv0, intent, writes, reads };\n}\n","/**\n * Parse test-runner summary lines out of command output. Heuristic by nature;\n * an unrecognised runner yields null and the caller falls back to exit status.\n * Only counts leave this function — never the output text.\n */\nexport interface TestSummary {\n passed: number;\n failed: number;\n skipped?: number;\n framework: string;\n}\n\nconst num = (s: string | undefined) => (s ? parseInt(s, 10) : 0);\n\nexport function parseTestSummary(output: string): TestSummary | null {\n const tail = output.length > 20_000 ? output.slice(-20_000) : output;\n\n // vitest: \"Tests 3 failed | 21 passed | 2 skipped (26)\" or \"Tests 24 passed (24)\"\n let m = tail.match(/Tests\\s+(?:(\\d+)\\s+failed\\s*\\|\\s*)?(\\d+)\\s+passed(?:\\s*\\|\\s*(\\d+)\\s+skipped)?/);\n if (m) return { failed: num(m[1]), passed: num(m[2]), ...(m[3] ? { skipped: num(m[3]) } : {}), framework: \"vitest\" };\n m = tail.match(/Tests\\s+(\\d+)\\s+failed\\s*\\((\\d+)\\)/);\n if (m) return { failed: num(m[1]), passed: Math.max(0, num(m[2]) - num(m[1])), framework: \"vitest\" };\n\n // jest: \"Tests: 2 failed, 22 passed, 1 skipped, 25 total\"\n m = tail.match(/Tests:\\s+(?:(\\d+)\\s+failed,\\s*)?(?:(\\d+)\\s+skipped,\\s*)?(\\d+)\\s+passed,\\s*(?:(\\d+)\\s+skipped,\\s*)?\\d+\\s+total/);\n if (m) return { failed: num(m[1]), passed: num(m[3]), ...((m[2] ?? m[4]) ? { skipped: num(m[2] ?? m[4]) } : {}), framework: \"jest\" };\n m = tail.match(/Tests:\\s+(\\d+)\\s+failed,\\s*\\d+\\s+total/);\n if (m) return { failed: num(m[1]), passed: 0, framework: \"jest\" };\n\n // pytest: \"==== 2 failed, 22 passed, 1 skipped in 1.23s ====\" / \"==== 24 passed in 0.5s ====\"\n m = tail.match(/=+\\s*(?:(\\d+)\\s+failed,?\\s*)?(?:(\\d+)\\s+passed,?\\s*)?(?:(\\d+)\\s+skipped,?\\s*)?(?:\\d+\\s+(?:error|errors|warnings?|deselected|xfailed|xpassed),?\\s*)*in\\s+[\\d.]+s/);\n if (m && (m[1] || m[2])) return { failed: num(m[1]), passed: num(m[2]), ...(m[3] ? { skipped: num(m[3]) } : {}), framework: \"pytest\" };\n\n // go test: \"ok pkg 0.12s\" lines and \"--- FAIL:\" lines; summary \"FAIL\" / \"PASS\"\n if (/^--- (?:PASS|FAIL):/m.test(tail) || /^(?:ok|FAIL)\\s+\\S+\\s+(?:[\\d.]+s|\\(cached\\))/m.test(tail)) {\n const failed = (tail.match(/^--- FAIL:/gm) ?? []).length || (tail.match(/^FAIL\\s+\\S+\\s+[\\d.]+s/gm) ?? []).length;\n const passed = (tail.match(/^--- PASS:/gm) ?? []).length || (tail.match(/^ok\\s+\\S+/gm) ?? []).length;\n return { failed, passed, framework: \"go\" };\n }\n\n // cargo test: \"test result: ok. 24 passed; 0 failed; 1 ignored\"\n m = tail.match(/test result:\\s*\\w+\\.\\s*(\\d+)\\s+passed;\\s*(\\d+)\\s+failed;\\s*(\\d+)\\s+ignored/);\n if (m) return { passed: num(m[1]), failed: num(m[2]), skipped: num(m[3]), framework: \"cargo\" };\n\n // mocha: \" 24 passing (1s)\" / \" 2 failing\"\n const mp = tail.match(/^\\s*(\\d+)\\s+passing\\b/m);\n const mf = tail.match(/^\\s*(\\d+)\\s+failing\\b/m);\n if (mp || mf) {\n const ms = tail.match(/^\\s*(\\d+)\\s+pending\\b/m);\n return { passed: num(mp?.[1]), failed: num(mf?.[1]), ...(ms ? { skipped: num(ms[1]) } : {}), framework: \"mocha\" };\n }\n\n // playwright: \" 24 passed (12s)\" / \" 2 failed\"\n const pp = tail.match(/^\\s*(\\d+)\\s+passed\\s*\\(/m);\n const pf = tail.match(/^\\s*(\\d+)\\s+failed\\b/m);\n if (pp || pf) return { passed: num(pp?.[1]), failed: num(pf?.[1]), framework: \"playwright\" };\n\n return null;\n}\n","import type { AdapterWarning, AgentEventBody } from \"../events/types.js\";\nimport { classifyBash } from \"./bash-intent.js\";\nimport { relativizePath, type PathContext } from \"./paths.js\";\nimport { parseTestSummary } from \"./test-summary.js\";\n\n/**\n * One tool invocation as seen by either adapter. `response` is the raw tool\n * result (transcript `toolUseResult` or hook `tool_response`); it is inspected\n * for counts and flags and never retained.\n */\nexport interface ToolCall {\n name: string;\n input: unknown;\n response?: unknown;\n isError?: boolean;\n durationMs?: number;\n}\n\nexport interface ToolCallOutcome {\n bodies: AgentEventBody[];\n /** Set when the tool spawned a subagent that has not finished yet. */\n pendingSubagent?: { childId: string };\n warning?: AdapterWarning;\n}\n\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\nconst lineCount = (s: string | undefined): number => (s ? (s.match(/\\n/g)?.length ?? 0) + (s.endsWith(\"\\n\") ? 0 : 1) : 0);\n\nfunction patchCounts(response: unknown): { added: number; removed: number; hunks: number } | null {\n const patch = obj(response).structuredPatch;\n if (!Array.isArray(patch)) return null;\n let added = 0,\n removed = 0;\n for (const h of patch) {\n const lines = obj(h).lines;\n if (!Array.isArray(lines)) continue;\n for (const l of lines) {\n if (typeof l !== \"string\") continue;\n if (l.startsWith(\"+\")) added++;\n else if (l.startsWith(\"-\")) removed++;\n }\n }\n return { added, removed, hunks: patch.length };\n}\n\nfunction responseText(response: unknown): string {\n if (typeof response === \"string\") return response;\n const r = obj(response);\n const parts = [str(r.stdout), str(r.stderr), str(r.output)].filter((x): x is string => !!x);\n if (parts.length) return parts.join(\"\\n\");\n if (Array.isArray(response)) return response.map((b) => str(obj(b).text) ?? \"\").join(\"\\n\");\n return \"\";\n}\n\n/** Number of body lines written by heredocs in a command (counts only; the body is never kept). */\nfunction heredocLines(command: string): number {\n let n = 0;\n for (const m of command.matchAll(/<<-?\\s*(['\"]?)(\\w+)\\1[^\\n]*\\n([\\s\\S]*?)\\n\\2(?=\\n|$)/g)) n += lineCount(m[3]);\n if (n === 0 && /(?:^|[\\s)])\\d?>{1,2}\\s*[^\\s|&;<>]+/.test(command) && !/>\\s*\\/dev\\/null/.test(command)) n = 1;\n return n;\n}\n\nconst SEARCH_TOOLS_REPO = new Set([\"Grep\", \"Glob\", \"LS\", \"ToolSearch\"]);\nconst SEARCH_TOOLS_WEB = new Set([\"WebSearch\", \"WebFetch\"]);\nconst SILENT_TOOLS = new Set([\"TodoWrite\", \"TodoRead\", \"Skill\", \"EnterPlanMode\", \"ExitPlanMode\", \"EnterWorktree\", \"ExitWorktree\", \"NotebookRead\", \"ListAgents\", \"SendMessage\", \"TaskStop\", \"Monitor\", \"ScheduleWakeup\", \"ReportFindings\"]);\n\nexport function toolCallToOutcome(call: ToolCall, ctx: PathContext): ToolCallOutcome {\n const input = obj(call.input);\n const resp = call.response;\n const ok = !call.isError && obj(resp).interrupted !== true;\n const rel = (p: string) => relativizePath(p, ctx);\n const dur = call.durationMs !== undefined ? { durationMs: call.durationMs } : {};\n\n switch (call.name) {\n case \"Read\": {\n const path = str(input.file_path) ?? str(input.path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: \"Read without file_path\" } };\n const content = str(obj(obj(resp).file).content);\n return { bodies: [{ kind: \"read_file\", path: rel(path), ...(content !== undefined ? { bytes: content.length } : {}) }] };\n }\n case \"Edit\":\n case \"MultiEdit\":\n case \"NotebookEdit\": {\n const path = str(input.file_path) ?? str(input.notebook_path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: `${call.name} without file_path` } };\n const counts = patchCounts(resp) ?? {\n added: lineCount(str(input.new_string) ?? str(input.new_source)),\n removed: lineCount(str(input.old_string)),\n hunks: 1,\n };\n return { bodies: [{ kind: \"edit_file\", path: rel(path), ...counts }] };\n }\n case \"Write\": {\n const path = str(input.file_path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: \"Write without file_path\" } };\n const r = obj(resp);\n const created = r.type === \"create\" || (r.type === undefined && r.originalFile === null);\n return { bodies: [{ kind: \"write_file\", path: rel(path), added: lineCount(str(input.content)), created }] };\n }\n case \"Bash\": {\n const command = str(input.command) ?? \"\";\n const c = classifyBash(command);\n const touched = [...new Set([...c.writes, ...c.reads].map(rel))];\n const bodies: AgentEventBody[] = [{ kind: \"run_command\", argv0: c.argv0, intent: c.intent, touched, ok, ...dur }];\n const heredoc = heredocLines(command);\n c.writes.forEach((w, i) => bodies.push({ kind: \"write_file\", path: rel(w), added: i === 0 ? heredoc : 0, created: false }));\n for (const r of c.reads) bodies.push({ kind: \"read_file\", path: rel(r) });\n if (c.intent === \"test\") {\n const sum = parseTestSummary(responseText(resp));\n if (sum) bodies.push({ kind: \"test_result\", ok: sum.failed === 0 && ok, passed: sum.passed, failed: sum.failed, ...(sum.skipped !== undefined ? { skipped: sum.skipped } : {}), framework: sum.framework, ...dur });\n else bodies.push({ kind: \"test_result\", ok, passed: 0, failed: 0, framework: \"unknown\", ...dur });\n }\n return { bodies };\n }\n case \"Agent\":\n case \"Task\": {\n const r = obj(resp);\n const agentId = str(r.agentId) ?? str(r.agent_id) ?? \"\";\n const label = str(input.description) ?? str(input.subagent_type);\n const start: AgentEventBody = { kind: \"subagent_start\", childId: agentId, ...(label ? { label } : {}) };\n if (r.status === \"async_launched\" || r.isAsync === true) return { bodies: [start], pendingSubagent: { childId: agentId } };\n return { bodies: [start, { kind: \"subagent_stop\", childId: agentId, ok }] };\n }\n case \"AskUserQuestion\":\n return { bodies: [{ kind: \"waiting_for_user\", reason: \"question\" }] };\n }\n if (SEARCH_TOOLS_REPO.has(call.name)) {\n const n = obj(resp).numFiles ?? obj(resp).numLines ?? obj(resp).count;\n return { bodies: [{ kind: \"search\", scope: \"repo\", ...(typeof n === \"number\" ? { hits: n } : {}) }] };\n }\n if (SEARCH_TOOLS_WEB.has(call.name)) return { bodies: [{ kind: \"search\", scope: \"web\" }] };\n if (SILENT_TOOLS.has(call.name)) return { bodies: [] };\n // Unknown tool (MCP tools arrive as mcp__server__tool). Treated as generic work.\n return {\n bodies: [{ kind: \"run_command\", argv0: call.name.slice(0, 40), intent: \"other\", touched: [], ok, ...dur }],\n warning: { code: \"unknown_tool\", detail: call.name.slice(0, 80) },\n };\n}\n","/**\n * Claim check lexicon. Deliberately conservative and deliberately a plain\n * list so it can be reviewed and extended in a PR. Only the tail of a message\n * is examined, because conclusions come last. The text itself is never stored.\n */\nexport const SUCCESS_LEXICON: readonly RegExp[] = [\n /\\ball (?:\\d+ )?tests? (?:are )?pass(?:ing|ed)?\\b/i,\n /\\btests? (?:are |is )?(?:now )?(?:passing|green)\\b/i,\n /\\b(?:is|are|it's|that's|everything(?:'s| is)) (?:now )?(?:fixed|working|done|complete|resolved)\\b/i,\n /\\bshould (?:now )?work\\b/i,\n /\\bworks now\\b/i,\n /\\b(?:done|complete|completed|fixed|resolved|shipped|implemented)[.!]/i,\n /✅/,\n];\n\nexport const HEDGE_LEXICON: readonly RegExp[] = [\n /\\bnot (?:yet )?(?:done|fixed|working|tested|verified|complete)\\b/i,\n /\\bstill (?:fail|broken|not)/i,\n /\\b(?:could ?n[’']?t|cannot|can ?not|unable to|wasn[’']?t able)\\b/i,\n /\\bfail(?:ed|ing|s)\\b/i,\n /\\bTODO\\b/,\n /\\bhaven[’']?t (?:run|tested|verified|checked)/i,\n /\\buntested\\b/i,\n /\\bI did not (?:run|test|verify)/i,\n];\n\nconst TAIL = 600;\n\nexport function claimsSuccess(text: string | undefined | null): boolean {\n if (!text) return false;\n const tail = text.length > TAIL ? text.slice(-TAIL) : text;\n if (HEDGE_LEXICON.some((r) => r.test(tail))) return false;\n return SUCCESS_LEXICON.some((r) => r.test(tail));\n}\n","import type { AdapterResult, AdapterWarning, AgentEvent, AgentEventBody } from \"../events/types.js\";\nimport { claimsSuccess } from \"../director/claims.js\";\nimport { basename, type PathContext } from \"./paths.js\";\nimport { toolCallToOutcome } from \"./tool-call.js\";\n\n/**\n * Claude Code JSONL transcript → AgentEvents.\n *\n * The format is documented as internal and may change between releases, so\n * this adapter whitelists row types, never throws on an unexpected shape, and\n * reports what it skipped as warnings. Prompt text and file contents are\n * never read into events.\n */\nexport interface TranscriptOptions {\n home?: string;\n /** Override the agentId assigned to sidechain rows that carry none. */\n sidechainAgentId?: string;\n}\n\nconst ROW_TYPES = new Set([\"user\", \"assistant\", \"system\"]);\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\n\ninterface Pending {\n name: string;\n input: unknown;\n ts: number;\n agentId?: string;\n}\n\nexport function parseTranscript(text: string, opts: TranscriptOptions = {}): AdapterResult {\n const rows: unknown[] = [];\n const warnings: AdapterWarning[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (!line.trim()) continue;\n try {\n rows.push(JSON.parse(line));\n } catch {\n warnings.push({ code: \"bad_json\", detail: `line ${i + 1}`, line: i + 1 });\n }\n }\n const res = parseTranscriptRows(rows, opts);\n return { events: res.events, warnings: [...warnings, ...res.warnings] };\n}\n\nexport function parseTranscriptRows(rows: unknown[], opts: TranscriptOptions = {}): AdapterResult {\n const events: AgentEvent[] = [];\n const warnings: AdapterWarning[] = [];\n const unknownTypes = new Set<string>();\n const pending = new Map<string, Pending>();\n const openSubagents = new Map<string, string>(); // agentId -> spawning event id\n\n let sessionId = \"\";\n let cwd = \"\";\n let branch: string | undefined;\n let firstTs = Number.NaN;\n let lastTs = Number.NaN;\n let lastAssistantText = \"\";\n let seq = 0;\n let sawEnd = false;\n\n const ctx = (): PathContext => ({ cwd, ...(opts.home ? { home: opts.home } : {}) });\n const push = (ts: number, id: string, body: AgentEventBody, extra: { agentId?: string; parentId?: string } = {}) => {\n events.push({ id, seq: seq++, ts, sessionId, source: \"transcript\", ...extra, ...body });\n };\n const tsOf = (row: Record<string, unknown>): number => {\n const t = str(row.timestamp);\n const n = t ? Date.parse(t) : Number.NaN;\n return Number.isFinite(n) ? n : Number.isFinite(lastTs) ? lastTs : 0;\n };\n const agentOf = (row: Record<string, unknown>): string | undefined =>\n str(row.agentId) ?? (row.isSidechain === true ? (opts.sidechainAgentId ?? \"sidechain\") : undefined);\n\n for (const raw of rows) {\n const row = obj(raw);\n const type = str(row.type) ?? \"\";\n if (!ROW_TYPES.has(type)) {\n if (type) unknownTypes.add(type);\n continue;\n }\n if (!sessionId && str(row.sessionId)) sessionId = str(row.sessionId)!;\n if (!cwd && str(row.cwd)) cwd = str(row.cwd)!;\n if (!branch && str(row.gitBranch)) branch = str(row.gitBranch);\n const ts = tsOf(row);\n if (!Number.isFinite(firstTs)) {\n firstTs = ts;\n push(ts, `${sessionId || \"session\"}:start`, { kind: \"session_start\", repoId: basename(cwd) || \"repo\", ...(branch ? { branch } : {}) });\n }\n lastTs = ts;\n const agentId = agentOf(row);\n const message = obj(row.message);\n const content = message.content;\n\n if (type === \"system\") {\n if (row.subtype === \"api_error\") {\n const attempt = typeof row.retryAttempt === \"number\" ? row.retryAttempt : 0;\n const max = typeof row.maxRetries === \"number\" ? row.maxRetries : 0;\n push(ts, str(row.uuid) ?? `sys:${seq}`, { kind: \"error\", where: \"api\", retrying: attempt < max }, agentId ? { agentId } : {});\n }\n continue;\n }\n\n if (type === \"assistant\") {\n const blocks = Array.isArray(content) ? content : [];\n for (const b of blocks) {\n const block = obj(b);\n if (block.type === \"tool_use\" && str(block.id) && str(block.name)) {\n pending.set(str(block.id)!, { name: str(block.name)!, input: block.input, ts, ...(agentId ? { agentId } : {}) });\n } else if (block.type === \"text\" && !agentId) {\n const t = str(block.text);\n if (t) lastAssistantText = t;\n }\n }\n if (typeof content === \"string\" && !agentId) lastAssistantText = content;\n if (message.stop_reason === \"end_turn\" && !agentId) {\n push(ts, `${str(row.uuid) ?? seq}:turn`, { kind: \"turn_end\", claimedSuccess: claimsSuccess(lastAssistantText) });\n }\n continue;\n }\n\n // type === \"user\"\n if (row.toolDenialKind !== undefined) push(ts, `${str(row.uuid) ?? seq}:deny`, { kind: \"waiting_for_user\", reason: \"permission\" });\n const blocks = Array.isArray(content) ? content : [];\n for (const b of blocks) {\n const block = obj(b);\n if (block.type !== \"tool_result\") continue;\n const useId = str(block.tool_use_id);\n if (!useId) continue;\n const p = pending.get(useId);\n if (!p) {\n warnings.push({ code: \"unpaired_result\", detail: useId });\n continue;\n }\n pending.delete(useId);\n const response = row.toolUseResult ?? block.content;\n const out = toolCallToOutcome(\n { name: p.name, input: p.input, response, isError: block.is_error === true, durationMs: Math.max(0, ts - p.ts) },\n ctx(),\n );\n if (out.warning) warnings.push(out.warning);\n const rowAgent = p.agentId ?? agentId;\n const parentId = rowAgent ? openSubagents.get(rowAgent) : undefined;\n const extra = { ...(rowAgent ? { agentId: rowAgent } : {}), ...(parentId ? { parentId } : {}) };\n out.bodies.forEach((body, i) => push(p.ts, i === 0 ? useId : `${useId}:${i}`, body, extra));\n if (out.pendingSubagent) openSubagents.set(out.pendingSubagent.childId, useId);\n }\n if (blocks.length === 0 && typeof content === \"string\" && /\\[Request interrupted by user/i.test(content)) {\n push(ts, `${str(row.uuid) ?? seq}:interrupt`, { kind: \"waiting_for_user\", reason: \"idle\" });\n }\n }\n\n for (const [useId, p] of pending) {\n warnings.push({ code: \"unpaired_result\", detail: `tool_use ${useId} (${p.name}) has no result` });\n const out = toolCallToOutcome({ name: p.name, input: p.input, isError: true }, ctx());\n if (out.warning) warnings.push(out.warning);\n out.bodies.forEach((body, i) => push(p.ts, i === 0 ? useId : `${useId}:${i}`, body, p.agentId ? { agentId: p.agentId } : {}));\n }\n for (const [childId, spawnId] of openSubagents) {\n push(lastTs, `${spawnId}:stop`, { kind: \"subagent_stop\", childId, ok: true }, { parentId: spawnId });\n }\n for (const t of unknownTypes) warnings.push({ code: \"unknown_row_type\", detail: t });\n\n if (Number.isFinite(firstTs) && !sawEnd) {\n sawEnd = true;\n push(lastTs, `${sessionId || \"session\"}:end`, { kind: \"session_end\", reason: \"stop\", claimedSuccess: claimsSuccess(lastAssistantText) });\n }\n return { events, warnings };\n}\n","import type { AdapterResult, AgentEvent, AgentEventBody, SessionEndReason } from \"../events/types.js\";\nimport { mintId } from \"../events/ids.js\";\nimport { claimsSuccess } from \"../director/claims.js\";\nimport { basename, type PathContext } from \"./paths.js\";\nimport { toolCallToOutcome } from \"./tool-call.js\";\n\n/**\n * Claude Code hook stdin payload → AgentEvents (live mode).\n * Field names per code.claude.com/docs/en/hooks. Unknown events produce a\n * warning and no event; the hook script itself always exits 0 regardless.\n */\nexport interface HookOptions {\n now?: number;\n home?: string;\n}\n\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\n\n/** Events where `agent_id` identifies the thread doing the work (attribution). SubagentStart/Stop name the child instead. */\nconst TOOL_EVENTS = new Set([\"PreToolUse\", \"PostToolUse\", \"PostToolUseFailure\"]);\n\nfunction endReason(reason: string | undefined): SessionEndReason {\n switch (reason) {\n case \"clear\":\n case \"logout\":\n case \"prompt_input_exit\":\n return \"user\";\n default:\n return \"stop\";\n }\n}\n\nexport function hookPayloadToEvents(payload: unknown, opts: HookOptions = {}): AdapterResult {\n const p = obj(payload);\n const name = str(p.hook_event_name);\n const sessionId = str(p.session_id) ?? \"\";\n const ts = opts.now ?? Date.now();\n if (!name) return { events: [], warnings: [{ code: \"missing_field\", detail: \"hook_event_name\" }] };\n const cwd = str(p.cwd) ?? \"\";\n const ctx: PathContext = { cwd, ...(opts.home ? { home: opts.home } : {}) };\n const agentId = TOOL_EVENTS.has(name) ? str(p.agent_id) : undefined;\n const extra = agentId ? { agentId } : {};\n let seq = 0;\n const mk = (body: AgentEventBody, id = mintId(ts)): AgentEvent => ({ id, seq: seq++, ts, sessionId, source: \"hook\", ...extra, ...body });\n const one = (body: AgentEventBody): AdapterResult => ({ events: [mk(body)], warnings: [] });\n\n switch (name) {\n case \"SessionStart\":\n return one({ kind: \"session_start\", repoId: basename(cwd) || \"repo\" });\n case \"SessionEnd\":\n return one({ kind: \"session_end\", reason: endReason(str(p.reason)), claimedSuccess: false });\n case \"Stop\":\n return one({ kind: \"turn_end\", claimedSuccess: claimsSuccess(str(p.last_assistant_message)) });\n case \"SubagentStart\": {\n const id = str(p.agent_id) ?? \"\";\n const label = str(p.agent_type);\n return { events: [mk({ kind: \"subagent_start\", childId: id, ...(label ? { label } : {}) })], warnings: [] };\n }\n case \"SubagentStop\":\n return one({ kind: \"subagent_stop\", childId: str(p.agent_id) ?? \"\", ok: true });\n case \"Notification\": {\n const t = str(p.notification_type);\n if (t === \"permission_prompt\") return one({ kind: \"waiting_for_user\", reason: \"permission\" });\n if (t === \"idle_prompt\") return one({ kind: \"waiting_for_user\", reason: \"idle\" });\n if (t === \"elicitation_dialog\") return one({ kind: \"waiting_for_user\", reason: \"question\" });\n return { events: [], warnings: [] };\n }\n case \"PostToolUseFailure\":\n return one({ kind: \"error\", where: str(p.tool_name) ?? \"tool\", retrying: false });\n case \"PostToolUse\": {\n const tool = str(p.tool_name);\n if (!tool) return { events: [], warnings: [{ code: \"missing_field\", detail: \"tool_name\" }] };\n const dur = typeof p.duration_ms === \"number\" ? { durationMs: p.duration_ms } : {};\n const out = toolCallToOutcome({ name: tool, input: p.tool_input, response: p.tool_response, ...dur }, ctx);\n const baseId = str(p.tool_use_id) ?? mintId(ts);\n const events = out.bodies.map((body, i) => mk(body, i === 0 ? baseId : `${baseId}:${i}`));\n return { events, warnings: out.warning ? [out.warning] : [] };\n }\n case \"PreToolUse\":\n case \"UserPromptSubmit\":\n case \"PreCompact\":\n case \"PostCompact\":\n return { events: [], warnings: [] };\n }\n return { events: [], warnings: [{ code: \"unknown_row_type\", detail: name }] };\n}\n","/**\n * Test helper and runtime guard: given events and a list of strings that must\n * never appear (prompts, file contents, command bodies), return the ones found.\n */\nexport function findLeaks(events: unknown, markers: readonly string[]): string[] {\n const hay = JSON.stringify(events);\n return markers.filter((m) => m.length > 0 && hay.includes(m));\n}\n","/** FNV-1a 32-bit — a stable seed from any string, no crypto dependency. */\nexport function hashString(s: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\n/** mulberry32: tiny, fast, good enough for layout jitter. Returns [0,1). */\nexport function mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import { isTestPath } from \"../adapters/paths.js\";\nimport type { FileNode, PlaceKind } from \"./types.js\";\n\nexport const ARCHIVE_RE = /(^|\\/)(schema\\.(sql|prisma|graphql|gql)|.*\\.(sql|prisma|db|sqlite)|migrations?\\/|drizzle\\/|models?\\/.*\\.(ts|js|py|rb)$)/i;\nconst IGNORE_RE = /(^|\\/)(node_modules|\\.git|dist|build|out|coverage|_site|\\.next|\\.turbo|target|vendor|__pycache__|\\.venv|venv)(\\/|$)|(^|\\/)\\.[^/]+$|\\.(lock|map|min\\.js|png|jpg|jpeg|gif|webp|svg|ico|woff2?|ttf|mp4|mp3|pdf|zip)$/i;\n\nexport function isIgnoredPath(p: string): boolean {\n return IGNORE_RE.test(p);\n}\n\nexport function kindOf(path: string): Exclude<PlaceKind, \"forge\" | \"dock\"> {\n if (isTestPath(path)) return \"beacon\";\n if (ARCHIVE_RE.test(path)) return \"archive\";\n return \"building\";\n}\n\n/** Lines, estimated from bytes when unknown (~40 bytes/line). */\nexport function locOf(f: FileNode): number {\n if (typeof f.loc === \"number\") return f.loc;\n if (typeof f.size === \"number\") return Math.max(1, Math.round(f.size / 40));\n return 1;\n}\n\nexport interface Scored { file: FileNode; loc: number; score: number; kind: Exclude<PlaceKind, \"forge\" | \"dock\">; touched: boolean }\n\n/**\n * 0.5·loc + 0.3·churn + 0.2·touched, each normalised to the repo's max.\n * Touched files are force-included by the caller regardless of score.\n */\nexport function scoreFiles(files: FileNode[], touched: Set<string>): Scored[] {\n const kept = files.filter((f) => !isIgnoredPath(f.path));\n const maxLoc = Math.max(1, ...kept.map(locOf));\n const maxChurn = Math.max(1, ...kept.map((f) => f.churn ?? 0));\n return kept.map((file) => {\n const loc = locOf(file);\n const t = touched.has(file.path);\n const score = 0.5 * Math.sqrt(loc / maxLoc) + 0.3 * ((file.churn ?? 0) / maxChurn) + (t ? 0.2 : 0);\n return { file, loc, score, kind: kindOf(file.path), touched: t };\n });\n}\n\nexport function heightClass(loc: number, maxLoc: number): number {\n const r = Math.sqrt(loc / Math.max(1, maxLoc));\n return Math.max(1, Math.min(5, Math.ceil(r * 5)));\n}\n\nexport function footprintOf(height: number): 1 | 2 | 3 {\n return height >= 5 ? 3 : height >= 3 ? 2 : 1;\n}\n","import type { FileNode } from \"./types.js\";\n\n/** What kind of project this is, from the file tree alone. Several can apply; ordered by confidence. */\nexport type ProjectKind =\n | \"web-frontend\" | \"backend-api\" | \"cli-tool\" | \"library\" | \"data-ml\" | \"mobile\" | \"game\"\n | \"infra-devops\" | \"docs-content\" | \"monorepo\" | \"systems\" | \"unknown\";\n\nexport interface RepoProfile {\n kinds: ProjectKind[];\n /** Top languages by file count, most common first. */\n languages: string[];\n files: number;\n}\n\nconst EXT_LANG: Record<string, string> = { ts: \"TypeScript\", tsx: \"TypeScript\", js: \"JavaScript\", jsx: \"JavaScript\", mjs: \"JavaScript\", py: \"Python\", go: \"Go\", rs: \"Rust\", java: \"Java\", kt: \"Kotlin\", swift: \"Swift\", rb: \"Ruby\", php: \"PHP\", cs: \"C#\", cpp: \"C++\", cc: \"C++\", c: \"C\", h: \"C\", m: \"Objective-C\", scala: \"Scala\", ex: \"Elixir\", exs: \"Elixir\", dart: \"Dart\", lua: \"Lua\", zig: \"Zig\", sh: \"Shell\", sql: \"SQL\", md: \"Markdown\", mdx: \"Markdown\", html: \"HTML\", css: \"CSS\", scss: \"CSS\", vue: \"Vue\", svelte: \"Svelte\", tf: \"Terraform\", yaml: \"YAML\", yml: \"YAML\", ipynb: \"Notebook\" };\n\nexport function profileRepo(files: FileNode[], manifests: Record<string, string> = {}): RepoProfile {\n const paths = files.map((f) => f.path.toLowerCase());\n const has = (re: RegExp) => paths.some((p) => re.test(p));\n const count = (re: RegExp) => paths.filter((p) => re.test(p)).length;\n const langCount = new Map<string, number>();\n for (const p of paths) { const ext = p.slice(p.lastIndexOf(\".\") + 1); const l = EXT_LANG[ext]; if (l && !/^(markdown|yaml|html|css|shell|sql)$/i.test(l)) langCount.set(l, (langCount.get(l) ?? 0) + 1); }\n const languages = [...langCount.entries()].sort((a, b) => b[1] - a[1]).map(([l]) => l).slice(0, 4);\n const pkg = (manifests[\"package.json\"] ?? \"\").toLowerCase();\n const py = ((manifests[\"pyproject.toml\"] ?? \"\") + (manifests[\"requirements.txt\"] ?? \"\")).toLowerCase();\n const dep = (re: RegExp) => re.test(pkg) || re.test(py);\n\n const scores = new Map<ProjectKind, number>();\n const add = (k: ProjectKind, n: number) => scores.set(k, (scores.get(k) ?? 0) + n);\n if (dep(/\"(react|react-dom|next|vue|nuxt|svelte|@sveltejs\\/kit|@angular\\/core|solid-js|astro|remix|vite)\"/)) add(\"web-frontend\", 3);\n if (count(/\\.(tsx|jsx|vue|svelte)$/) > 3) add(\"web-frontend\", 2);\n if (has(/(^|\\/)(index|app)\\.html$/) || count(/\\.(css|scss)$/) > 3) add(\"web-frontend\", 1);\n if (dep(/\"(express|fastify|hono|koa|@nestjs\\/core|apollo-server|prisma|drizzle-orm|django|flask|fastapi|sqlalchemy|gin|fiber|actix|axum|rails|spring)\"/)) add(\"backend-api\", 3);\n if (has(/(^|\\/)(routes?|controllers?|api|handlers?|migrations?)\\//) || has(/\\.(sql|prisma)$/)) add(\"backend-api\", 2);\n if (pkg.includes('\"bin\"') || has(/(^|\\/)(cli|cmd|bin)\\//) || dep(/\"(commander|yargs|clap|cobra|click|typer)\"/)) add(\"cli-tool\", 3);\n if (dep(/\"(torch|tensorflow|jax|pandas|numpy|scikit-learn|sklearn|transformers|xgboost|lightgbm|polars)\"/) || count(/\\.ipynb$/) > 0 || has(/(^|\\/)(notebooks?|models?|datasets?|training)\\//)) add(\"data-ml\", 3);\n if (has(/\\.(swift|kt)$/) || has(/(^|\\/)(ios|android)\\//) || has(/package\\.swift$/) || has(/build\\.gradle(\\.kts)?$/) || dep(/\"(react-native|expo|flutter)\"/) || has(/\\.dart$/)) add(\"mobile\", 3);\n if (has(/\\.(unity|unitypackage|godot|tscn|gd)$/) || has(/(^|\\/)assets\\/.*\\.(prefab|fbx)$/) || dep(/\"(phaser|pixi\\.js|three|babylonjs|@react-three\\/fiber|excalibur|kaplay|bevy|godot)\"/)) add(\"game\", 3);\n if (has(/\\.tf$/) || has(/(^|\\/)(dockerfile|docker-compose\\.ya?ml|helm|k8s|kubernetes|\\.github\\/workflows|ansible|pulumi)/) ) add(\"infra-devops\", has(/\\.tf$/) || has(/(^|\\/)(helm|k8s|kubernetes|ansible|pulumi)\\//) ? 3 : 1);\n const mdShare = count(/\\.(md|mdx|rst)$/) / Math.max(1, paths.length);\n if (mdShare > 0.4 || has(/(^|\\/)(mkdocs|docusaurus)\\.config|(^|\\/)docs\\/.*\\.mdx?$/) && mdShare > 0.25) add(\"docs-content\", 3);\n if (has(/(^|\\/)pnpm-workspace\\.ya?ml$/) || has(/(^|\\/)packages\\/[^/]+\\/package\\.json$/) || has(/(^|\\/)(lerna|nx|turbo)\\.json$/) || has(/(^|\\/)cargo\\.toml$/) && count(/(^|\\/)crates\\/[^/]+\\//) > 0) add(\"monorepo\", 2);\n if (count(/\\.(rs|go|c|cpp|cc|h|zig)$/) > 5 && !scores.has(\"web-frontend\")) add(\"systems\", 2);\n if (pkg.includes('\"main\"') && !pkg.includes('\"bin\"') && !scores.has(\"web-frontend\") && !scores.has(\"backend-api\")) add(\"library\", 2);\n if (has(/(^|\\/)(lib|src\\/lib)\\//) && !scores.has(\"web-frontend\")) add(\"library\", 1);\n\n const kinds = [...scores.entries()].filter(([, n]) => n >= 2).sort((a, b) => b[1] - a[1]).map(([k]) => k);\n return { kinds: kinds.length ? kinds : [\"unknown\"], languages, files: files.length };\n}\n","import { hashString, mulberry32 } from \"./prng.js\";\nimport { footprintOf, heightClass, scoreFiles, type Scored } from \"./relevance.js\";\nimport type { District, GenerateOptions, LayoutStyle, Path, Place, Rect, World } from \"./types.js\";\nimport { profileRepo } from \"./profile.js\";\n\n/**\n * Deterministic world layout. Same repoId + same file list → identical World.\n *\n * Shape: a hub (forge) at the origin; districts (top-level folders) packed in a\n * ring around it, each a square patch with buildings spiral-packed from its\n * centre by relevance; beacons (tests) on an outer ring near their district;\n * the dock on the outer ring at a seeded angle. Paths join each district to the hub.\n */\nexport function generateWorld(opts: GenerateOptions): World {\n const cap = opts.cap ?? 60;\n const beaconCap = opts.beaconCap ?? 8;\n // Force-include only the first `touchedCap` touched files (callers pass them most-active first); the rest get an overflow building per district.\n const touchedCap = opts.touchedCap ?? 48;\n const touched = new Set((opts.touched ?? []).map(norm).slice(0, touchedCap));\n const seed = hashString(opts.repoId);\n const rnd = mulberry32(seed);\n const files = opts.files.map((f) => ({ ...f, path: norm(f.path) }));\n const scored = scoreFiles(files, touched);\n const maxLoc = Math.max(1, ...scored.map((s) => s.loc));\n\n // ---- selection: touched always; then by score within caps ----\n const byScore = [...scored].sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path));\n const beacons = pick(byScore.filter((s) => s.kind === \"beacon\"), beaconCap);\n const others = pick(byScore.filter((s) => s.kind !== \"beacon\"), cap);\n const selected = [...others, ...beacons];\n const capped = selected.length < scored.length;\n\n // ---- districts: group by top-level folder ----\n const groups = new Map<string, Scored[]>();\n for (const s of others) {\n const d = topDir(s.file.path);\n (groups.get(d) ?? groups.set(d, []).get(d)!).push(s);\n }\n const names = [...groups.keys()].sort();\n const occupied = new Set<string>();\n const places: Place[] = [];\n const districts: District[] = [];\n\n // hub\n const forge: Place = { id: \"forge\", kind: \"forge\", path: \"\", label: \"forge\", district: \"\", gx: -1, gy: -1, footprint: 2, height: 2, score: 0, touched: false };\n places.push(forge);\n\n // district patches, arranged by layout style\n const layout: LayoutStyle = opts.layout ?? LAYOUTS[seed % LAYOUTS.length]!;\n const jitter = rnd() * Math.PI * 2;\n const sized = names.map((name) => {\n const items = groups.get(name)!.sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path));\n const cells = items.reduce((n, s) => n + footprintOf(heightClass(s.loc, maxLoc)) ** 2, 0);\n const side = Math.max(3, Math.ceil(Math.sqrt(cells * 1.45)));\n return { name, items, side };\n });\n const placedRects: Rect[] = [];\n const hubRect: Rect = { x: -2, y: -2, w: 4, h: 4 };\n const rects = layoutRects(layout, sized.map((d) => d.side), hubRect, jitter, rnd);\n placedRects.push(hubRect, ...rects);\n // hub position may move with the layout (strip/terrace/spine); re-place the forge\n const hub = hubFor(layout, rects);\n forge.gx = hub[0]; forge.gy = hub[1]; occupied.clear(); claim(occupied, forge);\n sized.forEach((d0, i) => {\n const rect = rects[i]!;\n const d: District = { id: `d:${d0.name}`, label: d0.name === \"\" ? \"/\" : `${d0.name}/`, bounds: rect, cx: rect.x + Math.floor(rect.w / 2), cy: rect.y + Math.floor(rect.h / 2), placeIds: [] };\n for (const s of d0.items) {\n const h = heightClass(s.loc, maxLoc);\n const fp = footprintOf(h);\n const spot = spiralSpot(occupied, d.cx, d.cy, fp, rect);\n const p: Place = { id: `p:${s.file.path}`, kind: s.kind as Place[\"kind\"], path: s.file.path, label: base(s.file.path), district: d.id, gx: spot[0], gy: spot[1], footprint: fp, height: h, score: round3(s.score), touched: s.touched };\n claim(occupied, p);\n places.push(p);\n d.placeIds.push(p.id);\n }\n districts.push(d);\n });\n let ring = Math.ceil(maxExtent(placedRects));\n\n // outer ring: beacons near their district (or hub), dock at a seeded angle\n void ring;\n // reserve every district rectangle (plus a 1-tile moat) so rim features never land between buildings\n for (const r of placedRects) for (let x = r.x - 1; x < r.x + r.w + 1; x++) for (let y = r.y - 1; y < r.y + r.h + 1; y++) occupied.add(`${x},${y}`);\n for (const s of beacons) {\n const home = districts.find((d) => d.id === `d:${topDir(s.file.path)}`);\n const spot = home ? edgeSpot(occupied, home, forge, 1) : nearSpot(occupied, forge.gx + 1, forge.gy + 1, rnd() * Math.PI * 2, 4, 1);\n const p: Place = { id: `p:${s.file.path}`, kind: \"beacon\", path: s.file.path, label: base(s.file.path), district: home?.id ?? \"\", gx: spot[0], gy: spot[1], footprint: 1, height: 4, score: round3(s.score), touched: s.touched };\n claim(occupied, p);\n places.push(p);\n home?.placeIds.push(p.id);\n }\n const dockSpot = nearSpot(occupied, forge.gx + 1, forge.gy + 1, jitter + Math.PI, 5, 2);\n const dock: Place = { id: \"dock\", kind: \"dock\", path: \"\", label: \"dock\", district: \"\", gx: dockSpot[0], gy: dockSpot[1], footprint: 2, height: 1, score: 0, touched: false };\n claim(occupied, dock);\n places.push(dock);\n\n const paths = layoutPaths(layout, districts, forge, dock);\n\n // overflow: one shared building per district that had files cut, so unplaced activity still lands in the right area\n if (capped) {\n for (const d of districts) {\n const top = d.id.slice(2);\n const total = scored.filter((s) => s.kind !== \"beacon\" && topDir(s.file.path) === top).length;\n if (total <= d.placeIds.length) continue;\n const spot = spiralSpot(occupied, d.cx, d.cy, 1, d.bounds);\n const p: Place = { id: `p:${top ? top + \"/\" : \"\"}…`, kind: \"overflow\", path: `${top ? top + \"/\" : \"\"}…`, label: `+${total - d.placeIds.length} more`, district: d.id, gx: spot[0], gy: spot[1], footprint: 1, height: 2, score: 0, touched: false };\n claim(occupied, p); places.push(p); d.placeIds.push(p.id);\n }\n }\n const bounds = boundsOf(places, 2);\n const profile = profileRepo(files, opts.manifests ?? {});\n return { repoId: opts.repoId, seed, layout, profile, districts, places, paths, bounds, stats: { files: scored.length, placed: selected.length, capped } };\n}\n\n// ---- helpers ----\nconst norm = (p: string) => p.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\");\nconst base = (p: string) => p.slice(p.lastIndexOf(\"/\") + 1);\nconst topDir = (p: string) => (p.includes(\"/\") ? p.slice(0, p.indexOf(\"/\")) : \"\");\nconst round3 = (n: number) => Math.round(n * 1000) / 1000;\n\nfunction pick(sorted: Scored[], cap: number): Scored[] {\n const forced = sorted.filter((s) => s.touched);\n const rest = sorted.filter((s) => !s.touched);\n return [...forced, ...rest.slice(0, Math.max(0, cap - forced.length))];\n}\n\nfunction overlaps(a: Rect, b: Rect, gap: number): boolean {\n return a.x < b.x + b.w + gap && b.x < a.x + a.w + gap && a.y < b.y + b.h + gap && b.y < a.y + a.h + gap;\n}\n\nfunction cellsOf(gx: number, gy: number, fp: number): string[] {\n const out: string[] = [];\n for (let dx = 0; dx < fp; dx++) for (let dy = 0; dy < fp; dy++) out.push(`${gx + dx},${gy + dy}`);\n return out;\n}\nfunction free(occ: Set<string>, gx: number, gy: number, fp: number): boolean {\n return cellsOf(gx, gy, fp).every((c) => !occ.has(c));\n}\nfunction claim(occ: Set<string>, p: Place): void {\n for (const c of cellsOf(p.gx, p.gy, p.footprint)) occ.add(c);\n}\n\n/** Nearest free fp×fp spot to (cx,cy), spiralling outward in origin-relative steps; prefers the patch, never fails. */\nfunction spiralSpot(occ: Set<string>, cx: number, cy: number, fp: number, rect: Rect): [number, number] {\n let x = 0, y = 0, dx = 0, dy = -1;\n let fallback: [number, number] | null = null;\n for (let i = 0; i < 4096; i++) {\n const gx = cx + x - Math.floor(fp / 2), gy = cy + y - Math.floor(fp / 2);\n if (free(occ, gx, gy, fp)) {\n const inside = gx >= rect.x - 1 && gy >= rect.y - 1 && gx + fp <= rect.x + rect.w + 1 && gy + fp <= rect.y + rect.h + 1;\n if (inside) return [gx, gy];\n fallback ??= [gx, gy];\n if (i > 600) return fallback;\n }\n if (x === y || (x < 0 && x === -y) || (x > 0 && x === 1 - y)) [dx, dy] = [-dy, dx];\n x += dx; y += dy;\n }\n return fallback ?? [cx, cy];\n}\n\n/** Free spot on a ring of given radius, scanning angles outward from `ang`. */\nfunction ringSpot(occ: Set<string>, ang: number, radius: number, fp: number): [number, number] {\n for (let r = radius; r < radius + 40; r++) {\n for (let k = 0; k < 64; k++) {\n const a = ang + (k % 2 ? 1 : -1) * Math.ceil(k / 2) * (Math.PI / 32);\n const gx = Math.round(Math.cos(a) * r), gy = Math.round(Math.sin(a) * r * 0.85);\n if (free(occ, gx, gy, fp)) return [gx, gy];\n }\n }\n return [radius, 0];\n}\n\nfunction maxExtent(rects: Rect[]): number {\n return Math.max(...rects.map((r) => Math.max(Math.abs(r.x), Math.abs(r.x + r.w), Math.abs(r.y), Math.abs(r.y + r.h))));\n}\nfunction boundsOf(places: Place[], pad: number): Rect {\n const xs = places.flatMap((p) => [p.gx, p.gx + p.footprint]);\n const ys = places.flatMap((p) => [p.gy, p.gy + p.footprint]);\n const x = Math.min(...xs) - pad, y = Math.min(...ys) - pad;\n return { x, y, w: Math.max(...xs) + pad - x, h: Math.max(...ys) + pad - y };\n}\n\nexport const LAYOUTS: readonly LayoutStyle[] = [\"ring\", \"grid\", \"strip\", \"scatter\", \"terrace\", \"spine\"];\n\n/** District rectangles for a layout. Deterministic for (style, sides, jitter, rnd). Never overlapping, never touching the hub. */\nfunction layoutRects(style: LayoutStyle, sides: number[], hub: Rect, jitter: number, rnd: () => number): Rect[] {\n const n = sides.length, out: Rect[] = [];\n const maxSide = Math.max(3, ...sides);\n const fits = (r: Rect) => !overlaps(hub, r, 1) && !out.some((o) => overlaps(o, r, 1));\n const push = (x: number, y: number, side: number) => { const r = { x, y, w: side, h: side }; out.push(r); return r; };\n switch (style) {\n case \"grid\": {\n // row-major shelves: each row as tall as its tallest district, columns packed tight, hub cell skipped\n const cols = Math.max(2, Math.ceil(Math.sqrt(n + 1)));\n const cells: Array<{ x: number; y: number }> = [];\n let y = 0, i = 0;\n while (i < n) {\n const row = sides.slice(i, i + cols), rowH = Math.max(...row) + 2;\n let x = 0; for (const w of row) { cells.push({ x, y }); x += w + 2; }\n y += rowH; i += cols;\n }\n const totalW = Math.max(...cells.map((c, j) => c.x + sides[j]!)), totalH = y;\n for (let j = 0; j < n; j++) {\n let rect: Rect = { x: cells[j]!.x - Math.round(totalW / 2), y: cells[j]!.y - Math.round(totalH / 2), w: sides[j]!, h: sides[j]! };\n while (!fits(rect)) rect = { ...rect, x: rect.x + 1 };\n out.push(rect);\n }\n return out;\n }\n case \"strip\": {\n const total = sides.reduce((a, b) => a + b + 2, 0);\n let x = Math.round(-total / 2) + 6;\n for (let i = 0; i < n; i++) { const wobble = Math.round((rnd() - 0.5) * 3); push(x, wobble - Math.floor(sides[i]! / 2), sides[i]!); x += sides[i]! + 2; }\n return out;\n }\n case \"terrace\": {\n let x = -Math.round(n * (maxSide + 1) / 2), y = -Math.round(n * (maxSide + 1) * 0.3);\n for (let i = 0; i < n; i++) { push(x, y, sides[i]!); x += sides[i]! + 1; y += Math.round(sides[i]! * 0.6) + 1; }\n return out;\n }\n case \"spine\": {\n let y = -Math.round(n * (maxSide + 2) / 4);\n for (let i = 0; i < n; i++) { const left = i % 2 === 0; push(left ? -sides[i]! - 3 : 3, y, sides[i]!); if (!left) y += maxSide + 2; }\n return out;\n }\n case \"scatter\": {\n for (let i = 0; i < n; i++) {\n let R = 5 + maxSide, placed = false;\n for (let tries = 0; tries < 400 && !placed; tries++) {\n const a = jitter + rnd() * Math.PI * 2, r = R * (0.5 + rnd() * 0.7);\n const rect: Rect = { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r * 0.8), w: sides[i]!, h: sides[i]! };\n if (fits(rect)) { out.push(rect); placed = true; }\n if (tries % 40 === 39) R += 2;\n }\n if (!placed) push(R + i * 2, 0, sides[i]!);\n }\n return out;\n }\n default: { // ring\n let ring = 3;\n for (let i = 0; i < n; i++) {\n const side = sides[i]!, angle = jitter + (i / Math.max(1, n)) * Math.PI * 2;\n let r = ring + side / 2, rect: Rect;\n for (;;) {\n const cx = Math.round(Math.cos(angle) * r), cy = Math.round(Math.sin(angle) * r * 0.8);\n rect = { x: cx - Math.floor(side / 2), y: cy - Math.floor(side / 2), w: side, h: side };\n if (fits(rect)) break;\n r += 1;\n }\n out.push(rect); ring = Math.max(ring, r - side / 2);\n }\n return out;\n }\n }\n}\n\n/** Where the forge/hub sits for a layout: centre for ring/scatter/grid, an end for strip/terrace/spine. */\nfunction hubFor(style: LayoutStyle, rects: Rect[]): [number, number] {\n if (!rects.length) return [-1, -1];\n const minX = Math.min(...rects.map((r) => r.x)), minY = Math.min(...rects.map((r) => r.y));\n switch (style) {\n case \"strip\": return [minX - 5, -1];\n case \"terrace\": return [minX - 5, minY - 1];\n case \"spine\": return [-1, minY - 5];\n default: return [-1, -1];\n }\n}\n\n/** Paths by layout: spokes (ring/scatter), L-shaped streets (grid/spine), a chain (strip/terrace). */\nfunction layoutPaths(style: LayoutStyle, districts: District[], forge: Place, dock: Place): Path[] {\n const hub: [number, number] = [forge.gx + 1, forge.gy + 1];\n const paths: Path[] = [];\n if (style === \"strip\" || style === \"terrace\") {\n const ordered = [...districts].sort((a, b) => a.cx - b.cx || a.cy - b.cy);\n let prev: [number, number] = hub, prevId = \"forge\";\n for (const d of ordered) { paths.push({ from: prevId, to: d.id, points: [prev, [d.cx, d.cy]] }); prev = [d.cx, d.cy]; prevId = d.id; }\n } else if (style === \"grid\" || style === \"spine\") {\n for (const d of districts) paths.push({ from: d.id, to: \"forge\", points: [[d.cx, d.cy], [d.cx, hub[1]], hub] });\n } else {\n for (const d of districts) paths.push({ from: d.id, to: \"forge\", points: [[d.cx, d.cy], [Math.round((d.cx + hub[0]) / 2), Math.round((d.cy + hub[1]) / 2)], hub] });\n }\n paths.push({ from: \"dock\", to: \"forge\", points: [[dock.gx, dock.gy], hub] });\n return paths;\n}\n\n/**\n * Re-arrange an existing world in another layout. Keeps every id, kind, height\n * and footprint; only positions, paths and bounds change — so beats directed\n * against the old world still name valid places. Used by the stage so each\n * set can show the same repo in its own arrangement.\n */\nexport function relayoutWorld(world: World, layout: LayoutStyle): World {\n if (world.layout === layout) return world;\n const seed = world.seed;\n const rnd = mulberry32(seed ^ 0x51ed270b ^ LAYOUTS.indexOf(layout));\n const occupied = new Set<string>();\n const places: Place[] = [];\n const forge: Place = { ...world.places.find((p) => p.kind === \"forge\")!, gx: -1, gy: -1 };\n places.push(forge);\n const jitter = rnd() * Math.PI * 2;\n const groups = world.districts.map((d) => ({ d, items: world.places.filter((p) => p.district === d.id && (p.kind === \"building\" || p.kind === \"archive\" || p.kind === \"overflow\")).sort((a, b) => b.score - a.score || a.path.localeCompare(b.path)) }));\n const sized = groups.map((g) => { const cells = g.items.reduce((n, p) => n + p.footprint ** 2, 0); return { ...g, side: Math.max(3, Math.ceil(Math.sqrt(cells * 1.45))) }; });\n const hubRect: Rect = { x: -2, y: -2, w: 4, h: 4 };\n const rects = layoutRects(layout, sized.map((d) => d.side), hubRect, jitter, rnd);\n const placedRects: Rect[] = [hubRect, ...rects];\n const hub = hubFor(layout, rects);\n forge.gx = hub[0]; forge.gy = hub[1]; claim(occupied, forge);\n const districts: District[] = sized.map((g, i) => {\n const rect = rects[i]!;\n const d: District = { ...g.d, bounds: rect, cx: rect.x + Math.floor(rect.w / 2), cy: rect.y + Math.floor(rect.h / 2), placeIds: [] };\n for (const old of g.items) {\n const spot = spiralSpot(occupied, d.cx, d.cy, old.footprint, rect);\n const p: Place = { ...old, gx: spot[0], gy: spot[1] };\n claim(occupied, p); places.push(p); d.placeIds.push(p.id);\n }\n return d;\n });\n const ring = Math.ceil(maxExtent(placedRects));\n void ring;\n for (const r of placedRects) for (let x = r.x - 1; x < r.x + r.w + 1; x++) for (let y = r.y - 1; y < r.y + r.h + 1; y++) occupied.add(`${x},${y}`);\n for (const old of world.places.filter((p) => p.kind === \"beacon\")) {\n const home = districts.find((d) => d.id === old.district);\n const spot = home ? edgeSpot(occupied, home, forge, 1) : nearSpot(occupied, forge.gx + 1, forge.gy + 1, rnd() * Math.PI * 2, 4, 1);\n const p: Place = { ...old, gx: spot[0], gy: spot[1] };\n claim(occupied, p); places.push(p); home?.placeIds.push(p.id);\n }\n const dockSpot = nearSpot(occupied, forge.gx + 1, forge.gy + 1, jitter + Math.PI, 5, 2);\n const dock: Place = { ...world.places.find((p) => p.kind === \"dock\")!, gx: dockSpot[0], gy: dockSpot[1] };\n claim(occupied, dock); places.push(dock);\n const paths = layoutPaths(layout, districts, forge, dock);\n return { ...world, layout, districts, places, paths, bounds: boundsOf(places, 2) };\n}\n\n/** Like ringSpot but around an arbitrary centre. */\nfunction nearSpot(occ: Set<string>, cx: number, cy: number, ang: number, radius: number, fp: number): [number, number] {\n for (let r = radius; r < radius + 40; r++) {\n for (let k = 0; k < 64; k++) {\n const a = ang + (k % 2 ? 1 : -1) * Math.ceil(k / 2) * (Math.PI / 32);\n const gx = Math.round(cx + Math.cos(a) * r), gy = Math.round(cy + Math.sin(a) * r * 0.85);\n if (free(occ, gx, gy, fp)) return [gx, gy];\n }\n }\n return [cx + radius, cy];\n}\n/** A cell just outside a district, on the side facing away from the hub — where that folder's beacon stands. */\nfunction edgeSpot(occ: Set<string>, d: District, hub: Place, fp: number): [number, number] {\n const ang = Math.atan2(d.cy - hub.gy, d.cx - hub.gx);\n const r0 = Math.ceil(Math.max(d.bounds.w, d.bounds.h) / 2) + 2;\n return nearSpot(occ, d.cx, d.cy, ang, r0, fp);\n}\n","import type { World } from \"./types.js\";\n\n/** Plan view for terminals and tests: B building, A archive, L beacon, F forge, D dock, # touched. */\nexport function worldToAscii(w: World): string {\n const { x, y, w: W, h: H } = w.bounds;\n const grid: string[][] = Array.from({ length: H }, () => Array.from({ length: W }, () => \"·\"));\n const put = (gx: number, gy: number, ch: string) => {\n const r = gy - y, c = gx - x;\n if (r >= 0 && r < H && c >= 0 && c < W) grid[r]![c] = ch;\n };\n for (const p of w.places) {\n const ch = p.touched ? \"#\" : p.kind === \"building\" ? \"B\" : p.kind === \"archive\" ? \"A\" : p.kind === \"beacon\" ? \"L\" : p.kind === \"forge\" ? \"F\" : p.kind === \"overflow\" ? \"+\" : \"D\";\n for (let dx = 0; dx < p.footprint; dx++) for (let dy = 0; dy < p.footprint; dy++) put(p.gx + dx, p.gy + dy, ch);\n }\n return grid.map((r) => r.join(\"\")).join(\"\\n\");\n}\n","import type { Mood } from \"./types.js\";\n\n/**\n * Mood is a small state machine driven only by events — never by a timer, so an\n * idle agent looks idle rather than busy. `lost` needs repeated trouble inside a\n * window; a single failure is `uneasy`.\n */\nexport class MoodTracker {\n mood: Mood = \"curious\";\n private trouble: number[] = [];\n constructor(private readonly windowMs: number) {}\n\n private recordTrouble(ts: number): boolean {\n this.trouble = this.trouble.filter((t) => ts - t <= this.windowMs);\n this.trouble.push(ts);\n return this.trouble.length >= 2;\n }\n onRead(): Mood { return (this.mood = this.mood === \"lost\" ? \"lost\" : \"curious\"); }\n onBuild(): Mood { return (this.mood = this.mood === \"lost\" ? \"lost\" : \"focused\"); }\n onFail(ts: number): Mood { return (this.mood = this.recordTrouble(ts) ? \"lost\" : \"uneasy\"); }\n onError(ts: number): Mood { return (this.mood = this.recordTrouble(ts) ? \"lost\" : \"uneasy\"); }\n onPass(): Mood { this.trouble = []; return (this.mood = \"happy\"); }\n onClaimUnverified(): Mood { return (this.mood = \"uneasy\"); }\n}\n","import type { AgentEvent } from \"../events/types.js\";\nimport { isTestPath } from \"../adapters/paths.js\";\nimport type { Place, PlaceId, World } from \"../world/types.js\";\nimport { kindOf } from \"../world/relevance.js\";\nimport { MoodTracker } from \"./mood.js\";\nimport type { ActorId, Beat, BeatBody, DirectorOptions, TestOutcome } from \"./types.js\";\n\n/**\n * Turns AgentEvents into a Beat timeline against a World. Incremental: `feed`\n * returns only the new beats, so live mode streams and replay pre-computes.\n *\n * Honesty rules: every beat traces to events (`sourceEventIds`); nothing is\n * invented to look busy; the claim check is deterministic and test-gated.\n */\nexport class Director {\n private readonly places = new Map<PlaceId, Place>();\n private readonly byPath = new Map<string, Place>();\n private readonly beacons: Place[];\n private readonly forge: Place;\n private readonly dock: Place;\n private readonly maxGap: number;\n private readonly msPerCell: number;\n private readonly mood: MoodTracker;\n\n private beats: Beat[] = [];\n private sceneMs = 0;\n private lastRealTs: number | null = null;\n private seq = 0;\n private readonly actorAt = new Map<ActorId, PlaceId>();\n private readonly helpers = new Map<string, { label?: string }>();\n private readonly gremlins = new Map<string, PlaceId>(); // gremlinId -> place\n private lastEdited: Place | null = null;\n private pendingBeacon: Place | null = null;\n private editedSinceTurn = false;\n private verifiedSinceEdit = false;\n private everVerified = false;\n private claimGremlin: string | null = null;\n\n constructor(private readonly world: World, opts: DirectorOptions = {}) {\n for (const p of world.places) {\n this.places.set(p.id, p);\n if (p.path) this.byPath.set(p.path, p);\n }\n this.beacons = world.places.filter((p) => p.kind === \"beacon\");\n this.forge = world.places.find((p) => p.kind === \"forge\") ?? world.places[0]!;\n this.dock = world.places.find((p) => p.kind === \"dock\") ?? this.forge;\n this.maxGap = opts.maxGapMs ?? 2500;\n this.msPerCell = opts.walkMsPerCell ?? 90;\n this.mood = new MoodTracker(opts.lostWindowMs ?? 90_000);\n this.actorAt.set(\"pip\", this.forge.id);\n }\n\n get timeline(): readonly Beat[] { return this.beats; }\n\n feed(e: AgentEvent): Beat[] {\n const start = this.beats.length;\n this.advanceClock(e.ts, e.id);\n const actor: ActorId = e.agentId && this.helpers.has(e.agentId) ? e.agentId : \"pip\";\n switch (e.kind) {\n case \"session_start\":\n this.emit(e, actor, { kind: \"curtain_up\", repoId: e.repoId }, 1200);\n break;\n case \"read_file\": {\n const p = this.placeFor(e.path, e, actor);\n this.walk(e, actor, p);\n this.emit(e, actor, { kind: \"read\", target: p.id }, clamp(700 + (e.bytes ?? 400) / 4, 900, 1800), this.mood.onRead());\n break;\n }\n case \"edit_file\":\n case \"write_file\": {\n const p = this.placeFor(e.path, e, actor);\n this.walk(e, actor, p);\n const lines = e.kind === \"edit_file\" ? e.added + e.removed : e.added;\n const intensity = clamp(Math.sqrt(lines / 50), 0.15, 1);\n const g = [...this.gremlins].find(([, at]) => at === p.id);\n if (g) this.emit(e, actor, { kind: \"chase\", gremlinId: g[0], target: p.id }, 900, this.mood.mood);\n if (e.kind === \"write_file\" && e.created) this.emit(e, actor, { kind: \"raise\", target: p.id }, 900, this.mood.onBuild());\n this.emit(e, actor, { kind: \"build\", target: p.id, intensity }, clamp(600 + intensity * 1900, 800, 2500), this.mood.onBuild());\n this.lastEdited = p;\n this.editedSinceTurn = true;\n this.verifiedSinceEdit = false;\n break;\n }\n case \"run_command\": {\n if (e.intent === \"test\") {\n const beacon = this.beaconFor(e.touched);\n this.walk(e, actor, beacon);\n this.pendingBeacon = beacon;\n this.emit(e, actor, { kind: \"run_tests\", target: beacon.id }, clamp(e.durationMs ?? 1200, 900, 3000), this.mood.mood);\n } else if (e.intent === \"search\") {\n this.emit(e, actor, { kind: \"search\", scope: \"repo\" }, 700, this.mood.onRead());\n } else if (e.touched.length === 0 || e.intent === \"git\" || e.intent === \"install\" || e.intent === \"build\") {\n this.walk(e, actor, this.forge);\n const intensity = e.intent === \"build\" || e.intent === \"install\" ? 0.8 : e.intent === \"git\" ? 0.4 : 0.5;\n this.emit(e, actor, { kind: \"forge\", intensity }, clamp(e.durationMs ?? 800, 700, 2000), this.mood.mood);\n }\n // write_file / read_file intents are followed by their own file events; no extra beat.\n if (!e.ok && e.intent !== \"test\") this.emit(e, actor, { kind: \"stumble\", retrying: false }, 600, this.mood.onError(e.ts));\n break;\n }\n case \"test_result\": {\n const beacon = this.pendingBeacon ?? this.beaconFor([]);\n this.pendingBeacon = null;\n const outcome: TestOutcome = e.framework === \"unknown\" && e.passed === 0 && e.failed === 0 ? (e.ok ? \"pass\" : \"fail\") : e.ok ? \"pass\" : \"fail\";\n if (outcome === \"pass\") {\n this.emit(e, actor, { kind: \"test_outcome\", target: beacon.id, outcome, passed: e.passed, failed: e.failed }, 800, this.mood.onPass());\n if (e.passed > 0 || e.framework === \"unknown\") { this.verifiedSinceEdit = true; this.everVerified = true; }\n for (const [gid] of this.gremlins) this.emit(e, actor, { kind: \"banish\", gremlinId: gid }, 700, \"happy\");\n this.gremlins.clear();\n if (this.claimGremlin) { this.emit(e, actor, { kind: \"banish\", gremlinId: this.claimGremlin }, 700, \"happy\"); this.claimGremlin = null; }\n this.emit(e, actor, { kind: \"celebrate\", target: beacon.id }, 1600, \"happy\");\n } else {\n this.emit(e, actor, { kind: \"test_outcome\", target: beacon.id, outcome, passed: e.passed, failed: e.failed }, 800, this.mood.onFail(e.ts));\n const at = this.lastEdited ?? beacon;\n const gid = `g:${e.id}`;\n this.gremlins.set(gid, at.id);\n this.emit(e, actor, { kind: \"spawn_gremlin\", gremlinId: gid, target: at.id }, 900, this.mood.mood);\n }\n break;\n }\n case \"search\":\n this.emit(e, actor, { kind: \"search\", scope: e.scope }, 700, this.mood.onRead());\n break;\n case \"subagent_start\":\n this.helpers.set(e.childId, e.label ? { label: e.label } : {});\n this.actorAt.set(e.childId, this.dock.id);\n this.emit(e, \"pip\", { kind: \"summon_helper\", helperId: e.childId, ...(e.label ? { label: e.label } : {}) }, 1400, this.mood.mood);\n break;\n case \"subagent_stop\":\n if (this.helpers.has(e.childId)) {\n this.emit(e, e.childId, { kind: \"dismiss_helper\", helperId: e.childId, ok: e.ok }, 1000, this.mood.mood);\n this.helpers.delete(e.childId);\n this.actorAt.delete(e.childId);\n }\n break;\n case \"waiting_for_user\":\n if (e.reason === \"idle\") this.emit(e, actor, { kind: \"your_turn\" }, 1000, this.mood.mood);\n else this.emit(e, actor, { kind: \"blocked_on_you\", reason: e.reason }, 1200, this.mood.mood);\n break;\n case \"error\":\n this.emit(e, actor, { kind: \"stumble\", retrying: e.retrying }, 700, this.mood.onError(e.ts));\n break;\n case \"turn_end\": {\n if (e.claimedSuccess && this.editedSinceTurn && !this.verifiedSinceEdit) {\n const gid = `claim:${e.id}`;\n this.claimGremlin = gid;\n this.emit(e, actor, { kind: \"unverified_claim\", gremlinId: gid }, 1400, this.mood.onClaimUnverified());\n }\n this.editedSinceTurn = false;\n this.emit(e, actor, { kind: \"your_turn\" }, 1000, this.mood.mood);\n break;\n }\n case \"session_end\":\n this.emit(e, actor, { kind: \"curtain_down\", verified: this.everVerified && !this.claimGremlin }, 1500, this.mood.mood);\n break;\n }\n return this.beats.slice(start);\n }\n\n // ---- internals ----\n private advanceClock(ts: number, eventId: string): void {\n if (this.lastRealTs !== null) {\n const lastEnd = this.beats.length ? Math.max(...this.beats.slice(-3).map((b) => b.atMs + b.durationMs)) : this.sceneMs;\n const gap = Math.min(Math.max(0, ts - this.lastRealTs), this.maxGap);\n const target = Math.max(lastEnd, this.sceneMs) + gap;\n if (target - lastEnd >= 1000) {\n const idle: Beat = { id: `b${this.seq++}`, atMs: lastEnd, durationMs: target - lastEnd, realTs: this.lastRealTs, mood: this.mood.mood, actor: \"pip\", sourceEventIds: [eventId], kind: \"idle\" };\n this.beats.push(idle);\n }\n this.sceneMs = Math.max(this.sceneMs, target);\n }\n this.lastRealTs = ts;\n }\n\n private emit(e: AgentEvent, actor: ActorId, body: BeatBody, durationMs: number, mood = this.mood.mood): Beat {\n durationMs = Math.round(durationMs);\n if (\"intensity\" in body) body = { ...body, intensity: Math.round(body.intensity * 1000) / 1000 };\n const b: Beat = { id: `b${this.seq++}`, atMs: Math.round(this.sceneMs), durationMs, realTs: e.ts, mood, actor, sourceEventIds: [e.id], ...body };\n this.beats.push(b);\n this.sceneMs += durationMs;\n return b;\n }\n\n private walk(e: AgentEvent, actor: ActorId, to: Place): void {\n const fromId = this.actorAt.get(actor) ?? this.forge.id;\n if (fromId === to.id) return;\n const from = this.places.get(fromId) ?? this.forge;\n const cells = Math.hypot(to.gx - from.gx, to.gy - from.gy);\n this.emit(e, actor, { kind: \"walk_to\", target: to.id }, clamp(Math.round(cells * this.msPerCell), 300, 2500));\n this.actorAt.set(actor, to.id);\n }\n\n private raised = 0;\n /** Known place; else the district's overflow building; else (bounded) a new one raised for a file created mid-session. */\n private placeFor(path: string, e: AgentEvent, actor: ActorId): Place {\n const known = this.byPath.get(path);\n if (known) return known;\n const top = path.includes(\"/\") ? path.slice(0, path.indexOf(\"/\")) : \"\";\n const overflow = this.byPath.get(`${top ? top + \"/\" : \"\"}…`);\n if (overflow && (this.raised >= 24 || !this.world.stats.capped === false)) return overflow;\n if (this.raised >= 24) return overflow ?? this.forge;\n this.raised++;\n const district = this.world.districts.find((d) => d.id === `d:${top}`) ?? this.world.districts[0];\n const anchor = district ? { gx: district.cx, gy: district.cy } : { gx: this.forge.gx + 3, gy: this.forge.gy };\n const place: Place = { id: `p:${path}`, kind: kindOf(path), path, label: path.slice(path.lastIndexOf(\"/\") + 1), district: district?.id ?? \"\", gx: anchor.gx, gy: anchor.gy, footprint: 1, height: 1, score: 0, touched: true };\n this.places.set(place.id, place);\n this.byPath.set(path, place);\n if (place.kind === \"beacon\") this.beacons.push(place);\n this.emit(e, actor, { kind: \"raise\", target: place.id, newPlace: { path, label: place.label, kind: place.kind, district: place.district } }, 900);\n return place;\n }\n\n /** The beacon a test run belongs to: an explicitly touched test file, else the last-edited district's, else the first, else the forge. */\n private beaconFor(touched: string[]): Place {\n const t = touched.find((p) => isTestPath(p));\n if (t) { const b = this.byPath.get(t); if (b) return b; }\n if (this.lastEdited) {\n const same = this.beacons.find((b) => b.district === this.lastEdited!.district);\n if (same) return same;\n }\n return this.beacons[0] ?? this.forge;\n }\n}\n\n/** Convenience for replay: the whole timeline at once. */\nexport function direct(events: AgentEvent[], world: World, opts?: DirectorOptions): Beat[] {\n const d = new Director(world, opts);\n for (const e of events) d.feed(e);\n return [...d.timeline];\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n","import type { AgentEvent } from \"../events/types.js\";\nimport type { FileNode } from \"./types.js\";\n\n/**\n * When the repo is not on disk (replaying someone else's session, or the VS\n * Code webview has no fs), infer a file list from the events themselves.\n * Sizes are estimated from the lines the session touched.\n */\nexport function filesFromEvents(events: AgentEvent[]): { files: FileNode[]; touched: string[] } {\n const loc = new Map<string, number>();\n const bump = (p: string, n: number) => loc.set(p, (loc.get(p) ?? 0) + n);\n for (const e of events) {\n if (e.kind === \"read_file\") bump(e.path, Math.max(5, Math.round((e.bytes ?? 400) / 40)));\n else if (e.kind === \"edit_file\") bump(e.path, Math.max(5, (e.added + e.removed) * 3));\n else if (e.kind === \"write_file\") bump(e.path, Math.max(5, e.added * 2));\n else if (e.kind === \"run_command\") for (const p of e.touched) bump(p, 5);\n }\n const touched = [...loc.keys()].sort((a, b) => loc.get(b)! - loc.get(a)!);\n return { files: touched.map((path) => ({ path, loc: loc.get(path)! })), touched };\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** ~/.claude/projects/<slug>/<session>.jsonl — slug = cwd with every non-alphanumeric → '-'. */\nexport function projectSlug(cwd: string): string {\n return cwd.replace(/[^A-Za-z0-9]/g, \"-\");\n}\nexport function claudeConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n}\nexport interface SessionInfo { id: string; path: string; mtime: number; bytes: number; title: string }\n\n/** Sessions for a repo, newest first, with a human title from the transcript's own title rows (local picker only; never into events). */\nexport function listSessions(cwd: string, env: NodeJS.ProcessEnv = process.env): SessionInfo[] {\n const dir = join(claudeConfigDir(env), \"projects\", projectSlug(cwd));\n let names: string[] = [];\n try { names = readdirSync(dir).filter((f) => f.endsWith(\".jsonl\")); } catch { return []; }\n const out: SessionInfo[] = [];\n for (const f of names) {\n const path = join(dir, f);\n try {\n const st = statSync(path);\n out.push({ id: f.replace(/\\.jsonl$/, \"\"), path, mtime: st.mtimeMs, bytes: st.size, title: sessionTitle(path) });\n } catch { /* unreadable: skip */ }\n }\n return out.sort((a, b) => b.mtime - a.mtime);\n}\n\n/** Title = latest `aiTitle` row, else the latest `lastPrompt` row (trimmed), else the id. Reads at most the last 256 KB. */\nexport function sessionTitle(path: string): string {\n let text = \"\";\n try {\n const st = statSync(path);\n const fd = readFileSync(path);\n text = fd.subarray(Math.max(0, st.size - 262_144)).toString(\"utf8\");\n } catch { return \"\"; }\n let ai = \"\", prompt = \"\";\n for (const line of text.split(\"\\n\")) {\n if (!line.includes('\"aiTitle\"') && !line.includes('\"lastPrompt\"')) continue;\n try {\n const row = JSON.parse(line) as { aiTitle?: string; lastPrompt?: string };\n if (typeof row.aiTitle === \"string\" && row.aiTitle.trim()) ai = row.aiTitle.trim();\n if (typeof row.lastPrompt === \"string\" && row.lastPrompt.trim()) prompt = row.lastPrompt.trim();\n } catch { /* partial line */ }\n }\n const t = ai || prompt;\n return t.length > 80 ? t.slice(0, 77) + \"…\" : t;\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { isIgnoredPath, type FileNode } from \"@agent-theatre/core\";\n\n/** The repo's file tree as FileNodes. Counts lines only; never keeps contents. Bounded for huge repos. */\nexport function scanRepo(root: string, opts: { maxFiles?: number; maxBytesForLoc?: number } = {}): FileNode[] {\n const maxFiles = opts.maxFiles ?? 20_000, maxBytes = opts.maxBytesForLoc ?? 512_000;\n const files: FileNode[] = [];\n const walk = (dir: string): void => {\n if (files.length >= maxFiles) return;\n let ents: import(\"node:fs\").Dirent[];\n try { ents = readdirSync(dir, { withFileTypes: true }); } catch { return; }\n for (const ent of ents) {\n if (files.length >= maxFiles) return;\n const full = join(dir, ent.name);\n const rel = relative(root, full).replace(/\\\\/g, \"/\");\n if (isIgnoredPath(rel + (ent.isDirectory() ? \"/\" : \"\"))) continue;\n if (ent.isDirectory()) walk(full);\n else if (ent.isFile()) {\n let size = 0;\n try { size = statSync(full).size; } catch { continue; }\n let loc: number | undefined;\n if (size < maxBytes) { try { const buf = readFileSync(full); if (!buf.subarray(0, 1024).includes(0)) loc = buf.toString(\"utf8\").split(\"\\n\").length; } catch { /* unreadable */ } }\n files.push({ path: rel, size, ...(loc !== undefined ? { loc } : {}) });\n }\n }\n };\n walk(root);\n return files;\n}\n\n/** Stable repo identity: git remote URL when available, else the absolute path. */\nexport function repoIdFor(root: string): string {\n try {\n const cfg = readFileSync(join(root, \".git\", \"config\"), \"utf8\");\n const m = /\\[remote \"origin\"\\]\\s*\\n\\s*url\\s*=\\s*(\\S+)/.exec(cfg);\n if (m) return m[1]!.replace(/\\.git$/, \"\").replace(/^git@([^:]+):/, \"$1/\").replace(/^https?:\\/\\//, \"\");\n } catch { /* not a git repo */ }\n return root;\n}\n","import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { hasOurHooks, patchSettings, unpatchSettings } from \"./patch.js\";\nimport { HOOK_SCRIPT } from \"./script.js\";\n\nexport interface InstallPaths { settings: string; home: string; script: string; backup: string }\nexport function installPaths(env: NodeJS.ProcessEnv = process.env): InstallPaths {\n const claude = env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n const home = env.AGENT_THEATRE_HOME || join(homedir(), \".agent-theatre\");\n const settings = join(claude, \"settings.json\");\n return { settings, home, script: join(home, \"hooks\", \"agent-theatre-hook.mjs\"), backup: `${settings}.bak-agent-theatre` };\n}\nconst read = (p: string): string | null => (existsSync(p) ? readFileSync(p, \"utf8\") : null);\n\n/** Writes the hook script, then merges our entries into settings.json (backup first). Idempotent. */\nexport function installHooks(paths = installPaths()): { changed: boolean; backup: string | null } {\n mkdirSync(join(paths.home, \"hooks\"), { recursive: true });\n writeFileSync(paths.script, HOOK_SCRIPT, { mode: 0o755 });\n chmodSync(paths.script, 0o755);\n const existing = read(paths.settings);\n const { next, changed } = patchSettings(existing, paths.script);\n let backup: string | null = null;\n if (changed) {\n if (existing !== null) { copyFileSync(paths.settings, paths.backup); backup = paths.backup; }\n mkdirSync(join(paths.settings, \"..\"), { recursive: true });\n writeFileSync(paths.settings, next);\n }\n return { changed, backup };\n}\n\n/** Removes only our entries. Leaves the backup file in place for the user. */\nexport function uninstallHooks(paths = installPaths()): { changed: boolean } {\n const existing = read(paths.settings);\n if (existing === null) return { changed: false };\n const { next, changed } = unpatchSettings(existing);\n if (changed) { copyFileSync(paths.settings, paths.backup); writeFileSync(paths.settings, next); }\n return { changed };\n}\n\nexport function hooksStatus(paths = installPaths()): { installed: boolean; scriptPresent: boolean; settings: string } {\n return { installed: hasOurHooks(read(paths.settings)), scriptPresent: existsSync(paths.script), settings: paths.settings };\n}\n","/**\n * Non-destructive edits to ~/.claude/settings.json. Pure text → text so it is\n * trivially testable; the caller handles files and backups.\n *\n * // suite: candidate for shared package (Debug Anything has the same shape)\n */\nexport const HOOK_MARKER = \"agent-theatre-hook.mjs\";\n/** Events we observe. No matcher on PostToolUse: every tool is a beat. */\nexport const HOOK_EVENTS: ReadonlyArray<{ event: string; matcher?: string }> = [\n { event: \"SessionStart\" },\n { event: \"PostToolUse\" },\n { event: \"PostToolUseFailure\" },\n { event: \"SubagentStart\" },\n { event: \"SubagentStop\" },\n { event: \"Notification\" },\n { event: \"Stop\" },\n { event: \"SessionEnd\" },\n];\nexport const HOOK_TIMEOUT_S = 5;\n\ntype Settings = Record<string, unknown> & { hooks?: Record<string, unknown[]> };\n\nfunction parse(existing: string | null): Settings {\n if (existing === null || existing.trim() === \"\") return {};\n try {\n const obj = JSON.parse(existing);\n if (!obj || typeof obj !== \"object\" || Array.isArray(obj)) throw new Error(\"not an object\");\n return obj as Settings;\n } catch {\n throw new Error(\"existing settings.json is not valid JSON; refusing to overwrite it\");\n }\n}\nconst isOurs = (group: unknown): boolean => {\n const g = group as { hooks?: Array<{ command?: unknown }> };\n return Array.isArray(g?.hooks) && g.hooks.some((h) => typeof h?.command === \"string\" && h.command.includes(HOOK_MARKER));\n};\n\nexport function patchSettings(existing: string | null, scriptPath: string): { next: string; changed: boolean } {\n const obj = parse(existing);\n const hooks = (obj.hooks ??= {});\n const cmd = `node \"${scriptPath}\"`;\n let changed = false;\n for (const { event, matcher } of HOOK_EVENTS) {\n const list = (hooks[event] ??= []);\n const mine = list.find(isOurs) as { hooks: Array<{ command: string; timeout?: number }> } | undefined;\n if (mine) {\n // keep the path current if the install location moved\n for (const h of mine.hooks) if (h.command.includes(HOOK_MARKER) && h.command !== cmd) { h.command = cmd; changed = true; }\n continue;\n }\n list.push({ ...(matcher ? { matcher } : {}), hooks: [{ type: \"command\", command: cmd, timeout: HOOK_TIMEOUT_S }] });\n changed = true;\n }\n return { next: JSON.stringify(obj, null, 2) + \"\\n\", changed };\n}\n\nexport function unpatchSettings(existing: string | null): { next: string; changed: boolean } {\n const obj = parse(existing);\n let changed = false;\n const hooks = obj.hooks;\n if (hooks) {\n for (const event of Object.keys(hooks)) {\n const list = hooks[event];\n if (!Array.isArray(list)) continue;\n const kept = list.filter((g) => !isOurs(g));\n if (kept.length !== list.length) changed = true;\n if (kept.length) hooks[event] = kept;\n else delete hooks[event];\n }\n if (Object.keys(hooks).length === 0) delete obj.hooks;\n }\n return { next: JSON.stringify(obj, null, 2) + \"\\n\", changed };\n}\n\nexport function hasOurHooks(existing: string | null): boolean {\n try {\n const obj = parse(existing);\n return Object.values(obj.hooks ?? {}).some((l) => Array.isArray(l) && l.some(isOurs));\n } catch {\n return false;\n }\n}\n","/**\n * The hook script Claude Code runs on every event. Dependency-free, starts in\n * ~40 ms, and can NEVER slow or block the agent: a dead server, a missing\n * port file, bad JSON — all exit 0 silently within 300 ms. It never writes to\n * stdout, so it can never inject context or block a tool.\n *\n * hooks/agent-theatre-hook.mjs must be byte-identical (tests/script.test.ts).\n */\nexport const HOOK_SCRIPT = `#!/usr/bin/env node\n// Agent Theatre hook — forwards Claude Code events to the local theatre. Never blocks the agent.\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nconst portFile = join(process.env.AGENT_THEATRE_HOME || join(homedir(), \".agent-theatre\"), \"port\");\nlet port = 0;\ntry { port = parseInt(readFileSync(portFile, \"utf8\").trim(), 10); } catch { process.exit(0); }\nif (!port) process.exit(0);\nlet body = \"\";\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (c) => { body += c; if (body.length > 2_000_000) body = body.slice(0, 2_000_000); });\nprocess.stdin.on(\"end\", async () => {\n try {\n await fetch(\\`http://127.0.0.1:\\${port}/hook\\`, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body, signal: AbortSignal.timeout(300) });\n } catch { /* theatre not running or slow: that is fine */ }\n process.exit(0);\n});\nsetTimeout(() => process.exit(0), 600).unref();\n`;\n"],"mappings":"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","names":["existsSync","readFileSync","join","readFileSync","homedir","join","basename","base","obj","str","blocks","pkg","norm","homedir","readFileSync","join","basename","norm","readdirSync","readFileSync","statSync","join","readdirSync","join","statSync","readFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","obj","hooks","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","readFileSync","join","existsSync","pick"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../../core/src/events/guards.ts","../../core/src/events/ids.ts","../../core/src/adapters/paths.ts","../../core/src/adapters/bash-intent.ts","../../core/src/adapters/test-summary.ts","../../core/src/adapters/tool-call.ts","../../core/src/director/claims.ts","../../core/src/adapters/transcript.ts","../../core/src/adapters/hook.ts","../../core/src/privacy/leaks.ts","../../core/src/world/prng.ts","../../core/src/world/relevance.ts","../../core/src/world/profile.ts","../../core/src/world/generate.ts","../../core/src/world/ascii.ts","../../core/src/director/mood.ts","../../core/src/director/direct.ts","../../core/src/world/from-events.ts","../src/sessions.ts","../src/scan.ts","../src/hooks/install.ts","../src/hooks/patch.ts","../src/hooks/script.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { Theatre } from \"./server.js\";\nimport { repoIdFor, scanRepo } from \"./scan.js\";\nimport { listSessions } from \"./sessions.js\";\nimport { hooksStatus, installHooks, uninstallHooks } from \"./hooks/install.js\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf8\")) as { version: string };\nconst webDir = [join(here, \"..\", \"web\"), join(here, \"..\", \"..\", \"web\", \"dist\")].find((d) => existsSync(join(d, \"index.html\")));\n\nasync function openBrowser(url: string): Promise<void> {\n try { const { default: open } = await import(\"open\"); await open(url); } catch { /* print the URL instead */ }\n}\n\nconst program = new Command().name(\"agent-theatre\").description(\"Watch your coding agent work — as a film, not a log.\").version(pkg.version);\n\nprogram\n .option(\"-p, --port <n>\", \"port to listen on (default: a free one)\", \"0\")\n .option(\"--no-open\", \"don't open the browser\")\n .option(\"--set <id>\", \"stage set: island | orbit | metropolis\")\n .action(async (o: { port: string; open: boolean; set?: string }) => {\n const cwd = process.cwd();\n const st = hooksStatus();\n if (!st.installed) console.log(pc.yellow(\"Hooks are not installed — the scene will stay empty until you run:\"), pc.bold(\"agent-theatre hooks install\"));\n const files = scanRepo(cwd);\n const theatre = new Theatre({ cwd, repoId: repoIdFor(cwd), files, ...(webDir ? { webDir } : {}) });\n await theatre.listen(Number(o.port) || 0);\n const url = `${theatre.url}?live=1${o.set ? `&set=${o.set}` : \"\"}`;\n console.log(`${pc.bold(\"Agent Theatre\")} · ${pc.dim(theatre.name)} · ${files.length} files`);\n console.log(`${pc.green(\"▶\")} ${url}`);\n if (!webDir) console.log(pc.yellow(\"web bundle not found — API only. Run `pnpm -F @agent-theatre/web build` or use the Vite dev server with a proxy.\"));\n if (o.open) await openBrowser(url);\n const bye = async () => { await theatre.close(); process.exit(0); };\n process.on(\"SIGINT\", bye); process.on(\"SIGTERM\", bye);\n });\n\nprogram\n .command(\"replay [session]\")\n .description(\"replay a past Claude Code session for this repo (default: pick from a list)\")\n .option(\"--latest\", \"replay the newest session without asking\")\n .option(\"--no-open\", \"don't open the browser\")\n .option(\"--set <id>\", \"stage set\")\n .action(async (session: string | undefined, o: { latest?: boolean; open: boolean; set?: string }) => {\n const cwd = process.cwd();\n const sessions = listSessions(cwd);\n if (!sessions.length) { console.log(pc.yellow(`No Claude Code sessions found for ${cwd}.`)); process.exit(1); }\n let id = session;\n if (!id && (o.latest || !process.stdin.isTTY)) id = sessions[0]!.id;\n if (!id) {\n console.log(pc.bold(\"Sessions for this repo, newest first:\\n\"));\n sessions.slice(0, 15).forEach((s, i) => console.log(` ${pc.dim(String(i + 1).padStart(2))} ${new Date(s.mtime).toLocaleString()} ${pc.dim((s.bytes / 1024).toFixed(0).padStart(6) + \" KB\")} ${s.title || pc.dim(s.id)}`));\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ans = (await rl.question(`\\nWhich one? [1] `)).trim() || \"1\";\n rl.close();\n const pick = sessions[Math.max(0, Math.min(sessions.length - 1, (parseInt(ans, 10) || 1) - 1))]!;\n id = pick.id;\n }\n const found = sessions.find((s) => s.id === id || s.id.startsWith(id!));\n if (!found) { console.log(pc.red(`No session ${id}`)); process.exit(1); }\n const files = scanRepo(cwd);\n const theatre = new Theatre({ cwd, repoId: repoIdFor(cwd), files, ...(webDir ? { webDir } : {}) });\n await theatre.listen(0);\n const url = `${theatre.url}?session=${found.id}${o.set ? `&set=${o.set}` : \"\"}`;\n console.log(`${pc.bold(\"Agent Theatre\")} · replay · ${found.title || found.id}`);\n console.log(`${pc.green(\"▶\")} ${url}`);\n if (o.open) await openBrowser(url);\n const bye = async () => { await theatre.close(); process.exit(0); };\n process.on(\"SIGINT\", bye); process.on(\"SIGTERM\", bye);\n });\n\nconst hooks = program.command(\"hooks\").description(\"install, remove or inspect the Claude Code hooks\");\nhooks.command(\"install\").description(\"merge our hooks into ~/.claude/settings.json (backup kept, nothing else touched)\").action(() => {\n const r = installHooks();\n console.log(r.changed ? pc.green(\"Hooks installed.\") : pc.dim(\"Hooks were already installed.\"), r.backup ? pc.dim(`backup: ${r.backup}`) : \"\");\n console.log(pc.dim(\"Claude Code picks up settings changes automatically; no restart needed.\"));\n});\nhooks.command(\"uninstall\").description(\"remove only our hook entries\").action(() => {\n const r = uninstallHooks();\n console.log(r.changed ? pc.green(\"Hooks removed.\") : pc.dim(\"Nothing to remove.\"));\n});\nhooks.command(\"status\").action(() => {\n const s = hooksStatus();\n console.log(`settings: ${s.settings}\\ninstalled: ${s.installed ? pc.green(\"yes\") : pc.yellow(\"no\")}\\nscript present: ${s.scriptPresent ? \"yes\" : \"no\"}`);\n});\n\nprogram.parseAsync(process.argv).catch((err) => { console.error(pc.red(String(err?.message ?? err))); process.exit(1); });\n","import { createServer, type Server } from \"node:http\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, basename, resolve, sep } from \"node:path\";\nimport { Hono } from \"hono\";\nimport { getRequestListener } from \"@hono/node-server\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\nimport { Director, direct, filesFromEvents, generateWorld, hookPayloadToEvents, parseTranscript, type AgentEvent, type Beat, type FileNode, type World } from \"@agent-theatre/core\";\nimport { listSessions } from \"./sessions.js\";\n\nexport interface TheatreOptions {\n cwd: string;\n repoId: string;\n files: FileNode[];\n /** Directory of the built web bundle (index.html + assets). Optional in tests. */\n webDir?: string;\n /** Where to write the port file. Default ~/.agent-theatre */\n home?: string;\n /** No hook events for this long while a session is open → \"lost\" signal. */\n lostAfterMs?: number;\n}\n\ninterface Live { world: World; director: Director; events: AgentEvent[]; beats: Beat[]; lastEventAt: number; sessionOpen: boolean }\n\n/**\n * The local theatre. Loopback only. Receives hook payloads, directs them into\n * beats, and streams events + beats to the browser. Serves the web bundle and\n * replay payloads. Never logs or forwards tool input/output: the hook payload\n * is reduced to AgentEvents at the door and discarded.\n */\nexport class Theatre {\n readonly app = new Hono();\n private server: Server | null = null;\n private wss: WebSocketServer | null = null;\n private live: Live;\n private signal: \"ok\" | \"lost\" = \"ok\";\n private timer: NodeJS.Timeout | null = null;\n port = 0;\n\n constructor(private readonly opts: TheatreOptions) {\n const world = generateWorld({ repoId: opts.repoId, files: opts.files });\n this.live = { world, director: new Director(world), events: [], beats: [], lastEventAt: 0, sessionOpen: false };\n this.routes();\n }\n\n private routes(): void {\n const a = this.app;\n a.post(\"/hook\", async (c) => {\n let payload: unknown;\n try { payload = await c.req.json(); } catch { return c.body(null, 204); }\n // hooks are global to Claude Code: only this repo's sessions belong on this stage\n const cwd = typeof (payload as { cwd?: unknown })?.cwd === \"string\" ? (payload as { cwd: string }).cwd : \"\";\n if (cwd && !isWithin(cwd, this.opts.cwd)) return c.body(null, 204);\n const { events } = hookPayloadToEvents(payload, { home: homedir() });\n if (events.length) this.ingest(events);\n return c.body(null, 204);\n });\n a.use(\"/api/*\", async (c, next) => { await next(); c.header(\"access-control-allow-origin\", \"*\"); });\n a.options(\"/api/*\", (c) => c.body(null, 204, { \"access-control-allow-origin\": \"*\", \"access-control-allow-headers\": \"content-type\" }));\n a.get(\"/api/scene\", (c) => c.json({ mode: \"live\", repoId: this.opts.repoId, world: this.live.world, events: this.live.events, beats: this.live.beats, signal: this.signal }));\n a.get(\"/api/sessions\", (c) => c.json(listSessions(this.opts.cwd).map((s) => ({ id: s.id, title: s.title, mtime: s.mtime, bytes: s.bytes }))));\n a.get(\"/api/replay/:id\", (c) => {\n const id = c.req.param(\"id\");\n const s = listSessions(this.opts.cwd).find((x) => x.id === id);\n if (!s) return c.json({ error: \"no such session\" }, 404);\n const { events, warnings } = parseTranscript(readFileSync(s.path, \"utf8\"), { home: homedir() });\n const inferred = filesFromEvents(events);\n const known = new Set(this.opts.files.map((f) => f.path));\n const files = [...this.opts.files, ...inferred.files.filter((f) => !known.has(f.path))];\n const world = generateWorld({ repoId: this.opts.repoId, files, touched: inferred.touched });\n const beats = direct(events, world);\n return c.json({ mode: \"replay\", repoId: this.opts.repoId, title: s.title, world, events, beats, warnings: warnings.length });\n });\n a.get(\"/healthz\", (c) => c.json({ ok: true, port: this.port, events: this.live.events.length }));\n if (this.opts.webDir) {\n const dir = this.opts.webDir;\n a.get(\"/*\", (c) => {\n const p = c.req.path === \"/\" ? \"/index.html\" : c.req.path;\n const file = join(dir, p);\n if (!file.startsWith(dir) || !existsSync(file)) return c.text(\"not found\", 404);\n const ext = p.slice(p.lastIndexOf(\".\") + 1);\n const type: Record<string, string> = { html: \"text/html; charset=utf-8\", js: \"text/javascript\", css: \"text/css\", json: \"application/json\", jsonl: \"application/x-ndjson\", svg: \"image/svg+xml\", png: \"image/png\", woff2: \"font/woff2\", webp: \"image/webp\" };\n return c.body(readFileSync(file), 200, { \"content-type\": type[ext] ?? \"application/octet-stream\", \"cache-control\": p.includes(\"/assets/\") ? \"public, max-age=31536000, immutable\" : \"no-cache\" });\n });\n }\n }\n\n /** Append events to the live session, direct them, and broadcast. */\n ingest(events: AgentEvent[]): Beat[] {\n const l = this.live;\n const out: Beat[] = [];\n for (const e of events) {\n if (e.kind === \"session_start\") l.sessionOpen = true;\n if (e.kind === \"session_end\") l.sessionOpen = false;\n l.events.push(e);\n out.push(...l.director.feed(e));\n }\n l.beats.push(...out);\n l.lastEventAt = Date.now();\n if (this.signal !== \"ok\") { this.signal = \"ok\"; this.broadcast({ type: \"signal\", state: \"ok\" }); }\n this.broadcast({ type: \"beats\", beats: out, events });\n return out;\n }\n\n private broadcast(msg: unknown): void {\n const data = JSON.stringify(msg);\n for (const ws of this.wss?.clients ?? []) if (ws.readyState === 1) ws.send(data);\n }\n\n async listen(port = 0): Promise<number> {\n const listener = getRequestListener(this.app.fetch);\n this.server = createServer(listener);\n this.wss = new WebSocketServer({ noServer: true });\n this.server.on(\"upgrade\", (req, socket, head) => {\n if (req.url?.startsWith(\"/live\")) this.wss!.handleUpgrade(req, socket, head, (ws: WebSocket) => { this.wss!.emit(\"connection\", ws, req); ws.send(JSON.stringify({ type: \"hello\", signal: this.signal })); });\n else socket.destroy();\n });\n await new Promise<void>((res) => this.server!.listen(port, \"127.0.0.1\", res));\n const addr = this.server.address();\n this.port = typeof addr === \"object\" && addr ? addr.port : port;\n const home = this.opts.home ?? join(homedir(), \".agent-theatre\");\n mkdirSync(home, { recursive: true });\n writeFileSync(join(home, \"port\"), String(this.port));\n const lostAfter = this.opts.lostAfterMs ?? 90_000;\n this.timer = setInterval(() => {\n const l = this.live;\n if (l.sessionOpen && l.lastEventAt && Date.now() - l.lastEventAt > lostAfter && this.signal === \"ok\") { this.signal = \"lost\"; this.broadcast({ type: \"signal\", state: \"lost\" }); }\n }, 5_000);\n this.timer.unref();\n return this.port;\n }\n\n async close(): Promise<void> {\n if (this.timer) clearInterval(this.timer);\n const home = this.opts.home ?? join(homedir(), \".agent-theatre\");\n try { if (readFileSync(join(home, \"port\"), \"utf8\").trim() === String(this.port)) rmSync(join(home, \"port\")); } catch { /* already gone */ }\n for (const ws of this.wss?.clients ?? []) ws.close();\n this.wss?.close();\n await new Promise<void>((res) => (this.server ? this.server.close(() => res()) : res()));\n }\n\n get url(): string { return `http://127.0.0.1:${this.port}/`; }\n get name(): string { return basename(this.opts.cwd); }\n}\n\n/** True when `dir` is `root` or inside it (symlinks resolved when they exist). */\nexport function isWithin(dir: string, root: string): boolean {\n const norm = (p: string) => { try { return realpathSync(p); } catch { return resolve(p); } };\n const d = norm(dir), r = norm(root);\n return d === r || d.startsWith(r.endsWith(sep) ? r : r + sep);\n}\n","import type { AgentEvent, AgentEventKind } from \"./types.js\";\n\nconst KINDS: ReadonlySet<string> = new Set<AgentEventKind>([\n \"session_start\",\n \"read_file\",\n \"edit_file\",\n \"write_file\",\n \"run_command\",\n \"test_result\",\n \"search\",\n \"subagent_start\",\n \"subagent_stop\",\n \"waiting_for_user\",\n \"turn_end\",\n \"error\",\n \"session_end\",\n]);\n\nexport function isAgentEvent(x: unknown): x is AgentEvent {\n if (!x || typeof x !== \"object\") return false;\n const e = x as Record<string, unknown>;\n return (\n typeof e.id === \"string\" &&\n typeof e.seq === \"number\" &&\n typeof e.ts === \"number\" &&\n typeof e.sessionId === \"string\" &&\n typeof e.kind === \"string\" &&\n KINDS.has(e.kind)\n );\n}\n","/**\n * Tiny monotonic id for events that have no natural id (hook-minted events).\n * Not a full ULID — just time-ordered and unique within a process, with no\n * dependency on node:crypto so core stays runtime-neutral.\n */\nlet last = 0;\nlet counter = 0;\nconst ALPHA = \"0123456789abcdefghjkmnpqrstvwxyz\";\n\nexport function mintId(now: number = Date.now()): string {\n if (now === last) counter++;\n else {\n last = now;\n counter = 0;\n }\n let t = now;\n let s = \"\";\n for (let i = 0; i < 10; i++) {\n s = ALPHA[t % 32] + s;\n t = Math.floor(t / 32);\n }\n return `ev_${s}${counter.toString(32).padStart(3, \"0\")}`;\n}\n","/**\n * Path redaction. Repo-relative when inside the repo; home-relative (~/…)\n * when inside the home directory (so a username never leaves the machine);\n * otherwise only the basename, prefixed so it is recognisably external.\n */\nexport interface PathContext {\n cwd: string;\n home?: string;\n}\n\nfunction norm(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nexport function relativizePath(abs: string, ctx: PathContext): string {\n const p = norm(abs);\n const cwd = norm(ctx.cwd);\n if (cwd && (p === cwd || p.startsWith(cwd + \"/\"))) return p.slice(cwd.length + 1) || \".\";\n if (ctx.home) {\n const home = norm(ctx.home);\n if (home && (p === home || p.startsWith(home + \"/\"))) return \"~/\" + p.slice(home.length + 1);\n }\n if (!p.startsWith(\"/\")) return p; // already relative\n const base = p.slice(p.lastIndexOf(\"/\") + 1);\n return `//ext/${base}`;\n}\n\nexport function basename(p: string): string {\n const n = norm(p);\n return n.slice(n.lastIndexOf(\"/\") + 1);\n}\n\nexport function isTestPath(p: string): boolean {\n return /(^|\\/)(tests?|__tests__|spec|specs)\\//i.test(p) || /\\.(test|spec)\\.[cm]?[jt]sx?$/i.test(p) || /(^|\\/)test_[^/]+\\.py$/i.test(p) || /_test\\.(go|rs|py)$/i.test(p);\n}\n","import type { CommandIntent } from \"../events/types.js\";\n\n/**\n * Classify a shell command and extract the files it writes or reads, from the\n * command text alone. The text itself never leaves this function.\n *\n * Extraction is deliberately conservative: a missed target degrades to a\n * forge beat; a wrong target would send Pip to the wrong building.\n */\nexport interface BashIntent {\n argv0: string;\n intent: CommandIntent;\n /** Files the command writes (redirect/tee/sed -i/cp/mv destinations/heredoc targets). */\n writes: string[];\n /** Files the command reads (cat/head/tail/less/sed -n first arg). */\n reads: string[];\n}\n\nconst TEST_RUNNERS = /\\b(vitest|jest|mocha|pytest|py\\.test|go\\s+test|cargo\\s+test|npm\\s+test|pnpm\\s+test|yarn\\s+test|bun\\s+test|npx\\s+(vitest|jest|playwright)|rspec|phpunit|dotnet\\s+test|mvn\\s+test|gradle\\s+test|make\\s+test)\\b/;\nconst BUILD = /\\b(tsc|tsup|vite\\s+build|webpack|esbuild|rollup|next\\s+build|cargo\\s+build|go\\s+build|make\\b(?!\\s+test)|npm\\s+run\\s+build|pnpm\\s+(run\\s+)?build|yarn\\s+build|gradle\\s+build|mvn\\s+package|docker\\s+build)\\b/;\nconst INSTALL = /\\b(npm\\s+(i|install|ci)|pnpm\\s+(i|install|add)|yarn(\\s+add|\\s+install)?|pip3?\\s+install|poetry\\s+(add|install)|cargo\\s+add|go\\s+get|brew\\s+install|apt(-get)?\\s+install|bun\\s+(i|install|add))\\b/;\nconst SEARCH = /\\b(grep|rg|ag|ack|find|fd|locate)\\b/;\nconst READ = /^\\s*(cat|head|tail|less|more|bat|wc|stat|jq)\\b/;\n\n/** First word of the first simple command, after env assignments and cd. */\nexport function argv0Of(command: string): string {\n const first = command.split(/\\s*(?:&&|\\|\\||;|\\|)\\s*/)[0] ?? \"\";\n const toks = first.trim().split(/\\s+/).map((t) => t.replace(/^[({]+/, \"\")).filter(Boolean);\n let i = 0;\n while (i < toks.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(toks[i]!)) i++;\n if (toks[i] === \"cd\" && toks.length > i + 1) {\n // `cd x && real` — argv0 is the real command, found in the next segment\n const rest = command.split(/\\s*&&\\s*/)[1];\n if (rest) return argv0Of(rest);\n }\n const a = toks[i] ?? \"\";\n return a.replace(/^.*\\//, \"\").slice(0, 40) || \"sh\";\n}\n\nfunction cleanTarget(t: string): string | null {\n const s = t.replace(/^[\"']|[\"']$/g, \"\").trim();\n if (!s || s.startsWith(\"-\") || s === \"/dev/null\" || s.includes(\"$(\") || s.startsWith(\"$\")) return null;\n if (/^\\/dev\\//.test(s) || /^&\\d/.test(s)) return null;\n return s;\n}\n\nexport function extractWrites(command: string): string[] {\n const out = new Set<string>();\n // Redirections: > file, >> file, 1> file, 2>file is stderr (still a write target)\n for (const m of command.matchAll(/(?:^|[\\s)])\\d?>{1,2}\\s*([^\\s|&;<>]+)/g)) {\n const t = cleanTarget(m[1] ?? \"\");\n if (t) out.add(t);\n }\n // tee [-a] file...\n for (const m of command.matchAll(/\\btee\\s+(?:-[a-z]+\\s+)*((?:[^\\s|&;<>]+\\s*)+)/g)) {\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n // sed -i[.bak] [expr] file... (last non-flag, non-expression token is the file)\n for (const m of command.matchAll(/\\bsed\\s+-i\\S*\\s+(.+?)(?=\\s*(?:&&|\\|\\||;|\\||$))/g)) {\n const toks = (m[1] ?? \"\").match(/\"[^\"]*\"|'[^']*'|\\S+/g) ?? [];\n const files = toks.filter((t) => !t.startsWith(\"-\") && !t.startsWith(\"'\") && !t.startsWith('\"') && !/^s[/|#]/.test(t) && !/^-e$/.test(t));\n for (const f of files) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n // cp/mv src dest (dest = last token)\n for (const m of command.matchAll(/\\b(?:cp|mv)\\s+(?:-[a-zA-Z]+\\s+)*((?:[^\\s|&;<>]+\\s+)+)([^\\s|&;<>]+)/g)) {\n const t = cleanTarget(m[2] ?? \"\");\n if (t) out.add(t);\n }\n // touch/mkdir -p are creations too\n for (const m of command.matchAll(/\\btouch\\s+((?:[^\\s|&;<>]+\\s*)+)/g)) {\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t) out.add(t);\n }\n }\n return [...out];\n}\n\nexport function extractReads(command: string): string[] {\n const out = new Set<string>();\n for (const seg of command.split(/\\s*(?:&&|\\|\\||;|\\|)\\s*/)) {\n const m = seg.match(/^\\s*(?:cat|head|tail|less|more|bat|wc)\\s+(?:-[^\\s]+\\s+)*((?:[^\\s|&;<>]+\\s*)+)/);\n if (!m) continue;\n for (const f of (m[1] ?? \"\").split(/\\s+/)) {\n const t = cleanTarget(f);\n if (t && !/^\\d+$/.test(t)) out.add(t);\n }\n }\n return [...out];\n}\n\nexport function classifyBash(command: string): BashIntent {\n const argv0 = argv0Of(command);\n const writes = extractWrites(command);\n const reads = extractReads(command);\n let intent: CommandIntent = \"other\";\n if (TEST_RUNNERS.test(command)) intent = \"test\";\n else if (BUILD.test(command)) intent = \"build\";\n else if (INSTALL.test(command)) intent = \"install\";\n else if (/^\\s*git\\b/.test(command) || argv0 === \"git\" || argv0 === \"gh\") intent = \"git\";\n else if (writes.length) intent = \"write_file\";\n else if (SEARCH.test(command) && argv0 !== \"cd\") intent = \"search\";\n else if (READ.test(command) && reads.length) intent = \"read_file\";\n return { argv0, intent, writes, reads };\n}\n","/**\n * Parse test-runner summary lines out of command output. Heuristic by nature;\n * an unrecognised runner yields null and the caller falls back to exit status.\n * Only counts leave this function — never the output text.\n */\nexport interface TestSummary {\n passed: number;\n failed: number;\n skipped?: number;\n framework: string;\n}\n\nconst num = (s: string | undefined) => (s ? parseInt(s, 10) : 0);\n\nexport function parseTestSummary(output: string): TestSummary | null {\n const tail = output.length > 20_000 ? output.slice(-20_000) : output;\n\n // vitest: \"Tests 3 failed | 21 passed | 2 skipped (26)\" or \"Tests 24 passed (24)\"\n let m = tail.match(/Tests\\s+(?:(\\d+)\\s+failed\\s*\\|\\s*)?(\\d+)\\s+passed(?:\\s*\\|\\s*(\\d+)\\s+skipped)?/);\n if (m) return { failed: num(m[1]), passed: num(m[2]), ...(m[3] ? { skipped: num(m[3]) } : {}), framework: \"vitest\" };\n m = tail.match(/Tests\\s+(\\d+)\\s+failed\\s*\\((\\d+)\\)/);\n if (m) return { failed: num(m[1]), passed: Math.max(0, num(m[2]) - num(m[1])), framework: \"vitest\" };\n\n // jest: \"Tests: 2 failed, 22 passed, 1 skipped, 25 total\"\n m = tail.match(/Tests:\\s+(?:(\\d+)\\s+failed,\\s*)?(?:(\\d+)\\s+skipped,\\s*)?(\\d+)\\s+passed,\\s*(?:(\\d+)\\s+skipped,\\s*)?\\d+\\s+total/);\n if (m) return { failed: num(m[1]), passed: num(m[3]), ...((m[2] ?? m[4]) ? { skipped: num(m[2] ?? m[4]) } : {}), framework: \"jest\" };\n m = tail.match(/Tests:\\s+(\\d+)\\s+failed,\\s*\\d+\\s+total/);\n if (m) return { failed: num(m[1]), passed: 0, framework: \"jest\" };\n\n // pytest: \"==== 2 failed, 22 passed, 1 skipped in 1.23s ====\" / \"==== 24 passed in 0.5s ====\"\n m = tail.match(/=+\\s*(?:(\\d+)\\s+failed,?\\s*)?(?:(\\d+)\\s+passed,?\\s*)?(?:(\\d+)\\s+skipped,?\\s*)?(?:\\d+\\s+(?:error|errors|warnings?|deselected|xfailed|xpassed),?\\s*)*in\\s+[\\d.]+s/);\n if (m && (m[1] || m[2])) return { failed: num(m[1]), passed: num(m[2]), ...(m[3] ? { skipped: num(m[3]) } : {}), framework: \"pytest\" };\n\n // go test: \"ok pkg 0.12s\" lines and \"--- FAIL:\" lines; summary \"FAIL\" / \"PASS\"\n if (/^--- (?:PASS|FAIL):/m.test(tail) || /^(?:ok|FAIL)\\s+\\S+\\s+(?:[\\d.]+s|\\(cached\\))/m.test(tail)) {\n const failed = (tail.match(/^--- FAIL:/gm) ?? []).length || (tail.match(/^FAIL\\s+\\S+\\s+[\\d.]+s/gm) ?? []).length;\n const passed = (tail.match(/^--- PASS:/gm) ?? []).length || (tail.match(/^ok\\s+\\S+/gm) ?? []).length;\n return { failed, passed, framework: \"go\" };\n }\n\n // cargo test: \"test result: ok. 24 passed; 0 failed; 1 ignored\"\n m = tail.match(/test result:\\s*\\w+\\.\\s*(\\d+)\\s+passed;\\s*(\\d+)\\s+failed;\\s*(\\d+)\\s+ignored/);\n if (m) return { passed: num(m[1]), failed: num(m[2]), skipped: num(m[3]), framework: \"cargo\" };\n\n // mocha: \" 24 passing (1s)\" / \" 2 failing\"\n const mp = tail.match(/^\\s*(\\d+)\\s+passing\\b/m);\n const mf = tail.match(/^\\s*(\\d+)\\s+failing\\b/m);\n if (mp || mf) {\n const ms = tail.match(/^\\s*(\\d+)\\s+pending\\b/m);\n return { passed: num(mp?.[1]), failed: num(mf?.[1]), ...(ms ? { skipped: num(ms[1]) } : {}), framework: \"mocha\" };\n }\n\n // playwright: \" 24 passed (12s)\" / \" 2 failed\"\n const pp = tail.match(/^\\s*(\\d+)\\s+passed\\s*\\(/m);\n const pf = tail.match(/^\\s*(\\d+)\\s+failed\\b/m);\n if (pp || pf) return { passed: num(pp?.[1]), failed: num(pf?.[1]), framework: \"playwright\" };\n\n return null;\n}\n","import type { AdapterWarning, AgentEventBody } from \"../events/types.js\";\nimport { classifyBash } from \"./bash-intent.js\";\nimport { relativizePath, type PathContext } from \"./paths.js\";\nimport { parseTestSummary } from \"./test-summary.js\";\n\n/**\n * One tool invocation as seen by either adapter. `response` is the raw tool\n * result (transcript `toolUseResult` or hook `tool_response`); it is inspected\n * for counts and flags and never retained.\n */\nexport interface ToolCall {\n name: string;\n input: unknown;\n response?: unknown;\n isError?: boolean;\n durationMs?: number;\n}\n\nexport interface ToolCallOutcome {\n bodies: AgentEventBody[];\n /** Set when the tool spawned a subagent that has not finished yet. */\n pendingSubagent?: { childId: string };\n warning?: AdapterWarning;\n}\n\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\nconst lineCount = (s: string | undefined): number => (s ? (s.match(/\\n/g)?.length ?? 0) + (s.endsWith(\"\\n\") ? 0 : 1) : 0);\n\nfunction patchCounts(response: unknown): { added: number; removed: number; hunks: number } | null {\n const patch = obj(response).structuredPatch;\n if (!Array.isArray(patch)) return null;\n let added = 0,\n removed = 0;\n for (const h of patch) {\n const lines = obj(h).lines;\n if (!Array.isArray(lines)) continue;\n for (const l of lines) {\n if (typeof l !== \"string\") continue;\n if (l.startsWith(\"+\")) added++;\n else if (l.startsWith(\"-\")) removed++;\n }\n }\n return { added, removed, hunks: patch.length };\n}\n\nfunction responseText(response: unknown): string {\n if (typeof response === \"string\") return response;\n const r = obj(response);\n const parts = [str(r.stdout), str(r.stderr), str(r.output)].filter((x): x is string => !!x);\n if (parts.length) return parts.join(\"\\n\");\n if (Array.isArray(response)) return response.map((b) => str(obj(b).text) ?? \"\").join(\"\\n\");\n return \"\";\n}\n\n/** Number of body lines written by heredocs in a command (counts only; the body is never kept). */\nfunction heredocLines(command: string): number {\n let n = 0;\n for (const m of command.matchAll(/<<-?\\s*(['\"]?)(\\w+)\\1[^\\n]*\\n([\\s\\S]*?)\\n\\2(?=\\n|$)/g)) n += lineCount(m[3]);\n if (n === 0 && /(?:^|[\\s)])\\d?>{1,2}\\s*[^\\s|&;<>]+/.test(command) && !/>\\s*\\/dev\\/null/.test(command)) n = 1;\n return n;\n}\n\nconst SEARCH_TOOLS_REPO = new Set([\"Grep\", \"Glob\", \"LS\", \"ToolSearch\"]);\nconst SEARCH_TOOLS_WEB = new Set([\"WebSearch\", \"WebFetch\"]);\nconst SILENT_TOOLS = new Set([\"TodoWrite\", \"TodoRead\", \"Skill\", \"EnterPlanMode\", \"ExitPlanMode\", \"EnterWorktree\", \"ExitWorktree\", \"NotebookRead\", \"ListAgents\", \"SendMessage\", \"TaskStop\", \"Monitor\", \"ScheduleWakeup\", \"ReportFindings\"]);\n\nexport function toolCallToOutcome(call: ToolCall, ctx: PathContext): ToolCallOutcome {\n const input = obj(call.input);\n const resp = call.response;\n const ok = !call.isError && obj(resp).interrupted !== true;\n const rel = (p: string) => relativizePath(p, ctx);\n const dur = call.durationMs !== undefined ? { durationMs: call.durationMs } : {};\n\n switch (call.name) {\n case \"Read\": {\n const path = str(input.file_path) ?? str(input.path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: \"Read without file_path\" } };\n const content = str(obj(obj(resp).file).content);\n return { bodies: [{ kind: \"read_file\", path: rel(path), ...(content !== undefined ? { bytes: content.length } : {}) }] };\n }\n case \"Edit\":\n case \"MultiEdit\":\n case \"NotebookEdit\": {\n const path = str(input.file_path) ?? str(input.notebook_path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: `${call.name} without file_path` } };\n const counts = patchCounts(resp) ?? {\n added: lineCount(str(input.new_string) ?? str(input.new_source)),\n removed: lineCount(str(input.old_string)),\n hunks: 1,\n };\n return { bodies: [{ kind: \"edit_file\", path: rel(path), ...counts }] };\n }\n case \"Write\": {\n const path = str(input.file_path);\n if (!path) return { bodies: [], warning: { code: \"missing_field\", detail: \"Write without file_path\" } };\n const r = obj(resp);\n const created = r.type === \"create\" || (r.type === undefined && r.originalFile === null);\n return { bodies: [{ kind: \"write_file\", path: rel(path), added: lineCount(str(input.content)), created }] };\n }\n case \"Bash\": {\n const command = str(input.command) ?? \"\";\n const c = classifyBash(command);\n const touched = [...new Set([...c.writes, ...c.reads].map(rel))];\n const bodies: AgentEventBody[] = [{ kind: \"run_command\", argv0: c.argv0, intent: c.intent, touched, ok, ...dur }];\n const heredoc = heredocLines(command);\n c.writes.forEach((w, i) => bodies.push({ kind: \"write_file\", path: rel(w), added: i === 0 ? heredoc : 0, created: false }));\n for (const r of c.reads) bodies.push({ kind: \"read_file\", path: rel(r) });\n if (c.intent === \"test\") {\n const sum = parseTestSummary(responseText(resp));\n if (sum) bodies.push({ kind: \"test_result\", ok: sum.failed === 0 && ok, passed: sum.passed, failed: sum.failed, ...(sum.skipped !== undefined ? { skipped: sum.skipped } : {}), framework: sum.framework, ...dur });\n else bodies.push({ kind: \"test_result\", ok, passed: 0, failed: 0, framework: \"unknown\", ...dur });\n }\n return { bodies };\n }\n case \"Agent\":\n case \"Task\": {\n const r = obj(resp);\n const agentId = str(r.agentId) ?? str(r.agent_id) ?? \"\";\n const label = str(input.description) ?? str(input.subagent_type);\n const start: AgentEventBody = { kind: \"subagent_start\", childId: agentId, ...(label ? { label } : {}) };\n if (r.status === \"async_launched\" || r.isAsync === true) return { bodies: [start], pendingSubagent: { childId: agentId } };\n return { bodies: [start, { kind: \"subagent_stop\", childId: agentId, ok }] };\n }\n case \"AskUserQuestion\":\n return { bodies: [{ kind: \"waiting_for_user\", reason: \"question\" }] };\n }\n if (SEARCH_TOOLS_REPO.has(call.name)) {\n const n = obj(resp).numFiles ?? obj(resp).numLines ?? obj(resp).count;\n return { bodies: [{ kind: \"search\", scope: \"repo\", ...(typeof n === \"number\" ? { hits: n } : {}) }] };\n }\n if (SEARCH_TOOLS_WEB.has(call.name)) return { bodies: [{ kind: \"search\", scope: \"web\" }] };\n if (SILENT_TOOLS.has(call.name)) return { bodies: [] };\n // Unknown tool (MCP tools arrive as mcp__server__tool). Treated as generic work.\n return {\n bodies: [{ kind: \"run_command\", argv0: call.name.slice(0, 40), intent: \"other\", touched: [], ok, ...dur }],\n warning: { code: \"unknown_tool\", detail: call.name.slice(0, 80) },\n };\n}\n","/**\n * Claim check lexicon. Deliberately conservative and deliberately a plain\n * list so it can be reviewed and extended in a PR. Only the tail of a message\n * is examined, because conclusions come last. The text itself is never stored.\n */\nexport const SUCCESS_LEXICON: readonly RegExp[] = [\n /\\ball (?:\\d+ )?tests? (?:are )?pass(?:ing|ed)?\\b/i,\n /\\btests? (?:are |is )?(?:now )?(?:passing|green)\\b/i,\n /\\b(?:is|are|it's|that's|everything(?:'s| is)) (?:now )?(?:fixed|working|done|complete|resolved)\\b/i,\n /\\bshould (?:now )?work\\b/i,\n /\\bworks now\\b/i,\n /\\b(?:done|complete|completed|fixed|resolved|shipped|implemented)[.!]/i,\n /✅/,\n];\n\nexport const HEDGE_LEXICON: readonly RegExp[] = [\n /\\bnot (?:yet )?(?:done|fixed|working|tested|verified|complete)\\b/i,\n /\\bstill (?:fail|broken|not)/i,\n /\\b(?:could ?n[’']?t|cannot|can ?not|unable to|wasn[’']?t able)\\b/i,\n /\\bfail(?:ed|ing|s)\\b/i,\n /\\bTODO\\b/,\n /\\bhaven[’']?t (?:run|tested|verified|checked)/i,\n /\\buntested\\b/i,\n /\\bI did not (?:run|test|verify)/i,\n];\n\nconst TAIL = 600;\n\nexport function claimsSuccess(text: string | undefined | null): boolean {\n if (!text) return false;\n const tail = text.length > TAIL ? text.slice(-TAIL) : text;\n if (HEDGE_LEXICON.some((r) => r.test(tail))) return false;\n return SUCCESS_LEXICON.some((r) => r.test(tail));\n}\n","import type { AdapterResult, AdapterWarning, AgentEvent, AgentEventBody } from \"../events/types.js\";\nimport { claimsSuccess } from \"../director/claims.js\";\nimport { basename, type PathContext } from \"./paths.js\";\nimport { toolCallToOutcome } from \"./tool-call.js\";\n\n/**\n * Claude Code JSONL transcript → AgentEvents.\n *\n * The format is documented as internal and may change between releases, so\n * this adapter whitelists row types, never throws on an unexpected shape, and\n * reports what it skipped as warnings. Prompt text and file contents are\n * never read into events.\n */\nexport interface TranscriptOptions {\n home?: string;\n /** Override the agentId assigned to sidechain rows that carry none. */\n sidechainAgentId?: string;\n}\n\nconst ROW_TYPES = new Set([\"user\", \"assistant\", \"system\"]);\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\n\ninterface Pending {\n name: string;\n input: unknown;\n ts: number;\n agentId?: string;\n}\n\nexport function parseTranscript(text: string, opts: TranscriptOptions = {}): AdapterResult {\n const rows: unknown[] = [];\n const warnings: AdapterWarning[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (!line.trim()) continue;\n try {\n rows.push(JSON.parse(line));\n } catch {\n warnings.push({ code: \"bad_json\", detail: `line ${i + 1}`, line: i + 1 });\n }\n }\n const res = parseTranscriptRows(rows, opts);\n return { events: res.events, warnings: [...warnings, ...res.warnings] };\n}\n\nexport function parseTranscriptRows(rows: unknown[], opts: TranscriptOptions = {}): AdapterResult {\n const events: AgentEvent[] = [];\n const warnings: AdapterWarning[] = [];\n const unknownTypes = new Set<string>();\n const pending = new Map<string, Pending>();\n const openSubagents = new Map<string, string>(); // agentId -> spawning event id\n\n let sessionId = \"\";\n let cwd = \"\";\n let branch: string | undefined;\n let firstTs = Number.NaN;\n let lastTs = Number.NaN;\n let lastAssistantText = \"\";\n let seq = 0;\n let sawEnd = false;\n\n const ctx = (): PathContext => ({ cwd, ...(opts.home ? { home: opts.home } : {}) });\n const push = (ts: number, id: string, body: AgentEventBody, extra: { agentId?: string; parentId?: string } = {}) => {\n events.push({ id, seq: seq++, ts, sessionId, source: \"transcript\", ...extra, ...body });\n };\n const tsOf = (row: Record<string, unknown>): number => {\n const t = str(row.timestamp);\n const n = t ? Date.parse(t) : Number.NaN;\n return Number.isFinite(n) ? n : Number.isFinite(lastTs) ? lastTs : 0;\n };\n const agentOf = (row: Record<string, unknown>): string | undefined =>\n str(row.agentId) ?? (row.isSidechain === true ? (opts.sidechainAgentId ?? \"sidechain\") : undefined);\n\n for (const raw of rows) {\n const row = obj(raw);\n const type = str(row.type) ?? \"\";\n if (!ROW_TYPES.has(type)) {\n if (type) unknownTypes.add(type);\n continue;\n }\n if (!sessionId && str(row.sessionId)) sessionId = str(row.sessionId)!;\n if (!cwd && str(row.cwd)) cwd = str(row.cwd)!;\n if (!branch && str(row.gitBranch)) branch = str(row.gitBranch);\n const ts = tsOf(row);\n if (!Number.isFinite(firstTs)) {\n firstTs = ts;\n push(ts, `${sessionId || \"session\"}:start`, { kind: \"session_start\", repoId: basename(cwd) || \"repo\", ...(branch ? { branch } : {}) });\n }\n lastTs = ts;\n const agentId = agentOf(row);\n const message = obj(row.message);\n const content = message.content;\n\n if (type === \"system\") {\n if (row.subtype === \"api_error\") {\n const attempt = typeof row.retryAttempt === \"number\" ? row.retryAttempt : 0;\n const max = typeof row.maxRetries === \"number\" ? row.maxRetries : 0;\n push(ts, str(row.uuid) ?? `sys:${seq}`, { kind: \"error\", where: \"api\", retrying: attempt < max }, agentId ? { agentId } : {});\n }\n continue;\n }\n\n if (type === \"assistant\") {\n const blocks = Array.isArray(content) ? content : [];\n for (const b of blocks) {\n const block = obj(b);\n if (block.type === \"tool_use\" && str(block.id) && str(block.name)) {\n pending.set(str(block.id)!, { name: str(block.name)!, input: block.input, ts, ...(agentId ? { agentId } : {}) });\n } else if (block.type === \"text\" && !agentId) {\n const t = str(block.text);\n if (t) lastAssistantText = t;\n }\n }\n if (typeof content === \"string\" && !agentId) lastAssistantText = content;\n if (message.stop_reason === \"end_turn\" && !agentId) {\n push(ts, `${str(row.uuid) ?? seq}:turn`, { kind: \"turn_end\", claimedSuccess: claimsSuccess(lastAssistantText) });\n }\n continue;\n }\n\n // type === \"user\"\n if (row.toolDenialKind !== undefined) push(ts, `${str(row.uuid) ?? seq}:deny`, { kind: \"waiting_for_user\", reason: \"permission\" });\n const blocks = Array.isArray(content) ? content : [];\n for (const b of blocks) {\n const block = obj(b);\n if (block.type !== \"tool_result\") continue;\n const useId = str(block.tool_use_id);\n if (!useId) continue;\n const p = pending.get(useId);\n if (!p) {\n warnings.push({ code: \"unpaired_result\", detail: useId });\n continue;\n }\n pending.delete(useId);\n const response = row.toolUseResult ?? block.content;\n const out = toolCallToOutcome(\n { name: p.name, input: p.input, response, isError: block.is_error === true, durationMs: Math.max(0, ts - p.ts) },\n ctx(),\n );\n if (out.warning) warnings.push(out.warning);\n const rowAgent = p.agentId ?? agentId;\n const parentId = rowAgent ? openSubagents.get(rowAgent) : undefined;\n const extra = { ...(rowAgent ? { agentId: rowAgent } : {}), ...(parentId ? { parentId } : {}) };\n out.bodies.forEach((body, i) => push(p.ts, i === 0 ? useId : `${useId}:${i}`, body, extra));\n if (out.pendingSubagent) openSubagents.set(out.pendingSubagent.childId, useId);\n }\n if (blocks.length === 0 && typeof content === \"string\" && /\\[Request interrupted by user/i.test(content)) {\n push(ts, `${str(row.uuid) ?? seq}:interrupt`, { kind: \"waiting_for_user\", reason: \"idle\" });\n }\n }\n\n for (const [useId, p] of pending) {\n warnings.push({ code: \"unpaired_result\", detail: `tool_use ${useId} (${p.name}) has no result` });\n const out = toolCallToOutcome({ name: p.name, input: p.input, isError: true }, ctx());\n if (out.warning) warnings.push(out.warning);\n out.bodies.forEach((body, i) => push(p.ts, i === 0 ? useId : `${useId}:${i}`, body, p.agentId ? { agentId: p.agentId } : {}));\n }\n for (const [childId, spawnId] of openSubagents) {\n push(lastTs, `${spawnId}:stop`, { kind: \"subagent_stop\", childId, ok: true }, { parentId: spawnId });\n }\n for (const t of unknownTypes) warnings.push({ code: \"unknown_row_type\", detail: t });\n\n if (Number.isFinite(firstTs) && !sawEnd) {\n sawEnd = true;\n push(lastTs, `${sessionId || \"session\"}:end`, { kind: \"session_end\", reason: \"stop\", claimedSuccess: claimsSuccess(lastAssistantText) });\n }\n return { events, warnings };\n}\n","import type { AdapterResult, AgentEvent, AgentEventBody, SessionEndReason } from \"../events/types.js\";\nimport { mintId } from \"../events/ids.js\";\nimport { claimsSuccess } from \"../director/claims.js\";\nimport { basename, type PathContext } from \"./paths.js\";\nimport { toolCallToOutcome } from \"./tool-call.js\";\n\n/**\n * Claude Code hook stdin payload → AgentEvents (live mode).\n * Field names per code.claude.com/docs/en/hooks. Unknown events produce a\n * warning and no event; the hook script itself always exits 0 regardless.\n */\nexport interface HookOptions {\n now?: number;\n home?: string;\n}\n\nconst obj = (x: unknown): Record<string, unknown> => (x && typeof x === \"object\" ? (x as Record<string, unknown>) : {});\nconst str = (x: unknown): string | undefined => (typeof x === \"string\" ? x : undefined);\n\n/** Events where `agent_id` identifies the thread doing the work (attribution). SubagentStart/Stop name the child instead. */\nconst TOOL_EVENTS = new Set([\"PreToolUse\", \"PostToolUse\", \"PostToolUseFailure\"]);\n\nfunction endReason(reason: string | undefined): SessionEndReason {\n switch (reason) {\n case \"clear\":\n case \"logout\":\n case \"prompt_input_exit\":\n return \"user\";\n default:\n return \"stop\";\n }\n}\n\nexport function hookPayloadToEvents(payload: unknown, opts: HookOptions = {}): AdapterResult {\n const p = obj(payload);\n const name = str(p.hook_event_name);\n const sessionId = str(p.session_id) ?? \"\";\n const ts = opts.now ?? Date.now();\n if (!name) return { events: [], warnings: [{ code: \"missing_field\", detail: \"hook_event_name\" }] };\n const cwd = str(p.cwd) ?? \"\";\n const ctx: PathContext = { cwd, ...(opts.home ? { home: opts.home } : {}) };\n const agentId = TOOL_EVENTS.has(name) ? str(p.agent_id) : undefined;\n const extra = agentId ? { agentId } : {};\n let seq = 0;\n const mk = (body: AgentEventBody, id = mintId(ts)): AgentEvent => ({ id, seq: seq++, ts, sessionId, source: \"hook\", ...extra, ...body });\n const one = (body: AgentEventBody): AdapterResult => ({ events: [mk(body)], warnings: [] });\n\n switch (name) {\n case \"SessionStart\":\n return one({ kind: \"session_start\", repoId: basename(cwd) || \"repo\" });\n case \"SessionEnd\":\n return one({ kind: \"session_end\", reason: endReason(str(p.reason)), claimedSuccess: false });\n case \"Stop\":\n return one({ kind: \"turn_end\", claimedSuccess: claimsSuccess(str(p.last_assistant_message)) });\n case \"SubagentStart\": {\n const id = str(p.agent_id) ?? \"\";\n const label = str(p.agent_type);\n return { events: [mk({ kind: \"subagent_start\", childId: id, ...(label ? { label } : {}) })], warnings: [] };\n }\n case \"SubagentStop\":\n return one({ kind: \"subagent_stop\", childId: str(p.agent_id) ?? \"\", ok: true });\n case \"Notification\": {\n const t = str(p.notification_type);\n if (t === \"permission_prompt\") return one({ kind: \"waiting_for_user\", reason: \"permission\" });\n if (t === \"idle_prompt\") return one({ kind: \"waiting_for_user\", reason: \"idle\" });\n if (t === \"elicitation_dialog\") return one({ kind: \"waiting_for_user\", reason: \"question\" });\n return { events: [], warnings: [] };\n }\n case \"PostToolUseFailure\":\n return one({ kind: \"error\", where: str(p.tool_name) ?? \"tool\", retrying: false });\n case \"PostToolUse\": {\n const tool = str(p.tool_name);\n if (!tool) return { events: [], warnings: [{ code: \"missing_field\", detail: \"tool_name\" }] };\n const dur = typeof p.duration_ms === \"number\" ? { durationMs: p.duration_ms } : {};\n const out = toolCallToOutcome({ name: tool, input: p.tool_input, response: p.tool_response, ...dur }, ctx);\n const baseId = str(p.tool_use_id) ?? mintId(ts);\n const events = out.bodies.map((body, i) => mk(body, i === 0 ? baseId : `${baseId}:${i}`));\n return { events, warnings: out.warning ? [out.warning] : [] };\n }\n case \"PreToolUse\":\n case \"UserPromptSubmit\":\n case \"PreCompact\":\n case \"PostCompact\":\n return { events: [], warnings: [] };\n }\n return { events: [], warnings: [{ code: \"unknown_row_type\", detail: name }] };\n}\n","/**\n * Test helper and runtime guard: given events and a list of strings that must\n * never appear (prompts, file contents, command bodies), return the ones found.\n */\nexport function findLeaks(events: unknown, markers: readonly string[]): string[] {\n const hay = JSON.stringify(events);\n return markers.filter((m) => m.length > 0 && hay.includes(m));\n}\n","/** FNV-1a 32-bit — a stable seed from any string, no crypto dependency. */\nexport function hashString(s: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\n/** mulberry32: tiny, fast, good enough for layout jitter. Returns [0,1). */\nexport function mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import { isTestPath } from \"../adapters/paths.js\";\nimport type { FileNode, PlaceKind } from \"./types.js\";\n\nexport const ARCHIVE_RE = /(^|\\/)(schema\\.(sql|prisma|graphql|gql)|.*\\.(sql|prisma|db|sqlite)|migrations?\\/|drizzle\\/|models?\\/.*\\.(ts|js|py|rb)$)/i;\nconst IGNORE_RE = /(^|\\/)(node_modules|\\.git|dist|build|out|coverage|_site|\\.next|\\.turbo|target|vendor|__pycache__|\\.venv|venv)(\\/|$)|(^|\\/)\\.[^/]+$|\\.(lock|map|min\\.js|png|jpg|jpeg|gif|webp|svg|ico|woff2?|ttf|mp4|mp3|pdf|zip)$/i;\n\nexport function isIgnoredPath(p: string): boolean {\n return IGNORE_RE.test(p);\n}\n\nexport function kindOf(path: string): Exclude<PlaceKind, \"forge\" | \"dock\"> {\n if (isTestPath(path)) return \"beacon\";\n if (ARCHIVE_RE.test(path)) return \"archive\";\n return \"building\";\n}\n\n/** Lines, estimated from bytes when unknown (~40 bytes/line). */\nexport function locOf(f: FileNode): number {\n if (typeof f.loc === \"number\") return f.loc;\n if (typeof f.size === \"number\") return Math.max(1, Math.round(f.size / 40));\n return 1;\n}\n\nexport interface Scored { file: FileNode; loc: number; score: number; kind: Exclude<PlaceKind, \"forge\" | \"dock\">; touched: boolean }\n\n/**\n * 0.5·loc + 0.3·churn + 0.2·touched, each normalised to the repo's max.\n * Touched files are force-included by the caller regardless of score.\n */\nexport function scoreFiles(files: FileNode[], touched: Set<string>): Scored[] {\n const kept = files.filter((f) => !isIgnoredPath(f.path));\n const maxLoc = Math.max(1, ...kept.map(locOf));\n const maxChurn = Math.max(1, ...kept.map((f) => f.churn ?? 0));\n return kept.map((file) => {\n const loc = locOf(file);\n const t = touched.has(file.path);\n const score = 0.5 * Math.sqrt(loc / maxLoc) + 0.3 * ((file.churn ?? 0) / maxChurn) + (t ? 0.2 : 0);\n return { file, loc, score, kind: kindOf(file.path), touched: t };\n });\n}\n\nexport function heightClass(loc: number, maxLoc: number): number {\n const r = Math.sqrt(loc / Math.max(1, maxLoc));\n return Math.max(1, Math.min(5, Math.ceil(r * 5)));\n}\n\nexport function footprintOf(height: number): 1 | 2 | 3 {\n return height >= 5 ? 3 : height >= 3 ? 2 : 1;\n}\n","import type { FileNode } from \"./types.js\";\n\n/** What kind of project this is, from the file tree alone. Several can apply; ordered by confidence. */\nexport type ProjectKind =\n | \"web-frontend\" | \"backend-api\" | \"cli-tool\" | \"library\" | \"data-ml\" | \"mobile\" | \"game\"\n | \"infra-devops\" | \"docs-content\" | \"monorepo\" | \"systems\" | \"unknown\";\n\nexport interface RepoProfile {\n kinds: ProjectKind[];\n /** Top languages by file count, most common first. */\n languages: string[];\n files: number;\n}\n\nconst EXT_LANG: Record<string, string> = { ts: \"TypeScript\", tsx: \"TypeScript\", js: \"JavaScript\", jsx: \"JavaScript\", mjs: \"JavaScript\", py: \"Python\", go: \"Go\", rs: \"Rust\", java: \"Java\", kt: \"Kotlin\", swift: \"Swift\", rb: \"Ruby\", php: \"PHP\", cs: \"C#\", cpp: \"C++\", cc: \"C++\", c: \"C\", h: \"C\", m: \"Objective-C\", scala: \"Scala\", ex: \"Elixir\", exs: \"Elixir\", dart: \"Dart\", lua: \"Lua\", zig: \"Zig\", sh: \"Shell\", sql: \"SQL\", md: \"Markdown\", mdx: \"Markdown\", html: \"HTML\", css: \"CSS\", scss: \"CSS\", vue: \"Vue\", svelte: \"Svelte\", tf: \"Terraform\", yaml: \"YAML\", yml: \"YAML\", ipynb: \"Notebook\" };\n\nexport function profileRepo(files: FileNode[], manifests: Record<string, string> = {}): RepoProfile {\n const paths = files.map((f) => f.path.toLowerCase());\n const has = (re: RegExp) => paths.some((p) => re.test(p));\n const count = (re: RegExp) => paths.filter((p) => re.test(p)).length;\n const langCount = new Map<string, number>();\n for (const p of paths) { const ext = p.slice(p.lastIndexOf(\".\") + 1); const l = EXT_LANG[ext]; if (l && !/^(markdown|yaml|html|css|shell|sql)$/i.test(l)) langCount.set(l, (langCount.get(l) ?? 0) + 1); }\n const languages = [...langCount.entries()].sort((a, b) => b[1] - a[1]).map(([l]) => l).slice(0, 4);\n const pkg = (manifests[\"package.json\"] ?? \"\").toLowerCase();\n const py = ((manifests[\"pyproject.toml\"] ?? \"\") + (manifests[\"requirements.txt\"] ?? \"\")).toLowerCase();\n const dep = (re: RegExp) => re.test(pkg) || re.test(py);\n\n const scores = new Map<ProjectKind, number>();\n const add = (k: ProjectKind, n: number) => scores.set(k, (scores.get(k) ?? 0) + n);\n if (dep(/\"(react|react-dom|next|vue|nuxt|svelte|@sveltejs\\/kit|@angular\\/core|solid-js|astro|remix|vite)\"/)) add(\"web-frontend\", 3);\n if (count(/\\.(tsx|jsx|vue|svelte)$/) > 3) add(\"web-frontend\", 2);\n if (has(/(^|\\/)(index|app)\\.html$/) || count(/\\.(css|scss)$/) > 3) add(\"web-frontend\", 1);\n if (dep(/\"(express|fastify|hono|koa|@nestjs\\/core|apollo-server|prisma|drizzle-orm|django|flask|fastapi|sqlalchemy|gin|fiber|actix|axum|rails|spring)\"/)) add(\"backend-api\", 3);\n if (has(/(^|\\/)(routes?|controllers?|api|handlers?|migrations?)\\//) || has(/\\.(sql|prisma)$/)) add(\"backend-api\", 2);\n if (pkg.includes('\"bin\"') || has(/(^|\\/)(cli|cmd|bin)\\//) || dep(/\"(commander|yargs|clap|cobra|click|typer)\"/)) add(\"cli-tool\", 3);\n if (dep(/\"(torch|tensorflow|jax|pandas|numpy|scikit-learn|sklearn|transformers|xgboost|lightgbm|polars)\"/) || count(/\\.ipynb$/) > 0 || has(/(^|\\/)(notebooks?|models?|datasets?|training)\\//)) add(\"data-ml\", 3);\n if (has(/\\.(swift|kt)$/) || has(/(^|\\/)(ios|android)\\//) || has(/package\\.swift$/) || has(/build\\.gradle(\\.kts)?$/) || dep(/\"(react-native|expo|flutter)\"/) || has(/\\.dart$/)) add(\"mobile\", 3);\n if (has(/\\.(unity|unitypackage|godot|tscn|gd)$/) || has(/(^|\\/)assets\\/.*\\.(prefab|fbx)$/) || dep(/\"(phaser|pixi\\.js|three|babylonjs|@react-three\\/fiber|excalibur|kaplay|bevy|godot)\"/)) add(\"game\", 3);\n if (has(/\\.tf$/) || has(/(^|\\/)(dockerfile|docker-compose\\.ya?ml|helm|k8s|kubernetes|\\.github\\/workflows|ansible|pulumi)/) ) add(\"infra-devops\", has(/\\.tf$/) || has(/(^|\\/)(helm|k8s|kubernetes|ansible|pulumi)\\//) ? 3 : 1);\n const mdShare = count(/\\.(md|mdx|rst)$/) / Math.max(1, paths.length);\n if (mdShare > 0.4 || has(/(^|\\/)(mkdocs|docusaurus)\\.config|(^|\\/)docs\\/.*\\.mdx?$/) && mdShare > 0.25) add(\"docs-content\", 3);\n if (has(/(^|\\/)pnpm-workspace\\.ya?ml$/) || has(/(^|\\/)packages\\/[^/]+\\/package\\.json$/) || has(/(^|\\/)(lerna|nx|turbo)\\.json$/) || has(/(^|\\/)cargo\\.toml$/) && count(/(^|\\/)crates\\/[^/]+\\//) > 0) add(\"monorepo\", 2);\n if (count(/\\.(rs|go|c|cpp|cc|h|zig)$/) > 5 && !scores.has(\"web-frontend\")) add(\"systems\", 2);\n if (pkg.includes('\"main\"') && !pkg.includes('\"bin\"') && !scores.has(\"web-frontend\") && !scores.has(\"backend-api\")) add(\"library\", 2);\n if (has(/(^|\\/)(lib|src\\/lib)\\//) && !scores.has(\"web-frontend\")) add(\"library\", 1);\n\n const kinds = [...scores.entries()].filter(([, n]) => n >= 2).sort((a, b) => b[1] - a[1]).map(([k]) => k);\n return { kinds: kinds.length ? kinds : [\"unknown\"], languages, files: files.length };\n}\n","import { hashString, mulberry32 } from \"./prng.js\";\nimport { footprintOf, heightClass, scoreFiles, type Scored } from \"./relevance.js\";\nimport type { District, GenerateOptions, LayoutStyle, Path, Place, Rect, World } from \"./types.js\";\nimport { profileRepo } from \"./profile.js\";\n\n/**\n * Deterministic world layout. Same repoId + same file list → identical World.\n *\n * Shape: a hub (forge) at the origin; districts (top-level folders) packed in a\n * ring around it, each a square patch with buildings spiral-packed from its\n * centre by relevance; beacons (tests) on an outer ring near their district;\n * the dock on the outer ring at a seeded angle. Paths join each district to the hub.\n */\nexport function generateWorld(opts: GenerateOptions): World {\n const cap = opts.cap ?? 60;\n const beaconCap = opts.beaconCap ?? 8;\n // Force-include only the first `touchedCap` touched files (callers pass them most-active first); the rest get an overflow building per district.\n const touchedCap = opts.touchedCap ?? 48;\n const touched = new Set((opts.touched ?? []).map(norm).slice(0, touchedCap));\n const seed = hashString(opts.repoId);\n const rnd = mulberry32(seed);\n const files = opts.files.map((f) => ({ ...f, path: norm(f.path) }));\n const scored = scoreFiles(files, touched);\n const maxLoc = Math.max(1, ...scored.map((s) => s.loc));\n\n // ---- selection: touched always; then by score within caps ----\n const byScore = [...scored].sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path));\n const beacons = pick(byScore.filter((s) => s.kind === \"beacon\"), beaconCap);\n const others = pick(byScore.filter((s) => s.kind !== \"beacon\"), cap);\n const selected = [...others, ...beacons];\n const capped = selected.length < scored.length;\n\n // ---- districts: group by top-level folder ----\n const groups = new Map<string, Scored[]>();\n for (const s of others) {\n const d = topDir(s.file.path);\n (groups.get(d) ?? groups.set(d, []).get(d)!).push(s);\n }\n const names = [...groups.keys()].sort();\n const occupied = new Set<string>();\n const places: Place[] = [];\n const districts: District[] = [];\n\n // hub\n const forge: Place = { id: \"forge\", kind: \"forge\", path: \"\", label: \"forge\", district: \"\", gx: -1, gy: -1, footprint: 2, height: 2, score: 0, touched: false };\n places.push(forge);\n\n // district patches, arranged by layout style\n const layout: LayoutStyle = opts.layout ?? LAYOUTS[seed % LAYOUTS.length]!;\n const jitter = rnd() * Math.PI * 2;\n const sized = names.map((name) => {\n const items = groups.get(name)!.sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path));\n const cells = items.reduce((n, s) => n + footprintOf(heightClass(s.loc, maxLoc)) ** 2, 0);\n const side = Math.max(3, Math.ceil(Math.sqrt(cells * 1.45)));\n return { name, items, side };\n });\n const placedRects: Rect[] = [];\n const hubRect: Rect = { x: -2, y: -2, w: 4, h: 4 };\n const rects = layoutRects(layout, sized.map((d) => d.side), hubRect, jitter, rnd);\n placedRects.push(hubRect, ...rects);\n // hub position may move with the layout (strip/terrace/spine); re-place the forge\n const hub = hubFor(layout, rects);\n forge.gx = hub[0]; forge.gy = hub[1]; occupied.clear(); claim(occupied, forge);\n sized.forEach((d0, i) => {\n const rect = rects[i]!;\n const d: District = { id: `d:${d0.name}`, label: d0.name === \"\" ? \"/\" : `${d0.name}/`, bounds: rect, cx: rect.x + Math.floor(rect.w / 2), cy: rect.y + Math.floor(rect.h / 2), placeIds: [] };\n for (const s of d0.items) {\n const h = heightClass(s.loc, maxLoc);\n const fp = footprintOf(h);\n const spot = spiralSpot(occupied, d.cx, d.cy, fp, rect);\n const p: Place = { id: `p:${s.file.path}`, kind: s.kind as Place[\"kind\"], path: s.file.path, label: base(s.file.path), district: d.id, gx: spot[0], gy: spot[1], footprint: fp, height: h, score: round3(s.score), touched: s.touched };\n claim(occupied, p);\n places.push(p);\n d.placeIds.push(p.id);\n }\n districts.push(d);\n });\n let ring = Math.ceil(maxExtent(placedRects));\n\n // outer ring: beacons near their district (or hub), dock at a seeded angle\n void ring;\n // reserve every district rectangle (plus a 1-tile moat) so rim features never land between buildings\n for (const r of placedRects) for (let x = r.x - 1; x < r.x + r.w + 1; x++) for (let y = r.y - 1; y < r.y + r.h + 1; y++) occupied.add(`${x},${y}`);\n for (const s of beacons) {\n const home = districts.find((d) => d.id === `d:${topDir(s.file.path)}`);\n const spot = home ? edgeSpot(occupied, home, forge, 1) : nearSpot(occupied, forge.gx + 1, forge.gy + 1, rnd() * Math.PI * 2, 4, 1);\n const p: Place = { id: `p:${s.file.path}`, kind: \"beacon\", path: s.file.path, label: base(s.file.path), district: home?.id ?? \"\", gx: spot[0], gy: spot[1], footprint: 1, height: 4, score: round3(s.score), touched: s.touched };\n claim(occupied, p);\n places.push(p);\n home?.placeIds.push(p.id);\n }\n const dockSpot = nearSpot(occupied, forge.gx + 1, forge.gy + 1, jitter + Math.PI, 5, 2);\n const dock: Place = { id: \"dock\", kind: \"dock\", path: \"\", label: \"dock\", district: \"\", gx: dockSpot[0], gy: dockSpot[1], footprint: 2, height: 1, score: 0, touched: false };\n claim(occupied, dock);\n places.push(dock);\n\n const paths = layoutPaths(layout, districts, forge, dock);\n\n // overflow: one shared building per district that had files cut, so unplaced activity still lands in the right area\n if (capped) {\n for (const d of districts) {\n const top = d.id.slice(2);\n const total = scored.filter((s) => s.kind !== \"beacon\" && topDir(s.file.path) === top).length;\n if (total <= d.placeIds.length) continue;\n const spot = spiralSpot(occupied, d.cx, d.cy, 1, d.bounds);\n const p: Place = { id: `p:${top ? top + \"/\" : \"\"}…`, kind: \"overflow\", path: `${top ? top + \"/\" : \"\"}…`, label: `+${total - d.placeIds.length} more`, district: d.id, gx: spot[0], gy: spot[1], footprint: 1, height: 2, score: 0, touched: false };\n claim(occupied, p); places.push(p); d.placeIds.push(p.id);\n }\n }\n const bounds = boundsOf(places, 2);\n const profile = profileRepo(files, opts.manifests ?? {});\n return { repoId: opts.repoId, seed, layout, profile, districts, places, paths, bounds, stats: { files: scored.length, placed: selected.length, capped } };\n}\n\n// ---- helpers ----\nconst norm = (p: string) => p.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\");\nconst base = (p: string) => p.slice(p.lastIndexOf(\"/\") + 1);\nconst topDir = (p: string) => (p.includes(\"/\") ? p.slice(0, p.indexOf(\"/\")) : \"\");\nconst round3 = (n: number) => Math.round(n * 1000) / 1000;\n\nfunction pick(sorted: Scored[], cap: number): Scored[] {\n const forced = sorted.filter((s) => s.touched);\n const rest = sorted.filter((s) => !s.touched);\n return [...forced, ...rest.slice(0, Math.max(0, cap - forced.length))];\n}\n\nfunction overlaps(a: Rect, b: Rect, gap: number): boolean {\n return a.x < b.x + b.w + gap && b.x < a.x + a.w + gap && a.y < b.y + b.h + gap && b.y < a.y + a.h + gap;\n}\n\nfunction cellsOf(gx: number, gy: number, fp: number): string[] {\n const out: string[] = [];\n for (let dx = 0; dx < fp; dx++) for (let dy = 0; dy < fp; dy++) out.push(`${gx + dx},${gy + dy}`);\n return out;\n}\nfunction free(occ: Set<string>, gx: number, gy: number, fp: number): boolean {\n return cellsOf(gx, gy, fp).every((c) => !occ.has(c));\n}\nfunction claim(occ: Set<string>, p: Place): void {\n for (const c of cellsOf(p.gx, p.gy, p.footprint)) occ.add(c);\n}\n\n/** Nearest free fp×fp spot to (cx,cy), spiralling outward in origin-relative steps; prefers the patch, never fails. */\nfunction spiralSpot(occ: Set<string>, cx: number, cy: number, fp: number, rect: Rect): [number, number] {\n let x = 0, y = 0, dx = 0, dy = -1;\n let fallback: [number, number] | null = null;\n for (let i = 0; i < 4096; i++) {\n const gx = cx + x - Math.floor(fp / 2), gy = cy + y - Math.floor(fp / 2);\n if (free(occ, gx, gy, fp)) {\n const inside = gx >= rect.x - 1 && gy >= rect.y - 1 && gx + fp <= rect.x + rect.w + 1 && gy + fp <= rect.y + rect.h + 1;\n if (inside) return [gx, gy];\n fallback ??= [gx, gy];\n if (i > 600) return fallback;\n }\n if (x === y || (x < 0 && x === -y) || (x > 0 && x === 1 - y)) [dx, dy] = [-dy, dx];\n x += dx; y += dy;\n }\n return fallback ?? [cx, cy];\n}\n\n/** Free spot on a ring of given radius, scanning angles outward from `ang`. */\n\nfunction maxExtent(rects: Rect[]): number {\n return Math.max(...rects.map((r) => Math.max(Math.abs(r.x), Math.abs(r.x + r.w), Math.abs(r.y), Math.abs(r.y + r.h))));\n}\nfunction boundsOf(places: Place[], pad: number): Rect {\n const xs = places.flatMap((p) => [p.gx, p.gx + p.footprint]);\n const ys = places.flatMap((p) => [p.gy, p.gy + p.footprint]);\n const x = Math.min(...xs) - pad, y = Math.min(...ys) - pad;\n return { x, y, w: Math.max(...xs) + pad - x, h: Math.max(...ys) + pad - y };\n}\n\nexport const LAYOUTS: readonly LayoutStyle[] = [\"ring\", \"grid\", \"strip\", \"scatter\", \"terrace\", \"spine\"];\n\n/** District rectangles for a layout. Deterministic for (style, sides, jitter, rnd). Never overlapping, never touching the hub. */\nfunction layoutRects(style: LayoutStyle, sides: number[], hub: Rect, jitter: number, rnd: () => number): Rect[] {\n const n = sides.length, out: Rect[] = [];\n const maxSide = Math.max(3, ...sides);\n const fits = (r: Rect) => !overlaps(hub, r, 1) && !out.some((o) => overlaps(o, r, 1));\n const push = (x: number, y: number, side: number) => { const r = { x, y, w: side, h: side }; out.push(r); return r; };\n switch (style) {\n case \"grid\": {\n // row-major shelves: each row as tall as its tallest district, columns packed tight, hub cell skipped\n const cols = Math.max(2, Math.ceil(Math.sqrt(n + 1)));\n const cells: Array<{ x: number; y: number }> = [];\n let y = 0, i = 0;\n while (i < n) {\n const row = sides.slice(i, i + cols), rowH = Math.max(...row) + 2;\n let x = 0; for (const w of row) { cells.push({ x, y }); x += w + 2; }\n y += rowH; i += cols;\n }\n const totalW = Math.max(...cells.map((c, j) => c.x + sides[j]!)), totalH = y;\n for (let j = 0; j < n; j++) {\n let rect: Rect = { x: cells[j]!.x - Math.round(totalW / 2), y: cells[j]!.y - Math.round(totalH / 2), w: sides[j]!, h: sides[j]! };\n while (!fits(rect)) rect = { ...rect, x: rect.x + 1 };\n out.push(rect);\n }\n return out;\n }\n case \"strip\": {\n const total = sides.reduce((a, b) => a + b + 2, 0);\n let x = Math.round(-total / 2) + 6;\n for (let i = 0; i < n; i++) { const wobble = Math.round((rnd() - 0.5) * 3); push(x, wobble - Math.floor(sides[i]! / 2), sides[i]!); x += sides[i]! + 2; }\n return out;\n }\n case \"terrace\": {\n let x = -Math.round(n * (maxSide + 1) / 2), y = -Math.round(n * (maxSide + 1) * 0.3);\n for (let i = 0; i < n; i++) { push(x, y, sides[i]!); x += sides[i]! + 1; y += Math.round(sides[i]! * 0.6) + 1; }\n return out;\n }\n case \"spine\": {\n let y = -Math.round(n * (maxSide + 2) / 4);\n for (let i = 0; i < n; i++) { const left = i % 2 === 0; push(left ? -sides[i]! - 3 : 3, y, sides[i]!); if (!left) y += maxSide + 2; }\n return out;\n }\n case \"scatter\": {\n for (let i = 0; i < n; i++) {\n let R = 5 + maxSide, placed = false;\n for (let tries = 0; tries < 400 && !placed; tries++) {\n const a = jitter + rnd() * Math.PI * 2, r = R * (0.5 + rnd() * 0.7);\n const rect: Rect = { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r * 0.8), w: sides[i]!, h: sides[i]! };\n if (fits(rect)) { out.push(rect); placed = true; }\n if (tries % 40 === 39) R += 2;\n }\n if (!placed) push(R + i * 2, 0, sides[i]!);\n }\n return out;\n }\n default: { // ring\n let ring = 3;\n for (let i = 0; i < n; i++) {\n const side = sides[i]!, angle = jitter + (i / Math.max(1, n)) * Math.PI * 2;\n let r = ring + side / 2, rect: Rect;\n for (;;) {\n const cx = Math.round(Math.cos(angle) * r), cy = Math.round(Math.sin(angle) * r * 0.8);\n rect = { x: cx - Math.floor(side / 2), y: cy - Math.floor(side / 2), w: side, h: side };\n if (fits(rect)) break;\n r += 1;\n }\n out.push(rect); ring = Math.max(ring, r - side / 2);\n }\n return out;\n }\n }\n}\n\n/** Where the forge/hub sits for a layout: centre for ring/scatter/grid, an end for strip/terrace/spine. */\nfunction hubFor(style: LayoutStyle, rects: Rect[]): [number, number] {\n if (!rects.length) return [-1, -1];\n const minX = Math.min(...rects.map((r) => r.x)), minY = Math.min(...rects.map((r) => r.y));\n switch (style) {\n case \"strip\": return [minX - 5, -1];\n case \"terrace\": return [minX - 5, minY - 1];\n case \"spine\": return [-1, minY - 5];\n default: return [-1, -1];\n }\n}\n\n/** Paths by layout: spokes (ring/scatter), L-shaped streets (grid/spine), a chain (strip/terrace). */\nfunction layoutPaths(style: LayoutStyle, districts: District[], forge: Place, dock: Place): Path[] {\n const hub: [number, number] = [forge.gx + 1, forge.gy + 1];\n const paths: Path[] = [];\n if (style === \"strip\" || style === \"terrace\") {\n const ordered = [...districts].sort((a, b) => a.cx - b.cx || a.cy - b.cy);\n let prev: [number, number] = hub, prevId = \"forge\";\n for (const d of ordered) { paths.push({ from: prevId, to: d.id, points: [prev, [d.cx, d.cy]] }); prev = [d.cx, d.cy]; prevId = d.id; }\n } else if (style === \"grid\" || style === \"spine\") {\n for (const d of districts) paths.push({ from: d.id, to: \"forge\", points: [[d.cx, d.cy], [d.cx, hub[1]], hub] });\n } else {\n for (const d of districts) paths.push({ from: d.id, to: \"forge\", points: [[d.cx, d.cy], [Math.round((d.cx + hub[0]) / 2), Math.round((d.cy + hub[1]) / 2)], hub] });\n }\n paths.push({ from: \"dock\", to: \"forge\", points: [[dock.gx, dock.gy], hub] });\n return paths;\n}\n\n/**\n * Re-arrange an existing world in another layout. Keeps every id, kind, height\n * and footprint; only positions, paths and bounds change — so beats directed\n * against the old world still name valid places. Used by the stage so each\n * set can show the same repo in its own arrangement.\n */\nexport function relayoutWorld(world: World, layout: LayoutStyle): World {\n if (world.layout === layout) return world;\n const seed = world.seed;\n const rnd = mulberry32(seed ^ 0x51ed270b ^ LAYOUTS.indexOf(layout));\n const occupied = new Set<string>();\n const places: Place[] = [];\n const forge: Place = { ...world.places.find((p) => p.kind === \"forge\")!, gx: -1, gy: -1 };\n places.push(forge);\n const jitter = rnd() * Math.PI * 2;\n const groups = world.districts.map((d) => ({ d, items: world.places.filter((p) => p.district === d.id && (p.kind === \"building\" || p.kind === \"archive\" || p.kind === \"overflow\")).sort((a, b) => b.score - a.score || a.path.localeCompare(b.path)) }));\n const sized = groups.map((g) => { const cells = g.items.reduce((n, p) => n + p.footprint ** 2, 0); return { ...g, side: Math.max(3, Math.ceil(Math.sqrt(cells * 1.45))) }; });\n const hubRect: Rect = { x: -2, y: -2, w: 4, h: 4 };\n const rects = layoutRects(layout, sized.map((d) => d.side), hubRect, jitter, rnd);\n const placedRects: Rect[] = [hubRect, ...rects];\n const hub = hubFor(layout, rects);\n forge.gx = hub[0]; forge.gy = hub[1]; claim(occupied, forge);\n const districts: District[] = sized.map((g, i) => {\n const rect = rects[i]!;\n const d: District = { ...g.d, bounds: rect, cx: rect.x + Math.floor(rect.w / 2), cy: rect.y + Math.floor(rect.h / 2), placeIds: [] };\n for (const old of g.items) {\n const spot = spiralSpot(occupied, d.cx, d.cy, old.footprint, rect);\n const p: Place = { ...old, gx: spot[0], gy: spot[1] };\n claim(occupied, p); places.push(p); d.placeIds.push(p.id);\n }\n return d;\n });\n const ring = Math.ceil(maxExtent(placedRects));\n void ring;\n for (const r of placedRects) for (let x = r.x - 1; x < r.x + r.w + 1; x++) for (let y = r.y - 1; y < r.y + r.h + 1; y++) occupied.add(`${x},${y}`);\n for (const old of world.places.filter((p) => p.kind === \"beacon\")) {\n const home = districts.find((d) => d.id === old.district);\n const spot = home ? edgeSpot(occupied, home, forge, 1) : nearSpot(occupied, forge.gx + 1, forge.gy + 1, rnd() * Math.PI * 2, 4, 1);\n const p: Place = { ...old, gx: spot[0], gy: spot[1] };\n claim(occupied, p); places.push(p); home?.placeIds.push(p.id);\n }\n const dockSpot = nearSpot(occupied, forge.gx + 1, forge.gy + 1, jitter + Math.PI, 5, 2);\n const dock: Place = { ...world.places.find((p) => p.kind === \"dock\")!, gx: dockSpot[0], gy: dockSpot[1] };\n claim(occupied, dock); places.push(dock);\n const paths = layoutPaths(layout, districts, forge, dock);\n return { ...world, layout, districts, places, paths, bounds: boundsOf(places, 2) };\n}\n\n/** Like ringSpot but around an arbitrary centre. */\nfunction nearSpot(occ: Set<string>, cx: number, cy: number, ang: number, radius: number, fp: number): [number, number] {\n for (let r = radius; r < radius + 40; r++) {\n for (let k = 0; k < 64; k++) {\n const a = ang + (k % 2 ? 1 : -1) * Math.ceil(k / 2) * (Math.PI / 32);\n const gx = Math.round(cx + Math.cos(a) * r), gy = Math.round(cy + Math.sin(a) * r * 0.85);\n if (free(occ, gx, gy, fp)) return [gx, gy];\n }\n }\n return [cx + radius, cy];\n}\n/** A cell just outside a district, on the side facing away from the hub — where that folder's beacon stands. */\nfunction edgeSpot(occ: Set<string>, d: District, hub: Place, fp: number): [number, number] {\n const ang = Math.atan2(d.cy - hub.gy, d.cx - hub.gx);\n const r0 = Math.ceil(Math.max(d.bounds.w, d.bounds.h) / 2) + 2;\n return nearSpot(occ, d.cx, d.cy, ang, r0, fp);\n}\n","import type { World } from \"./types.js\";\n\n/** Plan view for terminals and tests: B building, A archive, L beacon, F forge, D dock, # touched. */\nexport function worldToAscii(w: World): string {\n const { x, y, w: W, h: H } = w.bounds;\n const grid: string[][] = Array.from({ length: H }, () => Array.from({ length: W }, () => \"·\"));\n const put = (gx: number, gy: number, ch: string) => {\n const r = gy - y, c = gx - x;\n if (r >= 0 && r < H && c >= 0 && c < W) grid[r]![c] = ch;\n };\n for (const p of w.places) {\n const ch = p.touched ? \"#\" : p.kind === \"building\" ? \"B\" : p.kind === \"archive\" ? \"A\" : p.kind === \"beacon\" ? \"L\" : p.kind === \"forge\" ? \"F\" : p.kind === \"overflow\" ? \"+\" : \"D\";\n for (let dx = 0; dx < p.footprint; dx++) for (let dy = 0; dy < p.footprint; dy++) put(p.gx + dx, p.gy + dy, ch);\n }\n return grid.map((r) => r.join(\"\")).join(\"\\n\");\n}\n","import type { Mood } from \"./types.js\";\n\n/**\n * Mood is a small state machine driven only by events — never by a timer, so an\n * idle agent looks idle rather than busy. `lost` needs repeated trouble inside a\n * window; a single failure is `uneasy`.\n */\nexport class MoodTracker {\n mood: Mood = \"curious\";\n private trouble: number[] = [];\n constructor(private readonly windowMs: number) {}\n\n private recordTrouble(ts: number): boolean {\n this.trouble = this.trouble.filter((t) => ts - t <= this.windowMs);\n this.trouble.push(ts);\n return this.trouble.length >= 2;\n }\n onRead(): Mood { return (this.mood = this.mood === \"lost\" ? \"lost\" : \"curious\"); }\n onBuild(): Mood { return (this.mood = this.mood === \"lost\" ? \"lost\" : \"focused\"); }\n onFail(ts: number): Mood { return (this.mood = this.recordTrouble(ts) ? \"lost\" : \"uneasy\"); }\n onError(ts: number): Mood { return (this.mood = this.recordTrouble(ts) ? \"lost\" : \"uneasy\"); }\n onPass(): Mood { this.trouble = []; return (this.mood = \"happy\"); }\n onClaimUnverified(): Mood { return (this.mood = \"uneasy\"); }\n}\n","import type { AgentEvent } from \"../events/types.js\";\nimport { isTestPath } from \"../adapters/paths.js\";\nimport type { Place, PlaceId, World } from \"../world/types.js\";\nimport { kindOf } from \"../world/relevance.js\";\nimport { MoodTracker } from \"./mood.js\";\nimport type { ActorId, Beat, BeatBody, DirectorOptions, TestOutcome } from \"./types.js\";\n\n/**\n * Turns AgentEvents into a Beat timeline against a World. Incremental: `feed`\n * returns only the new beats, so live mode streams and replay pre-computes.\n *\n * Honesty rules: every beat traces to events (`sourceEventIds`); nothing is\n * invented to look busy; the claim check is deterministic and test-gated.\n */\nexport class Director {\n private readonly places = new Map<PlaceId, Place>();\n private readonly byPath = new Map<string, Place>();\n private readonly beacons: Place[];\n private readonly forge: Place;\n private readonly dock: Place;\n private readonly maxGap: number;\n private readonly msPerCell: number;\n private readonly mood: MoodTracker;\n\n private beats: Beat[] = [];\n private sceneMs = 0;\n private lastRealTs: number | null = null;\n private seq = 0;\n private readonly actorAt = new Map<ActorId, PlaceId>();\n private readonly helpers = new Map<string, { label?: string }>();\n private readonly gremlins = new Map<string, PlaceId>(); // gremlinId -> place\n private lastEdited: Place | null = null;\n private pendingBeacon: Place | null = null;\n private editedSinceTurn = false;\n private verifiedSinceEdit = false;\n private everVerified = false;\n private claimGremlin: string | null = null;\n\n constructor(private readonly world: World, opts: DirectorOptions = {}) {\n for (const p of world.places) {\n this.places.set(p.id, p);\n if (p.path) this.byPath.set(p.path, p);\n }\n this.beacons = world.places.filter((p) => p.kind === \"beacon\");\n this.forge = world.places.find((p) => p.kind === \"forge\") ?? world.places[0]!;\n this.dock = world.places.find((p) => p.kind === \"dock\") ?? this.forge;\n this.maxGap = opts.maxGapMs ?? 2500;\n this.msPerCell = opts.walkMsPerCell ?? 90;\n this.mood = new MoodTracker(opts.lostWindowMs ?? 90_000);\n this.actorAt.set(\"pip\", this.forge.id);\n }\n\n get timeline(): readonly Beat[] { return this.beats; }\n\n feed(e: AgentEvent): Beat[] {\n const start = this.beats.length;\n this.advanceClock(e.ts, e.id);\n const actor: ActorId = e.agentId && this.helpers.has(e.agentId) ? e.agentId : \"pip\";\n switch (e.kind) {\n case \"session_start\":\n this.emit(e, actor, { kind: \"curtain_up\", repoId: e.repoId }, 1200);\n break;\n case \"read_file\": {\n const p = this.placeFor(e.path, e, actor);\n this.walk(e, actor, p);\n this.emit(e, actor, { kind: \"read\", target: p.id }, clamp(700 + (e.bytes ?? 400) / 4, 900, 1800), this.mood.onRead());\n break;\n }\n case \"edit_file\":\n case \"write_file\": {\n const p = this.placeFor(e.path, e, actor);\n this.walk(e, actor, p);\n const lines = e.kind === \"edit_file\" ? e.added + e.removed : e.added;\n const intensity = clamp(Math.sqrt(lines / 50), 0.15, 1);\n const g = [...this.gremlins].find(([, at]) => at === p.id);\n if (g) this.emit(e, actor, { kind: \"chase\", gremlinId: g[0], target: p.id }, 900, this.mood.mood);\n if (e.kind === \"write_file\" && e.created) this.emit(e, actor, { kind: \"raise\", target: p.id }, 900, this.mood.onBuild());\n this.emit(e, actor, { kind: \"build\", target: p.id, intensity }, clamp(600 + intensity * 1900, 800, 2500), this.mood.onBuild());\n this.lastEdited = p;\n this.editedSinceTurn = true;\n this.verifiedSinceEdit = false;\n break;\n }\n case \"run_command\": {\n if (e.intent === \"test\") {\n const beacon = this.beaconFor(e.touched);\n this.walk(e, actor, beacon);\n this.pendingBeacon = beacon;\n this.emit(e, actor, { kind: \"run_tests\", target: beacon.id }, clamp(e.durationMs ?? 1200, 900, 3000), this.mood.mood);\n } else if (e.intent === \"search\") {\n this.emit(e, actor, { kind: \"search\", scope: \"repo\" }, 700, this.mood.onRead());\n } else if (e.touched.length === 0 || e.intent === \"git\" || e.intent === \"install\" || e.intent === \"build\") {\n this.walk(e, actor, this.forge);\n const intensity = e.intent === \"build\" || e.intent === \"install\" ? 0.8 : e.intent === \"git\" ? 0.4 : 0.5;\n this.emit(e, actor, { kind: \"forge\", intensity }, clamp(e.durationMs ?? 800, 700, 2000), this.mood.mood);\n }\n // write_file / read_file intents are followed by their own file events; no extra beat.\n if (!e.ok && e.intent !== \"test\") this.emit(e, actor, { kind: \"stumble\", retrying: false }, 600, this.mood.onError(e.ts));\n break;\n }\n case \"test_result\": {\n const beacon = this.pendingBeacon ?? this.beaconFor([]);\n this.pendingBeacon = null;\n const outcome: TestOutcome = e.framework === \"unknown\" && e.passed === 0 && e.failed === 0 ? (e.ok ? \"pass\" : \"fail\") : e.ok ? \"pass\" : \"fail\";\n if (outcome === \"pass\") {\n this.emit(e, actor, { kind: \"test_outcome\", target: beacon.id, outcome, passed: e.passed, failed: e.failed }, 800, this.mood.onPass());\n if (e.passed > 0 || e.framework === \"unknown\") { this.verifiedSinceEdit = true; this.everVerified = true; }\n for (const [gid] of this.gremlins) this.emit(e, actor, { kind: \"banish\", gremlinId: gid }, 700, \"happy\");\n this.gremlins.clear();\n if (this.claimGremlin) { this.emit(e, actor, { kind: \"banish\", gremlinId: this.claimGremlin }, 700, \"happy\"); this.claimGremlin = null; }\n this.emit(e, actor, { kind: \"celebrate\", target: beacon.id }, 1600, \"happy\");\n } else {\n this.emit(e, actor, { kind: \"test_outcome\", target: beacon.id, outcome, passed: e.passed, failed: e.failed }, 800, this.mood.onFail(e.ts));\n const at = this.lastEdited ?? beacon;\n const gid = `g:${e.id}`;\n this.gremlins.set(gid, at.id);\n this.emit(e, actor, { kind: \"spawn_gremlin\", gremlinId: gid, target: at.id }, 900, this.mood.mood);\n }\n break;\n }\n case \"search\":\n this.emit(e, actor, { kind: \"search\", scope: e.scope }, 700, this.mood.onRead());\n break;\n case \"subagent_start\":\n this.helpers.set(e.childId, e.label ? { label: e.label } : {});\n this.actorAt.set(e.childId, this.dock.id);\n this.emit(e, \"pip\", { kind: \"summon_helper\", helperId: e.childId, ...(e.label ? { label: e.label } : {}) }, 1400, this.mood.mood);\n break;\n case \"subagent_stop\":\n if (this.helpers.has(e.childId)) {\n this.emit(e, e.childId, { kind: \"dismiss_helper\", helperId: e.childId, ok: e.ok }, 1000, this.mood.mood);\n this.helpers.delete(e.childId);\n this.actorAt.delete(e.childId);\n }\n break;\n case \"waiting_for_user\":\n if (e.reason === \"idle\") this.emit(e, actor, { kind: \"your_turn\" }, 1000, this.mood.mood);\n else this.emit(e, actor, { kind: \"blocked_on_you\", reason: e.reason }, 1200, this.mood.mood);\n break;\n case \"error\":\n this.emit(e, actor, { kind: \"stumble\", retrying: e.retrying }, 700, this.mood.onError(e.ts));\n break;\n case \"turn_end\": {\n if (e.claimedSuccess && this.editedSinceTurn && !this.verifiedSinceEdit) {\n const gid = `claim:${e.id}`;\n this.claimGremlin = gid;\n this.emit(e, actor, { kind: \"unverified_claim\", gremlinId: gid }, 1400, this.mood.onClaimUnverified());\n }\n this.editedSinceTurn = false;\n this.emit(e, actor, { kind: \"your_turn\" }, 1000, this.mood.mood);\n break;\n }\n case \"session_end\":\n this.emit(e, actor, { kind: \"curtain_down\", verified: this.everVerified && !this.claimGremlin }, 1500, this.mood.mood);\n break;\n }\n return this.beats.slice(start);\n }\n\n // ---- internals ----\n private advanceClock(ts: number, eventId: string): void {\n if (this.lastRealTs !== null) {\n const lastEnd = this.beats.length ? Math.max(...this.beats.slice(-3).map((b) => b.atMs + b.durationMs)) : this.sceneMs;\n const gap = Math.min(Math.max(0, ts - this.lastRealTs), this.maxGap);\n const target = Math.max(lastEnd, this.sceneMs) + gap;\n if (target - lastEnd >= 1000) {\n const idle: Beat = { id: `b${this.seq++}`, atMs: lastEnd, durationMs: target - lastEnd, realTs: this.lastRealTs, mood: this.mood.mood, actor: \"pip\", sourceEventIds: [eventId], kind: \"idle\" };\n this.beats.push(idle);\n }\n this.sceneMs = Math.max(this.sceneMs, target);\n }\n this.lastRealTs = ts;\n }\n\n private emit(e: AgentEvent, actor: ActorId, body: BeatBody, durationMs: number, mood = this.mood.mood): Beat {\n durationMs = Math.round(durationMs);\n if (\"intensity\" in body) body = { ...body, intensity: Math.round(body.intensity * 1000) / 1000 };\n const b: Beat = { id: `b${this.seq++}`, atMs: Math.round(this.sceneMs), durationMs, realTs: e.ts, mood, actor, sourceEventIds: [e.id], ...body };\n this.beats.push(b);\n this.sceneMs += durationMs;\n return b;\n }\n\n private walk(e: AgentEvent, actor: ActorId, to: Place): void {\n const fromId = this.actorAt.get(actor) ?? this.forge.id;\n if (fromId === to.id) return;\n const from = this.places.get(fromId) ?? this.forge;\n const cells = Math.hypot(to.gx - from.gx, to.gy - from.gy);\n this.emit(e, actor, { kind: \"walk_to\", target: to.id }, clamp(Math.round(cells * this.msPerCell), 300, 2500));\n this.actorAt.set(actor, to.id);\n }\n\n private raised = 0;\n /** Known place; else the district's overflow building; else (bounded) a new one raised for a file created mid-session. */\n private placeFor(path: string, e: AgentEvent, actor: ActorId): Place {\n const known = this.byPath.get(path);\n if (known) return known;\n const top = path.includes(\"/\") ? path.slice(0, path.indexOf(\"/\")) : \"\";\n const overflow = this.byPath.get(`${top ? top + \"/\" : \"\"}…`);\n if (overflow && (this.raised >= 24 || !this.world.stats.capped === false)) return overflow;\n if (this.raised >= 24) return overflow ?? this.forge;\n this.raised++;\n const district = this.world.districts.find((d) => d.id === `d:${top}`) ?? this.world.districts[0];\n const anchor = district ? { gx: district.cx, gy: district.cy } : { gx: this.forge.gx + 3, gy: this.forge.gy };\n const place: Place = { id: `p:${path}`, kind: kindOf(path), path, label: path.slice(path.lastIndexOf(\"/\") + 1), district: district?.id ?? \"\", gx: anchor.gx, gy: anchor.gy, footprint: 1, height: 1, score: 0, touched: true };\n this.places.set(place.id, place);\n this.byPath.set(path, place);\n if (place.kind === \"beacon\") this.beacons.push(place);\n this.emit(e, actor, { kind: \"raise\", target: place.id, newPlace: { path, label: place.label, kind: place.kind, district: place.district } }, 900);\n return place;\n }\n\n /** The beacon a test run belongs to: an explicitly touched test file, else the last-edited district's, else the first, else the forge. */\n private beaconFor(touched: string[]): Place {\n const t = touched.find((p) => isTestPath(p));\n if (t) { const b = this.byPath.get(t); if (b) return b; }\n if (this.lastEdited) {\n const same = this.beacons.find((b) => b.district === this.lastEdited!.district);\n if (same) return same;\n }\n return this.beacons[0] ?? this.forge;\n }\n}\n\n/** Convenience for replay: the whole timeline at once. */\nexport function direct(events: AgentEvent[], world: World, opts?: DirectorOptions): Beat[] {\n const d = new Director(world, opts);\n for (const e of events) d.feed(e);\n return [...d.timeline];\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n","import type { AgentEvent } from \"../events/types.js\";\nimport type { FileNode } from \"./types.js\";\n\n/**\n * When the repo is not on disk (replaying someone else's session, or the VS\n * Code webview has no fs), infer a file list from the events themselves.\n * Sizes are estimated from the lines the session touched.\n */\nexport function filesFromEvents(events: AgentEvent[]): { files: FileNode[]; touched: string[] } {\n const loc = new Map<string, number>();\n const bump = (p: string, n: number) => loc.set(p, (loc.get(p) ?? 0) + n);\n for (const e of events) {\n if (e.kind === \"read_file\") bump(e.path, Math.max(5, Math.round((e.bytes ?? 400) / 40)));\n else if (e.kind === \"edit_file\") bump(e.path, Math.max(5, (e.added + e.removed) * 3));\n else if (e.kind === \"write_file\") bump(e.path, Math.max(5, e.added * 2));\n else if (e.kind === \"run_command\") for (const p of e.touched) bump(p, 5);\n }\n const touched = [...loc.keys()].sort((a, b) => loc.get(b)! - loc.get(a)!);\n return { files: touched.map((path) => ({ path, loc: loc.get(path)! })), touched };\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** ~/.claude/projects/<slug>/<session>.jsonl — slug = cwd with every non-alphanumeric → '-'. */\nexport function projectSlug(cwd: string): string {\n return cwd.replace(/[^A-Za-z0-9]/g, \"-\");\n}\nexport function claudeConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n}\nexport interface SessionInfo { id: string; path: string; mtime: number; bytes: number; title: string }\n\n/** Sessions for a repo, newest first, with a human title from the transcript's own title rows (local picker only; never into events). */\nexport function listSessions(cwd: string, env: NodeJS.ProcessEnv = process.env): SessionInfo[] {\n const dir = join(claudeConfigDir(env), \"projects\", projectSlug(cwd));\n let names: string[] = [];\n try { names = readdirSync(dir).filter((f) => f.endsWith(\".jsonl\")); } catch { return []; }\n const out: SessionInfo[] = [];\n for (const f of names) {\n const path = join(dir, f);\n try {\n const st = statSync(path);\n out.push({ id: f.replace(/\\.jsonl$/, \"\"), path, mtime: st.mtimeMs, bytes: st.size, title: sessionTitle(path) });\n } catch { /* unreadable: skip */ }\n }\n return out.sort((a, b) => b.mtime - a.mtime);\n}\n\n/** Title = latest `aiTitle` row, else the latest `lastPrompt` row (trimmed), else the id. Reads at most the last 256 KB. */\nexport function sessionTitle(path: string): string {\n let text = \"\";\n try {\n const st = statSync(path);\n const fd = readFileSync(path);\n text = fd.subarray(Math.max(0, st.size - 262_144)).toString(\"utf8\");\n } catch { return \"\"; }\n let ai = \"\", prompt = \"\";\n for (const line of text.split(\"\\n\")) {\n if (!line.includes('\"aiTitle\"') && !line.includes('\"lastPrompt\"')) continue;\n try {\n const row = JSON.parse(line) as { aiTitle?: string; lastPrompt?: string };\n if (typeof row.aiTitle === \"string\" && row.aiTitle.trim()) ai = row.aiTitle.trim();\n if (typeof row.lastPrompt === \"string\" && row.lastPrompt.trim()) prompt = row.lastPrompt.trim();\n } catch { /* partial line */ }\n }\n const t = ai || prompt;\n return t.length > 80 ? t.slice(0, 77) + \"…\" : t;\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { isIgnoredPath, type FileNode } from \"@agent-theatre/core\";\n\n/** The repo's file tree as FileNodes. Counts lines only; never keeps contents. Bounded for huge repos. */\nexport function scanRepo(root: string, opts: { maxFiles?: number; maxBytesForLoc?: number } = {}): FileNode[] {\n const maxFiles = opts.maxFiles ?? 20_000, maxBytes = opts.maxBytesForLoc ?? 512_000;\n const files: FileNode[] = [];\n const walk = (dir: string): void => {\n if (files.length >= maxFiles) return;\n let ents: import(\"node:fs\").Dirent[];\n try { ents = readdirSync(dir, { withFileTypes: true }); } catch { return; }\n for (const ent of ents) {\n if (files.length >= maxFiles) return;\n const full = join(dir, ent.name);\n const rel = relative(root, full).replace(/\\\\/g, \"/\");\n if (isIgnoredPath(rel + (ent.isDirectory() ? \"/\" : \"\"))) continue;\n if (ent.isDirectory()) walk(full);\n else if (ent.isFile()) {\n let size = 0;\n try { size = statSync(full).size; } catch { continue; }\n let loc: number | undefined;\n if (size < maxBytes) { try { const buf = readFileSync(full); if (!buf.subarray(0, 1024).includes(0)) loc = buf.toString(\"utf8\").split(\"\\n\").length; } catch { /* unreadable */ } }\n files.push({ path: rel, size, ...(loc !== undefined ? { loc } : {}) });\n }\n }\n };\n walk(root);\n return files;\n}\n\n/** Stable repo identity: git remote URL when available, else the absolute path. */\nexport function repoIdFor(root: string): string {\n try {\n const cfg = readFileSync(join(root, \".git\", \"config\"), \"utf8\");\n const m = /\\[remote \"origin\"\\]\\s*\\n\\s*url\\s*=\\s*(\\S+)/.exec(cfg);\n if (m) return m[1]!.replace(/\\.git$/, \"\").replace(/^git@([^:]+):/, \"$1/\").replace(/^https?:\\/\\//, \"\");\n } catch { /* not a git repo */ }\n return root;\n}\n","import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { hasOurHooks, patchSettings, unpatchSettings } from \"./patch.js\";\nimport { HOOK_SCRIPT } from \"./script.js\";\n\nexport interface InstallPaths { settings: string; home: string; script: string; backup: string }\nexport function installPaths(env: NodeJS.ProcessEnv = process.env): InstallPaths {\n const claude = env.CLAUDE_CONFIG_DIR || join(homedir(), \".claude\");\n const home = env.AGENT_THEATRE_HOME || join(homedir(), \".agent-theatre\");\n const settings = join(claude, \"settings.json\");\n return { settings, home, script: join(home, \"hooks\", \"agent-theatre-hook.mjs\"), backup: `${settings}.bak-agent-theatre` };\n}\nconst read = (p: string): string | null => (existsSync(p) ? readFileSync(p, \"utf8\") : null);\n\n/** Writes the hook script, then merges our entries into settings.json (backup first). Idempotent. */\nexport function installHooks(paths = installPaths()): { changed: boolean; backup: string | null } {\n mkdirSync(join(paths.home, \"hooks\"), { recursive: true });\n writeFileSync(paths.script, HOOK_SCRIPT, { mode: 0o755 });\n chmodSync(paths.script, 0o755);\n const existing = read(paths.settings);\n const { next, changed } = patchSettings(existing, paths.script);\n let backup: string | null = null;\n if (changed) {\n if (existing !== null) { copyFileSync(paths.settings, paths.backup); backup = paths.backup; }\n mkdirSync(join(paths.settings, \"..\"), { recursive: true });\n writeFileSync(paths.settings, next);\n }\n return { changed, backup };\n}\n\n/** Removes only our entries. Leaves the backup file in place for the user. */\nexport function uninstallHooks(paths = installPaths()): { changed: boolean } {\n const existing = read(paths.settings);\n if (existing === null) return { changed: false };\n const { next, changed } = unpatchSettings(existing);\n if (changed) { copyFileSync(paths.settings, paths.backup); writeFileSync(paths.settings, next); }\n return { changed };\n}\n\nexport function hooksStatus(paths = installPaths()): { installed: boolean; scriptPresent: boolean; settings: string } {\n return { installed: hasOurHooks(read(paths.settings)), scriptPresent: existsSync(paths.script), settings: paths.settings };\n}\n","/**\n * Non-destructive edits to ~/.claude/settings.json. Pure text → text so it is\n * trivially testable; the caller handles files and backups.\n *\n * // suite: candidate for shared package (Debug Anything has the same shape)\n */\nexport const HOOK_MARKER = \"agent-theatre-hook.mjs\";\n/** Events we observe. No matcher on PostToolUse: every tool is a beat. */\nexport const HOOK_EVENTS: ReadonlyArray<{ event: string; matcher?: string }> = [\n { event: \"SessionStart\" },\n { event: \"PostToolUse\" },\n { event: \"PostToolUseFailure\" },\n { event: \"SubagentStart\" },\n { event: \"SubagentStop\" },\n { event: \"Notification\" },\n { event: \"Stop\" },\n { event: \"SessionEnd\" },\n];\nexport const HOOK_TIMEOUT_S = 5;\n\ntype Settings = Record<string, unknown> & { hooks?: Record<string, unknown[]> };\n\nfunction parse(existing: string | null): Settings {\n if (existing === null || existing.trim() === \"\") return {};\n try {\n const obj = JSON.parse(existing);\n if (!obj || typeof obj !== \"object\" || Array.isArray(obj)) throw new Error(\"not an object\");\n return obj as Settings;\n } catch {\n throw new Error(\"existing settings.json is not valid JSON; refusing to overwrite it\");\n }\n}\nconst isOurs = (group: unknown): boolean => {\n const g = group as { hooks?: Array<{ command?: unknown }> };\n return Array.isArray(g?.hooks) && g.hooks.some((h) => typeof h?.command === \"string\" && h.command.includes(HOOK_MARKER));\n};\n\nexport function patchSettings(existing: string | null, scriptPath: string): { next: string; changed: boolean } {\n const obj = parse(existing);\n const hooks = (obj.hooks ??= {});\n const cmd = `node \"${scriptPath}\"`;\n let changed = false;\n for (const { event, matcher } of HOOK_EVENTS) {\n const list = (hooks[event] ??= []);\n const mine = list.find(isOurs) as { hooks: Array<{ command: string; timeout?: number }> } | undefined;\n if (mine) {\n // keep the path current if the install location moved\n for (const h of mine.hooks) if (h.command.includes(HOOK_MARKER) && h.command !== cmd) { h.command = cmd; changed = true; }\n continue;\n }\n list.push({ ...(matcher ? { matcher } : {}), hooks: [{ type: \"command\", command: cmd, timeout: HOOK_TIMEOUT_S }] });\n changed = true;\n }\n return { next: JSON.stringify(obj, null, 2) + \"\\n\", changed };\n}\n\nexport function unpatchSettings(existing: string | null): { next: string; changed: boolean } {\n const obj = parse(existing);\n let changed = false;\n const hooks = obj.hooks;\n if (hooks) {\n for (const event of Object.keys(hooks)) {\n const list = hooks[event];\n if (!Array.isArray(list)) continue;\n const kept = list.filter((g) => !isOurs(g));\n if (kept.length !== list.length) changed = true;\n if (kept.length) hooks[event] = kept;\n else delete hooks[event];\n }\n if (Object.keys(hooks).length === 0) delete obj.hooks;\n }\n return { next: JSON.stringify(obj, null, 2) + \"\\n\", changed };\n}\n\nexport function hasOurHooks(existing: string | null): boolean {\n try {\n const obj = parse(existing);\n return Object.values(obj.hooks ?? {}).some((l) => Array.isArray(l) && l.some(isOurs));\n } catch {\n return false;\n }\n}\n","/**\n * The hook script Claude Code runs on every event. Dependency-free, starts in\n * ~40 ms, and can NEVER slow or block the agent: a dead server, a missing\n * port file, bad JSON — all exit 0 silently within 300 ms. It never writes to\n * stdout, so it can never inject context or block a tool.\n *\n * hooks/agent-theatre-hook.mjs must be byte-identical (tests/script.test.ts).\n */\nexport const HOOK_SCRIPT = `#!/usr/bin/env node\n// Agent Theatre hook — forwards Claude Code events to the local theatre. Never blocks the agent.\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nconst portFile = join(process.env.AGENT_THEATRE_HOME || join(homedir(), \".agent-theatre\"), \"port\");\nlet port = 0;\ntry { port = parseInt(readFileSync(portFile, \"utf8\").trim(), 10); } catch { process.exit(0); }\nif (!port) process.exit(0);\nlet body = \"\";\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (c) => { body += c; if (body.length > 2_000_000) body = body.slice(0, 2_000_000); });\nprocess.stdin.on(\"end\", async () => {\n try {\n await fetch(\\`http://127.0.0.1:\\${port}/hook\\`, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body, signal: AbortSignal.timeout(300) });\n } catch { /* theatre not running or slow: that is fine */ }\n process.exit(0);\n});\nsetTimeout(() => process.exit(0), 600).unref();\n`;\n"],"mappings":"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","names":["existsSync","readFileSync","join","readFileSync","homedir","join","basename","base","obj","str","blocks","pkg","norm","homedir","readFileSync","join","basename","norm","readdirSync","readFileSync","statSync","join","readdirSync","join","statSync","readFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","obj","hooks","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","readFileSync","join","existsSync","pick"]}
|