@tangle-network/agent-runtime 3.0.30 → 3.0.32

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.
Files changed (60) hide show
  1. package/dist/{activation-BspipHFs.js → activation-CWOj5iZe.js} +2 -2
  2. package/dist/{activation-BspipHFs.js.map → activation-CWOj5iZe.js.map} +1 -1
  3. package/dist/{activation-D0dnzmz_.d.ts → activation-DQhy-ET-.d.ts} +2 -2
  4. package/dist/agent.d.ts +1 -1
  5. package/dist/agent.js +3 -3
  6. package/dist/{coordination-manager-CIeVgZcp.js → coordination-manager-s1hbIqXx.js} +22 -12
  7. package/dist/{coordination-manager-CIeVgZcp.js.map → coordination-manager-s1hbIqXx.js.map} +1 -1
  8. package/dist/{delegate-C6e7UJNA.js → delegate-ubXkOvcK.js} +2 -2
  9. package/dist/{delegate-C6e7UJNA.js.map → delegate-ubXkOvcK.js.map} +1 -1
  10. package/dist/durable.d.ts +1 -1
  11. package/dist/durable.js +6 -6
  12. package/dist/{graph-CIAsV8GC.js → graph-BPqKAgZp.js} +5 -5
  13. package/dist/{graph-CIAsV8GC.js.map → graph-BPqKAgZp.js.map} +1 -1
  14. package/dist/{improve-DVJMU8wm.js → improve-CXK2GKbS.js} +6 -6
  15. package/dist/{improve-DVJMU8wm.js.map → improve-CXK2GKbS.js.map} +1 -1
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +8 -8
  18. package/dist/intelligence.d.ts +2 -2
  19. package/dist/intelligence.js +4 -4
  20. package/dist/kernel.d.ts +1 -1
  21. package/dist/kernel.js +11 -11
  22. package/dist/{loop-runner-BbWD5f9L.js → loop-runner-CJxzdLr-.js} +2 -2
  23. package/dist/{loop-runner-BbWD5f9L.js.map → loop-runner-CJxzdLr-.js.map} +1 -1
  24. package/dist/{loop-runner-_3NabgWH.d.ts → loop-runner-D1JVNvwC.d.ts} +2 -2
  25. package/dist/loop-runner-bin.d.ts +1 -1
  26. package/dist/loop-runner-bin.js +1 -1
  27. package/dist/mcp/bin.js +3 -3
  28. package/dist/mcp/index.d.ts +1 -1
  29. package/dist/mcp/index.js +5 -5
  30. package/dist/profiles.d.ts +1 -1
  31. package/dist/{provision-supervisor-RUefSoIS.js → provision-supervisor-B6-0_VQb.js} +4 -4
  32. package/dist/{provision-supervisor-RUefSoIS.js.map → provision-supervisor-B6-0_VQb.js.map} +1 -1
  33. package/dist/{run-cancellation-s3uzwrd6.js → run-cancellation-BRIB385R.js} +2 -2
  34. package/dist/{run-cancellation-s3uzwrd6.js.map → run-cancellation-BRIB385R.js.map} +1 -1
  35. package/dist/{runtime-BpQ8jOYP.js → runtime-LN0kcRwo.js} +11 -11
  36. package/dist/{runtime-BpQ8jOYP.js.map → runtime-LN0kcRwo.js.map} +1 -1
  37. package/dist/{scope-D5T_q60y.js → scope-CCHfmCvY.js} +2 -2
  38. package/dist/{scope-D5T_q60y.js.map → scope-CCHfmCvY.js.map} +1 -1
  39. package/dist/{search-executor-9mTYFafI.js → search-executor-Cypg4sCQ.js} +3 -3
  40. package/dist/{search-executor-9mTYFafI.js.map → search-executor-Cypg4sCQ.js.map} +1 -1
  41. package/dist/{server-DBy7Ev8_.js → server-CdP5hoHJ.js} +3 -3
  42. package/dist/{server-DBy7Ev8_.js.map → server-CdP5hoHJ.js.map} +1 -1
  43. package/dist/{structural-rollout-DkMKSOOb.js → structural-rollout-BS3hVAq2.js} +3 -3
  44. package/dist/{structural-rollout-DkMKSOOb.js.map → structural-rollout-BS3hVAq2.js.map} +1 -1
  45. package/dist/{supervise-Cz5gaGDW.js → supervise-CfuHhf-S.js} +5 -5
  46. package/dist/{supervise-Cz5gaGDW.js.map → supervise-CfuHhf-S.js.map} +1 -1
  47. package/dist/{supervision-discovery-BS5k2s-A.js → supervision-discovery-DcQU64rK.js} +2 -2
  48. package/dist/{supervision-discovery-BS5k2s-A.js.map → supervision-discovery-DcQU64rK.js.map} +1 -1
  49. package/dist/{supervisor-CIsucL58.js → supervisor-C-mx3kR8.js} +55 -39
  50. package/dist/supervisor-C-mx3kR8.js.map +1 -0
  51. package/dist/testing.d.ts +1 -1
  52. package/dist/testing.js +11 -11
  53. package/dist/{top-web-B981CLsj.js → top-web-l3naxnjo.js} +4 -4
  54. package/dist/{top-web-B981CLsj.js.map → top-web-l3naxnjo.js.map} +1 -1
  55. package/dist/tui/bin.js +3 -3
  56. package/dist/tui/index.d.ts +1 -1
  57. package/dist/tui/index.js +2 -2
  58. package/dist/{types-DQ4JHRDD.d.ts → types-ISwInoqb.d.ts} +15 -23
  59. package/package.json +1 -1
  60. package/dist/supervisor-CIsucL58.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"top-web-B981CLsj.js","names":[],"sources":["../src/tui/top-transcript.ts","../src/tui/workflow-journal.ts","../src/tui/top-snapshot.ts","../src/tui/top-web-agent.ts","../src/tui/top-web.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { closeSync, existsSync, fstatSync, openSync, readdirSync, readSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { StringDecoder } from 'node:string_decoder'\nimport type { AgentCandidateArtifactPort } from '../candidate-execution/types'\nimport type { PursuitNodeProjection } from '../durable/observer-projection'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport { recordValue } from '../record-value'\nimport {\n type HarnessTranscriptArtifact,\n type HarnessTranscriptMetadata,\n harnessTranscriptArtifact,\n} from '../runtime/harness-transcript'\nimport { ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport type { ResultBlobStore } from '../runtime/supervise/types'\nimport type { SupervisorView, TopSnapshotDiagnostic, WorkerView } from './top-snapshot'\n\nexport type BaselineAuthority = {\n readonly kind: 'retained-workspace' | 'git-object' | 'git-diff'\n readonly ref: string\n}\nexport type FileIdentity = { readonly sha256: string; readonly byteLength: number }\nexport interface TopInspection {\n readonly coverage: {\n readonly status: 'complete' | 'partial' | 'missing'\n readonly source: string\n readonly reason?: string\n readonly code?: 'source-mismatch' | 'source-unbound'\n readonly ref?: string\n }\n readonly rows?: readonly (TopTranscriptRow & {\n readonly id: string\n readonly sessionId: string\n readonly part: number\n })[]\n readonly context?: readonly TopTranscriptRow[]\n readonly files?: {\n readonly scope: 'workspace' | 'none'\n readonly complete: boolean\n readonly reason?: string\n readonly entries: readonly (FileIdentity & {\n readonly path: string\n readonly before?: FileIdentity & { readonly source: BaselineAuthority }\n })[]\n }\n readonly file?: FileIdentity & {\n readonly path: string\n readonly content: string\n readonly before?: FileIdentity & {\n readonly content: string\n readonly source: BaselineAuthority\n }\n }\n}\n\nexport interface TopTranscriptRow {\n at: string\n event: {\n kind: string\n text?: string\n provenance?: string\n source?: string\n actor?: string\n toolCallId?: string\n toolName?: string\n args?: unknown\n result?: unknown\n }\n}\nexport type TopSessionReader = (\n artifact: HarnessTranscriptArtifact,\n signal?: AbortSignal,\n) => Promise<readonly HarnessRowsSession[]>\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 return readTopAgentHistory(\n worker,\n runDir ? new FileResultBlobStore(join(runDir, 'blobs')) : undefined,\n node,\n )\n}\n\n/** Task, result and progress use the same projection for file-backed and SQL-backed runs. */\nexport async function readTopAgentHistory(\n worker: WorkerView,\n blobs?: Pick<ResultBlobStore, 'get'>,\n node?: PursuitNodeProjection,\n) {\n const rows: TopTranscriptRow[] = []\n const identity = recordValue(node?.identity ?? worker.identity)\n if (blobs && typeof identity?.taskDigest === 'string' && worker.startedAt) {\n const task = await blobs.get(identity.taskDigest)\n if (task !== undefined)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'delegated-input',\n source: `parent ${worker.parent ?? node?.parentId ?? 'run caller'}; task ${identity.taskDigest}; profile ${identity.profileDigest}`,\n text: `Request from ${worker.parent ?? node?.parentId ?? 'run caller'}\\n${typeof task === 'string' ? task : JSON.stringify(task, null, 2)}`,\n },\n })\n }\n const progress = transcriptTail(worker)\n if (worker.startedAt)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'capture-unavailable',\n text: 'Full conversation capture has not been verified in this progress tail.',\n source: 'Runtime progress evidence',\n },\n })\n const outRef = node?.outRef ?? worker.outRef\n const result = blobs && outRef && worker.endedAt ? await blobs.get(outRef) : undefined\n if (result !== undefined)\n progress.push({\n at: worker.endedAt!,\n event: {\n kind: 'notice',\n provenance: 'recorded-result',\n source: `result ${outRef}; Runtime ResultBlobStore`,\n text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),\n },\n })\n return [...rows, ...progress]\n}\n\n/** Resolve ordinary Runtime transcript evidence, never a product-specific capture registry. */\nexport async function readTopAgentInspection({\n worker,\n runId,\n blobs,\n readSessions,\n artifacts,\n signal,\n}: {\n worker: WorkerView\n runId: string\n blobs: Pick<ResultBlobStore, 'get'>\n readSessions: TopSessionReader\n artifacts?: AgentCandidateArtifactPort\n signal?: AbortSignal\n}): Promise<TopInspection> {\n const evidence = worker.harnessTranscript\n const files = {\n scope: 'none' as const,\n complete: true,\n reason: 'Transcript evidence does not include a workspace inventory',\n entries: [],\n }\n if (!evidence || evidence.status !== 'available')\n return {\n coverage: {\n status: 'missing',\n source: 'Runtime transcript receipt',\n reason: evidence?.reason ?? 'No transcript receipt was recorded',\n },\n files,\n }\n const metadata = await harnessTranscriptArtifact(evidence, blobs, { content: false, signal })\n if (!metadata) throw new Error('Available transcript receipt has no metadata')\n const binding = inspectionBinding(metadata, worker, runId)\n if (binding.mismatch.length)\n return {\n coverage: {\n status: 'missing',\n source: 'Runtime transcript receipt',\n code: 'source-mismatch',\n reason: binding.mismatch.join('; '),\n },\n files,\n }\n const artifact = await harnessTranscriptArtifact(evidence, blobs, { artifacts, signal })\n if (!artifact) throw new Error('Available transcript receipt has no artifact')\n const projection = harnessSessionRows(await readSessions(artifact, signal))\n const reasons = [\n ...binding.missing,\n ...(evidence.missing ?? []),\n ...artifact.skipped.map((file) => `${file.path}: ${file.reason}`),\n ...projection.gaps.map((gap) => `${gap.sessionId}/${gap.recordId}: ${gap.reason}`),\n ]\n const complete =\n evidence.coverageComplete === true && reasons.length === 0 && projection.rows.length > 0\n return {\n coverage: {\n status: complete ? 'complete' : 'partial',\n source: `${artifact.harness} Runtime transcript`,\n ref: `urn:${evidence.transcriptRef}`,\n ...(binding.missing.length ? { code: 'source-unbound' as const } : {}),\n ...(!complete\n ? { reason: reasons.join('; ') || 'Source completeness was not attested' }\n : {}),\n },\n rows: projection.rows,\n files,\n }\n}\n\n/** Verify the receipt belongs to the selected node before resolving any native/archive bytes. */\nfunction inspectionBinding(metadata: HarnessTranscriptMetadata, worker: WorkerView, runId: string) {\n const mismatch: string[] = [],\n missing: string[] = []\n if (metadata.binding !== undefined && !recordValue(metadata.binding))\n mismatch.push('Capture Bridge binding is malformed')\n if (metadata.source && metadata.binding) mismatch.push('Capture has conflicting source bindings')\n const source = metadata.source ?? metadata.binding\n if (!source) return { mismatch, missing: ['Capture has no recorded node binding'] }\n const node = recordValue(source.node)\n if (!node) {\n if (source.node !== undefined) mismatch.push('Capture node binding is malformed')\n else missing.push('Capture has no recorded node identity')\n } else {\n for (const [key, expected] of [\n ['rootId', runId],\n ['nodeId', worker.id],\n ['parentId', worker.parent],\n ] as const) {\n if (expected !== undefined && node[key] !== expected)\n mismatch.push(`Capture ${key} does not match selected node`)\n }\n const attempt = worker.executionBindings?.at(-1)?.attemptId\n if (typeof node.attemptId !== 'string' || !node.attemptId)\n mismatch.push('Capture attempt identity is malformed')\n else if (attempt && node.attemptId !== attempt)\n mismatch.push('Capture attempt does not match selected node')\n else if (!attempt) missing.push('Selected node has no recorded execution attempt')\n const identity = recordValue(node.identity)\n for (const key of ['profileDigest', 'taskDigest'] as const) {\n const expected = worker.identity?.[key]\n if (expected && identity?.[key] === undefined) missing.push(`Capture has no recorded ${key}`)\n else if (expected && identity?.[key] !== expected)\n mismatch.push(`Capture ${key} does not match selected node`)\n }\n }\n const materialization = worker.materialization\n if (materialization?.status !== 'known')\n missing.push('Selected node has no known materialization')\n else {\n if (source.profileDigest !== materialization.effectiveProfileDigest)\n mismatch.push('Capture profile does not match selected materialization')\n const execution = materialization.execution\n const kind = metadata.source ? 'environment' : 'session'\n const id = metadata.source?.environmentId ?? metadata.binding?.sessionId\n if (execution.kind !== kind || execution.id !== id)\n mismatch.push('Capture execution does not match selected materialization')\n }\n if (\n metadata.binding &&\n (metadata.binding.kind !== 'bridge' ||\n !metadata.binding.nativeSessionId ||\n !metadata.binding.sessionId)\n )\n mismatch.push('Capture Bridge binding is malformed')\n return { mismatch, missing }\n}\n\n/** One selected-agent mapping for filesystem and API transports; no execution or I/O. */\nexport function topAgentWorker(run: SupervisorView, workerId: string): WorkerView | undefined {\n const child = run.workers.find((worker) => worker.id === workerId)\n if (child || run.id !== workerId) return child\n return {\n id: run.id,\n label: 'root',\n status:\n run.status === 'cancelled'\n ? 'cancelled'\n : ['done', 'succeeded'].includes(run.status)\n ? 'done'\n : ['down', 'failed'].includes(run.status)\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\nexport type TopAgentMetadata = Omit<TopInspection, 'rows' | 'context'> & {\n readonly context: readonly TopTranscriptRow[]\n}\n\n/** Metadata keeps full recorded context while the conversation can show compact attribution. */\nexport function topAgentMetadata(\n inspection: TopInspection | undefined,\n recorded: readonly TopTranscriptRow[],\n): TopAgentMetadata {\n const { rows, ...metadata }: TopInspection = inspection ?? {\n coverage: {\n status: 'missing' as const,\n source: 'Runtime',\n reason: 'Verified conversation inspection was not provided',\n },\n }\n return {\n ...metadata,\n context: [\n ...(metadata.context ?? []),\n ...recorded.filter((row) => row.event.provenance === 'delegated-input'),\n ...(rows ?? []).filter((row) => row.event.provenance === 'system-instructions'),\n ],\n }\n}\n\nexport interface TopAgentRowsFrame {\n readonly generation: number\n readonly events: readonly (TopTranscriptRow & { readonly seq: number })[]\n readonly lastSeq: number\n readonly alive: boolean\n readonly window: 'verified-native' | 'recorded-tail'\n readonly coverage?: TopInspection['coverage']\n}\n\n/** Both HTTP transports share conversation selection, stable identity, sequence and batching. */\nexport type TopAgentStreamFrame =\n | { readonly event: 'reset'; readonly data: { readonly generation: number } }\n | { readonly event: 'rows'; readonly data: TopAgentRowsFrame }\n\n/** Project selected conversation rows into ordered reset and row frames. */\nexport function createTopAgentStream(generation: number) {\n let representation: string | undefined\n let initiatingInput: TopTranscriptRow | undefined\n const seen = new Set<string>()\n let lastSeq = 0\n return {\n reset: { generation },\n frame({\n recorded,\n inspection,\n alive,\n includeContext,\n }: {\n recorded: readonly TopTranscriptRow[]\n inspection?: TopInspection\n alive: boolean\n includeContext?: boolean\n }): readonly TopAgentStreamFrame[] {\n initiatingInput =\n recorded.find((row) => row.event.provenance === 'delegated-input') ?? initiatingInput\n const input = initiatingInput?.event.text\n const task = input?.includes('\\n') ? input.slice(input.indexOf('\\n') + 1) : undefined\n const hasNativePrompt =\n !!task &&\n !!inspection?.rows?.some(\n (row) =>\n row.event.kind === 'user' && row.event.actor !== 'injected' && row.event.text === task,\n )\n const shownInput =\n initiatingInput && hasNativePrompt && !includeContext\n ? {\n ...initiatingInput,\n event: {\n ...initiatingInput.event,\n text: input!.slice(0, input!.indexOf('\\n')),\n provenance: 'recorded-sender',\n },\n }\n : initiatingInput\n const next = inspection?.rows?.length\n ? `capture:${inspection.coverage.ref ?? inspection.coverage.source}:${hasNativePrompt}`\n : 'progress'\n const frames: TopAgentStreamFrame[] = []\n if (representation !== undefined && representation !== next) {\n seen.clear()\n lastSeq = 0\n generation += 1\n frames.push({ event: 'reset', data: { generation } })\n }\n representation = next\n const rows = inspection?.rows?.length\n ? [\n ...(shownInput ? [shownInput] : []),\n ...recorded.filter(\n (row) =>\n inspection.coverage.status !== 'complete' &&\n row.event.provenance === 'recorded-result',\n ),\n ...inspection.rows.filter(\n (row) => includeContext || row.event.provenance !== 'system-instructions',\n ),\n ]\n : recorded\n const events = rows.flatMap((row) => {\n const key =\n 'id' in row && typeof row.id === 'string'\n ? row.id\n : createHash('sha256').update(JSON.stringify(row)).digest('hex')\n if (seen.has(key)) return []\n seen.add(key)\n if (next === 'progress' && seen.size > 2000) seen.delete(seen.values().next().value!)\n return [{ ...row, seq: ++lastSeq }]\n })\n for (let offset = 0; offset < Math.max(events.length, 1); offset += 100) {\n const batch = events.slice(offset, offset + 100)\n frames.push({\n event: 'rows',\n data: {\n generation,\n events: batch,\n lastSeq: batch.at(-1)?.seq ?? lastSeq,\n alive,\n window:\n inspection?.coverage.status === 'complete' ? 'verified-native' : 'recorded-tail',\n ...(inspection ? { coverage: inspection.coverage } : {}),\n },\n })\n }\n return frames\n },\n }\n}\n\n/** Router records are Runtime's canonical ToolLoopMessageRecord, not a native file heuristic. */\nexport async function retainedRouterInspection(worker: WorkerView, runDir?: string) {\n const evidence = worker.harnessTranscript\n if (\n !runDir ||\n evidence?.status !== 'available' ||\n evidence.harness !== 'router' ||\n !worker.endedAt\n )\n return undefined\n const artifact = await harnessTranscriptArtifact(\n evidence,\n new FileResultBlobStore(join(runDir, 'blobs')),\n )\n if (!artifact || !('files' in artifact)) return undefined\n const records = artifact.files.flatMap((file) =>\n 'content' in file\n ? file.content\n .split('\\n')\n .filter(Boolean)\n .map((line) => recordValue(JSON.parse(line)))\n .filter((row) => row && typeof row.role === 'string')\n : [],\n )\n const rows = records.flatMap((message, index) =>\n transcriptRows({ liveTail: [JSON.stringify({ at: worker.endedAt, message })] }).map(\n (row, part) => ({\n ...row,\n id: JSON.stringify([evidence.transcriptRef, index, part]),\n sessionId: `router:${worker.id}`,\n part,\n event: {\n ...row.event,\n provenance: 'router-transcript',\n source: 'Message time unknown; shown at captured settlement time',\n },\n }),\n ),\n )\n return {\n coverage: {\n status: 'partial' as const,\n source: 'Runtime Router conversation, displayed at recorded settlement time',\n reason: 'Per-message times were not captured',\n ref: `urn:${evidence.transcriptRef}`,\n },\n rows,\n files: {\n scope: 'none' as const,\n complete: true,\n reason: 'This in-process conversation has no sandbox workspace inventory',\n entries: [],\n },\n }\n}\n\n/** Present the recorded tail through sandbox-ui's existing agent-stream contract. */\nexport function transcriptRows(worker: Pick<WorkerView, 'liveTail'>) {\n const rows: TopTranscriptRow[] = []\n for (const line of worker.liveTail) {\n let value: Record<string, unknown> | undefined\n try {\n value = recordValue(JSON.parse(line))\n } catch {\n continue\n }\n const timestamp = value?.timestamp ?? value?.at\n const time = typeof timestamp === 'string' ? Date.parse(timestamp) : timestamp\n if (typeof time !== 'number' || !Number.isFinite(new Date(time).getTime())) continue\n const at = new Date(time).toISOString()\n const push = (event: (typeof rows)[number]['event']) => rows.push({ at, event })\n const event = recordValue(value?.event)\n if (typeof event?.kind === 'string') {\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 push({ ...event, kind })\n }\n if (event?.kind) continue\n const legacy = (event: (typeof rows)[number]['event']) =>\n push({\n ...event,\n provenance: 'unverified-progress',\n source: 'Legacy progress only; full capture is unverified',\n })\n const message = recordValue(value?.message)\n if (!message) continue\n if (message.role === 'tool') {\n legacy({\n kind: 'tool-result',\n toolCallId: String(message.tool_call_id),\n result: message.content,\n })\n continue\n }\n for (const item of Array.isArray(message.tool_calls) ? message.tool_calls : []) {\n const call = recordValue(item),\n fn = recordValue(call?.function)\n if (call && fn)\n legacy({\n kind: 'tool-call',\n toolCallId: String(call.id),\n toolName: String(fn.name),\n args: fn.arguments,\n })\n }\n const parts =\n typeof message.content === 'string'\n ? [{ type: 'text', text: message.content }]\n : Array.isArray(message.content)\n ? message.content\n : []\n for (const part of parts) {\n if (!recordValue(part)) continue\n if (part.type === 'text' && typeof part.text === 'string' && part.text.length > 0)\n legacy({ kind: message.role === 'user' ? 'user' : 'text', text: part.text })\n else if (part.type === 'thinking' && typeof part.thinking === 'string')\n legacy({ kind: 'reasoning', text: part.thinking })\n else if (part.type === 'tool_use')\n legacy({\n kind: 'tool-call',\n toolCallId: String(part.id),\n toolName: String(part.name),\n args: part.input,\n })\n else if (part.type === 'tool_result')\n legacy({ kind: 'tool-result', toolCallId: String(part.tool_use_id), result: part.content })\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 return readRecordedEvents(file, 200).lines\n}\n\nexport function transcriptTail(worker: WorkerView) {\n return transcriptRows(\n worker.eventFile ? { ...worker, liveTail: readTranscriptTail(worker.eventFile) } : worker,\n )\n}\n\n/** Actual recorded event time and cadence; absence means no event evidence, never file mtime. */\nexport interface RecordedActivity {\n readonly lastActivityAt?: number\n readonly medianEventGapMs?: number\n}\n\nexport interface RecordedEvents {\n readonly file: string\n readonly lines: string[]\n readonly activity: RecordedActivity\n readonly firstActivityAt?: number\n}\n\ninterface Cursor {\n dev: number\n ino: number\n offset: number\n pending: string\n decoder: StringDecoder\n times: number[]\n lines: string[]\n result: RecordedEvents\n}\n\nconst cursors = new Map<string, Cursor>()\nconst activityKinds = new Set([\n 'text',\n 'reasoning',\n 'user',\n 'tool-call',\n 'tool-result',\n 'interaction',\n 'child_task',\n])\n\nfunction recordedActivity(line: string) {\n return transcriptRows({ liveTail: [line] }).find((row) => activityKinds.has(row.event.kind))\n}\n\n/** Read appended UTF-8 bytes once; complete EOF JSON follows the durable reader contract. */\nexport function readRecordedEvents(file: string, maxLines = 8): RecordedEvents {\n const fd = openSync(file, 'r')\n try {\n const stat = fstatSync(fd)\n let cursor = cursors.get(file)\n if (\n !cursor ||\n cursor.dev !== stat.dev ||\n cursor.ino !== stat.ino ||\n stat.size < cursor.offset\n ) {\n cursor = {\n dev: stat.dev,\n ino: stat.ino,\n offset: 0,\n pending: '',\n decoder: new StringDecoder('utf8'),\n times: [],\n lines: [],\n result: { file, lines: [], activity: {} },\n }\n cursors.set(file, cursor)\n }\n if (stat.size === cursor.offset)\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n const lines = [...cursor.lines]\n const buffer = Buffer.alloc(Math.min(65_536, stat.size - cursor.offset))\n while (cursor.offset < stat.size) {\n const bytes = readSync(\n fd,\n buffer,\n 0,\n Math.min(buffer.length, stat.size - cursor.offset),\n cursor.offset,\n )\n if (!bytes) break\n cursor.offset += bytes\n const rows = (cursor.pending + cursor.decoder.write(buffer.subarray(0, bytes))).split('\\n')\n cursor.pending = rows.pop()!\n for (const line of rows) {\n if (!line.trim()) continue\n lines.push(line)\n if (lines.length > 200) lines.shift()\n // One source row is one instant even when a native message contains several parts.\n const activity = recordedActivity(line)\n if (activity) cursor.times.push(Date.parse(activity.at))\n }\n }\n cursor.lines = lines\n // A complete EOF row is valid durable JSONL. Keep it separate until its newline arrives.\n let pending: string[] = []\n if (cursor.pending.trim()) {\n try {\n JSON.parse(cursor.pending)\n pending = [cursor.pending]\n } catch {\n // A torn row is still private to its writer.\n }\n }\n const final = pending.length ? recordedActivity(pending[0]!) : undefined\n const times = (final ? [...cursor.times, Date.parse(final.at)] : cursor.times).sort(\n (a, b) => a - b,\n )\n const gaps = times\n .slice(1)\n .map((at, i) => at - times[i]!)\n .sort((a, b) => a - b)\n const mid = Math.floor(gaps.length / 2)\n cursor.result = {\n file,\n lines: [...lines, ...pending].slice(-200),\n ...(times.length ? { firstActivityAt: times[0]! } : {}),\n activity: {\n ...(times.length ? { lastActivityAt: times.at(-1)! } : {}),\n ...(gaps.length\n ? { medianEventGapMs: (gaps[Math.floor((gaps.length - 1) / 2)]! + gaps[mid]!) / 2 }\n : {}),\n },\n }\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n } catch (error) {\n cursors.delete(file)\n throw error\n } finally {\n closeSync(fd)\n }\n}\n\n/** Read native progress files with bounded, path-only diagnostics. */\nexport function readWorkerEventTails(dir: string) {\n const out = new Map<string, RecordedEvents>()\n const diagnostics: TopSnapshotDiagnostic[] = []\n const read = (path: string, key = join(dir, path)) => {\n try {\n if (existsSync(join(dir, path))) out.set(key, readRecordedEvents(join(dir, path)))\n } catch {\n diagnostics.push({ source: 'worker-tail', path, reason: 'unreadable' })\n }\n }\n read(ROOT_STREAM_FILE)\n for (const folder of ['workers', 'streams']) {\n if (!existsSync(join(dir, folder))) continue\n try {\n for (const entry of readdirSync(join(dir, folder))) {\n // Inbox steer requests are not evidence that the executor emitted progress.\n if (folder === 'workers' && entry.endsWith('.ndjson') && !entry.endsWith('.inbox.ndjson'))\n read(join(folder, entry), entry.slice(0, -'.ndjson'.length))\n else if (folder === 'streams' && entry.endsWith('.jsonl')) read(join(folder, entry))\n }\n } catch {\n diagnostics.push({ source: 'worker-tail', path: folder, reason: 'unreadable' })\n }\n }\n return { value: out, diagnostics }\n}\n\n/** The normalized subset consumed here; native decoding stays with harness-sessions. */\nexport interface HarnessRowsSession {\n readonly nativeSessionId: string\n readonly messages: readonly {\n readonly id: string\n readonly at?: string | null\n readonly role: string\n readonly actor?: string\n readonly parts: readonly {\n readonly type: string\n readonly text?: string\n readonly toolCallId?: string\n }[]\n }[]\n readonly toolCalls: readonly {\n readonly id: string\n readonly name: string\n readonly startedAt?: string | null\n readonly endedAt?: string | null\n readonly input?: unknown\n readonly inputText?: string | null\n readonly result?: { readonly output?: unknown; readonly text?: string | null } | null\n }[]\n}\nexport type HarnessRowsGap = {\n readonly sessionId: string\n readonly recordId: string\n readonly reason: string\n}\nexport type HarnessSessionRow = TopTranscriptRow & {\n readonly id: string\n readonly sessionId: string\n readonly part: number\n}\n\n/** One ordered projection for every strict native reader, with explicit unrenderable evidence. */\nexport function harnessSessionRows(sessions: readonly HarnessRowsSession[]) {\n const rows: HarnessSessionRow[] = []\n const gaps: HarnessRowsGap[] = []\n for (const session of sessions) {\n const emitted = new Set<string>()\n const push = (\n recordId: string,\n part: number,\n value: string | null | undefined,\n event: HarnessSessionRow['event'],\n ) => {\n if (!value || !Number.isFinite(Date.parse(value))) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId,\n reason: 'Native record has no valid recorded time',\n })\n return\n }\n rows.push({\n id: JSON.stringify([session.nativeSessionId, event.kind, recordId, part]),\n sessionId: session.nativeSessionId,\n part,\n at: new Date(value).toISOString(),\n event: event.actor === 'injected' ? { ...event, provenance: 'system-instructions' } : event,\n })\n }\n const tool = (\n id: string,\n result: boolean,\n at?: string | null,\n recordId = id,\n part = 0,\n actor?: string,\n ) => {\n const call = session.toolCalls.find((item) => item.id === id)\n if (!call || (result && !call.result)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: id,\n reason: 'Referenced tool evidence is missing',\n })\n return\n }\n const key = `${result ? 'result' : 'call'}:${id}`\n if (emitted.has(key)) return\n emitted.add(key)\n const toolCallId = `${session.nativeSessionId}:${id}`\n push(\n recordId,\n part,\n at ?? (result ? call.endedAt : call.startedAt),\n result\n ? {\n kind: 'tool-result',\n toolCallId,\n result: call.result?.output ?? call.result?.text,\n actor,\n ...(actor ? { source: `Native actor ${actor}` } : {}),\n }\n : {\n kind: 'tool-call',\n toolCallId,\n toolName: call.name,\n args: call.input ?? call.inputText,\n actor,\n ...(actor ? { source: `Native actor ${actor}` } : {}),\n },\n )\n }\n for (const message of session.messages)\n for (const [part, value] of message.parts.entries()) {\n if (value.type === 'tool-call' || value.type === 'tool-result')\n tool(\n value.toolCallId ?? '',\n value.type === 'tool-result',\n message.at,\n message.id,\n part,\n message.actor,\n )\n else if ((value.type === 'text' || value.type === 'reasoning') && value.text)\n push(message.id, part, message.at, {\n kind:\n value.type === 'reasoning'\n ? 'reasoning'\n : message.role === 'user'\n ? 'user'\n : message.role === 'assistant'\n ? 'text'\n : 'notice',\n text: value.text,\n actor: message.actor,\n ...(message.actor ? { source: `Native actor ${message.actor}` } : {}),\n ...(!['user', 'assistant', 'tool'].includes(message.role)\n ? { provenance: 'system-instructions', source: message.role }\n : {}),\n })\n else if (value.type !== 'text' && value.type !== 'reasoning')\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: message.id,\n reason: `Native ${value.type} content is retained but not projected inline`,\n })\n }\n for (const call of session.toolCalls) {\n if (!emitted.has(`call:${call.id}`)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: call.id,\n reason: 'Tool call has no ordered message-part reference',\n })\n tool(call.id, false)\n }\n if (call.result && !emitted.has(`result:${call.id}`)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: call.id,\n reason: 'Tool result has no ordered message-part reference',\n })\n tool(call.id, true)\n }\n }\n }\n // Stable sort preserves the recorded session/message/part order when clocks are equal.\n return { rows: rows.sort((a, b) => a.at.localeCompare(b.at)), gaps }\n}\n","import { basename, join } from 'node:path'\nimport { parseCommittedJsonLines } from '../durable/jsonl-file'\nimport type { TopJournalEvent } from './top-snapshot'\nimport { type RecordedEvents, readRecordedEvents } 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, RecordedEvents>()\n let first: 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 try {\n const recorded = readRecordedEvents(file)\n tails.set(id, recorded)\n if (recorded.firstActivityAt !== undefined)\n start = new Date(recorded.firstActivityAt).toISOString()\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (start && (!first || start < first)) first = start\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 activity = tails.get(id)?.activity.lastActivityAt\n const at = activity === undefined ? undefined : new Date(activity).toISOString()\n const reason = typeof row.reason === 'string' ? { reason: row.reason } : {}\n events.push(\n row.type === 'cancelled'\n ? { kind: 'cancelled', id, ...(at ? { at } : {}), ...reason }\n : {\n kind: 'settled',\n id,\n status: row.type === 'error' ? 'down' : 'done',\n ...(at ? { at } : {}),\n spent: { usdKnown: false, tokensKnown: false },\n ...reason,\n },\n )\n }\n }\n return { id: basename(runDir), events, tails, first }\n}\n","/** Read-only topology, activity and accounting over writer-owned workspace and durable journals.\n * ANSI presentation lives in `./top-frame`.\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { isRecord } from '@tangle-network/agent-core'\nimport { FileObserverJournal, type ObserverRecord } from '../durable/observer-journal'\nimport {\n type PursuitProjection,\n type PursuitRunProjection,\n projectPursuit,\n} from '../durable/observer-projection'\nimport { readFailureRecord, readSettleRecord } from '../durable/settle-record'\nimport { FileSpawnJournal } from '../durable/spawn-journal/journal-store'\nimport { spawnJournalRecordEvents } from '../durable/spawn-journal/record-events'\nimport { discoverDurableSupervisionRun } from '../durable/supervision-discovery'\nimport { FileCoordinationLog } from '../runtime/supervise/coordination-log'\nimport { nodeStreamFile, ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n} from '../runtime/supervise/run-layout'\nimport { rootCoordinationOwner } from '../runtime/supervise/supervise-identity'\nimport type { Spend, SpendChannel } from '../runtime/supervise/types'\nimport { type RecordedEvents, readWorkerEventTails } from './top-transcript'\nimport type {\n BudgetStats,\n Distribution,\n SpendStats,\n SupervisorState,\n SupervisorTotals,\n SupervisorView,\n TopJournalEvent,\n TopSnapshot,\n TopSnapshotDiagnostic,\n TopSnapshotDiagnosticReason,\n TopSnapshotDiagnosticSource,\n WorkerView,\n} from './top-types'\nimport { workflowJournal } from './workflow-journal'\n\nexport type {\n BudgetStats,\n Distribution,\n SpendStats,\n SupervisorState,\n SupervisorTotals,\n SupervisorView,\n TopJournalEvent,\n TopSnapshot,\n TopSnapshotCompleteness,\n TopSnapshotDiagnostic,\n TopSnapshotDiagnosticReason,\n TopSnapshotDiagnosticSource,\n WorkerView,\n} from './top-types'\n\ntype MutableWorker = {\n -readonly [Key in keyof Omit<WorkerView, 'latencyMs'>]: WorkerView[Key]\n}\n\n/** A recovered value and bounded, run-relative read diagnostics. */\ninterface SourceRead<T> {\n readonly value: T\n readonly diagnostics: readonly TopSnapshotDiagnostic[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\n\n/** Read a point-in-time view without writing to the run. Missing or partial sources report\n * bounded diagnostics, and live event readers cache append offsets. `now` controls elapsed time.\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 loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now(), false)\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 TopSnapshotDiagnostic[]): 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(dir)\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\n/** Combine supervisor projections and source diagnostics into one snapshot. */\nexport function 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\n/** Observer-backed and older spawn-only runs share topology; missing accounting stays unknown. */\nasync function loadDurableTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n observed = true,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir)\n let pursuit: PursuitProjection | undefined\n let observations: readonly ObserverRecord[] = []\n let source: TopSnapshotDiagnosticSource = observed ? 'observer-journal' : 'journal'\n let path = observed ? 'observer.jsonl' : 'spawn-journal.jsonl'\n try {\n if (typeof runDir !== 'string' || !runDir.trim())\n throw new TypeError('runDir must be non-empty')\n if (observed) {\n const journal = await FileObserverJournal.open(join(resolve(runDir), path))\n if (!journal) return topSnapshot(root, now, [], [{ source, path, reason: 'missing' }])\n observations = await journal.read()\n pursuit = projectPursuit(observations)\n }\n source = 'journal'\n path = '.'\n const discovery = await discoverDurableSupervisionRun(runDir)\n path = 'spawn-journal.jsonl'\n const journal = new FileSpawnJournal(discovery.spawnJournalPath)\n const latest = new Map(pursuit?.runs.map((run) => [run.runId, run]))\n // A child's metered turns already belong to its spawn tree, not another supervisor row.\n const ids = pursuit\n ? [...latest.keys()].filter(\n (id) => !discovery.roots.some((parent) => id.startsWith(`${parent}/`)),\n )\n : discovery.roots\n path = 'result.json'\n const settled = await readSettleRecord(discovery.runDir)\n if (settled && !ids.includes(settled.tree.root))\n throw new Error('settle root is not discovered')\n path = 'failure.json'\n const failure = await readFailureRecord(discovery.runDir)\n const tails = readWorkerEventTails(discovery.runDir)\n const log = new FileCoordinationLog(discovery.coordinationLogPath)\n path = 'coordination-log.jsonl'\n const supervisors = await Promise.all(\n ids.map(async (id) => {\n const accounting = latest.get(id)\n const binding = discovery.roots.indexOf(id)\n // Retained admissions can predate the spawn journal. An existing journal must bind the root.\n if (binding < 0 && existsSync(discovery.spawnJournalPath))\n throw new Error('observer run has no discovered spawn root')\n const events = binding < 0 ? [] : ((await journal.loadTree(id)) ?? [])\n const spawn = events.find((event) => event.kind === 'spawned' && event.id === id)\n const reopen = events\n .filter(\n (event) => event.kind === 'reopened' && event.id === id && event.budget !== undefined,\n )\n .at(-1)\n const budget =\n reopen?.kind === 'reopened' && reopen.budget\n ? reopen.budget.maxTokens\n : spawn?.kind === 'spawned'\n ? spawn.budget?.maxTokens\n : undefined\n const boundary = observations.find(\n (record) => record.sequence === accounting?.firstSequence,\n )?.event?.payload\n const coordinationOffset = isRecord(boundary) ? boundary.coordinationOffset : undefined\n\n const outcome: SupervisorView['outcome'] =\n settled?.tree.root === id\n ? settled.kind === 'winner'\n ? { kind: 'winner' }\n : { kind: 'no-winner', reason: settled.reason }\n : failure?.runId === id && accounting?.status === 'down'\n ? { kind: 'failed', reason: failure.error.message }\n : undefined\n const prior =\n spawn?.kind === 'spawned' && spawn.identity\n ? await log.load(id, rootCoordinationOwner(spawn.identity))\n : undefined\n let lastRoute: SupervisorView['lastRoute']\n const records = prior?.records ?? []\n if (\n coordinationOffset !== undefined &&\n (typeof coordinationOffset !== 'number' ||\n !Number.isSafeInteger(coordinationOffset) ||\n coordinationOffset < 0 ||\n coordinationOffset > records.length)\n )\n throw new Error('invalid attempt coordination offset')\n const offset =\n typeof coordinationOffset === 'number'\n ? coordinationOffset\n : accounting?.attemptIndex === 0\n ? 0\n : records.length\n for (const { event } of records.slice(offset)) {\n if (\n event.type === 'route' &&\n (event.route.kind === 'stopped' || event.route.kind === 'unrouted')\n )\n lastRoute = event.route\n }\n const startedAt = accounting\n ? new Date(accounting.firstObservedAt).toISOString()\n : discovery.rootsBegunAt[binding]\n const view = buildSupervisorView(\n {\n id,\n task: id,\n workspaceDir: root,\n status: accounting?.status ?? 'running',\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n ...(startedAt == null ? {} : { startedAt }),\n ...(accounting?.settledAt === undefined\n ? {}\n : { completedAt: new Date(accounting.settledAt).toISOString() }),\n },\n discovery.runDir,\n events.filter(isSpawnEvent),\n accounting?.error ? [accounting.error] : [],\n now,\n tails.value,\n accounting,\n )\n if (!accounting) Object.assign(view.totals, { usdKnown: false, tokensKnown: false })\n if (outcome)\n Object.assign(view, {\n outcome,\n status: outcome.kind === 'winner' ? 'done' : outcome.kind,\n })\n if (lastRoute)\n Object.assign(view, {\n lastRoute,\n reason: lastRoute.kind === 'stopped' ? lastRoute.reason : lastRoute.detail,\n })\n else if (outcome && 'reason' in outcome) Object.assign(view, { reason: outcome.reason })\n return view\n }),\n )\n return topSnapshot(\n root,\n now,\n supervisors,\n [\n ...(!observed\n ? [\n {\n source: 'observer-journal' as const,\n path: 'observer.jsonl',\n reason: 'missing' as const,\n },\n ]\n : []),\n ...tails.diagnostics,\n ],\n observed ? 1 : ids.length,\n pursuit,\n )\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\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/** Current writer-owned journal first; retain the retired name for recorded runs. */\nfunction readJournal(eventDir: string): SourceRead<TopJournalEvent[]> {\n const path = ['spawn-journal.jsonl', 'journal.jsonl'].find((candidate) =>\n existsSync(join(eventDir, candidate)),\n )\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\n/** The settled spawn event's retained-conversation receipt, read without widening the public\n * `TopJournalEvent` type; the spawn journal already validated the record. */\nfunction retainedTranscript(event: object): { ref: string; harness: string } | undefined {\n const retained = (event as { harnessTranscript?: unknown }).harnessTranscript\n if (typeof retained !== 'object' || retained === null) return undefined\n const { status, transcriptRef, harness } = retained as Record<string, unknown>\n return status === 'available' && typeof transcriptRef === 'string' && typeof harness === 'string'\n ? { ref: transcriptRef, harness }\n : undefined\n}\n\n/** The canonical spawn receipt owns the cause; the public journal view stays compatible. */\nfunction recordedReason(event?: object): string | undefined {\n return isRecord(event) && typeof event.reason === 'string' ? event.reason : undefined\n}\n\n/** Project committed lifecycle and spend evidence into one supervisor view. */\nexport function buildSupervisorView(\n state: SupervisorState,\n stateDir: string,\n events: readonly TopJournalEvent[],\n progressTail: readonly string[],\n now: number,\n workerEventTails = new Map<string, RecordedEvents>(),\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 const terminal = accounting\n ? undefined\n : events\n .filter(\n (event) => isRoot(event.id) && (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n .at(-1)\n const rootReason = recordedReason(terminal) ?? state.reason\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 for (const key of [\n 'endedAt',\n 'outRef',\n 'harnessTranscript',\n 'transcript',\n 'reason',\n 'infra',\n 'verdict',\n ] as const)\n delete worker[key]\n worker.label = event.label ?? worker.label\n if (event.identity) worker.identity = event.identity\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 === 'materialized' || event.kind === 'seat-materialized') {\n worker.materialization = event.receipt\n } else if (event.kind === 'execution-bound') {\n worker.executionBindings = [...(worker.executionBindings ?? []), event.binding]\n } else if (event.kind === 'settled' || event.kind === 'cancelled') {\n if (event.at) worker.endedAt = event.at\n const reason = recordedReason(event)\n if (reason !== undefined) worker.reason = reason\n if (event.kind === 'settled') {\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.outRef) worker.outRef = event.outRef\n if (event.harnessTranscript) worker.harnessTranscript = event.harnessTranscript\n const transcript = retainedTranscript(event)\n if (transcript) worker.transcript = transcript\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 }\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.kind === 'metered' && 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(join(stateDir, nodeStreamFile(worker.id))) ??\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) {\n worker.eventFile = tail.file\n Object.assign(worker, tail.activity)\n }\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 ...(rootReason === undefined ? {} : { reason: rootReason }),\n ...workerEventTails.get(join(stateDir, ROOT_STREAM_FILE))?.activity,\n status:\n accounting?.status ??\n (terminal?.kind === 'settled'\n ? (terminal.status ?? state.status)\n : terminal\n ? 'cancelled'\n : 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 ...(!state.completedAt && terminal?.at ? { completedAt: terminal.at } : {}),\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 = selectFields(\n value,\n ['maxIterations', 'maxTokens', 'maxUsd'],\n (entry) => typeof entry === 'number',\n ) as BudgetStats\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/** Missing files can predate their writer; failed reads report a path-only diagnostic. */\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 return raw?.trim().split('\\n').filter(Boolean).slice(-maxLines) ?? []\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 ['id', 'status', 'task', 'workspaceDir'].every((key) => typeof value[key] === 'string') &&\n typeof value.budget === 'number'\n )\n}\n\n/** Validate supported journal lifecycle and accounting event shapes. */\nexport function isSpawnEvent<T>(value: T): value is T & TopJournalEvent {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n [\n 'spawned',\n 'settled',\n 'cancelled',\n 'metered',\n 'progress',\n 'materialized',\n 'seat-materialized',\n 'execution-bound',\n ].includes(value.kind)\n )\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 { once } from 'node:events'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { join, resolve } from 'node:path'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport { linkAbort, runAbortable } from '../runtime/supervise/abortable'\nimport { loadTopSnapshot, type TopSnapshot, type WorkerView } from './top-snapshot'\nimport {\n createTopAgentStream,\n readTopAgentInspection,\n retainedRouterInspection,\n type TopInspection,\n type TopSessionReader,\n topAgentMetadata,\n topAgentWorker,\n transcriptHistory,\n type transcriptRows,\n transcriptTail,\n} from './top-transcript'\n\nexport type { TopInspection } from './top-transcript'\n\nconst SOURCE_READ_TIMEOUT_MS = 30_000\nexport type TopInspectionSource = (request: {\n readonly root: string\n readonly runId: string\n readonly workerId: string\n readonly signal?: AbortSignal\n}) => Promise<TopInspection>\n\n/** Selected reads share the web server's origin, method and lifecycle boundary. */\nexport async function serveTopAgent({\n request,\n response,\n path,\n base,\n roots,\n snapshots,\n transcripts,\n source,\n readSessions,\n}: {\n request: IncomingMessage\n response: ServerResponse\n path: string\n base: string\n roots: readonly string[]\n snapshots: ReadonlyMap<string, TopSnapshot>\n transcripts: Set<() => void>\n source?: TopInspectionSource\n readSessions?: TopSessionReader\n}) {\n const [, , , , rootIndex, runId, workerId] = path.split('/').map(decodeURIComponent)\n const root = roots[Number(rootIndex)]\n const run = root && snapshots.get(root)?.supervisors.find((entry) => entry.id === runId)\n const safeId = (id: string | undefined) =>\n !!id && /^[a-z0-9_.:-]+$/i.test(id) && id !== '.' && id !== '..'\n if (\n !safeId(runId) ||\n !safeId(workerId) ||\n !run ||\n (!run.workers.some((entry) => entry.id === workerId) && run.id !== workerId)\n ) {\n response.writeHead(404).end()\n return\n }\n // A runs root keeps each run's journals, blobs and root stream in `<root>/<runId>`.\n const own =\n root && existsSync(resolve(root, runId!, 'observer.jsonl')) ? resolve(root, runId!) : undefined\n const runDir = own ?? root\n const pursuit = own\n ? (await loadTopSnapshot(root!, { runDir: own })).pursuit\n : root\n ? snapshots.get(root)?.pursuit\n : undefined\n const worker = (): WorkerView | undefined => {\n const run = root ? snapshots.get(root)?.supervisors.find((run) => run.id === runId) : undefined\n const node = run && topAgentWorker(run, workerId!)\n return node && node.id === run?.id && existsSync(resolve(runDir!, 'root-stream.jsonl'))\n ? { ...node, eventFile: resolve(runDir!, 'root-stream.jsonl') }\n : node\n }\n\n if (!worker()) {\n response.writeHead(404).end()\n return\n }\n const controller = new AbortController()\n response.on('close', () => controller.abort())\n const readSource = async () => {\n const deadline = new AbortController()\n const linked = linkAbort(controller.signal, deadline.signal)\n const timer = setTimeout(\n () => deadline.abort('Inspection source read exceeded its deadline'),\n SOURCE_READ_TIMEOUT_MS,\n )\n timer.unref()\n try {\n const result = await runAbortable(\n () =>\n source\n ? source({\n root: runDir!,\n runId: runId!,\n workerId: workerId!,\n signal: linked.signal,\n })\n : readSessions\n ? readTopAgentInspection({\n worker: worker()!,\n runId: runId!,\n blobs: new FileResultBlobStore(join(runDir!, 'blobs')),\n readSessions,\n signal: linked.signal,\n })\n : retainedRouterInspection(worker()!, runDir),\n linked.signal,\n 'Inspection read stopped',\n )\n return result?.coverage.status === 'complete' && !result.rows?.length\n ? {\n ...result,\n coverage: {\n ...result.coverage,\n status: 'partial' as const,\n reason: 'No verified native conversation rows were supplied',\n },\n }\n : result\n } finally {\n clearTimeout(timer)\n linked.release()\n }\n }\n let history: ReturnType<typeof transcriptRows> | undefined = await transcriptHistory(\n worker()!,\n runDir,\n pursuit?.nodes.find((node) => node.runId === runId && node.id === workerId),\n )\n if (!path.endsWith('/stream')) {\n const inspection = await readSource()\n response.writeHead(200, { 'Content-Type': 'application/json' })\n response.end(\n request.method === 'HEAD'\n ? undefined\n : JSON.stringify(topAgentMetadata(inspection, history ?? [])),\n )\n return\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 stream = createTopAgentStream(Date.now())\n response.write(`event: reset\\ndata: ${JSON.stringify(stream.reset)}\\n\\n`)\n let updating = false\n const update = () => {\n if (updating || response.destroyed || response.writableEnded) return\n updating = true\n void (async () => {\n const node = worker()\n if (!node || response.writableLength > 1024 * 1024) {\n response.destroy()\n return\n }\n const inspection = await readSource()\n const recorded = history ?? transcriptTail(node)\n history = undefined\n const alive = node.status === 'running'\n const frames = stream.frame({\n recorded,\n inspection,\n alive,\n includeContext: new URL(request.url ?? '/', base).searchParams.get('context') === '1',\n })\n for (const frame of frames) {\n if (!response.write(`event: ${frame.event}\\ndata: ${JSON.stringify(frame.data)}\\n\\n`))\n await once(response, 'drain', { signal: controller.signal })\n }\n if (!alive) {\n response.write('event: end\\ndata: {}\\n\\n')\n response.end()\n }\n })()\n .catch(() => {\n if (!response.destroyed) response.end('event: unavailable\\ndata: {}\\n\\n')\n })\n .finally(() => {\n updating = false\n })\n }\n transcripts.add(update)\n response.on('close', () => transcripts.delete(update))\n update()\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 { extname, resolve, sep } from 'node:path'\nimport { loadTopSnapshot, type TopSnapshot } from './top-snapshot'\nimport type { TopSessionReader } from './top-transcript'\nimport { serveTopAgent, type TopInspectionSource } from './top-web-agent'\n\nexport type { TopInspection, TopInspectionSource } from './top-web-agent'\n\n/** Interval for reconciling missed filesystem notifications in the live viewer. */\nexport const TOP_SNAPSHOT_RECONCILE_MS = 500\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 packaged Sandbox UI browser assets. */\n readonly assets?: string\n readonly host?: string\n readonly port?: number\n /** Product-owned verified conversation reads; no execution or credential access. */\n readonly source?: TopInspectionSource\n /** Canonical native decoding for ordinary Runtime transcript receipts. */\n readonly readSessions?: TopSessionReader\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 require = createRequire(import.meta.url)\n const assets = await realpath(\n options.assets ?? resolve(require.resolve('@tangle-network/agent-runtime/tui'), '../../viewer'),\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 let inFlight: Promise<void> = Promise.resolve()\n const read = async () => {\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 refresh = (): Promise<void> => {\n if (reading || closed) return inFlight\n inFlight = read()\n return inFlight\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, TOP_SNAPSHOT_RECONCILE_MS)\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 await serveTopAgent({\n request,\n response,\n path,\n base,\n roots,\n snapshots,\n transcripts,\n source: options.source,\n readSessions: options.readSessions,\n })\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 clearInterval(reconcile)\n clearInterval(heartbeat)\n for (const watcher of watchers) watcher.close()\n // A caller closes right after its run settles: let a read in flight finish, then read once\n // more, so a terminal record appended just before close reaches connected clients.\n await inFlight.catch(() => undefined)\n await refresh().catch(() => undefined)\n closed = true\n if (scheduled) clearTimeout(scheduled)\n // The run is over for this viewer: say so, so a client stops instead of reconnecting.\n for (const client of clients) client.end('event: end\\ndata: {}\\n\\n')\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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"}
