@tangle-network/agent-runtime 2.0.2 → 2.2.1
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/{activation-BuK2H7qx.d.ts → activation-BRASQAee.d.ts} +2 -2
- package/dist/{activation-ZQWz04u8.js → activation-D7-ZwyKD.js} +2 -2
- package/dist/{activation-ZQWz04u8.js.map → activation-D7-ZwyKD.js.map} +1 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +3 -3
- package/dist/{coordination-manager-BZLp9qpE.js → coordination-manager-DbNKO53e.js} +12 -8
- package/dist/coordination-manager-DbNKO53e.js.map +1 -0
- package/dist/{delegate-C-MUU6ML.js → delegate-CBFbETCq.js} +2 -2
- package/dist/{delegate-C-MUU6ML.js.map → delegate-CBFbETCq.js.map} +1 -1
- package/dist/durable.d.ts +12 -1
- package/dist/durable.js +34 -6
- package/dist/durable.js.map +1 -1
- package/dist/{graph-CM-6CV_K.js → graph-D05w51EQ.js} +5 -5
- package/dist/{graph-CM-6CV_K.js.map → graph-D05w51EQ.js.map} +1 -1
- package/dist/{improve-BuZ-I8DP.js → improve-Byp45uiM.js} +5 -5
- package/dist/{improve-BuZ-I8DP.js.map → improve-Byp45uiM.js.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +8 -8
- package/dist/intelligence.d.ts +2 -2
- package/dist/intelligence.js +3 -3
- package/dist/{journal-store-BpCOCDoO.js → journal-store-E6TojmWB.js} +58 -6
- package/dist/{journal-store-BpCOCDoO.js.map → journal-store-E6TojmWB.js.map} +1 -1
- package/dist/kernel.d.ts +1 -1
- package/dist/kernel.js +10 -10
- package/dist/{loop-runner-BpLTU_J4.d.ts → loop-runner-Bjy-ALf4.d.ts} +2 -2
- package/dist/{loop-runner-BWD6v1rd.js → loop-runner-DBH2LY57.js} +2 -2
- package/dist/{loop-runner-BWD6v1rd.js.map → loop-runner-DBH2LY57.js.map} +1 -1
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +4 -4
- package/dist/profiles.d.ts +1 -1
- package/dist/{provision-supervisor-BWEeWag1.js → provision-supervisor-Bvqnu3xm.js} +4 -4
- package/dist/{provision-supervisor-BWEeWag1.js.map → provision-supervisor-Bvqnu3xm.js.map} +1 -1
- package/dist/{runtime-Cnr3213E.js → runtime-DlmYZZpp.js} +10 -10
- package/dist/{runtime-Cnr3213E.js.map → runtime-DlmYZZpp.js.map} +1 -1
- package/dist/{search-executor-__X1VKnU.js → search-executor-DWFivIJq.js} +3 -3
- package/dist/{search-executor-__X1VKnU.js.map → search-executor-DWFivIJq.js.map} +1 -1
- package/dist/{server-CntFSTpW.js → server-DKYzcVEO.js} +3 -3
- package/dist/{server-CntFSTpW.js.map → server-DKYzcVEO.js.map} +1 -1
- package/dist/{structural-rollout-s8W19Mws.js → structural-rollout-ChERY66G.js} +3 -3
- package/dist/{structural-rollout-s8W19Mws.js.map → structural-rollout-ChERY66G.js.map} +1 -1
- package/dist/{supervise-Cl0F57m9.js → supervise-DQkPeVi6.js} +17 -11
- package/dist/{supervise-Cl0F57m9.js.map → supervise-DQkPeVi6.js.map} +1 -1
- package/dist/{supervision-discovery-C3t0Xw-T.js → supervision-discovery-P89Ej0yJ.js} +2 -2
- package/dist/{supervision-discovery-C3t0Xw-T.js.map → supervision-discovery-P89Ej0yJ.js.map} +1 -1
- package/dist/{supervisor-L7u3pQ1j.js → supervisor-DorLcfvJ.js} +4 -3
- package/dist/{supervisor-L7u3pQ1j.js.map → supervisor-DorLcfvJ.js.map} +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +11 -11
- package/dist/{top-web-BXICdHgc.js → top-web-CWcNwaRb.js} +30 -10
- package/dist/top-web-CWcNwaRb.js.map +1 -0
- package/dist/tui/bin.js +1 -1
- package/dist/tui/index.d.ts +1 -1
- package/dist/tui/index.js +2 -2
- package/dist/{types-BfnQq-_k.d.ts → types-C2fJMeEi.d.ts} +3 -1
- package/package.json +2 -2
- package/dist/coordination-manager-BZLp9qpE.js.map +0 -1
- package/dist/top-web-BXICdHgc.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"top-web-BXICdHgc.js","names":[],"sources":["../src/tui/top-transcript.ts","../src/tui/workflow-journal.ts","../src/tui/top-snapshot.ts","../src/tui/top-web.ts"],"sourcesContent":["import { closeSync, openSync, readSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { readCommittedJsonLines } from '../durable/jsonl-file'\nimport type { PursuitNodeProjection } from '../durable/observer-projection'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport type { WorkerView } from './top-snapshot'\n\n/** Read selected history on demand, leaving the live topology snapshot bounded and fast. */\nexport async function transcriptHistory(\n worker: WorkerView,\n runDir?: string,\n node?: PursuitNodeProjection,\n) {\n const rows: ReturnType<typeof transcriptRows> = []\n const identity = node?.identity as { taskDigest?: unknown; profileDigest?: unknown } | undefined\n if (runDir && typeof identity?.taskDigest === 'string' && worker.startedAt) {\n const task = await new FileResultBlobStore(join(runDir, 'blobs')).get(identity.taskDigest)\n if (task !== undefined)\n rows.unshift({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'delegated-input',\n source: `parent ${node?.parentId ?? 'run caller'}; task ${identity.taskDigest}${typeof identity.profileDigest === 'string' ? `; profile ${identity.profileDigest}` : ''}; Runtime FileResultBlobStore`,\n text: typeof task === 'string' ? task : JSON.stringify(task, null, 2),\n },\n })\n }\n if (!worker.eventFile) {\n const native = transcriptRows(worker)\n if (!native.length && worker.startedAt)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'capture-unavailable',\n text: 'Native conversation was not captured for this agent.',\n source: 'Runtime recorded capture',\n },\n })\n return [...rows, ...native]\n }\n const lines: string[] = []\n for await (const row of readCommittedJsonLines<unknown>(worker.eventFile)) {\n lines.push(JSON.stringify(row))\n if (lines.length > 200) lines.shift()\n }\n return [...rows, ...transcriptRows({ ...worker, liveTail: lines })]\n}\n\n/** Present the recorded tail through sandbox-ui's existing agent-stream contract. */\nexport function transcriptRows(worker: WorkerView) {\n const rows: {\n at: string\n event: {\n kind: string\n text?: string\n provenance?: string\n source?: string\n toolCallId?: string\n toolName?: string\n args?: unknown\n result?: unknown\n }\n }[] = []\n for (const line of worker.liveTail) {\n let value: Record<string, unknown>\n try {\n value = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n const at =\n typeof value.timestamp === 'string'\n ? value.timestamp\n : typeof value.at === 'string'\n ? value.at\n : undefined\n if (!at || !Number.isFinite(Date.parse(at))) continue\n const event = value.event as\n | {\n kind?: string\n text?: string\n toolName?: string\n toolCallId?: string\n args?: unknown\n result?: unknown\n }\n | undefined\n if (event?.kind) {\n const kind =\n (\n {\n text_delta: 'text',\n reasoning_delta: 'reasoning',\n tool_call: 'tool-call',\n tool_result: 'tool-result',\n } as Record<string, string>\n )[event.kind] ?? event.kind\n rows.push({ at, event: { ...event, kind } })\n continue\n }\n const message = value.message as\n | { role?: string; content?: string | Record<string, unknown>[] }\n | undefined\n if (!message) continue\n const parts =\n typeof message.content === 'string'\n ? [{ type: 'text', text: message.content }]\n : (message.content ?? [])\n for (const part of parts) {\n if (part.type === 'text' && typeof part.text === 'string')\n rows.push({\n at,\n event: { kind: message.role === 'user' ? 'user' : 'text', text: part.text },\n })\n else if (part.type === 'thinking' && typeof part.thinking === 'string')\n rows.push({ at, event: { kind: 'reasoning', text: part.thinking } })\n else if (part.type === 'tool_use')\n rows.push({\n at,\n event: {\n kind: 'tool-call',\n toolCallId: String(part.id),\n toolName: String(part.name),\n args: part.input,\n },\n })\n else if (part.type === 'tool_result')\n rows.push({\n at,\n event: {\n kind: 'tool-result',\n toolCallId: String(part.tool_use_id),\n result: part.content,\n },\n })\n }\n }\n return rows\n}\n\n/** The bounded native/normalized tail shared by snapshot adapters and selected streams. */\nexport function readTranscriptTail(file: string) {\n const fd = openSync(file, 'r')\n try {\n const size = statSync(file).size\n const buffer = Buffer.alloc(Math.min(size, 65_536))\n readSync(fd, buffer, 0, buffer.length, Math.max(0, size - buffer.length))\n const lines = buffer.toString().split('\\n')\n lines.pop() // An uncommitted final row is not an event.\n if (size > buffer.length) lines.shift()\n return lines.filter(Boolean).slice(-200)\n } finally {\n closeSync(fd)\n }\n}\n\nexport function transcriptTail(worker: WorkerView) {\n return transcriptRows(\n worker.eventFile ? { ...worker, liveTail: readTranscriptTail(worker.eventFile) } : worker,\n )\n}\n","import { closeSync, openSync, readSync, statSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport { parseCommittedJsonLines } from '../durable/jsonl-file'\nimport type { TopJournalEvent } from './top-snapshot'\nimport { readTranscriptTail } from './top-transcript'\n\n/** Native workflows have no Runtime accounting. Translate recorded lifecycle only. */\nexport function workflowJournal(runDir: string, text: string) {\n const rows = parseCommittedJsonLines<Record<string, unknown>>(text, 'journal.jsonl')\n const events: TopJournalEvent[] = []\n const tails = new Map<string, { file: string; lines: string[] }>()\n let first: string | undefined\n let last: string | undefined\n for (const row of rows) {\n if (typeof row.agentId !== 'string' || !/^[\\w-]+$/.test(row.agentId)) continue\n const id = row.agentId\n if (row.type === 'started') {\n const file = join(runDir, `agent-${id}.jsonl`)\n let start: string | undefined\n let end: string | undefined\n try {\n const fd = openSync(file, 'r')\n try {\n const size = statSync(file).size\n const prefix = Buffer.alloc(Math.min(size, 16_384))\n readSync(fd, prefix, 0, prefix.length, 0)\n start = /\"timestamp\":\"([^\"]+)\"/.exec(prefix.toString())?.[1]\n const lines = readTranscriptTail(file).slice(-8)\n const times = [...lines.join('\\n').matchAll(/\"timestamp\":\"([^\"]+)\"/g)]\n end = times.at(-1)?.[1]\n tails.set(id, { file, lines })\n } finally {\n closeSync(fd)\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (start && (!first || start < first)) first = start\n if (end && (!last || end > last)) last = end\n events.push({\n kind: 'spawned',\n id,\n label: typeof row.label === 'string' ? row.label : id,\n runtime: 'claude-code',\n ...(start ? { at: start } : {}),\n })\n events.push({ kind: 'metered', id, spend: { usdKnown: false, tokensKnown: false } })\n } else if (row.type === 'result' || row.type === 'error' || row.type === 'cancelled') {\n const line = tails.get(id)?.lines.at(-1)\n const at = line ? /\"timestamp\":\"([^\"]+)\"/.exec(line)?.[1] : undefined\n events.push(\n row.type === 'cancelled'\n ? { kind: 'cancelled', id, ...(at ? { at } : {}) }\n : {\n kind: 'settled',\n id,\n status: row.type === 'error' ? 'down' : 'done',\n ...(at ? { at } : {}),\n spent: { usdKnown: false, tokensKnown: false },\n },\n )\n }\n }\n return { id: basename(runDir), events, tails, first, last }\n}\n","/**\n * Read-only operator snapshots over the writer-owned supervisor layout and explicit durable runs.\n * Workspace reads preserve legacy files; durable reads use discovery, journals and the canonical\n * pursuit projection for model identity, failure and accounting evidence. Run totals count once.\n * ANSI presentation lives in `./top-frame`.\n *\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport { FileObserverJournal } from '../durable/observer-journal'\nimport {\n type PursuitProjection,\n type PursuitRunProjection,\n projectPursuit,\n} from '../durable/observer-projection'\nimport { FileSpawnJournal } from '../durable/spawn-journal/journal-store'\nimport { spawnJournalRecordEvents } from '../durable/spawn-journal/record-events'\nimport { discoverDurableSupervisionRun } from '../durable/supervision-discovery'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n supervisorWorkersDir,\n} from '../runtime/supervise/run-layout'\nimport type { Budget, Spend, SpendChannel } from '../runtime/supervise/types'\nimport { workflowJournal } from './workflow-journal'\n\nexport interface TopSnapshot {\n readonly root: string\n readonly generatedAt: number\n readonly supervisors: SupervisorView[]\n /** Canonical facts, including unknown accounting and requested/observed identities. */\n readonly pursuit?: PursuitProjection\n /** `partial` when at least one discovered source could not be read completely. */\n readonly completeness: TopSnapshotCompleteness\n /** One bounded entry per skipped or partially read source; empty when complete. */\n readonly diagnostics: ReadonlyArray<TopSnapshotDiagnostic>\n /** Run directories found under the runs roots, readable or not. */\n readonly discovered: number\n /** Run directories projected into a valid supervisor view. */\n readonly loaded: number\n}\n\nexport type TopSnapshotCompleteness = 'complete' | 'partial'\n\nexport type TopSnapshotDiagnosticSource =\n | 'observer-journal'\n | 'supervisor-state'\n | 'journal'\n | 'progress'\n | 'worker-tail'\n\nexport type TopSnapshotDiagnosticReason =\n | 'unreadable'\n | 'partial-json'\n | 'invalid-state'\n | 'missing'\n\n/**\n * One skipped or partially read snapshot source. `path` is relative to the run directory and\n * never carries file contents, so a diagnostic is safe to show or log without leaking run data.\n */\nexport interface TopSnapshotDiagnostic extends SourceDiagnostic {\n readonly runId?: string\n}\n\ninterface SupervisorBase {\n readonly id: string\n readonly status: string\n readonly task: string\n readonly workspaceDir: string\n readonly budget: number\n readonly budgetKnown?: boolean\n readonly verifyCmd?: string\n readonly workerModel?: string\n readonly driverModel?: string\n readonly verdict?: string\n readonly progress?: string\n readonly startedAt?: string\n readonly completedAt?: string\n readonly maxSandboxes?: number\n readonly maxLifetimeSeconds?: number\n readonly idleTimeoutSeconds?: number\n readonly maxUsd?: number\n readonly maxDepth?: number\n}\n\nexport interface SupervisorView extends SupervisorBase {\n readonly stateDir: string\n readonly resultSpentUsd?: number\n readonly resultSpentTokens?: number\n readonly workers: WorkerView[]\n readonly progressTail: string[]\n readonly journalTail: TopJournalEvent[]\n readonly driverSpend: SpendStats\n readonly totals: SupervisorTotals\n}\n\nexport interface WorkerView {\n readonly id: string\n readonly label: string\n readonly eventFile?: string\n readonly parent?: string\n readonly runtime?: string\n readonly status: 'running' | 'done' | 'down' | 'cancelled'\n readonly verdict?: string\n readonly infra?: boolean\n readonly startedAt?: string\n readonly endedAt?: string\n readonly latencyMs: number\n readonly budget?: BudgetStats\n readonly spend: SpendStats\n readonly metered: SpendStats\n readonly liveTail: string[]\n readonly outRef?: string\n readonly reason?: string\n}\n\nexport interface SupervisorTotals\n extends Pick<SpendStats, 'tokensInput' | 'tokensOutput' | 'usd' | 'usdKnown' | 'tokensKnown'> {\n readonly workers: number\n readonly running: number\n readonly done: number\n readonly down: number\n readonly cancelled: number\n readonly inFlight: number\n readonly settled: number\n readonly tokensTotal: number\n readonly latencyMs: number\n readonly workerLatency: Distribution\n}\n\nexport interface Distribution {\n readonly n: number\n readonly min: number\n readonly median: number\n readonly p90: number\n readonly max: number\n}\n\nexport type BudgetStats = Partial<Pick<Budget, 'maxIterations' | 'maxTokens' | 'maxUsd'>>\n\nexport interface SpendStats\n extends Readonly<Pick<Spend, 'iterations' | 'usd' | 'ms' | 'usdKnown' | 'tokensKnown'>> {\n readonly tokensInput: number\n readonly tokensOutput: number\n}\n\nexport type TopJournalEvent = {\n readonly id: string\n readonly seq?: number\n readonly at?: string\n} & (\n | {\n readonly kind: 'spawned'\n readonly parent?: string\n readonly label?: string\n readonly budget?: unknown\n readonly runtime?: string\n }\n | {\n readonly kind: 'settled'\n readonly status?: string\n readonly outRef?: string\n readonly verdict?: unknown\n readonly spent?: unknown\n readonly infra?: boolean\n }\n | {\n readonly kind: 'cancelled'\n readonly spent?: unknown\n readonly reason?: string\n }\n | {\n readonly kind: 'metered'\n readonly spend?: unknown\n readonly accountingOnly?: boolean\n }\n | {\n readonly kind: 'progress'\n readonly spend?: unknown\n }\n)\n\ninterface SupervisorState extends SupervisorBase {\n readonly result?: {\n readonly spentUsd?: number\n readonly spentTokens?: number\n }\n}\n\ntype MutableWorker = {\n -readonly [Key in keyof Omit<WorkerView, 'latencyMs'>]: WorkerView[Key]\n}\n\ninterface WorkerEventTail {\n readonly file: string\n readonly lines: string[]\n}\n\n/** A diagnostic before its run id is attached; `loadTopSnapshot` adds `runId`. */\ninterface SourceDiagnostic {\n readonly source: TopSnapshotDiagnosticSource\n readonly path: string\n readonly reason: TopSnapshotDiagnosticReason\n}\n\n/**\n * What one snapshot source read produced: the value it could recover, and the bounded diagnostics\n * the read raised. Every reader returns this one shape, so the loader folds them identically.\n */\ninterface SourceRead<T> {\n readonly value: T\n readonly diagnostics: readonly SourceDiagnostic[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\n\n/**\n * Read every supervisor run under one workspace into a single point-in-time snapshot.\n *\n * Pure with respect to the process: it only reads, and it never throws for a writer mid-append.\n * An unreadable or half-written source is still skipped — an operator view must survive a live\n * writer — but every skip is reported as one bounded `TopSnapshotDiagnostic`, so a client can\n * tell a removed run from a partial read. `now` is injectable so elapsed time is deterministic\n * under test.\n */\nexport function loadTopSnapshot(rootDir: string, now?: number): TopSnapshot\nexport function loadTopSnapshot(\n rootDir: string,\n options: { runDir: string; now?: number; format?: 'workflow' | 'journal' },\n): Promise<TopSnapshot>\nexport function loadTopSnapshot(\n rootDir: string,\n input: number | { runDir: string; now?: number; format?: 'workflow' | 'journal' } = Date.now(),\n): TopSnapshot | Promise<TopSnapshot> {\n if (typeof input !== 'number' && input.format === 'journal')\n return loadJournalTopSnapshot(rootDir, input.runDir, input.now ?? Date.now())\n if (typeof input !== 'number' && input.format === 'workflow') {\n const root = resolve(rootDir),\n dir = resolve(input.runDir),\n now = input.now ?? Date.now()\n const read = readSourceFile(join(dir, 'journal.jsonl'), 'journal', 'journal.jsonl')\n if (read.value === undefined)\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n read.diagnostics.length\n ? [...read.diagnostics]\n : [{ source: 'journal', path: 'journal.jsonl', reason: 'missing' }],\n ),\n )\n try {\n const journal = workflowJournal(dir, read.value)\n const supervisor = buildSupervisorView(\n {\n id: journal.id,\n task: journal.id,\n status: 'unobserved',\n workspaceDir: root,\n budget: 0,\n budgetKnown: false,\n ...(journal.first ? { startedAt: journal.first } : {}),\n },\n dir,\n journal.events,\n [],\n now,\n journal.tails,\n )\n return Promise.resolve(\n topSnapshot(root, now, [\n {\n ...supervisor,\n driverSpend: { ...supervisor.driverSpend, usdKnown: false, tokensKnown: false },\n totals: { ...supervisor.totals, usdKnown: false, tokensKnown: false },\n },\n ]),\n )\n } catch {\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n [{ source: 'journal', path: 'journal.jsonl', reason: 'invalid-state' }],\n ),\n )\n }\n }\n if (typeof input !== 'number')\n return loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now())\n const now = input\n const root = resolve(rootDir)\n const supervisors: SupervisorView[] = []\n const diagnostics: TopSnapshotDiagnostic[] = []\n let discovered = 0\n const report = (runId: string, sources: readonly SourceDiagnostic[]): void => {\n for (const source of sources) diagnostics.push({ ...source, runId })\n }\n // `.loops` is the pre-rename state dir; runs already on disk there stay visible.\n for (const runsRoot of [supervisorRunsRoot(root), legacySupervisorRunsRoot(root)]) {\n if (!existsSync(runsRoot)) continue\n for (const entry of readdirSync(runsRoot)) {\n const dir = join(runsRoot, entry)\n if (!isDirectory(dir)) continue\n discovered += 1\n const state = readSupervisorState(dir)\n report(entry, state.diagnostics)\n if (!state.value) continue\n const journal = readJournal(dir)\n const progress = readSourceFile(join(dir, 'progress.ndjson'), 'progress', 'progress.ndjson')\n const workerEvents = readWorkerEventTails(supervisorWorkersDir(dir), 8)\n report(entry, [...journal.diagnostics, ...progress.diagnostics, ...workerEvents.diagnostics])\n supervisors.push(\n buildSupervisorView(\n state.value,\n dir,\n journal.value,\n tailLines(progress.value, 8),\n now,\n workerEvents.value,\n ),\n )\n }\n }\n supervisors.sort((a, b) => String(b.startedAt ?? '').localeCompare(String(a.startedAt ?? '')))\n return topSnapshot(root, now, supervisors, diagnostics, discovered)\n}\n\nfunction topSnapshot(\n root: string,\n now: number,\n supervisors: SupervisorView[],\n diagnostics: TopSnapshotDiagnostic[] = [],\n discovered = 1,\n pursuit?: PursuitProjection,\n): TopSnapshot {\n return {\n root,\n generatedAt: now,\n supervisors,\n completeness: diagnostics.length ? 'partial' : 'complete',\n diagnostics,\n discovered,\n loaded: supervisors.length,\n ...(pursuit ? { pursuit } : {}),\n }\n}\n\nasync function loadDurableTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir)\n let pursuit: PursuitProjection | undefined\n let source: TopSnapshotDiagnosticSource = 'observer-journal'\n let path = 'observer.jsonl'\n try {\n if (typeof runDir !== 'string' || !runDir.trim())\n throw new TypeError('runDir must be non-empty')\n const journal = await FileObserverJournal.open(join(resolve(runDir), path))\n if (!journal) return topSnapshot(root, now, [], [{ source, path, reason: 'missing' }])\n pursuit = projectPursuit(await journal.read())\n source = 'journal'\n path = '.'\n const discovery = await discoverDurableSupervisionRun(runDir)\n // An actual run id stays the row identity; the canonical projection retains every attempt.\n const latest = new Map(pursuit.runs.map((run) => [run.runId, run]))\n path = 'spawn-journal.jsonl'\n const spawnJournal = new FileSpawnJournal(discovery.spawnJournalPath)\n // A child's metered turns journal under `<root>/<child>`; the spawn tree already shows them.\n const rows = [...latest.values()].filter(\n (run) => !discovery.roots.some((id) => run.runId.startsWith(`${id}/`)),\n )\n const supervisors = await Promise.all(\n rows.map(async (run) => {\n // SupervisorOpts.runId is the journal root key; require its recorded discovery binding.\n const binding = discovery.roots.find((id) => id === run.runId)\n // A retained run journals admissions only and writes no spawn journal to bind.\n if (!binding && existsSync(discovery.spawnJournalPath))\n throw new Error('observer run has no discovered spawn root')\n const events = binding ? ((await spawnJournal.loadTree(binding)) ?? []) : []\n const rootSpawn = events.find((event) => event.kind === 'spawned' && event.id === binding)\n const budget = rootSpawn?.kind === 'spawned' ? rootSpawn.budget?.maxTokens : undefined\n // supervise() records no agent.run for its root; the spawn journal's settlement is the end.\n const terminal = events\n .filter((e) => e.id === binding && (e.kind === 'settled' || e.kind === 'cancelled'))\n .at(-1)\n const settledAt =\n run.settledAt === undefined ? terminal?.at : new Date(run.settledAt).toISOString()\n return buildSupervisorView(\n {\n id: run.runId,\n status:\n run.status !== 'running' || terminal === undefined\n ? run.status\n : terminal.kind === 'settled'\n ? terminal.status\n : 'cancelled',\n task: run.runId,\n workspaceDir: root,\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n startedAt: new Date(run.firstObservedAt).toISOString(),\n ...(settledAt === undefined ? {} : { completedAt: settledAt }),\n },\n discovery.runDir,\n events.filter(isSpawnEvent),\n run.error ? [run.error] : [],\n now,\n undefined,\n run,\n )\n }),\n )\n return topSnapshot(root, now, supervisors, [], 1, pursuit)\n } catch (error) {\n const reason =\n isRecord(error) && typeof error.code === 'string' ? 'unreadable' : 'invalid-state'\n return topSnapshot(root, now, [], [{ source, path, reason }], 1, pursuit)\n }\n}\n\n/** Old Discovery and factory roots may predate observer.jsonl; absence never establishes known totals. */\nasync function loadJournalTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir),\n dir = resolve(runDir)\n try {\n const discovery = await discoverDurableSupervisionRun(dir)\n const journal = new FileSpawnJournal(discovery.spawnJournalPath)\n const supervisors = await Promise.all(\n discovery.roots.map(async (id, i) => {\n const events = (await journal.loadTree(id)) ?? []\n const terminal = events\n .filter(\n (event) => event.id === id && (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n .at(-1)\n const first = events.find((event) => event.kind === 'spawned' && event.id === id)\n const budget = first?.kind === 'spawned' ? first.budget?.maxTokens : undefined\n const tails = readWorkerEventTails(supervisorWorkersDir(dir), 8)\n const view = buildSupervisorView(\n {\n id,\n task: id,\n workspaceDir: root,\n status:\n terminal?.kind === 'settled'\n ? terminal.status\n : terminal?.kind === 'cancelled'\n ? 'cancelled'\n : 'running',\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n ...(discovery.rootsBegunAt[i] ? { startedAt: discovery.rootsBegunAt[i]! } : {}),\n ...(terminal?.at ? { completedAt: terminal.at } : {}),\n },\n dir,\n events.filter(isSpawnEvent),\n [],\n now,\n tails.value,\n )\n return { ...view, totals: { ...view.totals, usdKnown: false, tokensKnown: false } }\n }),\n )\n return topSnapshot(\n root,\n now,\n supervisors,\n [{ source: 'observer-journal', path: 'observer.jsonl', reason: 'missing' }],\n discovery.roots.length,\n )\n } catch {\n return topSnapshot(\n root,\n now,\n [],\n [{ source: 'journal', path: 'spawn-journal.jsonl', reason: 'invalid-state' }],\n )\n }\n}\n\nfunction observerSpend(spend: Spend | undefined, gaps: readonly SpendChannel[] = []): SpendStats {\n const parsed = parseSpend(spend)\n return {\n ...parsed,\n usdKnown: spend !== undefined && parsed.usdKnown !== false && !gaps.includes('usd'),\n tokensKnown: spend !== undefined && parsed.tokensKnown !== false && !gaps.includes('tokens'),\n }\n}\n\n/**\n * The journal file a run dir actually carries. `createFileRunContext` — this repo's own durable\n * writer — names it `spawn-journal.jsonl`; `journal.jsonl` is the retired bare-event file older\n * runs left behind. First existing name wins; a reader that knew only the retired name would show\n * zero workers for every current run.\n */\nconst journalFileNames = ['spawn-journal.jsonl', 'journal.jsonl'] as const\n\nfunction readJournal(eventDir: string): SourceRead<TopJournalEvent[]> {\n const path = journalFileNames.find((candidate) => existsSync(join(eventDir, candidate)))\n if (!path) return { value: [], diagnostics: [] }\n const read = readSourceFile(join(eventDir, path), 'journal', path)\n if (read.value === undefined) return { value: [], diagnostics: read.diagnostics }\n const out: TopJournalEvent[] = []\n let partial = false\n for (const line of read.value.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>\n const events =\n parsed.kind === 'event' || parsed.kind === 'events'\n ? spawnJournalRecordEvents(parsed)\n : [parsed]\n for (const event of events) if (isSpawnEvent(event)) out.push(event)\n } catch {\n // A corrupt line is expected while the writer is mid-append; keep the lines that parsed.\n partial = true\n }\n }\n return {\n value: out,\n diagnostics: partial ? [{ source: 'journal', path, reason: 'partial-json' }] : [],\n }\n}\n\nfunction buildSupervisorView(\n state: SupervisorState,\n stateDir: string,\n events: readonly TopJournalEvent[],\n progressTail: readonly string[],\n now: number,\n workerEventTails = new Map<string, WorkerEventTail>(),\n accounting?: PursuitRunProjection,\n): SupervisorView {\n const workers = new Map<string, MutableWorker>()\n let driverSpend = emptySpend\n // State and journal have different producers and root ids. Exclude both, or the journal's\n // root becomes a phantom running worker that captures steer and cancel operations.\n const journalRootId = events.find(\n (event) => event.kind === 'spawned' && !event.parent && event.label === 'root',\n )?.id\n const isRoot = (id: string): boolean => id === state.id || id === journalRootId\n\n for (const event of events) {\n if (isRoot(event.id) || (event.kind === 'spawned' && !event.parent && event.label === 'root')) {\n if (event.kind === 'metered' && event.accountingOnly !== true) {\n driverSpend = addSpend(driverSpend, parseSpend(event.spend))\n }\n continue\n }\n const worker = ensureWorker(workers, event.id)\n if (event.kind === 'spawned') {\n worker.label = event.label ?? worker.label\n if (event.parent) worker.parent = event.parent\n if (event.runtime) worker.runtime = event.runtime\n worker.status = 'running'\n if (event.at) worker.startedAt = event.at\n const budget = parseBudget(event.budget)\n if (budget) worker.budget = budget\n } else if (event.kind === 'settled' || event.kind === 'cancelled') {\n if (event.at) worker.endedAt = event.at\n if (event.kind === 'settled') {\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.outRef) worker.outRef = event.outRef\n if (event.infra !== undefined) worker.infra = event.infra\n const verdict = describeVerdict(event.verdict)\n if (verdict) worker.verdict = verdict\n } else {\n worker.status = 'cancelled'\n if (event.reason) worker.reason = event.reason\n }\n if (event.kind === 'settled' || event.spent !== undefined) {\n worker.spend = addSpend(worker.spend, parseSpend(event.spent))\n // Live progress is cumulative; terminal spend replaces it rather than counting it twice.\n worker.metered = emptySpend\n }\n } else if (event.kind === 'progress') {\n worker.metered = parseSpend(event.spend)\n } else if (event.accountingOnly !== true) {\n worker.metered = addSpend(worker.metered, parseSpend(event.spend))\n }\n }\n\n if (accounting) {\n driverSpend = observerSpend(accounting.totals.exclusiveByNode[accounting.runId])\n for (const worker of workers.values()) {\n worker.spend = observerSpend(\n accounting.totals.exclusiveByNode[worker.id],\n accounting.spendGaps?.find((gap) => gap.id === worker.id)?.channels,\n )\n worker.metered = emptySpend\n }\n }\n const workerViews = [...workers.values()]\n .map((worker) => {\n // Tails are keyed by file stem, which the writer put through `safeWorkerFile`; a label\n // carrying characters that stem strips would otherwise never find its own events.\n const tail =\n workerEventTails.get(worker.label) ??\n workerEventTails.get(safeWorkerFile(worker.label)) ??\n workerEventTails.get(safeWorkerFile(worker.id)) ??\n workerEventTails.get(worker.id)\n worker.liveTail = tail?.lines ?? []\n if (tail?.file) worker.eventFile = tail.file\n return finalizeWorker(worker, now)\n })\n .sort((a, b) => compareWorker(a, b))\n\n const totals = supervisorTotals(state, workerViews, driverSpend, now)\n if (accounting) {\n const spend = observerSpend(\n accounting.totals.inclusive,\n accounting.spendGaps?.flatMap((gap) => gap.channels),\n )\n Object.assign(totals, spend, { tokensTotal: spend.tokensInput + spend.tokensOutput })\n }\n return {\n id: state.id,\n stateDir,\n status: state.status,\n task: state.task,\n workspaceDir: state.workspaceDir,\n budget: state.budget,\n ...(state.budgetKnown === undefined ? {} : { budgetKnown: state.budgetKnown }),\n ...selectFields(\n state,\n [\n 'verifyCmd',\n 'workerModel',\n 'driverModel',\n 'verdict',\n 'progress',\n 'startedAt',\n 'completedAt',\n ],\n Boolean,\n ),\n ...selectFields(\n state,\n ['maxSandboxes', 'maxLifetimeSeconds', 'idleTimeoutSeconds', 'maxUsd', 'maxDepth'],\n (value) => value !== undefined,\n ),\n ...(state.result?.spentUsd !== undefined ? { resultSpentUsd: state.result.spentUsd } : {}),\n ...(state.result?.spentTokens !== undefined\n ? { resultSpentTokens: state.result.spentTokens }\n : {}),\n workers: workerViews,\n progressTail: [...progressTail],\n journalTail: events.slice(-12),\n driverSpend,\n totals,\n }\n}\n\nfunction selectFields<T, K extends keyof T>(\n value: T,\n keys: readonly K[],\n include: (value: T[K]) => boolean,\n): Partial<Pick<T, K>> {\n const selected: Partial<Pick<T, K>> = {}\n for (const key of keys) if (include(value[key])) selected[key] = value[key]\n return selected\n}\n\nfunction ensureWorker(workers: Map<string, MutableWorker>, id: string): MutableWorker {\n const existing = workers.get(id)\n if (existing) return existing\n const created: MutableWorker = {\n id,\n label: id,\n status: 'running',\n spend: emptySpend,\n metered: emptySpend,\n liveTail: [],\n }\n workers.set(id, created)\n return created\n}\n\nfunction finalizeWorker(worker: MutableWorker, now: number): WorkerView {\n const startMs = parseTime(worker.startedAt)\n const endMs = parseTime(worker.endedAt) ?? (worker.status === 'running' ? now : startMs)\n const latencyMs = startMs !== undefined && endMs !== undefined ? Math.max(0, endMs - startMs) : 0\n return { ...worker, latencyMs }\n}\n\nfunction supervisorTotals(\n state: SupervisorState,\n workers: readonly WorkerView[],\n driverSpend: SpendStats,\n now: number,\n): SupervisorTotals {\n const spend = workers.map(totalSpend).reduce(addSpend, driverSpend)\n const counts = { running: 0, done: 0, down: 0, cancelled: 0 }\n for (const worker of workers) counts[worker.status] += 1\n const started = parseTime(state.startedAt)\n const completed = parseTime(state.completedAt)\n const latencyMs = started !== undefined ? Math.max(0, (completed ?? now) - started) : 0\n const latencies = workers.map((worker) => worker.latencyMs).filter((ms) => ms > 0)\n return {\n workers: workers.length,\n ...counts,\n ...(spend.usdKnown === false ? { usdKnown: false } : {}),\n ...(spend.tokensKnown === false ? { tokensKnown: false } : {}),\n inFlight: counts.running,\n settled: workers.length - counts.running,\n tokensInput: spend.tokensInput,\n tokensOutput: spend.tokensOutput,\n tokensTotal: spend.tokensInput + spend.tokensOutput,\n usd: spend.usd > 0 ? spend.usd : (state.result?.spentUsd ?? 0),\n latencyMs,\n workerLatency: distribution(latencies),\n }\n}\n\nexport function aggregateSnapshot(snapshot: TopSnapshot) {\n const complete = snapshot.completeness === 'complete'\n return {\n usdKnown: complete && snapshot.supervisors.every((row) => row.totals.usdKnown !== false),\n tokensKnown: complete && snapshot.supervisors.every((row) => row.totals.tokensKnown !== false),\n supervisors: snapshot.supervisors.length,\n workers: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.workers)),\n running: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.running)),\n done: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.done)),\n down: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.down)),\n usd: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.usd)),\n tokensInput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensInput)),\n tokensOutput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensOutput)),\n }\n}\n\nfunction compareWorker(a: WorkerView, b: WorkerView): number {\n const aStart = parseTime(a.startedAt) ?? 0\n const bStart = parseTime(b.startedAt) ?? 0\n if (a.status === 'running' && b.status !== 'running') return -1\n if (b.status === 'running' && a.status !== 'running') return 1\n return aStart - bStart || a.label.localeCompare(b.label)\n}\n\nexport function totalSpend(worker: WorkerView): SpendStats {\n return addSpend(worker.spend, worker.metered)\n}\n\nfunction addSpend(a: SpendStats, b: SpendStats): SpendStats {\n return {\n iterations: a.iterations + b.iterations,\n tokensInput: a.tokensInput + b.tokensInput,\n tokensOutput: a.tokensOutput + b.tokensOutput,\n usd: a.usd + b.usd,\n ms: a.ms + b.ms,\n ...(a.usdKnown === false || b.usdKnown === false ? { usdKnown: false } : {}),\n ...(a.tokensKnown === false || b.tokensKnown === false ? { tokensKnown: false } : {}),\n }\n}\n\nexport function parseSpend(value: unknown): SpendStats {\n if (!isRecord(value)) return emptySpend\n const tokens = isRecord(value.tokens) ? value.tokens : {}\n return {\n ...(value.usdKnown === false ? { usdKnown: false } : {}),\n ...(value.tokensKnown === false || tokens.tokensKnown === false ? { tokensKnown: false } : {}),\n iterations: numberValue(value.iterations),\n tokensInput: numberValue(tokens.input),\n tokensOutput: numberValue(tokens.output),\n usd: numberValue(value.usd),\n ms: numberValue(value.ms),\n }\n}\n\nfunction parseBudget(value: unknown): BudgetStats | undefined {\n if (!isRecord(value)) return undefined\n const budget: BudgetStats = {\n ...(typeof value.maxIterations === 'number' ? { maxIterations: value.maxIterations } : {}),\n ...(typeof value.maxTokens === 'number' ? { maxTokens: value.maxTokens } : {}),\n ...(typeof value.maxUsd === 'number' ? { maxUsd: value.maxUsd } : {}),\n }\n return Object.keys(budget).length ? budget : undefined\n}\n\nfunction describeVerdict(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined\n if (typeof value.valid === 'boolean') return value.valid ? 'valid' : 'invalid'\n if (typeof value.score === 'number') return `score ${value.score.toFixed(2)}`\n return undefined\n}\n\nfunction distribution(values: readonly number[]): Distribution {\n const sorted = [...values].sort((a, b) => a - b)\n return {\n n: sorted.length,\n min: sorted[0] ?? 0,\n median: percentile(sorted, 0.5),\n p90: percentile(sorted, 0.9),\n max: sorted[sorted.length - 1] ?? 0,\n }\n}\n\nfunction percentile(sorted: readonly number[], p: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * p) - 1))\n return sorted[idx] ?? 0\n}\n\n/**\n * Read one source file under a run directory. An absent file is not a defect on its own — the\n * writer may not have reached it yet — so it reads as `undefined` with no diagnostic; only a\n * failed read raises one. `path` stays run-relative and never carries file contents.\n */\nfunction readSourceFile(\n file: string,\n source: TopSnapshotDiagnosticSource,\n path: string,\n): SourceRead<string | undefined> {\n if (!existsSync(file)) return { value: undefined, diagnostics: [] }\n try {\n return { value: readFileSync(file, 'utf8'), diagnostics: [] }\n } catch {\n return { value: undefined, diagnostics: [{ source, path, reason: 'unreadable' }] }\n }\n}\n\nfunction tailLines(raw: string | undefined, maxLines: number): string[] {\n if (raw === undefined) return []\n return raw.trim().split('\\n').filter(Boolean).slice(-maxLines)\n}\n\nfunction readWorkerEventTails(\n dir: string,\n maxLines: number,\n): SourceRead<Map<string, WorkerEventTail>> {\n const out = new Map<string, WorkerEventTail>()\n if (!existsSync(dir)) return { value: out, diagnostics: [] }\n const workersDir = basename(dir)\n let entries: string[]\n try {\n entries = readdirSync(dir)\n } catch {\n return {\n value: out,\n diagnostics: [{ source: 'worker-tail', path: workersDir, reason: 'unreadable' }],\n }\n }\n const diagnostics: SourceDiagnostic[] = []\n for (const entry of entries) {\n // `<label>.inbox.ndjson` is the down-leg steer queue, not this worker's control-event log.\n if (!entry.endsWith('.ndjson') || entry.endsWith('.inbox.ndjson')) continue\n const file = join(dir, entry)\n const read = readSourceFile(file, 'worker-tail', join(workersDir, entry))\n diagnostics.push(...read.diagnostics)\n const lines = tailLines(read.value, maxLines)\n out.set(entry.slice(0, -'.ndjson'.length), { file, lines })\n }\n return { value: out, diagnostics }\n}\n\nfunction readSupervisorState(dir: string): SourceRead<SupervisorState | undefined> {\n const path = 'state.json'\n const read = readSourceFile(join(dir, path), 'supervisor-state', path)\n if (read.diagnostics.length > 0) return { value: undefined, diagnostics: read.diagnostics }\n const failed = (reason: TopSnapshotDiagnosticReason): SourceRead<undefined> => ({\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason }],\n })\n if (read.value === undefined) return failed('missing')\n try {\n const parsed: unknown = JSON.parse(read.value)\n return isSupervisorState(parsed) ? { value: parsed, diagnostics: [] } : failed('invalid-state')\n } catch {\n return failed('partial-json')\n }\n}\n\nfunction isSupervisorState(value: unknown): value is SupervisorState {\n return (\n isRecord(value) &&\n Object.entries({\n id: 'string',\n status: 'string',\n task: 'string',\n workspaceDir: 'string',\n budget: 'number',\n }).every(([key, type]) => typeof value[key] === type)\n )\n}\n\nfunction isSpawnEvent<T>(value: T): value is T & TopJournalEvent {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n ['spawned', 'settled', 'cancelled', 'metered', 'progress'].includes(value.kind)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n\nexport function numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nexport function parseTime(value: string | undefined): number | undefined {\n if (!value) return undefined\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nfunction sum(values: readonly number[]): number {\n return values.reduce((total, value) => total + value, 0)\n}\n","import { createHash } from 'node:crypto'\nimport { existsSync, type FSWatcher, readdirSync, watch } from 'node:fs'\nimport { readFile, realpath, stat } from 'node:fs/promises'\nimport { createServer, type ServerResponse } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { dirname, extname, resolve, sep } from 'node:path'\nimport { loadTopSnapshot, type TopSnapshot, type WorkerView } from './top-snapshot'\nimport { transcriptHistory, type transcriptRows, transcriptTail } from './top-transcript'\n\n/** A reconnect always receives current truth; deltas replace changed roots atomically. */\nexport interface TopSnapshotFrame {\n readonly sequence: number\n readonly observedAt: number\n readonly reset: boolean\n readonly snapshots: readonly TopSnapshot[]\n}\n\nexport interface TopWebOptions {\n readonly roots: readonly string[]\n /** Defaults to the installed agent-record browser asset export. */\n readonly assets?: string\n readonly host?: string\n readonly port?: number\n}\n\n/** Read-only web transport over the same snapshots as the terminal. No execution or writes. */\nexport async function serveTopWeb(options: TopWebOptions) {\n if (!options.roots.length) throw new Error('At least one --root is required')\n const roots = [...new Set(await Promise.all(options.roots.map((root) => realpath(root))))]\n const assets = await realpath(\n options.assets ??\n dirname(\n createRequire(import.meta.url).resolve('@drewstone/agent-record/workspace-viewer.js'),\n ),\n )\n for (const file of ['workspace-viewer.js', 'styles.css']) await stat(resolve(assets, file))\n const host = options.host ?? '127.0.0.1'\n const clients = new Set<ServerResponse>()\n const transcripts = new Set<() => void>()\n const snapshots = new Map<string, TopSnapshot>()\n const digests = new Map<string, string>()\n const watchers: FSWatcher[] = []\n let sequence = 0\n let reading = false\n let dirty = true\n let closed = false\n let scheduled: NodeJS.Timeout | undefined\n const send = (client: ServerResponse, frame: TopSnapshotFrame) => {\n if (client.writableLength > 1024 * 1024) return client.destroy()\n client.write(`id: ${frame.sequence}\\nevent: snapshot\\ndata: ${JSON.stringify(frame)}\\n\\n`)\n }\n const refresh = async () => {\n if (reading || closed) return\n reading = true\n dirty = false\n try {\n const changed: TopSnapshot[] = []\n for (const root of roots) {\n const snapshot = existsSync(resolve(root, 'observer.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root })\n : existsSync(resolve(root, 'spawn-journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'journal' })\n : existsSync(resolve(root, 'journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'workflow' })\n : await loadRunsRoot(root)\n const digest = createHash('sha256')\n .update(\n JSON.stringify(snapshot, (key, value) =>\n key === 'generatedAt' || key === 'latencyMs' ? undefined : value,\n ),\n )\n .digest('hex')\n snapshots.set(root, snapshot)\n if (digests.get(root) !== digest) {\n changed.push(snapshot)\n digests.set(root, digest)\n }\n }\n if (changed.length) {\n const frame = {\n sequence: ++sequence,\n observedAt: Date.now(),\n reset: false,\n snapshots: changed,\n }\n for (const client of clients) send(client, frame)\n }\n for (const update of transcripts) update()\n } finally {\n reading = false\n if (dirty && !closed) schedule()\n }\n }\n const schedule = () => {\n dirty = true\n if (!scheduled && !closed)\n scheduled = setTimeout(() => {\n scheduled = undefined\n void refresh().catch((error: unknown) => {\n for (const client of clients)\n client.write(\n `event: unavailable\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`,\n )\n })\n }, 16)\n }\n await refresh()\n for (const root of roots) watchers.push(watch(root, { recursive: true }, schedule))\n // Watch notifications may be coalesced or lost; the same loader reconciles them without a second model.\n const reconcile = setInterval(schedule, 500)\n const heartbeat = setInterval(() => {\n for (const client of clients) client.write(': alive\\n\\n')\n }, 15_000)\n const server = createServer((request, response) => {\n void (async () => {\n const base = `http://${request.headers.host}`\n const incomingHost = new URL(base).hostname.replace(/^\\[|\\]$/g, '')\n if (\n !request.headers.host ||\n ![host, '127.0.0.1', 'localhost', '::1'].includes(incomingHost) ||\n (request.headers.origin && request.headers.origin !== base)\n ) {\n response.writeHead(403).end()\n return\n }\n if (request.method !== 'GET' && request.method !== 'HEAD') {\n response.writeHead(405, { Allow: 'GET, HEAD' }).end()\n return\n }\n const path = new URL(request.url ?? '/', base).pathname\n response.setHeader('Cache-Control', 'no-store')\n response.setHeader('X-Content-Type-Options', 'nosniff')\n if (path === '/api/top/events') {\n if (request.method === 'HEAD') {\n response.writeHead(200, { 'Content-Type': 'text/event-stream' }).end()\n return\n }\n response.writeHead(200, { 'Content-Type': 'text/event-stream', 'X-Accel-Buffering': 'no' })\n response.flushHeaders()\n clients.add(response)\n send(response, {\n sequence,\n observedAt: Date.now(),\n reset: true,\n snapshots: [...snapshots.values()],\n })\n response.on('close', () => clients.delete(response))\n } else if (/^\\/api\\/top\\/agents\\/\\d+\\/[^/]+\\/[^/]+\\/stream$/.test(path)) {\n const [, , , , rootIndex, runId, workerId] = path.split('/').map(decodeURIComponent)\n const root = roots[Number(rootIndex)]\n const worker = (): WorkerView | undefined => {\n const run = root\n ? snapshots.get(root)?.supervisors.find((run) => run.id === runId)\n : undefined\n const node = run?.workers.find((node) => node.id === workerId)\n if (node || !run || run.id !== workerId) return node\n return {\n id: run.id,\n label: 'root',\n ...(root && existsSync(resolve(root, 'root-stream.jsonl'))\n ? { eventFile: resolve(root, 'root-stream.jsonl') }\n : {}),\n status:\n run.status === 'cancelled'\n ? 'cancelled'\n : run.status === 'done'\n ? 'done'\n : run.status === 'down'\n ? 'down'\n : 'running',\n startedAt: run.startedAt,\n endedAt: run.completedAt,\n latencyMs: run.totals.latencyMs,\n spend: run.driverSpend,\n metered: { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 },\n liveTail: run.progressTail,\n }\n }\n if (!worker()) {\n response.writeHead(404).end()\n return\n }\n let history: ReturnType<typeof transcriptRows> | undefined = await transcriptHistory(\n worker()!,\n root,\n snapshots\n .get(root!)\n ?.pursuit?.nodes.find((node) => node.runId === runId && node.id === workerId),\n )\n response.writeHead(200, { 'Content-Type': 'text/event-stream', 'X-Accel-Buffering': 'no' })\n response.flushHeaders()\n if (request.method === 'HEAD') {\n response.end()\n return\n }\n const generation = Date.now()\n response.write(`event: reset\\ndata: ${JSON.stringify({ generation })}\\n\\n`)\n const seen = new Set<string>()\n let lastSeq = 0\n const update = () => {\n const node = worker()\n if (!node || response.writableLength > 1024 * 1024) {\n response.destroy()\n return\n }\n const events = (history ?? transcriptTail(node)).flatMap((row) => {\n const key = createHash('sha256').update(JSON.stringify(row)).digest('hex')\n if (seen.has(key)) return []\n seen.add(key)\n if (seen.size > 2000) seen.delete(seen.values().next().value!)\n return [{ ...row, seq: ++lastSeq }]\n })\n history = undefined\n const alive = node.status === 'running'\n response.write(\n `event: rows\\ndata: ${JSON.stringify({ generation, events, lastSeq, alive, window: 'recorded-tail' })}\\n\\n`,\n )\n if (!alive) {\n response.write('event: end\\ndata: {}\\n\\n')\n response.end()\n }\n }\n transcripts.add(update)\n response.on('close', () => transcripts.delete(update))\n update()\n } else if (path === '/api/top') {\n response.writeHead(200, { 'Content-Type': 'application/json' })\n response.end(\n JSON.stringify({\n sequence,\n observedAt: Date.now(),\n reset: true,\n snapshots: [...snapshots.values()],\n }),\n )\n } else if (path === '/') {\n response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })\n response.end(\n '<!doctype html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Live agents</title><link rel=\"stylesheet\" href=\"/assets/styles.css\"></head><body><div id=\"agent-workspace\" data-mode=\"live\" data-api=\"/api/top\" data-theme=\"dark\"></div><script type=\"module\" src=\"/assets/workspace-viewer.js\"></script></body></html>',\n )\n } else if (path.startsWith('/assets/')) {\n const file = await realpath(resolve(assets, decodeURIComponent(path.slice(8))))\n if (!file.startsWith(assets + sep)) {\n response.writeHead(403).end()\n return\n }\n const kind = { '.js': 'text/javascript', '.css': 'text/css', '.woff2': 'font/woff2' }[\n extname(file)\n ]\n if (!kind) {\n response.writeHead(404).end()\n return\n }\n response.writeHead(200, { 'Content-Type': kind })\n response.end(request.method === 'HEAD' ? undefined : await readFile(file))\n } else response.writeHead(404).end()\n })().catch((error: unknown) => {\n if (!response.headersSent) response.writeHead(500, { 'Content-Type': 'application/json' })\n response.end(JSON.stringify({ error: String(error) }))\n })\n })\n let closing: Promise<void> | undefined\n const close = () =>\n (closing ??= (async () => {\n closed = true\n if (scheduled) clearTimeout(scheduled)\n clearInterval(reconcile)\n clearInterval(heartbeat)\n for (const watcher of watchers) watcher.close()\n for (const client of clients) client.end()\n transcripts.clear()\n server.closeAllConnections()\n await new Promise<void>((done, reject) =>\n server.close((error) =>\n error && (!('code' in error) || error.code !== 'ERR_SERVER_NOT_RUNNING')\n ? reject(error)\n : done(),\n ),\n )\n })())\n try {\n await new Promise<void>((done, reject) => {\n server.once('error', reject)\n server.listen(options.port ?? 0, host, done)\n })\n } catch (error) {\n await close()\n throw error\n }\n const address = server.address()\n if (!address || typeof address === 'string') throw new Error('Web server has no TCP address')\n return { url: `http://${host.includes(':') ? `[${host}]` : host}:${address.port}/`, close }\n}\n\n/** CLI options stay on agent-runtime-top; the renderer is supplied by its installed owner. */\nexport async function runTopWeb(argv: readonly string[]) {\n const values = (flag: string) =>\n argv.flatMap((arg, i) => (arg === flag ? [argv[i + 1] ?? ''] : []))\n const roots = values('--root')\n const port = Number(values('--port')[0] ?? 0)\n if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error('Invalid --port')\n const web = await serveTopWeb({\n roots: roots.length ? roots : [process.cwd()],\n ...(values('--assets')[0] ? { assets: values('--assets')[0] } : {}),\n port,\n ...(values('--host')[0] ? { host: values('--host')[0] } : {}),\n })\n process.stdout.write(`${JSON.stringify({ event: 'ready', url: web.url, pid: process.pid })}\\n`)\n const stop = () => {\n void web.close().catch((error: unknown) => {\n process.stderr.write(`${String(error)}\\n`)\n process.exitCode = 1\n })\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n return web\n}\n\n/** A journal root holds one `<runId>/observer.jsonl` per retained run beside any workspace runs. */\nasync function loadRunsRoot(root: string): Promise<TopSnapshot> {\n const workspace = loadTopSnapshot(root)\n // A supervised run writes its spawn journal at begin and its observer journal after the first\n // turn; either one makes the run a card, so it appears as soon as supervision starts.\n const has = (runId: string, file: string) => existsSync(resolve(root, runId, file))\n const runIds = readdirSync(root, { withFileTypes: true })\n .filter(\n (entry) =>\n entry.isDirectory() &&\n (has(entry.name, 'observer.jsonl') || has(entry.name, 'spawn-journal.jsonl')),\n )\n .map((entry) => entry.name)\n if (!runIds.length) return workspace\n const runs = await Promise.all(\n runIds.map((runId) =>\n loadTopSnapshot(root, {\n runDir: resolve(root, runId),\n ...(has(runId, 'observer.jsonl') ? {} : { format: 'journal' as const }),\n }),\n ),\n )\n const diagnostics = [\n ...workspace.diagnostics,\n ...runs.flatMap((run, i) => run.diagnostics.map((d) => ({ ...d, runId: runIds[i] }))),\n ]\n const supervisors = [...workspace.supervisors, ...runs.flatMap((run) => run.supervisors)]\n return {\n ...workspace,\n supervisors,\n diagnostics,\n completeness: diagnostics.length ? 'partial' : 'complete',\n discovered: workspace.discovered + runIds.length,\n loaded: supervisors.length,\n }\n}\n"],"mappings":"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"}
|