sessionpipe 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../../core/src/adapters/antigravity.ts", "../../core/src/paths.ts", "../../core/src/readers/files.ts", "../../core/src/readers/transcripts.ts", "../../core/src/adapters/claude-shaped.ts", "../../core/src/adapters/claude-code.ts", "../../core/src/readers/git.ts", "../../core/src/adapters/codex.ts", "../../core/src/adapters/codex-config.ts", "../../core/src/adapters/gemini-cli.ts", "../../core/src/adapters/index.ts", "../../core/src/config.ts", "../../core/src/ulid.ts", "../../core/src/events.ts", "../../core/src/outbox.ts", "../../core/src/privacy/pii.ts", "../../core/src/privacy/secrets.ts", "../../core/src/privacy/filter.ts", "../../core/src/sinks/file.ts", "../../core/src/sinks/stdout.ts", "../src/run.ts", "../src/http-sink.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n// SPDX-License-Identifier: Apache-2.0\n// sessionpipe: install once, hook everything, choose per sink what leaves.\n// install \u00B7 uninstall \u00B7 sink add|list|remove|test \u00B7 status \u00B7 doctor \u00B7 tail \u00B7\n// backfill \u00B7 forget \u00B7 replay \u00B7 update \u00B7 hook \u00B7 worker\nimport { execFileSync, spawn, spawnSync } from \"node:child_process\";\nimport { mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ADAPTERS,\n adapterByName,\n type Config,\n Cursors,\n configFile,\n type Event,\n filterEvent,\n type HookCommand,\n machineName,\n makeEvent,\n Outbox,\n readConfig,\n type SinkConfig,\n stateDir,\n type Tier,\n tilde,\n writeConfig,\n} from \"@sessionpipe/core\";\nimport { buildSinks, factsState, flush, jobsDir, runJob, VERSION } from \"./run.js\";\n\nprocess.stdout.on(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EPIPE\") process.exit(0);\n});\nconst args = process.argv.slice(2);\nconst cmd = args[0] ?? \"help\";\nconst flag = (name: string): string | undefined => {\n const i = args.indexOf(name);\n return i >= 0 ? args[i + 1] : undefined;\n};\nconst has = (name: string): boolean => args.includes(name);\nconst out = (s = \"\"): void => {\n process.stdout.write(`${s}\\n`);\n};\nconst state = stateDir();\nconst distDir = path.dirname(fileURLToPath(import.meta.url));\n\n/** The command a hook entry runs: this node by a stable absolute path, hook.js by its real path. */\nfunction hookCommand(): HookCommand {\n const node = stableNode(process.execPath);\n let script = path.join(distDir, \"hook.js\");\n try {\n script = realpathSync(script);\n } catch {}\n return (a) => ({\n argv: [node, script, ...a],\n command: `${JSON.stringify(node)} ${JSON.stringify(script)} ${a.join(\" \")}`,\n });\n}\n/** Homebrew's versioned Cellar path dies on `brew upgrade node`; its stable links survive. */\nfunction stableNode(exe: string): string {\n const m = /^(.*)\\/Cellar\\/(node(?:@\\d+)?)\\/[^/]+\\/bin\\/node$/.exec(exe);\n if (!m) return exe;\n let real: string;\n try {\n real = realpathSync(exe);\n } catch {\n return exe;\n }\n for (const c of [`${m[1]}/opt/${m[2]}/bin/node`, `${m[1]}/bin/node`]) {\n try {\n if (realpathSync(c) === real) return c;\n } catch {}\n }\n return exe;\n}\nconst viaNpx = /[\\\\/]_npx[\\\\/]/.test(distDir) || /[\\\\/]\\.npm[\\\\/]/.test(distDir);\n\nfunction selectedAdapters(): typeof ADAPTERS {\n const named = ADAPTERS.filter((a) => has(`--${a.name}`));\n if (named.length) return named;\n return ADAPTERS.filter((a) => a.detect());\n}\n\nasync function main(): Promise<void> {\n switch (cmd) {\n case \"install\":\n return install();\n case \"uninstall\":\n return uninstall();\n case \"sink\":\n return sink();\n case \"status\":\n return status();\n case \"doctor\":\n return doctor();\n case \"tail\":\n return tail();\n case \"backfill\":\n return backfill();\n case \"forget\":\n return forget();\n case \"replay\":\n return replay();\n case \"update\":\n return update();\n case \"worker\":\n return workerFromArgv();\n case \"hook\":\n out(\"sessionpipe hook is dist/hook.js; harnesses run it directly\");\n return;\n case \"--version\":\n case \"-v\":\n case \"version\":\n out(VERSION);\n return;\n default:\n return help();\n }\n}\n\nfunction help(): void {\n out(`sessionpipe ${VERSION} \u2014 an open protocol for what your coding agents are doing\n\n sessionpipe install [--claude-code --codex --gemini-cli --antigravity] [--machine NAME] [--backfill DAYS] [--sink URL --tier N]\n sessionpipe uninstall [--keep-state]\n sessionpipe sink add <url|file:PATH|stdout> [--tier 0-3] [--token T] [--pii] [--control] [--name N]\n sessionpipe sink list | remove <name> | test <name>\n sessionpipe status | doctor [--json]\n sessionpipe tail [--session ID] [--tier N] [--harness NAME]\n sessionpipe backfill [--days 30] | forget <harness> <session> | replay --sink NAME\n sessionpipe update\n\nDocs: https://sessionpipe.org \u00B7 nothing leaves this machine until you add a sink.`);\n}\n\nasync function install(): Promise<void> {\n if (viaNpx) {\n out(` Installing sessionpipe@${VERSION} globally, so the hooks start in milliseconds\u2026`);\n try {\n // Homebrew's default prefix is the versioned Cellar folder that `brew upgrade\n // node` deletes, and its bin is not on PATH (issue #13): install into ~/.local\n // there, and run the copy from the prefix we installed into.\n let prefix = \"\";\n try {\n prefix = execFileSync(\"npm\", [\"prefix\", \"-g\"], {\n encoding: \"utf8\",\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {}\n const target = /\\/Cellar\\/node(?:@\\d+)?\\/[^/]+/.test(prefix) ? path.join(os.homedir(), \".local\") : prefix;\n execFileSync(\"npm\", [\"install\", \"-g\", `sessionpipe@${VERSION}`, ...(target ? [\"--prefix\", target] : [])], {\n stdio: [\"ignore\", \"ignore\", \"inherit\"],\n });\n const bin =\n process.platform === \"win32\"\n ? path.join(target, \"sessionpipe.cmd\")\n : target\n ? path.join(target, \"bin\", \"sessionpipe\")\n : \"sessionpipe\";\n if (target && target !== prefix)\n out(` Installed into ${target}; make sure ${path.join(target, \"bin\")} is on your PATH.`);\n execFileSync(bin, args, { stdio: \"inherit\", shell: process.platform === \"win32\" });\n return;\n } catch {\n out(\n \" ! couldn't install globally (`npm install -g sessionpipe` failed). Run it yourself, then `sessionpipe install`.\",\n );\n process.exit(1);\n }\n }\n const cfg = readConfig();\n const machine = flag(\"--machine\");\n if (machine) cfg.machine = machine.slice(0, 80);\n // A sink URL given here is added first, so the install knows whether it needs\n // every tool event or only the heartbeat's one.\n const sinkUrl = flag(\"--sink\");\n if (sinkUrl) await sinkAdd(sinkUrl, cfg);\n const adapters = selectedAdapters();\n if (!adapters.length) {\n out(\n \" No supported harness found on this machine (Claude Code, Codex, Gemini CLI, Antigravity). Pass --<harness> to force one.\",\n );\n return;\n }\n out(` Machine: ${machineName(cfg, os.hostname())}`);\n const lean = isLean(cfg);\n if (lean)\n out(\n \" No sink above tier 0: hooking one tool event per harness (the heartbeat's). `sink add \u2026 --tier 1` or higher hooks the rest.\",\n );\n installHarnesses(adapters, cfg, lean);\n writeConfig(cfg);\n const days = Number(flag(\"--backfill\") ?? 30);\n if (days > 0) backfillRows(adapters, days, cfg);\n out(\"\");\n const live = cfg.sinks.filter((s) => !s.paused);\n if (live.length) out(` Reporting to ${live.map((s) => `${s.name} (tier ${s.tier})`).join(\", \")}.`);\n else\n out(\n \" Nothing leaves this machine yet: events go to the local outbox. `sessionpipe tail` shows them; `sessionpipe sink add <url> --tier N` sends them.\",\n );\n out(\" Sessions already running pick up hooks on their next start (Claude Code \u2265 2.1.280 picks them up live).\");\n}\n\n/** No sink takes tier \u2265 1: the harness only needs one tool event (issue #12). */\nfunction isLean(cfg: Config): boolean {\n return !cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 1);\n}\n\n/** Write the hooks for these harnesses; remember which files sessionpipe created. */\nfunction installHarnesses(adapters: readonly (typeof ADAPTERS)[number][], cfg: Config, lean: boolean): void {\n const hc = hookCommand();\n for (const a of adapters) {\n const prev = cfg.harnesses[a.name] ?? {};\n const created = new Set(prev.created ?? []);\n const reports = a.install(hc, process.env, { lean, created: [...created] });\n for (const r of reports) {\n if (r.created) created.add(r.file);\n const mark = r.skipped ? \"!\" : r.changed ? \"\u2713\" : \"=\";\n out(\n ` ${mark} ${a.name}: ${tilde(r.file)}${r.note ? ` \u2014 ${r.note}` : r.changed ? \" written\" : \" already current\"}`,\n );\n }\n cfg.harnesses[a.name] = { enabled: true, ...(created.size ? { created: [...created] } : {}) };\n if (a.name === \"gemini-cli\")\n out(\" note: Gemini CLI's own telemetry defaults logPrompts on; that is Google's setting, not sessionpipe's.\");\n if (a.name === \"codex\" && !reports.some((r) => r.skipped))\n out(\n \" note: Codex runs non-managed hooks only after you approve them: start `codex` and accept the hook review. The notify fallback reports turn ends meanwhile.\",\n );\n }\n}\n\nfunction uninstall(): void {\n const cfg = readConfig();\n for (const a of ADAPTERS) {\n const created = cfg.harnesses[a.name]?.created ?? [];\n for (const r of a.uninstall(process.env, { created }))\n if (r.changed) out(` \u2713 ${a.name}: ${r.note ?? `hooks removed from ${tilde(r.file)}`}`);\n else if (r.skipped) out(` ! ${a.name}: ${tilde(r.file)} \u2014 ${r.note}`);\n delete cfg.harnesses[a.name];\n }\n writeConfig(cfg);\n if (!has(\"--keep-state\"))\n out(\n ` Outbox and state kept under ${tilde(state)} (delete it yourself, or pass nothing: it prunes after ${readConfig().keep_days ?? 30} days).`,\n );\n out(\" Done. Every config file is byte-identical except for the entries sessionpipe wrote.\");\n}\n\nasync function sink(): Promise<void> {\n const sub = args[1];\n const cfg = readConfig();\n if (sub === \"add\" && args[2]) return sinkAdd(args[2], cfg);\n if (sub === \"list\") {\n if (!cfg.sinks.length) out(\" no sinks\");\n for (const s of cfg.sinks)\n out(\n ` ${s.name.padEnd(16)} ${s.url.padEnd(44)} tier ${s.tier}${s.max_tier !== undefined && s.max_tier < s.tier ? ` (capped ${s.max_tier})` : \"\"}${s.pii ? \" pii\" : \"\"}${s.control ? \" control\" : \"\"}${s.paused ? ` PAUSED ${s.paused}` : \"\"}`,\n );\n return;\n }\n if (sub === \"remove\" && args[2]) {\n const n = cfg.sinks.length;\n cfg.sinks = cfg.sinks.filter((s) => s.name !== args[2]);\n writeConfig(cfg);\n out(cfg.sinks.length < n ? ` \u2713 removed ${args[2]}` : ` no sink named ${args[2]}`);\n return;\n }\n if (sub === \"test\" && args[2]) {\n const s = cfg.sinks.find((x) => x.name === args[2]);\n if (!s) return out(` no sink named ${args[2]}`);\n const [sk] = buildSinks([s]);\n if (!sk) return out(\" sink type not supported yet\");\n // One heartbeat, then its forget: the receiver sees the round trip and keeps no row.\n const session = { id: `test-${Date.now()}`, machine: machineName(cfg, os.hostname()) };\n const mk = (type: string, seq: number) =>\n makeEvent(\n { type, harnessEvent: \"test\", data: {} },\n { harness: { name: \"sessionpipe\" }, session: { ...session, seq } },\n );\n const r = await sk.send([\n filterEvent(mk(\"session.heartbeat\", 0), sk.tier, sk.pii) as Event,\n filterEvent(mk(\"session.forgotten\", 1), sk.tier, sk.pii) as Event,\n ]);\n out(\n r.ok\n ? ` \u2713 ${s.name}: ${r.status ?? \"ok\"} accepted ${r.accepted ?? 2} (a heartbeat and its forget)`\n : ` \u2717 ${s.name}: ${r.status ?? \"\"} ${r.error ?? \"\"} (${r.action})`,\n );\n return;\n }\n out(\n \"usage: sessionpipe sink add <url|file:PATH|stdout> [--tier N] [--token T] [--pii] [--control] [--name N] | list | remove <name> | test <name>\",\n );\n}\n\nasync function sinkAdd(url: string, cfg: Config): Promise<void> {\n const tier = Math.max(0, Math.min(3, Number(flag(\"--tier\") ?? 0))) as Tier;\n const name = flag(\"--name\") ?? (url === \"stdout\" ? \"stdout\" : url.startsWith(\"file:\") ? \"file\" : new URL(url).host);\n const s: SinkConfig = { name, url, tier, pii: has(\"--pii\"), control: has(\"--control\") };\n const token = flag(\"--token\");\n if (token) s.token = token;\n const secret = flag(\"--secret\");\n if (secret) s.secret = secret;\n if (/^https?:\\/\\//.test(url)) {\n try {\n const r = await fetch(`${url.replace(/\\/$/, \"\")}/.well-known/sessionpipe`, { signal: AbortSignal.timeout(8000) });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n const wk = (await r.json()) as { max_tier?: number; endpoints?: { events?: string }; capabilities?: string[] };\n if (typeof wk.max_tier === \"number\") {\n s.max_tier = wk.max_tier as Tier;\n if (wk.max_tier < tier)\n out(` receiver's max_tier is ${wk.max_tier}: sending tier ${wk.max_tier}, not ${tier}`);\n }\n if (wk.endpoints) (s as SinkConfig & { endpoints?: unknown }).endpoints = wk.endpoints;\n s.well_known_at = new Date().toISOString();\n if (s.control && !(wk.capabilities ?? []).includes(\"control\")) {\n out(\" receiver does not list `control`; --control ignored\");\n s.control = false;\n }\n } catch (e) {\n out(\n ` ! ${url} has no readable /.well-known/sessionpipe (${(e as Error).message}); added anyway, at tier ${tier}`,\n );\n }\n }\n cfg.sinks = cfg.sinks.filter((x) => x.name !== name).concat([s]);\n writeConfig(cfg);\n out(\n ` \u2713 sink ${name}: ${url} at tier ${Math.min(tier, s.max_tier ?? 3)}${s.pii ? \", pii\" : \"\"}${s.control ? \", control\" : \"\"}`,\n );\n out(` tier ${tier} sends: ${TIER_TEXT[Math.min(tier, s.max_tier ?? 3) as Tier]}`);\n}\nconst TIER_TEXT: Record<Tier, string> = {\n 0: \"session state and timing, machine, folder, repo, branch, model, title, link, the KIND of attention needed \u2014 no tool names, no words\",\n 1: \"tier 0 + tool names, durations, ok/error, file paths, the attention message, subagents, compactions \u2014 no prompts\",\n 2: \"tier 1 + your prompts and the assistant's text, secrets removed\",\n 3: \"everything, including tool input and output\",\n};\n\nfunction backfillRows(adapters: readonly (typeof ADAPTERS)[number][], days: number, cfg: Config): void {\n const since = Date.now() - days * 86_400_000;\n const outbox = new Outbox(state);\n let n = 0;\n const machine = machineName(cfg, os.hostname());\n for (const a of adapters) {\n for (const row of a.backfill(since)) {\n const ref = { harness: a.name, session: row.session.id };\n const facts = factsState(state).get(a.name, row.session.id);\n if (facts.backfilled) continue;\n const { id, ...rest } = row.session;\n const e = makeEvent(\n {\n type: \"session.backfill\",\n harnessEvent: \"backfill\",\n data: {\n started_at: new Date(row.started_at).toISOString(),\n last_at: new Date(row.last_at).toISOString(),\n ...(row.turns !== undefined ? { turns: row.turns } : {}),\n },\n },\n {\n harness: { name: a.name },\n session: { ...rest, id, seq: outbox.nextSeq(ref), machine, ...(rest.cwd ? { cwd: tilde(rest.cwd) } : {}) },\n now: row.last_at,\n },\n );\n outbox.append(ref, [e]);\n factsState(state).save(a.name, row.session.id, { backfilled: true });\n n++;\n }\n }\n out(` \u2713 Backfill: ${n} session${n === 1 ? \"\" : \"s\"} from the last ${days} days queued as session.backfill`);\n void flush(state, cfg.sinks, outbox);\n}\n\nfunction backfill(): void {\n backfillRows(selectedAdapters(), Number(flag(\"--days\") ?? 30), readConfig());\n}\n\nasync function forget(): Promise<void> {\n const [, harness, session] = args;\n if (!harness || !session) return out(\"usage: sessionpipe forget <harness> <session>\");\n const cfg = readConfig();\n const outbox = new Outbox(state);\n const ref = { harness, session };\n const e = makeEvent(\n { type: \"session.forgotten\", harnessEvent: \"forget\", data: {} },\n {\n harness: { name: harness },\n session: { id: session, seq: outbox.nextSeq(ref), machine: machineName(cfg, os.hostname()) },\n },\n );\n const sinks = buildSinks(cfg.sinks);\n for (const s of sinks) {\n const r = await s.send([filterEvent(e, s.tier, s.pii) as Event]);\n out(r.ok ? ` \u2713 ${s.name}: asked to delete ${harness}:${session}` : ` \u2717 ${s.name}: ${r.error ?? r.status}`);\n }\n outbox.delete(ref);\n out(\" local outbox for the session removed\");\n}\n\nasync function replay(): Promise<void> {\n const name = flag(\"--sink\");\n const cfg = readConfig();\n const sinks = name ? cfg.sinks.filter((s) => s.name === name) : cfg.sinks;\n if (!sinks.length) return out(\" no such sink\");\n for (const s of sinks) {\n if (has(\"--from-start\")) new Cursors(state, s.name).write({});\n }\n const d = await flush(state, sinks, new Outbox(state));\n for (const [k, v] of Object.entries(d)) out(` ${k}: ${v} event${v === 1 ? \"\" : \"s\"} delivered`);\n}\n\nfunction status(): void {\n const cfg = readConfig();\n const hc = hookCommand();\n out(` machine: ${machineName(cfg, os.hostname())} sessionpipe ${VERSION} state ${tilde(state)}`);\n for (const a of ADAPTERS) {\n if (!a.detect() && !cfg.harnesses[a.name]) continue;\n for (const r of a.installed(hc, process.env, { lean: isLean(cfg) }))\n out(\n ` ${a.name.padEnd(12)} ${tilde(r.file).padEnd(44)} ${r.state}${r.state !== \"current\" && r.note ? ` \u2014 ${r.note}` : \"\"}`,\n );\n }\n if (!cfg.sinks.length) out(\" sinks: none (events stay in the local outbox)\");\n for (const s of cfg.sinks) {\n const c = new Cursors(state, s.name).read();\n const outbox = new Outbox(state);\n let pending = 0;\n for (const ref of outbox.sessions()) {\n const f = outbox.file(ref);\n try {\n pending += Math.max(0, statSync(f).size - (c[`${ref.harness}/${ref.session}`] ?? 0)) > 0 ? 1 : 0;\n } catch {}\n }\n out(\n ` sink ${s.name.padEnd(16)} tier ${Math.min(s.tier, s.max_tier ?? 3)} ${s.paused ? `PAUSED ${s.paused}` : pending ? `${pending} session file(s) with undelivered events` : \"up to date\"}`,\n );\n }\n const t = timing();\n if (t)\n out(\n ` hook: in-process p50 ${t.p50} ms over ${t.n} runs (\\`sessionpipe doctor\\` measures the wall clock the harness waits)`,\n );\n const jobs = jobsDir(state);\n try {\n const n = readdirSync(jobs).length;\n if (n) out(` jobs: ${n} waiting`);\n } catch {}\n}\n\n/** Spawn the hook the way a harness does and time the whole process (issue #12:\n * the in-process clock misses Node's startup, ~200 ms on an older Intel Mac). */\nfunction hookWall(runs = 8): { n: number; p50: number; p95: number } | null {\n const hook = path.join(distDir, \"hook.js\");\n const tmp = mkdtempSync(path.join(os.tmpdir(), \"sessionpipe-doctor-\"));\n const env = {\n ...process.env,\n SESSIONPIPE_STATE: tmp,\n SESSIONPIPE_CONFIG: path.join(tmp, \"config.json\"),\n SESSIONPIPE_NO_WORKER: \"1\",\n };\n const input = JSON.stringify({\n session_id: \"doctor\",\n hook_event_name: \"PostToolUse\",\n tool_name: \"Bash\",\n cwd: process.cwd(),\n });\n const times: number[] = [];\n try {\n for (let i = 0; i < runs; i++) {\n const t0 = process.hrtime.bigint();\n const r = spawnSync(process.execPath, [hook, \"claude-code\", \"PostToolUse\"], { input, env, encoding: \"utf8\" });\n if (r.status !== 0) return null;\n times.push(Number(process.hrtime.bigint() - t0) / 1e6);\n }\n } catch {\n return null;\n } finally {\n rmSync(tmp, { recursive: true, force: true });\n }\n times.sort((a, b) => a - b);\n const q = (p: number) => Math.round(times[Math.min(times.length - 1, Math.floor(p * times.length))] ?? 0);\n return { n: times.length, p50: q(0.5), p95: q(0.95) };\n}\n\nfunction timing(): { n: number; p50: number; p95: number } | null {\n try {\n const lines = readFileSync(path.join(state, \"timing.jsonl\"), \"utf8\").trim().split(\"\\n\").slice(-100);\n const ms = lines\n .map((l) => (JSON.parse(l) as { ms: number }).ms)\n .filter((x) => x >= 0)\n .sort((a, b) => a - b);\n if (!ms.length) return null;\n const q = (p: number) => Math.round(ms[Math.min(ms.length - 1, Math.floor(p * ms.length))] ?? 0);\n return { n: ms.length, p50: q(0.5), p95: q(0.95) };\n } catch {\n return null;\n }\n}\n\nfunction doctor(): void {\n const cfg = readConfig();\n const hc = hookCommand();\n const report: Record<string, unknown> = {\n version: VERSION,\n node: process.version,\n node_path: stableNode(process.execPath),\n machine: machineName(cfg, os.hostname()),\n state: state,\n config: configFile(),\n harnesses: {},\n sinks: [],\n timing: timing(),\n hook_wall_ms: hookWall(),\n warnings: [] as string[],\n };\n const warnings = report.warnings as string[];\n if (/\\/Cellar\\/node(?:@\\d+)?\\/[^/]+\\//.test(distDir))\n warnings.push(\n \"sessionpipe is installed inside Homebrew's versioned node folder; `brew upgrade node` will delete it. Install with `npm install -g --prefix ~/.local sessionpipe`.\",\n );\n for (const a of ADAPTERS) {\n if (!a.detect()) continue;\n const st = a.installed(hc, process.env, { lean: isLean(cfg) });\n (report.harnesses as Record<string, unknown>)[a.name] = st.map((r) => ({\n file: tilde(r.file),\n state: r.state,\n ...(r.note ? { note: r.note } : {}),\n }));\n for (const r of st)\n if (r.state === \"inactive\")\n warnings.push(`${a.name}: hooks are written but the harness will not run them \u2014 ${r.note ?? \"\"}`);\n for (const r of st)\n if (r.state === \"stale\")\n warnings.push(\n `${a.name}: the hook in ${tilde(r.file)} points at an old node or script path; run \\`sessionpipe install\\` again.`,\n );\n for (const r of st)\n if (r.state === \"misplaced\")\n warnings.push(\n `${a.name}: the notify line in ${tilde(r.file)} sits inside a [table], where Codex never reads it; run \\`sessionpipe install\\` again.`,\n );\n }\n for (const s of cfg.sinks)\n (report.sinks as unknown[]).push({\n name: s.name,\n url: s.url,\n tier: s.tier,\n max_tier: s.max_tier ?? null,\n pii: !!s.pii,\n control: !!s.control,\n paused: s.paused ?? null,\n token: s.token ? `${s.token.slice(0, 4)}\u2026` : null,\n });\n const w = report.hook_wall_ms as { p50: number; p95: number; n: number } | null;\n if (w && w.p50 > 150)\n warnings.push(\n `the harness waits ${w.p50} ms per hook (p50, target < 150): that is Node's own startup on this machine. A lean install (no sink above tier 0) hooks fewer events.`,\n );\n if (has(\"--json\")) {\n out(JSON.stringify(report, null, 2));\n return;\n }\n out(` sessionpipe ${VERSION} \u00B7 node ${process.version} at ${report.node_path}`);\n out(` config ${tilde(configFile())} \u00B7 state ${tilde(state)}`);\n for (const [h, st] of Object.entries(report.harnesses as Record<string, { file: string; state: string }[]>))\n for (const r of st) out(` ${h.padEnd(12)} ${r.file.padEnd(44)} ${r.state}`);\n for (const s of report.sinks as { name: string; tier: number; max_tier: number | null; paused: string | null }[])\n out(\n ` sink ${s.name.padEnd(16)} tier ${s.tier}${s.max_tier !== null ? ` (receiver max ${s.max_tier})` : \"\"}${s.paused ? ` PAUSED ${s.paused}` : \"\"}`,\n );\n const t = report.timing as { p50: number; p95: number; n: number } | null;\n out(\n w\n ? ` hook wall clock (what the harness waits): p50 ${w.p50} ms \u00B7 p95 ${w.p95} ms over ${w.n} spawns`\n : \" hook wall clock: could not spawn dist/hook.js\",\n );\n out(\n t\n ? ` hook in-process: p50 ${t.p50} ms \u00B7 p95 ${t.p95} ms over the last ${t.n} runs`\n : \" hook in-process: no runs yet\",\n );\n for (const w of warnings) out(` ! ${w}`);\n if (!warnings.length) out(\" no warnings\");\n}\n\n/** Follow the local outbox: one event per line, filtered to a tier. The zero-server demo. */\nasync function tail(): Promise<void> {\n const tier = Math.max(0, Math.min(3, Number(flag(\"--tier\") ?? 1))) as Tier;\n const onlySession = flag(\"--session\");\n const onlyHarness = flag(\"--harness\");\n const outbox = new Outbox(state);\n const offsets = new Map<string, number>();\n const fmt = (e: Event): string => {\n const t = e.time.slice(11, 19);\n const d = e.data as Record<string, unknown>;\n let detail = \"\";\n switch (e.type) {\n case \"session.started\":\n detail = `source=${d.source} ${e.session.cwd ?? \"\"} ${e.session.branch ?? \"\"}`;\n break;\n case \"turn.started\":\n detail = d.prompt_chars !== undefined ? `prompt_chars=${d.prompt_chars}` : \"\";\n break;\n case \"tool.started\":\n detail = String(d.tool ?? \"\");\n break;\n case \"tool.ended\":\n detail = `${d.tool} ${d.ok ? \"ok\" : \"error\"}${d.ms !== undefined ? ` ${d.ms}ms` : \"\"}`;\n break;\n case \"attention.needed\":\n detail = `${d.kind}${d.tool ? ` ${d.tool}` : \"\"}${d.message ? ` \"${String(d.message).slice(0, 60)}\"` : \"\"}`;\n break;\n case \"turn.ended\":\n detail = String(d.reason ?? \"\");\n break;\n case \"session.ended\":\n detail = `reason=${d.reason}`;\n break;\n case \"turn.transcript\":\n detail = `#${d.turn} \"${String(d.user).slice(0, 50).replace(/\\s+/g, \" \")}\"`;\n break;\n case \"session.backfill\":\n detail = `${e.session.title ?? \"\"}`;\n break;\n default:\n detail = JSON.stringify(d).slice(0, 80);\n }\n return `${t} ${e.harness.name.padEnd(11)} ${e.session.id.slice(0, 4)}\u2026 ${e.type.padEnd(17)} ${detail}`;\n };\n out(`sessionpipe tail \u00B7 tier ${tier} \u00B7 ${tilde(state)}/outbox (Ctrl-C to stop)`);\n // Start at the end of each file unless --all.\n for (const ref of outbox.sessions()) {\n try {\n offsets.set(`${ref.harness}/${ref.session}`, has(\"--all\") ? 0 : statSync(outbox.file(ref)).size);\n } catch {}\n }\n for (;;) {\n for (const ref of outbox.sessions()) {\n if (onlyHarness && ref.harness !== onlyHarness) continue;\n if (onlySession && !ref.session.startsWith(onlySession)) continue;\n const k = `${ref.harness}/${ref.session}`;\n const from = offsets.get(k) ?? 0;\n const { events, offset } = outbox.read(ref, from, 200);\n offsets.set(k, offset);\n for (const e of events) {\n const f = filterEvent(e, tier, false);\n if (f) out(has(\"--json\") ? JSON.stringify(f) : fmt(f));\n }\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n}\n\nasync function workerFromArgv(): Promise<void> {\n const f = args[1];\n if (!f) return;\n const job = JSON.parse(readFileSync(f, \"utf8\"));\n try {\n unlinkSync(f);\n } catch {}\n await runJob(job);\n}\n\nasync function update(): Promise<void> {\n if (process.env.SESSIONPIPE_NO_UPDATE_CHECK) return out(\" update check is off (SESSIONPIPE_NO_UPDATE_CHECK)\");\n try {\n const r = await fetch(\"https://registry.npmjs.org/sessionpipe/latest\", { signal: AbortSignal.timeout(8000) });\n const j = (await r.json()) as { version?: string };\n if (!j.version) throw new Error(\"no version\");\n if (j.version === VERSION) return out(` sessionpipe ${VERSION} is current`);\n out(` ${j.version} is available (you run ${VERSION}); installing into this copy's prefix\u2026`);\n const prefix = prefixOf(distDir);\n execFileSync(\"npm\", [\"install\", \"-g\", `sessionpipe@${j.version}`, ...(prefix ? [\"--prefix\", prefix] : [])], {\n stdio: \"inherit\",\n });\n out(\" re-arming hooks\u2026\");\n const bin = prefix ? path.join(prefix, \"bin\", \"sessionpipe\") : \"sessionpipe\";\n const p = spawn(bin, [\"install\", \"--backfill\", \"0\"], { stdio: \"inherit\" });\n await new Promise((r) => p.on(\"exit\", r));\n } catch (e) {\n out(` couldn't check npm: ${(e as Error).message}`);\n }\n}\nfunction prefixOf(p: string): string | null {\n const re =\n process.platform === \"win32\"\n ? /^(.*?)[\\\\/]node_modules[\\\\/]sessionpipe[\\\\/]/\n : /^(.*)\\/lib\\/node_modules\\/sessionpipe\\//;\n const m = re.exec(p);\n return m?.[1] ?? null;\n}\n\nmain().catch((e) => {\n process.stderr.write(`sessionpipe: ${(e as Error).message}\\n`);\n process.exit(1);\n});\n", "// SPDX-License-Identifier: Apache-2.0\n// Antigravity (Google) \u2014 docs: https://antigravity.google/docs/hooks\n// Config: ~/.gemini/config/hooks.json \u2014 top-level keys are hook NAMES, ours is\n// \"sessionpipe\". stdin is camelCase with NO event name (it rides in argv). Every\n// hook must print `{}`; non-JSON is a deny. Timeouts in seconds. No session end\n// exists. Ported from spacesheep-cli lib/sessions.js (facts, remote url, projects).\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines } from \"../readers/files.js\";\nimport { readAntigravity } from \"../readers/transcripts.js\";\nimport { formatJson, readJsonFile } from \"./claude-shaped.js\";\nimport type {\n Adapter,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallOptions,\n InstallReport,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"antigravity\";\nconst HOOK_NAME = \"sessionpipe\";\nexport const AG_EVENTS = [\"PreInvocation\", \"PostInvocation\", \"PreToolUse\", \"PostToolUse\", \"Stop\"] as const;\nconst gemini = (env: NodeJS.ProcessEnv) => env.GEMINI_CLI_HOME || path.join(HOME, \".gemini\");\nconst hooksFile = (env: NodeJS.ProcessEnv) => path.join(gemini(env), \"config\", \"hooks.json\");\nconst projectsDir = (env: NodeJS.ProcessEnv) => path.join(gemini(env), \"config\", \"projects\");\nconst dataDirs = (env: NodeJS.ProcessEnv) =>\n [\"antigravity\", \"antigravity-cli\", \"antigravity-ide\"].map((d) => path.join(gemini(env), d));\nconst ID_RE = /^[A-Za-z0-9_-]{1,128}$/;\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\n\nfunction entry(cmd: HookCommand, lean?: boolean) {\n const handler = (e: string) => ({ type: \"command\", command: cmd([NAME, e]).command, timeout: 5 });\n const out: Record<string, unknown> = { enabled: true };\n for (const e of AG_EVENTS) {\n if (lean && e === \"PreToolUse\") continue;\n out[e] = /Tool/.test(e) ? [{ matcher: \"*\", hooks: [handler(e)] }] : [handler(e)];\n }\n return out;\n}\n\nexport const antigravity: Adapter = {\n name: NAME,\n events: AG_EVENTS,\n detect: (env = process.env) =>\n existsSync(path.join(gemini(env), \"config\")) || dataDirs(env).some((d) => existsSync(d)),\n configFiles: (env = process.env) => [hooksFile(env)],\n install(cmd, env = process.env, opts: InstallOptions = {}): InstallReport[] {\n const file = hooksFile(env);\n const f = readJsonFile(file);\n if (!f.ok) return [{ file, changed: false, skipped: true, note: `${f.reason}; not touched` }];\n const hooks = f.value;\n const e = entry(cmd, opts.lean);\n if (JSON.stringify(hooks[HOOK_NAME]) === JSON.stringify(e)) return [{ file, changed: false }];\n hooks[HOOK_NAME] = e;\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, formatJson(hooks, f));\n return [\n {\n file,\n changed: true,\n created: !f.existed,\n note: \"hooks.json is read when a conversation starts; open ones report after a restart\",\n },\n ];\n },\n uninstall(env = process.env, opts: InstallOptions = {}): InstallReport[] {\n const file = hooksFile(env);\n if (!existsSync(file)) return [{ file, changed: false }];\n const f = readJsonFile(file);\n if (!f.ok) return [{ file, changed: false, skipped: true, note: `${f.reason}; not touched` }];\n const hooks = f.value;\n if (!(HOOK_NAME in hooks)) return [{ file, changed: false }];\n delete hooks[HOOK_NAME];\n if (opts.created?.includes(file) && !Object.keys(hooks).length) {\n unlinkSync(file);\n return [{ file, changed: true, note: \"removed (sessionpipe created it)\" }];\n }\n writeFileSync(file, formatJson(hooks, f));\n return [{ file, changed: true }];\n },\n installed(cmd, env = process.env, opts: InstallOptions = {}) {\n const file = hooksFile(env);\n const f = readJsonFile(file);\n const have = f.ok ? f.value[HOOK_NAME] : undefined;\n return [\n {\n file,\n state: !have ? \"missing\" : JSON.stringify(have) === JSON.stringify(entry(cmd, opts.lean)) ? \"current\" : \"stale\",\n },\n ];\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = (s.conversationId ?? s.session_id ?? s.sessionId) as string | undefined;\n // Antigravity parses stdout as the hook's answer; `{}` is \"carry on\" for every event.\n if (!id) return { session: { id: \"\" }, events: [], stdout: \"{}\\n\" };\n const workspaces = agWorkspaces(s.workspacePaths);\n const session: HookResult[\"session\"] = { id: String(id), cwd: workspaces[0] ?? input.cwd };\n if (typeof s.modelName === \"string\" && s.modelName !== \"auto\") session.model = s.modelName;\n const toolCall = s.toolCall as { name?: unknown; args?: unknown } | undefined;\n const tool = validTool(toolCall?.name) ? toolCall?.name : validTool(s.toolName) ? s.toolName : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"PreInvocation\":\n // Fires before every model call of an execution; only the first is the person's ask.\n if (Number(s.invocationNum) === 0 || s.invocationNum === undefined) {\n events.push(ev(\"session.started\", { source: \"unknown\" }));\n events.push(ev(\"turn.started\", {}));\n } else events.push(ev(\"session.heartbeat\", {}));\n break;\n case \"PostInvocation\":\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, input: toolCall?.args }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n ok: !s.error,\n error: typeof s.error === \"string\" ? s.error.slice(0, 2000) : undefined,\n input: toolCall?.args,\n }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { reason: s.error ? \"error\" : \"stop\" }));\n break;\n default:\n return { session, events: [], stdout: \"{}\\n\" };\n }\n const r: HookResult = { session, events, stdout: \"{}\\n\", hints: { workspaces } };\n if (typeof s.transcriptPath === \"string\") r.transcript = s.transcriptPath;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readAntigravity(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript, hints, state): SessionFacts {\n if (!transcript) return {};\n return antigravityFacts(transcript, {\n conversation: session.id,\n workspaces: (hints.workspaces as string[] | undefined) ?? (session.cwd ? [session.cwd] : []),\n state,\n env: process.env,\n });\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n const noState: FactsState = { get: () => ({}), save: () => {} };\n for (const data of dataDirs(env)) {\n let ids: string[] = [];\n try {\n ids = readdirSync(path.join(data, \"brain\")).filter((n) => /^[0-9a-f-]{36}$/i.test(n));\n } catch {}\n for (const id of ids) {\n const f = path.join(data, \"brain\", id, \".system_generated\", \"logs\", \"transcript.jsonl\");\n try {\n if (statSync(f).mtimeMs < sinceMs) continue;\n } catch {\n continue;\n }\n const facts = antigravityFacts(f, { conversation: id, workspaces: [], state: noState, env });\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n rows.push({ session: { id, ...rest }, started_at, last_at });\n }\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n\n/** A folder as Antigravity writes it (a file:// URI or a path) \u2192 an absolute path, or null. */\nexport function agPath(p: unknown): string | null {\n if (typeof p !== \"string\" || !p) return null;\n let s = p;\n if (/^file:/i.test(s)) {\n try {\n s = decodeURIComponent(new URL(s).pathname);\n } catch {\n return null;\n }\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:/.test(s)) s = s.slice(1);\n } else if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(s)) return null;\n if (!path.isAbsolute(s)) return null;\n return path.resolve(s);\n}\nexport const agWorkspaces = (paths: unknown): string[] =>\n (Array.isArray(paths) ? paths : [])\n .map(agPath)\n .filter((p): p is string => !!p)\n .filter((p, i, a) => a.indexOf(p) === i);\n\nfunction agVariants(p: string): string[] {\n const out = [p];\n try {\n const r = realpathSync.native(p);\n if (r !== p) out.push(r);\n } catch {}\n return out;\n}\nfunction agProjects(dir: string): { id: string; folders: string[] }[] {\n const out: { id: string; folders: string[] }[] = [];\n let names: string[] = [];\n try {\n names = readdirSync(dir).filter((n) => n.endsWith(\".json\"));\n } catch {\n return out;\n }\n for (const n of names) {\n const id = n.slice(0, -5);\n if (!ID_RE.test(id)) continue;\n let j: { projectResources?: { resources?: { folderUri?: unknown }[] } };\n try {\n j = JSON.parse(readFileSync(path.join(dir, n), \"utf8\"));\n } catch {\n continue;\n }\n const folders: string[] = [];\n for (const r of j?.projectResources?.resources ?? []) {\n const f = agPath(r?.folderUri);\n if (f) folders.push(...agVariants(f));\n }\n if (folders.length) out.push({ id, folders });\n }\n return out;\n}\n/** The project whose folder is the workspace or contains it; the deepest wins. */\nexport function agMatchProject(projects: { id: string; folders: string[] }[], workspaces: string[]): string | null {\n const ws: string[] = [];\n for (const w of workspaces) {\n const p = agPath(w);\n if (p) ws.push(...agVariants(p));\n }\n let best: string | null = null;\n let bestLen = -1;\n for (const pr of projects)\n for (const f of pr.folders) {\n const within = ws.some((w) => w === f || w.startsWith(f.endsWith(path.sep) ? f : f + path.sep));\n if (within && f.length > bestLen) {\n best = pr.id;\n bestLen = f.length;\n }\n }\n return best;\n}\n\n/** Antigravity's web remote: https://antigravity.google.com/r/<installation uuid>-v2, with\n * ?p=c/<conversation>?section=<project> when the project is known. */\nexport function antigravityRemoteUrl(\n transcript: string,\n opts: { conversation?: string; workspaces?: string[]; env: NodeJS.ProcessEnv; projectsDir?: string },\n): string | null {\n const i = transcript.indexOf(`${path.sep}brain${path.sep}`);\n const dirs = (i > 0 ? [transcript.slice(0, i)] : []).concat(dataDirs(opts.env));\n for (const d of dirs) {\n try {\n const m = /installation_uuid:\\s*\"([0-9a-f-]{36})\"/i.exec(\n readFileSync(path.join(d, \"antigravity_state.pbtxt\"), \"utf8\"),\n );\n if (!m) continue;\n const base = `https://antigravity.google.com/r/${m[1]}-v2`;\n const conv = opts.conversation ?? \"\";\n if (!ID_RE.test(conv) || !opts.workspaces?.length) return base;\n const project = agMatchProject(agProjects(opts.projectsDir ?? projectsDir(opts.env)), opts.workspaces);\n return project ? `${base}?p=${encodeURIComponent(`c/${conv}?section=${project}`)}` : base;\n } catch {}\n }\n return null;\n}\n\nexport function antigravityFacts(\n file: string,\n opts: { conversation: string; workspaces: string[]; state: FactsState; env: NodeJS.ProcessEnv },\n): SessionFacts {\n const { head, tail } = ends(file, 128 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const url = antigravityRemoteUrl(file, opts);\n if (url) out.url = url;\n for (const j of H) {\n if (j.type !== \"USER_INPUT\" || typeof j.content !== \"string\") continue;\n const m = /<USER_REQUEST>([\\s\\S]*?)(?:<\\/USER_REQUEST>|$)/.exec(j.content);\n const text = (m ? (m[1] ?? \"\") : j.content).trim();\n const line = (text.split(\"\\n\").find((l) => l.trim()) ?? \"\").trim();\n if (!line || /^<[a-z_-]+>/i.test(line)) continue;\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n break;\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.created_at ?? j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Where sessionpipe keeps its files (spec: the client's Files section).\n// config ~/.config/sessionpipe/config.json SESSIONPIPE_CONFIG\n// state ~/.local/state/sessionpipe/ SESSIONPIPE_STATE\n// Windows %APPDATA%\\sessionpipe\\ and %LOCALAPPDATA%\\sessionpipe\\\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport const HOME = os.homedir();\n\nexport function configFile(env: NodeJS.ProcessEnv = process.env): string {\n if (env.SESSIONPIPE_CONFIG) return path.resolve(env.SESSIONPIPE_CONFIG);\n if (process.platform === \"win32\")\n return path.join(env.APPDATA || path.join(HOME, \"AppData\", \"Roaming\"), \"sessionpipe\", \"config.json\");\n return path.join(env.XDG_CONFIG_HOME || path.join(HOME, \".config\"), \"sessionpipe\", \"config.json\");\n}\n\nexport function stateDir(env: NodeJS.ProcessEnv = process.env): string {\n if (env.SESSIONPIPE_STATE) return path.resolve(env.SESSIONPIPE_STATE);\n if (process.platform === \"win32\")\n return path.join(env.LOCALAPPDATA || path.join(HOME, \"AppData\", \"Local\"), \"sessionpipe\");\n return path.join(env.XDG_STATE_HOME || path.join(HOME, \".local\", \"state\"), \"sessionpipe\");\n}\n\n/** `~` for the home directory, as the session block writes paths. */\nexport function tilde(p: string, home: string = HOME): string {\n if (!p) return p;\n if (p === home) return \"~\";\n return p.startsWith(home + path.sep) || p.startsWith(`${home}/`) ? `~${p.slice(home.length)}` : p;\n}\n\n/** A file-name-safe id. */\nexport const safeId = (s: string): string =>\n String(s)\n .replace(/[^A-Za-z0-9_.-]/g, \"_\")\n .slice(0, 160);\n", "// SPDX-License-Identifier: Apache-2.0\n// Reading the ends of large files, JSON lines, and recent files under a root.\nimport { closeSync, fstatSync, openSync, readdirSync, readSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/** The first and last bytes of a file, as lines \u2014 a transcript can be tens of MB. */\nexport function ends(file: string, headBytes: number, tailBytes: number): { head: string[]; tail: string[] } {\n let fd: number | undefined;\n try {\n fd = openSync(file, \"r\");\n const size = fstatSync(fd).size;\n const read = (pos: number, len: number) => {\n const b = Buffer.alloc(len);\n const n = readSync(fd as number, b, 0, len, pos);\n return b.subarray(0, n).toString(\"utf8\");\n };\n const head = read(0, Math.min(size, headBytes));\n const tail = size > headBytes ? read(Math.max(0, size - tailBytes), Math.min(size, tailBytes)) : head;\n return { head: head.split(\"\\n\").slice(0, -1), tail: tail.split(\"\\n\").slice(size > headBytes ? 1 : 0) };\n } catch {\n return { head: [], tail: [] };\n } finally {\n if (fd !== undefined)\n try {\n closeSync(fd);\n } catch {}\n }\n}\n\nexport const parseLines = (lines: string[]): Record<string, unknown>[] =>\n lines\n .map((l) => {\n try {\n return JSON.parse(l) as Record<string, unknown>;\n } catch {\n return null;\n }\n })\n .filter((x): x is Record<string, unknown> => !!x);\n\n/** Read line by line up to `cap` bytes, stopping when `visit` returns a value. */\nexport function scanLines<T>(file: string, visit: (line: string) => T | null, cap = 16 * 1024 * 1024): T | null {\n let fd: number | undefined;\n try {\n fd = openSync(file, \"r\");\n const buf = Buffer.alloc(1024 * 1024);\n let pos = 0;\n let rest: Buffer = Buffer.alloc(0);\n while (pos < cap) {\n const n = readSync(fd, buf, 0, buf.length, pos);\n if (!n) break;\n pos += n;\n let chunk = Buffer.concat([rest, buf.subarray(0, n)]);\n let nl = chunk.indexOf(10);\n while (nl >= 0) {\n const r = visit(chunk.subarray(0, nl).toString(\"utf8\"));\n if (r !== null) return r;\n chunk = chunk.subarray(nl + 1);\n nl = chunk.indexOf(10);\n }\n rest = chunk;\n }\n } catch {\n } finally {\n if (fd !== undefined)\n try {\n closeSync(fd);\n } catch {}\n }\n return null;\n}\n\nexport function recentFiles(root: string, depth: number, sinceMs: number, match: (name: string) => boolean): string[] {\n const out: string[] = [];\n const walk = (dir: string, d: number) => {\n let names: import(\"node:fs\").Dirent[] = [];\n try {\n names = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of names) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (d < depth) walk(p, d + 1);\n continue;\n }\n if (!match(e.name)) continue;\n try {\n if (statSync(p).mtimeMs >= sinceMs) out.push(p);\n } catch {}\n }\n };\n walk(root, 0);\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Transcript readers: complete turns (a person's message + everything the assistant\n// said before the next one), each with the line it ends on, and the line the\n// cursor may advance to once every turn is delivered. Ported from spacesheep-cli\n// lib/memory.js. One reader per harness file format; nothing else is vendor code.\nimport type { TranscriptRead } from \"../adapters/types.js\";\n\ninterface Msg {\n role: \"user\" | \"assistant\";\n text: string;\n at: number;\n line: number;\n}\n\nexport function pairTurns(msgs: Msg[], endLine: number): TranscriptRead {\n const turns: { user: string; assistant: string; at: number; startLine: number; endLine: number }[] = [];\n let cur: (typeof turns)[number] | null = null;\n for (const m of msgs) {\n if (m.role === \"user\") {\n // Never overwrite a prompt that has no reply yet: in an agentic turn the reply\n // comes after tool calls, and a second user record is not a new question.\n if (cur && !cur.assistant) {\n cur.user += `\\n\\n${m.text}`;\n continue;\n }\n if (cur) turns.push(cur);\n cur = { user: m.text, assistant: \"\", at: m.at, startLine: m.line, endLine: m.line };\n } else {\n if (!cur) cur = { user: \"\", assistant: \"\", at: m.at, startLine: m.line, endLine: m.line };\n cur.assistant += (cur.assistant ? \"\\n\\n\" : \"\") + m.text;\n cur.endLine = m.line;\n }\n }\n if (cur?.assistant) turns.push(cur);\n // A user message with no reply yet stays unsent: the cursor stops before it.\n const line = cur && !cur.assistant ? cur.startLine : endLine;\n return { turns: turns.map((t) => ({ user: t.user, assistant: t.assistant, at: t.at, endLine: t.endLine })), line };\n}\n\n/** Injected context the person never typed: <tag>\u2026</tag> wrappers, HTML comments, slash-command expansions. */\nexport const isInjected = (text: string): boolean =>\n (/^<[a-z_-]+>/i.test(text) && /<\\/[a-z_-]+>\\s*$/i.test(text)) || /^<!--\\s/.test(text) || /^<command-/.test(text);\n\nconst endOf = (lines: string[]) => (lines[lines.length - 1] === \"\" ? lines.length - 1 : lines.length);\nconst parse = (raw: string): Record<string, unknown> | null => {\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n};\nconst textParts = (c: unknown, kinds: string[]): string => {\n if (typeof c === \"string\") return c;\n if (!Array.isArray(c)) return \"\";\n return c\n .filter(\n (b) =>\n b &&\n typeof b === \"object\" &&\n kinds.includes((b as { type?: string }).type ?? \"\") &&\n typeof (b as { text?: unknown }).text === \"string\",\n )\n .map((b) => (b as { text: string }).text)\n .join(\"\\n\");\n};\n\n/** Claude Code / Droid: {type:\"user\"|\"assistant\", message:{content}, timestamp, isMeta, isSidechain, origin}. */\nexport function readClaude(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || j.isSidechain) continue;\n const origin = j.origin as { kind?: string } | undefined;\n if (j.type === \"user\" && (j.isMeta || (origin?.kind && origin.kind !== \"human\"))) continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n const c = (j.message as { content?: unknown } | undefined)?.content;\n if (j.type === \"user\") {\n const text = textParts(c, [\"text\"]).trim();\n if (!text || isInjected(text)) continue;\n msgs.push({ role: \"user\", text, at, line: i });\n } else if (j.type === \"assistant\" && Array.isArray(c)) {\n const text = textParts(c, [\"text\"]).trim();\n if (text) msgs.push({ role: \"assistant\", text, at, line: i });\n }\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Codex rollout: {type:\"response_item\", payload:{type:\"message\", role, content:[{type:\"input_text\"|\"output_text\", text}]}}. */\nexport function readCodex(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || j.type !== \"response_item\") continue;\n const p = j.payload as { type?: string; role?: string; content?: unknown } | undefined;\n if (!p || p.type !== \"message\") continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n const text = textParts(p.content, [\"input_text\", \"output_text\"]).trim();\n if (!text) continue;\n if (p.role === \"user\") {\n if (/^<[a-z_-]+>/i.test(text)) continue; // <environment_context>: Codex's own injections\n msgs.push({ role: \"user\", text, at, line: i });\n } else if (p.role === \"assistant\") msgs.push({ role: \"assistant\", text, at, line: i });\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Gemini CLI chat log: {type:\"user\"|\"gemini\", content|message|text, timestamp}. */\nexport function readGemini(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j) continue;\n const role = j.type === \"user\" ? \"user\" : j.type === \"gemini\" || j.type === \"model\" ? \"assistant\" : null;\n if (!role) continue;\n const raw = j.content ?? j.message ?? j.text;\n const text = (typeof raw === \"string\" ? raw : textParts(raw, [\"text\"])).trim();\n if (!text) continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n msgs.push({ role, text, at, line: i });\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Antigravity: one step per line, type USER_INPUT | PLANNER_RESPONSE, content with <USER_REQUEST> wrapping. */\nexport function readAntigravity(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || typeof j.content !== \"string\") continue;\n const at = Date.parse(String(j.created_at ?? j.timestamp ?? \"\")) || Date.now();\n if (j.type === \"USER_INPUT\") {\n const m = /<USER_REQUEST>([\\s\\S]*?)(?:<\\/USER_REQUEST>|$)/.exec(j.content);\n const text = (m ? (m[1] ?? \"\") : j.content).trim();\n if (text) msgs.push({ role: \"user\", text, at, line: i });\n } else if (j.type === \"PLANNER_RESPONSE\") {\n const text = j.content.trim();\n if (text) msgs.push({ role: \"assistant\", text, at, line: i });\n }\n }\n return pairTurns(msgs, endOf(lines));\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The hooks file shape Claude Code introduced and Codex, Droid and (with\n// `version: 1`) Cursor and Copilot reuse: {\"hooks\":{\"<Event>\":[{\"matcher\"?,\n// \"hooks\":[{\"type\":\"command\",\"command\",\"timeout\"}]}]}}. Ours is one entry per\n// event; a re-install replaces a stale entry of ours (an old node path) and never\n// touches anyone else's.\n//\n// Two rules from issue #8: a file that is not plain JSON (a comment, a trailing\n// comma, a write in progress) is never written back \u2014 the harness is skipped and\n// the report says why; and a file is written back in its own shape (indent, final\n// newline) so uninstall leaves it byte-identical. A file that did not exist before\n// install is reported `created`, and uninstall deletes it once it is empty again.\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { HookCommand, InstallReport } from \"./types.js\";\n\nexport interface ClaudeShapedOptions {\n /** Which events take a `matcher` (tool and permission events). */\n matcherFor: (event: string) => string | undefined;\n /** Seconds (milliseconds for Gemini CLI). */\n timeout: number;\n /** Extra top-level keys the file must carry (Cursor/Copilot: version: 1). */\n top?: Record<string, unknown>;\n}\n\n/** A command of ours: a path that contains \"sessionpipe\" and ends in hook.js, then a harness and an event. */\nexport const OURS = /sessionpipe[^\"\\n]*[\\\\/]hook\\.js\"?\\s+[a-z][a-z-]*\\s+[A-Za-z]+\\s*$/;\nexport const isOurs = (h: { hooks?: { command?: string }[] }): boolean =>\n Array.isArray(h?.hooks) && h.hooks.some((x) => typeof x.command === \"string\" && OURS.test(x.command));\n\nexport type JsonFile =\n | {\n ok: true;\n existed: true;\n value: Record<string, unknown>;\n raw: string;\n indent: string;\n eol: string;\n finalNewline: boolean;\n }\n | { ok: true; existed: false; value: Record<string, unknown>; raw: \"\"; indent: \" \"; eol: \"\\n\"; finalNewline: true }\n | { ok: false; existed: true; reason: string };\n\n/** Read a JSON config file with its shape. Never guesses: a parse failure is a\n * refusal to touch the file, not an empty object. */\nexport function readJsonFile(file: string): JsonFile {\n let raw: string;\n try {\n raw = readFileSync(file, \"utf8\");\n } catch {\n return { ok: true, existed: false, value: {}, raw: \"\", indent: \" \", eol: \"\\n\", finalNewline: true };\n }\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n const hint = /^\\s*\\/\\/|\\/\\*/m.test(raw) ? \"not plain JSON (it has comments)\" : \"not plain JSON\";\n return { ok: false, existed: true, reason: hint };\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return { ok: false, existed: true, reason: \"not a JSON object\" };\n const eol = raw.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const m = /^( +|\\t+)\\S/m.exec(raw);\n const indent = m?.[1] ?? \" \";\n return {\n ok: true,\n existed: true,\n value: value as Record<string, unknown>,\n raw,\n indent,\n eol,\n finalNewline: /\\r?\\n$/.test(raw),\n };\n}\n\n/** Serialise in the file's own shape. */\nexport function formatJson(value: unknown, f: { indent: string; eol: string; finalNewline: boolean }): string {\n const text = JSON.stringify(value, null, f.indent).replace(/\\n/g, f.eol);\n return f.finalNewline ? text + f.eol : text;\n}\n\n/** Back-compat helper for callers that only read. */\nexport function readJson(file: string): Record<string, unknown> {\n const f = readJsonFile(file);\n return f.ok ? f.value : {};\n}\n\nfunction entryFor(event: string, harness: string, cmd: HookCommand, o: ClaudeShapedOptions) {\n const matcher = o.matcherFor(event);\n return {\n ...(matcher !== undefined ? { matcher } : {}),\n hooks: [{ type: \"command\", command: cmd([harness, event]).command, timeout: o.timeout }],\n };\n}\n\nexport function installClaudeShaped(\n file: string,\n harness: string,\n events: readonly string[],\n cmd: HookCommand,\n o: ClaudeShapedOptions,\n): InstallReport {\n const f = readJsonFile(file);\n if (!f.ok) return { file, changed: false, skipped: true, note: `${f.reason}; not touched` };\n const settings = f.value;\n const hooks = (settings.hooks && typeof settings.hooks === \"object\" ? settings.hooks : {}) as Record<\n string,\n unknown[]\n >;\n let changed = false;\n const want = new Set(events);\n // Events we no longer hook (a lean install) lose their entry of ours.\n for (const ev of Object.keys(hooks)) {\n if (want.has(ev)) continue;\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const kept = list.filter((h) => !isOurs(h as never));\n if (kept.length !== list.length) {\n changed = true;\n if (kept.length) hooks[ev] = kept;\n else delete hooks[ev];\n }\n }\n for (const ev of events) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const entry = entryFor(ev, harness, cmd, o);\n const mine = list.filter((h) => isOurs(h as never));\n if (mine.length === 1 && JSON.stringify(mine[0]) === JSON.stringify(entry)) continue;\n hooks[ev] = list.filter((h) => !isOurs(h as never)).concat([entry]);\n changed = true;\n }\n if (o.top)\n for (const [k, v] of Object.entries(o.top))\n if (settings[k] !== v) {\n settings[k] = v;\n changed = true;\n }\n if (changed) {\n settings.hooks = hooks;\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, formatJson(settings, f));\n }\n return { file, changed, created: !f.existed && changed };\n}\n\nexport function uninstallClaudeShaped(\n file: string,\n events: readonly string[],\n opts: { created?: boolean | undefined } = {},\n): InstallReport {\n if (!existsSync(file)) return { file, changed: false };\n const f = readJsonFile(file);\n if (!f.ok) return { file, changed: false, skipped: true, note: `${f.reason}; not touched` };\n const settings = f.value;\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks || typeof hooks !== \"object\") return { file, changed: false };\n let changed = false;\n for (const ev of [...events, ...Object.keys(hooks)]) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const kept = list.filter((h) => !isOurs(h as never));\n if (kept.length !== list.length) {\n changed = true;\n if (kept.length) hooks[ev] = kept;\n else delete hooks[ev];\n }\n }\n if (!changed) return { file, changed: false };\n if (!Object.keys(hooks).length) delete settings.hooks;\n if (opts.created && !Object.keys(settings).length) {\n unlinkSync(file);\n return { file, changed: true, note: \"removed (sessionpipe created it)\" };\n }\n const next = formatJson(settings, f);\n if (next !== f.raw) writeFileSync(file, next);\n return { file, changed: true };\n}\n\nexport function installedClaudeShaped(\n file: string,\n harness: string,\n events: readonly string[],\n cmd: HookCommand,\n o: ClaudeShapedOptions,\n): \"current\" | \"stale\" | \"missing\" {\n const f = readJsonFile(file);\n const hooks = (f.ok ? (f.value.hooks ?? {}) : {}) as Record<string, unknown[]>;\n let present = 0;\n let current = 0;\n for (const ev of events) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const mine = list.filter((h) => isOurs(h as never));\n if (mine.length) present++;\n if (mine.length === 1 && JSON.stringify(mine[0]) === JSON.stringify(entryFor(ev, harness, cmd, o))) current++;\n }\n // An entry of ours on an event outside the wanted set (a lean install after a full one) is stale.\n for (const ev of Object.keys(hooks))\n if (!events.includes(ev) && (Array.isArray(hooks[ev]) ? hooks[ev] : []).some((h) => isOurs(h as never)))\n return \"stale\";\n if (!present) return \"missing\";\n return current === events.length ? \"current\" : \"stale\";\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Claude Code (Anthropic) \u2014 docs: https://code.claude.com/docs/en/hooks\n// Config: settings.json in EVERY config dir (~/.claude, $CLAUDE_CONFIG_DIR, ~/.claude-*):\n// one per account; hooks written to one never fire for the others. Reads only the\n// hook's stdin, the transcript it names, the per-pid session registry and the config\n// dir's .claude.json account id. Ported from spacesheep-cli lib/sessions.js.\n\nimport { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines, recentFiles, scanLines } from \"../readers/files.js\";\nimport { gitFacts } from \"../readers/git.js\";\nimport { isInjected, readClaude } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport type {\n Adapter,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallOptions,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"claude-code\";\nexport const CLAUDE_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"PermissionRequest\",\n \"Notification\",\n \"Stop\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n \"SessionEnd\",\n \"StopFailure\",\n] as const;\n/** With no sink above tier 0 only the heartbeat needs a tool event: one, not three (issue #12). */\nconst LEAN_SKIP = new Set([\"PreToolUse\", \"PostToolUseFailure\"]);\nconst eventsFor = (lean?: boolean) => (lean ? CLAUDE_EVENTS.filter((e) => !LEAN_SKIP.has(e)) : [...CLAUDE_EVENTS]);\nconst OPTS = { matcherFor: (e: string) => (/Tool|Permission/.test(e) ? \"\" : undefined), timeout: 5 };\nconst DESKTOP_ID = /^local_[A-Za-z0-9-]{1,64}$/;\n\n/** Every Claude Code config dir on this machine. */\nexport function claudeDirs(env: NodeJS.ProcessEnv = process.env, home = HOME): string[] {\n const out: string[] = [];\n const add = (d?: string) => {\n if (!d) return;\n const r = path.resolve(d);\n if (!out.includes(r)) out.push(r);\n };\n add(path.join(home, \".claude\"));\n add(env.CLAUDE_CONFIG_DIR);\n try {\n for (const e of readdirSync(home, { withFileTypes: true })) {\n if (!e.isDirectory() || !/^\\.claude[-_.]/.test(e.name)) continue;\n const d = path.join(home, e.name);\n if (existsSync(path.join(d, \"projects\")) || existsSync(path.join(d, \"settings.json\"))) add(d);\n }\n } catch {}\n return out.filter((d, i) => i === 0 || existsSync(d));\n}\nconst settingsIn = (dir: string) => path.join(dir, \"settings.json\");\nconst configDirOf = (transcript: string) => path.dirname(path.dirname(path.dirname(transcript)));\n\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst endReason = (r: unknown): \"clear\" | \"logout\" | \"exit\" | \"other\" =>\n r === \"clear\" || r === \"logout\" || r === \"exit\" ? r : r === \"prompt_input_exit\" ? \"exit\" : \"other\";\nconst notifKind = (t: unknown): \"permission\" | \"question\" | \"elicitation\" | \"idle\" | \"error\" =>\n t === \"permission_prompt\"\n ? \"permission\"\n : t === \"idle_prompt\"\n ? \"idle\"\n : t === \"elicitation_dialog\"\n ? \"elicitation\"\n : \"question\";\n\nexport const claudeCode: Adapter = {\n name: NAME,\n events: CLAUDE_EVENTS,\n detect: (env = process.env) => claudeDirs(env).some((d) => existsSync(d)),\n configFiles: (env = process.env) => claudeDirs(env).map(settingsIn),\n install: (cmd, env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) => installClaudeShaped(settingsIn(d), NAME, eventsFor(opts.lean), cmd, OPTS)),\n uninstall: (env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) =>\n uninstallClaudeShaped(settingsIn(d), CLAUDE_EVENTS, { created: opts.created?.includes(settingsIn(d)) }),\n ),\n installed: (cmd, env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) => ({\n file: settingsIn(d),\n state: installedClaudeShaped(settingsIn(d), NAME, eventsFor(opts.lean), cmd, OPTS),\n })),\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = (s.session_id ?? s.sessionId) as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n if (typeof s.model === \"string\") session.model = s.model;\n if (typeof s.agent_id === \"string\" && event.startsWith(\"Subagent\") === false && s.agent_id)\n session.parent_id = null;\n const turn_id = typeof s.prompt_id === \"string\" ? s.prompt_id : undefined;\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const call_id = typeof s.tool_use_id === \"string\" ? s.tool_use_id : undefined;\n const ms = typeof s.duration_ms === \"number\" ? Math.round(s.duration_ms) : undefined;\n const agent_id = typeof s.agent_id === \"string\" ? s.agent_id : undefined;\n // PermissionRequest carries no tool_use_id (recorded 2026-09-28): the id is a hash\n // of the prompt, the tool and its input, so the same prompt yields the same id and\n // a later control answer can name it.\n const permissionId = () =>\n `perm-${createHash(\"sha256\")\n .update(`${turn_id ?? \"\"}|${tool ?? \"\"}|${JSON.stringify(s.tool_input ?? null)}`)\n .digest(\"hex\")\n .slice(0, 16)}`;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(ev(\"session.started\", { source: pickSource(s.source ?? s.trigger) }));\n break;\n case \"UserPromptSubmit\":\n events.push(\n ev(\"turn.started\", {\n turn_id,\n prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined,\n }),\n );\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, call_id, turn_id, agent_id, input: s.tool_input }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n call_id,\n turn_id,\n agent_id,\n ms,\n ok: true,\n input: s.tool_input,\n output: s.tool_response,\n }),\n );\n break;\n case \"PostToolUseFailure\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n call_id,\n turn_id,\n agent_id,\n ms,\n ok: false,\n error: errText(s.error ?? s.tool_response),\n input: s.tool_input,\n output: s.tool_response,\n }),\n );\n break;\n case \"PermissionRequest\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: call_id ?? permissionId(),\n kind: \"permission\",\n tool,\n message: tool ? `${tool}${describe(s.tool_input)}` : undefined,\n }),\n );\n break;\n case \"Notification\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: `notif-${Date.now()}`,\n kind: notifKind(s.notification_type),\n message: typeof s.message === \"string\" ? s.message.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"stop\" }));\n break;\n case \"StopFailure\":\n // The turn ended on an API error (rate_limit, overloaded, authentication_failed,\n // server_error \u2026); the payload key is `error` (issue #10, recorded 2026-09-28).\n events.push(\n ev(\"turn.ended\", {\n turn_id,\n reason: \"error\",\n error: typeof s.error === \"string\" ? s.error.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"SubagentStart\":\n events.push(\n ev(\"subagent.started\", {\n agent_id: String(s.agent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"SubagentStop\":\n events.push(\n ev(\"subagent.ended\", {\n agent_id: String(s.agent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"PreCompact\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"PostCompact\":\n break; // PreCompact already said it; a second event would double-count\n case \"SessionEnd\":\n events.push(ev(\"session.ended\", { reason: endReason(s.reason) }));\n break;\n default:\n return null;\n }\n const hints: Record<string, unknown> = {};\n const host = input.env.CLAUDE_CODE_HOST_SESSION_ID;\n if (host && DESKTOP_ID.test(host)) hints.desktop_id = host;\n // The registry file is found while the process tree stands (the detached\n // worker's parent is gone by the time it runs). Heartbeat-class events skip it.\n if (event !== \"PreToolUse\" && event !== \"PostToolUse\") hints.claude_pid = claudePid(input.env);\n const r: HookResult = { session, events, hints };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readClaude(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript, hints, state): SessionFacts {\n const out: SessionFacts = {};\n if (transcript) Object.assign(out, claudeFacts(transcript, session.id, hints, state));\n const cwd = out.cwd ?? session.cwd;\n Object.assign(out, gitFacts(cwd), out.branch ? { branch: out.branch } : {});\n if (!out.url && typeof hints.desktop_id === \"string\") out.url = `claude://code/continue/${hints.desktop_id}`;\n return out;\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n const files: string[] = [];\n for (const d of claudeDirs(env))\n files.push(...recentFiles(path.join(d, \"projects\"), 1, sinceMs, (n) => /^[0-9a-f-]{36}\\.jsonl$/.test(n)));\n const noState: FactsState = { get: () => ({}), save: () => {} };\n for (const f of files) {\n const id = path.basename(f, \".jsonl\");\n const facts = claudeFacts(f, id, {}, noState);\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n const cwd = rest.cwd;\n rows.push({\n session: { id, ...rest, ...gitFacts(cwd), ...(rest.branch ? { branch: rest.branch } : {}) },\n started_at,\n last_at,\n });\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\nfunction pickSource(v: unknown): string {\n return typeof v === \"string\" && [\"startup\", \"resume\", \"clear\", \"compact\", \"fork\"].includes(v) ? v : \"unknown\";\n}\nfunction errText(v: unknown): string | undefined {\n if (typeof v === \"string\") return v.slice(0, 2000);\n if (v && typeof v === \"object\") {\n const e = v as { error?: unknown; message?: unknown };\n if (typeof e.error === \"string\") return e.error.slice(0, 2000);\n if (typeof e.message === \"string\") return e.message.slice(0, 2000);\n }\n return undefined;\n}\nfunction describe(input: unknown): string {\n if (!input || typeof input !== \"object\") return \"\";\n const i = input as Record<string, unknown>;\n const v = i.command ?? i.file_path ?? i.path ?? i.url ?? i.pattern;\n return typeof v === \"string\" ? ` ${v.slice(0, 120)}` : \"\";\n}\n\n// --- facts: title, url, model, account, from Claude Code's own files ------------------\n\nconst NAME_RANK: Record<string, \"custom\" | \"harness\"> = {\n user: \"custom\",\n auto: \"harness\",\n hook: \"harness\",\n peer: \"harness\",\n};\ninterface Registry {\n sessionId: string | null;\n name: string | null;\n name_source: \"custom\" | \"harness\" | null;\n bridge: string | null;\n}\nfunction registryEntry(j: unknown): Registry | null {\n if (!j || typeof j !== \"object\") return null;\n const r = j as { sessionId?: unknown; name?: unknown; nameSource?: string; bridgeSessionId?: unknown };\n const source = r.nameSource ? NAME_RANK[r.nameSource] : undefined;\n return {\n sessionId: r.sessionId ? String(r.sessionId) : null,\n name: source && typeof r.name === \"string\" && r.name.trim() ? r.name.trim() : null,\n name_source: source ?? null,\n bridge: typeof r.bridgeSessionId === \"string\" ? r.bridgeSessionId : null,\n };\n}\nconst liveCache = new Map<string, Map<string, Registry>>();\nfunction claudeLive(dir: string): Map<string, Registry> {\n const hit = liveCache.get(dir);\n if (hit) return hit;\n const map = new Map<string, Registry>();\n let names: string[] = [];\n try {\n names = readdirSync(path.join(dir, \"sessions\")).filter((n) => n.endsWith(\".json\"));\n } catch {}\n for (const n of names) {\n try {\n const e = registryEntry(JSON.parse(readFileSync(path.join(dir, \"sessions\", n), \"utf8\")));\n if (e?.sessionId) map.set(e.sessionId, e);\n } catch {}\n }\n liveCache.set(dir, map);\n return map;\n}\nfunction claudeLiveByPid(dir: string, pid: unknown): Registry | null {\n if (!pid) return null;\n try {\n return registryEntry(JSON.parse(readFileSync(path.join(dir, \"sessions\", `${pid}.json`), \"utf8\")));\n } catch {\n return null;\n }\n}\n/** The Claude Code process that ran this hook: the nearest ancestor with a registry\n * file (hooks run under a shell, so usually the parent's parent). */\nexport function claudePid(env: NodeJS.ProcessEnv = process.env): number | null {\n try {\n const dirs = claudeDirs(env);\n const has = (pid: number) => dirs.some((d) => existsSync(path.join(d, \"sessions\", `${pid}.json`)));\n let pid = process.ppid;\n if (has(pid)) return pid;\n const parent = parentOf();\n for (let hop = 0; hop < 6 && pid > 1; hop++) {\n pid = parent(pid);\n if (pid > 1 && has(pid)) return pid;\n }\n } catch {}\n return null;\n}\nfunction parentOf(): (pid: number) => number {\n if (process.platform === \"linux\") {\n return (pid) => {\n try {\n const st = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n return Number(st.slice(st.lastIndexOf(\")\") + 2).split(\" \")[1]) || 0;\n } catch {\n return 0;\n }\n };\n }\n const table = new Map<number, number>();\n try {\n const out = execFileSync(\"ps\", [\"-axo\", \"pid=,ppid=\"], {\n encoding: \"utf8\",\n timeout: 2000,\n maxBuffer: 8 * 1024 * 1024,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n for (const l of out.split(\"\\n\")) {\n const m = /^\\s*(\\d+)\\s+(\\d+)/.exec(l);\n if (m) table.set(Number(m[1]), Number(m[2]));\n }\n } catch {}\n return (pid) => table.get(pid) || 0;\n}\nconst accountCache = new Map<string, string | null>();\n/** The account id (never the email) from the config dir's .claude.json. */\nfunction claudeAccount(dir: string): string | null {\n const hit = accountCache.get(dir);\n if (hit !== undefined) return hit;\n const files = [path.join(dir, \".claude.json\")];\n if (path.resolve(dir) === path.join(HOME, \".claude\")) files.unshift(path.join(HOME, \".claude.json\"));\n let acct: string | null = null;\n for (const f of files) {\n try {\n const a = (JSON.parse(readFileSync(f, \"utf8\")) as { oauthAccount?: { accountUuid?: string } }).oauthAccount;\n if (a?.accountUuid) {\n acct = String(a.accountUuid);\n break;\n }\n } catch {}\n }\n accountCache.set(dir, acct);\n return acct;\n}\nconst LINK_RE = /^https:\\/\\/claude\\.ai\\/code\\/session_[A-Za-z0-9]+$/;\nfunction transcriptLink(records: Record<string, unknown>[]): string | null {\n for (let i = records.length - 1; i >= 0; i--) {\n const j = records[i] as { type?: string; subtype?: string; url?: unknown; bridgeSessionId?: unknown };\n if (j.type === \"system\" && j.subtype === \"bridge_status\" && typeof j.url === \"string\" && LINK_RE.test(j.url))\n return j.url;\n if (j.type === \"bridge-session\" && typeof j.bridgeSessionId === \"string\") {\n const m = /^(?:cse|session)_([A-Za-z0-9]+)$/.exec(j.bridgeSessionId);\n if (m) return `https://claude.ai/code/session_${m[1]}`;\n }\n }\n return null;\n}\n/** A first ask as the Claude Code app titles an untitled session: whitespace\n * collapsed, whole up to 50 characters, else its first 50 and \"...\". */\nexport function appTitle(text: string): string {\n const t = String(text).replace(/\\s+/g, \" \").trim();\n return t.length > 50 ? `${t.slice(0, 50)}...` : t;\n}\nfunction askText(j: Record<string, unknown> | null): string | null {\n if (!j || j.type !== \"user\" || j.isMeta || j.isSidechain) return null;\n const origin = j.origin as { kind?: string } | undefined;\n if (origin?.kind && origin.kind !== \"human\") return null;\n const c = (j.message as { content?: unknown } | undefined)?.content;\n const text = (\n typeof c === \"string\"\n ? c\n : Array.isArray(c)\n ? c\n .filter((b) => b && b.type === \"text\" && typeof b.text === \"string\")\n .map((b) => b.text as string)\n .join(\"\\n\")\n : \"\"\n ).trim();\n if (!text || isInjected(text)) return null;\n return text;\n}\nfunction firstAsk(records: Record<string, unknown>[]): string | null {\n for (const j of records) {\n const t = askText(j);\n if (t) return appTitle(t);\n }\n return null;\n}\nfunction scanTitles(file: string, from: number, found: { custom?: string | null; ai?: string | null }) {\n const out = { custom: found.custom ?? null, ai: found.ai ?? null, upto: from };\n let size = 0;\n try {\n size = statSync(file).size;\n } catch {\n return out;\n }\n if (size < from) {\n out.upto = 0;\n out.custom = out.ai = null;\n from = 0;\n }\n // Only lines carrying a title record are parsed; the rest of the new bytes are skipped.\n let pos = 0;\n scanLines<null>(\n file,\n (l) => {\n pos += Buffer.byteLength(l, \"utf8\") + 1;\n if (pos <= from || l.indexOf('-title\"') < 0) return null;\n try {\n const j = JSON.parse(l) as { type?: string; customTitle?: string; aiTitle?: string };\n if (j.type === \"custom-title\" && j.customTitle) out.custom = j.customTitle;\n if (j.type === \"ai-title\" && j.aiTitle) out.ai = j.aiTitle;\n } catch {}\n return null;\n },\n 512 * 1024 * 1024,\n );\n out.upto = size;\n return out;\n}\n\n/** A session's title and where it came from, best first: /rename (registry \"user\"\n * name or custom-title) \u2192 Claude Code's own title (registry \"auto\" name or\n * ai-title) \u2192 the first ask, marked first-ask so a real title later replaces it. */\nexport function claudeFacts(\n file: string,\n sessionId: string,\n hints: Record<string, unknown>,\n state: FactsState,\n): SessionFacts {\n const { head, tail } = ends(file, 64 * 1024, 256 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const id = sessionId || path.basename(file, \".jsonl\");\n const mem = state.get(NAME, id);\n let custom: string | null = null;\n let ai: string | null = null;\n for (const j of H.concat(T)) {\n if (j.type === \"custom-title\" && typeof j.customTitle === \"string\") custom = j.customTitle;\n if (j.type === \"ai-title\" && typeof j.aiTitle === \"string\") ai = j.aiTitle;\n }\n let size = 0;\n try {\n size = statSync(file).size;\n } catch {}\n if (!custom && !ai && size > 64 * 1024 + 256 * 1024) {\n const s = scanTitles(file, Number(mem.scan_upto) || 0, {\n custom: mem.scan_custom as string | null,\n ai: mem.scan_ai as string | null,\n });\n custom = s.custom;\n ai = s.ai;\n state.save(NAME, id, { scan_upto: s.upto, scan_custom: s.custom, scan_ai: s.ai });\n }\n const dir = configDirOf(file);\n const live = claudeLive(dir).get(id) ?? claudeLiveByPid(dir, hints.claude_pid);\n if (live?.name) state.save(NAME, id, { name: live.name, name_source: live.name_source });\n const bridge =\n live?.bridge && /^session_[A-Za-z0-9]+$/.test(live.bridge) ? `https://claude.ai/code/${live.bridge}` : null;\n const url = bridge ?? transcriptLink(T) ?? transcriptLink(H) ?? (typeof mem.url === \"string\" ? mem.url : null);\n if (url) {\n out.url = url;\n state.save(NAME, id, { url });\n }\n const name = live?.name\n ? { title: live.name, source: live.name_source as \"custom\" | \"harness\" }\n : typeof mem.name === \"string\"\n ? { title: mem.name, source: mem.name_source as \"custom\" | \"harness\" }\n : null;\n const pick =\n (name && name.source === \"custom\" && name) ||\n (custom && { title: custom, source: \"custom\" as const }) ||\n name ||\n (ai && { title: ai, source: \"harness\" as const });\n let ask = typeof mem.first_ask === \"string\" ? mem.first_ask : firstAsk(H);\n if (!ask && size > 64 * 1024 && !mem.first_ask_none) {\n ask = scanLines<string>(file, (l) => {\n try {\n const t = askText(JSON.parse(l) as Record<string, unknown>);\n return t ? appTitle(t) : null;\n } catch {\n return null;\n }\n });\n if (!ask && size > 16 * 1024 * 1024) state.save(NAME, id, { first_ask_none: true });\n }\n if (ask) {\n out.first_ask = ask;\n if (!mem.first_ask) state.save(NAME, id, { first_ask: ask });\n }\n if (pick) {\n out.title = String(pick.title).slice(0, 120);\n out.title_source = pick.source;\n } else if (ask) {\n out.title = ask;\n out.title_source = \"first-ask\";\n }\n const acct = claudeAccount(dir);\n if (acct) out.account_id = acct;\n for (let i = T.length - 1; i >= 0; i--) {\n const m = (T[i] as { message?: { model?: string } }).message?.model;\n if (T[i]?.type === \"assistant\" && m && m !== \"<synthetic>\") {\n out.model = m;\n break;\n }\n }\n const meta = [...T].reverse().find((j) => j.version) ?? H.find((j) => j.version);\n if (meta?.version) out.harness_version = String(meta.version);\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n const withCwd = H.find((j) => typeof j.cwd === \"string\");\n if (withCwd) {\n out.cwd = withCwd.cwd as string;\n if (typeof withCwd.gitBranch === \"string\" && withCwd.gitBranch !== \"HEAD\") out.branch = withCwd.gitBranch;\n }\n return out;\n}\n\n/** For tests: each hook runs in a fresh process; a test that edits the registry mid-run clears the cache. */\nexport const _resetClaudeCaches = (): void => {\n liveCache.clear();\n accountCache.clear();\n};\n", "// SPDX-License-Identifier: Apache-2.0\n// The repo and branch of a folder, from git itself; credentials stripped from the\n// remote. Cached per folder for the life of the process (a worker run).\nimport { execFileSync } from \"node:child_process\";\n\nconst cache = new Map<string, { repo?: string; branch?: string }>();\n\nexport function gitFacts(cwd: string | undefined): { repo?: string; branch?: string } {\n if (!cwd) return {};\n const hit = cache.get(cwd);\n if (hit) return hit;\n const run = (args: string[]) => {\n try {\n return execFileSync(\"git\", [\"-C\", cwd, ...args], {\n encoding: \"utf8\",\n timeout: 1500,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return \"\";\n }\n };\n const out: { repo?: string; branch?: string } = {};\n const repo = run([\"remote\", \"get-url\", \"origin\"]);\n if (repo) out.repo = stripCredentials(repo);\n const branch = run([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (branch && branch !== \"HEAD\") out.branch = branch;\n cache.set(cwd, out);\n return out;\n}\n\n/** `https://user:token@host/x` \u2192 `https://host/x`; `git@github.com:a/b.git` \u2192 `github.com/a/b`. */\nexport function stripCredentials(url: string): string {\n let u = url.replace(/\\/\\/[^/@]*@/, \"//\");\n const ssh = /^(?:ssh:\\/\\/)?git@([^:/]+)[:/](.+?)(?:\\.git)?$/.exec(u);\n if (ssh) u = `${ssh[1]}/${ssh[2]}`;\n return u.replace(/^https?:\\/\\//, \"\").replace(/\\.git$/, \"\");\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Codex CLI (OpenAI) \u2014 docs: https://learn.chatgpt.com/docs/hooks\n// Config: ~/.codex/hooks.json (Claude-shaped, 12 events, timeouts in seconds) AND\n// `notify` at the top level of config.toml as the fallback when hooks are off or\n// not yet trusted (non-managed hooks need a /hooks review in the CLI). An existing\n// notify (Codex Computer Use) is chained through --previous-notify, never replaced.\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines, recentFiles } from \"../readers/files.js\";\nimport { readCodex } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport * as toml from \"./codex-config.js\";\nimport type {\n Adapter,\n BackfillRow,\n HookCommand,\n HookInput,\n HookResult,\n InstalledReport,\n InstallOptions,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"codex\";\nexport const CODEX_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PermissionRequest\",\n \"Stop\",\n \"Interrupt\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n \"SessionEnd\",\n] as const;\nconst OPTS = { matcherFor: (e: string) => (/Tool|Permission/.test(e) ? \"\" : undefined), timeout: 5 };\nconst eventsFor = (lean?: boolean) => (lean ? CODEX_EVENTS.filter((e) => e !== \"PreToolUse\") : [...CODEX_EVENTS]);\n\nconst codexHome = (env: NodeJS.ProcessEnv) => env.CODEX_HOME || path.join(HOME, \".codex\");\nconst hooksFile = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"hooks.json\");\nconst configFile = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"config.toml\");\nconst sessionsDir = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"sessions\");\n\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst endReason = (r: unknown): \"clear\" | \"logout\" | \"exit\" | \"other\" =>\n r === \"clear\" || r === \"logout\" || r === \"exit\" ? r : \"other\";\n\nfunction installNotify(cmd: HookCommand, env: NodeJS.ProcessEnv) {\n const file = configFile(env);\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {}\n const argv = cmd([NAME, \"notify\"]).argv;\n const line = `notify = ${JSON.stringify(argv)}`;\n const n = toml.readNotify(text);\n const write = (next: string) => {\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, next);\n };\n if (n && !n.other) {\n if (!n.misplaced && JSON.stringify(n.argv) === JSON.stringify(argv))\n return { file, changed: false, note: \"notify current\" };\n write(toml.withNotify(text, line));\n return {\n file,\n changed: true,\n note: n.misplaced\n ? \"notify moved to the top level (it sat inside a [table], where Codex never reads it)\"\n : \"notify updated\",\n };\n }\n if (n?.other) {\n const prev = toml.previousNotify(n.argv);\n if (toml.isComputerUse(n.argv)) {\n if (prev && toml.OURS.test(JSON.stringify(prev))) {\n if (JSON.stringify(prev) === JSON.stringify(argv))\n return { file, changed: false, note: \"notify current (after Codex Computer Use)\" };\n }\n if (!prev || toml.OURS.test(JSON.stringify(prev))) {\n const next = toml.replaceNotify(text, `notify = ${toml.withPreviousRaw(n.raw, argv)}`);\n if (next) {\n write(next);\n return { file, changed: true, note: \"chained after Codex Computer Use (--previous-notify)\" };\n }\n }\n }\n return {\n file,\n changed: false,\n skipped: true,\n note: `notify belongs to ${(n.argv?.[0] ?? n.raw).replace(/^.*\\//, \"\").slice(0, 40)}; left alone. Codex will report nothing until you approve the hooks: start \\`codex\\` and accept the hook review`,\n };\n }\n write(toml.withNotify(text, line));\n return { file, changed: true, note: \"notify set at the top level\" };\n}\n\nfunction uninstallNotify(env: NodeJS.ProcessEnv) {\n const file = configFile(env);\n let text: string;\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { file, changed: false };\n }\n const n = toml.readNotify(text);\n if (!n) return { file, changed: false };\n if (!n.other) {\n writeFileSync(file, toml.withoutNotify(text));\n return { file, changed: true };\n }\n const prev = toml.previousNotify(n.argv);\n if (toml.isComputerUse(n.argv) && prev && toml.OURS.test(JSON.stringify(prev))) {\n const next = toml.replaceNotify(text, `notify = ${toml.stripPreviousRaw(n.raw)}`);\n if (next) writeFileSync(file, next);\n return { file, changed: true };\n }\n return { file, changed: false };\n}\n\nfunction findRollout(threadId: string, env: NodeJS.ProcessEnv): string | null {\n let best: string | null = null;\n const walk = (dir: string, depth: number) => {\n let names: string[] = [];\n try {\n names = readdirSync(dir);\n } catch {\n return;\n }\n for (const n of names.sort().reverse()) {\n const p = path.join(dir, n);\n if (n.endsWith(\".jsonl\") && n.includes(threadId)) {\n best = p;\n return;\n }\n if (depth < 3) {\n walk(p, depth + 1);\n if (best) return;\n }\n }\n };\n walk(sessionsDir(env), 0);\n return best;\n}\n\nexport const codex: Adapter = {\n name: NAME,\n events: CODEX_EVENTS,\n detect: (env = process.env) => existsSync(codexHome(env)),\n configFiles: (env = process.env) => [hooksFile(env), configFile(env)],\n install: (cmd, env = process.env, opts: InstallOptions = {}) => [\n installClaudeShaped(hooksFile(env), NAME, eventsFor(opts.lean), cmd, OPTS),\n installNotify(cmd, env),\n ],\n uninstall: (env = process.env, opts: InstallOptions = {}) => [\n uninstallClaudeShaped(hooksFile(env), CODEX_EVENTS, { created: opts.created?.includes(hooksFile(env)) }),\n uninstallNotify(env),\n ],\n installed: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const out: InstalledReport[] = [\n {\n file: hooksFile(env),\n state: installedClaudeShaped(hooksFile(env), NAME, eventsFor(opts.lean), cmd, OPTS),\n note: \"Codex runs non-managed hooks only after the review in `codex` (/hooks); until then nothing is reported unless the notify fallback is ours\",\n },\n ];\n let text = \"\";\n try {\n text = readFileSync(configFile(env), \"utf8\");\n } catch {}\n const n = toml.readNotify(text);\n const argv = cmd([NAME, \"notify\"]).argv;\n const prev = n ? toml.previousNotify(n.argv) : null;\n const ours = n && (!n.other || (prev && JSON.stringify(prev) === JSON.stringify(argv)));\n out.push({\n file: configFile(env),\n state:\n !n || (n.other && !ours)\n ? \"missing\"\n : n.misplaced\n ? \"misplaced\"\n : JSON.stringify(n.argv) === JSON.stringify(argv) || (prev && JSON.stringify(prev) === JSON.stringify(argv))\n ? \"current\"\n : \"stale\",\n });\n return out;\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n if (event === \"notify\") {\n // Codex's notify passes one JSON argument: {\"type\":\"agent-turn-complete\",\"thread-id\":\u2026,\"turn-id\":\u2026,\"cwd\":\u2026}\n const raw = input.argv.find((a) => a.startsWith(\"{\")) ?? input.stdin;\n try {\n s = raw ? (JSON.parse(raw) as Record<string, unknown>) : {};\n } catch {}\n const id = (s[\"thread-id\"] ?? s.thread_id ?? s[\"session-id\"] ?? s.session_id) as string | undefined;\n if (!id) return null;\n const r: HookResult = {\n session: { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd },\n events: [\n {\n type: \"turn.ended\",\n data: { reason: \"stop\", ...(typeof s[\"turn-id\"] === \"string\" ? { turn_id: s[\"turn-id\"] } : {}) },\n harnessEvent: \"notify\",\n },\n ],\n hints: {},\n };\n const file = findRollout(String(id), input.env as NodeJS.ProcessEnv);\n if (file) r.transcript = file;\n return r;\n }\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = s.session_id as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n if (typeof s.model === \"string\") session.model = s.model;\n const turn_id = typeof s.turn_id === \"string\" ? s.turn_id : undefined;\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const call_id = typeof s.tool_use_id === \"string\" ? s.tool_use_id : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(\n ev(\"session.started\", {\n source:\n typeof s.source === \"string\" && [\"startup\", \"resume\", \"clear\", \"compact\", \"fork\"].includes(s.source)\n ? s.source\n : \"unknown\",\n }),\n );\n break;\n case \"UserPromptSubmit\":\n events.push(\n ev(\"turn.started\", {\n turn_id,\n prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined,\n }),\n );\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, call_id, turn_id, input: s.tool_input }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", { tool, call_id, turn_id, ok: true, input: s.tool_input, output: s.tool_response }),\n );\n break;\n case \"PermissionRequest\":\n events.push(\n ev(\"attention.needed\", { attention_id: call_id ?? `perm-${Date.now()}`, kind: \"permission\", tool }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"stop\" }));\n break;\n case \"Interrupt\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"interrupt\" }));\n break;\n case \"SubagentStart\":\n events.push(\n ev(\"subagent.started\", {\n agent_id: String(s.agent_id ?? s.subagent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"SubagentStop\":\n events.push(\n ev(\"subagent.ended\", {\n agent_id: String(s.agent_id ?? s.subagent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"PreCompact\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"PostCompact\":\n break;\n case \"SessionEnd\":\n events.push(ev(\"session.ended\", { reason: endReason(s.reason) }));\n break;\n default:\n return null;\n }\n const r: HookResult = { session, events, hints: {} };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readCodex(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript): SessionFacts {\n const out: SessionFacts = {};\n if (transcript) Object.assign(out, codexFacts(transcript));\n return out;\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n for (const f of recentFiles(sessionsDir(env), 3, sinceMs, (n) => /^rollout-.*\\.jsonl$/.test(n))) {\n const m = /([0-9a-f]{8}-[0-9a-f-]{27,})\\.jsonl$/i.exec(path.basename(f));\n if (!m?.[1]) continue;\n const facts = codexFacts(f);\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n rows.push({ session: { id: m[1], ...rest }, started_at, last_at });\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n\n/** Codex keeps no title; its first real ask stands in. */\nexport function codexFacts(file: string): SessionFacts {\n const { head, tail } = ends(file, 128 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const meta = H.find((j) => j.type === \"session_meta\" && j.payload) as\n | { payload?: { cwd?: string; cli_version?: string; git?: { branch?: string; repository_url?: string } } }\n | undefined;\n if (meta?.payload) {\n const p = meta.payload;\n if (p.cwd) out.cwd = p.cwd;\n if (p.cli_version) out.harness_version = String(p.cli_version);\n if (p.git?.branch) out.branch = p.git.branch;\n if (p.git?.repository_url) out.repo = String(p.git.repository_url).replace(/\\/\\/[^/@]*@/, \"//\");\n }\n const ctx = H.concat(T)\n .reverse()\n .find((j) => j.type === \"turn_context\" && (j.payload as { model?: string } | undefined)?.model) as\n | { payload?: { model?: string } }\n | undefined;\n if (ctx?.payload?.model) out.model = ctx.payload.model;\n for (const j of H) {\n const p = j.payload as { type?: string; role?: string; content?: { type?: string; text?: string }[] } | undefined;\n if (j.type !== \"response_item\" || !p || p.type !== \"message\" || p.role !== \"user\") continue;\n const text = (p.content ?? [])\n .filter((b) => b && b.type === \"input_text\" && typeof b.text === \"string\")\n .map((b) => b.text as string)\n .join(\"\\n\")\n .trim();\n if (!text || /^<[a-z_-]+>/i.test(text)) continue;\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n break;\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Codex's ~/.codex/config.toml, as far as the notify fallback needs it: its one\n// top-level `notify` command. Codex reads `notify` only at the top level \u2014 before\n// the first [table] \u2014 and Codex itself appends a [projects.\"<path>\"] table for every\n// folder it trusts, so a line appended at the end lands inside one and never runs.\n// Ported from spacesheep-cli lib/codex-config.js. Pure text in, text out.\n\nconst NOTIFY_LINE = /^[ \\t]*notify[ \\t]*=[ \\t]*(\\[.*\\])[ \\t]*(?:#.*)?$/m;\nconst NOTIFY_KEY = /^[ \\t]*notify[ \\t]*=/m;\n/** A notify that runs sessionpipe's hook directly. */\nexport const OURS = /hook\\.js\",\\s*\"codex\",\\s*\"notify\"/;\n\nfunction scan(line: string, st: { depth: number; str: string | null }): void {\n let i = 0;\n while (i < line.length) {\n if (st.str) {\n const j = line.indexOf(st.str, i);\n if (j < 0) return;\n i = j + 3;\n st.str = null;\n continue;\n }\n const ch = line[i];\n if (ch === \"#\") return;\n if (line.startsWith('\"\"\"', i) || line.startsWith(\"'''\", i)) {\n st.str = line.slice(i, i + 3);\n i += 3;\n continue;\n }\n if (ch === '\"') {\n i++;\n while (i < line.length && line[i] !== '\"') i += line[i] === \"\\\\\" ? 2 : 1;\n i++;\n continue;\n }\n if (ch === \"'\") {\n const j = line.indexOf(\"'\", i + 1);\n i = j < 0 ? line.length : j + 1;\n continue;\n }\n if (ch === \"[\") st.depth++;\n else if (ch === \"]\") st.depth = Math.max(0, st.depth - 1);\n i++;\n }\n}\n\n/** Offset of the first table header, or -1. */\nexport function firstTableAt(text: string): number {\n const st = { depth: 0, str: null as string | null };\n let pos = 0;\n for (const line of text.split(\"\\n\")) {\n if (!st.str && st.depth === 0 && /^[ \\t]*\\[/.test(line)) return pos;\n scan(line, st);\n pos += line.length + 1;\n }\n return -1;\n}\n\nfunction split(text: string) {\n const at = firstTableAt(text);\n return at < 0 ? { head: text, tail: \"\", at: text.length } : { head: text.slice(0, at), tail: text.slice(at), at };\n}\n\nexport function parseArgv(raw: string): string[] | null {\n try {\n const a = JSON.parse(raw) as unknown;\n return Array.isArray(a) && a.every((x) => typeof x === \"string\") ? (a as string[]) : null;\n } catch {\n return null;\n }\n}\n\nexport interface Notify {\n raw: string;\n argv: string[] | null;\n index: number;\n length: number;\n misplaced: boolean;\n other: boolean;\n}\n\n/** notify as Codex sees it; `misplaced` for a line of ours inside a table. */\nexport function readNotify(text: string): Notify | null {\n const { head, tail, at } = split(text);\n const m = NOTIFY_LINE.exec(head);\n if (m)\n return {\n raw: m[1] ?? \"\",\n argv: parseArgv(m[1] ?? \"\"),\n index: m.index,\n length: m[0].length,\n misplaced: false,\n other: !OURS.test(m[1] ?? \"\"),\n };\n const k = NOTIFY_KEY.exec(head);\n if (k) {\n const rest = head.slice(k.index).split(\"\\n\")[0] ?? \"\";\n return {\n raw: rest.replace(NOTIFY_KEY, \"\").trim(),\n argv: null,\n index: k.index,\n length: 0,\n misplaced: false,\n other: true,\n };\n }\n const t = NOTIFY_LINE.exec(tail);\n if (t && OURS.test(t[1] ?? \"\"))\n return {\n raw: t[1] ?? \"\",\n argv: parseArgv(t[1] ?? \"\"),\n index: at + t.index,\n length: t[0].length,\n misplaced: true,\n other: false,\n };\n return null;\n}\n\nfunction dropLine(text: string, index: number, length: number): string {\n return text.slice(0, index) + text.slice(index + length).replace(/^\\r?\\n/, \"\");\n}\n\n/** Put `line` at the top level: before the first table, or at the end of a file that has none. */\nexport function insertTopLevel(text: string, line: string): string {\n const { head, tail } = split(text);\n if (!tail) return (head.trim() ? head.replace(/\\s*$/, \"\\n\") : \"\") + line + \"\\n\";\n return `${(head.trim() ? head.replace(/\\s*$/, \"\\n\") : \"\") + line}\\n\\n${tail}`;\n}\n\n/** The config with `line` as its notify, for a config whose notify is ours or absent. */\nexport function withNotify(text: string, line: string): string {\n const n = readNotify(text);\n if (n && !n.misplaced && !n.other) return text.slice(0, n.index) + line + text.slice(n.index + n.length);\n if (n?.misplaced) return insertTopLevel(dropLine(text, n.index, n.length), line);\n return insertTopLevel(text, line);\n}\n\n/** The config with its top-level notify line replaced by `line`. */\nexport function replaceNotify(text: string, line: string): string | null {\n const n = readNotify(text);\n if (!n || n.misplaced || !n.length) return null;\n return text.slice(0, n.index) + line + text.slice(n.index + n.length);\n}\n\n/** The config with our top-level or misplaced notify removed. */\nexport function withoutNotify(text: string): string {\n const n = readNotify(text);\n if (!n || n.other || !n.length) return text;\n return dropLine(text, n.index, n.length);\n}\n\n// Codex Computer Use takes the notify slot itself and keeps the command it found in\n// its own argv: [client, \"turn-ended\", \"--previous-notify\", \"<that command as JSON>\"].\nconst PREVIOUS = \"--previous-notify\";\nexport function previousNotify(argv: string[] | null): string[] | null {\n if (!Array.isArray(argv)) return null;\n const i = argv.indexOf(PREVIOUS);\n return i >= 0 && typeof argv[i + 1] === \"string\" ? parseArgv(argv[i + 1] as string) : null;\n}\nexport function withPrevious(argv: string[], prev: string[] | null): string[] {\n const out = argv.slice();\n const i = out.indexOf(PREVIOUS);\n if (i >= 0) out.splice(i, 2);\n if (prev) out.push(PREVIOUS, JSON.stringify(prev));\n return out;\n}\n/** The raw notify value with its --previous-notify pair removed, formatting kept. */\nexport function stripPreviousRaw(raw: string): string {\n return raw.replace(/,\\s*\"--previous-notify\",\\s*\"(?:[^\"\\\\]|\\\\.)*\"\\s*(?=\\])/, \"\");\n}\n/** The raw notify value with `prev` as its --previous-notify, formatting of the rest kept. */\nexport function withPreviousRaw(raw: string, prev: string[]): string {\n const base = stripPreviousRaw(raw).replace(/\\s*\\]\\s*$/, \"\");\n return `${base}, \"--previous-notify\", ${JSON.stringify(JSON.stringify(prev))}]`;\n}\nexport const isComputerUse = (argv: string[] | null): boolean =>\n Array.isArray(argv) && typeof argv[0] === \"string\" && /(^|\\/)SkyComputerUseClient$/.test(argv[0]);\n", "// SPDX-License-Identifier: Apache-2.0\n// Gemini CLI (Google) \u2014 docs: https://geminicli.com/docs/hooks/reference\n// Config: ~/.gemini/settings.json `hooks` key, same array-of-groups shape as Claude\n// Code but timeouts in MILLISECONDS and a `name` per handler. stdout must be JSON or\n// empty. Its own telemetry defaults logPrompts on; the installer says so once.\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines } from \"../readers/files.js\";\nimport { readGemini } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport type { Adapter, HookInput, HookResult, InstallOptions, SessionFacts } from \"./types.js\";\n\nconst NAME = \"gemini-cli\";\nexport const GEMINI_EVENTS = [\n \"SessionStart\",\n \"BeforeAgent\",\n \"BeforeTool\",\n \"AfterTool\",\n \"Notification\",\n \"AfterAgent\",\n \"PreCompress\",\n \"SessionEnd\",\n] as const;\nconst OPTS = { matcherFor: (e: string) => (/Tool/.test(e) ? \".*\" : undefined), timeout: 5000 };\nconst geminiDir = (env: NodeJS.ProcessEnv) => env.GEMINI_CLI_HOME || path.join(HOME, \".gemini\");\nconst settings = (env: NodeJS.ProcessEnv) => path.join(geminiDir(env), \"settings.json\");\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst eventsFor = (lean?: boolean) => (lean ? GEMINI_EVENTS.filter((e) => e !== \"BeforeTool\") : [...GEMINI_EVENTS]);\n\n/** Before 0.46 the hooks system is off unless tools.enableHooks is true (issue #11). */\nexport function geminiHooksActive(settingsFile: string): { active: boolean; note?: string } {\n let tools: { enableHooks?: unknown } | undefined;\n try {\n tools = (JSON.parse(readFileSync(settingsFile, \"utf8\")) as { tools?: { enableHooks?: unknown } }).tools;\n } catch {}\n if (tools?.enableHooks === true) return { active: true };\n if (tools?.enableHooks === false)\n return { active: false, note: \"inactive: tools.enableHooks is false in settings.json\" };\n let version = \"\";\n try {\n version = execFileSync(\"gemini\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: 4000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return {\n active: true,\n note: \"could not run `gemini --version`; hooks need tools.enableHooks on versions before 0.46\",\n };\n }\n const m = /(\\d+)\\.(\\d+)/.exec(version);\n if (m && (Number(m[1]) > 0 || Number(m[2]) >= 46)) return { active: true };\n return {\n active: false,\n note: `inactive: Gemini CLI ${version || \"?\"} runs hooks only with \"tools\": {\"enableHooks\": true} in settings.json`,\n };\n}\n\nexport const geminiCli: Adapter = {\n name: NAME,\n events: GEMINI_EVENTS,\n // ~/.gemini also belongs to Antigravity; Gemini CLI is here when its settings or its chat logs exist.\n detect: (env = process.env) => existsSync(settings(env)) || existsSync(path.join(geminiDir(env), \"tmp\")),\n configFiles: (env = process.env) => [settings(env)],\n install: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const r = installClaudeShaped(settings(env), NAME, eventsFor(opts.lean), cmd, OPTS);\n const a = geminiHooksActive(settings(env));\n return [a.note && !r.skipped ? { ...r, note: [r.note, a.note].filter(Boolean).join(\"; \") } : r];\n },\n uninstall: (env = process.env, opts: InstallOptions = {}) => [\n uninstallClaudeShaped(settings(env), GEMINI_EVENTS, { created: opts.created?.includes(settings(env)) }),\n ],\n installed: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const state = installedClaudeShaped(settings(env), NAME, eventsFor(opts.lean), cmd, OPTS);\n const a = geminiHooksActive(settings(env));\n return [\n {\n file: settings(env),\n state: state === \"current\" && !a.active ? \"inactive\" : state,\n ...(a.note ? { note: a.note } : {}),\n },\n ];\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = s.session_id as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(\n ev(\"session.started\", {\n source:\n typeof s.source === \"string\" && [\"startup\", \"resume\", \"clear\"].includes(s.source) ? s.source : \"unknown\",\n }),\n );\n break;\n case \"BeforeAgent\":\n events.push(\n ev(\"turn.started\", { prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined }),\n );\n break;\n case \"BeforeTool\":\n if (tool) events.push(ev(\"tool.started\", { tool, input: s.tool_input }));\n break;\n case \"AfterTool\": {\n const resp = s.tool_response as { error?: unknown; llmContent?: unknown } | undefined;\n const err =\n resp && typeof resp === \"object\" && resp.error\n ? String(typeof resp.error === \"string\" ? resp.error : JSON.stringify(resp.error)).slice(0, 2000)\n : undefined;\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n ok: !err,\n error: err,\n input: s.tool_input,\n output: resp?.llmContent ?? s.tool_response,\n }),\n );\n break;\n }\n case \"Notification\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: `notif-${Date.now()}`,\n kind: s.notification_type === \"ToolPermission\" ? \"permission\" : \"question\",\n message: typeof s.message === \"string\" ? s.message.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"AfterAgent\":\n events.push(ev(\"turn.ended\", { reason: \"stop\" }));\n break;\n case \"PreCompress\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"SessionEnd\":\n events.push(\n ev(\"session.ended\", {\n reason:\n s.reason === \"clear\" || s.reason === \"logout\" || s.reason === \"exit\"\n ? s.reason\n : s.reason === \"prompt_input_exit\"\n ? \"exit\"\n : \"other\",\n }),\n );\n break;\n default:\n return null;\n }\n const r: HookResult = { session, events, hints: {} };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readGemini(text.split(\"\\n\"), fromLine);\n },\n\n facts(_session, transcript): SessionFacts {\n const out: SessionFacts = {};\n if (!transcript) return out;\n const { head, tail } = ends(transcript, 64 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const first = H.find((j) => j.type === \"user\");\n const raw = first ? (first.content ?? first.message ?? first.text) : undefined;\n const text = typeof raw === \"string\" ? raw.trim() : \"\";\n if (text) {\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n },\n\n backfill: () => [], // chat logs are keyed by a project hash, not a session id we can name; the first hook of a resumed session reports it\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The registry: the only place that lists vendors. A new harness is one file here\n// plus its fixtures and its row in spec/ADAPTERS.md.\nimport { antigravity } from \"./antigravity.js\";\nimport { claudeCode } from \"./claude-code.js\";\nimport { codex } from \"./codex.js\";\nimport { geminiCli } from \"./gemini-cli.js\";\nimport type { Adapter } from \"./types.js\";\n\nexport const ADAPTERS: readonly Adapter[] = [claudeCode, codex, geminiCli, antigravity];\nexport const adapterByName = (name: string): Adapter | undefined => ADAPTERS.find((a) => a.name === name);\nexport type {\n Adapter,\n AdapterEvent,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallReport,\n SessionFacts,\n TranscriptRead,\n Turn,\n} from \"./types.js\";\nexport { antigravity, claudeCode, codex, geminiCli };\n", "// SPDX-License-Identifier: Apache-2.0\n// ~/.config/sessionpipe/config.json, mode 0600: the machine's name, the sinks with\n// their tier and token, per-harness switches, the update check.\nimport { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { configFile } from \"./paths.js\";\nimport type { Tier } from \"./types.js\";\n\nexport interface SinkConfig {\n name: string;\n /** https://\u2026, file:PATH, stdout, otlp:URL */\n url: string;\n tier: Tier;\n pii?: boolean;\n control?: boolean;\n token?: string;\n /** whsec_\u2026 for Standard Webhooks signatures. */\n secret?: string;\n /** Learned from the receiver's well-known file; re-read daily. */\n max_tier?: Tier;\n well_known_at?: string;\n paused?: string;\n}\n\nexport interface Config {\n machine?: string;\n sinks: SinkConfig[];\n harnesses: Record<string, { enabled?: boolean; created?: string[] }>;\n update_check?: boolean;\n keep_days?: number;\n}\n\nexport const DEFAULT_CONFIG: Config = { sinks: [], harnesses: {}, update_check: true, keep_days: 30 };\n\nexport function readConfig(file: string = configFile()): Config {\n try {\n const j = JSON.parse(readFileSync(file, \"utf8\")) as Partial<Config>;\n return {\n ...DEFAULT_CONFIG,\n ...j,\n sinks: Array.isArray(j.sinks) ? j.sinks : [],\n harnesses: j.harnesses && typeof j.harnesses === \"object\" ? j.harnesses : {},\n };\n } catch {\n return { ...DEFAULT_CONFIG, sinks: [], harnesses: {} };\n }\n}\n\nexport function writeConfig(c: Config, file: string = configFile()): void {\n mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });\n writeFileSync(file, `${JSON.stringify(c, null, 2)}\\n`, { mode: 0o600 });\n if (process.platform !== \"win32\" && existsSync(file)) {\n try {\n chmodSync(file, 0o600);\n } catch {}\n }\n}\n\n/** The machine's name: what the person configured, else the hostname without a\n * local suffix. Never guessed from anything else (a hand-typed name once linked 64\n * versions to nothing). */\nexport function machineName(c: Config, hostname: string): string {\n if (c.machine) return String(c.machine).slice(0, 80);\n return hostname.replace(/\\.(local|lan|home)$/i, \"\");\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// ULID: 48-bit ms timestamp + 80 random bits, Crockford base32. Monotonic within a\n// process so two events in the same millisecond still sort in emit order.\nimport { randomBytes } from \"node:crypto\";\n\nconst ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nlet lastTime = 0;\nlet lastRand: number[] = [];\n\nfunction encodeTime(t: number): string {\n let out = \"\";\n let n = t;\n for (let i = 0; i < 10; i++) {\n out = ALPHABET[n % 32] + out;\n n = Math.floor(n / 32);\n }\n return out;\n}\n\nexport function ulid(now: number = Date.now()): string {\n if (now === lastTime) {\n // increment the random part\n for (let i = lastRand.length - 1; i >= 0; i--) {\n const v = (lastRand[i] ?? 0) + 1;\n if (v < 32) {\n lastRand[i] = v;\n break;\n }\n lastRand[i] = 0;\n }\n } else {\n lastTime = now;\n const b = randomBytes(16);\n lastRand = Array.from({ length: 16 }, (_, i) => (b[i] ?? 0) % 32);\n }\n return encodeTime(now) + lastRand.map((v) => ALPHABET[v]).join(\"\");\n}\n\nexport const isUlid = (s: string): boolean => /^[0-9A-HJKMNP-TV-Z]{26}$/.test(s);\n", "// SPDX-License-Identifier: Apache-2.0\n// From an adapter's output to a protocol event: id, time, the full session block\n// as known now, and the raw (tier 3) data. Filtering per sink happens later.\nimport type { AdapterEvent } from \"./adapters/types.js\";\nimport type { Event, Session } from \"./types.js\";\nimport { ulid } from \"./ulid.js\";\n\nexport interface EventContext {\n harness: { name: string; version?: string };\n session: Session;\n now?: number;\n}\n\nexport function makeEvent(a: AdapterEvent, ctx: EventContext): Event {\n const now = ctx.now ?? Date.now();\n const harness: Event[\"harness\"] = { name: ctx.harness.name, event: a.harnessEvent };\n if (ctx.harness.version) harness.version = ctx.harness.version;\n return {\n protocol: 1,\n id: ulid(now),\n type: a.type,\n time: new Date(now).toISOString(),\n tier: 3,\n harness,\n session: ctx.session,\n privacy: { rulesets: [], pii: false },\n data: a.data,\n };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The outbox: append-only JSONL per (harness, session) under\n// <state>/outbox/<harness>/<session>.jsonl, a per-session seq counter, a per-sink\n// cursor that moves only when the sink acknowledged, and a per-session lock so two\n// workers never interleave. Never lose, never duplicate.\nimport {\n appendFileSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { safeId } from \"./paths.js\";\nimport type { Event } from \"./types.js\";\n\nexport interface OutboxRef {\n harness: string;\n session: string;\n}\n\nexport class Outbox {\n constructor(readonly root: string) {}\n\n dir(harness: string): string {\n return path.join(this.root, \"outbox\", safeId(harness));\n }\n file(ref: OutboxRef): string {\n return path.join(this.dir(ref.harness), `${safeId(ref.session)}.jsonl`);\n }\n private seqFile(ref: OutboxRef): string {\n return path.join(this.dir(ref.harness), `${safeId(ref.session)}.seq`);\n }\n\n /** The next seq for a session, persisted (survives a hibernating machine and a\n * restart; an in-memory counter would restart at 0 and collide). */\n nextSeq(ref: OutboxRef): number {\n const f = this.seqFile(ref);\n let n = 0;\n try {\n n = Number(readFileSync(f, \"utf8\")) || 0;\n } catch {\n // A missing counter with an existing outbox: recover from the file's last line.\n n = this.lastSeqInFile(ref) + 1;\n }\n mkdirSync(path.dirname(f), { recursive: true, mode: 0o700 });\n writeFileSync(f, String(n + 1), { mode: 0o600 });\n return n;\n }\n\n private lastSeqInFile(ref: OutboxRef): number {\n const f = this.file(ref);\n if (!existsSync(f)) return -1;\n const lines = readFileSync(f, \"utf8\").trim().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const j = JSON.parse(lines[i] ?? \"\") as Event;\n if (typeof j.session?.seq === \"number\") return j.session.seq;\n } catch {}\n }\n return -1;\n }\n\n append(ref: OutboxRef, events: Event[]): void {\n if (!events.length) return;\n mkdirSync(this.dir(ref.harness), { recursive: true, mode: 0o700 });\n appendFileSync(this.file(ref), `${events.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`, { mode: 0o600 });\n }\n\n /** Every session file, newest first. */\n sessions(): OutboxRef[] {\n const out: { ref: OutboxRef; mtime: number }[] = [];\n const base = path.join(this.root, \"outbox\");\n if (!existsSync(base)) return [];\n for (const h of readdirSync(base)) {\n const d = path.join(base, h);\n let names: string[] = [];\n try {\n names = readdirSync(d).filter((n) => n.endsWith(\".jsonl\"));\n } catch {\n continue;\n }\n for (const n of names) {\n try {\n out.push({ ref: { harness: h, session: n.slice(0, -6) }, mtime: statSync(path.join(d, n)).mtimeMs });\n } catch {}\n }\n }\n return out.sort((a, b) => b.mtime - a.mtime).map((x) => x.ref);\n }\n\n /** Read events after byte offset `from`; returns them and the new offset. Lines\n * are read whole; a partial trailing line (a write in progress) is left. */\n read(ref: OutboxRef, from: number, maxEvents = 500): { events: Event[]; offset: number } {\n const f = this.file(ref);\n if (!existsSync(f)) return { events: [], offset: from };\n const size = statSync(f).size;\n if (from >= size) return { events: [], offset: from };\n const fd = openSync(f, \"r\");\n try {\n const buf = Buffer.alloc(Math.min(size - from, 8 * 1024 * 1024));\n const n = readSync(fd, buf, 0, buf.length, from);\n const text = buf.subarray(0, n).toString(\"utf8\");\n const events: Event[] = [];\n let offset = from;\n let pos = 0;\n while (events.length < maxEvents) {\n const nl = text.indexOf(\"\\n\", pos);\n if (nl < 0) break;\n const line = text.slice(pos, nl);\n pos = nl + 1;\n offset = from + Buffer.byteLength(text.slice(0, pos), \"utf8\");\n if (!line.trim()) continue;\n try {\n events.push(JSON.parse(line) as Event);\n } catch {}\n }\n return { events, offset };\n } finally {\n closeSync(fd);\n }\n }\n\n /** Files older than `days` are pruned; the cursor files with them. */\n prune(days: number, now = Date.now()): number {\n let n = 0;\n const cutoff = now - days * 86_400_000;\n for (const ref of this.sessions()) {\n const f = this.file(ref);\n try {\n if (statSync(f).mtimeMs < cutoff) {\n unlinkSync(f);\n try {\n unlinkSync(this.seqFile(ref));\n } catch {}\n n++;\n }\n } catch {}\n }\n return n;\n }\n\n delete(ref: OutboxRef): void {\n for (const f of [this.file(ref), this.seqFile(ref)]) {\n try {\n unlinkSync(f);\n } catch {}\n }\n }\n}\n\n/** Per-sink cursor: byte offset per session file, moved only on a 2xx. */\nexport class Cursors {\n constructor(\n readonly root: string,\n readonly sink: string,\n ) {}\n private file(): string {\n return path.join(this.root, \"cursors\", `${safeId(this.sink)}.json`);\n }\n read(): Record<string, number> {\n try {\n return JSON.parse(readFileSync(this.file(), \"utf8\")) as Record<string, number>;\n } catch {\n return {};\n }\n }\n write(c: Record<string, number>): void {\n const f = this.file();\n mkdirSync(path.dirname(f), { recursive: true, mode: 0o700 });\n const tmp = `${f}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(c), { mode: 0o600 });\n renameSync(tmp, f);\n }\n key(ref: OutboxRef): string {\n return `${ref.harness}/${ref.session}`;\n }\n}\n\n/** A lock per session so two workers never interleave. Stale after 5 min. */\nexport function takeLock(root: string, ref: OutboxRef, staleMs = 5 * 60_000): (() => void) | null {\n const dir = path.join(root, \"locks\");\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n const f = path.join(dir, `${safeId(ref.harness)}-${safeId(ref.session)}.lock`);\n try {\n if (Date.now() - statSync(f).mtimeMs > staleMs) unlinkSync(f);\n else return null;\n } catch {}\n try {\n writeFileSync(f, String(process.pid), { flag: \"wx\" });\n } catch {\n return null;\n }\n return () => {\n try {\n unlinkSync(f);\n } catch {}\n };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// pii@1 \u2014 an opt-in second pass that reduces identifiers (spec/PRIVACY.md \u00A72). It\n// does not promise anonymity; it removes the obvious.\nimport { createHash } from \"node:crypto\";\n\nexport const RULESET_PII = \"pii@1\";\n\nconst EMAIL = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g;\n/** E.164 and common national forms: an optional +, 7\u201315 digits with separators,\n * optional area-code parentheses. A version number (22.23.1) or an IP never matches:\n * the run must not sit between dots, and needs \u2265 7 digits. */\nconst PHONE = /(?<![\\w.])(?:\\+\\d{1,3}[ .-]?)?(?:\\(\\d{2,4}\\)[ .-]?)?\\d{2,4}(?:[ .-]?\\d{2,4}){1,3}(?!\\w)/g;\n\nfunction looksPhone(s: string): boolean {\n const digits = s.replace(/\\D/g, \"\");\n if (digits.length < 7 || digits.length > 15) return false;\n // \"port 8891, pr 12345\": a bare run with no separator or + is a number, not a phone.\n if (!/[+() .-]/.test(s)) return false;\n // \"22.23.1\", \"185.199.108.153\": dots alone are a version or an address.\n if (!/[+() -]/.test(s)) return false;\n return true;\n}\n\n/** Replace emails and phone numbers, and write `home` as `~`. */\nexport function reducePii(text: string, home?: string): string {\n if (!text) return text;\n let out = text.replace(EMAIL, \"[email]\");\n out = out.replace(PHONE, (m) => (looksPhone(m) ? \"[phone]\" : m));\n if (home) {\n const h = home.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n out = out.replace(new RegExp(`(?<![A-Za-z0-9_])${h}(?=/|$|\\\\s|[\"'\\`])`, \"g\"), \"~\");\n }\n return out;\n}\n\n/** The machine's name under pii@1: the first 8 hex of its SHA-256. */\nexport function hashMachine(name: string): string {\n return createHash(\"sha256\").update(name).digest(\"hex\").slice(0, 8);\n}\n\n/** Apply pii@1 to every string in a value; `home` becomes `~`. */\nexport function reducePiiDeep<T>(v: T, home?: string): T {\n if (typeof v === \"string\") return reducePii(v, home) as T;\n if (Array.isArray(v)) return v.map((x) => reducePiiDeep(x, home)) as T;\n if (v && typeof v === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) out[k] = reducePiiDeep(x, home);\n return out as T;\n }\n return v;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// secrets@1 \u2014 credentials out of every string, on the person's machine, before an\n// event reaches the outbox. Ported from spacesheep-cli lib/redact.js (Michael\n// Makarov, MIT \u2192 Apache-2.0, see NOTICE). The ruleset is defined in\n// spec/PRIVACY.md \u00A72 and pinned by conformance/redaction/secrets.json.\n//\n// Every pattern is linear: bounded repetition, no nested quantifiers. The\n// adversarial vectors (password_ \u00D7 5000, a 50 000-space run) pin that.\n\nexport const RULESET_SECRETS = \"secrets@1\";\nexport const REDACTED = \"[redacted]\";\n\n/** Token formats that are a credential by their shape alone. Each is anchored on a\n * vendor prefix, so a commit sha or a UUID never matches. */\nconst TOKEN_PATTERNS: RegExp[] = [\n /-----BEGIN [A-Z0-9 ]*PRIVATE KEY(?: BLOCK)?-----[\\s\\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY(?: BLOCK)?-----|$)/g,\n /\\b(?:AKIA|ASIA|ABIA|ACCA)[0-9A-Z]{16}\\b/g, // AWS access key id\n /\\bgh[pousr]_[A-Za-z0-9]{30,}\\b/g, // GitHub\n /\\bgithub_pat_[A-Za-z0-9_]{30,}\\b/g,\n /\\bglpat-[A-Za-z0-9_-]{20,}\\b/g, // GitLab\n /\\bxox[abposre]-[A-Za-z0-9-]{10,}\\b/g, // Slack\n /\\bhttps:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]+/g,\n /\\bhttps:\\/\\/(?:ptb\\.|canary\\.)?discord(?:app)?\\.com\\/api\\/webhooks\\/[0-9]+\\/[A-Za-z0-9_-]+/g,\n /\\bsk-(?:ant-|proj-|svcacct-|admin-|or-v1-)?[A-Za-z0-9_-]{20,}\\b/g, // Anthropic, OpenAI, DeepSeek, OpenRouter\n /\\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\\b/g, // Stripe secret / restricted\n /\\bwhsec_[A-Za-z0-9+/=]{20,}/g, // Stripe / Svix / Standard Webhooks secret\n /\\bAIza[0-9A-Za-z_-]{35}\\b/g, // Google API key\n /\\bya29\\.[0-9A-Za-z_-]{20,}/g, // Google OAuth access token\n /\\b1\\/\\/0[0-9A-Za-z_-]{30,}/g, // Google OAuth refresh token\n /\\bGOCSPX-[0-9A-Za-z_-]{20,}/g, // Google OAuth client secret\n /\\bxai-[A-Za-z0-9]{30,}\\b/g,\n /\\bgsk_[A-Za-z0-9]{30,}\\b/g, // Groq\n /\\bpplx-[A-Za-z0-9]{30,}\\b/g, // Perplexity\n /\\bhf_[A-Za-z0-9]{30,}\\b/g, // Hugging Face\n /\\bpcsk_[A-Za-z0-9_]{30,}\\b/g, // Pinecone\n /\\bnpm_[A-Za-z0-9]{30,}\\b/g,\n /\\bpypi-[A-Za-z0-9_-]{50,}/g,\n /\\bSG\\.[A-Za-z0-9_-]{16,}\\.[A-Za-z0-9_-]{16,}/g, // SendGrid\n /\\bshp(?:at|ss|ca|pa)_[a-fA-F0-9]{32}\\b/g, // Shopify\n /\\bdop_v1_[a-f0-9]{64}\\b/g, // DigitalOcean\n /\\b(?:lin_api|lin_oauth)_[A-Za-z0-9]{30,}\\b/g, // Linear\n /\\b(?:ntn|secret)_[A-Za-z0-9]{40,}\\b/g, // Notion\n /\\bsbp_[a-f0-9]{40}\\b/g, // Supabase\n /\\bfigd_[A-Za-z0-9_-]{30,}/g, // Figma\n /\\bdp\\.(?:pt|st|sa|ct)\\.[A-Za-z0-9]{30,}/g, // Doppler\n /\\bgrn_[A-Za-z0-9_-]{20,}/g, // Granola\n /\\bss_[a-f0-9]{32,}\\b/g, // spacesheep API keys\n /\\b[0-9]{8,10}:AA[A-Za-z0-9_-]{33}\\b/g, // Telegram bot token\n /\\beyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g, // JWT\n];\n/** `scheme://user:password@host` \u2014 the password goes, the user and host stay. */\nconst URL_CREDENTIALS = /\\b([a-z][a-z0-9+.-]{1,20}:\\/\\/[^\\s:/@'\"`<>]{1,100}:)([^\\s@/'\"`<>]{1,200})(@)/gi;\n/** `Authorization: Bearer \u2026` / `Basic \u2026`, and a bare `Bearer <token>` in a curl line. */\nconst AUTH_HEADER = /\\b((?:Bearer|Basic|Token)\\s+)([A-Za-z0-9._~+/=-]{16,})/g;\n// The words that name a secret, in prose. `key` alone is too common (\"the key\n// point\"), so it only counts with a qualifier.\nconst SECRET_WORD =\n \"(?:pass(?:word|wd|phrase|code)?s?|pwd|secret(?:[ _-]?key)?s?|client[ _-]?secret|api[ _-]?keys?|apikeys?|access[ _-]?keys?|access[ _-]?tokens?|auth[ _-]?tokens?|refresh[ _-]?tokens?|private[ _-]?keys?|tokens?|credentials?|creds)\";\n/** Strict form: a NAME, an explicit separator (`=`, `:`, `=>`), a value. The name is\n * one flat run of identifier characters judged in code (isSecretName), never by a\n * nested pattern. Only a secret name goes on to consume its value \u2014 otherwise\n * `https:` would swallow the `?token=\u2026` behind it. */\nconst NAME_SEP = /(?<![A-Za-z0-9_])([A-Za-z][A-Za-z0-9_-]{1,79})([\"']?\\s{0,3}(?::=|=>|=|:)\\s{0,3})/g;\nconst VALUE = /\"([^\"\\n]{1,300})\"|'([^'\\n]{1,300})'|`([^`\\n]{1,300})`|([^\\s\"'`,;&)}\\]]{1,300})/y;\n\nfunction redactAssignments(text: string): string {\n let out = \"\";\n let last = 0;\n NAME_SEP.lastIndex = 0;\n for (let m = NAME_SEP.exec(text); m; m = NAME_SEP.exec(text)) {\n const name = m[1] ?? \"\";\n if (!isSecretName(name)) continue;\n VALUE.lastIndex = NAME_SEP.lastIndex;\n const v = VALUE.exec(text);\n if (!v) continue;\n const value = v[1] ?? v[2] ?? v[3] ?? v[4] ?? \"\";\n NAME_SEP.lastIndex = VALUE.lastIndex;\n if (isPlaceholder(value) || value.includes(REDACTED)) continue;\n // `max_tokens: 4096`, `input_tokens=12k` \u2014 a token COUNT, not a token.\n if (/tokens?$/i.test(name) && /^\\d+(?:[.,]\\d+)*[km]?$/i.test(value)) continue;\n const q = v[1] != null ? '\"' : v[2] != null ? \"'\" : v[3] != null ? \"`\" : \"\";\n out += text.slice(last, v.index) + q + REDACTED + q;\n last = VALUE.lastIndex;\n }\n return last ? out + text.slice(last) : text;\n}\n\n/** Is this identifier the name of a secret? `DB_PASSWORD`, `apiKey`, `client-secret`,\n * `AWS_SECRET_ACCESS_KEY`, `GITHUB_TOKEN`; an env-style `STRIPE_KEY` too. Not\n * `password_hash`, `tokenizer`, `sort_key`. */\nexport function isSecretName(name: string): boolean {\n if (/^[A-Z0-9_]+_KEY$/.test(name)) return true;\n const flat = name.toLowerCase().replace(/[_-]/g, \"\");\n return /(?:pass(?:word|wd|phrase|code)|pwd|secret|secretkey|secretaccesskey|clientsecret|apikey|accesskey|accesstoken|authtoken|refreshtoken|privatekey|token|credential|creds)s?$/.test(\n flat,\n );\n}\n\n/** Loose form: prose. \"password is Hunter2!\", \"the token was ghx\u2026\". Only a value\n * that looks generated counts, so \"the password is wrong\" passes untouched.\n * Whitespace runs are bounded so a long run can't make the match quadratic. */\nconst PROSE = new RegExp(\n `(\\\\b${SECRET_WORD}(?:[ \\\\t]{1,3}(?:is|was|=|:|to|as|of|for[ \\\\t]{1,3}\\\\S{1,40}[ \\\\t]{1,3}is))?[ \\\\t]{1,3})([\"'\\`]?)([^\\\\s\"'\\`]{6,200})\\\\2`,\n \"gi\",\n);\n\n/** A value that is plainly not the secret itself: a type, a variable, a template, an\n * already-redacted marker, an env lookup. */\nfunction isPlaceholder(v: string): boolean {\n const s = v.replace(/[.,;:!?]+$/, \"\");\n if (!s) return true;\n if (\n /^(?:string|number|boolean|bool|str|int|any|unknown|null|undefined|none|nil|true|false|optional|required|text|varchar|password|secret|token|env|string\\[\\]|object|bytes)$/i.test(\n s,\n )\n )\n return true;\n if (/^\\[?redacted\\]?$/i.test(s) || /^\\*+$/.test(s) || /^x{3,}$/i.test(s) || /^\\.{3}$|^\u2026$/.test(s)) return true;\n if (/^[<{$%]/.test(s)) return true; // <your-key>, ${VAR}, {{var}}, $VAR, %VAR%\n if (\n /^(?:process\\.env|env|os\\.environ|c\\.env|this\\.env|import\\.meta\\.env|getenv|config|settings|secrets|args|opts|options|req|request|body|params|input|data|user|self|this)\\b/i.test(\n s,\n )\n )\n return true;\n if (/^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)+$/.test(s)) return true; // a member path: form.password\n if (/[(]/.test(s)) return true; // a call: hash(pw), getSecret()\n if (/^(?:your|my|the|a|an|some|new|old)[-_ ]/i.test(s)) return true; // your-api-key\n return false;\n}\n\n/** Does a prose value look like something generated, rather than an English word? */\nfunction looksSecret(v: string): boolean {\n const s = v.replace(/[.,;:!?)]+$/, \"\");\n if (s.length < 6) return false;\n if (isPlaceholder(s)) return false;\n if (/^https?:\\/\\//i.test(s)) return false; // a link, handled by URL_CREDENTIALS if it carries one\n if (/^[a-z]+(?:[-'][a-z]+)*$/.test(s)) return false; // a lowercase word\n if (/^[A-Z][a-z]+$/.test(s)) return false; // a capitalised word\n if (/^\\d+(?:[.,]\\d+)*[a-z%]*$/i.test(s)) return false; // a count: 4096, 128k, 3.5, 50%\n if (/^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$/.test(s)) return false; // an env var's NAME\n const kinds = [/[a-z]/, /[A-Z]/, /[0-9]/, /[^A-Za-z0-9]/].filter((r) => r.test(s)).length;\n return kinds >= 3 || (/[0-9]/.test(s) && /[A-Za-z]/.test(s));\n}\n\n/** Redact every credential in `text`. Returns the same string when there is none. */\nexport function redactSecrets(text: string): string {\n if (!text) return text;\n let out = text;\n for (const re of TOKEN_PATTERNS) out = out.replace(re, REDACTED);\n out = out.replace(URL_CREDENTIALS, (_m, head: string, _pw: string, at: string) => `${head}${REDACTED}${at}`);\n out = out.replace(AUTH_HEADER, (m, head: string, v: string) => (v.includes(REDACTED) ? m : `${head}${REDACTED}`));\n out = redactAssignments(out);\n out = out.replace(PROSE, (m, head: string, q: string, v: string) =>\n !looksSecret(v) || v.includes(REDACTED) ? m : `${head}${q}${REDACTED}${q}`,\n );\n return out;\n}\n\n/** Did redaction change anything? */\nexport function hasSecret(text: string): boolean {\n return !!text && redactSecrets(text) !== text;\n}\n\n/** Redact every string in a JSON-able value (keys are left alone). */\nexport function redactDeep<T>(v: T): T {\n if (typeof v === \"string\") return redactSecrets(v) as T;\n if (Array.isArray(v)) return v.map(redactDeep) as T;\n if (v && typeof v === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) out[k] = redactDeep(x);\n return out as T;\n }\n return v;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// filter(event, tier, pii): the pure function every sink runs an event through.\n// Removes by ALLOWLIST per type and tier (spec/PRIVACY.md \u00A71), redacts every string\n// above tier 0 with secrets@1, and runs pii@1 when asked. Returns null when the\n// type is not carried at the tier. The conformance runner runs the same function.\nimport type { Event, Tier } from \"../types.js\";\nimport { hashMachine, RULESET_PII, reducePiiDeep } from \"./pii.js\";\nimport { RULESET_SECRETS, redactDeep } from \"./secrets.js\";\n\n/** The lowest tier that carries each known type (kept in step with schema/v1.ts). */\nexport const TYPE_TIER: Record<string, Tier> = {\n \"session.started\": 0,\n \"session.heartbeat\": 0,\n \"session.ended\": 0,\n \"session.backfill\": 0,\n \"session.forgotten\": 0,\n \"turn.started\": 0,\n \"turn.ended\": 0,\n \"turn.transcript\": 2,\n \"tool.started\": 1,\n \"tool.ended\": 1,\n \"files.changed\": 1,\n \"attention.needed\": 0,\n \"attention.cleared\": 0,\n \"subagent.started\": 1,\n \"subagent.ended\": 1,\n \"context.compacted\": 1,\n native: 3,\n};\n\n/** data keys allowed per type at tier N (cumulative: tier 1 includes tier 0's). */\nconst DATA_ALLOW: Record<string, Partial<Record<Tier, string[]>>> = {\n \"session.started\": { 0: [\"source\"] },\n \"session.heartbeat\": { 0: [] },\n \"session.ended\": { 0: [\"reason\"] },\n \"session.backfill\": { 0: [\"started_at\", \"last_at\", \"turns\"] },\n \"session.forgotten\": { 0: [] },\n \"turn.started\": { 0: [\"turn_id\"], 1: [\"prompt_chars\"] },\n \"turn.ended\": { 0: [\"turn_id\", \"reason\", \"ms\"], 1: [\"error\"] },\n \"turn.transcript\": { 2: [\"turn\", \"user\", \"assistant\", \"at\"] },\n \"tool.started\": { 1: [\"tool\", \"call_id\", \"turn_id\", \"agent_id\"], 3: [\"input\"] },\n \"tool.ended\": { 1: [\"tool\", \"call_id\", \"turn_id\", \"agent_id\", \"ms\", \"ok\", \"error\"], 3: [\"input\", \"output\"] },\n \"files.changed\": { 1: [\"paths\"] },\n \"attention.needed\": { 0: [\"attention_id\", \"kind\"], 1: [\"tool\", \"message\"] },\n \"attention.cleared\": { 0: [\"attention_id\", \"how\"] },\n \"subagent.started\": { 1: [\"agent_id\", \"agent_type\"] },\n \"subagent.ended\": { 1: [\"agent_id\", \"agent_type\"] },\n \"context.compacted\": { 1: [\"trigger\"] },\n};\n\nconst SESSION_ALLOW = [\n \"id\",\n \"seq\",\n \"machine\",\n \"cwd\",\n \"repo\",\n \"branch\",\n \"model\",\n \"title\",\n \"title_source\",\n \"url\",\n \"account_id\",\n \"parent_id\",\n];\nconst MAX_SIDE = 20_000;\nconst MAX_IO = 64 * 1024;\n\nfunction allowedKeys(type: string, tier: Tier): string[] | null {\n const table = DATA_ALLOW[type];\n if (!table) return null; // unknown type: kept whole (receivers keep extra keys), redacted\n const out: string[] = [];\n for (let t = 0; t <= tier; t++) for (const k of table[t as Tier] ?? []) out.push(k);\n return out;\n}\n\nfunction cap(v: unknown, max: number): unknown {\n if (typeof v === \"string\") return v.length > max ? `${v.slice(0, max)}\u2026` : v;\n if (v && typeof v === \"object\") {\n const s = JSON.stringify(v);\n return s.length > max ? `${s.slice(0, max)}\u2026` : v;\n }\n return v;\n}\n\nexport interface FilterOptions {\n /** The person's home directory, for pii@1's `~` rewrite. */\n home?: string;\n}\n\n/** The event as a sink at `tier` may see it, or null when the type is above the tier. */\nexport function filterEvent(event: Event, tier: Tier, pii: boolean, opts: FilterOptions = {}): Event | null {\n const minTier = TYPE_TIER[event.type];\n if (minTier !== undefined && minTier > tier) return null;\n if (event.type === \"native\" && tier < 3) return null;\n\n const session: Record<string, unknown> = {};\n for (const k of SESSION_ALLOW)\n if (event.session[k as keyof typeof event.session] !== undefined)\n session[k] = event.session[k as keyof typeof event.session];\n\n let data: Record<string, unknown> = {};\n const keys = allowedKeys(event.type, tier);\n if (keys === null) data = { ...event.data };\n else for (const k of keys) if (event.data[k] !== undefined) data[k] = event.data[k];\n if (typeof data.user === \"string\") data.user = cap(data.user, MAX_SIDE);\n if (typeof data.assistant === \"string\") data.assistant = cap(data.assistant, MAX_SIDE);\n if (data.input !== undefined) data.input = cap(data.input, MAX_IO);\n if (data.output !== undefined) data.output = cap(data.output, MAX_IO);\n if (typeof data.message === \"string\") data.message = cap(data.message, 200);\n\n const rulesets: string[] = [];\n let out: Event = { ...event, tier, session: session as Event[\"session\"], data, privacy: { rulesets, pii } };\n if (tier > 0) {\n // Redact, then the caps above already applied: a cut before redaction could leave half a key.\n out = { ...out, session: redactDeep(out.session), data: redactDeep(out.data) };\n rulesets.push(RULESET_SECRETS);\n }\n if (pii) {\n const s = reducePiiDeep(out.session, opts.home) as Record<string, unknown>;\n if (typeof s.machine === \"string\") s.machine = hashMachine(s.machine);\n delete s.account_id;\n out = { ...out, session: s as Event[\"session\"], data: reducePiiDeep(out.data, opts.home) };\n rulesets.push(RULESET_PII);\n }\n out.privacy = { rulesets, pii };\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// file:PATH \u2014 append filtered events as JSONL. The zero-server sink.\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Event, Tier } from \"../types.js\";\nimport type { DeliveryResult, Sink } from \"./types.js\";\n\nexport class FileSink implements Sink {\n constructor(\n readonly name: string,\n readonly file: string,\n readonly tier: Tier,\n readonly pii: boolean,\n ) {}\n async send(events: Event[]): Promise<DeliveryResult> {\n try {\n mkdirSync(path.dirname(this.file), { recursive: true });\n appendFileSync(this.file, `${events.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`);\n return { ok: true, acknowledged: events.length, accepted: events.length, duplicates: 0, rejected: [] };\n } catch (e) {\n return { ok: false, acknowledged: 0, error: String((e as Error).message), action: \"retry\" };\n }\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// stdout \u2014 one JSON line per event to a writable (the worker's stdout is ignored\n// when spawned by a hook, so this sink is for `sessionpipe tail` and tests).\nimport type { Event, Tier } from \"../types.js\";\nimport type { DeliveryResult, Sink } from \"./types.js\";\n\nexport class StdoutSink implements Sink {\n constructor(\n readonly name: string,\n readonly tier: Tier,\n readonly pii: boolean,\n private readonly write: (line: string) => void = (l) => process.stdout.write(`${l}\\n`),\n ) {}\n async send(events: Event[]): Promise<DeliveryResult> {\n for (const e of events) this.write(JSON.stringify(e));\n return { ok: true, acknowledged: events.length, accepted: events.length, duplicates: 0, rejected: [] };\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// What a worker run does, as a function so tests and `sessionpipe replay` share it.\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n adapterByName,\n Cursors,\n type Event,\n type FactsState,\n FileSink,\n filterEvent,\n gitFacts,\n machineName,\n makeEvent,\n Outbox,\n readConfig,\n redactDeep,\n type Session,\n type Sink,\n type SinkConfig,\n StdoutSink,\n safeId,\n stateDir,\n takeLock,\n tilde,\n writeConfig,\n} from \"@sessionpipe/core\";\nimport { HttpSink } from \"./http-sink.js\";\n\ndeclare const __SESSIONPIPE_VERSION__: string;\nconst VERSION = typeof __SESSIONPIPE_VERSION__ === \"string\" ? __SESSIONPIPE_VERSION__ : \"0.0.0\";\n\nexport interface Job {\n harness: string;\n event: string;\n argv: string[];\n stdin: string;\n cwd: string;\n env: Record<string, string>;\n ppid?: number;\n at: number;\n}\n\n/** A job file the worker will pick up: random suffix, 0600, in a 0700 dir. */\nexport function enqueueJob(state: string, job: Job): string {\n const jobs = jobsDir(state);\n mkdirSync(jobs, { recursive: true, mode: 0o700 });\n const f = path.join(jobs, `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.json`);\n writeFileSync(f, JSON.stringify(job), { mode: 0o600 });\n return f;\n}\n\n/** Jobs another worker left behind (a lost lock race, a killed worker): every\n * worker sweeps the ones older than `olderThanMs` before it exits, so no event\n * is lost (ground rule 4). Each is removed before it runs, so two sweepers\n * never run one twice. */\nexport async function sweepJobs(state: string, olderThanMs = 3000, limit = 20): Promise<number> {\n const jobs = jobsDir(state);\n let names: string[] = [];\n try {\n names = readdirSync(jobs).filter((n) => n.endsWith(\".json\"));\n } catch {\n return 0;\n }\n let ran = 0;\n for (const n of names.sort().slice(0, limit)) {\n const f = path.join(jobs, n);\n let job: Job | null = null;\n try {\n if (Date.now() - statSync(f).mtimeMs < olderThanMs) continue;\n job = JSON.parse(readFileSync(f, \"utf8\")) as Job;\n unlinkSync(f);\n } catch {\n continue;\n }\n await runJob(job, { state }).catch(() => {});\n ran++;\n }\n return ran;\n}\n\nexport function log(state: string, line: string): void {\n try {\n mkdirSync(state, { recursive: true, mode: 0o700 });\n const f = path.join(state, \"log\");\n try {\n if (statSync(f).size > 1024 * 1024) renameSync(f, `${f}.1`);\n } catch {}\n appendFileSync(f, `${new Date().toISOString()} ${line}\\n`);\n } catch {}\n}\n\n/** <state>/facts/<harness>/<session>.json \u2014 what the machine learned about a session. */\nexport function factsState(state: string): FactsState {\n const file = (h: string, s: string) => path.join(state, \"facts\", safeId(h), `${safeId(s)}.json`);\n return {\n get(h, s) {\n try {\n return JSON.parse(readFileSync(file(h, s), \"utf8\")) as Record<string, unknown>;\n } catch {\n return {};\n }\n },\n save(h, s, patch) {\n const cur = this.get(h, s);\n const next = { ...cur, ...patch };\n if (JSON.stringify(next) === JSON.stringify(cur)) return;\n mkdirSync(path.dirname(file(h, s)), { recursive: true, mode: 0o700 });\n writeFileSync(file(h, s), JSON.stringify(next), { mode: 0o600 });\n },\n };\n}\n\nexport function buildSinks(sinks: SinkConfig[]): Sink[] {\n const out: Sink[] = [];\n for (const s of sinks) {\n if (s.paused) continue;\n const tier = Math.min(s.tier, s.max_tier ?? 3) as 0 | 1 | 2 | 3;\n if (s.url === \"stdout\") out.push(new StdoutSink(s.name, tier, !!s.pii));\n else if (s.url.startsWith(\"file:\"))\n out.push(new FileSink(s.name, s.url.slice(5).replace(/^~(?=\\/|$)/, os.homedir()), tier, !!s.pii));\n else if (/^https?:\\/\\//.test(s.url)) out.push(new HttpSink(s, tier));\n }\n return out;\n}\n\n/** Run one hook job end to end: events \u2192 outbox \u2192 sinks. Returns what happened. */\nexport async function runJob(\n job: Job,\n opts: { state?: string; now?: number } = {},\n): Promise<{ events: Event[]; delivered: Record<string, number> }> {\n const state = opts.state ?? stateDir();\n const cfg = readConfig();\n const adapter = adapterByName(job.harness);\n if (!adapter) return { events: [], delivered: {} };\n const r = adapter.fromHook({ argv: job.argv, stdin: job.stdin, env: { ...process.env, ...job.env }, cwd: job.cwd });\n if (!r || !r.session.id) return { events: [], delivered: {} };\n const outbox = new Outbox(state);\n const ref = { harness: job.harness, session: r.session.id };\n // Hooks of one session fire close together (parallel subagents, issue #9): wait\n // for the lock with a short backoff before giving the job back to the queue.\n let release = takeLock(state, ref);\n for (let wait = 50; !release && wait <= 3200; wait *= 2) {\n await new Promise((res) => setTimeout(res, wait));\n release = takeLock(state, ref);\n }\n if (!release) {\n log(state, `${job.harness} ${job.event}: session ${r.session.id} locked for 6 s, re-queued`);\n enqueueJob(state, job);\n return { events: [], delivered: {} };\n }\n try {\n const facts = factsState(state);\n const mem = facts.get(job.harness, r.session.id);\n // Heartbeat-class events read no facts (they fire every tool call); the rest refresh them.\n const heavy = !/^(PreToolUse|PostToolUse|PostToolUseFailure|BeforeTool|AfterTool|PostInvocation)$/.test(job.event);\n let learned: Partial<Session> = {};\n if (heavy) {\n const f = adapter.facts(r.session, r.transcript, r.hints ?? {}, facts);\n const { started_at: _s, last_at: _l, first_ask: _fa, harness_version, ...rest } = f;\n learned = rest;\n if (harness_version) facts.save(job.harness, r.session.id, { harness_version });\n facts.save(job.harness, r.session.id, { session: { ...(mem.session as object), ...learned } });\n }\n const known = (mem.session as Partial<Session> | undefined) ?? {};\n const cwdRaw = learned.cwd ?? r.session.cwd ?? known.cwd;\n const git = heavy ? gitFacts(cwdRaw) : {};\n const session: Session = {\n ...known,\n ...learned,\n ...git,\n ...(learned.branch ? { branch: learned.branch } : {}),\n id: r.session.id,\n seq: 0,\n machine: machineName(cfg, os.hostname()),\n ...(cwdRaw ? { cwd: tilde(cwdRaw) } : {}),\n ...(r.session.model ? { model: r.session.model } : {}),\n };\n const version = (facts.get(job.harness, r.session.id).harness_version as string | undefined) ?? undefined;\n const events: Event[] = [];\n for (const a of r.events) {\n const e = makeEvent(a, {\n harness: { name: job.harness, ...(version ? { version } : {}) },\n session: { ...session, seq: outbox.nextSeq(ref) },\n now: opts.now ?? job.at,\n });\n events.push(e);\n }\n // Tier 2: after a turn ends, the transcript's new turns become turn.transcript events.\n const wantsTranscript = cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 2);\n if (\n wantsTranscript &&\n r.transcript &&\n r.events.some((e) => e.type === \"turn.ended\" || e.type === \"session.ended\")\n ) {\n const cur = facts.get(job.harness, r.session.id);\n const fromLine = Number(cur.transcript_line) || 0;\n let turnNo = Number(cur.transcript_turns) || 0;\n const read = adapter.readTranscript(r.transcript, fromLine);\n for (const t of read.turns) {\n events.push(\n makeEvent(\n {\n type: \"turn.transcript\",\n harnessEvent: job.event,\n data: { turn: turnNo++, user: t.user, assistant: t.assistant, at: new Date(t.at).toISOString() },\n },\n {\n harness: { name: job.harness, ...(version ? { version } : {}) },\n session: { ...session, seq: outbox.nextSeq(ref) },\n now: opts.now ?? job.at,\n },\n ),\n );\n }\n if (read.turns.length)\n facts.save(job.harness, r.session.id, { transcript_line: read.line, transcript_turns: turnNo });\n }\n // At rest the outbox holds redacted strings (advisory GHSA-8f6f-c3c9-j5p6): the\n // tier-3 fields stay, with their secrets already gone; filterEvent runs the same\n // idempotent pass again per sink.\n outbox.append(\n ref,\n events.map((e) => ({ ...e, session: redactDeep(e.session), data: redactDeep(e.data) })),\n );\n log(\n state,\n `${job.harness} ${job.event}: ${events.map((e) => e.type).join(\",\") || \"nothing\"} (${r.session.id.slice(0, 8)})`,\n );\n const delivered = await flush(state, cfg.sinks, outbox, ref);\n if (Math.random() < 0.02) outbox.prune(cfg.keep_days ?? 30);\n return { events, delivered };\n } finally {\n release();\n }\n}\n\nconst BATCH = 50;\nconst MAX_PER_RUN = 500;\n\n/** Drain every sink from its cursor: this session first, then any backlog. Events\n * from many sessions are packed into one batch of up to BATCH, so a first\n * install's 400-session backfill is nine POSTs, not four hundred (the receiver's\n * write limit ended the first replay at 278 events, 2026-09-28). A cursor moves\n * only after its batch was acknowledged; a refused batch stops the sink for this\n * run and the next worker starts from the same cursors. */\nexport async function flush(\n state: string,\n sinkConfigs: SinkConfig[],\n outbox: Outbox,\n first?: { harness: string; session: string },\n): Promise<Record<string, number>> {\n const delivered: Record<string, number> = {};\n const sinks = buildSinks(sinkConfigs);\n const refs = outbox.sessions();\n if (first) {\n const k = `${first.harness}/${safeId(first.session)}`;\n refs.sort((a, b) => (`${a.harness}/${a.session}` === k ? -1 : `${b.harness}/${b.session}` === k ? 1 : 0));\n }\n for (const sink of sinks) {\n const cursors = new Cursors(state, sink.name);\n const c = cursors.read();\n let sent = 0;\n let stalled = false;\n // Pull filtered events session by session into one batch; remember where each\n // session's offset would land if the batch goes through.\n let batch: Event[] = [];\n let pending: Record<string, number> = {};\n const send = async (): Promise<boolean> => {\n if (!batch.length) {\n Object.assign(c, pending);\n pending = {};\n cursors.write(c);\n return true;\n }\n const res = await sink.send(batch);\n if (!res.ok) {\n log(state, `sink ${sink.name}: ${res.status ?? \"\"} ${res.error ?? \"\"} \u2192 ${res.action ?? \"retry\"}`);\n if (res.action === \"pause\" || res.action === \"lower-tier\") applySinkVerdict(sink.name, res);\n if (res.action !== \"drop\") {\n batch = [];\n pending = {};\n return false;\n }\n }\n sent += batch.length;\n Object.assign(c, pending);\n cursors.write(c);\n batch = [];\n pending = {};\n return true;\n };\n for (const ref of refs) {\n if (stalled || sent >= MAX_PER_RUN) break;\n let offset = pending[cursors.key(ref)] ?? c[cursors.key(ref)] ?? 0;\n for (;;) {\n const room = BATCH - batch.length;\n const { events, offset: next } = outbox.read(ref, offset, room);\n if (!events.length) break;\n for (const e of events) {\n const f = filterEvent(e, sink.tier, sink.pii, { home: os.homedir() });\n if (f) batch.push(f);\n }\n offset = next;\n pending[cursors.key(ref)] = offset;\n if (batch.length >= BATCH) {\n if (!(await send())) {\n stalled = true;\n break;\n }\n if (sent >= MAX_PER_RUN) break;\n }\n }\n }\n if (!stalled && (batch.length || Object.keys(pending).length)) if (!(await send())) stalled = true;\n delivered[sink.name] = sent;\n }\n return delivered;\n}\n\nfunction applySinkVerdict(name: string, res: { action?: string; max_tier?: number; error?: string }): void {\n try {\n const cfg = readConfig();\n const s = cfg.sinks.find((x) => x.name === name);\n if (!s) return;\n if (res.action === \"pause\") s.paused = `${new Date().toISOString()} ${res.error ?? \"unauthorized\"}`;\n if (res.action === \"lower-tier\" && typeof res.max_tier === \"number\") s.max_tier = res.max_tier as 0 | 1 | 2 | 3;\n writeConfig(cfg);\n } catch {}\n}\n\nexport { VERSION };\nexport const versionLine = (): string => `sessionpipe ${VERSION}`;\nexport const jobsDir = (state: string): string => path.join(state, \"jobs\");\nexport const hasJobs = (state: string): boolean => existsSync(jobsDir(state));\n", "// SPDX-License-Identifier: Apache-2.0\n// The HTTP sink (spec/HTTP.md \u00A72): POST {events} with the protocol header, a bearer\n// token and optional Standard Webhooks signature; errors map to what the sender\n// does next. The cursor moves only on 202. Retry/backoff is the worker's cadence\n// (each hook run drains the backlog); this class reports, it does not sleep.\nimport { createHmac, randomUUID } from \"node:crypto\";\nimport type { DeliveryResult, Event, Sink, SinkConfig, Tier } from \"@sessionpipe/core\";\n\nconst TIMEOUT_MS = 15_000;\n\nexport class HttpSink implements Sink {\n readonly name: string;\n readonly pii: boolean;\n private readonly url: string;\n constructor(\n private readonly cfg: SinkConfig,\n readonly tier: Tier,\n ) {\n this.name = cfg.name;\n this.pii = !!cfg.pii;\n this.url = cfg.url.replace(/\\/$/, \"\");\n }\n\n private eventsUrl(): string {\n // The endpoint from the well-known file is stored beside the url at `sink add`;\n // until then the spec's default path.\n const ep = (this.cfg as { endpoints?: { events?: string } }).endpoints?.events ?? \"/api/sessionpipe/v1/events\";\n return /^https?:\\/\\//.test(ep) ? ep : this.url + ep;\n }\n\n async send(events: Event[]): Promise<DeliveryResult> {\n const body = JSON.stringify({ events });\n const headers: Record<string, string> = { \"content-type\": \"application/json\", \"sessionpipe-protocol\": \"1\" };\n if (this.cfg.token) headers.authorization = `Bearer ${this.cfg.token}`;\n if (this.cfg.secret?.startsWith(\"whsec_\")) {\n const id = `msg_${randomUUID()}`;\n const ts = Math.floor(Date.now() / 1000);\n const key = Buffer.from(this.cfg.secret.slice(6), \"base64\");\n const sig = createHmac(\"sha256\", key).update(`${id}.${ts}.${body}`).digest(\"base64\");\n headers[\"webhook-id\"] = id;\n headers[\"webhook-timestamp\"] = String(ts);\n headers[\"webhook-signature\"] = `v1,${sig}`;\n }\n const ctl = new AbortController();\n const t = setTimeout(() => ctl.abort(), TIMEOUT_MS);\n try {\n const r = await fetch(this.eventsUrl(), { method: \"POST\", headers, body, signal: ctl.signal });\n const text = await r.text();\n let j: Record<string, unknown> = {};\n try {\n j = text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {}\n if (r.status === 202 || r.status === 200) {\n return {\n ok: true,\n acknowledged: events.length,\n accepted: Number(j.accepted ?? events.length),\n duplicates: Number(j.duplicates ?? 0),\n rejected: Array.isArray(j.rejected) ? (j.rejected as { id: string; reason: string }[]) : [],\n ...(typeof j.max_tier === \"number\" ? { max_tier: j.max_tier as Tier } : {}),\n status: r.status,\n };\n }\n const err = typeof j.reason === \"string\" ? j.reason : text.slice(0, 200);\n if (r.status === 400) return { ok: false, acknowledged: 0, status: 400, error: err, action: \"drop\" };\n if (r.status === 401) return { ok: false, acknowledged: 0, status: 401, error: err, action: \"pause\" };\n if (r.status === 403)\n return {\n ok: false,\n acknowledged: 0,\n status: 403,\n error: err,\n action: \"lower-tier\",\n ...(typeof j.max_tier === \"number\" ? { max_tier: j.max_tier as Tier } : {}),\n };\n if (r.status === 413) return { ok: false, acknowledged: 0, status: 413, error: err, action: \"split\" };\n if (r.status === 429)\n return {\n ok: false,\n acknowledged: 0,\n status: 429,\n error: err,\n action: \"retry\",\n retryAfterMs: Number(r.headers.get(\"retry-after\") ?? 60) * 1000,\n };\n return { ok: false, acknowledged: 0, status: r.status, error: err, action: \"retry\" };\n } catch (e) {\n return { ok: false, acknowledged: 0, error: String((e as Error).message ?? e), action: \"retry\" };\n } finally {\n clearTimeout(t);\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["execFileSync", "readdirSync", "readFileSync", "realpathSync", "statSync", "unlinkSync", "os", "path", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "statSync", "unlinkSync", "writeFileSync", "path", "path", "tail", "cap", "out", "path", "cmd", "settings", "entry", "path", "path", "cmd", "out", "existsSync", "mkdirSync", "writeFileSync", "unlinkSync", "readFileSync", "state", "readdirSync", "statSync", "tail", "execFileSync", "existsSync", "readdirSync", "readFileSync", "statSync", "path", "args", "out", "NAME", "out", "path", "readdirSync", "existsSync", "validTool", "cmd", "prune", "readFileSync", "state", "has", "pid", "execFileSync", "statSync", "tail", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "writeFileSync", "path", "OURS", "tail", "NAME", "OPTS", "eventsFor", "path", "hooksFile", "configFile", "validTool", "endReason", "cmd", "readFileSync", "mkdirSync", "writeFileSync", "OURS", "readdirSync", "existsSync", "out", "id", "r", "prune", "tail", "execFileSync", "existsSync", "readFileSync", "path", "NAME", "OPTS", "path", "validTool", "eventsFor", "readFileSync", "execFileSync", "existsSync", "cmd", "state", "prune", "out", "tail", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "readFileSync", "mkdirSync", "path", "writeFileSync", "existsSync", "out", "closeSync", "existsSync", "mkdirSync", "openSync", "readdirSync", "readFileSync", "readSync", "statSync", "unlinkSync", "writeFileSync", "path", "path", "readFileSync", "mkdirSync", "writeFileSync", "existsSync", "out", "readdirSync", "statSync", "openSync", "readSync", "closeSync", "unlinkSync", "sink", "createHash", "out", "out", "out", "out", "appendFileSync", "mkdirSync", "path", "appendFileSync", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "renameSync", "statSync", "unlinkSync", "writeFileSync", "os", "path", "state", "mkdirSync", "path", "writeFileSync", "state", "mkdirSync", "path", "statSync", "renameSync", "appendFileSync", "readFileSync", "writeFileSync", "out", "os", "sink", "state", "path", "path", "realpathSync", "execFileSync", "os", "statSync", "readdirSync", "readFileSync", "w", "unlinkSync", "r"]
3
+ "sources": ["../src/cli.ts", "../../core/src/adapters/antigravity.ts", "../../core/src/paths.ts", "../../core/src/readers/files.ts", "../../core/src/readers/transcripts.ts", "../../core/src/adapters/claude-shaped.ts", "../../core/src/adapters/claude-code.ts", "../../core/src/readers/git.ts", "../../core/src/adapters/codex.ts", "../../core/src/adapters/codex-config.ts", "../../core/src/adapters/gemini-cli.ts", "../../core/src/adapters/claude-code-control.ts", "../../core/src/adapters/index.ts", "../../core/src/config.ts", "../../core/src/ulid.ts", "../../core/src/events.ts", "../../core/src/outbox.ts", "../../core/src/privacy/pii.ts", "../../core/src/privacy/secrets.ts", "../../core/src/privacy/filter.ts", "../../core/src/sinks/file.ts", "../../core/src/sinks/stdout.ts", "../src/control/cli.ts", "../src/control/daemon.ts", "../../core/src/control/verify.ts", "../src/control/reply.ts", "../src/control/route.ts", "../src/control/store.ts", "../src/control/local.ts", "../src/control/pair.ts", "../src/control/sdk.ts", "../src/control/wait.ts", "../src/run.ts", "../src/http-sink.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n// SPDX-License-Identifier: Apache-2.0\n// sessionpipe: install once, hook everything, choose per sink what leaves.\n// install \u00B7 uninstall \u00B7 sink add|list|remove|test \u00B7 status \u00B7 doctor \u00B7 tail \u00B7\n// backfill \u00B7 forget \u00B7 replay \u00B7 update \u00B7 hook \u00B7 worker\nimport { execFileSync, spawn, spawnSync } from \"node:child_process\";\nimport { mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ADAPTERS,\n adapterByName,\n type Config,\n Cursors,\n configFile,\n type Event,\n filterEvent,\n type HookCommand,\n machineName,\n makeEvent,\n Outbox,\n readConfig,\n type SinkConfig,\n stateDir,\n type Tier,\n tilde,\n writeConfig,\n} from \"@sessionpipe/core\";\nimport { CONTROL_HELP, controlMain, waitMain } from \"./control/cli.js\";\nimport { buildSinks, factsState, flush, jobsDir, runJob, VERSION } from \"./run.js\";\n\nprocess.stdout.on(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EPIPE\") process.exit(0);\n});\nconst args = process.argv.slice(2);\nconst cmd = args[0] ?? \"help\";\nconst flag = (name: string): string | undefined => {\n const i = args.indexOf(name);\n return i >= 0 ? args[i + 1] : undefined;\n};\nconst has = (name: string): boolean => args.includes(name);\nconst out = (s = \"\"): void => {\n process.stdout.write(`${s}\\n`);\n};\nconst state = stateDir();\nconst distDir = path.dirname(fileURLToPath(import.meta.url));\n\n/** The command a hook entry runs: this node by a stable absolute path, hook.js by its real path. */\nfunction hookCommand(): HookCommand {\n const node = stableNode(process.execPath);\n let script = path.join(distDir, \"hook.js\");\n try {\n script = realpathSync(script);\n } catch {}\n return (a) => ({\n argv: [node, script, ...a],\n command: `${JSON.stringify(node)} ${JSON.stringify(script)} ${a.join(\" \")}`,\n });\n}\n/** Homebrew's versioned Cellar path dies on `brew upgrade node`; its stable links survive. */\nfunction stableNode(exe: string): string {\n const m = /^(.*)\\/Cellar\\/(node(?:@\\d+)?)\\/[^/]+\\/bin\\/node$/.exec(exe);\n if (!m) return exe;\n let real: string;\n try {\n real = realpathSync(exe);\n } catch {\n return exe;\n }\n for (const c of [`${m[1]}/opt/${m[2]}/bin/node`, `${m[1]}/bin/node`]) {\n try {\n if (realpathSync(c) === real) return c;\n } catch {}\n }\n return exe;\n}\nconst viaNpx = /[\\\\/]_npx[\\\\/]/.test(distDir) || /[\\\\/]\\.npm[\\\\/]/.test(distDir);\n\nfunction selectedAdapters(): typeof ADAPTERS {\n const named = ADAPTERS.filter((a) => has(`--${a.name}`));\n if (named.length) return named;\n return ADAPTERS.filter((a) => a.detect());\n}\n\nasync function main(): Promise<void> {\n switch (cmd) {\n case \"install\":\n return install();\n case \"uninstall\":\n return uninstall();\n case \"sink\":\n return sink();\n case \"status\":\n return status();\n case \"doctor\":\n return doctor();\n case \"tail\":\n return tail();\n case \"backfill\":\n return backfill();\n case \"forget\":\n return forget();\n case \"replay\":\n return replay();\n case \"update\":\n return update();\n case \"worker\":\n return workerFromArgv();\n case \"control\":\n return controlMain(args, out, distDir);\n case \"wait\":\n return waitMain(args, out);\n case \"hook\":\n out(\"sessionpipe hook is dist/hook.js; harnesses run it directly\");\n return;\n case \"--version\":\n case \"-v\":\n case \"version\":\n out(VERSION);\n return;\n default:\n return help();\n }\n}\n\nfunction help(): void {\n out(`sessionpipe ${VERSION} \u2014 an open protocol for what your coding agents are doing\n\n sessionpipe install [--claude-code --codex --gemini-cli --antigravity] [--machine NAME] [--backfill DAYS] [--sink URL --tier N]\n sessionpipe uninstall [--keep-state]\n sessionpipe sink add <url|file:PATH|stdout> [--tier 0-3] [--token T] [--pii] [--name N]\n sessionpipe sink list | remove <name> | test <name>\n sessionpipe status | doctor [--json]\n sessionpipe tail [--session ID] [--tier N] [--harness NAME]\n sessionpipe backfill [--days 30] | forget <harness> <session> | replay --sink NAME\n sessionpipe update\n${CONTROL_HELP}\n\nDocs: https://sessionpipe.org \u00B7 nothing leaves this machine until you add a sink.`);\n}\n\nasync function install(): Promise<void> {\n if (viaNpx) {\n out(` Installing sessionpipe@${VERSION} globally, so the hooks start in milliseconds\u2026`);\n try {\n // Homebrew's default prefix is the versioned Cellar folder that `brew upgrade\n // node` deletes, and its bin is not on PATH (issue #13): install into ~/.local\n // there, and run the copy from the prefix we installed into.\n let prefix = \"\";\n try {\n prefix = execFileSync(\"npm\", [\"prefix\", \"-g\"], {\n encoding: \"utf8\",\n timeout: 15000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {}\n const target = /\\/Cellar\\/node(?:@\\d+)?\\/[^/]+/.test(prefix) ? path.join(os.homedir(), \".local\") : prefix;\n execFileSync(\"npm\", [\"install\", \"-g\", `sessionpipe@${VERSION}`, ...(target ? [\"--prefix\", target] : [])], {\n stdio: [\"ignore\", \"ignore\", \"inherit\"],\n });\n const bin =\n process.platform === \"win32\"\n ? path.join(target, \"sessionpipe.cmd\")\n : target\n ? path.join(target, \"bin\", \"sessionpipe\")\n : \"sessionpipe\";\n if (target && target !== prefix)\n out(` Installed into ${target}; make sure ${path.join(target, \"bin\")} is on your PATH.`);\n execFileSync(bin, args, { stdio: \"inherit\", shell: process.platform === \"win32\" });\n return;\n } catch {\n out(\n \" ! couldn't install globally (`npm install -g sessionpipe` failed). Run it yourself, then `sessionpipe install`.\",\n );\n process.exit(1);\n }\n }\n const cfg = readConfig();\n const machine = flag(\"--machine\");\n if (machine) cfg.machine = machine.slice(0, 80);\n // A sink URL given here is added first, so the install knows whether it needs\n // every tool event or only the heartbeat's one.\n const sinkUrl = flag(\"--sink\");\n if (sinkUrl) await sinkAdd(sinkUrl, cfg);\n const adapters = selectedAdapters();\n if (!adapters.length) {\n out(\n \" No supported harness found on this machine (Claude Code, Codex, Gemini CLI, Antigravity). Pass --<harness> to force one.\",\n );\n return;\n }\n out(` Machine: ${machineName(cfg, os.hostname())}`);\n const lean = isLean(cfg);\n if (lean)\n out(\n \" No sink above tier 0: hooking one tool event per harness (the heartbeat's). `sink add \u2026 --tier 1` or higher hooks the rest.\",\n );\n installHarnesses(adapters, cfg, lean);\n writeConfig(cfg);\n const days = Number(flag(\"--backfill\") ?? 30);\n if (days > 0) backfillRows(adapters, days, cfg);\n out(\"\");\n const live = cfg.sinks.filter((s) => !s.paused);\n if (live.length) out(` Reporting to ${live.map((s) => `${s.name} (tier ${s.tier})`).join(\", \")}.`);\n else\n out(\n \" Nothing leaves this machine yet: events go to the local outbox. `sessionpipe tail` shows them; `sessionpipe sink add <url> --tier N` sends them.\",\n );\n out(\" Sessions already running pick up hooks on their next start (Claude Code \u2265 2.1.280 picks them up live).\");\n}\n\n/** No sink takes tier \u2265 1: the harness only needs one tool event (issue #12). */\nfunction isLean(cfg: Config): boolean {\n return !cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 1);\n}\n\n/** Write the hooks for these harnesses; remember which files sessionpipe created. */\nfunction installHarnesses(adapters: readonly (typeof ADAPTERS)[number][], cfg: Config, lean: boolean): void {\n const hc = hookCommand();\n for (const a of adapters) {\n const prev = cfg.harnesses[a.name] ?? {};\n const created = new Set(prev.created ?? []);\n const reports = a.install(hc, process.env, { lean, created: [...created] });\n for (const r of reports) {\n if (r.created) created.add(r.file);\n const mark = r.skipped ? \"!\" : r.changed ? \"\u2713\" : \"=\";\n out(\n ` ${mark} ${a.name}: ${tilde(r.file)}${r.note ? ` \u2014 ${r.note}` : r.changed ? \" written\" : \" already current\"}`,\n );\n }\n cfg.harnesses[a.name] = { enabled: true, ...(created.size ? { created: [...created] } : {}) };\n if (a.name === \"gemini-cli\")\n out(\" note: Gemini CLI's own telemetry defaults logPrompts on; that is Google's setting, not sessionpipe's.\");\n if (a.name === \"codex\" && !reports.some((r) => r.skipped))\n out(\n \" note: Codex runs non-managed hooks only after you approve them: start `codex` and accept the hook review. The notify fallback reports turn ends meanwhile.\",\n );\n }\n}\n\nfunction uninstall(): void {\n const cfg = readConfig();\n for (const a of ADAPTERS) {\n const created = cfg.harnesses[a.name]?.created ?? [];\n for (const r of a.uninstall(process.env, { created }))\n if (r.changed) out(` \u2713 ${a.name}: ${r.note ?? `hooks removed from ${tilde(r.file)}`}`);\n else if (r.skipped) out(` ! ${a.name}: ${tilde(r.file)} \u2014 ${r.note}`);\n delete cfg.harnesses[a.name];\n }\n writeConfig(cfg);\n if (!has(\"--keep-state\"))\n out(\n ` Outbox and state kept under ${tilde(state)} (delete it yourself, or pass nothing: it prunes after ${readConfig().keep_days ?? 30} days).`,\n );\n out(\" Done. Every config file is byte-identical except for the entries sessionpipe wrote.\");\n}\n\nasync function sink(): Promise<void> {\n const sub = args[1];\n const cfg = readConfig();\n if (sub === \"add\" && args[2]) return sinkAdd(args[2], cfg);\n if (sub === \"list\") {\n if (!cfg.sinks.length) out(\" no sinks\");\n for (const s of cfg.sinks)\n out(\n ` ${s.name.padEnd(16)} ${s.url.padEnd(44)} tier ${s.tier}${s.max_tier !== undefined && s.max_tier < s.tier ? ` (capped ${s.max_tier})` : \"\"}${s.pii ? \" pii\" : \"\"}${s.control ? \" control\" : \"\"}${s.paused ? ` PAUSED ${s.paused}` : \"\"}`,\n );\n return;\n }\n if (sub === \"remove\" && args[2]) {\n const n = cfg.sinks.length;\n cfg.sinks = cfg.sinks.filter((s) => s.name !== args[2]);\n writeConfig(cfg);\n out(cfg.sinks.length < n ? ` \u2713 removed ${args[2]}` : ` no sink named ${args[2]}`);\n return;\n }\n if (sub === \"test\" && args[2]) {\n const s = cfg.sinks.find((x) => x.name === args[2]);\n if (!s) return out(` no sink named ${args[2]}`);\n const [sk] = buildSinks([s]);\n if (!sk) return out(\" sink type not supported yet\");\n // One heartbeat, then its forget: the receiver sees the round trip and keeps no row.\n const session = { id: `test-${Date.now()}`, machine: machineName(cfg, os.hostname()) };\n const mk = (type: string, seq: number) =>\n makeEvent(\n { type, harnessEvent: \"test\", data: {} },\n { harness: { name: \"sessionpipe\" }, session: { ...session, seq } },\n );\n const r = await sk.send([\n filterEvent(mk(\"session.heartbeat\", 0), sk.tier, sk.pii) as Event,\n filterEvent(mk(\"session.forgotten\", 1), sk.tier, sk.pii) as Event,\n ]);\n out(\n r.ok\n ? ` \u2713 ${s.name}: ${r.status ?? \"ok\"} accepted ${r.accepted ?? 2} (a heartbeat and its forget)`\n : ` \u2717 ${s.name}: ${r.status ?? \"\"} ${r.error ?? \"\"} (${r.action})`,\n );\n return;\n }\n out(\n \"usage: sessionpipe sink add <url|file:PATH|stdout> [--tier N] [--token T] [--pii] [--name N] | list | remove <name> | test <name>\",\n );\n}\n\nasync function sinkAdd(url: string, cfg: Config): Promise<void> {\n const tier = Math.max(0, Math.min(3, Number(flag(\"--tier\") ?? 0))) as Tier;\n const name = flag(\"--name\") ?? (url === \"stdout\" ? \"stdout\" : url.startsWith(\"file:\") ? \"file\" : new URL(url).host);\n // Control is not a property of a sink: it is set up per machine, with keys enrolled\n // at this terminal (spec/CONTROL.md \u00A72, `sessionpipe control pair`). A sink never\n // carries `control: true`.\n if (has(\"--control\"))\n out(\" --control is ignored: control is set up per machine (`sessionpipe control pair <url>`, spec/CONTROL.md)\");\n const s: SinkConfig = { name, url, tier, pii: has(\"--pii\") };\n const token = flag(\"--token\");\n if (token) s.token = token;\n const secret = flag(\"--secret\");\n if (secret) s.secret = secret;\n if (/^https?:\\/\\//.test(url)) {\n try {\n const r = await fetch(`${url.replace(/\\/$/, \"\")}/.well-known/sessionpipe`, { signal: AbortSignal.timeout(8000) });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n const wk = (await r.json()) as { max_tier?: number; endpoints?: { events?: string }; capabilities?: string[] };\n if (typeof wk.max_tier === \"number\") {\n s.max_tier = wk.max_tier as Tier;\n if (wk.max_tier < tier)\n out(` receiver's max_tier is ${wk.max_tier}: sending tier ${wk.max_tier}, not ${tier}`);\n }\n if (wk.endpoints) (s as SinkConfig & { endpoints?: unknown }).endpoints = wk.endpoints;\n s.well_known_at = new Date().toISOString();\n } catch (e) {\n out(\n ` ! ${url} has no readable /.well-known/sessionpipe (${(e as Error).message}); added anyway, at tier ${tier}`,\n );\n }\n }\n cfg.sinks = cfg.sinks.filter((x) => x.name !== name).concat([s]);\n writeConfig(cfg);\n out(` \u2713 sink ${name}: ${url} at tier ${Math.min(tier, s.max_tier ?? 3)}${s.pii ? \", pii\" : \"\"}`);\n out(` tier ${tier} sends: ${TIER_TEXT[Math.min(tier, s.max_tier ?? 3) as Tier]}`);\n}\nconst TIER_TEXT: Record<Tier, string> = {\n 0: \"session state and timing, machine, folder, repo, branch, model, title, link, the KIND of attention needed \u2014 no tool names, no words\",\n 1: \"tier 0 + tool names, durations, ok/error, file paths, the attention message, subagents, compactions \u2014 no prompts\",\n 2: \"tier 1 + your prompts and the assistant's text, secrets removed\",\n 3: \"everything, including tool input and output\",\n};\n\nfunction backfillRows(adapters: readonly (typeof ADAPTERS)[number][], days: number, cfg: Config): void {\n const since = Date.now() - days * 86_400_000;\n const outbox = new Outbox(state);\n let n = 0;\n const machine = machineName(cfg, os.hostname());\n for (const a of adapters) {\n for (const row of a.backfill(since)) {\n const ref = { harness: a.name, session: row.session.id };\n const facts = factsState(state).get(a.name, row.session.id);\n if (facts.backfilled) continue;\n const { id, ...rest } = row.session;\n const e = makeEvent(\n {\n type: \"session.backfill\",\n harnessEvent: \"backfill\",\n data: {\n started_at: new Date(row.started_at).toISOString(),\n last_at: new Date(row.last_at).toISOString(),\n ...(row.turns !== undefined ? { turns: row.turns } : {}),\n },\n },\n {\n harness: { name: a.name },\n session: { ...rest, id, seq: outbox.nextSeq(ref), machine, ...(rest.cwd ? { cwd: tilde(rest.cwd) } : {}) },\n now: row.last_at,\n },\n );\n outbox.append(ref, [e]);\n factsState(state).save(a.name, row.session.id, { backfilled: true });\n n++;\n }\n }\n out(` \u2713 Backfill: ${n} session${n === 1 ? \"\" : \"s\"} from the last ${days} days queued as session.backfill`);\n void flush(state, cfg.sinks, outbox);\n}\n\nfunction backfill(): void {\n backfillRows(selectedAdapters(), Number(flag(\"--days\") ?? 30), readConfig());\n}\n\nasync function forget(): Promise<void> {\n const [, harness, session] = args;\n if (!harness || !session) return out(\"usage: sessionpipe forget <harness> <session>\");\n const cfg = readConfig();\n const outbox = new Outbox(state);\n const ref = { harness, session };\n const e = makeEvent(\n { type: \"session.forgotten\", harnessEvent: \"forget\", data: {} },\n {\n harness: { name: harness },\n session: { id: session, seq: outbox.nextSeq(ref), machine: machineName(cfg, os.hostname()) },\n },\n );\n const sinks = buildSinks(cfg.sinks);\n for (const s of sinks) {\n const r = await s.send([filterEvent(e, s.tier, s.pii) as Event]);\n out(r.ok ? ` \u2713 ${s.name}: asked to delete ${harness}:${session}` : ` \u2717 ${s.name}: ${r.error ?? r.status}`);\n }\n outbox.delete(ref);\n out(\" local outbox for the session removed\");\n}\n\nasync function replay(): Promise<void> {\n const name = flag(\"--sink\");\n const cfg = readConfig();\n const sinks = name ? cfg.sinks.filter((s) => s.name === name) : cfg.sinks;\n if (!sinks.length) return out(\" no such sink\");\n for (const s of sinks) {\n if (has(\"--from-start\")) new Cursors(state, s.name).write({});\n }\n const d = await flush(state, sinks, new Outbox(state));\n for (const [k, v] of Object.entries(d)) out(` ${k}: ${v} event${v === 1 ? \"\" : \"s\"} delivered`);\n}\n\nfunction status(): void {\n const cfg = readConfig();\n const hc = hookCommand();\n out(` machine: ${machineName(cfg, os.hostname())} sessionpipe ${VERSION} state ${tilde(state)}`);\n for (const a of ADAPTERS) {\n if (!a.detect() && !cfg.harnesses[a.name]) continue;\n for (const r of a.installed(hc, process.env, { lean: isLean(cfg) }))\n out(\n ` ${a.name.padEnd(12)} ${tilde(r.file).padEnd(44)} ${r.state}${r.state !== \"current\" && r.note ? ` \u2014 ${r.note}` : \"\"}`,\n );\n }\n if (!cfg.sinks.length) out(\" sinks: none (events stay in the local outbox)\");\n for (const s of cfg.sinks) {\n const c = new Cursors(state, s.name).read();\n const outbox = new Outbox(state);\n let pending = 0;\n for (const ref of outbox.sessions()) {\n const f = outbox.file(ref);\n try {\n pending += Math.max(0, statSync(f).size - (c[`${ref.harness}/${ref.session}`] ?? 0)) > 0 ? 1 : 0;\n } catch {}\n }\n out(\n ` sink ${s.name.padEnd(16)} tier ${Math.min(s.tier, s.max_tier ?? 3)} ${s.paused ? `PAUSED ${s.paused}` : pending ? `${pending} session file(s) with undelivered events` : \"up to date\"}`,\n );\n }\n const t = timing();\n if (t)\n out(\n ` hook: in-process p50 ${t.p50} ms over ${t.n} runs (\\`sessionpipe doctor\\` measures the wall clock the harness waits)`,\n );\n const jobs = jobsDir(state);\n try {\n const n = readdirSync(jobs).length;\n if (n) out(` jobs: ${n} waiting`);\n } catch {}\n}\n\n/** Spawn the hook the way a harness does and time the whole process (issue #12:\n * the in-process clock misses Node's startup, ~200 ms on an older Intel Mac). */\nfunction hookWall(runs = 8): { n: number; p50: number; p95: number } | null {\n const hook = path.join(distDir, \"hook.js\");\n const tmp = mkdtempSync(path.join(os.tmpdir(), \"sessionpipe-doctor-\"));\n const env = {\n ...process.env,\n SESSIONPIPE_STATE: tmp,\n SESSIONPIPE_CONFIG: path.join(tmp, \"config.json\"),\n SESSIONPIPE_NO_WORKER: \"1\",\n };\n const input = JSON.stringify({\n session_id: \"doctor\",\n hook_event_name: \"PostToolUse\",\n tool_name: \"Bash\",\n cwd: process.cwd(),\n });\n const times: number[] = [];\n try {\n for (let i = 0; i < runs; i++) {\n const t0 = process.hrtime.bigint();\n const r = spawnSync(process.execPath, [hook, \"claude-code\", \"PostToolUse\"], { input, env, encoding: \"utf8\" });\n if (r.status !== 0) return null;\n times.push(Number(process.hrtime.bigint() - t0) / 1e6);\n }\n } catch {\n return null;\n } finally {\n rmSync(tmp, { recursive: true, force: true });\n }\n times.sort((a, b) => a - b);\n const q = (p: number) => Math.round(times[Math.min(times.length - 1, Math.floor(p * times.length))] ?? 0);\n return { n: times.length, p50: q(0.5), p95: q(0.95) };\n}\n\nfunction timing(): { n: number; p50: number; p95: number } | null {\n try {\n const lines = readFileSync(path.join(state, \"timing.jsonl\"), \"utf8\").trim().split(\"\\n\").slice(-100);\n const ms = lines\n .map((l) => (JSON.parse(l) as { ms: number }).ms)\n .filter((x) => x >= 0)\n .sort((a, b) => a - b);\n if (!ms.length) return null;\n const q = (p: number) => Math.round(ms[Math.min(ms.length - 1, Math.floor(p * ms.length))] ?? 0);\n return { n: ms.length, p50: q(0.5), p95: q(0.95) };\n } catch {\n return null;\n }\n}\n\nfunction doctor(): void {\n const cfg = readConfig();\n const hc = hookCommand();\n const report: Record<string, unknown> = {\n version: VERSION,\n node: process.version,\n node_path: stableNode(process.execPath),\n machine: machineName(cfg, os.hostname()),\n state: state,\n config: configFile(),\n harnesses: {},\n sinks: [],\n timing: timing(),\n hook_wall_ms: hookWall(),\n warnings: [] as string[],\n };\n const warnings = report.warnings as string[];\n if (/\\/Cellar\\/node(?:@\\d+)?\\/[^/]+\\//.test(distDir))\n warnings.push(\n \"sessionpipe is installed inside Homebrew's versioned node folder; `brew upgrade node` will delete it. Install with `npm install -g --prefix ~/.local sessionpipe`.\",\n );\n for (const a of ADAPTERS) {\n if (!a.detect()) continue;\n const st = a.installed(hc, process.env, { lean: isLean(cfg) });\n (report.harnesses as Record<string, unknown>)[a.name] = st.map((r) => ({\n file: tilde(r.file),\n state: r.state,\n ...(r.note ? { note: r.note } : {}),\n }));\n for (const r of st)\n if (r.state === \"inactive\")\n warnings.push(`${a.name}: hooks are written but the harness will not run them \u2014 ${r.note ?? \"\"}`);\n for (const r of st)\n if (r.state === \"stale\")\n warnings.push(\n `${a.name}: the hook in ${tilde(r.file)} points at an old node or script path; run \\`sessionpipe install\\` again.`,\n );\n for (const r of st)\n if (r.state === \"misplaced\")\n warnings.push(\n `${a.name}: the notify line in ${tilde(r.file)} sits inside a [table], where Codex never reads it; run \\`sessionpipe install\\` again.`,\n );\n }\n for (const s of cfg.sinks)\n (report.sinks as unknown[]).push({\n name: s.name,\n url: s.url,\n tier: s.tier,\n max_tier: s.max_tier ?? null,\n pii: !!s.pii,\n control: !!s.control,\n paused: s.paused ?? null,\n token: s.token ? `${s.token.slice(0, 4)}\u2026` : null,\n });\n const w = report.hook_wall_ms as { p50: number; p95: number; n: number } | null;\n if (w && w.p50 > 150)\n warnings.push(\n `the harness waits ${w.p50} ms per hook (p50, target < 150): that is Node's own startup on this machine. A lean install (no sink above tier 0) hooks fewer events.`,\n );\n if (has(\"--json\")) {\n out(JSON.stringify(report, null, 2));\n return;\n }\n out(` sessionpipe ${VERSION} \u00B7 node ${process.version} at ${report.node_path}`);\n out(` config ${tilde(configFile())} \u00B7 state ${tilde(state)}`);\n for (const [h, st] of Object.entries(report.harnesses as Record<string, { file: string; state: string }[]>))\n for (const r of st) out(` ${h.padEnd(12)} ${r.file.padEnd(44)} ${r.state}`);\n for (const s of report.sinks as { name: string; tier: number; max_tier: number | null; paused: string | null }[])\n out(\n ` sink ${s.name.padEnd(16)} tier ${s.tier}${s.max_tier !== null ? ` (receiver max ${s.max_tier})` : \"\"}${s.paused ? ` PAUSED ${s.paused}` : \"\"}`,\n );\n const t = report.timing as { p50: number; p95: number; n: number } | null;\n out(\n w\n ? ` hook wall clock (what the harness waits): p50 ${w.p50} ms \u00B7 p95 ${w.p95} ms over ${w.n} spawns`\n : \" hook wall clock: could not spawn dist/hook.js\",\n );\n out(\n t\n ? ` hook in-process: p50 ${t.p50} ms \u00B7 p95 ${t.p95} ms over the last ${t.n} runs`\n : \" hook in-process: no runs yet\",\n );\n for (const w of warnings) out(` ! ${w}`);\n if (!warnings.length) out(\" no warnings\");\n}\n\n/** Follow the local outbox: one event per line, filtered to a tier. The zero-server demo. */\nasync function tail(): Promise<void> {\n const tier = Math.max(0, Math.min(3, Number(flag(\"--tier\") ?? 1))) as Tier;\n const onlySession = flag(\"--session\");\n const onlyHarness = flag(\"--harness\");\n const outbox = new Outbox(state);\n const offsets = new Map<string, number>();\n const fmt = (e: Event): string => {\n const t = e.time.slice(11, 19);\n const d = e.data as Record<string, unknown>;\n let detail = \"\";\n switch (e.type) {\n case \"session.started\":\n detail = `source=${d.source} ${e.session.cwd ?? \"\"} ${e.session.branch ?? \"\"}`;\n break;\n case \"turn.started\":\n detail = d.prompt_chars !== undefined ? `prompt_chars=${d.prompt_chars}` : \"\";\n break;\n case \"tool.started\":\n detail = String(d.tool ?? \"\");\n break;\n case \"tool.ended\":\n detail = `${d.tool} ${d.ok ? \"ok\" : \"error\"}${d.ms !== undefined ? ` ${d.ms}ms` : \"\"}`;\n break;\n case \"attention.needed\":\n detail = `${d.kind}${d.tool ? ` ${d.tool}` : \"\"}${d.message ? ` \"${String(d.message).slice(0, 60)}\"` : \"\"}`;\n break;\n case \"turn.ended\":\n detail = String(d.reason ?? \"\");\n break;\n case \"session.ended\":\n detail = `reason=${d.reason}`;\n break;\n case \"turn.transcript\":\n detail = `#${d.turn} \"${String(d.user).slice(0, 50).replace(/\\s+/g, \" \")}\"`;\n break;\n case \"session.backfill\":\n detail = `${e.session.title ?? \"\"}`;\n break;\n default:\n detail = JSON.stringify(d).slice(0, 80);\n }\n return `${t} ${e.harness.name.padEnd(11)} ${e.session.id.slice(0, 4)}\u2026 ${e.type.padEnd(17)} ${detail}`;\n };\n out(`sessionpipe tail \u00B7 tier ${tier} \u00B7 ${tilde(state)}/outbox (Ctrl-C to stop)`);\n // Start at the end of each file unless --all.\n for (const ref of outbox.sessions()) {\n try {\n offsets.set(`${ref.harness}/${ref.session}`, has(\"--all\") ? 0 : statSync(outbox.file(ref)).size);\n } catch {}\n }\n for (;;) {\n for (const ref of outbox.sessions()) {\n if (onlyHarness && ref.harness !== onlyHarness) continue;\n if (onlySession && !ref.session.startsWith(onlySession)) continue;\n const k = `${ref.harness}/${ref.session}`;\n const from = offsets.get(k) ?? 0;\n const { events, offset } = outbox.read(ref, from, 200);\n offsets.set(k, offset);\n for (const e of events) {\n const f = filterEvent(e, tier, false);\n if (f) out(has(\"--json\") ? JSON.stringify(f) : fmt(f));\n }\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n}\n\nasync function workerFromArgv(): Promise<void> {\n const f = args[1];\n if (!f) return;\n const job = JSON.parse(readFileSync(f, \"utf8\"));\n try {\n unlinkSync(f);\n } catch {}\n await runJob(job);\n}\n\nasync function update(): Promise<void> {\n if (process.env.SESSIONPIPE_NO_UPDATE_CHECK) return out(\" update check is off (SESSIONPIPE_NO_UPDATE_CHECK)\");\n try {\n const r = await fetch(\"https://registry.npmjs.org/sessionpipe/latest\", { signal: AbortSignal.timeout(8000) });\n const j = (await r.json()) as { version?: string };\n if (!j.version) throw new Error(\"no version\");\n if (j.version === VERSION) return out(` sessionpipe ${VERSION} is current`);\n out(` ${j.version} is available (you run ${VERSION}); installing into this copy's prefix\u2026`);\n const prefix = prefixOf(distDir);\n execFileSync(\"npm\", [\"install\", \"-g\", `sessionpipe@${j.version}`, ...(prefix ? [\"--prefix\", prefix] : [])], {\n stdio: \"inherit\",\n });\n out(\" re-arming hooks\u2026\");\n const bin = prefix ? path.join(prefix, \"bin\", \"sessionpipe\") : \"sessionpipe\";\n const p = spawn(bin, [\"install\", \"--backfill\", \"0\"], { stdio: \"inherit\" });\n await new Promise((r) => p.on(\"exit\", r));\n } catch (e) {\n out(` couldn't check npm: ${(e as Error).message}`);\n }\n}\nfunction prefixOf(p: string): string | null {\n const re =\n process.platform === \"win32\"\n ? /^(.*?)[\\\\/]node_modules[\\\\/]sessionpipe[\\\\/]/\n : /^(.*)\\/lib\\/node_modules\\/sessionpipe\\//;\n const m = re.exec(p);\n return m?.[1] ?? null;\n}\n\nmain().catch((e) => {\n process.stderr.write(`sessionpipe: ${(e as Error).message}\\n`);\n process.exit(1);\n});\n", "// SPDX-License-Identifier: Apache-2.0\n// Antigravity (Google) \u2014 docs: https://antigravity.google/docs/hooks\n// Config: ~/.gemini/config/hooks.json \u2014 top-level keys are hook NAMES, ours is\n// \"sessionpipe\". stdin is camelCase with NO event name (it rides in argv). Every\n// hook must print `{}`; non-JSON is a deny. Timeouts in seconds. No session end\n// exists. Ported from spacesheep-cli lib/sessions.js (facts, remote url, projects).\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines } from \"../readers/files.js\";\nimport { readAntigravity } from \"../readers/transcripts.js\";\nimport { formatJson, readJsonFile } from \"./claude-shaped.js\";\nimport type {\n Adapter,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallOptions,\n InstallReport,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"antigravity\";\nconst HOOK_NAME = \"sessionpipe\";\nexport const AG_EVENTS = [\"PreInvocation\", \"PostInvocation\", \"PreToolUse\", \"PostToolUse\", \"Stop\"] as const;\nconst gemini = (env: NodeJS.ProcessEnv) => env.GEMINI_CLI_HOME || path.join(HOME, \".gemini\");\nconst hooksFile = (env: NodeJS.ProcessEnv) => path.join(gemini(env), \"config\", \"hooks.json\");\nconst projectsDir = (env: NodeJS.ProcessEnv) => path.join(gemini(env), \"config\", \"projects\");\nconst dataDirs = (env: NodeJS.ProcessEnv) =>\n [\"antigravity\", \"antigravity-cli\", \"antigravity-ide\"].map((d) => path.join(gemini(env), d));\nconst ID_RE = /^[A-Za-z0-9_-]{1,128}$/;\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\n\nfunction entry(cmd: HookCommand, lean?: boolean) {\n const handler = (e: string) => ({ type: \"command\", command: cmd([NAME, e]).command, timeout: 5 });\n const out: Record<string, unknown> = { enabled: true };\n for (const e of AG_EVENTS) {\n if (lean && e === \"PreToolUse\") continue;\n out[e] = /Tool/.test(e) ? [{ matcher: \"*\", hooks: [handler(e)] }] : [handler(e)];\n }\n return out;\n}\n\nexport const antigravity: Adapter = {\n name: NAME,\n events: AG_EVENTS,\n detect: (env = process.env) =>\n existsSync(path.join(gemini(env), \"config\")) || dataDirs(env).some((d) => existsSync(d)),\n configFiles: (env = process.env) => [hooksFile(env)],\n install(cmd, env = process.env, opts: InstallOptions = {}): InstallReport[] {\n const file = hooksFile(env);\n const f = readJsonFile(file);\n if (!f.ok) return [{ file, changed: false, skipped: true, note: `${f.reason}; not touched` }];\n const hooks = f.value;\n const e = entry(cmd, opts.lean);\n if (JSON.stringify(hooks[HOOK_NAME]) === JSON.stringify(e)) return [{ file, changed: false }];\n hooks[HOOK_NAME] = e;\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, formatJson(hooks, f));\n return [\n {\n file,\n changed: true,\n created: !f.existed,\n note: \"hooks.json is read when a conversation starts; open ones report after a restart\",\n },\n ];\n },\n uninstall(env = process.env, opts: InstallOptions = {}): InstallReport[] {\n const file = hooksFile(env);\n if (!existsSync(file)) return [{ file, changed: false }];\n const f = readJsonFile(file);\n if (!f.ok) return [{ file, changed: false, skipped: true, note: `${f.reason}; not touched` }];\n const hooks = f.value;\n if (!(HOOK_NAME in hooks)) return [{ file, changed: false }];\n delete hooks[HOOK_NAME];\n if (opts.created?.includes(file) && !Object.keys(hooks).length) {\n unlinkSync(file);\n return [{ file, changed: true, note: \"removed (sessionpipe created it)\" }];\n }\n writeFileSync(file, formatJson(hooks, f));\n return [{ file, changed: true }];\n },\n installed(cmd, env = process.env, opts: InstallOptions = {}) {\n const file = hooksFile(env);\n const f = readJsonFile(file);\n const have = f.ok ? f.value[HOOK_NAME] : undefined;\n return [\n {\n file,\n state: !have ? \"missing\" : JSON.stringify(have) === JSON.stringify(entry(cmd, opts.lean)) ? \"current\" : \"stale\",\n },\n ];\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = (s.conversationId ?? s.session_id ?? s.sessionId) as string | undefined;\n // Antigravity parses stdout as the hook's answer; `{}` is \"carry on\" for every event.\n if (!id) return { session: { id: \"\" }, events: [], stdout: \"{}\\n\" };\n const workspaces = agWorkspaces(s.workspacePaths);\n const session: HookResult[\"session\"] = { id: String(id), cwd: workspaces[0] ?? input.cwd };\n if (typeof s.modelName === \"string\" && s.modelName !== \"auto\") session.model = s.modelName;\n const toolCall = s.toolCall as { name?: unknown; args?: unknown } | undefined;\n const tool = validTool(toolCall?.name) ? toolCall?.name : validTool(s.toolName) ? s.toolName : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"PreInvocation\":\n // Fires before every model call of an execution; only the first is the person's ask.\n if (Number(s.invocationNum) === 0 || s.invocationNum === undefined) {\n events.push(ev(\"session.started\", { source: \"unknown\" }));\n events.push(ev(\"turn.started\", {}));\n } else events.push(ev(\"session.heartbeat\", {}));\n break;\n case \"PostInvocation\":\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, input: toolCall?.args }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n ok: !s.error,\n error: typeof s.error === \"string\" ? s.error.slice(0, 2000) : undefined,\n input: toolCall?.args,\n }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { reason: s.error ? \"error\" : \"stop\" }));\n break;\n default:\n return { session, events: [], stdout: \"{}\\n\" };\n }\n const r: HookResult = { session, events, stdout: \"{}\\n\", hints: { workspaces } };\n if (typeof s.transcriptPath === \"string\") r.transcript = s.transcriptPath;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readAntigravity(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript, hints, state): SessionFacts {\n if (!transcript) return {};\n return antigravityFacts(transcript, {\n conversation: session.id,\n workspaces: (hints.workspaces as string[] | undefined) ?? (session.cwd ? [session.cwd] : []),\n state,\n env: process.env,\n });\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n const noState: FactsState = { get: () => ({}), save: () => {} };\n for (const data of dataDirs(env)) {\n let ids: string[] = [];\n try {\n ids = readdirSync(path.join(data, \"brain\")).filter((n) => /^[0-9a-f-]{36}$/i.test(n));\n } catch {}\n for (const id of ids) {\n const f = path.join(data, \"brain\", id, \".system_generated\", \"logs\", \"transcript.jsonl\");\n try {\n if (statSync(f).mtimeMs < sinceMs) continue;\n } catch {\n continue;\n }\n const facts = antigravityFacts(f, { conversation: id, workspaces: [], state: noState, env });\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n rows.push({ session: { id, ...rest }, started_at, last_at });\n }\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n\n/** A folder as Antigravity writes it (a file:// URI or a path) \u2192 an absolute path, or null. */\nexport function agPath(p: unknown): string | null {\n if (typeof p !== \"string\" || !p) return null;\n let s = p;\n if (/^file:/i.test(s)) {\n try {\n s = decodeURIComponent(new URL(s).pathname);\n } catch {\n return null;\n }\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:/.test(s)) s = s.slice(1);\n } else if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(s)) return null;\n if (!path.isAbsolute(s)) return null;\n return path.resolve(s);\n}\nexport const agWorkspaces = (paths: unknown): string[] =>\n (Array.isArray(paths) ? paths : [])\n .map(agPath)\n .filter((p): p is string => !!p)\n .filter((p, i, a) => a.indexOf(p) === i);\n\nfunction agVariants(p: string): string[] {\n const out = [p];\n try {\n const r = realpathSync.native(p);\n if (r !== p) out.push(r);\n } catch {}\n return out;\n}\nfunction agProjects(dir: string): { id: string; folders: string[] }[] {\n const out: { id: string; folders: string[] }[] = [];\n let names: string[] = [];\n try {\n names = readdirSync(dir).filter((n) => n.endsWith(\".json\"));\n } catch {\n return out;\n }\n for (const n of names) {\n const id = n.slice(0, -5);\n if (!ID_RE.test(id)) continue;\n let j: { projectResources?: { resources?: { folderUri?: unknown }[] } };\n try {\n j = JSON.parse(readFileSync(path.join(dir, n), \"utf8\"));\n } catch {\n continue;\n }\n const folders: string[] = [];\n for (const r of j?.projectResources?.resources ?? []) {\n const f = agPath(r?.folderUri);\n if (f) folders.push(...agVariants(f));\n }\n if (folders.length) out.push({ id, folders });\n }\n return out;\n}\n/** The project whose folder is the workspace or contains it; the deepest wins. */\nexport function agMatchProject(projects: { id: string; folders: string[] }[], workspaces: string[]): string | null {\n const ws: string[] = [];\n for (const w of workspaces) {\n const p = agPath(w);\n if (p) ws.push(...agVariants(p));\n }\n let best: string | null = null;\n let bestLen = -1;\n for (const pr of projects)\n for (const f of pr.folders) {\n const within = ws.some((w) => w === f || w.startsWith(f.endsWith(path.sep) ? f : f + path.sep));\n if (within && f.length > bestLen) {\n best = pr.id;\n bestLen = f.length;\n }\n }\n return best;\n}\n\n/** Antigravity's web remote: https://antigravity.google.com/r/<installation uuid>-v2, with\n * ?p=c/<conversation>?section=<project> when the project is known. */\nexport function antigravityRemoteUrl(\n transcript: string,\n opts: { conversation?: string; workspaces?: string[]; env: NodeJS.ProcessEnv; projectsDir?: string },\n): string | null {\n const i = transcript.indexOf(`${path.sep}brain${path.sep}`);\n const dirs = (i > 0 ? [transcript.slice(0, i)] : []).concat(dataDirs(opts.env));\n for (const d of dirs) {\n try {\n const m = /installation_uuid:\\s*\"([0-9a-f-]{36})\"/i.exec(\n readFileSync(path.join(d, \"antigravity_state.pbtxt\"), \"utf8\"),\n );\n if (!m) continue;\n const base = `https://antigravity.google.com/r/${m[1]}-v2`;\n const conv = opts.conversation ?? \"\";\n if (!ID_RE.test(conv) || !opts.workspaces?.length) return base;\n const project = agMatchProject(agProjects(opts.projectsDir ?? projectsDir(opts.env)), opts.workspaces);\n return project ? `${base}?p=${encodeURIComponent(`c/${conv}?section=${project}`)}` : base;\n } catch {}\n }\n return null;\n}\n\nexport function antigravityFacts(\n file: string,\n opts: { conversation: string; workspaces: string[]; state: FactsState; env: NodeJS.ProcessEnv },\n): SessionFacts {\n const { head, tail } = ends(file, 128 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const url = antigravityRemoteUrl(file, opts);\n if (url) out.url = url;\n for (const j of H) {\n if (j.type !== \"USER_INPUT\" || typeof j.content !== \"string\") continue;\n const m = /<USER_REQUEST>([\\s\\S]*?)(?:<\\/USER_REQUEST>|$)/.exec(j.content);\n const text = (m ? (m[1] ?? \"\") : j.content).trim();\n const line = (text.split(\"\\n\").find((l) => l.trim()) ?? \"\").trim();\n if (!line || /^<[a-z_-]+>/i.test(line)) continue;\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n break;\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.created_at ?? j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Where sessionpipe keeps its files (spec: the client's Files section).\n// config ~/.config/sessionpipe/config.json SESSIONPIPE_CONFIG\n// state ~/.local/state/sessionpipe/ SESSIONPIPE_STATE\n// Windows %APPDATA%\\sessionpipe\\ and %LOCALAPPDATA%\\sessionpipe\\\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport const HOME = os.homedir();\n\nexport function configFile(env: NodeJS.ProcessEnv = process.env): string {\n if (env.SESSIONPIPE_CONFIG) return path.resolve(env.SESSIONPIPE_CONFIG);\n if (process.platform === \"win32\")\n return path.join(env.APPDATA || path.join(HOME, \"AppData\", \"Roaming\"), \"sessionpipe\", \"config.json\");\n return path.join(env.XDG_CONFIG_HOME || path.join(HOME, \".config\"), \"sessionpipe\", \"config.json\");\n}\n\nexport function stateDir(env: NodeJS.ProcessEnv = process.env): string {\n if (env.SESSIONPIPE_STATE) return path.resolve(env.SESSIONPIPE_STATE);\n if (process.platform === \"win32\")\n return path.join(env.LOCALAPPDATA || path.join(HOME, \"AppData\", \"Local\"), \"sessionpipe\");\n return path.join(env.XDG_STATE_HOME || path.join(HOME, \".local\", \"state\"), \"sessionpipe\");\n}\n\n/** `~` for the home directory, as the session block writes paths. */\nexport function tilde(p: string, home: string = HOME): string {\n if (!p) return p;\n if (p === home) return \"~\";\n return p.startsWith(home + path.sep) || p.startsWith(`${home}/`) ? `~${p.slice(home.length)}` : p;\n}\n\n/** A file-name-safe id. */\nexport const safeId = (s: string): string =>\n String(s)\n .replace(/[^A-Za-z0-9_.-]/g, \"_\")\n .slice(0, 160);\n", "// SPDX-License-Identifier: Apache-2.0\n// Reading the ends of large files, JSON lines, and recent files under a root.\nimport { closeSync, fstatSync, openSync, readdirSync, readSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/** The first and last bytes of a file, as lines \u2014 a transcript can be tens of MB. */\nexport function ends(file: string, headBytes: number, tailBytes: number): { head: string[]; tail: string[] } {\n let fd: number | undefined;\n try {\n fd = openSync(file, \"r\");\n const size = fstatSync(fd).size;\n const read = (pos: number, len: number) => {\n const b = Buffer.alloc(len);\n const n = readSync(fd as number, b, 0, len, pos);\n return b.subarray(0, n).toString(\"utf8\");\n };\n const head = read(0, Math.min(size, headBytes));\n const tail = size > headBytes ? read(Math.max(0, size - tailBytes), Math.min(size, tailBytes)) : head;\n return { head: head.split(\"\\n\").slice(0, -1), tail: tail.split(\"\\n\").slice(size > headBytes ? 1 : 0) };\n } catch {\n return { head: [], tail: [] };\n } finally {\n if (fd !== undefined)\n try {\n closeSync(fd);\n } catch {}\n }\n}\n\nexport const parseLines = (lines: string[]): Record<string, unknown>[] =>\n lines\n .map((l) => {\n try {\n return JSON.parse(l) as Record<string, unknown>;\n } catch {\n return null;\n }\n })\n .filter((x): x is Record<string, unknown> => !!x);\n\n/** Read line by line up to `cap` bytes, stopping when `visit` returns a value. */\nexport function scanLines<T>(file: string, visit: (line: string) => T | null, cap = 16 * 1024 * 1024): T | null {\n let fd: number | undefined;\n try {\n fd = openSync(file, \"r\");\n const buf = Buffer.alloc(1024 * 1024);\n let pos = 0;\n let rest: Buffer = Buffer.alloc(0);\n while (pos < cap) {\n const n = readSync(fd, buf, 0, buf.length, pos);\n if (!n) break;\n pos += n;\n let chunk = Buffer.concat([rest, buf.subarray(0, n)]);\n let nl = chunk.indexOf(10);\n while (nl >= 0) {\n const r = visit(chunk.subarray(0, nl).toString(\"utf8\"));\n if (r !== null) return r;\n chunk = chunk.subarray(nl + 1);\n nl = chunk.indexOf(10);\n }\n rest = chunk;\n }\n } catch {\n } finally {\n if (fd !== undefined)\n try {\n closeSync(fd);\n } catch {}\n }\n return null;\n}\n\nexport function recentFiles(root: string, depth: number, sinceMs: number, match: (name: string) => boolean): string[] {\n const out: string[] = [];\n const walk = (dir: string, d: number) => {\n let names: import(\"node:fs\").Dirent[] = [];\n try {\n names = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of names) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) {\n if (d < depth) walk(p, d + 1);\n continue;\n }\n if (!match(e.name)) continue;\n try {\n if (statSync(p).mtimeMs >= sinceMs) out.push(p);\n } catch {}\n }\n };\n walk(root, 0);\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Transcript readers: complete turns (a person's message + everything the assistant\n// said before the next one), each with the line it ends on, and the line the\n// cursor may advance to once every turn is delivered. Ported from spacesheep-cli\n// lib/memory.js. One reader per harness file format; nothing else is vendor code.\nimport type { TranscriptRead } from \"../adapters/types.js\";\n\ninterface Msg {\n role: \"user\" | \"assistant\";\n text: string;\n at: number;\n line: number;\n}\n\nexport function pairTurns(msgs: Msg[], endLine: number): TranscriptRead {\n const turns: { user: string; assistant: string; at: number; startLine: number; endLine: number }[] = [];\n let cur: (typeof turns)[number] | null = null;\n for (const m of msgs) {\n if (m.role === \"user\") {\n // Never overwrite a prompt that has no reply yet: in an agentic turn the reply\n // comes after tool calls, and a second user record is not a new question.\n if (cur && !cur.assistant) {\n cur.user += `\\n\\n${m.text}`;\n continue;\n }\n if (cur) turns.push(cur);\n cur = { user: m.text, assistant: \"\", at: m.at, startLine: m.line, endLine: m.line };\n } else {\n if (!cur) cur = { user: \"\", assistant: \"\", at: m.at, startLine: m.line, endLine: m.line };\n cur.assistant += (cur.assistant ? \"\\n\\n\" : \"\") + m.text;\n cur.endLine = m.line;\n }\n }\n if (cur?.assistant) turns.push(cur);\n // A user message with no reply yet stays unsent: the cursor stops before it.\n const line = cur && !cur.assistant ? cur.startLine : endLine;\n return { turns: turns.map((t) => ({ user: t.user, assistant: t.assistant, at: t.at, endLine: t.endLine })), line };\n}\n\n/** Injected context the person never typed: <tag>\u2026</tag> wrappers, HTML comments, slash-command expansions. */\nexport const isInjected = (text: string): boolean =>\n (/^<[a-z_-]+>/i.test(text) && /<\\/[a-z_-]+>\\s*$/i.test(text)) || /^<!--\\s/.test(text) || /^<command-/.test(text);\n\nconst endOf = (lines: string[]) => (lines[lines.length - 1] === \"\" ? lines.length - 1 : lines.length);\nconst parse = (raw: string): Record<string, unknown> | null => {\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n};\nconst textParts = (c: unknown, kinds: string[]): string => {\n if (typeof c === \"string\") return c;\n if (!Array.isArray(c)) return \"\";\n return c\n .filter(\n (b) =>\n b &&\n typeof b === \"object\" &&\n kinds.includes((b as { type?: string }).type ?? \"\") &&\n typeof (b as { text?: unknown }).text === \"string\",\n )\n .map((b) => (b as { text: string }).text)\n .join(\"\\n\");\n};\n\n/** Claude Code / Droid: {type:\"user\"|\"assistant\", message:{content}, timestamp, isMeta, isSidechain, origin}. */\nexport function readClaude(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || j.isSidechain) continue;\n const origin = j.origin as { kind?: string } | undefined;\n if (j.type === \"user\" && (j.isMeta || (origin?.kind && origin.kind !== \"human\"))) continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n const c = (j.message as { content?: unknown } | undefined)?.content;\n if (j.type === \"user\") {\n const text = textParts(c, [\"text\"]).trim();\n if (!text || isInjected(text)) continue;\n msgs.push({ role: \"user\", text, at, line: i });\n } else if (j.type === \"assistant\" && Array.isArray(c)) {\n const text = textParts(c, [\"text\"]).trim();\n if (text) msgs.push({ role: \"assistant\", text, at, line: i });\n }\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Codex rollout: {type:\"response_item\", payload:{type:\"message\", role, content:[{type:\"input_text\"|\"output_text\", text}]}}. */\nexport function readCodex(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || j.type !== \"response_item\") continue;\n const p = j.payload as { type?: string; role?: string; content?: unknown } | undefined;\n if (!p || p.type !== \"message\") continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n const text = textParts(p.content, [\"input_text\", \"output_text\"]).trim();\n if (!text) continue;\n if (p.role === \"user\") {\n if (/^<[a-z_-]+>/i.test(text)) continue; // <environment_context>: Codex's own injections\n msgs.push({ role: \"user\", text, at, line: i });\n } else if (p.role === \"assistant\") msgs.push({ role: \"assistant\", text, at, line: i });\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Gemini CLI chat log: {type:\"user\"|\"gemini\", content|message|text, timestamp}. */\nexport function readGemini(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j) continue;\n const role = j.type === \"user\" ? \"user\" : j.type === \"gemini\" || j.type === \"model\" ? \"assistant\" : null;\n if (!role) continue;\n const raw = j.content ?? j.message ?? j.text;\n const text = (typeof raw === \"string\" ? raw : textParts(raw, [\"text\"])).trim();\n if (!text) continue;\n const at = Date.parse(String(j.timestamp ?? \"\")) || Date.now();\n msgs.push({ role, text, at, line: i });\n }\n return pairTurns(msgs, endOf(lines));\n}\n\n/** Antigravity: one step per line, type USER_INPUT | PLANNER_RESPONSE, content with <USER_REQUEST> wrapping. */\nexport function readAntigravity(lines: string[], from: number): TranscriptRead {\n const msgs: Msg[] = [];\n for (let i = from; i < lines.length; i++) {\n const j = lines[i] ? parse(lines[i] as string) : null;\n if (!j || typeof j.content !== \"string\") continue;\n const at = Date.parse(String(j.created_at ?? j.timestamp ?? \"\")) || Date.now();\n if (j.type === \"USER_INPUT\") {\n const m = /<USER_REQUEST>([\\s\\S]*?)(?:<\\/USER_REQUEST>|$)/.exec(j.content);\n const text = (m ? (m[1] ?? \"\") : j.content).trim();\n if (text) msgs.push({ role: \"user\", text, at, line: i });\n } else if (j.type === \"PLANNER_RESPONSE\") {\n const text = j.content.trim();\n if (text) msgs.push({ role: \"assistant\", text, at, line: i });\n }\n }\n return pairTurns(msgs, endOf(lines));\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The hooks file shape Claude Code introduced and Codex, Droid and (with\n// `version: 1`) Cursor and Copilot reuse: {\"hooks\":{\"<Event>\":[{\"matcher\"?,\n// \"hooks\":[{\"type\":\"command\",\"command\",\"timeout\"}]}]}}. Ours is one entry per\n// event; a re-install replaces a stale entry of ours (an old node path) and never\n// touches anyone else's.\n//\n// Two rules from issue #8: a file that is not plain JSON (a comment, a trailing\n// comma, a write in progress) is never written back \u2014 the harness is skipped and\n// the report says why; and a file is written back in its own shape (indent, final\n// newline) so uninstall leaves it byte-identical. A file that did not exist before\n// install is reported `created`, and uninstall deletes it once it is empty again.\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { HookCommand, InstallReport } from \"./types.js\";\n\nexport interface ClaudeShapedOptions {\n /** Which events take a `matcher` (tool and permission events). */\n matcherFor: (event: string) => string | undefined;\n /** Seconds (milliseconds for Gemini CLI). */\n timeout: number;\n /** A longer timeout for one event (Claude Code's PermissionRequest, which may wait\n * for a verified control answer: spec/CONTROL.md \u00A76). */\n timeoutFor?: (event: string) => number | undefined;\n /** Extra top-level keys the file must carry (Cursor/Copilot: version: 1). */\n top?: Record<string, unknown>;\n}\n\n/** A command of ours: a path that contains \"sessionpipe\" and ends in hook.js, then a harness and an event. */\nexport const OURS = /sessionpipe[^\"\\n]*[\\\\/]hook\\.js\"?\\s+[a-z][a-z-]*\\s+[A-Za-z]+\\s*$/;\nexport const isOurs = (h: { hooks?: { command?: string }[] }): boolean =>\n Array.isArray(h?.hooks) && h.hooks.some((x) => typeof x.command === \"string\" && OURS.test(x.command));\n\nexport type JsonFile =\n | {\n ok: true;\n existed: true;\n value: Record<string, unknown>;\n raw: string;\n indent: string;\n eol: string;\n finalNewline: boolean;\n }\n | { ok: true; existed: false; value: Record<string, unknown>; raw: \"\"; indent: \" \"; eol: \"\\n\"; finalNewline: true }\n | { ok: false; existed: true; reason: string };\n\n/** Read a JSON config file with its shape. Never guesses: a parse failure is a\n * refusal to touch the file, not an empty object. */\nexport function readJsonFile(file: string): JsonFile {\n let raw: string;\n try {\n raw = readFileSync(file, \"utf8\");\n } catch {\n return { ok: true, existed: false, value: {}, raw: \"\", indent: \" \", eol: \"\\n\", finalNewline: true };\n }\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n const hint = /^\\s*\\/\\/|\\/\\*/m.test(raw) ? \"not plain JSON (it has comments)\" : \"not plain JSON\";\n return { ok: false, existed: true, reason: hint };\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return { ok: false, existed: true, reason: \"not a JSON object\" };\n const eol = raw.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const m = /^( +|\\t+)\\S/m.exec(raw);\n const indent = m?.[1] ?? \" \";\n return {\n ok: true,\n existed: true,\n value: value as Record<string, unknown>,\n raw,\n indent,\n eol,\n finalNewline: /\\r?\\n$/.test(raw),\n };\n}\n\n/** Serialise in the file's own shape. */\nexport function formatJson(value: unknown, f: { indent: string; eol: string; finalNewline: boolean }): string {\n const text = JSON.stringify(value, null, f.indent).replace(/\\n/g, f.eol);\n return f.finalNewline ? text + f.eol : text;\n}\n\n/** Back-compat helper for callers that only read. */\nexport function readJson(file: string): Record<string, unknown> {\n const f = readJsonFile(file);\n return f.ok ? f.value : {};\n}\n\nfunction entryFor(event: string, harness: string, cmd: HookCommand, o: ClaudeShapedOptions) {\n const matcher = o.matcherFor(event);\n return {\n ...(matcher !== undefined ? { matcher } : {}),\n hooks: [{ type: \"command\", command: cmd([harness, event]).command, timeout: o.timeoutFor?.(event) ?? o.timeout }],\n };\n}\n\nexport function installClaudeShaped(\n file: string,\n harness: string,\n events: readonly string[],\n cmd: HookCommand,\n o: ClaudeShapedOptions,\n): InstallReport {\n const f = readJsonFile(file);\n if (!f.ok) return { file, changed: false, skipped: true, note: `${f.reason}; not touched` };\n const settings = f.value;\n const hooks = (settings.hooks && typeof settings.hooks === \"object\" ? settings.hooks : {}) as Record<\n string,\n unknown[]\n >;\n let changed = false;\n const want = new Set(events);\n // Events we no longer hook (a lean install) lose their entry of ours.\n for (const ev of Object.keys(hooks)) {\n if (want.has(ev)) continue;\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const kept = list.filter((h) => !isOurs(h as never));\n if (kept.length !== list.length) {\n changed = true;\n if (kept.length) hooks[ev] = kept;\n else delete hooks[ev];\n }\n }\n for (const ev of events) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const entry = entryFor(ev, harness, cmd, o);\n const mine = list.filter((h) => isOurs(h as never));\n if (mine.length === 1 && JSON.stringify(mine[0]) === JSON.stringify(entry)) continue;\n hooks[ev] = list.filter((h) => !isOurs(h as never)).concat([entry]);\n changed = true;\n }\n if (o.top)\n for (const [k, v] of Object.entries(o.top))\n if (settings[k] !== v) {\n settings[k] = v;\n changed = true;\n }\n if (changed) {\n settings.hooks = hooks;\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, formatJson(settings, f));\n }\n return { file, changed, created: !f.existed && changed };\n}\n\nexport function uninstallClaudeShaped(\n file: string,\n events: readonly string[],\n opts: { created?: boolean | undefined } = {},\n): InstallReport {\n if (!existsSync(file)) return { file, changed: false };\n const f = readJsonFile(file);\n if (!f.ok) return { file, changed: false, skipped: true, note: `${f.reason}; not touched` };\n const settings = f.value;\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks || typeof hooks !== \"object\") return { file, changed: false };\n let changed = false;\n for (const ev of [...events, ...Object.keys(hooks)]) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const kept = list.filter((h) => !isOurs(h as never));\n if (kept.length !== list.length) {\n changed = true;\n if (kept.length) hooks[ev] = kept;\n else delete hooks[ev];\n }\n }\n if (!changed) return { file, changed: false };\n if (!Object.keys(hooks).length) delete settings.hooks;\n if (opts.created && !Object.keys(settings).length) {\n unlinkSync(file);\n return { file, changed: true, note: \"removed (sessionpipe created it)\" };\n }\n const next = formatJson(settings, f);\n if (next !== f.raw) writeFileSync(file, next);\n return { file, changed: true };\n}\n\nexport function installedClaudeShaped(\n file: string,\n harness: string,\n events: readonly string[],\n cmd: HookCommand,\n o: ClaudeShapedOptions,\n): \"current\" | \"stale\" | \"missing\" {\n const f = readJsonFile(file);\n const hooks = (f.ok ? (f.value.hooks ?? {}) : {}) as Record<string, unknown[]>;\n let present = 0;\n let current = 0;\n for (const ev of events) {\n const list = Array.isArray(hooks[ev]) ? hooks[ev] : [];\n const mine = list.filter((h) => isOurs(h as never));\n if (mine.length) present++;\n if (mine.length === 1 && JSON.stringify(mine[0]) === JSON.stringify(entryFor(ev, harness, cmd, o))) current++;\n }\n // An entry of ours on an event outside the wanted set (a lean install after a full one) is stale.\n for (const ev of Object.keys(hooks))\n if (!events.includes(ev) && (Array.isArray(hooks[ev]) ? hooks[ev] : []).some((h) => isOurs(h as never)))\n return \"stale\";\n if (!present) return \"missing\";\n return current === events.length ? \"current\" : \"stale\";\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Claude Code (Anthropic) \u2014 docs: https://code.claude.com/docs/en/hooks\n// Config: settings.json in EVERY config dir (~/.claude, $CLAUDE_CONFIG_DIR, ~/.claude-*):\n// one per account; hooks written to one never fire for the others. Reads only the\n// hook's stdin, the transcript it names, the per-pid session registry and the config\n// dir's .claude.json account id. Ported from spacesheep-cli lib/sessions.js.\n\nimport { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines, recentFiles, scanLines } from \"../readers/files.js\";\nimport { gitFacts } from \"../readers/git.js\";\nimport { isInjected, readClaude } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport type {\n Adapter,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallOptions,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"claude-code\";\nexport const CLAUDE_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"PermissionRequest\",\n \"Notification\",\n \"Stop\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n \"SessionEnd\",\n \"StopFailure\",\n] as const;\n/** With no sink above tier 0 only the heartbeat needs a tool event: one, not three (issue #12). */\nconst LEAN_SKIP = new Set([\"PreToolUse\", \"PostToolUseFailure\"]);\nconst eventsFor = (lean?: boolean) => (lean ? CLAUDE_EVENTS.filter((e) => !LEAN_SKIP.has(e)) : [...CLAUDE_EVENTS]);\nconst OPTS = {\n matcherFor: (e: string) => (/Tool|Permission/.test(e) ? \"\" : undefined),\n timeout: 5,\n // The hook waits up to 125 s for a verified control answer, and only when control\n // is paired on this machine; everywhere else it exits in milliseconds as before.\n timeoutFor: (e: string) => (e === \"PermissionRequest\" ? 130 : undefined),\n};\nconst DESKTOP_ID = /^local_[A-Za-z0-9-]{1,64}$/;\n\n/** Every Claude Code config dir on this machine. */\nexport function claudeDirs(env: NodeJS.ProcessEnv = process.env, home = HOME): string[] {\n const out: string[] = [];\n const add = (d?: string) => {\n if (!d) return;\n const r = path.resolve(d);\n if (!out.includes(r)) out.push(r);\n };\n add(path.join(home, \".claude\"));\n add(env.CLAUDE_CONFIG_DIR);\n try {\n for (const e of readdirSync(home, { withFileTypes: true })) {\n if (!e.isDirectory() || !/^\\.claude[-_.]/.test(e.name)) continue;\n const d = path.join(home, e.name);\n if (existsSync(path.join(d, \"projects\")) || existsSync(path.join(d, \"settings.json\"))) add(d);\n }\n } catch {}\n return out.filter((d, i) => i === 0 || existsSync(d));\n}\nconst settingsIn = (dir: string) => path.join(dir, \"settings.json\");\nconst configDirOf = (transcript: string) => path.dirname(path.dirname(path.dirname(transcript)));\n\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst endReason = (r: unknown): \"clear\" | \"logout\" | \"exit\" | \"other\" =>\n r === \"clear\" || r === \"logout\" || r === \"exit\" ? r : r === \"prompt_input_exit\" ? \"exit\" : \"other\";\nconst notifKind = (t: unknown): \"permission\" | \"question\" | \"elicitation\" | \"idle\" | \"error\" =>\n t === \"permission_prompt\"\n ? \"permission\"\n : t === \"idle_prompt\"\n ? \"idle\"\n : t === \"elicitation_dialog\"\n ? \"elicitation\"\n : \"question\";\n\nexport const claudeCode: Adapter = {\n name: NAME,\n events: CLAUDE_EVENTS,\n detect: (env = process.env) => claudeDirs(env).some((d) => existsSync(d)),\n configFiles: (env = process.env) => claudeDirs(env).map(settingsIn),\n install: (cmd, env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) => installClaudeShaped(settingsIn(d), NAME, eventsFor(opts.lean), cmd, OPTS)),\n uninstall: (env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) =>\n uninstallClaudeShaped(settingsIn(d), CLAUDE_EVENTS, { created: opts.created?.includes(settingsIn(d)) }),\n ),\n installed: (cmd, env = process.env, opts: InstallOptions = {}) =>\n claudeDirs(env).map((d) => ({\n file: settingsIn(d),\n state: installedClaudeShaped(settingsIn(d), NAME, eventsFor(opts.lean), cmd, OPTS),\n })),\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = (s.session_id ?? s.sessionId) as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n if (typeof s.model === \"string\") session.model = s.model;\n if (typeof s.agent_id === \"string\" && event.startsWith(\"Subagent\") === false && s.agent_id)\n session.parent_id = null;\n const turn_id = typeof s.prompt_id === \"string\" ? s.prompt_id : undefined;\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const call_id = typeof s.tool_use_id === \"string\" ? s.tool_use_id : undefined;\n const ms = typeof s.duration_ms === \"number\" ? Math.round(s.duration_ms) : undefined;\n const agent_id = typeof s.agent_id === \"string\" ? s.agent_id : undefined;\n // PermissionRequest carries no tool_use_id (recorded 2026-09-28): the id is a hash\n // of the prompt, the tool and its input, so the same prompt yields the same id and\n // a later control answer can name it.\n const permissionId = () =>\n `perm-${createHash(\"sha256\")\n .update(`${turn_id ?? \"\"}|${tool ?? \"\"}|${JSON.stringify(s.tool_input ?? null)}`)\n .digest(\"hex\")\n .slice(0, 16)}`;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(ev(\"session.started\", { source: pickSource(s.source ?? s.trigger) }));\n break;\n case \"UserPromptSubmit\":\n events.push(\n ev(\"turn.started\", {\n turn_id,\n prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined,\n }),\n );\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, call_id, turn_id, agent_id, input: s.tool_input }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n call_id,\n turn_id,\n agent_id,\n ms,\n ok: true,\n input: s.tool_input,\n output: s.tool_response,\n }),\n );\n break;\n case \"PostToolUseFailure\":\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n call_id,\n turn_id,\n agent_id,\n ms,\n ok: false,\n error: errText(s.error ?? s.tool_response),\n input: s.tool_input,\n output: s.tool_response,\n }),\n );\n break;\n case \"PermissionRequest\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: call_id ?? permissionId(),\n kind: \"permission\",\n tool,\n message: tool ? `${tool}${describe(s.tool_input)}` : undefined,\n }),\n );\n break;\n case \"Notification\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: `notif-${Date.now()}`,\n kind: notifKind(s.notification_type),\n message: typeof s.message === \"string\" ? s.message.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"stop\" }));\n break;\n case \"StopFailure\":\n // The turn ended on an API error (rate_limit, overloaded, authentication_failed,\n // server_error \u2026); the payload key is `error` (issue #10, recorded 2026-09-28).\n events.push(\n ev(\"turn.ended\", {\n turn_id,\n reason: \"error\",\n error: typeof s.error === \"string\" ? s.error.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"SubagentStart\":\n events.push(\n ev(\"subagent.started\", {\n agent_id: String(s.agent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"SubagentStop\":\n events.push(\n ev(\"subagent.ended\", {\n agent_id: String(s.agent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"PreCompact\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"PostCompact\":\n break; // PreCompact already said it; a second event would double-count\n case \"SessionEnd\":\n events.push(ev(\"session.ended\", { reason: endReason(s.reason) }));\n break;\n default:\n return null;\n }\n const hints: Record<string, unknown> = {};\n const host = input.env.CLAUDE_CODE_HOST_SESSION_ID;\n if (host && DESKTOP_ID.test(host)) hints.desktop_id = host;\n // The registry file is found while the process tree stands (the detached\n // worker's parent is gone by the time it runs). Heartbeat-class events skip it.\n if (event !== \"PreToolUse\" && event !== \"PostToolUse\") hints.claude_pid = claudePid(input.env);\n const r: HookResult = { session, events, hints };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readClaude(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript, hints, state): SessionFacts {\n const out: SessionFacts = {};\n if (transcript) Object.assign(out, claudeFacts(transcript, session.id, hints, state));\n const cwd = out.cwd ?? session.cwd;\n Object.assign(out, gitFacts(cwd), out.branch ? { branch: out.branch } : {});\n if (!out.url && typeof hints.desktop_id === \"string\") out.url = `claude://code/continue/${hints.desktop_id}`;\n return out;\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n const files: string[] = [];\n for (const d of claudeDirs(env))\n files.push(...recentFiles(path.join(d, \"projects\"), 1, sinceMs, (n) => /^[0-9a-f-]{36}\\.jsonl$/.test(n)));\n const noState: FactsState = { get: () => ({}), save: () => {} };\n for (const f of files) {\n const id = path.basename(f, \".jsonl\");\n const facts = claudeFacts(f, id, {}, noState);\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n const cwd = rest.cwd;\n rows.push({\n session: { id, ...rest, ...gitFacts(cwd), ...(rest.branch ? { branch: rest.branch } : {}) },\n started_at,\n last_at,\n });\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\nfunction pickSource(v: unknown): string {\n return typeof v === \"string\" && [\"startup\", \"resume\", \"clear\", \"compact\", \"fork\"].includes(v) ? v : \"unknown\";\n}\nfunction errText(v: unknown): string | undefined {\n if (typeof v === \"string\") return v.slice(0, 2000);\n if (v && typeof v === \"object\") {\n const e = v as { error?: unknown; message?: unknown };\n if (typeof e.error === \"string\") return e.error.slice(0, 2000);\n if (typeof e.message === \"string\") return e.message.slice(0, 2000);\n }\n return undefined;\n}\nfunction describe(input: unknown): string {\n if (!input || typeof input !== \"object\") return \"\";\n const i = input as Record<string, unknown>;\n const v = i.command ?? i.file_path ?? i.path ?? i.url ?? i.pattern;\n return typeof v === \"string\" ? ` ${v.slice(0, 120)}` : \"\";\n}\n\n// --- facts: title, url, model, account, from Claude Code's own files ------------------\n\nconst NAME_RANK: Record<string, \"custom\" | \"harness\"> = {\n user: \"custom\",\n auto: \"harness\",\n hook: \"harness\",\n peer: \"harness\",\n};\ninterface Registry {\n sessionId: string | null;\n name: string | null;\n name_source: \"custom\" | \"harness\" | null;\n bridge: string | null;\n}\nfunction registryEntry(j: unknown): Registry | null {\n if (!j || typeof j !== \"object\") return null;\n const r = j as { sessionId?: unknown; name?: unknown; nameSource?: string; bridgeSessionId?: unknown };\n const source = r.nameSource ? NAME_RANK[r.nameSource] : undefined;\n return {\n sessionId: r.sessionId ? String(r.sessionId) : null,\n name: source && typeof r.name === \"string\" && r.name.trim() ? r.name.trim() : null,\n name_source: source ?? null,\n bridge: typeof r.bridgeSessionId === \"string\" ? r.bridgeSessionId : null,\n };\n}\nconst liveCache = new Map<string, Map<string, Registry>>();\nfunction claudeLive(dir: string): Map<string, Registry> {\n const hit = liveCache.get(dir);\n if (hit) return hit;\n const map = new Map<string, Registry>();\n let names: string[] = [];\n try {\n names = readdirSync(path.join(dir, \"sessions\")).filter((n) => n.endsWith(\".json\"));\n } catch {}\n for (const n of names) {\n try {\n const e = registryEntry(JSON.parse(readFileSync(path.join(dir, \"sessions\", n), \"utf8\")));\n if (e?.sessionId) map.set(e.sessionId, e);\n } catch {}\n }\n liveCache.set(dir, map);\n return map;\n}\nfunction claudeLiveByPid(dir: string, pid: unknown): Registry | null {\n if (!pid) return null;\n try {\n return registryEntry(JSON.parse(readFileSync(path.join(dir, \"sessions\", `${pid}.json`), \"utf8\")));\n } catch {\n return null;\n }\n}\n/** The Claude Code process that ran this hook: the nearest ancestor with a registry\n * file (hooks run under a shell, so usually the parent's parent). */\nexport function claudePid(env: NodeJS.ProcessEnv = process.env): number | null {\n try {\n const dirs = claudeDirs(env);\n const has = (pid: number) => dirs.some((d) => existsSync(path.join(d, \"sessions\", `${pid}.json`)));\n let pid = process.ppid;\n if (has(pid)) return pid;\n const parent = parentOf();\n for (let hop = 0; hop < 6 && pid > 1; hop++) {\n pid = parent(pid);\n if (pid > 1 && has(pid)) return pid;\n }\n } catch {}\n return null;\n}\nfunction parentOf(): (pid: number) => number {\n if (process.platform === \"linux\") {\n return (pid) => {\n try {\n const st = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n return Number(st.slice(st.lastIndexOf(\")\") + 2).split(\" \")[1]) || 0;\n } catch {\n return 0;\n }\n };\n }\n const table = new Map<number, number>();\n try {\n const out = execFileSync(\"ps\", [\"-axo\", \"pid=,ppid=\"], {\n encoding: \"utf8\",\n timeout: 2000,\n maxBuffer: 8 * 1024 * 1024,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n for (const l of out.split(\"\\n\")) {\n const m = /^\\s*(\\d+)\\s+(\\d+)/.exec(l);\n if (m) table.set(Number(m[1]), Number(m[2]));\n }\n } catch {}\n return (pid) => table.get(pid) || 0;\n}\nconst accountCache = new Map<string, string | null>();\n/** The account id (never the email) from the config dir's .claude.json. */\nfunction claudeAccount(dir: string): string | null {\n const hit = accountCache.get(dir);\n if (hit !== undefined) return hit;\n const files = [path.join(dir, \".claude.json\")];\n if (path.resolve(dir) === path.join(HOME, \".claude\")) files.unshift(path.join(HOME, \".claude.json\"));\n let acct: string | null = null;\n for (const f of files) {\n try {\n const a = (JSON.parse(readFileSync(f, \"utf8\")) as { oauthAccount?: { accountUuid?: string } }).oauthAccount;\n if (a?.accountUuid) {\n acct = String(a.accountUuid);\n break;\n }\n } catch {}\n }\n accountCache.set(dir, acct);\n return acct;\n}\nconst LINK_RE = /^https:\\/\\/claude\\.ai\\/code\\/session_[A-Za-z0-9]+$/;\nfunction transcriptLink(records: Record<string, unknown>[]): string | null {\n for (let i = records.length - 1; i >= 0; i--) {\n const j = records[i] as { type?: string; subtype?: string; url?: unknown; bridgeSessionId?: unknown };\n if (j.type === \"system\" && j.subtype === \"bridge_status\" && typeof j.url === \"string\" && LINK_RE.test(j.url))\n return j.url;\n if (j.type === \"bridge-session\" && typeof j.bridgeSessionId === \"string\") {\n const m = /^(?:cse|session)_([A-Za-z0-9]+)$/.exec(j.bridgeSessionId);\n if (m) return `https://claude.ai/code/session_${m[1]}`;\n }\n }\n return null;\n}\n/** A first ask as the Claude Code app titles an untitled session: whitespace\n * collapsed, whole up to 50 characters, else its first 50 and \"...\". */\nexport function appTitle(text: string): string {\n const t = String(text).replace(/\\s+/g, \" \").trim();\n return t.length > 50 ? `${t.slice(0, 50)}...` : t;\n}\nfunction askText(j: Record<string, unknown> | null): string | null {\n if (!j || j.type !== \"user\" || j.isMeta || j.isSidechain) return null;\n const origin = j.origin as { kind?: string } | undefined;\n if (origin?.kind && origin.kind !== \"human\") return null;\n const c = (j.message as { content?: unknown } | undefined)?.content;\n const text = (\n typeof c === \"string\"\n ? c\n : Array.isArray(c)\n ? c\n .filter((b) => b && b.type === \"text\" && typeof b.text === \"string\")\n .map((b) => b.text as string)\n .join(\"\\n\")\n : \"\"\n ).trim();\n if (!text || isInjected(text)) return null;\n return text;\n}\nfunction firstAsk(records: Record<string, unknown>[]): string | null {\n for (const j of records) {\n const t = askText(j);\n if (t) return appTitle(t);\n }\n return null;\n}\nfunction scanTitles(file: string, from: number, found: { custom?: string | null; ai?: string | null }) {\n const out = { custom: found.custom ?? null, ai: found.ai ?? null, upto: from };\n let size = 0;\n try {\n size = statSync(file).size;\n } catch {\n return out;\n }\n if (size < from) {\n out.upto = 0;\n out.custom = out.ai = null;\n from = 0;\n }\n // Only lines carrying a title record are parsed; the rest of the new bytes are skipped.\n let pos = 0;\n scanLines<null>(\n file,\n (l) => {\n pos += Buffer.byteLength(l, \"utf8\") + 1;\n if (pos <= from || l.indexOf('-title\"') < 0) return null;\n try {\n const j = JSON.parse(l) as { type?: string; customTitle?: string; aiTitle?: string };\n if (j.type === \"custom-title\" && j.customTitle) out.custom = j.customTitle;\n if (j.type === \"ai-title\" && j.aiTitle) out.ai = j.aiTitle;\n } catch {}\n return null;\n },\n 512 * 1024 * 1024,\n );\n out.upto = size;\n return out;\n}\n\n/** A session's title and where it came from, best first: /rename (registry \"user\"\n * name or custom-title) \u2192 Claude Code's own title (registry \"auto\" name or\n * ai-title) \u2192 the first ask, marked first-ask so a real title later replaces it. */\nexport function claudeFacts(\n file: string,\n sessionId: string,\n hints: Record<string, unknown>,\n state: FactsState,\n): SessionFacts {\n const { head, tail } = ends(file, 64 * 1024, 256 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const id = sessionId || path.basename(file, \".jsonl\");\n const mem = state.get(NAME, id);\n let custom: string | null = null;\n let ai: string | null = null;\n for (const j of H.concat(T)) {\n if (j.type === \"custom-title\" && typeof j.customTitle === \"string\") custom = j.customTitle;\n if (j.type === \"ai-title\" && typeof j.aiTitle === \"string\") ai = j.aiTitle;\n }\n let size = 0;\n try {\n size = statSync(file).size;\n } catch {}\n if (!custom && !ai && size > 64 * 1024 + 256 * 1024) {\n const s = scanTitles(file, Number(mem.scan_upto) || 0, {\n custom: mem.scan_custom as string | null,\n ai: mem.scan_ai as string | null,\n });\n custom = s.custom;\n ai = s.ai;\n state.save(NAME, id, { scan_upto: s.upto, scan_custom: s.custom, scan_ai: s.ai });\n }\n const dir = configDirOf(file);\n const live = claudeLive(dir).get(id) ?? claudeLiveByPid(dir, hints.claude_pid);\n if (live?.name) state.save(NAME, id, { name: live.name, name_source: live.name_source });\n const bridge =\n live?.bridge && /^session_[A-Za-z0-9]+$/.test(live.bridge) ? `https://claude.ai/code/${live.bridge}` : null;\n const url = bridge ?? transcriptLink(T) ?? transcriptLink(H) ?? (typeof mem.url === \"string\" ? mem.url : null);\n if (url) {\n out.url = url;\n state.save(NAME, id, { url });\n }\n const name = live?.name\n ? { title: live.name, source: live.name_source as \"custom\" | \"harness\" }\n : typeof mem.name === \"string\"\n ? { title: mem.name, source: mem.name_source as \"custom\" | \"harness\" }\n : null;\n const pick =\n (name && name.source === \"custom\" && name) ||\n (custom && { title: custom, source: \"custom\" as const }) ||\n name ||\n (ai && { title: ai, source: \"harness\" as const });\n let ask = typeof mem.first_ask === \"string\" ? mem.first_ask : firstAsk(H);\n if (!ask && size > 64 * 1024 && !mem.first_ask_none) {\n ask = scanLines<string>(file, (l) => {\n try {\n const t = askText(JSON.parse(l) as Record<string, unknown>);\n return t ? appTitle(t) : null;\n } catch {\n return null;\n }\n });\n if (!ask && size > 16 * 1024 * 1024) state.save(NAME, id, { first_ask_none: true });\n }\n if (ask) {\n out.first_ask = ask;\n if (!mem.first_ask) state.save(NAME, id, { first_ask: ask });\n }\n if (pick) {\n out.title = String(pick.title).slice(0, 120);\n out.title_source = pick.source;\n } else if (ask) {\n out.title = ask;\n out.title_source = \"first-ask\";\n }\n const acct = claudeAccount(dir);\n if (acct) out.account_id = acct;\n for (let i = T.length - 1; i >= 0; i--) {\n const m = (T[i] as { message?: { model?: string } }).message?.model;\n if (T[i]?.type === \"assistant\" && m && m !== \"<synthetic>\") {\n out.model = m;\n break;\n }\n }\n const meta = [...T].reverse().find((j) => j.version) ?? H.find((j) => j.version);\n if (meta?.version) out.harness_version = String(meta.version);\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n const withCwd = H.find((j) => typeof j.cwd === \"string\");\n if (withCwd) {\n out.cwd = withCwd.cwd as string;\n if (typeof withCwd.gitBranch === \"string\" && withCwd.gitBranch !== \"HEAD\") out.branch = withCwd.gitBranch;\n }\n return out;\n}\n\n/** For tests: each hook runs in a fresh process; a test that edits the registry mid-run clears the cache. */\nexport const _resetClaudeCaches = (): void => {\n liveCache.clear();\n accountCache.clear();\n};\n", "// SPDX-License-Identifier: Apache-2.0\n// The repo and branch of a folder, from git itself; credentials stripped from the\n// remote. Cached per folder for the life of the process (a worker run).\nimport { execFileSync } from \"node:child_process\";\n\nconst cache = new Map<string, { repo?: string; branch?: string }>();\n\nexport function gitFacts(cwd: string | undefined): { repo?: string; branch?: string } {\n if (!cwd) return {};\n const hit = cache.get(cwd);\n if (hit) return hit;\n const run = (args: string[]) => {\n try {\n return execFileSync(\"git\", [\"-C\", cwd, ...args], {\n encoding: \"utf8\",\n timeout: 1500,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return \"\";\n }\n };\n const out: { repo?: string; branch?: string } = {};\n const repo = run([\"remote\", \"get-url\", \"origin\"]);\n if (repo) out.repo = stripCredentials(repo);\n const branch = run([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (branch && branch !== \"HEAD\") out.branch = branch;\n cache.set(cwd, out);\n return out;\n}\n\n/** `https://user:token@host/x` \u2192 `https://host/x`; `git@github.com:a/b.git` \u2192 `github.com/a/b`. */\nexport function stripCredentials(url: string): string {\n let u = url.replace(/\\/\\/[^/@]*@/, \"//\");\n const ssh = /^(?:ssh:\\/\\/)?git@([^:/]+)[:/](.+?)(?:\\.git)?$/.exec(u);\n if (ssh) u = `${ssh[1]}/${ssh[2]}`;\n return u.replace(/^https?:\\/\\//, \"\").replace(/\\.git$/, \"\");\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Codex CLI (OpenAI) \u2014 docs: https://learn.chatgpt.com/docs/hooks\n// Config: ~/.codex/hooks.json (Claude-shaped, 12 events, timeouts in seconds) AND\n// `notify` at the top level of config.toml as the fallback when hooks are off or\n// not yet trusted (non-managed hooks need a /hooks review in the CLI). An existing\n// notify (Codex Computer Use) is chained through --previous-notify, never replaced.\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines, recentFiles } from \"../readers/files.js\";\nimport { readCodex } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport * as toml from \"./codex-config.js\";\nimport type {\n Adapter,\n BackfillRow,\n HookCommand,\n HookInput,\n HookResult,\n InstalledReport,\n InstallOptions,\n SessionFacts,\n} from \"./types.js\";\n\nconst NAME = \"codex\";\nexport const CODEX_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PermissionRequest\",\n \"Stop\",\n \"Interrupt\",\n \"SubagentStart\",\n \"SubagentStop\",\n \"PreCompact\",\n \"PostCompact\",\n \"SessionEnd\",\n] as const;\nconst OPTS = { matcherFor: (e: string) => (/Tool|Permission/.test(e) ? \"\" : undefined), timeout: 5 };\nconst eventsFor = (lean?: boolean) => (lean ? CODEX_EVENTS.filter((e) => e !== \"PreToolUse\") : [...CODEX_EVENTS]);\n\nconst codexHome = (env: NodeJS.ProcessEnv) => env.CODEX_HOME || path.join(HOME, \".codex\");\nconst hooksFile = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"hooks.json\");\nconst configFile = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"config.toml\");\nconst sessionsDir = (env: NodeJS.ProcessEnv) => path.join(codexHome(env), \"sessions\");\n\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst endReason = (r: unknown): \"clear\" | \"logout\" | \"exit\" | \"other\" =>\n r === \"clear\" || r === \"logout\" || r === \"exit\" ? r : \"other\";\n\nfunction installNotify(cmd: HookCommand, env: NodeJS.ProcessEnv) {\n const file = configFile(env);\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {}\n const argv = cmd([NAME, \"notify\"]).argv;\n const line = `notify = ${JSON.stringify(argv)}`;\n const n = toml.readNotify(text);\n const write = (next: string) => {\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, next);\n };\n if (n && !n.other) {\n if (!n.misplaced && JSON.stringify(n.argv) === JSON.stringify(argv))\n return { file, changed: false, note: \"notify current\" };\n write(toml.withNotify(text, line));\n return {\n file,\n changed: true,\n note: n.misplaced\n ? \"notify moved to the top level (it sat inside a [table], where Codex never reads it)\"\n : \"notify updated\",\n };\n }\n if (n?.other) {\n const prev = toml.previousNotify(n.argv);\n if (toml.isComputerUse(n.argv)) {\n if (prev && toml.OURS.test(JSON.stringify(prev))) {\n if (JSON.stringify(prev) === JSON.stringify(argv))\n return { file, changed: false, note: \"notify current (after Codex Computer Use)\" };\n }\n if (!prev || toml.OURS.test(JSON.stringify(prev))) {\n const next = toml.replaceNotify(text, `notify = ${toml.withPreviousRaw(n.raw, argv)}`);\n if (next) {\n write(next);\n return { file, changed: true, note: \"chained after Codex Computer Use (--previous-notify)\" };\n }\n }\n }\n return {\n file,\n changed: false,\n skipped: true,\n note: `notify belongs to ${(n.argv?.[0] ?? n.raw).replace(/^.*\\//, \"\").slice(0, 40)}; left alone. Codex will report nothing until you approve the hooks: start \\`codex\\` and accept the hook review`,\n };\n }\n write(toml.withNotify(text, line));\n return { file, changed: true, note: \"notify set at the top level\" };\n}\n\nfunction uninstallNotify(env: NodeJS.ProcessEnv) {\n const file = configFile(env);\n let text: string;\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { file, changed: false };\n }\n const n = toml.readNotify(text);\n if (!n) return { file, changed: false };\n if (!n.other) {\n writeFileSync(file, toml.withoutNotify(text));\n return { file, changed: true };\n }\n const prev = toml.previousNotify(n.argv);\n if (toml.isComputerUse(n.argv) && prev && toml.OURS.test(JSON.stringify(prev))) {\n const next = toml.replaceNotify(text, `notify = ${toml.stripPreviousRaw(n.raw)}`);\n if (next) writeFileSync(file, next);\n return { file, changed: true };\n }\n return { file, changed: false };\n}\n\nfunction findRollout(threadId: string, env: NodeJS.ProcessEnv): string | null {\n let best: string | null = null;\n const walk = (dir: string, depth: number) => {\n let names: string[] = [];\n try {\n names = readdirSync(dir);\n } catch {\n return;\n }\n for (const n of names.sort().reverse()) {\n const p = path.join(dir, n);\n if (n.endsWith(\".jsonl\") && n.includes(threadId)) {\n best = p;\n return;\n }\n if (depth < 3) {\n walk(p, depth + 1);\n if (best) return;\n }\n }\n };\n walk(sessionsDir(env), 0);\n return best;\n}\n\nexport const codex: Adapter = {\n name: NAME,\n events: CODEX_EVENTS,\n detect: (env = process.env) => existsSync(codexHome(env)),\n configFiles: (env = process.env) => [hooksFile(env), configFile(env)],\n install: (cmd, env = process.env, opts: InstallOptions = {}) => [\n installClaudeShaped(hooksFile(env), NAME, eventsFor(opts.lean), cmd, OPTS),\n installNotify(cmd, env),\n ],\n uninstall: (env = process.env, opts: InstallOptions = {}) => [\n uninstallClaudeShaped(hooksFile(env), CODEX_EVENTS, { created: opts.created?.includes(hooksFile(env)) }),\n uninstallNotify(env),\n ],\n installed: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const out: InstalledReport[] = [\n {\n file: hooksFile(env),\n state: installedClaudeShaped(hooksFile(env), NAME, eventsFor(opts.lean), cmd, OPTS),\n note: \"Codex runs non-managed hooks only after the review in `codex` (/hooks); until then nothing is reported unless the notify fallback is ours\",\n },\n ];\n let text = \"\";\n try {\n text = readFileSync(configFile(env), \"utf8\");\n } catch {}\n const n = toml.readNotify(text);\n const argv = cmd([NAME, \"notify\"]).argv;\n const prev = n ? toml.previousNotify(n.argv) : null;\n const ours = n && (!n.other || (prev && JSON.stringify(prev) === JSON.stringify(argv)));\n out.push({\n file: configFile(env),\n state:\n !n || (n.other && !ours)\n ? \"missing\"\n : n.misplaced\n ? \"misplaced\"\n : JSON.stringify(n.argv) === JSON.stringify(argv) || (prev && JSON.stringify(prev) === JSON.stringify(argv))\n ? \"current\"\n : \"stale\",\n });\n return out;\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n if (event === \"notify\") {\n // Codex's notify passes one JSON argument: {\"type\":\"agent-turn-complete\",\"thread-id\":\u2026,\"turn-id\":\u2026,\"cwd\":\u2026}\n const raw = input.argv.find((a) => a.startsWith(\"{\")) ?? input.stdin;\n try {\n s = raw ? (JSON.parse(raw) as Record<string, unknown>) : {};\n } catch {}\n const id = (s[\"thread-id\"] ?? s.thread_id ?? s[\"session-id\"] ?? s.session_id) as string | undefined;\n if (!id) return null;\n const r: HookResult = {\n session: { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd },\n events: [\n {\n type: \"turn.ended\",\n data: { reason: \"stop\", ...(typeof s[\"turn-id\"] === \"string\" ? { turn_id: s[\"turn-id\"] } : {}) },\n harnessEvent: \"notify\",\n },\n ],\n hints: {},\n };\n const file = findRollout(String(id), input.env as NodeJS.ProcessEnv);\n if (file) r.transcript = file;\n return r;\n }\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = s.session_id as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n if (typeof s.model === \"string\") session.model = s.model;\n const turn_id = typeof s.turn_id === \"string\" ? s.turn_id : undefined;\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const call_id = typeof s.tool_use_id === \"string\" ? s.tool_use_id : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(\n ev(\"session.started\", {\n source:\n typeof s.source === \"string\" && [\"startup\", \"resume\", \"clear\", \"compact\", \"fork\"].includes(s.source)\n ? s.source\n : \"unknown\",\n }),\n );\n break;\n case \"UserPromptSubmit\":\n events.push(\n ev(\"turn.started\", {\n turn_id,\n prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined,\n }),\n );\n break;\n case \"PreToolUse\":\n if (tool) events.push(ev(\"tool.started\", { tool, call_id, turn_id, input: s.tool_input }));\n break;\n case \"PostToolUse\":\n if (tool)\n events.push(\n ev(\"tool.ended\", { tool, call_id, turn_id, ok: true, input: s.tool_input, output: s.tool_response }),\n );\n break;\n case \"PermissionRequest\":\n events.push(\n ev(\"attention.needed\", { attention_id: call_id ?? `perm-${Date.now()}`, kind: \"permission\", tool }),\n );\n break;\n case \"Stop\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"stop\" }));\n break;\n case \"Interrupt\":\n events.push(ev(\"turn.ended\", { turn_id, reason: \"interrupt\" }));\n break;\n case \"SubagentStart\":\n events.push(\n ev(\"subagent.started\", {\n agent_id: String(s.agent_id ?? s.subagent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"SubagentStop\":\n events.push(\n ev(\"subagent.ended\", {\n agent_id: String(s.agent_id ?? s.subagent_id ?? \"\"),\n agent_type: typeof s.agent_type === \"string\" ? s.agent_type : undefined,\n }),\n );\n break;\n case \"PreCompact\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"PostCompact\":\n break;\n case \"SessionEnd\":\n events.push(ev(\"session.ended\", { reason: endReason(s.reason) }));\n break;\n default:\n return null;\n }\n const r: HookResult = { session, events, hints: {} };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readCodex(text.split(\"\\n\"), fromLine);\n },\n\n facts(session, transcript): SessionFacts {\n const out: SessionFacts = {};\n if (transcript) Object.assign(out, codexFacts(transcript));\n return out;\n },\n\n backfill(sinceMs, env = process.env): BackfillRow[] {\n const rows: BackfillRow[] = [];\n for (const f of recentFiles(sessionsDir(env), 3, sinceMs, (n) => /^rollout-.*\\.jsonl$/.test(n))) {\n const m = /([0-9a-f]{8}-[0-9a-f-]{27,})\\.jsonl$/i.exec(path.basename(f));\n if (!m?.[1]) continue;\n const facts = codexFacts(f);\n if (!facts.started_at || !facts.last_at) continue;\n const { started_at, last_at, first_ask: _fa, harness_version: _hv, ...rest } = facts;\n rows.push({ session: { id: m[1], ...rest }, started_at, last_at });\n }\n return rows;\n },\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n\n/** Codex keeps no title; its first real ask stands in. */\nexport function codexFacts(file: string): SessionFacts {\n const { head, tail } = ends(file, 128 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const out: SessionFacts = {};\n const meta = H.find((j) => j.type === \"session_meta\" && j.payload) as\n | { payload?: { cwd?: string; cli_version?: string; git?: { branch?: string; repository_url?: string } } }\n | undefined;\n if (meta?.payload) {\n const p = meta.payload;\n if (p.cwd) out.cwd = p.cwd;\n if (p.cli_version) out.harness_version = String(p.cli_version);\n if (p.git?.branch) out.branch = p.git.branch;\n if (p.git?.repository_url) out.repo = String(p.git.repository_url).replace(/\\/\\/[^/@]*@/, \"//\");\n }\n const ctx = H.concat(T)\n .reverse()\n .find((j) => j.type === \"turn_context\" && (j.payload as { model?: string } | undefined)?.model) as\n | { payload?: { model?: string } }\n | undefined;\n if (ctx?.payload?.model) out.model = ctx.payload.model;\n for (const j of H) {\n const p = j.payload as { type?: string; role?: string; content?: { type?: string; text?: string }[] } | undefined;\n if (j.type !== \"response_item\" || !p || p.type !== \"message\" || p.role !== \"user\") continue;\n const text = (p.content ?? [])\n .filter((b) => b && b.type === \"input_text\" && typeof b.text === \"string\")\n .map((b) => b.text as string)\n .join(\"\\n\")\n .trim();\n if (!text || /^<[a-z_-]+>/i.test(text)) continue;\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n break;\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Codex's ~/.codex/config.toml, as far as the notify fallback needs it: its one\n// top-level `notify` command. Codex reads `notify` only at the top level \u2014 before\n// the first [table] \u2014 and Codex itself appends a [projects.\"<path>\"] table for every\n// folder it trusts, so a line appended at the end lands inside one and never runs.\n// Ported from spacesheep-cli lib/codex-config.js. Pure text in, text out.\n\nconst NOTIFY_LINE = /^[ \\t]*notify[ \\t]*=[ \\t]*(\\[.*\\])[ \\t]*(?:#.*)?$/m;\nconst NOTIFY_KEY = /^[ \\t]*notify[ \\t]*=/m;\n/** A notify that runs sessionpipe's hook directly. */\nexport const OURS = /hook\\.js\",\\s*\"codex\",\\s*\"notify\"/;\n\nfunction scan(line: string, st: { depth: number; str: string | null }): void {\n let i = 0;\n while (i < line.length) {\n if (st.str) {\n const j = line.indexOf(st.str, i);\n if (j < 0) return;\n i = j + 3;\n st.str = null;\n continue;\n }\n const ch = line[i];\n if (ch === \"#\") return;\n if (line.startsWith('\"\"\"', i) || line.startsWith(\"'''\", i)) {\n st.str = line.slice(i, i + 3);\n i += 3;\n continue;\n }\n if (ch === '\"') {\n i++;\n while (i < line.length && line[i] !== '\"') i += line[i] === \"\\\\\" ? 2 : 1;\n i++;\n continue;\n }\n if (ch === \"'\") {\n const j = line.indexOf(\"'\", i + 1);\n i = j < 0 ? line.length : j + 1;\n continue;\n }\n if (ch === \"[\") st.depth++;\n else if (ch === \"]\") st.depth = Math.max(0, st.depth - 1);\n i++;\n }\n}\n\n/** Offset of the first table header, or -1. */\nexport function firstTableAt(text: string): number {\n const st = { depth: 0, str: null as string | null };\n let pos = 0;\n for (const line of text.split(\"\\n\")) {\n if (!st.str && st.depth === 0 && /^[ \\t]*\\[/.test(line)) return pos;\n scan(line, st);\n pos += line.length + 1;\n }\n return -1;\n}\n\nfunction split(text: string) {\n const at = firstTableAt(text);\n return at < 0 ? { head: text, tail: \"\", at: text.length } : { head: text.slice(0, at), tail: text.slice(at), at };\n}\n\nexport function parseArgv(raw: string): string[] | null {\n try {\n const a = JSON.parse(raw) as unknown;\n return Array.isArray(a) && a.every((x) => typeof x === \"string\") ? (a as string[]) : null;\n } catch {\n return null;\n }\n}\n\nexport interface Notify {\n raw: string;\n argv: string[] | null;\n index: number;\n length: number;\n misplaced: boolean;\n other: boolean;\n}\n\n/** notify as Codex sees it; `misplaced` for a line of ours inside a table. */\nexport function readNotify(text: string): Notify | null {\n const { head, tail, at } = split(text);\n const m = NOTIFY_LINE.exec(head);\n if (m)\n return {\n raw: m[1] ?? \"\",\n argv: parseArgv(m[1] ?? \"\"),\n index: m.index,\n length: m[0].length,\n misplaced: false,\n other: !OURS.test(m[1] ?? \"\"),\n };\n const k = NOTIFY_KEY.exec(head);\n if (k) {\n const rest = head.slice(k.index).split(\"\\n\")[0] ?? \"\";\n return {\n raw: rest.replace(NOTIFY_KEY, \"\").trim(),\n argv: null,\n index: k.index,\n length: 0,\n misplaced: false,\n other: true,\n };\n }\n const t = NOTIFY_LINE.exec(tail);\n if (t && OURS.test(t[1] ?? \"\"))\n return {\n raw: t[1] ?? \"\",\n argv: parseArgv(t[1] ?? \"\"),\n index: at + t.index,\n length: t[0].length,\n misplaced: true,\n other: false,\n };\n return null;\n}\n\nfunction dropLine(text: string, index: number, length: number): string {\n return text.slice(0, index) + text.slice(index + length).replace(/^\\r?\\n/, \"\");\n}\n\n/** Put `line` at the top level: before the first table, or at the end of a file that has none. */\nexport function insertTopLevel(text: string, line: string): string {\n const { head, tail } = split(text);\n if (!tail) return (head.trim() ? head.replace(/\\s*$/, \"\\n\") : \"\") + line + \"\\n\";\n return `${(head.trim() ? head.replace(/\\s*$/, \"\\n\") : \"\") + line}\\n\\n${tail}`;\n}\n\n/** The config with `line` as its notify, for a config whose notify is ours or absent. */\nexport function withNotify(text: string, line: string): string {\n const n = readNotify(text);\n if (n && !n.misplaced && !n.other) return text.slice(0, n.index) + line + text.slice(n.index + n.length);\n if (n?.misplaced) return insertTopLevel(dropLine(text, n.index, n.length), line);\n return insertTopLevel(text, line);\n}\n\n/** The config with its top-level notify line replaced by `line`. */\nexport function replaceNotify(text: string, line: string): string | null {\n const n = readNotify(text);\n if (!n || n.misplaced || !n.length) return null;\n return text.slice(0, n.index) + line + text.slice(n.index + n.length);\n}\n\n/** The config with our top-level or misplaced notify removed. */\nexport function withoutNotify(text: string): string {\n const n = readNotify(text);\n if (!n || n.other || !n.length) return text;\n return dropLine(text, n.index, n.length);\n}\n\n// Codex Computer Use takes the notify slot itself and keeps the command it found in\n// its own argv: [client, \"turn-ended\", \"--previous-notify\", \"<that command as JSON>\"].\nconst PREVIOUS = \"--previous-notify\";\nexport function previousNotify(argv: string[] | null): string[] | null {\n if (!Array.isArray(argv)) return null;\n const i = argv.indexOf(PREVIOUS);\n return i >= 0 && typeof argv[i + 1] === \"string\" ? parseArgv(argv[i + 1] as string) : null;\n}\nexport function withPrevious(argv: string[], prev: string[] | null): string[] {\n const out = argv.slice();\n const i = out.indexOf(PREVIOUS);\n if (i >= 0) out.splice(i, 2);\n if (prev) out.push(PREVIOUS, JSON.stringify(prev));\n return out;\n}\n/** The raw notify value with its --previous-notify pair removed, formatting kept. */\nexport function stripPreviousRaw(raw: string): string {\n return raw.replace(/,\\s*\"--previous-notify\",\\s*\"(?:[^\"\\\\]|\\\\.)*\"\\s*(?=\\])/, \"\");\n}\n/** The raw notify value with `prev` as its --previous-notify, formatting of the rest kept. */\nexport function withPreviousRaw(raw: string, prev: string[]): string {\n const base = stripPreviousRaw(raw).replace(/\\s*\\]\\s*$/, \"\");\n return `${base}, \"--previous-notify\", ${JSON.stringify(JSON.stringify(prev))}]`;\n}\nexport const isComputerUse = (argv: string[] | null): boolean =>\n Array.isArray(argv) && typeof argv[0] === \"string\" && /(^|\\/)SkyComputerUseClient$/.test(argv[0]);\n", "// SPDX-License-Identifier: Apache-2.0\n// Gemini CLI (Google) \u2014 docs: https://geminicli.com/docs/hooks/reference\n// Config: ~/.gemini/settings.json `hooks` key, same array-of-groups shape as Claude\n// Code but timeouts in MILLISECONDS and a `name` per handler. stdout must be JSON or\n// empty. Its own telemetry defaults logPrompts on; the installer says so once.\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { HOME } from \"../paths.js\";\nimport { ends, parseLines } from \"../readers/files.js\";\nimport { readGemini } from \"../readers/transcripts.js\";\nimport { installClaudeShaped, installedClaudeShaped, uninstallClaudeShaped } from \"./claude-shaped.js\";\nimport type { Adapter, HookInput, HookResult, InstallOptions, SessionFacts } from \"./types.js\";\n\nconst NAME = \"gemini-cli\";\nexport const GEMINI_EVENTS = [\n \"SessionStart\",\n \"BeforeAgent\",\n \"BeforeTool\",\n \"AfterTool\",\n \"Notification\",\n \"AfterAgent\",\n \"PreCompress\",\n \"SessionEnd\",\n] as const;\nconst OPTS = { matcherFor: (e: string) => (/Tool/.test(e) ? \".*\" : undefined), timeout: 5000 };\nconst geminiDir = (env: NodeJS.ProcessEnv) => env.GEMINI_CLI_HOME || path.join(HOME, \".gemini\");\nconst settings = (env: NodeJS.ProcessEnv) => path.join(geminiDir(env), \"settings.json\");\nconst validTool = (n: unknown): n is string => typeof n === \"string\" && /^[A-Za-z0-9_.:-]{1,120}$/.test(n);\nconst eventsFor = (lean?: boolean) => (lean ? GEMINI_EVENTS.filter((e) => e !== \"BeforeTool\") : [...GEMINI_EVENTS]);\n\n/** Before 0.46 the hooks system is off unless tools.enableHooks is true (issue #11). */\nexport function geminiHooksActive(settingsFile: string): { active: boolean; note?: string } {\n let tools: { enableHooks?: unknown } | undefined;\n try {\n tools = (JSON.parse(readFileSync(settingsFile, \"utf8\")) as { tools?: { enableHooks?: unknown } }).tools;\n } catch {}\n if (tools?.enableHooks === true) return { active: true };\n if (tools?.enableHooks === false)\n return { active: false, note: \"inactive: tools.enableHooks is false in settings.json\" };\n let version = \"\";\n try {\n version = execFileSync(\"gemini\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: 4000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return {\n active: true,\n note: \"could not run `gemini --version`; hooks need tools.enableHooks on versions before 0.46\",\n };\n }\n const m = /(\\d+)\\.(\\d+)/.exec(version);\n if (m && (Number(m[1]) > 0 || Number(m[2]) >= 46)) return { active: true };\n return {\n active: false,\n note: `inactive: Gemini CLI ${version || \"?\"} runs hooks only with \"tools\": {\"enableHooks\": true} in settings.json`,\n };\n}\n\nexport const geminiCli: Adapter = {\n name: NAME,\n events: GEMINI_EVENTS,\n // ~/.gemini also belongs to Antigravity; Gemini CLI is here when its settings or its chat logs exist.\n detect: (env = process.env) => existsSync(settings(env)) || existsSync(path.join(geminiDir(env), \"tmp\")),\n configFiles: (env = process.env) => [settings(env)],\n install: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const r = installClaudeShaped(settings(env), NAME, eventsFor(opts.lean), cmd, OPTS);\n const a = geminiHooksActive(settings(env));\n return [a.note && !r.skipped ? { ...r, note: [r.note, a.note].filter(Boolean).join(\"; \") } : r];\n },\n uninstall: (env = process.env, opts: InstallOptions = {}) => [\n uninstallClaudeShaped(settings(env), GEMINI_EVENTS, { created: opts.created?.includes(settings(env)) }),\n ],\n installed: (cmd, env = process.env, opts: InstallOptions = {}) => {\n const state = installedClaudeShaped(settings(env), NAME, eventsFor(opts.lean), cmd, OPTS);\n const a = geminiHooksActive(settings(env));\n return [\n {\n file: settings(env),\n state: state === \"current\" && !a.active ? \"inactive\" : state,\n ...(a.note ? { note: a.note } : {}),\n },\n ];\n },\n\n fromHook(input: HookInput): HookResult | null {\n const event = input.argv[1] ?? \"\";\n let s: Record<string, unknown> = {};\n try {\n s = input.stdin ? (JSON.parse(input.stdin) as Record<string, unknown>) : {};\n } catch {}\n const id = s.session_id as string | undefined;\n if (!id) return null;\n const session: HookResult[\"session\"] = { id: String(id), cwd: typeof s.cwd === \"string\" ? s.cwd : input.cwd };\n const tool = validTool(s.tool_name) ? s.tool_name : undefined;\n const ev = (type: string, data: Record<string, unknown>) => ({ type, data: prune(data), harnessEvent: event });\n const events: HookResult[\"events\"] = [];\n switch (event) {\n case \"SessionStart\":\n events.push(\n ev(\"session.started\", {\n source:\n typeof s.source === \"string\" && [\"startup\", \"resume\", \"clear\"].includes(s.source) ? s.source : \"unknown\",\n }),\n );\n break;\n case \"BeforeAgent\":\n events.push(\n ev(\"turn.started\", { prompt_chars: typeof s.prompt === \"string\" ? [...s.prompt].length : undefined }),\n );\n break;\n case \"BeforeTool\":\n if (tool) events.push(ev(\"tool.started\", { tool, input: s.tool_input }));\n break;\n case \"AfterTool\": {\n const resp = s.tool_response as { error?: unknown; llmContent?: unknown } | undefined;\n const err =\n resp && typeof resp === \"object\" && resp.error\n ? String(typeof resp.error === \"string\" ? resp.error : JSON.stringify(resp.error)).slice(0, 2000)\n : undefined;\n if (tool)\n events.push(\n ev(\"tool.ended\", {\n tool,\n ok: !err,\n error: err,\n input: s.tool_input,\n output: resp?.llmContent ?? s.tool_response,\n }),\n );\n break;\n }\n case \"Notification\":\n events.push(\n ev(\"attention.needed\", {\n attention_id: `notif-${Date.now()}`,\n kind: s.notification_type === \"ToolPermission\" ? \"permission\" : \"question\",\n message: typeof s.message === \"string\" ? s.message.slice(0, 200) : undefined,\n }),\n );\n break;\n case \"AfterAgent\":\n events.push(ev(\"turn.ended\", { reason: \"stop\" }));\n break;\n case \"PreCompress\":\n events.push(ev(\"context.compacted\", { trigger: s.trigger === \"manual\" ? \"manual\" : \"auto\" }));\n break;\n case \"SessionEnd\":\n events.push(\n ev(\"session.ended\", {\n reason:\n s.reason === \"clear\" || s.reason === \"logout\" || s.reason === \"exit\"\n ? s.reason\n : s.reason === \"prompt_input_exit\"\n ? \"exit\"\n : \"other\",\n }),\n );\n break;\n default:\n return null;\n }\n const r: HookResult = { session, events, hints: {} };\n if (typeof s.transcript_path === \"string\") r.transcript = s.transcript_path;\n return r;\n },\n\n readTranscript(file, fromLine) {\n let text = \"\";\n try {\n text = readFileSync(file, \"utf8\");\n } catch {\n return { turns: [], line: fromLine };\n }\n return readGemini(text.split(\"\\n\"), fromLine);\n },\n\n facts(_session, transcript): SessionFacts {\n const out: SessionFacts = {};\n if (!transcript) return out;\n const { head, tail } = ends(transcript, 64 * 1024, 64 * 1024);\n const H = parseLines(head);\n const T = parseLines(tail);\n const first = H.find((j) => j.type === \"user\");\n const raw = first ? (first.content ?? first.message ?? first.text) : undefined;\n const text = typeof raw === \"string\" ? raw.trim() : \"\";\n if (text) {\n const line = text.split(\"\\n\").find((l) => l.trim()) ?? \"\";\n out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\\s+\\S*$/, \"\")}\u2026` : line;\n out.title_source = \"first-ask\";\n }\n const times = H.concat(T)\n .map((j) => Date.parse(String(j.timestamp ?? \"\")))\n .filter((n) => n > 0);\n if (times.length) {\n out.started_at = Math.min(...times);\n out.last_at = Math.max(...times);\n }\n return out;\n },\n\n backfill: () => [], // chat logs are keyed by a project hash, not a session id we can name; the first hook of a resumed session reports it\n};\n\nfunction prune<T extends Record<string, unknown>>(o: T): T {\n for (const k of Object.keys(o)) if (o[k] === undefined) delete o[k];\n return o;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// Claude Code (Anthropic) \u2014 control delivery (spec/CONTROL.md \u00A76). Claude Code on\n// this machine, as the control daemon needs it: which `claude` to\n// run and with which permission flags, where a session's transcript is and which\n// folder it runs in, whether a live process holds it, and running one headless\n// turn (`claude -p --resume`, `--fork-session`, `--session-id`). Ported from the\n// spacesheep CLI's machine listener (lib/machine.js, 1.22), which ran it in\n// production first.\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { accessSync, closeSync, constants, openSync, readdirSync, readFileSync, readSync, statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nexport const JOB_TIMEOUT_MS = 30 * 60_000;\nconst OUT_CAP = 1024 * 1024;\n/** A transcript someone else wrote this recently is in use. */\nconst LIVE_WRITE_MS = 90_000;\n\nexport type Mode = \"safe\" | \"auto\";\n\nfunction isExe(p: string): boolean {\n try {\n if (!statSync(p).isFile()) return false;\n accessSync(p, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nconst cmpVersion = (a: string, b: string) => {\n const pa = a.split(\".\").map(Number);\n const pb = b.split(\".\").map(Number);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++)\n if ((pa[i] ?? 0) !== (pb[i] ?? 0)) return (pa[i] ?? 0) - (pb[i] ?? 0);\n return 0;\n};\n\n/** The `claude` to run: on PATH, else where the installers put it, else the newest\n * copy the desktop app ships. Null when this machine has none. */\nexport function findClaude(env: NodeJS.ProcessEnv = process.env, home = os.homedir()): string | null {\n if (env.SESSIONPIPE_CLAUDE && isExe(env.SESSIONPIPE_CLAUDE)) return env.SESSIONPIPE_CLAUDE;\n const names = process.platform === \"win32\" ? [\"claude.exe\", \"claude.cmd\"] : [\"claude\"];\n for (const d of String(env.PATH || \"\").split(path.delimiter)) {\n if (!d || !path.isAbsolute(d)) continue;\n for (const n of names) if (isExe(path.join(d, n))) return path.join(d, n);\n }\n for (const p of [\n path.join(home, \".claude\", \"local\", \"claude\"),\n path.join(home, \".local\", \"bin\", \"claude\"),\n \"/opt/homebrew/bin/claude\",\n \"/usr/local/bin/claude\",\n ])\n if (isExe(p)) return p;\n const app = path.join(home, \"Library\", \"Application Support\", \"Claude\", \"claude-code\");\n let versions: string[] = [];\n try {\n versions = readdirSync(app)\n .filter((n) => /^\\d+(\\.\\d+)*$/.test(n))\n .sort(cmpVersion)\n .reverse();\n } catch {}\n for (const v of versions) {\n const p = path.join(app, v, \"claude.app\", \"Contents\", \"MacOS\", \"claude\");\n if (isExe(p)) return p;\n }\n return null;\n}\n\n/** One option's text in `claude --help`: its line and the deeper-indented lines under it. */\nfunction optionBlock(help: string, flag: string): string | null {\n const lines = help.split(\"\\n\");\n const re = new RegExp(`^\\\\s{0,4}(?:-\\\\w, )?${flag.replace(/-/g, \"\\\\-\")}(?![\\\\w-])`);\n const start = lines.findIndex((l) => re.test(l));\n if (start < 0) return null;\n const out = [lines[start] as string];\n for (let i = start + 1; i < lines.length && lines[i]?.trim() && !/^\\s{0,4}-/.test(lines[i] as string); i++)\n out.push(lines[i] as string);\n return out.join(\" \");\n}\n\nexport interface Caps {\n hasMode: boolean;\n modes: string[];\n promptsNone: boolean;\n fork: boolean;\n}\n\nexport function parseCaps(help: string): Caps {\n const pm = optionBlock(help, \"--permission-mode\");\n const pp = optionBlock(help, \"--permission-prompts\");\n return {\n hasMode: !!pm,\n modes: pm ? [...pm.matchAll(/\"([A-Za-z]+)\"/g)].map((m) => m[1] as string) : [],\n promptsNone: !!pp && /\"none\"/.test(pp),\n fork: !!optionBlock(help, \"--fork-session\"),\n };\n}\n\n/** Permission flags for the machine's mode. Safe: `dontAsk` (nothing that needs\n * approval runs). Auto: Claude Code's own auto mode, or a refusal. Never\n * bypassPermissions \u2014 no path here writes it. */\nexport function modeFlags(mode: Mode, caps: Caps): { args: string[] } | { error: string } {\n if (mode === \"auto\") {\n if (!caps.modes.includes(\"auto\"))\n return { error: \"this machine is in auto mode, but its Claude Code has no auto permission mode\" };\n return { args: [\"--permission-mode\", \"auto\"] };\n }\n if (caps.modes.includes(\"dontAsk\")) return { args: [\"--permission-mode\", \"dontAsk\"] };\n const args: string[] = [];\n if (caps.hasMode)\n args.push(\n \"--permission-mode\",\n caps.modes.includes(\"manual\") && !caps.modes.includes(\"default\") ? \"manual\" : \"default\",\n );\n if (caps.promptsNone) args.push(\"--permission-prompts\", \"none\");\n return { args };\n}\n\n/** The env a headless turn runs with: ours, minus the markers that make Claude Code\n * think it runs inside another session, with CLAUDE_CONFIG_DIR naming the account. */\nexport function claudeEnv(configDir?: string, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n const e = { ...env };\n for (const k of [\n \"CLAUDECODE\",\n \"CLAUDE_CODE_SESSION_ID\",\n \"CLAUDE_CODE_HOST_SESSION_ID\",\n \"CLAUDE_CODE_ENTRYPOINT\",\n \"CLAUDE_CODE_SESSION_ATTENDED\",\n \"CLAUDE_CODE_SSE_PORT\",\n ])\n delete e[k];\n e.SESSIONPIPE_CONTROL_JOB = \"1\";\n if (configDir !== undefined) {\n if (path.resolve(configDir) === path.resolve(os.homedir(), \".claude\")) delete e.CLAUDE_CONFIG_DIR;\n else e.CLAUDE_CONFIG_DIR = configDir;\n }\n return e;\n}\n\nexport function detectCaps(bin: string): Caps {\n let help = \"\";\n try {\n help = execFileSync(bin, [\"--help\"], {\n encoding: \"utf8\",\n timeout: 30_000,\n env: claudeEnv(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n maxBuffer: 4 * 1024 * 1024,\n });\n } catch (e) {\n help = String((e as { stdout?: string })?.stdout || \"\");\n }\n return parseCaps(help);\n}\n\nexport interface Transcript {\n file: string;\n configDir: string;\n project: string;\n}\n\n/** <config dir>/projects/<folder>/<session>.jsonl in any Claude Code config dir. */\nexport function findTranscript(session: string, dirs: string[]): Transcript | null {\n if (!UUID_RE.test(session)) return null;\n for (const dir of dirs) {\n let projects: import(\"node:fs\").Dirent[] = [];\n try {\n projects = readdirSync(path.join(dir, \"projects\"), { withFileTypes: true });\n } catch {\n continue;\n }\n for (const p of projects) {\n if (!p.isDirectory()) continue;\n const file = path.join(dir, \"projects\", p.name, `${session}.jsonl`);\n try {\n if (statSync(file).isFile()) return { file, configDir: dir, project: p.name };\n } catch {}\n }\n }\n return null;\n}\n\nconst projectName = (cwd: string) => cwd.replace(/[^a-zA-Z0-9]/g, \"-\");\n\n/** The folder a session runs in, from its transcript's own records (never from a\n * command): the `cwd` whose project name is the folder the transcript is filed\n * under, else the first `cwd`. Streams; a line over 2 MB is skipped. */\nexport function sessionFolder(t: Transcript, cap = 8 * 1024 * 1024): string | null {\n let first: string | null = null;\n let count = 0;\n let fd: number | undefined;\n const look = (line: Buffer): string | null => {\n if (line.indexOf('\"cwd\"') < 0) return null;\n let j: { cwd?: unknown };\n try {\n j = JSON.parse(line.toString(\"utf8\"));\n } catch {\n return null;\n }\n if (!j || typeof j.cwd !== \"string\" || !path.isAbsolute(j.cwd)) return null;\n if (projectName(j.cwd) === t.project) return j.cwd;\n first ??= j.cwd;\n count++;\n return null;\n };\n try {\n fd = openSync(t.file, \"r\");\n const buf = Buffer.alloc(256 * 1024);\n let pos = 0;\n let rest = Buffer.alloc(0);\n let skipping = false;\n while (pos < cap && count < 50) {\n const n = readSync(fd, buf, 0, buf.length, pos);\n if (!n) {\n if (!skipping && rest.length) {\n const hit = look(rest);\n if (hit) return hit;\n }\n break;\n }\n pos += n;\n let chunk = rest.length ? Buffer.concat([rest, buf.subarray(0, n)]) : buf.subarray(0, n);\n let nl = chunk.indexOf(10);\n while (nl >= 0) {\n const line = chunk.subarray(0, nl);\n chunk = chunk.subarray(nl + 1);\n if (skipping) skipping = false;\n else {\n const hit = look(line);\n if (hit) return hit;\n }\n nl = chunk.indexOf(10);\n }\n if (chunk.length > 2 * 1024 * 1024) {\n skipping = true;\n rest = Buffer.alloc(0);\n } else rest = skipping ? Buffer.alloc(0) : Buffer.from(chunk);\n }\n } catch {\n } finally {\n if (fd !== undefined)\n try {\n closeSync(fd);\n } catch {}\n }\n return first;\n}\n\nfunction pidAlive(pid: number): boolean {\n if (!Number.isSafeInteger(pid) || pid <= 1) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as { code?: string }).code === \"EPERM\";\n }\n}\n\n/** A Claude Code process holds this session right now: its registry file,\n * <config>/sessions/<pid>.json, names it and the pid is alive (interactive and\n * Agent SDK sessions both file one). */\nexport function liveProcess(session: string, configDir: string): boolean {\n let names: string[] = [];\n try {\n names = readdirSync(path.join(configDir, \"sessions\")).filter((n) => /^\\d+\\.json$/.test(n));\n } catch {\n return false;\n }\n for (const n of names) {\n try {\n const j = JSON.parse(readFileSync(path.join(configDir, \"sessions\", n), \"utf8\")) as {\n sessionId?: unknown;\n pid?: unknown;\n };\n if (String(j.sessionId) !== session) continue;\n if (pidAlive(Number(j.pid ?? n.slice(0, -5)))) return true;\n } catch {}\n }\n return false;\n}\n\n/** Written in the last 90 s, and not by a job of ours. */\nexport function recentlyWritten(file: string, ourLastEnd?: number, now = Date.now()): boolean {\n let m: number;\n try {\n m = statSync(file).mtimeMs;\n } catch {\n return false;\n }\n if (now - m > LIVE_WRITE_MS) return false;\n return !(ourLastEnd && m <= ourLastEnd + 2000);\n}\n\nexport interface RunResult {\n error?: string;\n code?: number | null;\n signal?: NodeJS.Signals | null;\n stdout?: string | null;\n tooBig?: boolean;\n stderr?: string;\n timedOut?: boolean;\n}\n\n/** Run one headless turn in its own process group, holding at most 1 MB of stdout. */\nexport function runClaude(\n bin: string,\n args: string[],\n o: { cwd: string; env: NodeJS.ProcessEnv; timeoutMs?: number },\n): Promise<RunResult> {\n return new Promise((resolve) => {\n let out: Buffer[] = [];\n let outLen = 0;\n let tooBig = false;\n let errTail = \"\";\n let timedOut = false;\n let settled = false;\n let child: import(\"node:child_process\").ChildProcess;\n try {\n child = spawn(bin, args, {\n cwd: o.cwd,\n env: o.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n windowsHide: true,\n });\n } catch (e) {\n resolve({ error: (e as Error).message });\n return;\n }\n const kill = (sig: NodeJS.Signals) => {\n try {\n if (process.platform !== \"win32\" && child.pid) process.kill(-child.pid, sig);\n else child.kill(sig);\n } catch {\n try {\n child.kill(sig);\n } catch {}\n }\n };\n child.stdout?.on(\"data\", (b: Buffer) => {\n if (tooBig) return;\n if (outLen + b.length > OUT_CAP) {\n tooBig = true;\n out = [];\n return;\n }\n out.push(b);\n outLen += b.length;\n });\n child.stderr?.on(\"data\", (b: Buffer) => {\n errTail = (errTail + b.toString(\"utf8\")).slice(-4000);\n });\n const timer = setTimeout(() => {\n timedOut = true;\n kill(\"SIGTERM\");\n setTimeout(() => kill(\"SIGKILL\"), 10_000).unref();\n }, o.timeoutMs ?? JOB_TIMEOUT_MS);\n const result = (code: number | null, signal: NodeJS.Signals | null): RunResult => ({\n code,\n signal,\n stdout: tooBig ? null : Buffer.concat(out).toString(\"utf8\"),\n tooBig,\n stderr: errTail,\n timedOut,\n });\n const finish = (r: RunResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(r);\n };\n child.on(\"error\", (e) => finish({ error: e.message }));\n // A tool the agent left running can hold stdout open after Claude Code exits.\n child.on(\"exit\", (code, signal) => setTimeout(() => finish(result(code, signal)), 2000).unref());\n child.on(\"close\", (code, signal) => finish(result(code, signal)));\n });\n}\n\nexport interface ClaudeResult {\n type?: string;\n result?: unknown;\n is_error?: boolean;\n subtype?: string;\n session_id?: unknown;\n permission_denials?: { tool_name?: unknown }[];\n}\n\n/** `--output-format json`: one result object, or an array whose last `result` entry it is. */\nexport function parseResult(stdout: string | null | undefined): ClaudeResult | null {\n const s = String(stdout || \"\").trim();\n if (!s) return null;\n const pick = (j: unknown): ClaudeResult | null => {\n if (Array.isArray(j)) {\n for (let i = j.length - 1; i >= 0; i--) if (j[i]?.type === \"result\") return j[i];\n return null;\n }\n return j && typeof j === \"object\" ? (j as ClaudeResult) : null;\n };\n try {\n return pick(JSON.parse(s));\n } catch {}\n const lines = s.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const j = pick(JSON.parse(lines[i] as string));\n if (j && (j.type === \"result\" || \"result\" in j)) return j;\n } catch {}\n }\n return null;\n}\n\nexport const isUuid = (s: unknown): s is string => typeof s === \"string\" && UUID_RE.test(s);\n", "// SPDX-License-Identifier: Apache-2.0\n// The registry: the only place that lists vendors. A new harness is one file here\n// plus its fixtures and its row in spec/ADAPTERS.md.\nimport { antigravity } from \"./antigravity.js\";\nimport { claudeCode } from \"./claude-code.js\";\nimport { codex } from \"./codex.js\";\nimport { geminiCli } from \"./gemini-cli.js\";\nimport type { Adapter } from \"./types.js\";\n\nexport const ADAPTERS: readonly Adapter[] = [claudeCode, codex, geminiCli, antigravity];\nexport const adapterByName = (name: string): Adapter | undefined => ADAPTERS.find((a) => a.name === name);\nexport { claudeDirs } from \"./claude-code.js\";\nexport * as claudeControl from \"./claude-code-control.js\";\nexport type {\n Adapter,\n AdapterEvent,\n BackfillRow,\n FactsState,\n HookCommand,\n HookInput,\n HookResult,\n InstallReport,\n SessionFacts,\n TranscriptRead,\n Turn,\n} from \"./types.js\";\nexport { antigravity, claudeCode, codex, geminiCli };\n", "// SPDX-License-Identifier: Apache-2.0\n// ~/.config/sessionpipe/config.json, mode 0600: the machine's name, the sinks with\n// their tier and token, per-harness switches, the update check.\nimport { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { configFile } from \"./paths.js\";\nimport type { Tier } from \"./types.js\";\n\nexport interface SinkConfig {\n name: string;\n /** https://\u2026, file:PATH, stdout, otlp:URL */\n url: string;\n tier: Tier;\n pii?: boolean;\n /** @deprecated Never set: control is per machine (spec/CONTROL.md \u00A72). Kept so an\n * older config still reads. */\n control?: boolean;\n token?: string;\n /** whsec_\u2026 for Standard Webhooks signatures. */\n secret?: string;\n /** Learned from the receiver's well-known file; re-read daily. */\n max_tier?: Tier;\n well_known_at?: string;\n paused?: string;\n}\n\nexport interface Config {\n machine?: string;\n sinks: SinkConfig[];\n harnesses: Record<string, { enabled?: boolean; created?: string[] }>;\n update_check?: boolean;\n keep_days?: number;\n}\n\nexport const DEFAULT_CONFIG: Config = { sinks: [], harnesses: {}, update_check: true, keep_days: 30 };\n\nexport function readConfig(file: string = configFile()): Config {\n try {\n const j = JSON.parse(readFileSync(file, \"utf8\")) as Partial<Config>;\n return {\n ...DEFAULT_CONFIG,\n ...j,\n sinks: Array.isArray(j.sinks) ? j.sinks : [],\n harnesses: j.harnesses && typeof j.harnesses === \"object\" ? j.harnesses : {},\n };\n } catch {\n return { ...DEFAULT_CONFIG, sinks: [], harnesses: {} };\n }\n}\n\nexport function writeConfig(c: Config, file: string = configFile()): void {\n mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });\n writeFileSync(file, `${JSON.stringify(c, null, 2)}\\n`, { mode: 0o600 });\n if (process.platform !== \"win32\" && existsSync(file)) {\n try {\n chmodSync(file, 0o600);\n } catch {}\n }\n}\n\n/** The machine's name: what the person configured, else the hostname without a\n * local suffix. Never guessed from anything else (a hand-typed name once linked 64\n * versions to nothing). */\nexport function machineName(c: Config, hostname: string): string {\n if (c.machine) return String(c.machine).slice(0, 80);\n return hostname.replace(/\\.(local|lan|home)$/i, \"\");\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// ULID: 48-bit ms timestamp + 80 random bits, Crockford base32. Monotonic within a\n// process so two events in the same millisecond still sort in emit order.\nimport { randomBytes } from \"node:crypto\";\n\nconst ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nlet lastTime = 0;\nlet lastRand: number[] = [];\n\nfunction encodeTime(t: number): string {\n let out = \"\";\n let n = t;\n for (let i = 0; i < 10; i++) {\n out = ALPHABET[n % 32] + out;\n n = Math.floor(n / 32);\n }\n return out;\n}\n\nexport function ulid(now: number = Date.now()): string {\n if (now === lastTime) {\n // increment the random part\n for (let i = lastRand.length - 1; i >= 0; i--) {\n const v = (lastRand[i] ?? 0) + 1;\n if (v < 32) {\n lastRand[i] = v;\n break;\n }\n lastRand[i] = 0;\n }\n } else {\n lastTime = now;\n const b = randomBytes(16);\n lastRand = Array.from({ length: 16 }, (_, i) => (b[i] ?? 0) % 32);\n }\n return encodeTime(now) + lastRand.map((v) => ALPHABET[v]).join(\"\");\n}\n\nexport const isUlid = (s: string): boolean => /^[0-9A-HJKMNP-TV-Z]{26}$/.test(s);\n", "// SPDX-License-Identifier: Apache-2.0\n// From an adapter's output to a protocol event: id, time, the full session block\n// as known now, and the raw (tier 3) data. Filtering per sink happens later.\nimport type { AdapterEvent } from \"./adapters/types.js\";\nimport type { Event, Session } from \"./types.js\";\nimport { ulid } from \"./ulid.js\";\n\nexport interface EventContext {\n harness: { name: string; version?: string };\n session: Session;\n now?: number;\n}\n\nexport function makeEvent(a: AdapterEvent, ctx: EventContext): Event {\n const now = ctx.now ?? Date.now();\n const harness: Event[\"harness\"] = { name: ctx.harness.name, event: a.harnessEvent };\n if (ctx.harness.version) harness.version = ctx.harness.version;\n return {\n protocol: 1,\n id: ulid(now),\n type: a.type,\n time: new Date(now).toISOString(),\n tier: 3,\n harness,\n session: ctx.session,\n privacy: { rulesets: [], pii: false },\n data: a.data,\n };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The outbox: append-only JSONL per (harness, session) under\n// <state>/outbox/<harness>/<session>.jsonl, a per-session seq counter, a per-sink\n// cursor that moves only when the sink acknowledged, and a per-session lock so two\n// workers never interleave. Never lose, never duplicate.\nimport {\n appendFileSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { safeId } from \"./paths.js\";\nimport type { Event } from \"./types.js\";\n\nexport interface OutboxRef {\n harness: string;\n session: string;\n}\n\nexport class Outbox {\n constructor(readonly root: string) {}\n\n dir(harness: string): string {\n return path.join(this.root, \"outbox\", safeId(harness));\n }\n file(ref: OutboxRef): string {\n return path.join(this.dir(ref.harness), `${safeId(ref.session)}.jsonl`);\n }\n private seqFile(ref: OutboxRef): string {\n return path.join(this.dir(ref.harness), `${safeId(ref.session)}.seq`);\n }\n\n /** The next seq for a session, persisted (survives a hibernating machine and a\n * restart; an in-memory counter would restart at 0 and collide). */\n nextSeq(ref: OutboxRef): number {\n const f = this.seqFile(ref);\n let n = 0;\n try {\n n = Number(readFileSync(f, \"utf8\")) || 0;\n } catch {\n // A missing counter with an existing outbox: recover from the file's last line.\n n = this.lastSeqInFile(ref) + 1;\n }\n mkdirSync(path.dirname(f), { recursive: true, mode: 0o700 });\n writeFileSync(f, String(n + 1), { mode: 0o600 });\n return n;\n }\n\n private lastSeqInFile(ref: OutboxRef): number {\n const f = this.file(ref);\n if (!existsSync(f)) return -1;\n const lines = readFileSync(f, \"utf8\").trim().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const j = JSON.parse(lines[i] ?? \"\") as Event;\n if (typeof j.session?.seq === \"number\") return j.session.seq;\n } catch {}\n }\n return -1;\n }\n\n append(ref: OutboxRef, events: Event[]): void {\n if (!events.length) return;\n mkdirSync(this.dir(ref.harness), { recursive: true, mode: 0o700 });\n appendFileSync(this.file(ref), `${events.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`, { mode: 0o600 });\n }\n\n /** Every session file, newest first. */\n sessions(): OutboxRef[] {\n const out: { ref: OutboxRef; mtime: number }[] = [];\n const base = path.join(this.root, \"outbox\");\n if (!existsSync(base)) return [];\n for (const h of readdirSync(base)) {\n const d = path.join(base, h);\n let names: string[] = [];\n try {\n names = readdirSync(d).filter((n) => n.endsWith(\".jsonl\"));\n } catch {\n continue;\n }\n for (const n of names) {\n try {\n out.push({ ref: { harness: h, session: n.slice(0, -6) }, mtime: statSync(path.join(d, n)).mtimeMs });\n } catch {}\n }\n }\n return out.sort((a, b) => b.mtime - a.mtime).map((x) => x.ref);\n }\n\n /** Read events after byte offset `from`; returns them and the new offset. Lines\n * are read whole; a partial trailing line (a write in progress) is left. */\n read(ref: OutboxRef, from: number, maxEvents = 500): { events: Event[]; offset: number } {\n const f = this.file(ref);\n if (!existsSync(f)) return { events: [], offset: from };\n const size = statSync(f).size;\n if (from >= size) return { events: [], offset: from };\n const fd = openSync(f, \"r\");\n try {\n const buf = Buffer.alloc(Math.min(size - from, 8 * 1024 * 1024));\n const n = readSync(fd, buf, 0, buf.length, from);\n const text = buf.subarray(0, n).toString(\"utf8\");\n const events: Event[] = [];\n let offset = from;\n let pos = 0;\n while (events.length < maxEvents) {\n const nl = text.indexOf(\"\\n\", pos);\n if (nl < 0) break;\n const line = text.slice(pos, nl);\n pos = nl + 1;\n offset = from + Buffer.byteLength(text.slice(0, pos), \"utf8\");\n if (!line.trim()) continue;\n try {\n events.push(JSON.parse(line) as Event);\n } catch {}\n }\n return { events, offset };\n } finally {\n closeSync(fd);\n }\n }\n\n /** Files older than `days` are pruned; the cursor files with them. */\n prune(days: number, now = Date.now()): number {\n let n = 0;\n const cutoff = now - days * 86_400_000;\n for (const ref of this.sessions()) {\n const f = this.file(ref);\n try {\n if (statSync(f).mtimeMs < cutoff) {\n unlinkSync(f);\n try {\n unlinkSync(this.seqFile(ref));\n } catch {}\n n++;\n }\n } catch {}\n }\n return n;\n }\n\n delete(ref: OutboxRef): void {\n for (const f of [this.file(ref), this.seqFile(ref)]) {\n try {\n unlinkSync(f);\n } catch {}\n }\n }\n}\n\n/** Per-sink cursor: byte offset per session file, moved only on a 2xx. */\nexport class Cursors {\n constructor(\n readonly root: string,\n readonly sink: string,\n ) {}\n private file(): string {\n return path.join(this.root, \"cursors\", `${safeId(this.sink)}.json`);\n }\n read(): Record<string, number> {\n try {\n return JSON.parse(readFileSync(this.file(), \"utf8\")) as Record<string, number>;\n } catch {\n return {};\n }\n }\n write(c: Record<string, number>): void {\n const f = this.file();\n mkdirSync(path.dirname(f), { recursive: true, mode: 0o700 });\n const tmp = `${f}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify(c), { mode: 0o600 });\n renameSync(tmp, f);\n }\n key(ref: OutboxRef): string {\n return `${ref.harness}/${ref.session}`;\n }\n}\n\n/** A lock per session so two workers never interleave. Stale after 5 min. */\nexport function takeLock(root: string, ref: OutboxRef, staleMs = 5 * 60_000): (() => void) | null {\n const dir = path.join(root, \"locks\");\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n const f = path.join(dir, `${safeId(ref.harness)}-${safeId(ref.session)}.lock`);\n try {\n if (Date.now() - statSync(f).mtimeMs > staleMs) unlinkSync(f);\n else return null;\n } catch {}\n try {\n writeFileSync(f, String(process.pid), { flag: \"wx\" });\n } catch {\n return null;\n }\n return () => {\n try {\n unlinkSync(f);\n } catch {}\n };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// pii@1 \u2014 an opt-in second pass that reduces identifiers (spec/PRIVACY.md \u00A72). It\n// does not promise anonymity; it removes the obvious.\nimport { createHash } from \"node:crypto\";\n\nexport const RULESET_PII = \"pii@1\";\n\nconst EMAIL = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g;\n/** E.164 and common national forms: an optional +, 7\u201315 digits with separators,\n * optional area-code parentheses. A version number (22.23.1) or an IP never matches:\n * the run must not sit between dots, and needs \u2265 7 digits. */\nconst PHONE = /(?<![\\w.])(?:\\+\\d{1,3}[ .-]?)?(?:\\(\\d{2,4}\\)[ .-]?)?\\d{2,4}(?:[ .-]?\\d{2,4}){1,3}(?!\\w)/g;\n\nfunction looksPhone(s: string): boolean {\n const digits = s.replace(/\\D/g, \"\");\n if (digits.length < 7 || digits.length > 15) return false;\n // \"port 8891, pr 12345\": a bare run with no separator or + is a number, not a phone.\n if (!/[+() .-]/.test(s)) return false;\n // \"22.23.1\", \"185.199.108.153\": dots alone are a version or an address.\n if (!/[+() -]/.test(s)) return false;\n return true;\n}\n\n/** Replace emails and phone numbers, and write `home` as `~`. */\nexport function reducePii(text: string, home?: string): string {\n if (!text) return text;\n let out = text.replace(EMAIL, \"[email]\");\n out = out.replace(PHONE, (m) => (looksPhone(m) ? \"[phone]\" : m));\n if (home) {\n const h = home.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n out = out.replace(new RegExp(`(?<![A-Za-z0-9_])${h}(?=/|$|\\\\s|[\"'\\`])`, \"g\"), \"~\");\n }\n return out;\n}\n\n/** The machine's name under pii@1: the first 8 hex of its SHA-256. */\nexport function hashMachine(name: string): string {\n return createHash(\"sha256\").update(name).digest(\"hex\").slice(0, 8);\n}\n\n/** Apply pii@1 to every string in a value; `home` becomes `~`. */\nexport function reducePiiDeep<T>(v: T, home?: string): T {\n if (typeof v === \"string\") return reducePii(v, home) as T;\n if (Array.isArray(v)) return v.map((x) => reducePiiDeep(x, home)) as T;\n if (v && typeof v === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) out[k] = reducePiiDeep(x, home);\n return out as T;\n }\n return v;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// secrets@1 \u2014 credentials out of every string, on the person's machine, before an\n// event reaches the outbox. Ported from spacesheep-cli lib/redact.js (Michael\n// Makarov, MIT \u2192 Apache-2.0, see NOTICE). The ruleset is defined in\n// spec/PRIVACY.md \u00A72 and pinned by conformance/redaction/secrets.json.\n//\n// Every pattern is linear: bounded repetition, no nested quantifiers. The\n// adversarial vectors (password_ \u00D7 5000, a 50 000-space run) pin that.\n\nexport const RULESET_SECRETS = \"secrets@1\";\nexport const REDACTED = \"[redacted]\";\n\n/** Token formats that are a credential by their shape alone. Each is anchored on a\n * vendor prefix, so a commit sha or a UUID never matches. */\nconst TOKEN_PATTERNS: RegExp[] = [\n /-----BEGIN [A-Z0-9 ]*PRIVATE KEY(?: BLOCK)?-----[\\s\\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY(?: BLOCK)?-----|$)/g,\n /\\b(?:AKIA|ASIA|ABIA|ACCA)[0-9A-Z]{16}\\b/g, // AWS access key id\n /\\bgh[pousr]_[A-Za-z0-9]{30,}\\b/g, // GitHub\n /\\bgithub_pat_[A-Za-z0-9_]{30,}\\b/g,\n /\\bglpat-[A-Za-z0-9_-]{20,}\\b/g, // GitLab\n /\\bxox[abposre]-[A-Za-z0-9-]{10,}\\b/g, // Slack\n /\\bhttps:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]+/g,\n /\\bhttps:\\/\\/(?:ptb\\.|canary\\.)?discord(?:app)?\\.com\\/api\\/webhooks\\/[0-9]+\\/[A-Za-z0-9_-]+/g,\n /\\bsk-(?:ant-|proj-|svcacct-|admin-|or-v1-)?[A-Za-z0-9_-]{20,}\\b/g, // Anthropic, OpenAI, DeepSeek, OpenRouter\n /\\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\\b/g, // Stripe secret / restricted\n /\\bwhsec_[A-Za-z0-9+/=]{20,}/g, // Stripe / Svix / Standard Webhooks secret\n /\\bAIza[0-9A-Za-z_-]{35}\\b/g, // Google API key\n /\\bya29\\.[0-9A-Za-z_-]{20,}/g, // Google OAuth access token\n /\\b1\\/\\/0[0-9A-Za-z_-]{30,}/g, // Google OAuth refresh token\n /\\bGOCSPX-[0-9A-Za-z_-]{20,}/g, // Google OAuth client secret\n /\\bxai-[A-Za-z0-9]{30,}\\b/g,\n /\\bgsk_[A-Za-z0-9]{30,}\\b/g, // Groq\n /\\bpplx-[A-Za-z0-9]{30,}\\b/g, // Perplexity\n /\\bhf_[A-Za-z0-9]{30,}\\b/g, // Hugging Face\n /\\bpcsk_[A-Za-z0-9_]{30,}\\b/g, // Pinecone\n /\\bnpm_[A-Za-z0-9]{30,}\\b/g,\n /\\bpypi-[A-Za-z0-9_-]{50,}/g,\n /\\bSG\\.[A-Za-z0-9_-]{16,}\\.[A-Za-z0-9_-]{16,}/g, // SendGrid\n /\\bshp(?:at|ss|ca|pa)_[a-fA-F0-9]{32}\\b/g, // Shopify\n /\\bdop_v1_[a-f0-9]{64}\\b/g, // DigitalOcean\n /\\b(?:lin_api|lin_oauth)_[A-Za-z0-9]{30,}\\b/g, // Linear\n /\\b(?:ntn|secret)_[A-Za-z0-9]{40,}\\b/g, // Notion\n /\\bsbp_[a-f0-9]{40}\\b/g, // Supabase\n /\\bfigd_[A-Za-z0-9_-]{30,}/g, // Figma\n /\\bdp\\.(?:pt|st|sa|ct)\\.[A-Za-z0-9]{30,}/g, // Doppler\n /\\bgrn_[A-Za-z0-9_-]{20,}/g, // Granola\n /\\bss_[a-f0-9]{32,}\\b/g, // spacesheep API keys\n /\\b[0-9]{8,10}:AA[A-Za-z0-9_-]{33}\\b/g, // Telegram bot token\n /\\beyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g, // JWT\n];\n/** `scheme://user:password@host` \u2014 the password goes, the user and host stay. */\nconst URL_CREDENTIALS = /\\b([a-z][a-z0-9+.-]{1,20}:\\/\\/[^\\s:/@'\"`<>]{1,100}:)([^\\s@/'\"`<>]{1,200})(@)/gi;\n/** `Authorization: Bearer \u2026` / `Basic \u2026`, and a bare `Bearer <token>` in a curl line. */\nconst AUTH_HEADER = /\\b((?:Bearer|Basic|Token)\\s+)([A-Za-z0-9._~+/=-]{16,})/g;\n// The words that name a secret, in prose. `key` alone is too common (\"the key\n// point\"), so it only counts with a qualifier.\nconst SECRET_WORD =\n \"(?:pass(?:word|wd|phrase|code)?s?|pwd|secret(?:[ _-]?key)?s?|client[ _-]?secret|api[ _-]?keys?|apikeys?|access[ _-]?keys?|access[ _-]?tokens?|auth[ _-]?tokens?|refresh[ _-]?tokens?|private[ _-]?keys?|tokens?|credentials?|creds)\";\n/** Strict form: a NAME, an explicit separator (`=`, `:`, `=>`), a value. The name is\n * one flat run of identifier characters judged in code (isSecretName), never by a\n * nested pattern. Only a secret name goes on to consume its value \u2014 otherwise\n * `https:` would swallow the `?token=\u2026` behind it. */\nconst NAME_SEP = /(?<![A-Za-z0-9_])([A-Za-z][A-Za-z0-9_-]{1,79})([\"']?\\s{0,3}(?::=|=>|=|:)\\s{0,3})/g;\nconst VALUE = /\"([^\"\\n]{1,300})\"|'([^'\\n]{1,300})'|`([^`\\n]{1,300})`|([^\\s\"'`,;&)}\\]]{1,300})/y;\n\nfunction redactAssignments(text: string): string {\n let out = \"\";\n let last = 0;\n NAME_SEP.lastIndex = 0;\n for (let m = NAME_SEP.exec(text); m; m = NAME_SEP.exec(text)) {\n const name = m[1] ?? \"\";\n if (!isSecretName(name)) continue;\n VALUE.lastIndex = NAME_SEP.lastIndex;\n const v = VALUE.exec(text);\n if (!v) continue;\n const value = v[1] ?? v[2] ?? v[3] ?? v[4] ?? \"\";\n NAME_SEP.lastIndex = VALUE.lastIndex;\n if (isPlaceholder(value) || value.includes(REDACTED)) continue;\n // `max_tokens: 4096`, `input_tokens=12k` \u2014 a token COUNT, not a token.\n if (/tokens?$/i.test(name) && /^\\d+(?:[.,]\\d+)*[km]?$/i.test(value)) continue;\n const q = v[1] != null ? '\"' : v[2] != null ? \"'\" : v[3] != null ? \"`\" : \"\";\n out += text.slice(last, v.index) + q + REDACTED + q;\n last = VALUE.lastIndex;\n }\n return last ? out + text.slice(last) : text;\n}\n\n/** Is this identifier the name of a secret? `DB_PASSWORD`, `apiKey`, `client-secret`,\n * `AWS_SECRET_ACCESS_KEY`, `GITHUB_TOKEN`; an env-style `STRIPE_KEY` too. Not\n * `password_hash`, `tokenizer`, `sort_key`. */\nexport function isSecretName(name: string): boolean {\n if (/^[A-Z0-9_]+_KEY$/.test(name)) return true;\n const flat = name.toLowerCase().replace(/[_-]/g, \"\");\n return /(?:pass(?:word|wd|phrase|code)|pwd|secret|secretkey|secretaccesskey|clientsecret|apikey|accesskey|accesstoken|authtoken|refreshtoken|privatekey|token|credential|creds)s?$/.test(\n flat,\n );\n}\n\n/** Loose form: prose. \"password is Hunter2!\", \"the token was ghx\u2026\". Only a value\n * that looks generated counts, so \"the password is wrong\" passes untouched.\n * Whitespace runs are bounded so a long run can't make the match quadratic. */\nconst PROSE = new RegExp(\n `(\\\\b${SECRET_WORD}(?:[ \\\\t]{1,3}(?:is|was|=|:|to|as|of|for[ \\\\t]{1,3}\\\\S{1,40}[ \\\\t]{1,3}is))?[ \\\\t]{1,3})([\"'\\`]?)([^\\\\s\"'\\`]{6,200})\\\\2`,\n \"gi\",\n);\n\n/** A value that is plainly not the secret itself: a type, a variable, a template, an\n * already-redacted marker, an env lookup. */\nfunction isPlaceholder(v: string): boolean {\n const s = v.replace(/[.,;:!?]+$/, \"\");\n if (!s) return true;\n if (\n /^(?:string|number|boolean|bool|str|int|any|unknown|null|undefined|none|nil|true|false|optional|required|text|varchar|password|secret|token|env|string\\[\\]|object|bytes)$/i.test(\n s,\n )\n )\n return true;\n if (/^\\[?redacted\\]?$/i.test(s) || /^\\*+$/.test(s) || /^x{3,}$/i.test(s) || /^\\.{3}$|^\u2026$/.test(s)) return true;\n if (/^[<{$%]/.test(s)) return true; // <your-key>, ${VAR}, {{var}}, $VAR, %VAR%\n if (\n /^(?:process\\.env|env|os\\.environ|c\\.env|this\\.env|import\\.meta\\.env|getenv|config|settings|secrets|args|opts|options|req|request|body|params|input|data|user|self|this)\\b/i.test(\n s,\n )\n )\n return true;\n if (/^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)+$/.test(s)) return true; // a member path: form.password\n if (/[(]/.test(s)) return true; // a call: hash(pw), getSecret()\n if (/^(?:your|my|the|a|an|some|new|old)[-_ ]/i.test(s)) return true; // your-api-key\n return false;\n}\n\n/** Does a prose value look like something generated, rather than an English word? */\nfunction looksSecret(v: string): boolean {\n const s = v.replace(/[.,;:!?)]+$/, \"\");\n if (s.length < 6) return false;\n if (isPlaceholder(s)) return false;\n if (/^https?:\\/\\//i.test(s)) return false; // a link, handled by URL_CREDENTIALS if it carries one\n if (/^[a-z]+(?:[-'][a-z]+)*$/.test(s)) return false; // a lowercase word\n if (/^[A-Z][a-z]+$/.test(s)) return false; // a capitalised word\n if (/^\\d+(?:[.,]\\d+)*[a-z%]*$/i.test(s)) return false; // a count: 4096, 128k, 3.5, 50%\n if (/^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+$/.test(s)) return false; // an env var's NAME\n const kinds = [/[a-z]/, /[A-Z]/, /[0-9]/, /[^A-Za-z0-9]/].filter((r) => r.test(s)).length;\n return kinds >= 3 || (/[0-9]/.test(s) && /[A-Za-z]/.test(s));\n}\n\n/** Redact every credential in `text`. Returns the same string when there is none. */\nexport function redactSecrets(text: string): string {\n if (!text) return text;\n let out = text;\n for (const re of TOKEN_PATTERNS) out = out.replace(re, REDACTED);\n out = out.replace(URL_CREDENTIALS, (_m, head: string, _pw: string, at: string) => `${head}${REDACTED}${at}`);\n out = out.replace(AUTH_HEADER, (m, head: string, v: string) => (v.includes(REDACTED) ? m : `${head}${REDACTED}`));\n out = redactAssignments(out);\n out = out.replace(PROSE, (m, head: string, q: string, v: string) =>\n !looksSecret(v) || v.includes(REDACTED) ? m : `${head}${q}${REDACTED}${q}`,\n );\n return out;\n}\n\n/** Did redaction change anything? */\nexport function hasSecret(text: string): boolean {\n return !!text && redactSecrets(text) !== text;\n}\n\n/** Redact every string in a JSON-able value (keys are left alone). */\nexport function redactDeep<T>(v: T): T {\n if (typeof v === \"string\") return redactSecrets(v) as T;\n if (Array.isArray(v)) return v.map(redactDeep) as T;\n if (v && typeof v === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) out[k] = redactDeep(x);\n return out as T;\n }\n return v;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// filter(event, tier, pii): the pure function every sink runs an event through.\n// Removes by ALLOWLIST per type and tier (spec/PRIVACY.md \u00A71), redacts every string\n// above tier 0 with secrets@1, and runs pii@1 when asked. Returns null when the\n// type is not carried at the tier. The conformance runner runs the same function.\nimport type { Event, Tier } from \"../types.js\";\nimport { hashMachine, RULESET_PII, reducePiiDeep } from \"./pii.js\";\nimport { RULESET_SECRETS, redactDeep } from \"./secrets.js\";\n\n/** The lowest tier that carries each known type (kept in step with schema/v1.ts). */\nexport const TYPE_TIER: Record<string, Tier> = {\n \"session.started\": 0,\n \"session.heartbeat\": 0,\n \"session.ended\": 0,\n \"session.backfill\": 0,\n \"session.forgotten\": 0,\n \"turn.started\": 0,\n \"turn.ended\": 0,\n \"turn.transcript\": 2,\n \"tool.started\": 1,\n \"tool.ended\": 1,\n \"files.changed\": 1,\n \"attention.needed\": 0,\n \"attention.cleared\": 0,\n \"subagent.started\": 1,\n \"subagent.ended\": 1,\n \"context.compacted\": 1,\n native: 3,\n};\n\n/** data keys allowed per type at tier N (cumulative: tier 1 includes tier 0's). */\nconst DATA_ALLOW: Record<string, Partial<Record<Tier, string[]>>> = {\n \"session.started\": { 0: [\"source\"] },\n \"session.heartbeat\": { 0: [] },\n \"session.ended\": { 0: [\"reason\"] },\n \"session.backfill\": { 0: [\"started_at\", \"last_at\", \"turns\"] },\n \"session.forgotten\": { 0: [] },\n \"turn.started\": { 0: [\"turn_id\"], 1: [\"prompt_chars\"] },\n \"turn.ended\": { 0: [\"turn_id\", \"reason\", \"ms\"], 1: [\"error\"] },\n \"turn.transcript\": { 2: [\"turn\", \"user\", \"assistant\", \"at\"] },\n \"tool.started\": { 1: [\"tool\", \"call_id\", \"turn_id\", \"agent_id\"], 3: [\"input\"] },\n \"tool.ended\": { 1: [\"tool\", \"call_id\", \"turn_id\", \"agent_id\", \"ms\", \"ok\", \"error\"], 3: [\"input\", \"output\"] },\n \"files.changed\": { 1: [\"paths\"] },\n \"attention.needed\": { 0: [\"attention_id\", \"kind\"], 1: [\"tool\", \"message\"] },\n \"attention.cleared\": { 0: [\"attention_id\", \"how\"] },\n \"subagent.started\": { 1: [\"agent_id\", \"agent_type\"] },\n \"subagent.ended\": { 1: [\"agent_id\", \"agent_type\"] },\n \"context.compacted\": { 1: [\"trigger\"] },\n};\n\nconst SESSION_ALLOW = [\n \"id\",\n \"seq\",\n \"machine\",\n \"cwd\",\n \"repo\",\n \"branch\",\n \"model\",\n \"title\",\n \"title_source\",\n \"url\",\n \"account_id\",\n \"parent_id\",\n];\nconst MAX_SIDE = 20_000;\nconst MAX_IO = 64 * 1024;\n\nfunction allowedKeys(type: string, tier: Tier): string[] | null {\n const table = DATA_ALLOW[type];\n if (!table) return null; // unknown type: kept whole (receivers keep extra keys), redacted\n const out: string[] = [];\n for (let t = 0; t <= tier; t++) for (const k of table[t as Tier] ?? []) out.push(k);\n return out;\n}\n\nfunction cap(v: unknown, max: number): unknown {\n if (typeof v === \"string\") return v.length > max ? `${v.slice(0, max)}\u2026` : v;\n if (v && typeof v === \"object\") {\n const s = JSON.stringify(v);\n return s.length > max ? `${s.slice(0, max)}\u2026` : v;\n }\n return v;\n}\n\nexport interface FilterOptions {\n /** The person's home directory, for pii@1's `~` rewrite. */\n home?: string;\n}\n\n/** The event as a sink at `tier` may see it, or null when the type is above the tier. */\nexport function filterEvent(event: Event, tier: Tier, pii: boolean, opts: FilterOptions = {}): Event | null {\n const minTier = TYPE_TIER[event.type];\n if (minTier !== undefined && minTier > tier) return null;\n if (event.type === \"native\" && tier < 3) return null;\n\n const session: Record<string, unknown> = {};\n for (const k of SESSION_ALLOW)\n if (event.session[k as keyof typeof event.session] !== undefined)\n session[k] = event.session[k as keyof typeof event.session];\n\n let data: Record<string, unknown> = {};\n const keys = allowedKeys(event.type, tier);\n if (keys === null) data = { ...event.data };\n else for (const k of keys) if (event.data[k] !== undefined) data[k] = event.data[k];\n if (typeof data.user === \"string\") data.user = cap(data.user, MAX_SIDE);\n if (typeof data.assistant === \"string\") data.assistant = cap(data.assistant, MAX_SIDE);\n if (data.input !== undefined) data.input = cap(data.input, MAX_IO);\n if (data.output !== undefined) data.output = cap(data.output, MAX_IO);\n if (typeof data.message === \"string\") data.message = cap(data.message, 200);\n\n const rulesets: string[] = [];\n let out: Event = { ...event, tier, session: session as Event[\"session\"], data, privacy: { rulesets, pii } };\n if (tier > 0) {\n // Redact, then the caps above already applied: a cut before redaction could leave half a key.\n out = { ...out, session: redactDeep(out.session), data: redactDeep(out.data) };\n rulesets.push(RULESET_SECRETS);\n }\n if (pii) {\n const s = reducePiiDeep(out.session, opts.home) as Record<string, unknown>;\n if (typeof s.machine === \"string\") s.machine = hashMachine(s.machine);\n delete s.account_id;\n out = { ...out, session: s as Event[\"session\"], data: reducePiiDeep(out.data, opts.home) };\n rulesets.push(RULESET_PII);\n }\n out.privacy = { rulesets, pii };\n return out;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// file:PATH \u2014 append filtered events as JSONL. The zero-server sink.\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Event, Tier } from \"../types.js\";\nimport type { DeliveryResult, Sink } from \"./types.js\";\n\nexport class FileSink implements Sink {\n constructor(\n readonly name: string,\n readonly file: string,\n readonly tier: Tier,\n readonly pii: boolean,\n ) {}\n async send(events: Event[]): Promise<DeliveryResult> {\n try {\n mkdirSync(path.dirname(this.file), { recursive: true });\n appendFileSync(this.file, `${events.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`);\n return { ok: true, acknowledged: events.length, accepted: events.length, duplicates: 0, rejected: [] };\n } catch (e) {\n return { ok: false, acknowledged: 0, error: String((e as Error).message), action: \"retry\" };\n }\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// stdout \u2014 one JSON line per event to a writable (the worker's stdout is ignored\n// when spawned by a hook, so this sink is for `sessionpipe tail` and tests).\nimport type { Event, Tier } from \"../types.js\";\nimport type { DeliveryResult, Sink } from \"./types.js\";\n\nexport class StdoutSink implements Sink {\n constructor(\n readonly name: string,\n readonly tier: Tier,\n readonly pii: boolean,\n private readonly write: (line: string) => void = (l) => process.stdout.write(`${l}\\n`),\n ) {}\n async send(events: Event[]): Promise<DeliveryResult> {\n for (const e of events) this.write(JSON.stringify(e));\n return { ok: true, acknowledged: events.length, accepted: events.length, duplicates: 0, rejected: [] };\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// `sessionpipe control pair | keys | off | run | status` and `sessionpipe wait`.\nimport { existsSync, realpathSync, watchFile } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { claudeControl, claudeDirs, readConfig, stateDir } from \"@sessionpipe/core\";\n\nconst { detectCaps, findClaude, runClaude } = claudeControl;\n\nimport { ControlDaemon } from \"./daemon.js\";\nimport { ask, socketPath } from \"./local.js\";\nimport { installService, off, pair, removeKey, uninstallService } from \"./pair.js\";\nimport { loadSdk } from \"./sdk.js\";\nimport { controlFile, controlState, readControl } from \"./store.js\";\nimport { waitForMessage, waitSession } from \"./wait.js\";\n\nexport const CONTROL_HELP = ` sessionpipe control pair <receiver> [--folder DIR]\u2026 [--mode safe|auto] [--token T] [--name N] [--no-service]\n sessionpipe control status | keys [remove <id>] | off [<receiver>] | run\n sessionpipe wait [--session <harness>:<id>] (a session runs this in the background)`;\n\nexport async function controlMain(argv: string[], out: (s?: string) => void, distDir: string): Promise<void> {\n const flag = (n: string) => {\n const i = argv.indexOf(n);\n return i >= 0 ? argv[i + 1] : undefined;\n };\n const flags = (n: string) => argv.flatMap((a, i) => (a === n && argv[i + 1] ? [argv[i + 1] as string] : []));\n const sub = argv[1];\n switch (sub) {\n case \"pair\": {\n const url = argv[2];\n if (!url || !/^https?:\\/\\//.test(url)) return out(`usage:\\n${CONTROL_HELP}`);\n const cfg = readConfig();\n const sink = cfg.sinks.find((s) => s.url.replace(/\\/$/, \"\") === url.replace(/\\/$/, \"\"));\n const token = flag(\"--token\") ?? sink?.token;\n if (!token)\n return out(\n ` No token for ${url}: add it as a sink first (\\`sessionpipe sink add ${url} --token \u2026\\`) or pass --token.`,\n );\n const folders = flags(\"--folder\");\n const existing = readControl();\n if (!folders.length && !existing?.folders.length) folders.push(process.cwd());\n await pair({\n url,\n token,\n folders,\n mode: flag(\"--mode\") === \"auto\" ? \"auto\" : (existing?.mode ?? \"safe\"),\n name: flag(\"--name\") ?? existing?.name ?? cfg.machine ?? os.hostname(),\n out,\n });\n const c = readControl()!;\n out(` Folders sessions may run in: ${c.folders.join(\", \")}`);\n out(\n ` Mode: ${c.mode} (${c.mode === \"safe\" ? \"nothing that needs approval runs unattended\" : \"Claude Code's auto mode\"})`,\n );\n let cli = path.join(distDir, \"cli.js\");\n try {\n cli = realpathSync(cli);\n } catch {}\n if (argv.includes(\"--no-service\"))\n out(\" Daemon: not installed as a service (--no-service); run `sessionpipe control run` yourself\");\n else out(` Daemon: ${installService({ node: process.execPath, cli })}`);\n return;\n }\n case \"keys\": {\n const c = readControl();\n if (argv[2] === \"remove\" && argv[3]) {\n const n = removeKey(argv[3]);\n return out(n ? ` removed ${n} key(s)` : \" no such key\");\n }\n if (!c?.receivers.length)\n return out(\" control isn't paired on this machine (`sessionpipe control pair <receiver>`)\");\n for (const r of c.receivers) {\n out(` ${r.url} \u00B7 machine ${r.machine}`);\n for (const k of r.keys)\n out(` ${k.id.slice(0, 16)}\u2026 ${k.alg === -7 ? \"ES256\" : \"RS256\"} added ${k.added_at.slice(0, 10)}`);\n }\n return;\n }\n case \"off\": {\n const c = await off({ out, ...(argv[2] ? { url: argv[2] } : {}) });\n if (c && !c.receivers.length) uninstallService();\n return;\n }\n case \"status\": {\n const r = await ask(socketPath(stateDir()), { op: \"status\" }, 2000);\n if (r?.op !== \"status\") return out(\" the control daemon isn't running\");\n return out(JSON.stringify(r.status, null, 2));\n }\n case \"run\":\n return runDaemon(out);\n default:\n return out(CONTROL_HELP);\n }\n}\n\nasync function runDaemon(out: (s?: string) => void): Promise<void> {\n const cfg = readControl();\n if (!cfg?.receivers.length) {\n out(\"control isn't paired on this machine; nothing to do (`sessionpipe control pair <receiver>`)\");\n return;\n }\n const log = (s: string) => out(`${new Date().toISOString()} ${s}`);\n let claude: { bin: string; caps: ReturnType<typeof detectCaps>; sig: string } | null = null;\n const claudeNow = () => {\n const bin = findClaude();\n if (!bin) return null;\n const sig = `${bin}:${existsSync(bin) ? realpathSync(bin) : \"\"}`;\n if (claude?.sig !== sig) claude = { bin, caps: detectCaps(bin), sig };\n return claude;\n };\n const sdk = await loadSdk({ claudeBin: findClaude(), env: process.env, log });\n const d = new ControlDaemon(cfg, controlState(), socketPath(stateDir()), {\n now: Date.now,\n fetch,\n log,\n claudeDirs: () => claudeDirs(),\n claude: claudeNow,\n run: runClaude,\n sdk,\n });\n await d.start();\n watchFile(controlFile(), { interval: 5000 }, () => {\n const next = readControl();\n if (next) d.reload(next);\n });\n const bye = async () => {\n await d.stop();\n process.exit(0);\n };\n process.on(\"SIGTERM\", bye);\n process.on(\"SIGINT\", bye);\n}\n\nexport async function waitMain(argv: string[], out: (s?: string) => void): Promise<void> {\n const i = argv.indexOf(\"--session\");\n const session = waitSession(i >= 0 ? argv[i + 1] : undefined);\n if (!session) {\n out(\"sessionpipe wait: which session? Pass --session <harness>:<id> (Claude Code sets CLAUDE_CODE_SESSION_ID).\");\n process.exitCode = 2;\n return;\n }\n out(await waitForMessage(session));\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The control daemon (spec/CONTROL.md): one process per computer. It holds one\n// long-poll per paired receiver, verifies every command itself against the keys\n// enrolled at this terminal, and delivers each one the cheapest way the session\n// allows \u2014 to a parked waiter, at the session's next Stop, to a session it holds\n// through the Agent SDK, or by a headless resume or fork \u2014 then acks how.\n//\n// A receiver can queue a message; it can never make this process run one.\nimport { existsSync, mkdirSync, realpathSync, statSync, unlinkSync } from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport { claudeControl, redactSecrets } from \"@sessionpipe/core\";\nimport { type ControlCommand, parseSessionRef, verifyCommand } from \"@sessionpipe/core/control\";\nimport type { LocalReply, LocalRequest } from \"./local.js\";\nimport { awaitAnswer, transcriptEnd } from \"./reply.js\";\nimport { type DeliveryMode, frame, IN_PLACE_ANSWER, kindPath, routePrompt } from \"./route.js\";\nimport {\n type Ack,\n AckOutbox,\n type ControlConfig,\n type DaemonState,\n NonceStore,\n type PairedReceiver,\n readState,\n writeState,\n} from \"./store.js\";\n\nconst {\n claudeEnv,\n findTranscript,\n isUuid,\n JOB_TIMEOUT_MS,\n liveProcess,\n modeFlags,\n parseResult,\n recentlyWritten,\n sessionFolder,\n} = claudeControl;\ntype Caps = claudeControl.Caps;\ntype RunResult = claudeControl.RunResult;\n\ndeclare const __SESSIONPIPE_VERSION__: string;\nconst VERSION = typeof __SESSIONPIPE_VERSION__ === \"string\" ? __SESSIONPIPE_VERSION__ : \"0.0.0\";\n\nconst MAX_REPLY = 20_000;\nconst HELLO_EVERY_MS = 10 * 60_000;\n/** A message waiting for a Stop that never comes goes another way after this. */\nconst TURN_FALLBACK_MS = 30 * 60_000;\n/** How long the daemon follows a session's turn for the answer to an in-place\n * message before acking it delivered without one. */\nconst ANSWER_WAIT_MS = 30 * 60_000;\n/** How long a Stop hook may take to be answered. */\nconst RECENT_ACKS_MS = 25 * 3600_000;\n/** Events that prove a pending permission prompt was resolved some other way. */\nconst CLOSES_ATTENTION = new Set([\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n \"StopFailure\",\n \"UserPromptSubmit\",\n \"SessionEnd\",\n]);\n\n/** The message as the receiver carried it (control.json). */\nexport interface Carried {\n id: string;\n cmd: string;\n csig?: string | null;\n grant?: { str: string; cred: string; ad: string; cd: string; sig: string } | null;\n confirm?: { cred: string; ad: string; cd: string; sig: string } | null;\n at: string;\n expires_at: string;\n}\n\n/** A session the Agent SDK holds for the daemon (sdk.ts; a fake in tests). */\nexport interface SdkSession {\n /** Deliver one message; resolves with the agent's reply when the turn ends. */\n send(text: string): Promise<{ reply: string; error?: string }>;\n interrupt(): Promise<void>;\n close(): void;\n readonly busy: boolean;\n readonly lastUsed: number;\n}\nexport interface SdkHost {\n start(o: { session: string; cwd: string; mode: \"safe\" | \"auto\"; configDir?: string }): SdkSession;\n}\n\nexport interface DaemonDeps {\n now: () => number;\n fetch: typeof fetch;\n log: (line: string) => void;\n claudeDirs: () => string[];\n claude: () => { bin: string; caps: Caps } | null;\n run: (\n bin: string,\n args: string[],\n o: { cwd: string; env: NodeJS.ProcessEnv; timeoutMs?: number },\n ) => Promise<RunResult>;\n sdk?: SdkHost | null;\n /** How long to follow a live session's turn for an in-place answer (tests shorten it). */\n answerWaitMs?: number;\n /** Close an SDK session idle this long (a held session costs ~300 MB). */\n sdkIdleMs?: number;\n env?: NodeJS.ProcessEnv;\n}\n\ninterface TurnPending {\n receiver: PairedReceiver;\n msgId: string;\n text: string;\n session: string;\n queuedAt: number;\n}\n\ninterface Live {\n midTurn: boolean;\n /** The Stop hook just delivered a block: the next Stop event continues the turn. */\n continued: boolean;\n waiter: net.Socket | null;\n turnQueue: TurnPending[];\n attentions: Map<string, net.Socket>;\n cwd?: string;\n transcript?: string;\n lastEvent: number;\n}\n\nexport interface Status {\n version: string;\n name: string;\n receivers: {\n url: string;\n machine: string;\n keys: number;\n polling: boolean;\n last_poll: number | null;\n last_error: string | null;\n }[];\n waiting: string[];\n mid_turn: string[];\n attentions: { session: string; id: string }[];\n sdk: string[];\n nonces: number;\n acks_pending: number;\n delivered: Record<string, number>;\n}\n\n/** The machine's own caps (CONTROL.md \u00A76 `start`): every command is the owner's,\n * signed, but a burst of them must not start a crowd of agents. A start beyond the\n * caps is refused `start_limit`; a headless run beyond `headless` waits its turn. */\nexport const LIMITS = { startConcurrent: 2, startPerHour: 10, headless: 3 } as const;\n\nexport class ControlDaemon {\n private server: net.Server | null = null;\n private readonly live = new Map<string, Live>();\n private readonly sdkSessions = new Map<string, SdkSession>();\n private readonly nonces: NonceStore;\n private readonly acks: AckOutbox;\n private readonly recentAcks = new Map<string, { ack: Ack; at: number }>();\n private readonly inflight = new Set<string>();\n private readonly queues = new Map<string, Promise<unknown>>();\n private readonly lastEnd = new Map<string, number>();\n private state: DaemonState;\n private running = false;\n private readonly polling = new Map<string, { last: number | null; error: string | null; on: boolean }>();\n private readonly delivered: Record<string, number> = {};\n private helloTimer: NodeJS.Timeout | null = null;\n private helloSoon: NodeJS.Timeout | null = null;\n private readonly aborts = new Set<AbortController>();\n private startsRunning = 0;\n private startTimes: number[] = [];\n private procs = 0;\n private readonly procWaiters: (() => void)[] = [];\n\n constructor(\n private cfg: ControlConfig,\n private readonly dir: string,\n private readonly sock: string,\n private readonly deps: DaemonDeps,\n ) {\n this.nonces = new NonceStore(path.join(dir, \"nonces.jsonl\"), deps.now);\n this.acks = new AckOutbox(path.join(dir, \"acks.jsonl\"));\n this.state = readState(path.join(dir, \"state.json\"));\n }\n\n // --- lifecycle ------------------------------------------------------------------\n\n async start(): Promise<void> {\n this.running = true;\n mkdirSync(this.dir, { recursive: true, mode: 0o700 });\n await this.listen();\n for (const r of this.cfg.receivers) void this.pollLoop(r);\n this.helloTimer = setInterval(() => void this.helloAll(), HELLO_EVERY_MS);\n this.helloTimer.unref();\n void this.helloAll();\n void this.flushAcks();\n const idle = setInterval(() => this.closeIdleSdk(), 60_000);\n idle.unref();\n this.deps.log(`control daemon ${VERSION} up \u00B7 ${this.cfg.receivers.length} receiver(s) \u00B7 socket ${this.sock}`);\n }\n\n async stop(): Promise<void> {\n this.running = false;\n for (const a of this.aborts) a.abort();\n if (this.helloTimer) clearInterval(this.helloTimer);\n if (this.helloSoon) clearTimeout(this.helloSoon);\n for (const s of this.sdkSessions.values()) s.close();\n for (const l of this.live.values()) {\n l.waiter?.destroy();\n for (const a of l.attentions.values()) a.destroy();\n }\n await new Promise<void>((r) => (this.server ? this.server.close(() => r()) : r()));\n if (process.platform !== \"win32\")\n try {\n unlinkSync(this.sock);\n } catch {}\n }\n\n reload(cfg: ControlConfig): void {\n const known = new Set(this.cfg.receivers.map((r) => r.control + r.machine));\n this.cfg = cfg;\n for (const r of cfg.receivers) if (!known.has(r.control + r.machine)) void this.pollLoop(r);\n }\n\n status(): Status {\n return {\n version: VERSION,\n name: this.cfg.name,\n receivers: this.cfg.receivers.map((r) => {\n const p = this.polling.get(r.control + r.machine);\n return {\n url: r.url,\n machine: r.machine,\n keys: r.keys.length,\n polling: !!p?.on,\n last_poll: p?.last ?? null,\n last_error: p?.error ?? null,\n };\n }),\n waiting: [...this.live].filter(([, l]) => l.waiter).map(([k]) => k),\n mid_turn: [...this.live].filter(([, l]) => l.midTurn).map(([k]) => k),\n attentions: [...this.live].flatMap(([k, l]) => [...l.attentions.keys()].map((id) => ({ session: k, id }))),\n sdk: [...this.sdkSessions.keys()],\n nonces: this.nonces.size,\n acks_pending: this.acks.all().length,\n delivered: { ...this.delivered },\n };\n }\n\n // --- the local socket -----------------------------------------------------------\n\n private listen(): Promise<void> {\n if (process.platform !== \"win32\") {\n try {\n if (existsSync(this.sock)) unlinkSync(this.sock);\n } catch {}\n }\n this.server = net.createServer((s) => this.onConn(s));\n return new Promise((resolve, reject) => {\n this.server!.once(\"error\", reject);\n this.server!.listen(this.sock, () => resolve());\n });\n }\n\n private onConn(s: net.Socket): void {\n let buf = \"\";\n let handled = false;\n s.on(\"error\", () => {});\n s.on(\"data\", (d) => {\n if (handled) return;\n buf += d.toString(\"utf8\");\n if (buf.length > 64 * 1024) return s.destroy();\n const i = buf.indexOf(\"\\n\");\n if (i < 0) return;\n handled = true;\n let req: LocalRequest;\n try {\n req = JSON.parse(buf.slice(0, i)) as LocalRequest;\n } catch {\n return s.destroy();\n }\n this.onRequest(req, s);\n });\n }\n\n private reply(s: net.Socket, r: LocalReply): void {\n try {\n s.end(`${JSON.stringify(r)}\\n`);\n } catch {}\n }\n\n private liveOf(session: string): Live {\n let l = this.live.get(session);\n if (!l) {\n l = {\n midTurn: false,\n continued: false,\n waiter: null,\n turnQueue: [],\n attentions: new Map(),\n lastEvent: this.deps.now(),\n };\n this.live.set(session, l);\n }\n return l;\n }\n\n private onRequest(req: LocalRequest, s: net.Socket): void {\n switch (req.op) {\n case \"status\":\n this.reply(s, { op: \"status\", status: this.status() });\n return;\n case \"wait\": {\n if (!parseSessionRef(req.session)) {\n this.reply(s, { op: \"none\" });\n return;\n }\n const l = this.liveOf(req.session);\n if (l.waiter && l.waiter !== s) this.reply(l.waiter, { op: \"replaced\" });\n l.waiter = s;\n s.on(\"close\", () => {\n if (l.waiter === s) {\n l.waiter = null;\n this.scheduleHello();\n }\n });\n this.scheduleHello();\n return;\n }\n case \"stop\": {\n const l = this.liveOf(req.session);\n l.lastEvent = this.deps.now();\n const p = this.takeTurn(l);\n if (!p) {\n this.reply(s, { op: \"none\" });\n return;\n }\n l.continued = true;\n const from = this.answerFrom(req.session);\n this.reply(s, { op: \"block\", reason: `${frame(p.text, p.receiver.url)}\\n\\n${IN_PLACE_ANSWER}`, id: p.msgId });\n this.followAnswer(p.receiver, p.msgId, \"turn\", req.session, from, p.queuedAt);\n return;\n }\n case \"permission\": {\n const l = this.liveOf(req.session);\n const prev = l.attentions.get(req.attention);\n if (prev && prev !== s) this.reply(prev, { op: \"none\" });\n l.attentions.set(req.attention, s);\n s.on(\"close\", () => {\n if (l.attentions.get(req.attention) === s) l.attentions.delete(req.attention);\n });\n return;\n }\n case \"event\":\n this.onEvent(req);\n this.reply(s, { op: \"ok\" });\n return;\n }\n }\n\n /** A queued turn message that hasn't expired. */\n private takeTurn(l: Live): TurnPending | null {\n while (l.turnQueue.length) {\n const p = l.turnQueue.shift()!;\n if (!this.inflight.has(p.msgId)) continue;\n return p;\n }\n return null;\n }\n\n private onEvent(e: Extract<LocalRequest, { op: \"event\" }>): void {\n const l = this.liveOf(e.session);\n l.lastEvent = this.deps.now();\n if (e.cwd) l.cwd = e.cwd;\n if (e.transcript) l.transcript = e.transcript;\n if (CLOSES_ATTENTION.has(e.event) && l.attentions.size) {\n for (const s of l.attentions.values()) this.reply(s, { op: \"none\" });\n l.attentions.clear();\n }\n if (e.event === \"UserPromptSubmit\" || e.event === \"SessionStart\") {\n if (e.event === \"UserPromptSubmit\") l.midTurn = true;\n return;\n }\n if (e.event === \"Stop\" && l.continued) {\n l.continued = false;\n return;\n }\n if (e.event === \"Stop\" || e.event === \"StopFailure\" || e.event === \"SessionEnd\") {\n l.midTurn = false;\n l.continued = false;\n // A message queued for a Stop that came and went without taking it (it\n // arrived after the hook asked, or the turn failed) goes another way.\n const left = l.turnQueue.splice(0);\n for (const p of left) if (this.inflight.has(p.msgId)) void this.reroute(p);\n }\n }\n\n // --- receivers ------------------------------------------------------------------\n\n private async pollLoop(first: PairedReceiver): Promise<void> {\n const key = first.control + first.machine;\n const st = { last: null as number | null, error: null as string | null, on: true };\n this.polling.set(key, st);\n let backoff = 0;\n let downSince = 0;\n // A deploy takes the receiver away for seconds, not minutes: retry soon, capped at\n // 15 s (one request per machine), with jitter so every machine a deploy dropped\n // doesn't come back in the same instant. The old 60 s / 5 min steps left a\n // machine blind for minutes after a 30-second outage.\n const steps = [1000, 2000, 5000, 10_000, 15_000];\n const pause = (n: number) => (steps[Math.min(n, steps.length - 1)] as number) * (0.75 + Math.random() * 0.5);\n for (;;) {\n // The current record every round: `control pair` may have added a key since.\n const r = this.cfg.receivers.find((x) => x.control + x.machine === key);\n if (!this.running || !r) break;\n const ctl = new AbortController();\n this.aborts.add(ctl);\n // A poll held past wait + 10 s is a dead connection (a laptop that slept, a\n // network that changed): give up on it and ask again.\n const t = setTimeout(() => ctl.abort(), 35_000);\n try {\n const u = new URL(r.control);\n u.searchParams.set(\"machine\", r.machine);\n u.searchParams.set(\"wait\", \"25\");\n const asked = this.deps.now();\n const res = await this.deps.fetch(u, { headers: { authorization: `Bearer ${r.token}` }, signal: ctl.signal });\n st.last = this.deps.now();\n if (downSince && res.status < 500) {\n // Timed to when this poll was sent: a long-poll that reconnected is then held\n // up to `wait` before it answers.\n this.deps.log(`${r.url}: back after ${Math.round((asked - downSince) / 1000)} s (${backoff} failed tries)`);\n downSince = 0;\n }\n if (res.status === 401) {\n st.error = \"the receiver no longer knows this machine (401); run `sessionpipe control pair` again\";\n this.deps.log(`${r.url}: ${st.error}`);\n break;\n }\n if (res.status === 200) {\n const body = (await res.json()) as { messages?: Carried[] };\n // Looked up again: a key may have been added while this poll was parked.\n const cur = this.cfg.receivers.find((x) => x.control + x.machine === key) ?? r;\n let fresh = 0;\n // Not awaited: a headless turn can run for half an hour, and the next\n // message (for another session, or a permission answer) must not wait\n // behind it. handle() orders what must be ordered (one session's prompts).\n for (const m of body.messages ?? []) {\n if (m && !this.inflight.has(m.id)) fresh++;\n void this.handle(cur, m).catch((e) =>\n this.deps.log(`handle ${String(m?.id).slice(-8)}: ${String((e as Error)?.message || e)}`),\n );\n }\n // Only messages already in hand (a receiver that ignores `taken`): don't\n // turn the long-poll into a spin.\n if (!fresh) await sleep(2000);\n st.error = null;\n backoff = 0;\n } else if (res.status === 204) {\n st.error = null;\n backoff = 0;\n } else {\n st.error = `HTTP ${res.status}`;\n downSince ||= this.deps.now();\n await sleep(pause(backoff++));\n }\n } catch (e) {\n if (!this.running) break;\n st.error = String((e as Error)?.message || e).slice(0, 120);\n downSince ||= this.deps.now();\n await sleep(pause(backoff++));\n } finally {\n clearTimeout(t);\n this.aborts.delete(ctl);\n }\n }\n st.on = false;\n }\n\n private scheduleHello(): void {\n if (this.helloSoon) return;\n this.helloSoon = setTimeout(() => {\n this.helloSoon = null;\n void this.helloAll();\n }, 1500);\n this.helloSoon.unref();\n }\n\n private async helloAll(): Promise<void> {\n const waiting = [...this.live].filter(([, l]) => l.waiter).map(([k]) => k);\n const modes: DeliveryMode[] = [\"waiter\", \"turn\", \"resume\", \"fork\", ...(this.deps.sdk ? ([\"sdk\"] as const) : [])];\n for (const r of this.cfg.receivers) {\n const body = {\n name: this.cfg.name,\n harnesses: [\"claude-code\"],\n modes,\n keys: r.keys.map((k) => k.id),\n version: VERSION,\n waiting,\n folders: this.cfg.folders,\n mode: this.cfg.mode,\n };\n await this.post(r, \"/hello\", body).catch(() => {});\n }\n }\n\n private async post(r: PairedReceiver, sub: string, body: unknown): Promise<Response> {\n const ctl = new AbortController();\n const t = setTimeout(() => ctl.abort(), 15_000);\n try {\n return await this.deps.fetch(`${r.control.replace(/\\/$/, \"\")}${sub}`, {\n method: \"POST\",\n headers: { authorization: `Bearer ${r.token}`, \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: ctl.signal,\n });\n } finally {\n clearTimeout(t);\n }\n }\n\n // --- acks -----------------------------------------------------------------------\n\n private finish(r: PairedReceiver, id: string, a: Omit<Ack, \"receiver\" | \"id\" | \"at\">, since?: number): void {\n const ack: Ack = { receiver: r.control + r.machine, id, at: new Date(this.deps.now()).toISOString(), ...a };\n if (ack.reply) ack.reply = redactSecrets(ack.reply).slice(0, MAX_REPLY);\n if (ack.detail) ack.detail = redactSecrets(ack.detail).slice(0, 500);\n if (a.outcome !== \"taken\") {\n this.inflight.delete(id);\n this.recentAcks.set(id, { ack, at: this.deps.now() });\n this.delivered[a.mode ?? a.outcome] = (this.delivered[a.mode ?? a.outcome] ?? 0) + 1;\n this.deps.log(\n `ack ${id.slice(-8)} ${a.outcome}${a.mode ? ` via ${a.mode}` : \"\"}${a.code ? ` (${a.code})` : \"\"}${since ? ` send\u2192${a.outcome} ${this.deps.now() - since} ms` : \"\"}`,\n );\n }\n this.acks.add(ack);\n void this.flushAcks();\n }\n\n private flushing = false;\n private async flushAcks(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n for (let round = 0; round < 5; round++) {\n const all = this.acks.all();\n if (!all.length) return;\n const left: Ack[] = [];\n for (const r of this.cfg.receivers) {\n const mine = all.filter((a) => a.receiver === r.control + r.machine);\n if (!mine.length) continue;\n const acks = mine.map(({ receiver: _r, ...a }) => a);\n const ok = await this.post(r, \"/ack\", { acks })\n .then((res) => res.status >= 200 && res.status < 300)\n .catch(() => false);\n if (!ok) left.push(...mine);\n }\n // Acks for a receiver no longer paired are dropped.\n const now = this.acks.all();\n const added = now.slice(all.length);\n this.acks.keep([...left, ...added]);\n if (!left.length && !added.length) return;\n if (left.length) await sleep(2000 * (round + 1));\n }\n } finally {\n this.flushing = false;\n }\n }\n\n // --- one message ----------------------------------------------------------------\n\n async handle(r: PairedReceiver, m: Carried): Promise<void> {\n if (!m || typeof m.id !== \"string\") return;\n if (this.inflight.has(m.id)) return; // redelivered while we work on it\n const prior = this.recentAcks.get(m.id);\n if (prior && this.deps.now() - prior.at < RECENT_ACKS_MS) {\n this.acks.add(prior.ack);\n void this.flushAcks();\n return;\n }\n // In hand from here, before anything is awaited: a redelivery that arrives while\n // this one verifies must not verify too and come back `replay`. Every path below\n // ends in finish(), which lets go of it.\n this.inflight.add(m.id);\n const sent = Date.parse(m.at) || this.deps.now();\n if (Date.parse(m.expires_at) <= this.deps.now()) return this.finish(r, m.id, { outcome: \"expired\" });\n const v = await verifyCommand(\n { cmd: m.cmd, csig: m.csig ?? null, grant: m.grant ?? null, confirm: m.confirm ?? null },\n { machine: r.machine, rpId: r.rpId, trusted: r.keys, now: this.deps.now(), seenNonce: this.nonces.seen },\n );\n if (!v.ok) {\n this.deps.log(`refused ${m.id.slice(-8)}: ${v.code} \u2014 ${v.why}`);\n return this.finish(r, m.id, { outcome: \"refused\", code: v.code, detail: v.why });\n }\n const cmd = v.cmd;\n const ref = parseSessionRef(cmd.session)!;\n const kp = kindPath(cmd.kind, ref.harness);\n if (typeof kp === \"object\") return this.finish(r, m.id, { outcome: \"unsupported\", detail: kp.unsupported });\n try {\n if (kp === \"start\") return await this.startSession(r, m.id, cmd, sent);\n const place = this.place(cmd.session);\n if (\"refused\" in place)\n return this.finish(r, m.id, { outcome: \"refused\", code: place.refused, detail: place.why });\n if (kp === \"permission\") return this.permission(r, m.id, cmd, sent);\n if (kp === \"cancel\") return await this.cancel(r, m.id, cmd, sent);\n // One session's prompts in the order they came, each routed only once the one\n // before it has landed (a second message to a session the first one forked\n // goes to the copy). Other sessions don't wait.\n return await this.serial(`deliver:${cmd.session}`, async () => {\n // Read again: the message before this one may have moved the session (a fork).\n const now = this.place(cmd.session);\n if (\"refused\" in now) return this.finish(r, m.id, { outcome: \"refused\", code: now.refused, detail: now.why });\n return this.prompt(r, m.id, cmd, now, sent);\n });\n } catch (e) {\n this.finish(r, m.id, { outcome: \"failed\", detail: String((e as Error)?.message || e) });\n }\n }\n\n /** Where the session lives, and whether its folder is allowed \u2014 read from the\n * session's own transcript (Claude Code) or the hooks' cwd, never the command. */\n private place(\n session: string,\n ): { refused: string; why: string } | { folder: string; transcript: ReturnType<typeof findTranscript> } {\n const ref = parseSessionRef(session)!;\n if (ref.harness === \"claude-code\") {\n const target = this.state.copies[ref.id] ?? ref.id;\n const t = findTranscript(target, this.deps.claudeDirs()) ?? findTranscript(ref.id, this.deps.claudeDirs());\n if (!t) return { refused: \"no_session\", why: `no Claude Code session ${ref.id.slice(0, 8)} on this machine` };\n const folder = sessionFolder(t);\n const ok = folder && this.allowed(folder);\n if (!ok) return { refused: \"folder\", why: \"that session's folder isn't one this machine allows\" };\n return { folder: ok, transcript: t };\n }\n const cwd = this.live.get(session)?.cwd;\n const ok = cwd && this.allowed(cwd);\n if (!ok) return { refused: cwd ? \"folder\" : \"no_session\", why: \"no allowed folder known for that session\" };\n return { folder: ok, transcript: null };\n }\n\n private allowed(dir: string): string | null {\n if (!path.isAbsolute(dir)) return null;\n let r: string;\n try {\n r = realpathSync.native(dir);\n if (!statSync(r).isDirectory()) return null;\n } catch {\n return null;\n }\n for (const f of this.cfg.folders) {\n let rf = f;\n try {\n rf = realpathSync.native(f);\n } catch {}\n if (r === rf || r.startsWith(rf.endsWith(path.sep) ? rf : rf + path.sep)) return r;\n }\n return null;\n }\n\n private permission(r: PairedReceiver, id: string, cmd: ControlCommand, sent: number) {\n const l = this.live.get(cmd.session);\n const hook = l?.attentions.get(cmd.for as string);\n if (!hook) {\n // Nothing is ever auto-allowed: an allow needs a prompt open right now.\n if (cmd.decision === \"allow\")\n return this.finish(r, id, {\n outcome: \"refused\",\n code: \"no_attention\",\n detail: \"no permission prompt open for that id\",\n });\n this.finish(r, id, { outcome: \"expired\", detail: \"the prompt was already answered or closed\" });\n return;\n }\n l!.attentions.delete(cmd.for as string);\n this.reply(hook, {\n op: \"decision\",\n behavior: cmd.decision as \"allow\" | \"deny\",\n ...(cmd.note ? { message: cmd.note } : {}),\n id,\n });\n this.finish(r, id, { outcome: \"delivered\", mode: \"turn\" }, sent);\n }\n\n private async cancel(r: PairedReceiver, id: string, cmd: ControlCommand, sent: number): Promise<void> {\n const ref = parseSessionRef(cmd.session)!;\n const held = this.sdkSessions.get(ref.id);\n if (!held)\n return this.finish(r, id, {\n outcome: \"unsupported\",\n detail: \"no cancel path for a session the daemon doesn't hold\",\n });\n await held.interrupt();\n this.finish(r, id, { outcome: \"delivered\", mode: \"sdk\" }, sent);\n }\n\n private view(session: string, transcript: ReturnType<typeof findTranscript>) {\n const ref = parseSessionRef(session)!;\n const l = this.live.get(session);\n const claude = ref.harness === \"claude-code\" ? this.deps.claude() : null;\n const target = this.state.copies[ref.id] ?? ref.id;\n const t = transcript;\n const live =\n !!t && (liveProcess(target, t.configDir) || recentlyWritten(t.file, this.lastEnd.get(target), this.deps.now()));\n return {\n harness: ref.harness,\n sdk: this.sdkSessions.has(ref.id),\n waiter: !!l?.waiter && !l.waiter.destroyed,\n midTurn: !!l?.midTurn,\n live,\n known: !!t,\n canFork: !!claude?.caps.fork,\n api: false,\n };\n }\n\n private async prompt(\n r: PairedReceiver,\n id: string,\n cmd: ControlCommand,\n place: { folder: string; transcript: ReturnType<typeof findTranscript> },\n sent: number,\n ): Promise<void> {\n const route = routePrompt(this.view(cmd.session, place.transcript));\n if (\"unsupported\" in route) return this.finish(r, id, { outcome: \"unsupported\", detail: route.unsupported });\n if (\"refused\" in route) return this.finish(r, id, { outcome: \"refused\", code: route.refused });\n const ref = parseSessionRef(cmd.session)!;\n const text = cmd.text as string;\n switch (route.mode) {\n case \"waiter\": {\n const l = this.live.get(cmd.session)!;\n const w = l.waiter!;\n l.waiter = null;\n const from = this.answerFrom(cmd.session);\n this.reply(w, { op: \"message\", text: frame(text, r.url), id });\n this.scheduleHello();\n return this.followAnswer(r, id, \"waiter\", cmd.session, from, sent);\n }\n case \"turn\": {\n const l = this.liveOf(cmd.session);\n const p: TurnPending = { receiver: r, msgId: id, text, session: cmd.session, queuedAt: sent };\n l.turnQueue.push(p);\n // It waits for the session's Stop: the receiver must not keep handing it back.\n this.finish(r, id, { outcome: \"taken\" });\n const t = setTimeout(() => {\n if (this.inflight.has(id) && l.turnQueue.includes(p)) {\n l.turnQueue.splice(l.turnQueue.indexOf(p), 1);\n void this.reroute(p);\n }\n }, TURN_FALLBACK_MS);\n t.unref();\n return;\n }\n case \"sdk\": {\n const s = this.sdkSessions.get(ref.id)!;\n this.finish(r, id, { outcome: \"taken\" });\n const out = await s.send(frame(text, r.url));\n return this.finish(\n r,\n id,\n out.error\n ? { outcome: \"failed\", detail: out.error }\n : { outcome: \"delivered\", mode: \"sdk\", reply: out.reply },\n sent,\n );\n }\n case \"resume\":\n case \"fork\":\n return this.headless(r, id, cmd, place, route.mode, sent);\n case \"api\":\n return this.finish(r, id, { outcome: \"unsupported\", detail: \"no input API wired for this harness\" });\n }\n }\n\n /** A turn message whose Stop never took it: route again, now that it isn't mid-turn. */\n private async reroute(p: TurnPending): Promise<void> {\n const l = this.liveOf(p.session);\n l.midTurn = false;\n const place = this.place(p.session);\n if (\"refused\" in place) return this.finish(p.receiver, p.msgId, { outcome: \"refused\", code: place.refused });\n const cmd = { kind: \"prompt\", session: p.session, text: p.text } as ControlCommand;\n this.inflight.delete(p.msgId);\n this.inflight.add(p.msgId);\n await this.prompt(p.receiver, p.msgId, cmd, place, p.queuedAt).catch((e) =>\n this.finish(p.receiver, p.msgId, { outcome: \"failed\", detail: String((e as Error)?.message || e) }),\n );\n }\n\n /** Jobs for one session (and its copy) run one at a time, in order. */\n private serial<T>(key: string, task: () => Promise<T>): Promise<T> {\n const prev = this.queues.get(key) ?? Promise.resolve();\n const next = prev.then(task, task);\n this.queues.set(\n key,\n next.catch(() => {}),\n );\n return next;\n }\n\n private async headless(\n r: PairedReceiver,\n id: string,\n cmd: ControlCommand,\n place: { folder: string; transcript: ReturnType<typeof findTranscript> },\n mode: \"resume\" | \"fork\",\n sent: number,\n ): Promise<void> {\n const claude = this.deps.claude();\n if (!claude)\n return this.finish(r, id, { outcome: \"failed\", detail: \"Claude Code isn't installed on this machine\" });\n const mf = modeFlags(this.cfg.mode, claude.caps);\n if (\"error\" in mf) return this.finish(r, id, { outcome: \"refused\", code: \"mode\", detail: mf.error });\n const ref = parseSessionRef(cmd.session)!;\n this.finish(r, id, { outcome: \"taken\" });\n await this.serial(ref.id, async () => {\n const target = this.state.copies[ref.id] ?? ref.id;\n const resume = mode === \"fork\" ? [\"--resume\", target, \"--fork-session\"] : [\"--resume\", target];\n const args = [\"-p\", \"--output-format\", \"json\", ...mf.args, ...resume, frame(cmd.text as string, r.url)];\n this.deps.log(`${id.slice(-8)}: claude -p ${[...mf.args, ...resume].join(\" \")} in ${place.folder}`);\n const res = await this.slot(() =>\n this.deps.run(claude.bin, args, {\n cwd: place.folder,\n env: claudeEnv(place.transcript?.configDir, this.deps.env),\n timeoutMs: JOB_TIMEOUT_MS,\n }),\n );\n this.lastEnd.set(target, this.deps.now());\n const out = this.outcome(res);\n if (\"failed\" in out) return this.finish(r, id, { outcome: \"failed\", detail: out.failed });\n const ran = isUuid(out.session) ? out.session : target;\n if (mode === \"fork\" && ran !== target) {\n this.state.copies[ref.id] = ran;\n writeState(path.join(this.dir, \"state.json\"), this.state);\n this.lastEnd.set(ran, this.deps.now());\n }\n this.finish(\n r,\n id,\n { outcome: \"delivered\", mode, reply: out.reply, ...(ran !== ref.id ? { session: `claude-code:${ran}` } : {}) },\n sent,\n );\n });\n }\n\n private outcome(res: RunResult): { failed: string } | { reply: string; session?: string } {\n if (res.error) return { failed: `couldn't start Claude Code: ${res.error}` };\n if (res.timedOut) return { failed: \"Claude Code was still working after 30 minutes, so it was stopped\" };\n if (res.tooBig) return { failed: \"Claude Code's answer was too large to read\" };\n const j = parseResult(res.stdout);\n if (!j) {\n const why = String(res.stderr || \"\")\n .trim()\n .split(\"\\n\")\n .slice(-3)\n .join(\" \");\n return {\n failed: `Claude Code exited (${res.signal || `code ${res.code}`}) without an answer${why ? `: ${why}` : \"\"}`,\n };\n }\n if (j.is_error) return { failed: String(j.result || j.subtype || \"Claude Code reported an error\") };\n const denials = Array.isArray(j.permission_denials) ? j.permission_denials : [];\n const names = [...new Set(denials.map((d) => d?.tool_name).filter((n): n is string => typeof n === \"string\"))];\n const tail = denials.length\n ? `\\n\\n(Not allowed on this machine, since nobody was there to approve: ${names.join(\", \") || `${denials.length} action(s)`}.)`\n : \"\";\n const text =\n typeof j.result === \"string\" && j.result.trim() ? j.result : \"(Claude Code finished without a written reply.)\";\n return { reply: text + tail, ...(typeof j.session_id === \"string\" ? { session: j.session_id } : {}) };\n }\n\n /** Where the session's transcript ends right now: its answer starts after this. */\n private answerFrom(session: string): { file: string; offset: number } | null {\n const ref = parseSessionRef(session);\n if (!ref || ref.harness !== \"claude-code\") return null;\n const t = findTranscript(this.state.copies[ref.id] ?? ref.id, this.deps.claudeDirs());\n return t ? { file: t.file, offset: transcriptEnd(t.file) } : null;\n }\n\n /** A message handed to a live session (a waiter, a Stop block) is `taken` now; the\n * session answers in its own turn, which the daemon reads from the transcript and\n * sends back as the final ack's `reply` \u2014 so the person sees the answer where they\n * asked. A turn that doesn't end within ANSWER_WAIT_MS is acked delivered without. */\n private followAnswer(\n r: PairedReceiver,\n id: string,\n mode: \"waiter\" | \"turn\",\n session: string,\n from: { file: string; offset: number } | null,\n sent: number,\n ): void {\n this.deps.log(`${id.slice(-8)}: in ${session.slice(0, 24)} via ${mode} ${this.deps.now() - sent} ms after send`);\n this.finish(r, id, { outcome: \"taken\" });\n void (async () => {\n const answer = from\n ? await awaitAnswer(from.file, from.offset, {\n timeoutMs: this.deps.answerWaitMs ?? ANSWER_WAIT_MS,\n now: this.deps.now,\n })\n : null;\n this.finish(r, id, { outcome: \"delivered\", mode, ...(answer ? { reply: answer } : {}) }, sent);\n })().catch((e) => this.finish(r, id, { outcome: \"delivered\", mode, detail: String((e as Error)?.message || e) }));\n }\n\n private limits() {\n const l = this.cfg.limits ?? {};\n const n = (v: unknown, d: number) => (typeof v === \"number\" && Number.isInteger(v) && v >= 0 ? v : d);\n return {\n startConcurrent: n(l.start_concurrent, LIMITS.startConcurrent),\n startPerHour: n(l.start_per_hour, LIMITS.startPerHour),\n headless: Math.max(1, n(l.headless, LIMITS.headless)),\n };\n }\n\n /** One headless Claude Code process at a time per slot; the rest wait in order. */\n private async slot<T>(fn: () => Promise<T>): Promise<T> {\n while (this.procs >= this.limits().headless) await new Promise<void>((r) => this.procWaiters.push(r));\n this.procs++;\n try {\n return await fn();\n } finally {\n this.procs--;\n this.procWaiters.shift()?.();\n }\n }\n\n private async startSession(r: PairedReceiver, id: string, cmd: ControlCommand, sent: number): Promise<void> {\n const lim = this.limits();\n const now = this.deps.now();\n this.startTimes = this.startTimes.filter((t) => now - t < 3_600_000);\n if (this.startsRunning >= lim.startConcurrent || this.startTimes.length >= lim.startPerHour) {\n const detail =\n this.startsRunning >= lim.startConcurrent\n ? `this machine is already starting ${this.startsRunning} new session(s); it starts at most ${lim.startConcurrent} at once`\n : `this machine started ${this.startTimes.length} new sessions in the last hour, its limit`;\n this.deps.log(`refused ${id.slice(-8)}: start_limit \u2014 ${detail}`);\n return this.finish(r, id, { outcome: \"refused\", code: \"start_limit\", detail });\n }\n this.startsRunning++;\n this.startTimes.push(now);\n try {\n await this.startOne(r, id, cmd, sent);\n } finally {\n this.startsRunning--;\n }\n }\n\n private async startOne(r: PairedReceiver, id: string, cmd: ControlCommand, sent: number): Promise<void> {\n const ref = parseSessionRef(cmd.session)!;\n const cwd = this.allowed(cmd.cwd as string);\n if (!cwd)\n return this.finish(r, id, {\n outcome: \"refused\",\n code: \"folder\",\n detail: \"that folder isn't one this machine allows\",\n });\n if (findTranscript(ref.id, this.deps.claudeDirs()) || this.sdkSessions.has(ref.id))\n return this.finish(r, id, {\n outcome: \"refused\",\n code: \"bad_session\",\n detail: \"that new session's id is already taken\",\n });\n this.finish(r, id, { outcome: \"taken\" });\n if (this.deps.sdk) {\n const sdk = this.deps.sdk;\n const out = await this.slot(async () => {\n const s = sdk.start({ session: ref.id, cwd, mode: this.cfg.mode });\n this.sdkSessions.set(ref.id, s);\n return s.send(frame(cmd.text as string, r.url));\n });\n return this.finish(\n r,\n id,\n out.error ? { outcome: \"failed\", detail: out.error } : { outcome: \"delivered\", mode: \"sdk\", reply: out.reply },\n sent,\n );\n }\n const claude = this.deps.claude();\n if (!claude)\n return this.finish(r, id, { outcome: \"failed\", detail: \"Claude Code isn't installed on this machine\" });\n const mf = modeFlags(this.cfg.mode, claude.caps);\n if (\"error\" in mf) return this.finish(r, id, { outcome: \"refused\", code: \"mode\", detail: mf.error });\n const res = await this.slot(() =>\n this.deps.run(\n claude.bin,\n [\"-p\", \"--output-format\", \"json\", ...mf.args, \"--session-id\", ref.id, frame(cmd.text as string, r.url)],\n { cwd, env: claudeEnv(undefined, this.deps.env), timeoutMs: JOB_TIMEOUT_MS },\n ),\n );\n // The transcript this run just wrote is ours: the next message must not read it as a\n // live session (a fork instead of a resume).\n this.lastEnd.set(ref.id, this.deps.now());\n const out = this.outcome(res);\n if (\"failed\" in out) return this.finish(r, id, { outcome: \"failed\", detail: out.failed });\n this.finish(r, id, { outcome: \"delivered\", mode: \"resume\", reply: out.reply }, sent);\n }\n\n private closeIdleSdk(): void {\n const idle = this.deps.sdkIdleMs ?? 10 * 60_000;\n for (const [id, s] of this.sdkSessions)\n if (!s.busy && this.deps.now() - s.lastUsed > idle) {\n s.close();\n this.sdkSessions.delete(id);\n this.deps.log(\n `sdk session ${id.slice(0, 8)} closed after ${Math.round(idle / 60_000)} min idle (it resumes on the next message)`,\n );\n }\n }\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms).unref?.());\n", "// SPDX-License-Identifier: Apache-2.0\n// The one verifier for signed control commands (spec/CONTROL.md \u00A74\u2013\u00A75). A machine\n// runs a command only when this says yes; a receiver MAY run it too, as an early\n// word, so a bad command is refused where the person can see why.\n//\n// WebCrypto only (globalThis.crypto.subtle), no node: imports, no clock of its own\n// (`now` is passed in): the same file runs in a Cloudflare Worker, in a browser and\n// in Node \u2265 20, and conformance/control-vectors/ pins its answers.\n//\n// Every signature covers the EXACT bytes as transmitted (`cmd`, `grant.str`): the\n// strings are parsed to read their fields and never re-serialized to verify.\n\n/** One passkey tap vouches for a day key for at most this long. */\nexport const GRANT_MAX_MS = 24 * 3600_000;\n/** Clock slack between the signing device, the receiver and the machine. */\nexport const SKEW_MS = 5 * 60_000;\n/** The machine judges a command by when it was SIGNED: a message sent while the lid\n * was shut still runs when the machine wakes, up to a day later. */\nexport const MACHINE_MAX_AGE_MS = 24 * 3600_000;\n/** A receiver's early check is stricter: a command is carried within ten minutes of\n * being signed, or not at all. */\nexport const RECEIVER_MAX_AGE_MS = 10 * 60_000;\n/** How long a machine remembers a nonce: longer than MACHINE_MAX_AGE_MS + SKEW_MS. */\nexport const NONCE_TTL_MS = 25 * 3600_000;\n/** The whole command string, in UTF-16 code units (what JSON.parse sees). */\nexport const CMD_MAX = 12_000;\n/** A prompt's text, in characters. */\nexport const TEXT_MAX = 4_000;\n/** A permission answer's note. */\nexport const NOTE_MAX = 2_000;\n/** A grant string. */\nexport const GRANT_STR_MAX = 2_000;\n\nexport const COMMAND_TYPE = \"sessionpipe.control\";\nexport const GRANT_TYPE = \"sessionpipe.grant\";\nexport const CONTROL_KINDS = [\"prompt\", \"permission.answer\", \"cancel\", \"start\"] as const;\nexport type ControlKind = (typeof CONTROL_KINDS)[number];\n\n/** COSE algorithm ids a trusted key may use. */\nexport const ES256 = -7;\nexport const RS256 = -257;\n\n/** A key enrolled on the machine: a passkey's credential id, COSE alg and SPKI (base64url). */\nexport interface TrustedKey {\n id: string;\n alg: number;\n spki: string;\n}\n/** A WebAuthn assertion: credential id, authenticatorData, clientDataJSON, signature (base64url). */\nexport interface Assertion {\n cred: string;\n ad: string;\n cd: string;\n sig: string;\n}\n/** The day's grant: a passkey's assertion over sha256(str), where str names the day key. */\nexport interface GrantBundle extends Assertion {\n str: string;\n}\n/** What a receiver carries for one command (control.json minus the receiver's envelope). */\nexport interface SignedCommand {\n cmd: string;\n csig?: string | null;\n grant?: GrantBundle | null;\n confirm?: Assertion | null;\n}\nexport interface Grant {\n v: 1;\n t: typeof GRANT_TYPE;\n pub: string;\n iat: number;\n exp: number;\n rp: string;\n}\nexport interface ControlCommand {\n v: 1;\n t: typeof COMMAND_TYPE;\n machine: string;\n kind: ControlKind;\n /** `<harness>:<id>`, e.g. `claude-code:8c132906-\u2026`. */\n session: string;\n text?: string;\n for?: string;\n decision?: \"allow\" | \"deny\";\n note?: string;\n cwd?: string;\n nonce: string;\n iat: number;\n}\n\n/** Why a command was refused. Stable: conformance vectors and acks name these. */\nexport type RefusalCode =\n | \"malformed\"\n | \"not_a_command\"\n | \"wrong_machine\"\n | \"unknown_kind\"\n | \"bad_session\"\n | \"bad_fields\"\n | \"bad_nonce\"\n | \"too_old\"\n | \"future\"\n | \"unsigned\"\n | \"untrusted_key\"\n | \"bad_assertion\"\n | \"bad_grant\"\n | \"outside_grant\"\n | \"bad_csig\"\n | \"replay\"\n | \"nonce_store\";\n\nexport type Verdict =\n | { ok: true; cmd: ControlCommand; via: \"grant\" | \"confirm\"; key: string }\n | { ok: false; code: RefusalCode; why: string };\n\nexport interface VerifyOptions {\n /** This machine's id; a command for another machine is refused. */\n machine: string;\n /** The receiver's WebAuthn rp id the keys were enrolled for (well-known control.signing.rp_id). */\n rpId: string;\n /** The keys enrolled on this machine (or, for a receiver's early check, the account's). */\n trusted: TrustedKey[];\n /** Epoch ms. */\n now: number;\n /** MACHINE_MAX_AGE_MS on a machine (default), RECEIVER_MAX_AGE_MS on a receiver. */\n maxAgeMs?: number;\n /** Called once, last, only for a command whose signatures all verified: answer\n * true when the nonce was seen before, otherwise record it (durably) and answer\n * false. A throw refuses the command (`nonce_store`): never run what could not\n * be remembered. Omit it on a receiver's early check. */\n seenNonce?: (nonce: string) => boolean | Promise<boolean>;\n}\n\nconst NONCE_RE = /^[A-Za-z0-9_-]{22,64}$/;\nconst MACHINE_RE = /^m_[A-Za-z0-9_-]{16,40}$/;\nconst HARNESS_RE = /^[a-z][a-z0-9-]{0,39}$/;\nconst SESSION_ID_RE = /^[A-Za-z0-9._:-]{1,128}$/;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst B64URL_RE = /^[A-Za-z0-9_-]*$/;\nconst UP = 0x01;\nconst UV = 0x04;\n\n// --- encodings ------------------------------------------------------------------\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\nexport function b64url(bytes: Uint8Array | ArrayBuffer): string {\n const u = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n let s = \"\";\n for (const b of u) s += String.fromCharCode(b);\n return btoa(s).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** base64url without padding, strictly; null for anything else. */\nexport function fromB64url(s: unknown): Uint8Array | null {\n if (typeof s !== \"string\" || !B64URL_RE.test(s) || s.length % 4 === 1) return null;\n try {\n const bin = atob(s.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"===\".slice((s.length + 3) % 4));\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n } catch {\n return null;\n }\n}\n\nexport async function sha256(data: string | Uint8Array): Promise<Uint8Array> {\n const bytes = typeof data === \"string\" ? enc.encode(data) : data;\n return new Uint8Array(await crypto.subtle.digest(\"SHA-256\", bytes as Uint8Array<ArrayBuffer>));\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nfunction sameBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let d = 0;\n for (let i = 0; i < a.length; i++) d |= (a[i] as number) ^ (b[i] as number);\n return d === 0;\n}\n\n/** A DER ECDSA signature (what WebAuthn returns) as the 64-byte r\u2016s WebCrypto verifies.\n * Strict: every length must match the bytes, so one signature has one encoding (a\n * P-256 signature is at most 72 bytes, so the short length form is the only one). */\nexport function derToRaw(der: Uint8Array): Uint8Array | null {\n if (der[0] !== 0x30 || der.length < 8 || der[1] !== der.length - 2) return null;\n let i = 2;\n const part = (): Uint8Array | null => {\n if (der[i] !== 0x02) return null;\n const len = der[i + 1] as number;\n if (len < 1 || len > 33) return null;\n let v = der.slice(i + 2, i + 2 + len);\n if (v.length !== len) return null;\n // Minimal integers only: no needless leading zero, and never negative.\n if ((v[0] as number) & 0x80) return null;\n if (len > 1 && v[0] === 0 && !((v[1] as number) & 0x80)) return null;\n i += 2 + len;\n while (v.length > 32 && v[0] === 0) v = v.slice(1);\n if (v.length > 32) return null;\n const out = new Uint8Array(32);\n out.set(v, 32 - v.length);\n return out;\n };\n const r = part();\n const s = part();\n return r && s && i === der.length ? concat(r, s) : null;\n}\n\nconst u8 = (b: Uint8Array) => b as Uint8Array<ArrayBuffer>;\n/** WebCrypto's key type, named without the DOM lib (Workers, Node and browsers all have it). */\ntype CryptoKey = Awaited<ReturnType<typeof crypto.subtle.importKey>>;\n\nasync function importKey(key: TrustedKey): Promise<CryptoKey | null> {\n const spki = fromB64url(key.spki);\n if (!spki?.length) return null;\n try {\n if (key.alg === ES256)\n return await crypto.subtle.importKey(\"spki\", u8(spki), { name: \"ECDSA\", namedCurve: \"P-256\" }, false, [\"verify\"]);\n if (key.alg === RS256) {\n const k = await crypto.subtle.importKey(\"spki\", u8(spki), { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" }, false, [\n \"verify\",\n ]);\n const bits = (k.algorithm as { modulusLength?: number }).modulusLength ?? 0;\n return bits >= 2048 ? k : null;\n }\n } catch {}\n return null;\n}\n\n/** Can this key be enrolled at all? A machine refuses to trust a key it could never verify with. */\nexport async function keyUsable(key: TrustedKey): Promise<boolean> {\n return (\n !!key &&\n typeof key.id === \"string\" &&\n /^[A-Za-z0-9_-]{16,1400}$/.test(key.id) &&\n (key.alg === ES256 || key.alg === RS256) &&\n !!(await importKey(key))\n );\n}\n\n// --- WebAuthn -------------------------------------------------------------------\n\n/** A WebAuthn origin a key may have been used from: https on the rp id or a subdomain;\n * for rp id `localhost`, plain http on any port too. A bare origin, as a browser writes it. */\nexport function originAllowed(origin: unknown, rpId: string): boolean {\n if (typeof origin !== \"string\" || !rpId) return false;\n let u: URL;\n try {\n u = new URL(origin);\n } catch {\n return false;\n }\n if (u.origin !== origin) return false;\n if (u.hostname !== rpId && !u.hostname.endsWith(`.${rpId}`)) return false;\n if (u.protocol === \"https:\") return true;\n return u.protocol === \"http:\" && rpId === \"localhost\";\n}\n\ntype Check = { ok: true } | { ok: false; why: string };\nconst no = (why: string): Check => ({ ok: false, why });\n\n/** One passkey assertion over `challenge`, made with `key`, by a verified person. */\nexport async function verifyAssertion(\n challenge: Uint8Array,\n a: Assertion | null | undefined,\n key: TrustedKey,\n rpId: string,\n): Promise<Check> {\n if (!a || typeof a !== \"object\") return no(\"no passkey signature\");\n if (a.cred !== key.id) return no(\"signed with a key this machine doesn't trust\");\n const cdBytes = fromB64url(a.cd);\n const ad = fromB64url(a.ad);\n const sig = fromB64url(a.sig);\n if (!cdBytes || !ad || !sig?.length) return no(\"the passkey signature is malformed\");\n let cd: { type?: unknown; challenge?: unknown; origin?: unknown; crossOrigin?: unknown };\n try {\n cd = JSON.parse(dec.decode(cdBytes));\n } catch {\n return no(\"the passkey signature is malformed\");\n }\n if (!cd || typeof cd !== \"object\") return no(\"the passkey signature is malformed\");\n if (cd.type !== \"webauthn.get\") return no(\"the passkey answered a different question\");\n if (cd.challenge !== b64url(challenge)) return no(\"the passkey signed something else\");\n if (!originAllowed(cd.origin, rpId)) return no(`the passkey was used on another site, not ${rpId}`);\n if (cd.crossOrigin === true) return no(\"the passkey was used inside another site's frame\");\n if (ad.length < 37) return no(\"the passkey signature is malformed\");\n if (!sameBytes(ad.slice(0, 32), await sha256(rpId))) return no(`the passkey belongs to another site, not ${rpId}`);\n const flags = ad[32] as number;\n if (!(flags & UP) || !(flags & UV)) return no(\"the passkey signed without verifying the person\");\n const pub = await importKey(key);\n if (!pub) return no(\"a trusted key is unusable\");\n const signed = concat(ad, await sha256(cdBytes));\n let good = false;\n try {\n if (key.alg === ES256) {\n const raw = derToRaw(sig);\n good = !!raw && (await crypto.subtle.verify({ name: \"ECDSA\", hash: \"SHA-256\" }, pub, u8(raw), u8(signed)));\n } else {\n good = await crypto.subtle.verify({ name: \"RSASSA-PKCS1-v1_5\" }, pub, u8(sig), u8(signed));\n }\n } catch {\n good = false;\n }\n return good ? { ok: true } : no(\"the passkey signature doesn't verify\");\n}\n\n/** What a passkey signs to enroll on a machine: bound to that machine and that pairing code. */\nexport function pairChallenge(machine: string, code: string): Promise<Uint8Array> {\n return sha256(`sessionpipe.pair:${machine}:${code}`);\n}\n\n/** The enrollment proof: the new key's assertion over pairChallenge(machine, code).\n * Only after this verifies does the key go into the machine's trust store. */\nexport async function verifyEnrollment(o: {\n machine: string;\n code: string;\n key: TrustedKey;\n proof: Assertion;\n rpId: string;\n}): Promise<Check> {\n if (!(await keyUsable(o.key))) return no(\"the key is in a shape this machine can't use\");\n return verifyAssertion(await pairChallenge(o.machine, o.code), o.proof, o.key, o.rpId);\n}\n\n// --- the command ------------------------------------------------------------------\n\ntype Parsed = { ok: true; cmd: ControlCommand } | { ok: false; code: RefusalCode; why: string };\nconst bad = (code: RefusalCode, why: string): { ok: false; code: RefusalCode; why: string } => ({\n ok: false,\n code,\n why,\n});\nconst isNum = (n: unknown): n is number => typeof n === \"number\" && Number.isFinite(n);\n\n/** The session id rule per harness (ADAPTERS.md): Claude Code ids are UUIDs. */\nexport function sessionIdOk(harness: string, id: string): boolean {\n if (!SESSION_ID_RE.test(id)) return false;\n if (harness === \"claude-code\") return UUID_RE.test(id);\n return true;\n}\n\n/** Split `<harness>:<id>`; null when either half breaks its rule. */\nexport function parseSessionRef(ref: unknown): { harness: string; id: string } | null {\n if (typeof ref !== \"string\") return null;\n const i = ref.indexOf(\":\");\n if (i <= 0) return null;\n const harness = ref.slice(0, i);\n const id = ref.slice(i + 1);\n return HARNESS_RE.test(harness) && sessionIdOk(harness, id) ? { harness, id } : null;\n}\n\n/** Read the command's fields from the exact string. Structure only; no clock, no keys. */\nexport function parseCommand(str: unknown): Parsed {\n if (typeof str !== \"string\" || !str || str.length > CMD_MAX)\n return bad(\"malformed\", \"the command is missing or too long\");\n let c: Record<string, unknown>;\n try {\n c = JSON.parse(str);\n } catch {\n return bad(\"malformed\", \"the command is not JSON\");\n }\n if (!c || typeof c !== \"object\" || Array.isArray(c)) return bad(\"malformed\", \"the command is not an object\");\n if (c.v !== 1 || c.t !== COMMAND_TYPE) return bad(\"not_a_command\", \"not a sessionpipe control command\");\n if (typeof c.machine !== \"string\" || !MACHINE_RE.test(c.machine)) return bad(\"malformed\", \"which machine?\");\n if (!CONTROL_KINDS.includes(c.kind as ControlKind))\n return bad(\"unknown_kind\", \"the command asks for something unknown\");\n const ref = parseSessionRef(c.session);\n if (!ref) return bad(\"bad_session\", \"which session?\");\n if (typeof c.nonce !== \"string\" || !NONCE_RE.test(c.nonce))\n return bad(\"bad_nonce\", \"the nonce is missing or malformed\");\n if (!isNum(c.iat) || !Number.isInteger(c.iat) || c.iat <= 0)\n return bad(\"malformed\", \"the command has no signing time\");\n const has = (k: string) => c[k] !== undefined;\n const text = () => typeof c.text === \"string\" && c.text.trim().length > 0 && c.text.length <= TEXT_MAX;\n switch (c.kind as ControlKind) {\n case \"prompt\":\n if (!text()) return bad(\"bad_fields\", `a prompt needs text, at most ${TEXT_MAX} characters`);\n if (has(\"for\") || has(\"decision\") || has(\"cwd\")) return bad(\"bad_fields\", \"a prompt carries only text\");\n break;\n case \"start\":\n if (!text()) return bad(\"bad_fields\", `a new session needs text, at most ${TEXT_MAX} characters`);\n if (ref.harness !== \"claude-code\") return bad(\"bad_fields\", \"only Claude Code sessions can be started\");\n if (typeof c.cwd !== \"string\" || !isAbsolute(c.cwd) || c.cwd.length > 1024)\n return bad(\"bad_fields\", \"a new session needs an absolute folder\");\n if (has(\"for\") || has(\"decision\")) return bad(\"bad_fields\", \"a start carries text and cwd\");\n break;\n case \"permission.answer\":\n if (typeof c.for !== \"string\" || !c.for || c.for.length > 128) return bad(\"bad_fields\", \"which attention?\");\n if (c.decision !== \"allow\" && c.decision !== \"deny\") return bad(\"bad_fields\", \"allow or deny?\");\n if (has(\"text\") || has(\"cwd\")) return bad(\"bad_fields\", \"a permission answer carries for, decision and note\");\n break;\n case \"cancel\":\n if (has(\"text\") || has(\"for\") || has(\"decision\") || has(\"cwd\"))\n return bad(\"bad_fields\", \"a cancel carries nothing\");\n break;\n }\n if (has(\"note\") && (typeof c.note !== \"string\" || c.note.length > NOTE_MAX))\n return bad(\"bad_fields\", `a note is text, at most ${NOTE_MAX} characters`);\n return { ok: true, cmd: c as unknown as ControlCommand };\n}\n\nfunction isAbsolute(p: string): boolean {\n return p.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(p);\n}\n\n/** The grant's fields, read from its exact string. */\nexport function parseGrant(str: unknown, rpId: string): { ok: true; grant: Grant } | { ok: false; why: string } {\n if (typeof str !== \"string\" || !str || str.length > GRANT_STR_MAX)\n return { ok: false, why: \"the grant is missing or too long\" };\n let g: Record<string, unknown>;\n try {\n g = JSON.parse(str);\n } catch {\n return { ok: false, why: \"the grant is not JSON\" };\n }\n if (!g || typeof g !== \"object\" || Array.isArray(g)) return { ok: false, why: \"the grant is not an object\" };\n if (g.v !== 1 || g.t !== GRANT_TYPE) return { ok: false, why: \"not a sessionpipe grant\" };\n if (g.rp !== rpId) return { ok: false, why: `the grant is for another site, not ${rpId}` };\n if (typeof g.pub !== \"string\" || !fromB64url(g.pub)?.length || !isNum(g.iat) || !isNum(g.exp))\n return { ok: false, why: \"the grant is missing parts\" };\n if (g.exp <= g.iat) return { ok: false, why: \"the grant ends before it starts\" };\n if (g.exp - g.iat > GRANT_MAX_MS + SKEW_MS) return { ok: false, why: \"the grant lasts longer than a day\" };\n return { ok: true, grant: g as unknown as Grant };\n}\n\nasync function verifyCsig(cmd: string, csig: unknown, pub: string): Promise<boolean> {\n const sig = fromB64url(csig);\n const spki = fromB64url(pub);\n if (sig?.length !== 64 || !spki) return false;\n try {\n const key = await crypto.subtle.importKey(\"spki\", u8(spki), { name: \"ECDSA\", namedCurve: \"P-256\" }, false, [\n \"verify\",\n ]);\n return await crypto.subtle.verify({ name: \"ECDSA\", hash: \"SHA-256\" }, key, u8(sig), u8(enc.encode(cmd)));\n } catch {\n return false;\n }\n}\n\n/**\n * Is this a command this machine may run? The checks, in the spec's order\n * (CONTROL.md \u00A75): the exact bytes parse; the command is for this machine; it is\n * signed \u2014 a grant from a trusted key plus the day key's signature, or a confirm\n * over sha256(cmd); it was signed within the age window; its nonce is new.\n * The folder and open-attention checks that follow are the daemon's (they read\n * the machine, not the command).\n */\nexport async function verifyCommand(s: SignedCommand | null | undefined, o: VerifyOptions): Promise<Verdict> {\n if (!s || typeof s !== \"object\") return bad(\"malformed\", \"nothing to verify\");\n const p = parseCommand(s.cmd);\n if (!p.ok) return p;\n const c = p.cmd;\n if (c.machine !== o.machine) return bad(\"wrong_machine\", \"the command is for another machine\");\n\n let via: \"grant\" | \"confirm\" | null = null;\n let keyId = \"\";\n let refusal: { code: RefusalCode; why: string } | null = null;\n if (s.grant && s.csig) {\n const r = await checkGrantPath(s, c, o);\n if (r.ok) {\n via = \"grant\";\n keyId = r.key;\n } else refusal = r;\n }\n if (!via && s.confirm) {\n const key = o.trusted.find((k) => k && k.id === s.confirm?.cred);\n if (!key) refusal = { code: \"untrusted_key\", why: \"confirmed with a key this machine doesn't trust\" };\n else {\n const a = await verifyAssertion(await sha256(s.cmd), s.confirm, key, o.rpId);\n if (a.ok) {\n via = \"confirm\";\n keyId = key.id;\n } else refusal = { code: \"bad_assertion\", why: a.why };\n }\n }\n if (!via) {\n if (refusal) return bad(refusal.code, refusal.why);\n return bad(\"unsigned\", \"the command isn't signed\");\n }\n if (c.iat > o.now + SKEW_MS) return bad(\"future\", \"the command is dated in the future (is this clock right?)\");\n if (o.now - c.iat > (o.maxAgeMs ?? MACHINE_MAX_AGE_MS)) return bad(\"too_old\", \"the command was signed too long ago\");\n if (o.seenNonce) {\n let seen: boolean;\n try {\n seen = await o.seenNonce(c.nonce);\n } catch {\n return bad(\"nonce_store\", \"the nonce couldn't be recorded, so the command didn't run\");\n }\n if (seen) return bad(\"replay\", \"this command was already used once\");\n }\n return { ok: true, cmd: c, via, key: keyId };\n}\n\nasync function checkGrantPath(\n s: SignedCommand,\n c: ControlCommand,\n o: VerifyOptions,\n): Promise<{ ok: true; key: string } | { ok: false; code: RefusalCode; why: string }> {\n const bundle = s.grant as GrantBundle;\n const g = parseGrant(bundle.str, o.rpId);\n if (!g.ok) return bad(\"bad_grant\", g.why);\n const key = o.trusted.find((k) => k && k.id === bundle.cred);\n if (!key) return bad(\"untrusted_key\", \"the grant was signed with a key this machine doesn't trust\");\n const a = await verifyAssertion(await sha256(bundle.str), bundle, key, o.rpId);\n if (!a.ok) return bad(\"bad_assertion\", a.why);\n if (!(await verifyCsig(s.cmd, s.csig, g.grant.pub)))\n return bad(\"bad_csig\", \"the command's signature doesn't verify \u2014 it was changed after it was signed\");\n if (c.iat < g.grant.iat - SKEW_MS || c.iat > g.grant.exp)\n return bad(\"outside_grant\", \"the command was signed outside its grant's window\");\n return { ok: true, key: key.id };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The answer to a message delivered in place (spec/CONTROL.md \u00A76 `prompt`). A waiter or\n// a Stop block hands the message to the live session, which answers in its own turn;\n// the daemon reads that turn from the session's own transcript and sends it back as the\n// ack's `reply`, so the person sees the answer where they asked. Only the bytes the\n// transcript gained after the delivery are read: a long session's file is never parsed\n// whole, and nothing from before the message can be mistaken for its answer.\nimport { closeSync, openSync, readSync, statSync } from \"node:fs\";\n\n/** The transcript's size now: where its answer will start. */\nexport function transcriptEnd(file: string): number {\n try {\n return statSync(file).size;\n } catch {\n return 0;\n }\n}\n\n/** Claude Code records after the delivery \u2192 the turn's answer once the turn ended\n * (an assistant record with `stop_reason: \"end_turn\"`), else null. The answer is the\n * turn's assistant text, in order; sidechains (subagents) are not the session's words. */\nexport function answerIn(lines: string[]): { done: boolean; text: string } {\n const parts: string[] = [];\n for (const line of lines) {\n let j: {\n type?: string;\n isSidechain?: boolean;\n message?: { stop_reason?: string; content?: unknown };\n };\n try {\n j = JSON.parse(line);\n } catch {\n continue;\n }\n if (j.type !== \"assistant\" || j.isSidechain) continue;\n const content = j.message?.content;\n if (Array.isArray(content))\n for (const c of content as { type?: string; text?: unknown }[])\n if (c?.type === \"text\" && typeof c.text === \"string\" && c.text.trim()) parts.push(c.text.trim());\n if (j.message?.stop_reason === \"end_turn\") return { done: true, text: parts.join(\"\\n\\n\") };\n }\n return { done: false, text: parts.join(\"\\n\\n\") };\n}\n\n/** Wait for the turn that follows a delivery to end, reading the transcript from\n * `from` (its size at delivery). Resolves the answer, or null when the turn doesn't\n * end within `timeoutMs` (an interrupted turn, a session closed mid-answer). */\nexport async function awaitAnswer(\n file: string,\n from: number,\n o: { timeoutMs: number; pollMs?: number; now?: () => number; sleep?: (ms: number) => Promise<void> },\n): Promise<string | null> {\n const now = o.now ?? Date.now;\n const sleep = o.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms).unref?.()));\n const until = now() + o.timeoutMs;\n let offset = from;\n let partial = \"\";\n const lines: string[] = [];\n while (now() < until) {\n const size = transcriptEnd(file);\n if (size < offset) return null; // rewritten under us: nothing we can trust\n if (size > offset) {\n const fd = openSync(file, \"r\");\n try {\n const buf = Buffer.alloc(Math.min(size - offset, 4 * 1024 * 1024));\n const n = readSync(fd, buf, 0, buf.length, offset);\n offset += n;\n const chunk = partial + buf.subarray(0, n).toString(\"utf8\");\n const cut = chunk.lastIndexOf(\"\\n\");\n partial = cut < 0 ? chunk : chunk.slice(cut + 1);\n if (cut >= 0) lines.push(...chunk.slice(0, cut).split(\"\\n\").filter(Boolean));\n } finally {\n closeSync(fd);\n }\n const a = answerIn(lines);\n if (a.done) return a.text || null;\n }\n await sleep(o.pollMs ?? 500);\n }\n return null;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The routing rule (spec/CONTROL.md \u00A76): the first delivery mode that fits, top to\n// bottom. Pure, so every branch is a unit test.\nimport type { ControlKind } from \"@sessionpipe/core/control\";\n\nexport type DeliveryMode = \"sdk\" | \"waiter\" | \"turn\" | \"api\" | \"resume\" | \"fork\";\n\nexport interface SessionView {\n harness: string;\n /** The daemon holds this session through the Agent SDK right now. */\n sdk: boolean;\n /** A `sessionpipe wait` for it is parked on the socket. */\n waiter: boolean;\n /** Between a turn's start and its Stop (the Stop hook will ask). */\n midTurn: boolean;\n /** A live process holds the session (registry entry or a fresh transcript write). */\n live: boolean;\n /** The transcript exists on this machine. */\n known: boolean;\n /** This Claude Code can copy a session (`--fork-session`). */\n canFork: boolean;\n /** The harness has an input API (OpenCode, Codex app-server) \u2014 none is wired yet. */\n api: boolean;\n}\n\nexport type Route = { mode: DeliveryMode } | { unsupported: string } | { refused: \"no_session\" };\n\n/** Where a prompt (or a start) goes. Never two writers on one transcript: a live\n * session gets a fork, never a resume. */\nexport function routePrompt(s: SessionView): Route {\n if (s.sdk) return { mode: \"sdk\" };\n if (s.waiter) return { mode: \"waiter\" };\n if (s.midTurn) return { mode: \"turn\" };\n if (s.api) return { mode: \"api\" };\n if (s.harness !== \"claude-code\") return { unsupported: `no idle delivery for ${s.harness} yet` };\n if (!s.known) return { refused: \"no_session\" };\n if (!s.live) return { mode: \"resume\" };\n if (s.canFork) return { mode: \"fork\" };\n return { unsupported: \"the session is open and this Claude Code can't copy it (no --fork-session)\" };\n}\n\n/** How each kind is delivered, before the session's state is looked at. */\nexport function kindPath(\n kind: ControlKind,\n harness: string,\n): \"prompt\" | \"permission\" | \"cancel\" | \"start\" | { unsupported: string } {\n switch (kind) {\n case \"prompt\":\n return \"prompt\";\n case \"permission.answer\":\n return harness === \"gemini-cli\" ? { unsupported: \"Gemini CLI has no permission answer channel\" } : \"permission\";\n case \"cancel\":\n return \"cancel\";\n case \"start\":\n return harness === \"claude-code\" ? \"start\" : { unsupported: `can't start a ${harness} session` };\n default:\n return { unsupported: `unknown kind ${String(kind)}` };\n }\n}\n\n/** The framed text a session receives (CONTROL.md \u00A76): the model and the person can\n * tell where it came from. */\n/** Said with every message that reaches a live session: the answer goes back by\n * itself (the daemon reads it from the transcript), so the model never invents a\n * command to reply with (a real session tried \\`sessionpipe send\\`, 2026-10-01). */\nexport const IN_PLACE_ANSWER =\n \"Answer it right here, as you would answer the person at the keyboard: your reply is sent back to them automatically. Don't run a command or call a tool just to send it.\";\n\nexport function frame(text: string, receiver: string): string {\n let host = receiver;\n try {\n host = new URL(receiver).host;\n } catch {}\n return `Message via ${host} (sessionpipe control, signed on the sender's device):\\n\\n${text}`;\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// What the control daemon keeps on disk:\n// config/control.json the receivers this machine is paired with: machine id,\n// the machine's own token, the enrolled keys, folders, mode (0600)\n// state/control/nonces.jsonl every verified nonce for 25 h, fsync'd before a\n// command runs (a failed write refuses it)\n// state/control/acks.jsonl acks not yet accepted by their receiver\n// state/control/state.json forks: which copy a message to a session goes to\nimport {\n appendFileSync,\n chmodSync,\n closeSync,\n existsSync,\n fsyncSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { configFile, stateDir } from \"@sessionpipe/core\";\nimport { NONCE_TTL_MS, type TrustedKey } from \"@sessionpipe/core/control\";\n\nexport interface PairedReceiver {\n /** The receiver's origin, as the person typed it. */\n url: string;\n /** Absolute control endpoint (from the well-known file). */\n control: string;\n rpId: string;\n machine: string;\n /** The machine's own bearer (polls, acks, hello, off): opens nothing else. */\n token: string;\n keys: (TrustedKey & { name?: string; added_at: string })[];\n paired_at: string;\n}\n\nexport interface ControlConfig {\n name: string;\n /** Folders sessions may run in; compared on whole path segments, real paths. */\n folders: string[];\n mode: \"safe\" | \"auto\";\n receivers: PairedReceiver[];\n /** Caps this machine keeps whatever a receiver sends (defaults in daemon.ts,\n * LIMITS): new sessions running at once and per hour, headless Claude Code runs\n * at once. */\n limits?: { start_concurrent?: number; start_per_hour?: number; headless?: number };\n}\n\nexport const controlFile = (env: NodeJS.ProcessEnv = process.env) =>\n path.join(path.dirname(configFile(env)), \"control.json\");\nexport const controlState = (env: NodeJS.ProcessEnv = process.env) => path.join(stateDir(env), \"control\");\n\nfunction writePrivate(file: string, value: unknown): void {\n mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });\n const tmp = `${file}.${process.pid}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n renameSync(tmp, file);\n try {\n chmodSync(file, 0o600);\n } catch {}\n}\n\nexport function readControl(env: NodeJS.ProcessEnv = process.env): ControlConfig | null {\n try {\n const j = JSON.parse(readFileSync(controlFile(env), \"utf8\")) as ControlConfig;\n if (!j || !Array.isArray(j.receivers)) return null;\n return {\n name: j.name || \"machine\",\n folders: j.folders ?? [],\n mode: j.mode === \"auto\" ? \"auto\" : \"safe\",\n receivers: j.receivers,\n };\n } catch {\n return null;\n }\n}\n\nexport const writeControl = (c: ControlConfig, env: NodeJS.ProcessEnv = process.env) =>\n writePrivate(controlFile(env), c);\n\n/** Nonces the machine has run, for NONCE_TTL_MS. `seen()` records a new nonce\n * durably BEFORE it answers false; a write that fails throws, and the verifier\n * refuses the command (`nonce_store`). */\nexport class NonceStore {\n private readonly seenAt = new Map<string, number>();\n constructor(\n private readonly file: string,\n private readonly now: () => number = Date.now,\n ) {\n let raw = \"\";\n try {\n raw = readFileSync(file, \"utf8\");\n } catch {}\n const cut = this.now() - NONCE_TTL_MS;\n for (const line of raw.split(\"\\n\")) {\n if (!line) continue;\n try {\n const { n, t } = JSON.parse(line) as { n: string; t: number };\n if (typeof n === \"string\" && t > cut) this.seenAt.set(n, t);\n } catch {}\n }\n this.compact();\n }\n\n seen = (nonce: string): boolean => {\n const t = this.seenAt.get(nonce);\n if (t !== undefined && t > this.now() - NONCE_TTL_MS) return true;\n const at = this.now();\n mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });\n const fd = openSync(this.file, \"a\", 0o600);\n try {\n appendFileSync(fd, `${JSON.stringify({ n: nonce, t: at })}\\n`);\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n this.seenAt.set(nonce, at);\n return false;\n };\n\n /** Rewrite the file with only the live window (on start, and daily). */\n compact(): void {\n const cut = this.now() - NONCE_TTL_MS;\n for (const [n, t] of this.seenAt) if (t <= cut) this.seenAt.delete(n);\n if (!existsSync(this.file) && !this.seenAt.size) return;\n const body = [...this.seenAt].map(([n, t]) => JSON.stringify({ n, t })).join(\"\\n\");\n mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });\n writeFileSync(`${this.file}.tmp`, body ? `${body}\\n` : \"\", { mode: 0o600 });\n renameSync(`${this.file}.tmp`, this.file);\n }\n\n get size(): number {\n return this.seenAt.size;\n }\n}\n\nexport interface Ack {\n receiver: string;\n id: string;\n outcome: \"taken\" | \"delivered\" | \"expired\" | \"unsupported\" | \"failed\" | \"refused\";\n at: string;\n mode?: string;\n session?: string;\n code?: string;\n detail?: string;\n reply?: string;\n}\n\n/** Acks not yet accepted: appended before they are sent, rewritten when sent, so a\n * daemon restart re-sends rather than forgets (every message is acked exactly once\n * with a final outcome; a duplicate is tolerated by the receiver). */\nexport class AckOutbox {\n constructor(private readonly file: string) {}\n all(): Ack[] {\n try {\n return readFileSync(this.file, \"utf8\")\n .split(\"\\n\")\n .filter(Boolean)\n .map((l) => JSON.parse(l) as Ack);\n } catch {\n return [];\n }\n }\n add(a: Ack): void {\n mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });\n appendFileSync(this.file, `${JSON.stringify(a)}\\n`, { mode: 0o600 });\n }\n keep(left: Ack[]): void {\n mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });\n writeFileSync(`${this.file}.tmp`, left.map((a) => JSON.stringify(a)).join(\"\\n\") + (left.length ? \"\\n\" : \"\"), {\n mode: 0o600,\n });\n renameSync(`${this.file}.tmp`, this.file);\n }\n}\n\nexport interface DaemonState {\n /** Original session \u2192 the fork its messages go to. */\n copies: Record<string, string>;\n}\n\nexport function readState(file: string): DaemonState {\n try {\n const j = JSON.parse(readFileSync(file, \"utf8\")) as DaemonState;\n return { copies: j.copies && typeof j.copies === \"object\" ? j.copies : {} };\n } catch {\n return { copies: {} };\n }\n}\nexport const writeState = (file: string, s: DaemonState) => writePrivate(file, s);\n", "// SPDX-License-Identifier: Apache-2.0\n// The daemon's local socket (spec/CONTROL.md \u00A78): how the waiter, the Stop and\n// PermissionRequest hooks and the worker talk to the one daemon on this machine.\n// Line-delimited JSON, one request per connection. A Unix socket in the state\n// directory (0600, in a 0700 dir); a per-user named pipe on Windows. Only node:\n// builtins \u2014 the hook bundle imports this.\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type LocalRequest =\n /** A waiter parks until a message for its session arrives. */\n | { op: \"wait\"; session: string; pid?: number }\n /** A Stop hook asks for a queued message (turn mode). */\n | { op: \"stop\"; session: string; active: boolean }\n /** A PermissionRequest hook parks until a verified answer, or until it's released. */\n | { op: \"permission\"; session: string; attention: string; tool?: string }\n /** The worker reports a hook event: turn state and attention closure. */\n | { op: \"event\"; session: string; event: string; transcript?: string; cwd?: string }\n /** `sessionpipe control status`. */\n | { op: \"status\" };\n\nexport type LocalReply =\n | { op: \"message\"; text: string; id: string }\n | { op: \"block\"; reason: string; id: string }\n | { op: \"decision\"; behavior: \"allow\" | \"deny\"; message?: string; id: string }\n | { op: \"none\" }\n /** A newer waiter for the same session took over; this one stops. */\n | { op: \"replaced\" }\n | { op: \"ok\" }\n | { op: \"status\"; status: unknown };\n\n/** Where the daemon listens. `SESSIONPIPE_SOCKET` overrides (tests). */\nexport function socketPath(state: string, env: NodeJS.ProcessEnv = process.env): string {\n if (env.SESSIONPIPE_SOCKET) return env.SESSIONPIPE_SOCKET;\n if (process.platform === \"win32\") return `\\\\\\\\.\\\\pipe\\\\sessionpipe-control-${os.userInfo().username}`;\n return path.join(state, \"control.sock\");\n}\n\n/** One request, one reply. `timeoutMs` bounds the whole exchange; null on any\n * failure (no daemon, a timeout, a garbled reply) \u2014 callers treat that as \"none\". */\nexport function ask(sock: string, req: LocalRequest, timeoutMs: number): Promise<LocalReply | null> {\n return new Promise((resolve) => {\n let buf = \"\";\n let done = false;\n const s = net.connect(sock);\n const finish = (r: LocalReply | null) => {\n if (done) return;\n done = true;\n clearTimeout(t);\n s.destroy();\n resolve(r);\n };\n const t = setTimeout(() => finish(null), timeoutMs);\n s.on(\"connect\", () => s.write(`${JSON.stringify(req)}\\n`));\n s.on(\"data\", (d) => {\n buf += d.toString(\"utf8\");\n const i = buf.indexOf(\"\\n\");\n if (i < 0) return;\n try {\n finish(JSON.parse(buf.slice(0, i)) as LocalReply);\n } catch {\n finish(null);\n }\n });\n s.on(\"error\", () => finish(null));\n s.on(\"close\", () => finish(null));\n });\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// `sessionpipe control pair <receiver>`: a key enters this machine's trust store only\n// from this terminal (spec/CONTROL.md \u00A72). The receiver hands back a passkey and a\n// proof over sha256(\"sessionpipe.pair:<machine>:<code>\"); the key is trusted only once\n// the proof verifies here. Also the service files (launchd / systemd) that keep the\n// daemon running, and `control off`.\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { type TrustedKey, verifyEnrollment } from \"@sessionpipe/core/control\";\nimport { type ControlConfig, controlState, type PairedReceiver, readControl, writeControl } from \"./store.js\";\n\ndeclare const __SESSIONPIPE_VERSION__: string;\nconst VERSION = typeof __SESSIONPIPE_VERSION__ === \"string\" ? __SESSIONPIPE_VERSION__ : \"0.0.0\";\n\nexport interface PairOptions {\n url: string;\n /** The person's sink token for this receiver (from `sink add`, or --token). */\n token: string;\n folders: string[];\n mode: \"safe\" | \"auto\";\n name: string;\n out: (s: string) => void;\n fetch?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n env?: NodeJS.ProcessEnv;\n}\n\nasync function json(r: Response): Promise<Record<string, unknown>> {\n try {\n return (await r.json()) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nexport async function discover(url: string, f: typeof fetch): Promise<{ control: string; rpId: string }> {\n const base = url.replace(/\\/$/, \"\");\n const r = await f(`${base}/.well-known/sessionpipe`);\n if (!r.ok) throw new Error(`${base} has no sessionpipe well-known file (HTTP ${r.status})`);\n const wk = (await r.json()) as {\n capabilities?: string[];\n endpoints?: { control?: string };\n control?: { signing?: { rp_id?: string } };\n };\n if (!wk.capabilities?.includes(\"control\") || !wk.endpoints?.control || !wk.control?.signing?.rp_id)\n throw new Error(`${base} doesn't serve control yet (its well-known file lists no control.signing)`);\n const ep = wk.endpoints.control;\n return { control: /^https?:\\/\\//.test(ep) ? ep : base + ep, rpId: wk.control.signing.rp_id };\n}\n\n/** Pair (or add a key to) this machine with one receiver. Returns the saved config. */\nexport async function pair(o: PairOptions): Promise<ControlConfig> {\n const f = o.fetch ?? fetch;\n const sleep = o.sleep ?? ((ms: number) => new Promise((r) => setTimeout(r, ms)));\n const { control, rpId } = await discover(o.url, f);\n const cfg: ControlConfig = readControl(o.env) ?? { name: o.name, folders: [], mode: o.mode, receivers: [] };\n cfg.name = o.name || cfg.name;\n cfg.mode = o.mode;\n cfg.folders = [...new Set([...cfg.folders, ...o.folders.map((d) => path.resolve(d))])];\n const existing = cfg.receivers.find((r) => r.control === control);\n const auth = { authorization: `Bearer ${o.token}`, \"content-type\": \"application/json\" };\n const started = await f(`${control}/pair`, {\n method: \"POST\",\n headers: auth,\n body: JSON.stringify({\n ...(existing ? { machine: existing.machine } : {}),\n name: cfg.name,\n harnesses: [\"claude-code\"],\n modes: [\"waiter\", \"turn\", \"resume\", \"fork\"],\n version: VERSION,\n folders: cfg.folders,\n mode: cfg.mode,\n }),\n });\n const s = await json(started);\n if (started.status !== 201 && started.status !== 200)\n throw new Error(\n `the receiver refused to start pairing (HTTP ${started.status}${s.reason ? `: ${String(s.reason)}` : \"\"})`,\n );\n const machine = String(s.machine);\n const code = String(s.code);\n o.out(\"\");\n o.out(` Open this link and confirm with your passkey (Touch ID, Face ID, a security key):`);\n o.out(` ${String(s.url)}`);\n o.out(` The page shows these digits too: ${String(s.check)}`);\n o.out(\"\");\n const until = Date.parse(String(s.expires_at)) || Date.now() + 10 * 60_000;\n for (;;) {\n if (Date.now() > until) throw new Error(\"the pairing link expired; run `sessionpipe control pair` again\");\n await sleep(2000);\n const r = await f(`${control}/pair?code=${encodeURIComponent(code)}`, { headers: auth }).catch(() => null);\n if (!r) continue;\n if (r.status === 404) throw new Error(\"the receiver lost the pairing; run `sessionpipe control pair` again\");\n const p = await json(r);\n if (p.status === \"expired\") throw new Error(\"the pairing link expired; run `sessionpipe control pair` again\");\n if (p.status !== \"paired\") continue;\n const key = p.key as TrustedKey;\n const proof = p.proof as { cred: string; ad: string; cd: string; sig: string };\n const v = await verifyEnrollment({ machine, code, key, proof, rpId });\n if (!v.ok) throw new Error(`the receiver's key didn't prove itself (${v.why}); nothing was trusted`);\n const token = existing?.token ?? (typeof p.token === \"string\" ? p.token : \"\");\n if (!token) throw new Error(\"the receiver didn't hand this machine its token\");\n const rec: PairedReceiver = existing ?? {\n url: o.url.replace(/\\/$/, \"\"),\n control,\n rpId,\n machine,\n token,\n keys: [],\n paired_at: new Date().toISOString(),\n };\n if (!rec.keys.some((k) => k.id === key.id)) rec.keys.push({ ...key, added_at: new Date().toISOString() });\n if (!existing) cfg.receivers.push(rec);\n writeControl(cfg, o.env);\n o.out(` \u2713 Paired with ${rec.url} as ${machine} \u00B7 ${rec.keys.length} key(s) trusted on this machine`);\n return cfg;\n }\n}\n\n/** `control off [<receiver>]`: tell the receiver, forget its token and keys. */\nexport async function off(o: {\n url?: string;\n out: (s: string) => void;\n fetch?: typeof fetch;\n env?: NodeJS.ProcessEnv;\n}) {\n const f = o.fetch ?? fetch;\n const cfg = readControl(o.env);\n if (!cfg) return o.out(\" control isn't set up on this machine\");\n const gone = cfg.receivers.filter((r) => !o.url || r.url === o.url.replace(/\\/$/, \"\"));\n for (const r of gone) {\n await f(`${r.control}/off`, { method: \"POST\", headers: { authorization: `Bearer ${r.token}` } }).catch(() => null);\n o.out(` removed ${r.url} (${r.machine}, ${r.keys.length} key(s))`);\n }\n cfg.receivers = cfg.receivers.filter((r) => !gone.includes(r));\n writeControl(cfg, o.env);\n return cfg;\n}\n\nexport function removeKey(id: string, env?: NodeJS.ProcessEnv): number {\n const cfg = readControl(env);\n if (!cfg) return 0;\n let n = 0;\n for (const r of cfg.receivers) {\n const before = r.keys.length;\n r.keys = r.keys.filter((k) => k.id !== id && !k.id.startsWith(id));\n n += before - r.keys.length;\n }\n writeControl(cfg, env);\n return n;\n}\n\n// --- the service -------------------------------------------------------------------\n\nconst LABEL = \"org.sessionpipe.control\";\nconst UNIT = \"sessionpipe-control.service\";\n\nexport function serviceFiles(o: { node: string; cli: string; logDir: string; home?: string }) {\n const home = o.home ?? os.homedir();\n const xml = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key><string>${LABEL}</string>\n <key>ProgramArguments</key>\n <array><string>${xml(o.node)}</string><string>${xml(o.cli)}</string><string>control</string><string>run</string></array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>\n <key>ProcessType</key><string>Background</string>\n <key>StandardOutPath</key><string>${xml(path.join(o.logDir, \"daemon.log\"))}</string>\n <key>StandardErrorPath</key><string>${xml(path.join(o.logDir, \"daemon.log\"))}</string>\n</dict>\n</plist>\n`;\n const q = (s: string) => `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/%/g, \"%%\")}\"`;\n const unit = `[Unit]\nDescription=sessionpipe control daemon (signed messages to your coding sessions)\nAfter=network-online.target\n\n[Service]\nExecStart=${q(o.node)} ${q(o.cli)} control run\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n`;\n return {\n plist: { file: path.join(home, \"Library\", \"LaunchAgents\", `${LABEL}.plist`), body: plist },\n unit: { file: path.join(home, \".config\", \"systemd\", \"user\", UNIT), body: unit },\n };\n}\n\n/** Write and start the service for this platform. Returns what it did, in words. */\nexport function installService(o: { node: string; cli: string; env?: NodeJS.ProcessEnv }): string {\n const logDir = controlState(o.env);\n mkdirSync(logDir, { recursive: true, mode: 0o700 });\n const f = serviceFiles({ node: o.node, cli: o.cli, logDir });\n const run = (cmd: string, args: string[]) => execFileSync(cmd, args, { stdio: \"ignore\", timeout: 15_000 });\n if (process.platform === \"darwin\") {\n mkdirSync(path.dirname(f.plist.file), { recursive: true });\n writeFileSync(f.plist.file, f.plist.body);\n const uid = String(process.getuid?.() ?? \"\");\n try {\n run(\"launchctl\", [\"bootout\", `gui/${uid}/${LABEL}`]);\n } catch {}\n run(\"launchctl\", [\"bootstrap\", `gui/${uid}`, f.plist.file]);\n return `launchd agent ${LABEL} (log: ${path.join(logDir, \"daemon.log\")})`;\n }\n if (process.platform === \"linux\") {\n mkdirSync(path.dirname(f.unit.file), { recursive: true });\n writeFileSync(f.unit.file, f.unit.body);\n try {\n run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n run(\"systemctl\", [\"--user\", \"enable\", \"--now\", UNIT]);\n return `systemd user unit ${UNIT} (journalctl --user -u ${UNIT})`;\n } catch {\n return `wrote ${f.unit.file}, but systemd --user isn't reachable here; run \\`sessionpipe control run\\` yourself (tmux, screen)`;\n }\n }\n return \"no service manager for this platform yet; run `sessionpipe control run` yourself\";\n}\n\nexport function uninstallService(env?: NodeJS.ProcessEnv): void {\n const f = serviceFiles({ node: \"\", cli: \"\", logDir: controlState(env) });\n const run = (cmd: string, args: string[]) => {\n try {\n execFileSync(cmd, args, { stdio: \"ignore\", timeout: 15_000 });\n } catch {}\n };\n if (process.platform === \"darwin\" && existsSync(f.plist.file)) {\n run(\"launchctl\", [\"bootout\", `gui/${process.getuid?.() ?? \"\"}/${LABEL}`]);\n unlinkSync(f.plist.file);\n }\n if (process.platform === \"linux\" && existsSync(f.unit.file)) {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", UNIT]);\n unlinkSync(f.unit.file);\n run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// The `sdk` delivery mode (spec/CONTROL.md \u00A76): a session the daemon starts itself\n// through the Claude Agent SDK's streaming input, and keeps while it is in use, so\n// the next message lands in the same process with no cold start. Optional: the SDK\n// is a large package with its own binary, so sessionpipe does not depend on it. When\n// it can be imported (installed beside sessionpipe, or SESSIONPIPE_AGENT_SDK names\n// it), `start` goes through it; otherwise `start` is a headless `claude -p`.\n//\n// Measured (P1 spike 4, Claude Code 2.1.286): first token 1.5 s cold, 1.1 s warm;\n// zero turns while idle; but ~300 MB resident per held session, so the daemon\n// closes one that has been idle for ten minutes and a later message resumes it.\nimport type { SdkHost, SdkSession } from \"./daemon.js\";\n\ntype SdkQuery = AsyncIterable<{ type: string; subtype?: string; result?: unknown; is_error?: boolean }> & {\n interrupt(): Promise<void>;\n close(): void;\n};\ntype QueryFn = (p: { prompt: AsyncIterable<unknown>; options: Record<string, unknown> }) => SdkQuery;\n\nexport async function loadSdk(o: {\n claudeBin: string | null;\n env?: NodeJS.ProcessEnv;\n log: (s: string) => void;\n}): Promise<SdkHost | null> {\n const spec = o.env?.SESSIONPIPE_AGENT_SDK || \"@anthropic-ai/claude-agent-sdk\";\n let query: QueryFn;\n try {\n const mod = (await import(/* @vite-ignore */ spec)) as { query?: QueryFn };\n if (typeof mod.query !== \"function\") return null;\n query = mod.query;\n } catch {\n return null;\n }\n o.log(`Agent SDK found (${spec}): new sessions start in place`);\n return {\n start({\n session,\n cwd,\n mode,\n }: {\n session: string;\n cwd: string;\n mode: \"safe\" | \"auto\";\n configDir?: string;\n }): SdkSession {\n const queue: unknown[] = [];\n let wake: (() => void) | null = null;\n let closed = false;\n async function* input() {\n while (!closed) {\n while (queue.length) yield queue.shift();\n await new Promise<void>((r) => {\n wake = r;\n });\n }\n }\n const q = query({\n prompt: input(),\n options: {\n sessionId: session,\n cwd,\n permissionMode: mode === \"auto\" ? \"auto\" : \"dontAsk\",\n ...(o.claudeBin ? { pathToClaudeCodeExecutable: o.claudeBin } : {}),\n env: { ...(o.env ?? process.env), SESSIONPIPE_CONTROL_JOB: \"1\" },\n },\n });\n const waiting: { resolve: (v: { reply: string; error?: string }) => void }[] = [];\n let busy = false;\n let lastUsed = Date.now();\n void (async () => {\n try {\n for await (const m of q) {\n if (m.type !== \"result\") continue;\n busy = waiting.length > 1;\n lastUsed = Date.now();\n const w = waiting.shift();\n const text =\n typeof m.result === \"string\" && m.result.trim() ? m.result : \"(finished without a written reply)\";\n w?.resolve(m.is_error ? { reply: \"\", error: text } : { reply: text });\n }\n } catch (e) {\n for (const w of waiting.splice(0)) w.resolve({ reply: \"\", error: String((e as Error)?.message || e) });\n }\n })();\n return {\n send(text: string) {\n busy = true;\n lastUsed = Date.now();\n return new Promise((resolve) => {\n waiting.push({ resolve });\n queue.push({ type: \"user\", message: { role: \"user\", content: text }, parent_tool_use_id: null });\n wake?.();\n });\n },\n interrupt: () => q.interrupt(),\n close() {\n closed = true;\n wake?.();\n try {\n q.close();\n } catch {}\n },\n get busy() {\n return busy;\n },\n get lastUsed() {\n return lastUsed;\n },\n };\n },\n };\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// `sessionpipe wait` (spec/CONTROL.md \u00A78): run by a session as a BACKGROUND command.\n// It blocks on the daemon's local socket \u2014 no network, no polling, no output \u2014 until\n// a verified message for this session arrives, prints it and exits 0; the harness\n// then wakes the session with it. If the daemon restarts, it reconnects in silence.\nimport { stateDir } from \"@sessionpipe/core\";\nimport { parseSessionRef } from \"@sessionpipe/core/control\";\nimport { ask, socketPath } from \"./local.js\";\n\nexport const RE_ARM =\n \"(Answer it right here, as you would answer the person at the keyboard: your reply is sent back to them automatically, so don't run a command or call a tool just to send it. Then, without mentioning it, start `sessionpipe wait` again as a background command, with the longest timeout your harness allows, to keep receiving messages.)\";\n\n/** The session to wait for: --session, else the harness's own env. */\nexport function waitSession(flag: string | undefined, env: NodeJS.ProcessEnv = process.env): string | null {\n if (flag) return parseSessionRef(flag) ? flag : null;\n if (env.CLAUDE_CODE_SESSION_ID) return `claude-code:${env.CLAUDE_CODE_SESSION_ID}`;\n if (env.CODEX_SESSION_ID) return `codex:${env.CODEX_SESSION_ID}`;\n return null;\n}\n\nexport async function waitForMessage(\n session: string,\n o: { env?: NodeJS.ProcessEnv; retryMs?: number } = {},\n): Promise<string> {\n const sock = socketPath(stateDir(o.env), o.env);\n for (;;) {\n // No timeout of our own: the harness's background deadline is the only clock.\n const r = await ask(sock, { op: \"wait\", session, pid: process.pid }, 2 ** 31 - 1);\n if (r?.op === \"message\") return `${r.text}\\n\\n${RE_ARM}`;\n if (r?.op === \"replaced\")\n return \"(Another `sessionpipe wait` for this session took over; this one stopped. Nothing to do.)\";\n await new Promise((res) => setTimeout(res, o.retryMs ?? 1000));\n }\n}\n", "// SPDX-License-Identifier: Apache-2.0\n// What a worker run does, as a function so tests and `sessionpipe replay` share it.\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n adapterByName,\n Cursors,\n type Event,\n type FactsState,\n FileSink,\n filterEvent,\n gitFacts,\n machineName,\n makeEvent,\n Outbox,\n readConfig,\n redactDeep,\n type Session,\n type Sink,\n type SinkConfig,\n StdoutSink,\n safeId,\n stateDir,\n takeLock,\n tilde,\n writeConfig,\n} from \"@sessionpipe/core\";\nimport { ask, socketPath } from \"./control/local.js\";\nimport { HttpSink } from \"./http-sink.js\";\n\nasync function tellDaemon(state: string, job: Job, session: string, transcript?: string): Promise<void> {\n const sock = socketPath(state);\n if (process.platform !== \"win32\" && !existsSync(sock)) return;\n await ask(\n sock,\n {\n op: \"event\",\n session: `claude-code:${session}`,\n event: job.event,\n cwd: job.cwd,\n ...(transcript ? { transcript } : {}),\n },\n 300,\n );\n}\n\ndeclare const __SESSIONPIPE_VERSION__: string;\nconst VERSION = typeof __SESSIONPIPE_VERSION__ === \"string\" ? __SESSIONPIPE_VERSION__ : \"0.0.0\";\n\nexport interface Job {\n harness: string;\n event: string;\n argv: string[];\n stdin: string;\n cwd: string;\n env: Record<string, string>;\n ppid?: number;\n at: number;\n}\n\n/** A job file the worker will pick up: random suffix, 0600, in a 0700 dir. */\nexport function enqueueJob(state: string, job: Job): string {\n const jobs = jobsDir(state);\n mkdirSync(jobs, { recursive: true, mode: 0o700 });\n const f = path.join(jobs, `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.json`);\n writeFileSync(f, JSON.stringify(job), { mode: 0o600 });\n return f;\n}\n\n/** Jobs another worker left behind (a lost lock race, a killed worker): every\n * worker sweeps the ones older than `olderThanMs` before it exits, so no event\n * is lost (ground rule 4). Each is removed before it runs, so two sweepers\n * never run one twice. */\nexport async function sweepJobs(state: string, olderThanMs = 3000, limit = 20): Promise<number> {\n const jobs = jobsDir(state);\n let names: string[] = [];\n try {\n names = readdirSync(jobs).filter((n) => n.endsWith(\".json\"));\n } catch {\n return 0;\n }\n let ran = 0;\n for (const n of names.sort().slice(0, limit)) {\n const f = path.join(jobs, n);\n let job: Job | null = null;\n try {\n if (Date.now() - statSync(f).mtimeMs < olderThanMs) continue;\n job = JSON.parse(readFileSync(f, \"utf8\")) as Job;\n unlinkSync(f);\n } catch {\n continue;\n }\n await runJob(job, { state }).catch(() => {});\n ran++;\n }\n return ran;\n}\n\nexport function log(state: string, line: string): void {\n try {\n mkdirSync(state, { recursive: true, mode: 0o700 });\n const f = path.join(state, \"log\");\n try {\n if (statSync(f).size > 1024 * 1024) renameSync(f, `${f}.1`);\n } catch {}\n appendFileSync(f, `${new Date().toISOString()} ${line}\\n`);\n } catch {}\n}\n\n/** <state>/facts/<harness>/<session>.json \u2014 what the machine learned about a session. */\nexport function factsState(state: string): FactsState {\n const file = (h: string, s: string) => path.join(state, \"facts\", safeId(h), `${safeId(s)}.json`);\n return {\n get(h, s) {\n try {\n return JSON.parse(readFileSync(file(h, s), \"utf8\")) as Record<string, unknown>;\n } catch {\n return {};\n }\n },\n save(h, s, patch) {\n const cur = this.get(h, s);\n const next = { ...cur, ...patch };\n if (JSON.stringify(next) === JSON.stringify(cur)) return;\n mkdirSync(path.dirname(file(h, s)), { recursive: true, mode: 0o700 });\n writeFileSync(file(h, s), JSON.stringify(next), { mode: 0o600 });\n },\n };\n}\n\nexport function buildSinks(sinks: SinkConfig[]): Sink[] {\n const out: Sink[] = [];\n for (const s of sinks) {\n if (s.paused) continue;\n const tier = Math.min(s.tier, s.max_tier ?? 3) as 0 | 1 | 2 | 3;\n if (s.url === \"stdout\") out.push(new StdoutSink(s.name, tier, !!s.pii));\n else if (s.url.startsWith(\"file:\"))\n out.push(new FileSink(s.name, s.url.slice(5).replace(/^~(?=\\/|$)/, os.homedir()), tier, !!s.pii));\n else if (/^https?:\\/\\//.test(s.url)) out.push(new HttpSink(s, tier));\n }\n return out;\n}\n\n/** Run one hook job end to end: events \u2192 outbox \u2192 sinks. Returns what happened. */\nexport async function runJob(\n job: Job,\n opts: { state?: string; now?: number } = {},\n): Promise<{ events: Event[]; delivered: Record<string, number> }> {\n const state = opts.state ?? stateDir();\n const cfg = readConfig();\n const adapter = adapterByName(job.harness);\n if (!adapter) return { events: [], delivered: {} };\n const r = adapter.fromHook({ argv: job.argv, stdin: job.stdin, env: { ...process.env, ...job.env }, cwd: job.cwd });\n if (!r || !r.session.id) return { events: [], delivered: {} };\n // The control daemon learns each Claude Code session's turn state from its events\n // (a message for a session mid-turn waits for its Stop; a pending permission prompt\n // closes when the tool runs). A local round trip, and nothing when no daemon runs.\n if (job.harness === \"claude-code\") await tellDaemon(state, job, r.session.id, r.transcript);\n const outbox = new Outbox(state);\n const ref = { harness: job.harness, session: r.session.id };\n // Hooks of one session fire close together (parallel subagents, issue #9): wait\n // for the lock with a short backoff before giving the job back to the queue.\n let release = takeLock(state, ref);\n for (let wait = 50; !release && wait <= 3200; wait *= 2) {\n await new Promise((res) => setTimeout(res, wait));\n release = takeLock(state, ref);\n }\n if (!release) {\n log(state, `${job.harness} ${job.event}: session ${r.session.id} locked for 6 s, re-queued`);\n enqueueJob(state, job);\n return { events: [], delivered: {} };\n }\n try {\n const facts = factsState(state);\n const mem = facts.get(job.harness, r.session.id);\n // Heartbeat-class events read no facts (they fire every tool call); the rest refresh them.\n const heavy = !/^(PreToolUse|PostToolUse|PostToolUseFailure|BeforeTool|AfterTool|PostInvocation)$/.test(job.event);\n let learned: Partial<Session> = {};\n if (heavy) {\n const f = adapter.facts(r.session, r.transcript, r.hints ?? {}, facts);\n const { started_at: _s, last_at: _l, first_ask: _fa, harness_version, ...rest } = f;\n learned = rest;\n if (harness_version) facts.save(job.harness, r.session.id, { harness_version });\n facts.save(job.harness, r.session.id, { session: { ...(mem.session as object), ...learned } });\n }\n const known = (mem.session as Partial<Session> | undefined) ?? {};\n const cwdRaw = learned.cwd ?? r.session.cwd ?? known.cwd;\n const git = heavy ? gitFacts(cwdRaw) : {};\n const session: Session = {\n ...known,\n ...learned,\n ...git,\n ...(learned.branch ? { branch: learned.branch } : {}),\n id: r.session.id,\n seq: 0,\n machine: machineName(cfg, os.hostname()),\n ...(cwdRaw ? { cwd: tilde(cwdRaw) } : {}),\n ...(r.session.model ? { model: r.session.model } : {}),\n };\n const version = (facts.get(job.harness, r.session.id).harness_version as string | undefined) ?? undefined;\n const events: Event[] = [];\n for (const a of r.events) {\n const e = makeEvent(a, {\n harness: { name: job.harness, ...(version ? { version } : {}) },\n session: { ...session, seq: outbox.nextSeq(ref) },\n now: opts.now ?? job.at,\n });\n events.push(e);\n }\n // Tier 2: after a turn ends, the transcript's new turns become turn.transcript events.\n const wantsTranscript = cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 2);\n if (\n wantsTranscript &&\n r.transcript &&\n r.events.some((e) => e.type === \"turn.ended\" || e.type === \"session.ended\")\n ) {\n const cur = facts.get(job.harness, r.session.id);\n const fromLine = Number(cur.transcript_line) || 0;\n let turnNo = Number(cur.transcript_turns) || 0;\n const read = adapter.readTranscript(r.transcript, fromLine);\n for (const t of read.turns) {\n events.push(\n makeEvent(\n {\n type: \"turn.transcript\",\n harnessEvent: job.event,\n data: { turn: turnNo++, user: t.user, assistant: t.assistant, at: new Date(t.at).toISOString() },\n },\n {\n harness: { name: job.harness, ...(version ? { version } : {}) },\n session: { ...session, seq: outbox.nextSeq(ref) },\n now: opts.now ?? job.at,\n },\n ),\n );\n }\n if (read.turns.length)\n facts.save(job.harness, r.session.id, { transcript_line: read.line, transcript_turns: turnNo });\n }\n // At rest the outbox holds redacted strings (advisory GHSA-8f6f-c3c9-j5p6): the\n // tier-3 fields stay, with their secrets already gone; filterEvent runs the same\n // idempotent pass again per sink.\n outbox.append(\n ref,\n events.map((e) => ({ ...e, session: redactDeep(e.session), data: redactDeep(e.data) })),\n );\n log(\n state,\n `${job.harness} ${job.event}: ${events.map((e) => e.type).join(\",\") || \"nothing\"} (${r.session.id.slice(0, 8)})`,\n );\n const delivered = await flush(state, cfg.sinks, outbox, ref);\n if (Math.random() < 0.02) outbox.prune(cfg.keep_days ?? 30);\n return { events, delivered };\n } finally {\n release();\n }\n}\n\nconst BATCH = 50;\nconst MAX_PER_RUN = 500;\n\n/** Drain every sink from its cursor: this session first, then any backlog. Events\n * from many sessions are packed into one batch of up to BATCH, so a first\n * install's 400-session backfill is nine POSTs, not four hundred (the receiver's\n * write limit ended the first replay at 278 events, 2026-09-28). A cursor moves\n * only after its batch was acknowledged; a refused batch stops the sink for this\n * run and the next worker starts from the same cursors. */\nexport async function flush(\n state: string,\n sinkConfigs: SinkConfig[],\n outbox: Outbox,\n first?: { harness: string; session: string },\n): Promise<Record<string, number>> {\n const delivered: Record<string, number> = {};\n const sinks = buildSinks(sinkConfigs);\n const refs = outbox.sessions();\n if (first) {\n const k = `${first.harness}/${safeId(first.session)}`;\n refs.sort((a, b) => (`${a.harness}/${a.session}` === k ? -1 : `${b.harness}/${b.session}` === k ? 1 : 0));\n }\n for (const sink of sinks) {\n const cursors = new Cursors(state, sink.name);\n const c = cursors.read();\n let sent = 0;\n let stalled = false;\n // Pull filtered events session by session into one batch; remember where each\n // session's offset would land if the batch goes through.\n let batch: Event[] = [];\n let pending: Record<string, number> = {};\n const send = async (): Promise<boolean> => {\n if (!batch.length) {\n Object.assign(c, pending);\n pending = {};\n cursors.write(c);\n return true;\n }\n const res = await sink.send(batch);\n if (!res.ok) {\n log(state, `sink ${sink.name}: ${res.status ?? \"\"} ${res.error ?? \"\"} \u2192 ${res.action ?? \"retry\"}`);\n if (res.action === \"pause\" || res.action === \"lower-tier\") applySinkVerdict(sink.name, res);\n if (res.action !== \"drop\") {\n batch = [];\n pending = {};\n return false;\n }\n }\n sent += batch.length;\n Object.assign(c, pending);\n cursors.write(c);\n batch = [];\n pending = {};\n return true;\n };\n for (const ref of refs) {\n if (stalled || sent >= MAX_PER_RUN) break;\n let offset = pending[cursors.key(ref)] ?? c[cursors.key(ref)] ?? 0;\n for (;;) {\n const room = BATCH - batch.length;\n const { events, offset: next } = outbox.read(ref, offset, room);\n if (!events.length) break;\n for (const e of events) {\n const f = filterEvent(e, sink.tier, sink.pii, { home: os.homedir() });\n if (f) batch.push(f);\n }\n offset = next;\n pending[cursors.key(ref)] = offset;\n if (batch.length >= BATCH) {\n if (!(await send())) {\n stalled = true;\n break;\n }\n if (sent >= MAX_PER_RUN) break;\n }\n }\n }\n if (!stalled && (batch.length || Object.keys(pending).length)) if (!(await send())) stalled = true;\n delivered[sink.name] = sent;\n }\n return delivered;\n}\n\nfunction applySinkVerdict(name: string, res: { action?: string; max_tier?: number; error?: string }): void {\n try {\n const cfg = readConfig();\n const s = cfg.sinks.find((x) => x.name === name);\n if (!s) return;\n if (res.action === \"pause\") s.paused = `${new Date().toISOString()} ${res.error ?? \"unauthorized\"}`;\n if (res.action === \"lower-tier\" && typeof res.max_tier === \"number\") s.max_tier = res.max_tier as 0 | 1 | 2 | 3;\n writeConfig(cfg);\n } catch {}\n}\n\nexport { VERSION };\nexport const versionLine = (): string => `sessionpipe ${VERSION}`;\nexport const jobsDir = (state: string): string => path.join(state, \"jobs\");\nexport const hasJobs = (state: string): boolean => existsSync(jobsDir(state));\n", "// SPDX-License-Identifier: Apache-2.0\n// The HTTP sink (spec/HTTP.md \u00A72): POST {events} with the protocol header, a bearer\n// token and optional Standard Webhooks signature; errors map to what the sender\n// does next. The cursor moves only on 202. Retry/backoff is the worker's cadence\n// (each hook run drains the backlog); this class reports, it does not sleep.\nimport { createHash, createHmac } from \"node:crypto\";\nimport type { DeliveryResult, Event, Sink, SinkConfig, Tier } from \"@sessionpipe/core\";\n\nconst TIMEOUT_MS = 15_000;\n\n/** The Standard Webhooks message id (HTTP.md \u00A72): the same batch sent again carries\n * the same id, so a receiver that dedupes on webhook-id sees a retry as one message.\n * Derived from the events' own ids, which the outbox keeps across retries. */\nexport function webhookId(events: Pick<Event, \"id\">[]): string {\n return `msg_${createHash(\"sha256\")\n .update(events.map((e) => e.id).join(\",\"))\n .digest(\"base64url\")\n .slice(0, 32)}`;\n}\n\nexport class HttpSink implements Sink {\n readonly name: string;\n readonly pii: boolean;\n private readonly url: string;\n constructor(\n private readonly cfg: SinkConfig,\n readonly tier: Tier,\n ) {\n this.name = cfg.name;\n this.pii = !!cfg.pii;\n this.url = cfg.url.replace(/\\/$/, \"\");\n }\n\n private eventsUrl(): string {\n // The endpoint from the well-known file is stored beside the url at `sink add`;\n // until then the spec's default path.\n const ep = (this.cfg as { endpoints?: { events?: string } }).endpoints?.events ?? \"/api/sessionpipe/v1/events\";\n return /^https?:\\/\\//.test(ep) ? ep : this.url + ep;\n }\n\n async send(events: Event[]): Promise<DeliveryResult> {\n const body = JSON.stringify({ events });\n const headers: Record<string, string> = { \"content-type\": \"application/json\", \"sessionpipe-protocol\": \"1\" };\n if (this.cfg.token) headers.authorization = `Bearer ${this.cfg.token}`;\n if (this.cfg.secret?.startsWith(\"whsec_\")) {\n const id = webhookId(events);\n const ts = Math.floor(Date.now() / 1000);\n const key = Buffer.from(this.cfg.secret.slice(6), \"base64\");\n const sig = createHmac(\"sha256\", key).update(`${id}.${ts}.${body}`).digest(\"base64\");\n headers[\"webhook-id\"] = id;\n headers[\"webhook-timestamp\"] = String(ts);\n headers[\"webhook-signature\"] = `v1,${sig}`;\n }\n const ctl = new AbortController();\n const t = setTimeout(() => ctl.abort(), TIMEOUT_MS);\n try {\n const r = await fetch(this.eventsUrl(), { method: \"POST\", headers, body, signal: ctl.signal });\n const text = await r.text();\n let j: Record<string, unknown> = {};\n try {\n j = text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {}\n if (r.status === 202 || r.status === 200) {\n return {\n ok: true,\n acknowledged: events.length,\n accepted: Number(j.accepted ?? events.length),\n duplicates: Number(j.duplicates ?? 0),\n rejected: Array.isArray(j.rejected) ? (j.rejected as { id: string; reason: string }[]) : [],\n ...(typeof j.max_tier === \"number\" ? { max_tier: j.max_tier as Tier } : {}),\n status: r.status,\n };\n }\n const err = typeof j.reason === \"string\" ? j.reason : text.slice(0, 200);\n if (r.status === 400) return { ok: false, acknowledged: 0, status: 400, error: err, action: \"drop\" };\n if (r.status === 401) return { ok: false, acknowledged: 0, status: 401, error: err, action: \"pause\" };\n if (r.status === 403)\n return {\n ok: false,\n acknowledged: 0,\n status: 403,\n error: err,\n action: \"lower-tier\",\n ...(typeof j.max_tier === \"number\" ? { max_tier: j.max_tier as Tier } : {}),\n };\n if (r.status === 413) return { ok: false, acknowledged: 0, status: 413, error: err, action: \"split\" };\n if (r.status === 429)\n return {\n ok: false,\n acknowledged: 0,\n status: 429,\n error: err,\n action: \"retry\",\n retryAfterMs: Number(r.headers.get(\"retry-after\") ?? 60) * 1000,\n };\n return { ok: false, acknowledged: 0, status: r.status, error: err, action: \"retry\" };\n } catch (e) {\n return { ok: false, acknowledged: 0, error: String((e as Error).message ?? e), action: \"retry\" };\n } finally {\n clearTimeout(t);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["execFileSync", "spawn", "readdirSync", "readFileSync", "realpathSync", "statSync", "unlinkSync", "os", "path", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "statSync", "unlinkSync", "writeFileSync", "path", "path", "tail", "cap", "out", "path", "cmd", "settings", "entry", "path", "path", "cmd", "out", "existsSync", "mkdirSync", "writeFileSync", "unlinkSync", "readFileSync", "state", "readdirSync", "statSync", "tail", "execFileSync", "existsSync", "readdirSync", "readFileSync", "statSync", "path", "args", "out", "NAME", "out", "path", "readdirSync", "existsSync", "validTool", "cmd", "prune", "readFileSync", "state", "has", "pid", "execFileSync", "statSync", "tail", "ask", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "writeFileSync", "path", "OURS", "tail", "NAME", "OPTS", "eventsFor", "path", "hooksFile", "configFile", "validTool", "endReason", "cmd", "readFileSync", "mkdirSync", "writeFileSync", "OURS", "readdirSync", "existsSync", "out", "id", "r", "prune", "tail", "execFileSync", "existsSync", "readFileSync", "path", "NAME", "OPTS", "path", "validTool", "eventsFor", "readFileSync", "execFileSync", "existsSync", "cmd", "state", "prune", "out", "tail", "execFileSync", "closeSync", "openSync", "readdirSync", "readFileSync", "readSync", "statSync", "os", "path", "help", "flag", "out", "args", "cap", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "readFileSync", "mkdirSync", "path", "writeFileSync", "existsSync", "out", "closeSync", "existsSync", "mkdirSync", "openSync", "readdirSync", "readFileSync", "readSync", "statSync", "unlinkSync", "writeFileSync", "path", "path", "readFileSync", "mkdirSync", "writeFileSync", "existsSync", "out", "readdirSync", "statSync", "openSync", "readSync", "closeSync", "unlinkSync", "sink", "createHash", "out", "out", "out", "out", "appendFileSync", "mkdirSync", "path", "existsSync", "realpathSync", "os", "path", "existsSync", "mkdirSync", "realpathSync", "statSync", "unlinkSync", "path", "UUID_RE", "out", "has", "cmd", "closeSync", "openSync", "readSync", "statSync", "sleep", "appendFileSync", "chmodSync", "closeSync", "existsSync", "mkdirSync", "openSync", "readFileSync", "renameSync", "writeFileSync", "path", "path", "mkdirSync", "writeFileSync", "renameSync", "chmodSync", "readFileSync", "openSync", "appendFileSync", "closeSync", "existsSync", "claudeEnv", "findTranscript", "isUuid", "JOB_TIMEOUT_MS", "liveProcess", "modeFlags", "parseResult", "recentlyWritten", "sessionFolder", "path", "mkdirSync", "unlinkSync", "existsSync", "cmd", "ok", "realpathSync", "statSync", "out", "args", "tail", "net", "os", "path", "state", "execFileSync", "existsSync", "mkdirSync", "unlinkSync", "writeFileSync", "os", "path", "VERSION", "sleep", "path", "os", "mkdirSync", "cmd", "args", "execFileSync", "writeFileSync", "existsSync", "unlinkSync", "flag", "detectCaps", "findClaude", "runClaude", "out", "distDir", "flag", "sink", "os", "path", "realpathSync", "log", "existsSync", "appendFileSync", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "renameSync", "statSync", "unlinkSync", "writeFileSync", "os", "path", "createHash", "state", "existsSync", "VERSION", "mkdirSync", "path", "writeFileSync", "state", "mkdirSync", "path", "statSync", "renameSync", "appendFileSync", "readFileSync", "writeFileSync", "out", "os", "sink", "state", "path", "path", "realpathSync", "VERSION", "execFileSync", "os", "statSync", "readdirSync", "readFileSync", "w", "unlinkSync", "spawn", "r"]
7
7
  }