1
+ {"version":3,"file":"top-web-l3naxnjo.js","names":[],"sources":["../src/tui/top-transcript.ts","../src/tui/workflow-journal.ts","../src/tui/top-snapshot.ts","../src/tui/top-web-agent.ts","../src/tui/top-web.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { closeSync, existsSync, fstatSync, openSync, readdirSync, readSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { StringDecoder } from 'node:string_decoder'\nimport type { AgentCandidateArtifactPort } from '../candidate-execution/types'\nimport type { PursuitNodeProjection } from '../durable/observer-projection'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport { recordValue } from '../record-value'\nimport {\n type HarnessTranscriptArtifact,\n type HarnessTranscriptMetadata,\n harnessTranscriptArtifact,\n} from '../runtime/harness-transcript'\nimport { ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport type { ResultBlobStore } from '../runtime/supervise/types'\nimport type { SupervisorView, TopSnapshotDiagnostic, WorkerView } from './top-snapshot'\n\nexport type BaselineAuthority = {\n readonly kind: 'retained-workspace' | 'git-object' | 'git-diff'\n readonly ref: string\n}\nexport type FileIdentity = { readonly sha256: string; readonly byteLength: number }\nexport interface TopInspection {\n readonly coverage: {\n readonly status: 'complete' | 'partial' | 'missing'\n readonly source: string\n readonly reason?: string\n readonly code?: 'source-mismatch' | 'source-unbound'\n readonly ref?: string\n }\n readonly rows?: readonly (TopTranscriptRow & {\n readonly id: string\n readonly sessionId: string\n readonly part: number\n })[]\n readonly context?: readonly TopTranscriptRow[]\n readonly files?: {\n readonly scope: 'workspace' | 'none'\n readonly complete: boolean\n readonly reason?: string\n readonly entries: readonly (FileIdentity & {\n readonly path: string\n readonly before?: FileIdentity & { readonly source: BaselineAuthority }\n })[]\n }\n readonly file?: FileIdentity & {\n readonly path: string\n readonly content: string\n readonly before?: FileIdentity & {\n readonly content: string\n readonly source: BaselineAuthority\n }\n }\n}\n\nexport interface TopTranscriptRow {\n at: string\n event: {\n kind: string\n text?: string\n provenance?: string\n source?: string\n actor?: string\n toolCallId?: string\n toolName?: string\n args?: unknown\n result?: unknown\n }\n}\nexport type TopSessionReader = (\n artifact: HarnessTranscriptArtifact,\n signal?: AbortSignal,\n) => Promise<readonly HarnessRowsSession[]>\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 return readTopAgentHistory(\n worker,\n runDir ? new FileResultBlobStore(join(runDir, 'blobs')) : undefined,\n node,\n )\n}\n\n/** Task, result and progress use the same projection for file-backed and SQL-backed runs. */\nexport async function readTopAgentHistory(\n worker: WorkerView,\n blobs?: Pick<ResultBlobStore, 'get'>,\n node?: PursuitNodeProjection,\n) {\n const rows: TopTranscriptRow[] = []\n const identity = recordValue(node?.identity ?? worker.identity)\n if (blobs && typeof identity?.taskDigest === 'string' && worker.startedAt) {\n const task = await blobs.get(identity.taskDigest)\n if (task !== undefined)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'delegated-input',\n source: `parent ${worker.parent ?? node?.parentId ?? 'run caller'}; task ${identity.taskDigest}; profile ${identity.profileDigest}`,\n text: `Request from ${worker.parent ?? node?.parentId ?? 'run caller'}\\n${typeof task === 'string' ? task : JSON.stringify(task, null, 2)}`,\n },\n })\n }\n const progress = transcriptTail(worker)\n if (worker.startedAt)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'capture-unavailable',\n text: 'Full conversation capture has not been verified in this progress tail.',\n source: 'Runtime progress evidence',\n },\n })\n const outRef = node?.outRef ?? worker.outRef\n const result = blobs && outRef && worker.endedAt ? await blobs.get(outRef) : undefined\n if (result !== undefined)\n progress.push({\n at: worker.endedAt!,\n event: {\n kind: 'notice',\n provenance: 'recorded-result',\n source: `result ${outRef}; Runtime ResultBlobStore`,\n text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),\n },\n })\n return [...rows, ...progress]\n}\n\n/** Resolve ordinary Runtime transcript evidence, never a product-specific capture registry. */\nexport async function readTopAgentInspection({\n worker,\n runId,\n blobs,\n readSessions,\n artifacts,\n signal,\n}: {\n worker: WorkerView\n runId: string\n blobs: Pick<ResultBlobStore, 'get'>\n readSessions: TopSessionReader\n artifacts?: AgentCandidateArtifactPort\n signal?: AbortSignal\n}): Promise<TopInspection> {\n const evidence = worker.harnessTranscript\n const files = {\n scope: 'none' as const,\n complete: true,\n reason: 'Transcript evidence does not include a workspace inventory',\n entries: [],\n }\n if (!evidence || evidence.status !== 'available')\n return {\n coverage: {\n status: 'missing',\n source: 'Runtime transcript receipt',\n reason: evidence?.reason ?? 'No transcript receipt was recorded',\n },\n files,\n }\n const metadata = await harnessTranscriptArtifact(evidence, blobs, { content: false, signal })\n if (!metadata) throw new Error('Available transcript receipt has no metadata')\n const binding = inspectionBinding(metadata, worker, runId)\n if (binding.mismatch.length)\n return {\n coverage: {\n status: 'missing',\n source: 'Runtime transcript receipt',\n code: 'source-mismatch',\n reason: binding.mismatch.join('; '),\n },\n files,\n }\n const artifact = await harnessTranscriptArtifact(evidence, blobs, { artifacts, signal })\n if (!artifact) throw new Error('Available transcript receipt has no artifact')\n const projection = harnessSessionRows(await readSessions(artifact, signal))\n const reasons = [\n ...binding.missing,\n ...(evidence.missing ?? []),\n ...artifact.skipped.map((file) => `${file.path}: ${file.reason}`),\n ...projection.gaps.map((gap) => `${gap.sessionId}/${gap.recordId}: ${gap.reason}`),\n ]\n const complete =\n evidence.coverageComplete === true && reasons.length === 0 && projection.rows.length > 0\n return {\n coverage: {\n status: complete ? 'complete' : 'partial',\n source: `${artifact.harness} Runtime transcript`,\n ref: `urn:${evidence.transcriptRef}`,\n ...(binding.missing.length ? { code: 'source-unbound' as const } : {}),\n ...(!complete\n ? { reason: reasons.join('; ') || 'Source completeness was not attested' }\n : {}),\n },\n rows: projection.rows,\n files,\n }\n}\n\n/** Verify the receipt belongs to the selected node before resolving any native/archive bytes. */\nfunction inspectionBinding(metadata: HarnessTranscriptMetadata, worker: WorkerView, runId: string) {\n const mismatch: string[] = [],\n missing: string[] = []\n if (metadata.binding !== undefined && !recordValue(metadata.binding))\n mismatch.push('Capture Bridge binding is malformed')\n if (metadata.source && metadata.binding) mismatch.push('Capture has conflicting source bindings')\n const source = metadata.source ?? metadata.binding\n if (!source) return { mismatch, missing: ['Capture has no recorded node binding'] }\n const node = recordValue(source.node)\n if (!node) {\n if (source.node !== undefined) mismatch.push('Capture node binding is malformed')\n else missing.push('Capture has no recorded node identity')\n } else {\n for (const [key, expected] of [\n ['rootId', runId],\n ['nodeId', worker.id],\n ['parentId', worker.parent],\n ] as const) {\n if (expected !== undefined && node[key] !== expected)\n mismatch.push(`Capture ${key} does not match selected node`)\n }\n const attempt = worker.executionBindings?.at(-1)?.attemptId\n if (typeof node.attemptId !== 'string' || !node.attemptId)\n mismatch.push('Capture attempt identity is malformed')\n else if (attempt && node.attemptId !== attempt)\n mismatch.push('Capture attempt does not match selected node')\n else if (!attempt) missing.push('Selected node has no recorded execution attempt')\n const identity = recordValue(node.identity)\n for (const key of ['profileDigest', 'taskDigest'] as const) {\n const expected = worker.identity?.[key]\n if (expected && identity?.[key] === undefined) missing.push(`Capture has no recorded ${key}`)\n else if (expected && identity?.[key] !== expected)\n mismatch.push(`Capture ${key} does not match selected node`)\n }\n }\n const materialization = worker.materialization\n if (materialization?.status !== 'known')\n missing.push('Selected node has no known materialization')\n else {\n if (source.profileDigest !== materialization.effectiveProfileDigest)\n mismatch.push('Capture profile does not match selected materialization')\n const execution = materialization.execution\n const kind = metadata.source ? 'environment' : 'session'\n const id = metadata.source?.environmentId ?? metadata.binding?.sessionId\n if (execution.kind !== kind || execution.id !== id)\n mismatch.push('Capture execution does not match selected materialization')\n }\n if (\n metadata.binding &&\n (metadata.binding.kind !== 'bridge' ||\n !metadata.binding.nativeSessionId ||\n !metadata.binding.sessionId)\n )\n mismatch.push('Capture Bridge binding is malformed')\n return { mismatch, missing }\n}\n\n/** One selected-agent mapping for filesystem and API transports; no execution or I/O. */\nexport function topAgentWorker(run: SupervisorView, workerId: string): WorkerView | undefined {\n const child = run.workers.find((worker) => worker.id === workerId)\n if (child || run.id !== workerId) return child\n return {\n id: run.id,\n label: 'root',\n status:\n run.status === 'cancelled'\n ? 'cancelled'\n : ['done', 'succeeded'].includes(run.status)\n ? 'done'\n : ['down', 'failed'].includes(run.status)\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\nexport type TopAgentMetadata = Omit<TopInspection, 'rows' | 'context'> & {\n readonly context: readonly TopTranscriptRow[]\n}\n\n/** Metadata keeps full recorded context while the conversation can show compact attribution. */\nexport function topAgentMetadata(\n inspection: TopInspection | undefined,\n recorded: readonly TopTranscriptRow[],\n): TopAgentMetadata {\n const { rows, ...metadata }: TopInspection = inspection ?? {\n coverage: {\n status: 'missing' as const,\n source: 'Runtime',\n reason: 'Verified conversation inspection was not provided',\n },\n }\n return {\n ...metadata,\n context: [\n ...(metadata.context ?? []),\n ...recorded.filter((row) => row.event.provenance === 'delegated-input'),\n ...(rows ?? []).filter((row) => row.event.provenance === 'system-instructions'),\n ],\n }\n}\n\nexport interface TopAgentRowsFrame {\n readonly generation: number\n readonly events: readonly (TopTranscriptRow & { readonly seq: number })[]\n readonly lastSeq: number\n readonly alive: boolean\n readonly window: 'verified-native' | 'recorded-tail'\n readonly coverage?: TopInspection['coverage']\n}\n\n/** Both HTTP transports share conversation selection, stable identity, sequence and batching. */\nexport type TopAgentStreamFrame =\n | { readonly event: 'reset'; readonly data: { readonly generation: number } }\n | { readonly event: 'rows'; readonly data: TopAgentRowsFrame }\n\n/** Project selected conversation rows into ordered reset and row frames. */\nexport function createTopAgentStream(generation: number) {\n let representation: string | undefined\n let initiatingInput: TopTranscriptRow | undefined\n const seen = new Set<string>()\n let lastSeq = 0\n return {\n reset: { generation },\n frame({\n recorded,\n inspection,\n alive,\n includeContext,\n }: {\n recorded: readonly TopTranscriptRow[]\n inspection?: TopInspection\n alive: boolean\n includeContext?: boolean\n }): readonly TopAgentStreamFrame[] {\n initiatingInput =\n recorded.find((row) => row.event.provenance === 'delegated-input') ?? initiatingInput\n const input = initiatingInput?.event.text\n const task = input?.includes('\\n') ? input.slice(input.indexOf('\\n') + 1) : undefined\n const hasNativePrompt =\n !!task &&\n !!inspection?.rows?.some(\n (row) =>\n row.event.kind === 'user' && row.event.actor !== 'injected' && row.event.text === task,\n )\n const shownInput =\n initiatingInput && hasNativePrompt && !includeContext\n ? {\n ...initiatingInput,\n event: {\n ...initiatingInput.event,\n text: input!.slice(0, input!.indexOf('\\n')),\n provenance: 'recorded-sender',\n },\n }\n : initiatingInput\n const next = inspection?.rows?.length\n ? `capture:${inspection.coverage.ref ?? inspection.coverage.source}:${hasNativePrompt}`\n : 'progress'\n const frames: TopAgentStreamFrame[] = []\n if (representation !== undefined && representation !== next) {\n seen.clear()\n lastSeq = 0\n generation += 1\n frames.push({ event: 'reset', data: { generation } })\n }\n representation = next\n const rows = inspection?.rows?.length\n ? [\n ...(shownInput ? [shownInput] : []),\n ...recorded.filter(\n (row) =>\n inspection.coverage.status !== 'complete' &&\n row.event.provenance === 'recorded-result',\n ),\n ...inspection.rows.filter(\n (row) => includeContext || row.event.provenance !== 'system-instructions',\n ),\n ]\n : recorded\n const events = rows.flatMap((row) => {\n const key =\n 'id' in row && typeof row.id === 'string'\n ? row.id\n : createHash('sha256').update(JSON.stringify(row)).digest('hex')\n if (seen.has(key)) return []\n seen.add(key)\n if (next === 'progress' && seen.size > 2000) seen.delete(seen.values().next().value!)\n return [{ ...row, seq: ++lastSeq }]\n })\n for (let offset = 0; offset < Math.max(events.length, 1); offset += 100) {\n const batch = events.slice(offset, offset + 100)\n frames.push({\n event: 'rows',\n data: {\n generation,\n events: batch,\n lastSeq: batch.at(-1)?.seq ?? lastSeq,\n alive,\n window:\n inspection?.coverage.status === 'complete' ? 'verified-native' : 'recorded-tail',\n ...(inspection ? { coverage: inspection.coverage } : {}),\n },\n })\n }\n return frames\n },\n }\n}\n\n/** Router records are Runtime's canonical ToolLoopMessageRecord, not a native file heuristic. */\nexport async function retainedRouterInspection(worker: WorkerView, runDir?: string) {\n const evidence = worker.harnessTranscript\n if (\n !runDir ||\n evidence?.status !== 'available' ||\n evidence.harness !== 'router' ||\n !worker.endedAt\n )\n return undefined\n const artifact = await harnessTranscriptArtifact(\n evidence,\n new FileResultBlobStore(join(runDir, 'blobs')),\n )\n if (!artifact || !('files' in artifact)) return undefined\n const records = artifact.files.flatMap((file) =>\n 'content' in file\n ? file.content\n .split('\\n')\n .filter(Boolean)\n .map((line) => recordValue(JSON.parse(line)))\n .filter((row) => row && typeof row.role === 'string')\n : [],\n )\n const rows = records.flatMap((message, index) =>\n transcriptRows({ liveTail: [JSON.stringify({ at: worker.endedAt, message })] }).map(\n (row, part) => ({\n ...row,\n id: JSON.stringify([evidence.transcriptRef, index, part]),\n sessionId: `router:${worker.id}`,\n part,\n event: {\n ...row.event,\n provenance: 'router-transcript',\n source: 'Message time unknown; shown at captured settlement time',\n },\n }),\n ),\n )\n return {\n coverage: {\n status: 'partial' as const,\n source: 'Runtime Router conversation, displayed at recorded settlement time',\n reason: 'Per-message times were not captured',\n ref: `urn:${evidence.transcriptRef}`,\n },\n rows,\n files: {\n scope: 'none' as const,\n complete: true,\n reason: 'This in-process conversation has no sandbox workspace inventory',\n entries: [],\n },\n }\n}\n\n/** Present the recorded tail through sandbox-ui's existing agent-stream contract. */\nexport function transcriptRows(worker: Pick<WorkerView, 'liveTail'>) {\n const rows: TopTranscriptRow[] = []\n for (const line of worker.liveTail) {\n let value: Record<string, unknown> | undefined\n try {\n value = recordValue(JSON.parse(line))\n } catch {\n continue\n }\n const timestamp = value?.timestamp ?? value?.at\n const time = typeof timestamp === 'string' ? Date.parse(timestamp) : timestamp\n if (typeof time !== 'number' || !Number.isFinite(new Date(time).getTime())) continue\n const at = new Date(time).toISOString()\n const push = (event: (typeof rows)[number]['event']) => rows.push({ at, event })\n const event = recordValue(value?.event)\n if (typeof event?.kind === 'string') {\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 push({ ...event, kind })\n }\n if (event?.kind) continue\n const legacy = (event: (typeof rows)[number]['event']) =>\n push({\n ...event,\n provenance: 'unverified-progress',\n source: 'Legacy progress only; full capture is unverified',\n })\n const message = recordValue(value?.message)\n if (!message) continue\n if (message.role === 'tool') {\n legacy({\n kind: 'tool-result',\n toolCallId: String(message.tool_call_id),\n result: message.content,\n })\n continue\n }\n for (const item of Array.isArray(message.tool_calls) ? message.tool_calls : []) {\n const call = recordValue(item),\n fn = recordValue(call?.function)\n if (call && fn)\n legacy({\n kind: 'tool-call',\n toolCallId: String(call.id),\n toolName: String(fn.name),\n args: fn.arguments,\n })\n }\n const parts =\n typeof message.content === 'string'\n ? [{ type: 'text', text: message.content }]\n : Array.isArray(message.content)\n ? message.content\n : []\n for (const part of parts) {\n if (!recordValue(part)) continue\n if (part.type === 'text' && typeof part.text === 'string' && part.text.length > 0)\n legacy({ kind: message.role === 'user' ? 'user' : 'text', text: part.text })\n else if (part.type === 'thinking' && typeof part.thinking === 'string')\n legacy({ kind: 'reasoning', text: part.thinking })\n else if (part.type === 'tool_use')\n legacy({\n kind: 'tool-call',\n toolCallId: String(part.id),\n toolName: String(part.name),\n args: part.input,\n })\n else if (part.type === 'tool_result')\n legacy({ kind: 'tool-result', toolCallId: String(part.tool_use_id), result: part.content })\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 return readRecordedEvents(file, 200).lines\n}\n\nexport function transcriptTail(worker: WorkerView) {\n return transcriptRows(\n worker.eventFile ? { ...worker, liveTail: readTranscriptTail(worker.eventFile) } : worker,\n )\n}\n\n/** Actual recorded event time and cadence; absence means no event evidence, never file mtime. */\nexport interface RecordedActivity {\n readonly lastActivityAt?: number\n readonly medianEventGapMs?: number\n}\n\nexport interface RecordedEvents {\n readonly file: string\n readonly lines: string[]\n readonly activity: RecordedActivity\n readonly firstActivityAt?: number\n}\n\ninterface Cursor {\n dev: number\n ino: number\n offset: number\n pending: string\n decoder: StringDecoder\n times: number[]\n lines: string[]\n result: RecordedEvents\n}\n\nconst cursors = new Map<string, Cursor>()\nconst activityKinds = new Set([\n 'text',\n 'reasoning',\n 'user',\n 'tool-call',\n 'tool-result',\n 'interaction',\n 'child_task',\n])\n\nfunction recordedActivity(line: string) {\n return transcriptRows({ liveTail: [line] }).find((row) => activityKinds.has(row.event.kind))\n}\n\n/** Read appended UTF-8 bytes once; complete EOF JSON follows the durable reader contract. */\nexport function readRecordedEvents(file: string, maxLines = 8): RecordedEvents {\n const fd = openSync(file, 'r')\n try {\n const stat = fstatSync(fd)\n let cursor = cursors.get(file)\n if (\n !cursor ||\n cursor.dev !== stat.dev ||\n cursor.ino !== stat.ino ||\n stat.size < cursor.offset\n ) {\n cursor = {\n dev: stat.dev,\n ino: stat.ino,\n offset: 0,\n pending: '',\n decoder: new StringDecoder('utf8'),\n times: [],\n lines: [],\n result: { file, lines: [], activity: {} },\n }\n cursors.set(file, cursor)\n }\n if (stat.size === cursor.offset)\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n const lines = [...cursor.lines]\n const buffer = Buffer.alloc(Math.min(65_536, stat.size - cursor.offset))\n while (cursor.offset < stat.size) {\n const bytes = readSync(\n fd,\n buffer,\n 0,\n Math.min(buffer.length, stat.size - cursor.offset),\n cursor.offset,\n )\n if (!bytes) break\n cursor.offset += bytes\n const rows = (cursor.pending + cursor.decoder.write(buffer.subarray(0, bytes))).split('\\n')\n cursor.pending = rows.pop()!\n for (const line of rows) {\n if (!line.trim()) continue\n lines.push(line)\n if (lines.length > 200) lines.shift()\n // One source row is one instant even when a native message contains several parts.\n const activity = recordedActivity(line)\n if (activity) cursor.times.push(Date.parse(activity.at))\n }\n }\n cursor.lines = lines\n // A complete EOF row is valid durable JSONL. Keep it separate until its newline arrives.\n let pending: string[] = []\n if (cursor.pending.trim()) {\n try {\n JSON.parse(cursor.pending)\n pending = [cursor.pending]\n } catch {\n // A torn row is still private to its writer.\n }\n }\n const final = pending.length ? recordedActivity(pending[0]!) : undefined\n const times = (final ? [...cursor.times, Date.parse(final.at)] : cursor.times).sort(\n (a, b) => a - b,\n )\n const gaps = times\n .slice(1)\n .map((at, i) => at - times[i]!)\n .sort((a, b) => a - b)\n const mid = Math.floor(gaps.length / 2)\n cursor.result = {\n file,\n lines: [...lines, ...pending].slice(-200),\n ...(times.length ? { firstActivityAt: times[0]! } : {}),\n activity: {\n ...(times.length ? { lastActivityAt: times.at(-1)! } : {}),\n ...(gaps.length\n ? { medianEventGapMs: (gaps[Math.floor((gaps.length - 1) / 2)]! + gaps[mid]!) / 2 }\n : {}),\n },\n }\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n } catch (error) {\n cursors.delete(file)\n throw error\n } finally {\n closeSync(fd)\n }\n}\n\n/** Read native progress files with bounded, path-only diagnostics. */\nexport function readWorkerEventTails(dir: string) {\n const out = new Map<string, RecordedEvents>()\n const diagnostics: TopSnapshotDiagnostic[] = []\n const read = (path: string, key = join(dir, path)) => {\n try {\n if (existsSync(join(dir, path))) out.set(key, readRecordedEvents(join(dir, path)))\n } catch {\n diagnostics.push({ source: 'worker-tail', path, reason: 'unreadable' })\n }\n }\n read(ROOT_STREAM_FILE)\n for (const folder of ['workers', 'streams']) {\n if (!existsSync(join(dir, folder))) continue\n try {\n for (const entry of readdirSync(join(dir, folder))) {\n // Inbox steer requests are not evidence that the executor emitted progress.\n if (folder === 'workers' && entry.endsWith('.ndjson') && !entry.endsWith('.inbox.ndjson'))\n read(join(folder, entry), entry.slice(0, -'.ndjson'.length))\n else if (folder === 'streams' && entry.endsWith('.jsonl')) read(join(folder, entry))\n }\n } catch {\n diagnostics.push({ source: 'worker-tail', path: folder, reason: 'unreadable' })\n }\n }\n return { value: out, diagnostics }\n}\n\n/** The normalized subset consumed here; native decoding stays with harness-sessions. */\nexport interface HarnessRowsSession {\n readonly nativeSessionId: string\n readonly messages: readonly {\n readonly id: string\n readonly at?: string | null\n readonly role: string\n readonly actor?: string\n readonly parts: readonly {\n readonly type: string\n readonly text?: string\n readonly toolCallId?: string\n }[]\n }[]\n readonly toolCalls: readonly {\n readonly id: string\n readonly name: string\n readonly startedAt?: string | null\n readonly endedAt?: string | null\n readonly input?: unknown\n readonly inputText?: string | null\n readonly result?: { readonly output?: unknown; readonly text?: string | null } | null\n }[]\n}\nexport type HarnessRowsGap = {\n readonly sessionId: string\n readonly recordId: string\n readonly reason: string\n}\nexport type HarnessSessionRow = TopTranscriptRow & {\n readonly id: string\n readonly sessionId: string\n readonly part: number\n}\n\n/** One ordered projection for every strict native reader, with explicit unrenderable evidence. */\nexport function harnessSessionRows(sessions: readonly HarnessRowsSession[]) {\n const rows: HarnessSessionRow[] = []\n const gaps: HarnessRowsGap[] = []\n for (const session of sessions) {\n const emitted = new Set<string>()\n const push = (\n recordId: string,\n part: number,\n value: string | null | undefined,\n event: HarnessSessionRow['event'],\n ) => {\n if (!value || !Number.isFinite(Date.parse(value))) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId,\n reason: 'Native record has no valid recorded time',\n })\n return\n }\n rows.push({\n id: JSON.stringify([session.nativeSessionId, event.kind, recordId, part]),\n sessionId: session.nativeSessionId,\n part,\n at: new Date(value).toISOString(),\n event: event.actor === 'injected' ? { ...event, provenance: 'system-instructions' } : event,\n })\n }\n const tool = (\n id: string,\n result: boolean,\n at?: string | null,\n recordId = id,\n part = 0,\n actor?: string,\n ) => {\n const call = session.toolCalls.find((item) => item.id === id)\n if (!call || (result && !call.result)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: id,\n reason: 'Referenced tool evidence is missing',\n })\n return\n }\n const key = `${result ? 'result' : 'call'}:${id}`\n if (emitted.has(key)) return\n emitted.add(key)\n const toolCallId = `${session.nativeSessionId}:${id}`\n push(\n recordId,\n part,\n at ?? (result ? call.endedAt : call.startedAt),\n result\n ? {\n kind: 'tool-result',\n toolCallId,\n result: call.result?.output ?? call.result?.text,\n actor,\n ...(actor ? { source: `Native actor ${actor}` } : {}),\n }\n : {\n kind: 'tool-call',\n toolCallId,\n toolName: call.name,\n args: call.input ?? call.inputText,\n actor,\n ...(actor ? { source: `Native actor ${actor}` } : {}),\n },\n )\n }\n for (const message of session.messages)\n for (const [part, value] of message.parts.entries()) {\n if (value.type === 'tool-call' || value.type === 'tool-result')\n tool(\n value.toolCallId ?? '',\n value.type === 'tool-result',\n message.at,\n message.id,\n part,\n message.actor,\n )\n else if ((value.type === 'text' || value.type === 'reasoning') && value.text)\n push(message.id, part, message.at, {\n kind:\n value.type === 'reasoning'\n ? 'reasoning'\n : message.role === 'user'\n ? 'user'\n : message.role === 'assistant'\n ? 'text'\n : 'notice',\n text: value.text,\n actor: message.actor,\n ...(message.actor ? { source: `Native actor ${message.actor}` } : {}),\n ...(!['user', 'assistant', 'tool'].includes(message.role)\n ? { provenance: 'system-instructions', source: message.role }\n : {}),\n })\n else if (value.type !== 'text' && value.type !== 'reasoning')\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: message.id,\n reason: `Native ${value.type} content is retained but not projected inline`,\n })\n }\n for (const call of session.toolCalls) {\n if (!emitted.has(`call:${call.id}`)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: call.id,\n reason: 'Tool call has no ordered message-part reference',\n })\n tool(call.id, false)\n }\n if (call.result && !emitted.has(`result:${call.id}`)) {\n gaps.push({\n sessionId: session.nativeSessionId,\n recordId: call.id,\n reason: 'Tool result has no ordered message-part reference',\n })\n tool(call.id, true)\n }\n }\n }\n // Stable sort preserves the recorded session/message/part order when clocks are equal.\n return { rows: rows.sort((a, b) => a.at.localeCompare(b.at)), gaps }\n}\n","import { basename, join } from 'node:path'\nimport { parseCommittedJsonLines } from '../durable/jsonl-file'\nimport type { TopJournalEvent } from './top-snapshot'\nimport { type RecordedEvents, readRecordedEvents } 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, RecordedEvents>()\n let first: 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 try {\n const recorded = readRecordedEvents(file)\n tails.set(id, recorded)\n if (recorded.firstActivityAt !== undefined)\n start = new Date(recorded.firstActivityAt).toISOString()\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (start && (!first || start < first)) first = start\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 activity = tails.get(id)?.activity.lastActivityAt\n const at = activity === undefined ? undefined : new Date(activity).toISOString()\n const reason = typeof row.reason === 'string' ? { reason: row.reason } : {}\n events.push(\n row.type === 'cancelled'\n ? { kind: 'cancelled', id, ...(at ? { at } : {}), ...reason }\n : {\n kind: 'settled',\n id,\n status: row.type === 'error' ? 'down' : 'done',\n ...(at ? { at } : {}),\n spent: { usdKnown: false, tokensKnown: false },\n ...reason,\n },\n )\n }\n }\n return { id: basename(runDir), events, tails, first }\n}\n","/** Read-only topology, activity and accounting over writer-owned workspace and durable journals.\n * ANSI presentation lives in `./top-frame`.\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { isRecord } from '@tangle-network/agent-core'\nimport { FileObserverJournal, type ObserverRecord } from '../durable/observer-journal'\nimport {\n type PursuitProjection,\n type PursuitRunProjection,\n projectPursuit,\n} from '../durable/observer-projection'\nimport { readFailureRecord, readSettleRecord } from '../durable/settle-record'\nimport { FileSpawnJournal } from '../durable/spawn-journal/journal-store'\nimport { spawnJournalRecordEvents } from '../durable/spawn-journal/record-events'\nimport { discoverDurableSupervisionRun } from '../durable/supervision-discovery'\nimport { FileCoordinationLog } from '../runtime/supervise/coordination-log'\nimport { nodeStreamFile, ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n} from '../runtime/supervise/run-layout'\nimport { rootCoordinationOwner } from '../runtime/supervise/supervise-identity'\nimport type { Spend, SpendChannel } from '../runtime/supervise/types'\nimport { type RecordedEvents, readWorkerEventTails } from './top-transcript'\nimport type {\n BudgetStats,\n Distribution,\n SpendStats,\n SupervisorState,\n SupervisorTotals,\n SupervisorView,\n TopJournalEvent,\n TopSnapshot,\n TopSnapshotDiagnostic,\n TopSnapshotDiagnosticReason,\n TopSnapshotDiagnosticSource,\n WorkerView,\n} from './top-types'\nimport { workflowJournal } from './workflow-journal'\n\nexport type {\n BudgetStats,\n Distribution,\n SpendStats,\n SupervisorState,\n SupervisorTotals,\n SupervisorView,\n TopJournalEvent,\n TopSnapshot,\n TopSnapshotCompleteness,\n TopSnapshotDiagnostic,\n TopSnapshotDiagnosticReason,\n TopSnapshotDiagnosticSource,\n WorkerView,\n} from './top-types'\n\ntype MutableWorker = {\n -readonly [Key in keyof Omit<WorkerView, 'latencyMs'>]: WorkerView[Key]\n}\n\n/** A recovered value and bounded, run-relative read diagnostics. */\ninterface SourceRead<T> {\n readonly value: T\n readonly diagnostics: readonly TopSnapshotDiagnostic[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\n\n/** Read a point-in-time view without writing to the run. Missing or partial sources report\n * bounded diagnostics, and live event readers cache append offsets. `now` controls elapsed time.\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 loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now(), false)\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 TopSnapshotDiagnostic[]): 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(dir)\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\n/** Combine supervisor projections and source diagnostics into one snapshot. */\nexport function 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\n/** Observer-backed and older spawn-only runs share topology; missing accounting stays unknown. */\nasync function loadDurableTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n observed = true,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir)\n let pursuit: PursuitProjection | undefined\n let observations: readonly ObserverRecord[] = []\n let source: TopSnapshotDiagnosticSource = observed ? 'observer-journal' : 'journal'\n let path = observed ? 'observer.jsonl' : 'spawn-journal.jsonl'\n try {\n if (typeof runDir !== 'string' || !runDir.trim())\n throw new TypeError('runDir must be non-empty')\n if (observed) {\n const journal = await FileObserverJournal.open(join(resolve(runDir), path))\n if (!journal) return topSnapshot(root, now, [], [{ source, path, reason: 'missing' }])\n observations = await journal.read()\n pursuit = projectPursuit(observations)\n }\n source = 'journal'\n path = '.'\n const discovery = await discoverDurableSupervisionRun(runDir)\n path = 'spawn-journal.jsonl'\n const journal = new FileSpawnJournal(discovery.spawnJournalPath)\n const latest = new Map(pursuit?.runs.map((run) => [run.runId, run]))\n // A child's metered turns already belong to its spawn tree, not another supervisor row.\n const ids = pursuit\n ? [...latest.keys()].filter(\n (id) => !discovery.roots.some((parent) => id.startsWith(`${parent}/`)),\n )\n : discovery.roots\n path = 'result.json'\n const settled = await readSettleRecord(discovery.runDir)\n if (settled && !ids.includes(settled.tree.root))\n throw new Error('settle root is not discovered')\n path = 'failure.json'\n const failure = await readFailureRecord(discovery.runDir)\n const tails = readWorkerEventTails(discovery.runDir)\n const log = new FileCoordinationLog(discovery.coordinationLogPath)\n path = 'coordination-log.jsonl'\n const supervisors = await Promise.all(\n ids.map(async (id) => {\n const accounting = latest.get(id)\n const binding = discovery.roots.indexOf(id)\n // Retained admissions can predate the spawn journal. An existing journal must bind the root.\n if (binding < 0 && existsSync(discovery.spawnJournalPath))\n throw new Error('observer run has no discovered spawn root')\n const events = binding < 0 ? [] : ((await journal.loadTree(id)) ?? [])\n const spawn = events.find((event) => event.kind === 'spawned' && event.id === id)\n const reopen = events\n .filter(\n (event) => event.kind === 'reopened' && event.id === id && event.budget !== undefined,\n )\n .at(-1)\n const budget =\n reopen?.kind === 'reopened' && reopen.budget\n ? reopen.budget.maxTokens\n : spawn?.kind === 'spawned'\n ? spawn.budget?.maxTokens\n : undefined\n const boundary = observations.find(\n (record) => record.sequence === accounting?.firstSequence,\n )?.event?.payload\n const coordinationOffset = isRecord(boundary) ? boundary.coordinationOffset : undefined\n\n const outcome: SupervisorView['outcome'] =\n settled?.tree.root === id\n ? settled.kind === 'winner'\n ? { kind: 'winner' }\n : { kind: 'no-winner', reason: settled.reason }\n : failure?.runId === id && accounting?.status === 'down'\n ? { kind: 'failed', reason: failure.error.message }\n : undefined\n const prior =\n spawn?.kind === 'spawned' && spawn.identity\n ? await log.load(id, rootCoordinationOwner(spawn.identity))\n : undefined\n let lastRoute: SupervisorView['lastRoute']\n const records = prior?.records ?? []\n if (\n coordinationOffset !== undefined &&\n (typeof coordinationOffset !== 'number' ||\n !Number.isSafeInteger(coordinationOffset) ||\n coordinationOffset < 0 ||\n coordinationOffset > records.length)\n )\n throw new Error('invalid attempt coordination offset')\n const offset =\n typeof coordinationOffset === 'number'\n ? coordinationOffset\n : accounting?.attemptIndex === 0\n ? 0\n : records.length\n for (const { event } of records.slice(offset)) {\n if (\n event.type === 'route' &&\n (event.route.kind === 'stopped' || event.route.kind === 'unrouted')\n )\n lastRoute = event.route\n }\n const startedAt = accounting\n ? new Date(accounting.firstObservedAt).toISOString()\n : discovery.rootsBegunAt[binding]\n const view = buildSupervisorView(\n {\n id,\n task: id,\n workspaceDir: root,\n status: accounting?.status ?? 'running',\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n ...(startedAt == null ? {} : { startedAt }),\n ...(accounting?.settledAt === undefined\n ? {}\n : { completedAt: new Date(accounting.settledAt).toISOString() }),\n },\n discovery.runDir,\n events.filter(isSpawnEvent),\n accounting?.error ? [accounting.error] : [],\n now,\n tails.value,\n accounting,\n )\n if (!accounting) Object.assign(view.totals, { usdKnown: false, tokensKnown: false })\n if (outcome)\n Object.assign(view, {\n outcome,\n status: outcome.kind === 'winner' ? 'done' : outcome.kind,\n })\n if (lastRoute)\n Object.assign(view, {\n lastRoute,\n reason: lastRoute.kind === 'stopped' ? lastRoute.reason : lastRoute.detail,\n })\n else if (outcome && 'reason' in outcome) Object.assign(view, { reason: outcome.reason })\n return view\n }),\n )\n return topSnapshot(\n root,\n now,\n supervisors,\n [\n ...(!observed\n ? [\n {\n source: 'observer-journal' as const,\n path: 'observer.jsonl',\n reason: 'missing' as const,\n },\n ]\n : []),\n ...tails.diagnostics,\n ],\n observed ? 1 : ids.length,\n pursuit,\n )\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\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/** Current writer-owned journal first; retain the retired name for recorded runs. */\nfunction readJournal(eventDir: string): SourceRead<TopJournalEvent[]> {\n const path = ['spawn-journal.jsonl', 'journal.jsonl'].find((candidate) =>\n existsSync(join(eventDir, candidate)),\n )\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\n/** The settled spawn event's retained-conversation receipt, read without widening the public\n * `TopJournalEvent` type; the spawn journal already validated the record. */\nfunction retainedTranscript(event: object): { ref: string; harness: string } | undefined {\n const retained = (event as { harnessTranscript?: unknown }).harnessTranscript\n if (typeof retained !== 'object' || retained === null) return undefined\n const { status, transcriptRef, harness } = retained as Record<string, unknown>\n return status === 'available' && typeof transcriptRef === 'string' && typeof harness === 'string'\n ? { ref: transcriptRef, harness }\n : undefined\n}\n\n/** The canonical spawn receipt owns the cause; the public journal view stays compatible. */\nfunction recordedReason(event?: object): string | undefined {\n return isRecord(event) && typeof event.reason === 'string' ? event.reason : undefined\n}\n\n/** Project committed lifecycle and spend evidence into one supervisor view. */\nexport function buildSupervisorView(\n state: SupervisorState,\n stateDir: string,\n events: readonly TopJournalEvent[],\n progressTail: readonly string[],\n now: number,\n workerEventTails = new Map<string, RecordedEvents>(),\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 const terminal = accounting\n ? undefined\n : events\n .filter(\n (event) => isRoot(event.id) && (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n .at(-1)\n const rootReason = recordedReason(terminal) ?? state.reason\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 for (const key of [\n 'endedAt',\n 'outRef',\n 'harnessTranscript',\n 'transcript',\n 'reason',\n 'infra',\n 'verdict',\n ] as const)\n delete worker[key]\n worker.label = event.label ?? worker.label\n if (event.identity) worker.identity = event.identity\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 === 'materialized' || event.kind === 'seat-materialized') {\n worker.materialization = event.receipt\n } else if (event.kind === 'execution-bound') {\n worker.executionBindings = [...(worker.executionBindings ?? []), event.binding]\n } else if (event.kind === 'settled' || event.kind === 'cancelled') {\n if (event.at) worker.endedAt = event.at\n const reason = recordedReason(event)\n if (reason !== undefined) worker.reason = reason\n if (event.kind === 'settled') {\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.outRef) worker.outRef = event.outRef\n if (event.harnessTranscript) worker.harnessTranscript = event.harnessTranscript\n const transcript = retainedTranscript(event)\n if (transcript) worker.transcript = transcript\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 }\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.kind === 'metered' && 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(join(stateDir, nodeStreamFile(worker.id))) ??\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) {\n worker.eventFile = tail.file\n Object.assign(worker, tail.activity)\n }\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 ...(rootReason === undefined ? {} : { reason: rootReason }),\n ...workerEventTails.get(join(stateDir, ROOT_STREAM_FILE))?.activity,\n status:\n accounting?.status ??\n (terminal?.kind === 'settled'\n ? (terminal.status ?? state.status)\n : terminal\n ? 'cancelled'\n : 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 ...(!state.completedAt && terminal?.at ? { completedAt: terminal.at } : {}),\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 = selectFields(\n value,\n ['maxIterations', 'maxTokens', 'maxUsd'],\n (entry) => typeof entry === 'number',\n ) as BudgetStats\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/** Missing files can predate their writer; failed reads report a path-only diagnostic. */\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 return raw?.trim().split('\\n').filter(Boolean).slice(-maxLines) ?? []\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 ['id', 'status', 'task', 'workspaceDir'].every((key) => typeof value[key] === 'string') &&\n typeof value.budget === 'number'\n )\n}\n\n/** Validate supported journal lifecycle and accounting event shapes. */\nexport function isSpawnEvent<T>(value: T): value is T & TopJournalEvent {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n [\n 'spawned',\n 'settled',\n 'cancelled',\n 'metered',\n 'progress',\n 'materialized',\n 'seat-materialized',\n 'execution-bound',\n ].includes(value.kind)\n )\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 { once } from 'node:events'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { join, resolve } from 'node:path'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport { linkAbort, runAbortable } from '../runtime/supervise/abortable'\nimport { loadTopSnapshot, type TopSnapshot, type WorkerView } from './top-snapshot'\nimport {\n createTopAgentStream,\n readTopAgentInspection,\n retainedRouterInspection,\n type TopInspection,\n type TopSessionReader,\n topAgentMetadata,\n topAgentWorker,\n transcriptHistory,\n type transcriptRows,\n transcriptTail,\n} from './top-transcript'\n\nexport type { TopInspection } from './top-transcript'\n\nconst SOURCE_READ_TIMEOUT_MS = 30_000\nexport type TopInspectionSource = (request: {\n readonly root: string\n readonly runId: string\n readonly workerId: string\n readonly signal?: AbortSignal\n}) => Promise<TopInspection>\n\n/** Selected reads share the web server's origin, method and lifecycle boundary. */\nexport async function serveTopAgent({\n request,\n response,\n path,\n base,\n roots,\n snapshots,\n transcripts,\n source,\n readSessions,\n}: {\n request: IncomingMessage\n response: ServerResponse\n path: string\n base: string\n roots: readonly string[]\n snapshots: ReadonlyMap<string, TopSnapshot>\n transcripts: Set<() => void>\n source?: TopInspectionSource\n readSessions?: TopSessionReader\n}) {\n const [, , , , rootIndex, runId, workerId] = path.split('/').map(decodeURIComponent)\n const root = roots[Number(rootIndex)]\n const run = root && snapshots.get(root)?.supervisors.find((entry) => entry.id === runId)\n const safeId = (id: string | undefined) =>\n !!id && /^[a-z0-9_.:-]+$/i.test(id) && id !== '.' && id !== '..'\n if (\n !safeId(runId) ||\n !safeId(workerId) ||\n !run ||\n (!run.workers.some((entry) => entry.id === workerId) && run.id !== workerId)\n ) {\n response.writeHead(404).end()\n return\n }\n // A runs root keeps each run's journals, blobs and root stream in `<root>/<runId>`.\n const own =\n root && existsSync(resolve(root, runId!, 'observer.jsonl')) ? resolve(root, runId!) : undefined\n const runDir = own ?? root\n const pursuit = own\n ? (await loadTopSnapshot(root!, { runDir: own })).pursuit\n : root\n ? snapshots.get(root)?.pursuit\n : undefined\n const worker = (): WorkerView | undefined => {\n const run = root ? snapshots.get(root)?.supervisors.find((run) => run.id === runId) : undefined\n const node = run && topAgentWorker(run, workerId!)\n return node && node.id === run?.id && existsSync(resolve(runDir!, 'root-stream.jsonl'))\n ? { ...node, eventFile: resolve(runDir!, 'root-stream.jsonl') }\n : node\n }\n\n if (!worker()) {\n response.writeHead(404).end()\n return\n }\n const controller = new AbortController()\n response.on('close', () => controller.abort())\n const readSource = async () => {\n const deadline = new AbortController()\n const linked = linkAbort(controller.signal, deadline.signal)\n const timer = setTimeout(\n () => deadline.abort('Inspection source read exceeded its deadline'),\n SOURCE_READ_TIMEOUT_MS,\n )\n timer.unref()\n try {\n const result = await runAbortable(\n () =>\n source\n ? source({\n root: runDir!,\n runId: runId!,\n workerId: workerId!,\n signal: linked.signal,\n })\n : readSessions\n ? readTopAgentInspection({\n worker: worker()!,\n runId: runId!,\n blobs: new FileResultBlobStore(join(runDir!, 'blobs')),\n readSessions,\n signal: linked.signal,\n })\n : retainedRouterInspection(worker()!, runDir),\n linked.signal,\n 'Inspection read stopped',\n )\n return result?.coverage.status === 'complete' && !result.rows?.length\n ? {\n ...result,\n coverage: {\n ...result.coverage,\n status: 'partial' as const,\n reason: 'No verified native conversation rows were supplied',\n },\n }\n : result\n } finally {\n clearTimeout(timer)\n linked.release()\n }\n }\n let history: ReturnType<typeof transcriptRows> | undefined = await transcriptHistory(\n worker()!,\n runDir,\n pursuit?.nodes.find((node) => node.runId === runId && node.id === workerId),\n )\n if (!path.endsWith('/stream')) {\n const inspection = await readSource()\n response.writeHead(200, { 'Content-Type': 'application/json' })\n response.end(\n request.method === 'HEAD'\n ? undefined\n : JSON.stringify(topAgentMetadata(inspection, history ?? [])),\n )\n return\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 stream = createTopAgentStream(Date.now())\n response.write(`event: reset\\ndata: ${JSON.stringify(stream.reset)}\\n\\n`)\n let updating = false\n const update = () => {\n if (updating || response.destroyed || response.writableEnded) return\n updating = true\n void (async () => {\n const node = worker()\n if (!node || response.writableLength > 1024 * 1024) {\n response.destroy()\n return\n }\n const inspection = await readSource()\n const recorded = history ?? transcriptTail(node)\n history = undefined\n const alive = node.status === 'running'\n const frames = stream.frame({\n recorded,\n inspection,\n alive,\n includeContext: new URL(request.url ?? '/', base).searchParams.get('context') === '1',\n })\n for (const frame of frames) {\n if (!response.write(`event: ${frame.event}\\ndata: ${JSON.stringify(frame.data)}\\n\\n`))\n await once(response, 'drain', { signal: controller.signal })\n }\n if (!alive) {\n response.write('event: end\\ndata: {}\\n\\n')\n response.end()\n }\n })()\n .catch(() => {\n if (!response.destroyed) response.end('event: unavailable\\ndata: {}\\n\\n')\n })\n .finally(() => {\n updating = false\n })\n }\n transcripts.add(update)\n response.on('close', () => transcripts.delete(update))\n update()\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 { extname, resolve, sep } from 'node:path'\nimport { loadTopSnapshot, type TopSnapshot } from './top-snapshot'\nimport type { TopSessionReader } from './top-transcript'\nimport { serveTopAgent, type TopInspectionSource } from './top-web-agent'\n\nexport type { TopInspection, TopInspectionSource } from './top-web-agent'\n\n/** Interval for reconciling missed filesystem notifications in the live viewer. */\nexport const TOP_SNAPSHOT_RECONCILE_MS = 500\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 packaged Sandbox UI browser assets. */\n readonly assets?: string\n readonly host?: string\n readonly port?: number\n /** Product-owned verified conversation reads; no execution or credential access. */\n readonly source?: TopInspectionSource\n /** Canonical native decoding for ordinary Runtime transcript receipts. */\n readonly readSessions?: TopSessionReader\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 require = createRequire(import.meta.url)\n const assets = await realpath(\n options.assets ?? resolve(require.resolve('@tangle-network/agent-runtime/tui'), '../../viewer'),\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 let inFlight: Promise<void> = Promise.resolve()\n const read = async () => {\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 refresh = (): Promise<void> => {\n if (reading || closed) return inFlight\n inFlight = read()\n return inFlight\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, TOP_SNAPSHOT_RECONCILE_MS)\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 await serveTopAgent({\n request,\n response,\n path,\n base,\n roots,\n snapshots,\n transcripts,\n source: options.source,\n readSessions: options.readSessions,\n })\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 clearInterval(reconcile)\n clearInterval(heartbeat)\n for (const watcher of watchers) watcher.close()\n // A caller closes right after its run settles: let a read in flight finish, then read once\n // more, so a terminal record appended just before close reaches connected clients.\n await inFlight.catch(() => undefined)\n await refresh().catch(() => undefined)\n closed = true\n if (scheduled) clearTimeout(scheduled)\n // The run is over for this viewer: say so, so a client stops instead of reconnecting.\n for (const client of clients) client.end('event: end\\ndata: {}\\n\\n')\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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"}