@tangle-network/agent-runtime 1.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{activation-CFS31SWI.d.ts → activation-BuK2H7qx.d.ts} +2 -2
- package/dist/{activation-BwoSqHCc.js → activation-ZQWz04u8.js} +4 -4
- package/dist/{activation-BwoSqHCc.js.map → activation-ZQWz04u8.js.map} +1 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +4 -3
- package/dist/agent.js.map +1 -1
- package/dist/{bundle-DeDkJbsr.js → bundle-PDYNXIEf.js} +2 -2
- package/dist/{bundle-DeDkJbsr.js.map → bundle-PDYNXIEf.js.map} +1 -1
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{coordination-manager-ewBF777W.js → coordination-manager-BZLp9qpE.js} +8 -363
- package/dist/coordination-manager-BZLp9qpE.js.map +1 -0
- package/dist/coordination-map-routing-CUvwHAtv.js +362 -0
- package/dist/coordination-map-routing-CUvwHAtv.js.map +1 -0
- package/dist/{delegate-BiuSfwBa.js → delegate-C-MUU6ML.js} +2 -2
- package/dist/{delegate-BiuSfwBa.js.map → delegate-C-MUU6ML.js.map} +1 -1
- package/dist/durable-file-CksURHlH.js +1 -0
- package/dist/durable-file-DstVeHcj.js +228 -0
- package/dist/durable-file-DstVeHcj.js.map +1 -0
- package/dist/durable.d.ts +1 -1
- package/dist/durable.js +10 -8
- package/dist/durable.js.map +1 -1
- package/dist/{graph-D6FL1xze.js → graph-CM-6CV_K.js} +6 -5
- package/dist/{graph-D6FL1xze.js.map → graph-CM-6CV_K.js.map} +1 -1
- package/dist/graph-registry-72DlMnUl.js +585 -0
- package/dist/graph-registry-72DlMnUl.js.map +1 -0
- package/dist/graph-registry-CAX15LO6.js +1 -0
- package/dist/{improve-SiKDcz5_.js → improve-BuZ-I8DP.js} +9 -8
- package/dist/{improve-SiKDcz5_.js.map → improve-BuZ-I8DP.js.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +12 -11
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +2 -2
- package/dist/intelligence.js +7 -7
- package/dist/{journal-store-BJPMUydp.js → journal-store-BpCOCDoO.js} +208 -635
- package/dist/journal-store-BpCOCDoO.js.map +1 -0
- package/dist/jsonl-file-BBP9Dz9w.js +429 -0
- package/dist/jsonl-file-BBP9Dz9w.js.map +1 -0
- package/dist/kernel.d.ts +1 -1
- package/dist/kernel.js +13 -12
- package/dist/{loop-runner-CqlcC0i4.js → loop-runner-BWD6v1rd.js} +2 -2
- package/dist/{loop-runner-CqlcC0i4.js.map → loop-runner-BWD6v1rd.js.map} +1 -1
- package/dist/{loop-runner-D9rcTNf2.d.ts → loop-runner-BpLTU_J4.d.ts} +2 -2
- package/dist/loop-runner-bin.d.ts +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +5 -5
- package/dist/{prepare-XWwsOh8O.js → prepare-Bv6X2Wnx.js} +4 -4
- package/dist/{prepare-XWwsOh8O.js.map → prepare-Bv6X2Wnx.js.map} +1 -1
- package/dist/{profile-C01SQZKa.js → profile-Dir2A1_2.js} +2 -2
- package/dist/{profile-C01SQZKa.js.map → profile-Dir2A1_2.js.map} +1 -1
- package/dist/profiles.d.ts +1 -1
- package/dist/{provision-supervisor-DnwR0AyW.js → provision-supervisor-BWEeWag1.js} +8 -6
- package/dist/{provision-supervisor-DnwR0AyW.js.map → provision-supervisor-BWEeWag1.js.map} +1 -1
- package/dist/{run-cancellation-CoJRKvih.js → run-cancellation-Cpm-BIUu.js} +3 -2
- package/dist/{run-cancellation-CoJRKvih.js.map → run-cancellation-Cpm-BIUu.js.map} +1 -1
- package/dist/{runtime-DSYZeav8.js → runtime-Cnr3213E.js} +18 -15
- package/dist/{runtime-DSYZeav8.js.map → runtime-Cnr3213E.js.map} +1 -1
- package/dist/{sandbox-profile-compat-CXjozdWL.js → sandbox-profile-compat-DRiz9kME.js} +2 -2
- package/dist/{sandbox-profile-compat-CXjozdWL.js.map → sandbox-profile-compat-DRiz9kME.js.map} +1 -1
- package/dist/{search-executor-DcGAOrAh.js → search-executor-__X1VKnU.js} +5 -5
- package/dist/{search-executor-DcGAOrAh.js.map → search-executor-__X1VKnU.js.map} +1 -1
- package/dist/{server-SrPLb8w0.js → server-CntFSTpW.js} +4 -4
- package/dist/{server-SrPLb8w0.js.map → server-CntFSTpW.js.map} +1 -1
- package/dist/{structural-rollout-C_lg83-u.js → structural-rollout-s8W19Mws.js} +5 -5
- package/dist/{structural-rollout-C_lg83-u.js.map → structural-rollout-s8W19Mws.js.map} +1 -1
- package/dist/{supervise-BXw89Ajc.js → supervise-Cl0F57m9.js} +32 -647
- package/dist/supervise-Cl0F57m9.js.map +1 -0
- package/dist/{supervision-discovery-CewADdEs.js → supervision-discovery-C3t0Xw-T.js} +5 -158
- package/dist/supervision-discovery-C3t0Xw-T.js.map +1 -0
- package/dist/{supervisor-hHU3ZJnR.js → supervisor-L7u3pQ1j.js} +99 -150
- package/dist/supervisor-L7u3pQ1j.js.map +1 -0
- package/dist/task-queue-DbpZAp6C.js +49 -0
- package/dist/task-queue-DbpZAp6C.js.map +1 -0
- package/dist/task-queue.js +1 -49
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +13 -13
- package/dist/top-web-CkXPPXjI.js +1114 -0
- package/dist/top-web-CkXPPXjI.js.map +1 -0
- package/dist/tui/bin.js +4 -3
- package/dist/tui/bin.js.map +1 -1
- package/dist/tui/index.d.ts +22 -2
- package/dist/tui/index.js +3 -3
- package/dist/{types-DTHxh4X9.d.ts → types-BfnQq-_k.d.ts} +17 -21
- package/dist/{util-ebWMWzY0.js → util-BX20UJ9X.js} +2 -2
- package/dist/{util-ebWMWzY0.js.map → util-BX20UJ9X.js.map} +1 -1
- package/package.json +4 -4
- package/skills/agent-graphs/references/authoring.md +1 -0
- package/dist/coordination-manager-ewBF777W.js.map +0 -1
- package/dist/journal-store-BJPMUydp.js.map +0 -1
- package/dist/supervise-BXw89Ajc.js.map +0 -1
- package/dist/supervision-discovery-CewADdEs.js.map +0 -1
- package/dist/supervisor-hHU3ZJnR.js.map +0 -1
- package/dist/task-queue.js.map +0 -1
- package/dist/top-snapshot-DcV7VG4m.js +0 -520
- package/dist/top-snapshot-DcV7VG4m.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top-web-CkXPPXjI.js","names":[],"sources":["../src/tui/top-transcript.ts","../src/tui/workflow-journal.ts","../src/tui/top-snapshot.ts","../src/tui/top-web.ts"],"sourcesContent":["import { closeSync, openSync, readSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { readCommittedJsonLines } from '../durable/jsonl-file'\nimport type { PursuitNodeProjection } from '../durable/observer-projection'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport type { WorkerView } from './top-snapshot'\n\n/** Read selected history on demand, leaving the live topology snapshot bounded and fast. */\nexport async function transcriptHistory(\n worker: WorkerView,\n runDir?: string,\n node?: PursuitNodeProjection,\n) {\n const rows: ReturnType<typeof transcriptRows> = []\n const identity = node?.identity as { taskDigest?: unknown; profileDigest?: unknown } | undefined\n if (runDir && typeof identity?.taskDigest === 'string' && worker.startedAt) {\n const task = await new FileResultBlobStore(join(runDir, 'blobs')).get(identity.taskDigest)\n if (task !== undefined)\n rows.unshift({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'delegated-input',\n source: `parent ${node?.parentId ?? 'run caller'}; task ${identity.taskDigest}${typeof identity.profileDigest === 'string' ? `; profile ${identity.profileDigest}` : ''}; Runtime FileResultBlobStore`,\n text: typeof task === 'string' ? task : JSON.stringify(task, null, 2),\n },\n })\n }\n if (!worker.eventFile) {\n const native = transcriptRows(worker)\n if (!native.length && worker.startedAt)\n rows.push({\n at: worker.startedAt,\n event: {\n kind: 'notice',\n provenance: 'capture-unavailable',\n text: 'Native conversation was not captured for this agent.',\n source: 'Runtime recorded capture',\n },\n })\n return [...rows, ...native]\n }\n const lines: string[] = []\n for await (const row of readCommittedJsonLines<unknown>(worker.eventFile)) {\n lines.push(JSON.stringify(row))\n if (lines.length > 200) lines.shift()\n }\n return [...rows, ...transcriptRows({ ...worker, liveTail: lines })]\n}\n\n/** Present the recorded tail through sandbox-ui's existing agent-stream contract. */\nexport function transcriptRows(worker: WorkerView) {\n const rows: {\n at: string\n event: {\n kind: string\n text?: string\n provenance?: string\n source?: string\n toolCallId?: string\n toolName?: string\n args?: unknown\n result?: unknown\n }\n }[] = []\n for (const line of worker.liveTail) {\n let value: Record<string, unknown>\n try {\n value = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n const at =\n typeof value.timestamp === 'string'\n ? value.timestamp\n : typeof value.at === 'string'\n ? value.at\n : undefined\n if (!at || !Number.isFinite(Date.parse(at))) continue\n const event = value.event as\n | {\n kind?: string\n text?: string\n toolName?: string\n toolCallId?: string\n args?: unknown\n result?: unknown\n }\n | undefined\n if (event?.kind) {\n const kind =\n (\n {\n text_delta: 'text',\n reasoning_delta: 'reasoning',\n tool_call: 'tool-call',\n tool_result: 'tool-result',\n } as Record<string, string>\n )[event.kind] ?? event.kind\n rows.push({ at, event: { ...event, kind } })\n continue\n }\n const message = value.message as\n | { role?: string; content?: string | Record<string, unknown>[] }\n | undefined\n if (!message) continue\n const parts =\n typeof message.content === 'string'\n ? [{ type: 'text', text: message.content }]\n : (message.content ?? [])\n for (const part of parts) {\n if (part.type === 'text' && typeof part.text === 'string')\n rows.push({\n at,\n event: { kind: message.role === 'user' ? 'user' : 'text', text: part.text },\n })\n else if (part.type === 'thinking' && typeof part.thinking === 'string')\n rows.push({ at, event: { kind: 'reasoning', text: part.thinking } })\n else if (part.type === 'tool_use')\n rows.push({\n at,\n event: {\n kind: 'tool-call',\n toolCallId: String(part.id),\n toolName: String(part.name),\n args: part.input,\n },\n })\n else if (part.type === 'tool_result')\n rows.push({\n at,\n event: {\n kind: 'tool-result',\n toolCallId: String(part.tool_use_id),\n result: part.content,\n },\n })\n }\n }\n return rows\n}\n\n/** The bounded native/normalized tail shared by snapshot adapters and selected streams. */\nexport function readTranscriptTail(file: string) {\n const fd = openSync(file, 'r')\n try {\n const size = statSync(file).size\n const buffer = Buffer.alloc(Math.min(size, 65_536))\n readSync(fd, buffer, 0, buffer.length, Math.max(0, size - buffer.length))\n const lines = buffer.toString().split('\\n')\n lines.pop() // An uncommitted final row is not an event.\n if (size > buffer.length) lines.shift()\n return lines.filter(Boolean).slice(-200)\n } finally {\n closeSync(fd)\n }\n}\n\nexport function transcriptTail(worker: WorkerView) {\n return transcriptRows(\n worker.eventFile ? { ...worker, liveTail: readTranscriptTail(worker.eventFile) } : worker,\n )\n}\n","import { closeSync, openSync, readSync, statSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport { parseCommittedJsonLines } from '../durable/jsonl-file'\nimport type { TopJournalEvent } from './top-snapshot'\nimport { readTranscriptTail } from './top-transcript'\n\n/** Native workflows have no Runtime accounting. Translate recorded lifecycle only. */\nexport function workflowJournal(runDir: string, text: string) {\n const rows = parseCommittedJsonLines<Record<string, unknown>>(text, 'journal.jsonl')\n const events: TopJournalEvent[] = []\n const tails = new Map<string, { file: string; lines: string[] }>()\n let first: string | undefined\n let last: string | undefined\n for (const row of rows) {\n if (typeof row.agentId !== 'string' || !/^[\\w-]+$/.test(row.agentId)) continue\n const id = row.agentId\n if (row.type === 'started') {\n const file = join(runDir, `agent-${id}.jsonl`)\n let start: string | undefined\n let end: string | undefined\n try {\n const fd = openSync(file, 'r')\n try {\n const size = statSync(file).size\n const prefix = Buffer.alloc(Math.min(size, 16_384))\n readSync(fd, prefix, 0, prefix.length, 0)\n start = /\"timestamp\":\"([^\"]+)\"/.exec(prefix.toString())?.[1]\n const lines = readTranscriptTail(file).slice(-8)\n const times = [...lines.join('\\n').matchAll(/\"timestamp\":\"([^\"]+)\"/g)]\n end = times.at(-1)?.[1]\n tails.set(id, { file, lines })\n } finally {\n closeSync(fd)\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (start && (!first || start < first)) first = start\n if (end && (!last || end > last)) last = end\n events.push({\n kind: 'spawned',\n id,\n label: typeof row.label === 'string' ? row.label : id,\n runtime: 'claude-code',\n ...(start ? { at: start } : {}),\n })\n events.push({ kind: 'metered', id, spend: { usdKnown: false, tokensKnown: false } })\n } else if (row.type === 'result' || row.type === 'error' || row.type === 'cancelled') {\n const line = tails.get(id)?.lines.at(-1)\n const at = line ? /\"timestamp\":\"([^\"]+)\"/.exec(line)?.[1] : undefined\n events.push(\n row.type === 'cancelled'\n ? { kind: 'cancelled', id, ...(at ? { at } : {}) }\n : {\n kind: 'settled',\n id,\n status: row.type === 'error' ? 'down' : 'done',\n ...(at ? { at } : {}),\n spent: { usdKnown: false, tokensKnown: false },\n },\n )\n }\n }\n return { id: basename(runDir), events, tails, first, last }\n}\n","/**\n * Read-only operator snapshots over the writer-owned supervisor layout and explicit durable runs.\n * Workspace reads preserve legacy files; durable reads use discovery, journals and the canonical\n * pursuit projection for model identity, failure and accounting evidence. Run totals count once.\n * ANSI presentation lives in `./top-frame`.\n *\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport { FileObserverJournal } from '../durable/observer-journal'\nimport {\n type PursuitProjection,\n type PursuitRunProjection,\n projectPursuit,\n} from '../durable/observer-projection'\nimport { FileSpawnJournal } from '../durable/spawn-journal/journal-store'\nimport { spawnJournalRecordEvents } from '../durable/spawn-journal/record-events'\nimport { discoverDurableSupervisionRun } from '../durable/supervision-discovery'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n supervisorWorkersDir,\n} from '../runtime/supervise/run-layout'\nimport type { Budget, Spend, SpendChannel } from '../runtime/supervise/types'\nimport { workflowJournal } from './workflow-journal'\n\nexport interface TopSnapshot {\n readonly root: string\n readonly generatedAt: number\n readonly supervisors: SupervisorView[]\n /** Canonical facts, including unknown accounting and requested/observed identities. */\n readonly pursuit?: PursuitProjection\n /** `partial` when at least one discovered source could not be read completely. */\n readonly completeness: TopSnapshotCompleteness\n /** One bounded entry per skipped or partially read source; empty when complete. */\n readonly diagnostics: ReadonlyArray<TopSnapshotDiagnostic>\n /** Run directories found under the runs roots, readable or not. */\n readonly discovered: number\n /** Run directories projected into a valid supervisor view. */\n readonly loaded: number\n}\n\nexport type TopSnapshotCompleteness = 'complete' | 'partial'\n\nexport type TopSnapshotDiagnosticSource =\n | 'observer-journal'\n | 'supervisor-state'\n | 'journal'\n | 'progress'\n | 'worker-tail'\n\nexport type TopSnapshotDiagnosticReason =\n | 'unreadable'\n | 'partial-json'\n | 'invalid-state'\n | 'missing'\n\n/**\n * One skipped or partially read snapshot source. `path` is relative to the run directory and\n * never carries file contents, so a diagnostic is safe to show or log without leaking run data.\n */\nexport interface TopSnapshotDiagnostic extends SourceDiagnostic {\n readonly runId?: string\n}\n\ninterface SupervisorBase {\n readonly id: string\n readonly status: string\n readonly task: string\n readonly workspaceDir: string\n readonly budget: number\n readonly budgetKnown?: boolean\n readonly verifyCmd?: string\n readonly workerModel?: string\n readonly driverModel?: string\n readonly verdict?: string\n readonly progress?: string\n readonly startedAt?: string\n readonly completedAt?: string\n readonly maxSandboxes?: number\n readonly maxLifetimeSeconds?: number\n readonly idleTimeoutSeconds?: number\n readonly maxUsd?: number\n readonly maxDepth?: number\n}\n\nexport interface SupervisorView extends SupervisorBase {\n readonly stateDir: string\n readonly resultSpentUsd?: number\n readonly resultSpentTokens?: number\n readonly workers: WorkerView[]\n readonly progressTail: string[]\n readonly journalTail: TopJournalEvent[]\n readonly driverSpend: SpendStats\n readonly totals: SupervisorTotals\n}\n\nexport interface WorkerView {\n readonly id: string\n readonly label: string\n readonly eventFile?: string\n readonly parent?: string\n readonly runtime?: string\n readonly status: 'running' | 'done' | 'down' | 'cancelled'\n readonly verdict?: string\n readonly infra?: boolean\n readonly startedAt?: string\n readonly endedAt?: string\n readonly latencyMs: number\n readonly budget?: BudgetStats\n readonly spend: SpendStats\n readonly metered: SpendStats\n readonly liveTail: string[]\n readonly outRef?: string\n readonly reason?: string\n}\n\nexport interface SupervisorTotals\n extends Pick<SpendStats, 'tokensInput' | 'tokensOutput' | 'usd' | 'usdKnown' | 'tokensKnown'> {\n readonly workers: number\n readonly running: number\n readonly done: number\n readonly down: number\n readonly cancelled: number\n readonly inFlight: number\n readonly settled: number\n readonly tokensTotal: number\n readonly latencyMs: number\n readonly workerLatency: Distribution\n}\n\nexport interface Distribution {\n readonly n: number\n readonly min: number\n readonly median: number\n readonly p90: number\n readonly max: number\n}\n\nexport type BudgetStats = Partial<Pick<Budget, 'maxIterations' | 'maxTokens' | 'maxUsd'>>\n\nexport interface SpendStats\n extends Readonly<Pick<Spend, 'iterations' | 'usd' | 'ms' | 'usdKnown' | 'tokensKnown'>> {\n readonly tokensInput: number\n readonly tokensOutput: number\n}\n\nexport type TopJournalEvent = {\n readonly id: string\n readonly seq?: number\n readonly at?: string\n} & (\n | {\n readonly kind: 'spawned'\n readonly parent?: string\n readonly label?: string\n readonly budget?: unknown\n readonly runtime?: string\n }\n | {\n readonly kind: 'settled'\n readonly status?: string\n readonly outRef?: string\n readonly verdict?: unknown\n readonly spent?: unknown\n readonly infra?: boolean\n }\n | {\n readonly kind: 'cancelled'\n readonly spent?: unknown\n readonly reason?: string\n }\n | {\n readonly kind: 'metered'\n readonly spend?: unknown\n readonly accountingOnly?: boolean\n }\n | {\n readonly kind: 'progress'\n readonly spend?: unknown\n }\n)\n\ninterface SupervisorState extends SupervisorBase {\n readonly result?: {\n readonly spentUsd?: number\n readonly spentTokens?: number\n }\n}\n\ntype MutableWorker = {\n -readonly [Key in keyof Omit<WorkerView, 'latencyMs'>]: WorkerView[Key]\n}\n\ninterface WorkerEventTail {\n readonly file: string\n readonly lines: string[]\n}\n\n/** A diagnostic before its run id is attached; `loadTopSnapshot` adds `runId`. */\ninterface SourceDiagnostic {\n readonly source: TopSnapshotDiagnosticSource\n readonly path: string\n readonly reason: TopSnapshotDiagnosticReason\n}\n\n/**\n * What one snapshot source read produced: the value it could recover, and the bounded diagnostics\n * the read raised. Every reader returns this one shape, so the loader folds them identically.\n */\ninterface SourceRead<T> {\n readonly value: T\n readonly diagnostics: readonly SourceDiagnostic[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\n\n/**\n * Read every supervisor run under one workspace into a single point-in-time snapshot.\n *\n * Pure with respect to the process: it only reads, and it never throws for a writer mid-append.\n * An unreadable or half-written source is still skipped — an operator view must survive a live\n * writer — but every skip is reported as one bounded `TopSnapshotDiagnostic`, so a client can\n * tell a removed run from a partial read. `now` is injectable so elapsed time is deterministic\n * under test.\n */\nexport function loadTopSnapshot(rootDir: string, now?: number): TopSnapshot\nexport function loadTopSnapshot(\n rootDir: string,\n options: { runDir: string; now?: number; format?: 'workflow' | 'journal' },\n): Promise<TopSnapshot>\nexport function loadTopSnapshot(\n rootDir: string,\n input: number | { runDir: string; now?: number; format?: 'workflow' | 'journal' } = Date.now(),\n): TopSnapshot | Promise<TopSnapshot> {\n if (typeof input !== 'number' && input.format === 'journal')\n return loadJournalTopSnapshot(rootDir, input.runDir, input.now ?? Date.now())\n if (typeof input !== 'number' && input.format === 'workflow') {\n const root = resolve(rootDir),\n dir = resolve(input.runDir),\n now = input.now ?? Date.now()\n const read = readSourceFile(join(dir, 'journal.jsonl'), 'journal', 'journal.jsonl')\n if (read.value === undefined)\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n read.diagnostics.length\n ? [...read.diagnostics]\n : [{ source: 'journal', path: 'journal.jsonl', reason: 'missing' }],\n ),\n )\n try {\n const journal = workflowJournal(dir, read.value)\n const supervisor = buildSupervisorView(\n {\n id: journal.id,\n task: journal.id,\n status: 'unobserved',\n workspaceDir: root,\n budget: 0,\n budgetKnown: false,\n ...(journal.first ? { startedAt: journal.first } : {}),\n },\n dir,\n journal.events,\n [],\n now,\n journal.tails,\n )\n return Promise.resolve(\n topSnapshot(root, now, [\n {\n ...supervisor,\n driverSpend: { ...supervisor.driverSpend, usdKnown: false, tokensKnown: false },\n totals: { ...supervisor.totals, usdKnown: false, tokensKnown: false },\n },\n ]),\n )\n } catch {\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n [{ source: 'journal', path: 'journal.jsonl', reason: 'invalid-state' }],\n ),\n )\n }\n }\n if (typeof input !== 'number')\n return loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now())\n const now = input\n const root = resolve(rootDir)\n const supervisors: SupervisorView[] = []\n const diagnostics: TopSnapshotDiagnostic[] = []\n let discovered = 0\n const report = (runId: string, sources: readonly SourceDiagnostic[]): void => {\n for (const source of sources) diagnostics.push({ ...source, runId })\n }\n // `.loops` is the pre-rename state dir; runs already on disk there stay visible.\n for (const runsRoot of [supervisorRunsRoot(root), legacySupervisorRunsRoot(root)]) {\n if (!existsSync(runsRoot)) continue\n for (const entry of readdirSync(runsRoot)) {\n const dir = join(runsRoot, entry)\n if (!isDirectory(dir)) continue\n discovered += 1\n const state = readSupervisorState(dir)\n report(entry, state.diagnostics)\n if (!state.value) continue\n const journal = readJournal(dir)\n const progress = readSourceFile(join(dir, 'progress.ndjson'), 'progress', 'progress.ndjson')\n const workerEvents = readWorkerEventTails(supervisorWorkersDir(dir), 8)\n report(entry, [...journal.diagnostics, ...progress.diagnostics, ...workerEvents.diagnostics])\n supervisors.push(\n buildSupervisorView(\n state.value,\n dir,\n journal.value,\n tailLines(progress.value, 8),\n now,\n workerEvents.value,\n ),\n )\n }\n }\n supervisors.sort((a, b) => String(b.startedAt ?? '').localeCompare(String(a.startedAt ?? '')))\n return topSnapshot(root, now, supervisors, diagnostics, discovered)\n}\n\nfunction topSnapshot(\n root: string,\n now: number,\n supervisors: SupervisorView[],\n diagnostics: TopSnapshotDiagnostic[] = [],\n discovered = 1,\n pursuit?: PursuitProjection,\n): TopSnapshot {\n return {\n root,\n generatedAt: now,\n supervisors,\n completeness: diagnostics.length ? 'partial' : 'complete',\n diagnostics,\n discovered,\n loaded: supervisors.length,\n ...(pursuit ? { pursuit } : {}),\n }\n}\n\nasync function loadDurableTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir)\n let pursuit: PursuitProjection | undefined\n let source: TopSnapshotDiagnosticSource = 'observer-journal'\n let path = 'observer.jsonl'\n try {\n if (typeof runDir !== 'string' || !runDir.trim())\n throw new TypeError('runDir must be non-empty')\n const journal = await FileObserverJournal.open(join(resolve(runDir), path))\n if (!journal) return topSnapshot(root, now, [], [{ source, path, reason: 'missing' }])\n pursuit = projectPursuit(await journal.read())\n source = 'journal'\n path = '.'\n const discovery = await discoverDurableSupervisionRun(runDir)\n // An actual run id stays the row identity; the canonical projection retains every attempt.\n const latest = new Map(pursuit.runs.map((run) => [run.runId, run]))\n path = 'spawn-journal.jsonl'\n const spawnJournal = new FileSpawnJournal(discovery.spawnJournalPath)\n const supervisors = await Promise.all(\n [...latest.values()].map(async (run) => {\n // SupervisorOpts.runId is the journal root key; require its recorded discovery binding.\n const binding = discovery.roots.find((id) => id === run.runId)\n // A retained run journals admissions only and writes no spawn journal to bind.\n if (!binding && existsSync(discovery.spawnJournalPath))\n throw new Error('observer run has no discovered spawn root')\n const events = binding ? ((await spawnJournal.loadTree(binding)) ?? []) : []\n const rootSpawn = events.find((event) => event.kind === 'spawned' && event.id === binding)\n const budget = rootSpawn?.kind === 'spawned' ? rootSpawn.budget?.maxTokens : undefined\n return buildSupervisorView(\n {\n id: run.runId,\n status: run.status,\n task: run.runId,\n workspaceDir: root,\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n startedAt: new Date(run.firstObservedAt).toISOString(),\n ...(run.settledAt === undefined\n ? {}\n : { completedAt: new Date(run.settledAt).toISOString() }),\n },\n discovery.runDir,\n events.filter(isSpawnEvent),\n run.error ? [run.error] : [],\n now,\n undefined,\n run,\n )\n }),\n )\n return topSnapshot(root, now, supervisors, [], 1, pursuit)\n } catch (error) {\n const reason =\n isRecord(error) && typeof error.code === 'string' ? 'unreadable' : 'invalid-state'\n return topSnapshot(root, now, [], [{ source, path, reason }], 1, pursuit)\n }\n}\n\n/** Old Discovery and factory roots may predate observer.jsonl; absence never establishes known totals. */\nasync function loadJournalTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir),\n dir = resolve(runDir)\n try {\n const discovery = await discoverDurableSupervisionRun(dir)\n const journal = new FileSpawnJournal(discovery.spawnJournalPath)\n const supervisors = await Promise.all(\n discovery.roots.map(async (id, i) => {\n const events = (await journal.loadTree(id)) ?? []\n const terminal = events\n .filter(\n (event) => event.id === id && (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n .at(-1)\n const first = events.find((event) => event.kind === 'spawned' && event.id === id)\n const budget = first?.kind === 'spawned' ? first.budget?.maxTokens : undefined\n const tails = readWorkerEventTails(supervisorWorkersDir(dir), 8)\n const view = buildSupervisorView(\n {\n id,\n task: id,\n workspaceDir: root,\n status:\n terminal?.kind === 'settled'\n ? terminal.status\n : terminal?.kind === 'cancelled'\n ? 'cancelled'\n : 'running',\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n ...(discovery.rootsBegunAt[i] ? { startedAt: discovery.rootsBegunAt[i]! } : {}),\n ...(terminal?.at ? { completedAt: terminal.at } : {}),\n },\n dir,\n events.filter(isSpawnEvent),\n [],\n now,\n tails.value,\n )\n return { ...view, totals: { ...view.totals, usdKnown: false, tokensKnown: false } }\n }),\n )\n return topSnapshot(\n root,\n now,\n supervisors,\n [{ source: 'observer-journal', path: 'observer.jsonl', reason: 'missing' }],\n discovery.roots.length,\n )\n } catch {\n return topSnapshot(\n root,\n now,\n [],\n [{ source: 'journal', path: 'spawn-journal.jsonl', reason: 'invalid-state' }],\n )\n }\n}\n\nfunction observerSpend(spend: Spend | undefined, gaps: readonly SpendChannel[] = []): SpendStats {\n const parsed = parseSpend(spend)\n return {\n ...parsed,\n usdKnown: spend !== undefined && parsed.usdKnown !== false && !gaps.includes('usd'),\n tokensKnown: spend !== undefined && parsed.tokensKnown !== false && !gaps.includes('tokens'),\n }\n}\n\n/**\n * The journal file a run dir actually carries. `createFileRunContext` — this repo's own durable\n * writer — names it `spawn-journal.jsonl`; `journal.jsonl` is the retired bare-event file older\n * runs left behind. First existing name wins; a reader that knew only the retired name would show\n * zero workers for every current run.\n */\nconst journalFileNames = ['spawn-journal.jsonl', 'journal.jsonl'] as const\n\nfunction readJournal(eventDir: string): SourceRead<TopJournalEvent[]> {\n const path = journalFileNames.find((candidate) => existsSync(join(eventDir, candidate)))\n if (!path) return { value: [], diagnostics: [] }\n const read = readSourceFile(join(eventDir, path), 'journal', path)\n if (read.value === undefined) return { value: [], diagnostics: read.diagnostics }\n const out: TopJournalEvent[] = []\n let partial = false\n for (const line of read.value.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>\n const events =\n parsed.kind === 'event' || parsed.kind === 'events'\n ? spawnJournalRecordEvents(parsed)\n : [parsed]\n for (const event of events) if (isSpawnEvent(event)) out.push(event)\n } catch {\n // A corrupt line is expected while the writer is mid-append; keep the lines that parsed.\n partial = true\n }\n }\n return {\n value: out,\n diagnostics: partial ? [{ source: 'journal', path, reason: 'partial-json' }] : [],\n }\n}\n\nfunction buildSupervisorView(\n state: SupervisorState,\n stateDir: string,\n events: readonly TopJournalEvent[],\n progressTail: readonly string[],\n now: number,\n workerEventTails = new Map<string, WorkerEventTail>(),\n accounting?: PursuitRunProjection,\n): SupervisorView {\n const workers = new Map<string, MutableWorker>()\n let driverSpend = emptySpend\n // State and journal have different producers and root ids. Exclude both, or the journal's\n // root becomes a phantom running worker that captures steer and cancel operations.\n const journalRootId = events.find(\n (event) => event.kind === 'spawned' && !event.parent && event.label === 'root',\n )?.id\n const isRoot = (id: string): boolean => id === state.id || id === journalRootId\n\n for (const event of events) {\n if (isRoot(event.id) || (event.kind === 'spawned' && !event.parent && event.label === 'root')) {\n if (event.kind === 'metered' && event.accountingOnly !== true) {\n driverSpend = addSpend(driverSpend, parseSpend(event.spend))\n }\n continue\n }\n const worker = ensureWorker(workers, event.id)\n if (event.kind === 'spawned') {\n worker.label = event.label ?? worker.label\n if (event.parent) worker.parent = event.parent\n if (event.runtime) worker.runtime = event.runtime\n worker.status = 'running'\n if (event.at) worker.startedAt = event.at\n const budget = parseBudget(event.budget)\n if (budget) worker.budget = budget\n } else if (event.kind === 'settled' || event.kind === 'cancelled') {\n if (event.at) worker.endedAt = event.at\n if (event.kind === 'settled') {\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.outRef) worker.outRef = event.outRef\n if (event.infra !== undefined) worker.infra = event.infra\n const verdict = describeVerdict(event.verdict)\n if (verdict) worker.verdict = verdict\n } else {\n worker.status = 'cancelled'\n if (event.reason) worker.reason = event.reason\n }\n if (event.kind === 'settled' || event.spent !== undefined) {\n worker.spend = addSpend(worker.spend, parseSpend(event.spent))\n // Live progress is cumulative; terminal spend replaces it rather than counting it twice.\n worker.metered = emptySpend\n }\n } else if (event.kind === 'progress') {\n worker.metered = parseSpend(event.spend)\n } else if (event.accountingOnly !== true) {\n worker.metered = addSpend(worker.metered, parseSpend(event.spend))\n }\n }\n\n if (accounting) {\n driverSpend = observerSpend(accounting.totals.exclusiveByNode[accounting.runId])\n for (const worker of workers.values()) {\n worker.spend = observerSpend(\n accounting.totals.exclusiveByNode[worker.id],\n accounting.spendGaps?.find((gap) => gap.id === worker.id)?.channels,\n )\n worker.metered = emptySpend\n }\n }\n const workerViews = [...workers.values()]\n .map((worker) => {\n // Tails are keyed by file stem, which the writer put through `safeWorkerFile`; a label\n // carrying characters that stem strips would otherwise never find its own events.\n const tail =\n workerEventTails.get(worker.label) ??\n workerEventTails.get(safeWorkerFile(worker.label)) ??\n workerEventTails.get(safeWorkerFile(worker.id)) ??\n workerEventTails.get(worker.id)\n worker.liveTail = tail?.lines ?? []\n if (tail?.file) worker.eventFile = tail.file\n return finalizeWorker(worker, now)\n })\n .sort((a, b) => compareWorker(a, b))\n\n const totals = supervisorTotals(state, workerViews, driverSpend, now)\n if (accounting) {\n const spend = observerSpend(\n accounting.totals.inclusive,\n accounting.spendGaps?.flatMap((gap) => gap.channels),\n )\n Object.assign(totals, spend, { tokensTotal: spend.tokensInput + spend.tokensOutput })\n }\n return {\n id: state.id,\n stateDir,\n status: state.status,\n task: state.task,\n workspaceDir: state.workspaceDir,\n budget: state.budget,\n ...(state.budgetKnown === undefined ? {} : { budgetKnown: state.budgetKnown }),\n ...selectFields(\n state,\n [\n 'verifyCmd',\n 'workerModel',\n 'driverModel',\n 'verdict',\n 'progress',\n 'startedAt',\n 'completedAt',\n ],\n Boolean,\n ),\n ...selectFields(\n state,\n ['maxSandboxes', 'maxLifetimeSeconds', 'idleTimeoutSeconds', 'maxUsd', 'maxDepth'],\n (value) => value !== undefined,\n ),\n ...(state.result?.spentUsd !== undefined ? { resultSpentUsd: state.result.spentUsd } : {}),\n ...(state.result?.spentTokens !== undefined\n ? { resultSpentTokens: state.result.spentTokens }\n : {}),\n workers: workerViews,\n progressTail: [...progressTail],\n journalTail: events.slice(-12),\n driverSpend,\n totals,\n }\n}\n\nfunction selectFields<T, K extends keyof T>(\n value: T,\n keys: readonly K[],\n include: (value: T[K]) => boolean,\n): Partial<Pick<T, K>> {\n const selected: Partial<Pick<T, K>> = {}\n for (const key of keys) if (include(value[key])) selected[key] = value[key]\n return selected\n}\n\nfunction ensureWorker(workers: Map<string, MutableWorker>, id: string): MutableWorker {\n const existing = workers.get(id)\n if (existing) return existing\n const created: MutableWorker = {\n id,\n label: id,\n status: 'running',\n spend: emptySpend,\n metered: emptySpend,\n liveTail: [],\n }\n workers.set(id, created)\n return created\n}\n\nfunction finalizeWorker(worker: MutableWorker, now: number): WorkerView {\n const startMs = parseTime(worker.startedAt)\n const endMs = parseTime(worker.endedAt) ?? (worker.status === 'running' ? now : startMs)\n const latencyMs = startMs !== undefined && endMs !== undefined ? Math.max(0, endMs - startMs) : 0\n return { ...worker, latencyMs }\n}\n\nfunction supervisorTotals(\n state: SupervisorState,\n workers: readonly WorkerView[],\n driverSpend: SpendStats,\n now: number,\n): SupervisorTotals {\n const spend = workers.map(totalSpend).reduce(addSpend, driverSpend)\n const counts = { running: 0, done: 0, down: 0, cancelled: 0 }\n for (const worker of workers) counts[worker.status] += 1\n const started = parseTime(state.startedAt)\n const completed = parseTime(state.completedAt)\n const latencyMs = started !== undefined ? Math.max(0, (completed ?? now) - started) : 0\n const latencies = workers.map((worker) => worker.latencyMs).filter((ms) => ms > 0)\n return {\n workers: workers.length,\n ...counts,\n ...(spend.usdKnown === false ? { usdKnown: false } : {}),\n ...(spend.tokensKnown === false ? { tokensKnown: false } : {}),\n inFlight: counts.running,\n settled: workers.length - counts.running,\n tokensInput: spend.tokensInput,\n tokensOutput: spend.tokensOutput,\n tokensTotal: spend.tokensInput + spend.tokensOutput,\n usd: spend.usd > 0 ? spend.usd : (state.result?.spentUsd ?? 0),\n latencyMs,\n workerLatency: distribution(latencies),\n }\n}\n\nexport function aggregateSnapshot(snapshot: TopSnapshot) {\n const complete = snapshot.completeness === 'complete'\n return {\n usdKnown: complete && snapshot.supervisors.every((row) => row.totals.usdKnown !== false),\n tokensKnown: complete && snapshot.supervisors.every((row) => row.totals.tokensKnown !== false),\n supervisors: snapshot.supervisors.length,\n workers: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.workers)),\n running: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.running)),\n done: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.done)),\n down: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.down)),\n usd: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.usd)),\n tokensInput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensInput)),\n tokensOutput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensOutput)),\n }\n}\n\nfunction compareWorker(a: WorkerView, b: WorkerView): number {\n const aStart = parseTime(a.startedAt) ?? 0\n const bStart = parseTime(b.startedAt) ?? 0\n if (a.status === 'running' && b.status !== 'running') return -1\n if (b.status === 'running' && a.status !== 'running') return 1\n return aStart - bStart || a.label.localeCompare(b.label)\n}\n\nexport function totalSpend(worker: WorkerView): SpendStats {\n return addSpend(worker.spend, worker.metered)\n}\n\nfunction addSpend(a: SpendStats, b: SpendStats): SpendStats {\n return {\n iterations: a.iterations + b.iterations,\n tokensInput: a.tokensInput + b.tokensInput,\n tokensOutput: a.tokensOutput + b.tokensOutput,\n usd: a.usd + b.usd,\n ms: a.ms + b.ms,\n ...(a.usdKnown === false || b.usdKnown === false ? { usdKnown: false } : {}),\n ...(a.tokensKnown === false || b.tokensKnown === false ? { tokensKnown: false } : {}),\n }\n}\n\nexport function parseSpend(value: unknown): SpendStats {\n if (!isRecord(value)) return emptySpend\n const tokens = isRecord(value.tokens) ? value.tokens : {}\n return {\n ...(value.usdKnown === false ? { usdKnown: false } : {}),\n ...(value.tokensKnown === false || tokens.tokensKnown === false ? { tokensKnown: false } : {}),\n iterations: numberValue(value.iterations),\n tokensInput: numberValue(tokens.input),\n tokensOutput: numberValue(tokens.output),\n usd: numberValue(value.usd),\n ms: numberValue(value.ms),\n }\n}\n\nfunction parseBudget(value: unknown): BudgetStats | undefined {\n if (!isRecord(value)) return undefined\n const budget: BudgetStats = {\n ...(typeof value.maxIterations === 'number' ? { maxIterations: value.maxIterations } : {}),\n ...(typeof value.maxTokens === 'number' ? { maxTokens: value.maxTokens } : {}),\n ...(typeof value.maxUsd === 'number' ? { maxUsd: value.maxUsd } : {}),\n }\n return Object.keys(budget).length ? budget : undefined\n}\n\nfunction describeVerdict(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined\n if (typeof value.valid === 'boolean') return value.valid ? 'valid' : 'invalid'\n if (typeof value.score === 'number') return `score ${value.score.toFixed(2)}`\n return undefined\n}\n\nfunction distribution(values: readonly number[]): Distribution {\n const sorted = [...values].sort((a, b) => a - b)\n return {\n n: sorted.length,\n min: sorted[0] ?? 0,\n median: percentile(sorted, 0.5),\n p90: percentile(sorted, 0.9),\n max: sorted[sorted.length - 1] ?? 0,\n }\n}\n\nfunction percentile(sorted: readonly number[], p: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * p) - 1))\n return sorted[idx] ?? 0\n}\n\n/**\n * Read one source file under a run directory. An absent file is not a defect on its own — the\n * writer may not have reached it yet — so it reads as `undefined` with no diagnostic; only a\n * failed read raises one. `path` stays run-relative and never carries file contents.\n */\nfunction readSourceFile(\n file: string,\n source: TopSnapshotDiagnosticSource,\n path: string,\n): SourceRead<string | undefined> {\n if (!existsSync(file)) return { value: undefined, diagnostics: [] }\n try {\n return { value: readFileSync(file, 'utf8'), diagnostics: [] }\n } catch {\n return { value: undefined, diagnostics: [{ source, path, reason: 'unreadable' }] }\n }\n}\n\nfunction tailLines(raw: string | undefined, maxLines: number): string[] {\n if (raw === undefined) return []\n return raw.trim().split('\\n').filter(Boolean).slice(-maxLines)\n}\n\nfunction readWorkerEventTails(\n dir: string,\n maxLines: number,\n): SourceRead<Map<string, WorkerEventTail>> {\n const out = new Map<string, WorkerEventTail>()\n if (!existsSync(dir)) return { value: out, diagnostics: [] }\n const workersDir = basename(dir)\n let entries: string[]\n try {\n entries = readdirSync(dir)\n } catch {\n return {\n value: out,\n diagnostics: [{ source: 'worker-tail', path: workersDir, reason: 'unreadable' }],\n }\n }\n const diagnostics: SourceDiagnostic[] = []\n for (const entry of entries) {\n // `<label>.inbox.ndjson` is the down-leg steer queue, not this worker's control-event log.\n if (!entry.endsWith('.ndjson') || entry.endsWith('.inbox.ndjson')) continue\n const file = join(dir, entry)\n const read = readSourceFile(file, 'worker-tail', join(workersDir, entry))\n diagnostics.push(...read.diagnostics)\n const lines = tailLines(read.value, maxLines)\n out.set(entry.slice(0, -'.ndjson'.length), { file, lines })\n }\n return { value: out, diagnostics }\n}\n\nfunction readSupervisorState(dir: string): SourceRead<SupervisorState | undefined> {\n const path = 'state.json'\n const read = readSourceFile(join(dir, path), 'supervisor-state', path)\n if (read.diagnostics.length > 0) return { value: undefined, diagnostics: read.diagnostics }\n const failed = (reason: TopSnapshotDiagnosticReason): SourceRead<undefined> => ({\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason }],\n })\n if (read.value === undefined) return failed('missing')\n try {\n const parsed: unknown = JSON.parse(read.value)\n return isSupervisorState(parsed) ? { value: parsed, diagnostics: [] } : failed('invalid-state')\n } catch {\n return failed('partial-json')\n }\n}\n\nfunction isSupervisorState(value: unknown): value is SupervisorState {\n return (\n isRecord(value) &&\n Object.entries({\n id: 'string',\n status: 'string',\n task: 'string',\n workspaceDir: 'string',\n budget: 'number',\n }).every(([key, type]) => typeof value[key] === type)\n )\n}\n\nfunction isSpawnEvent<T>(value: T): value is T & TopJournalEvent {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n typeof value.kind === 'string' &&\n ['spawned', 'settled', 'cancelled', 'metered', 'progress'].includes(value.kind)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n\nexport function numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nexport function parseTime(value: string | undefined): number | undefined {\n if (!value) return undefined\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nfunction sum(values: readonly number[]): number {\n return values.reduce((total, value) => total + value, 0)\n}\n","import { createHash } from 'node:crypto'\nimport { existsSync, type FSWatcher, readdirSync, watch } from 'node:fs'\nimport { readFile, realpath, stat } from 'node:fs/promises'\nimport { createServer, type ServerResponse } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { dirname, extname, resolve, sep } from 'node:path'\nimport { loadTopSnapshot, type TopSnapshot, type WorkerView } from './top-snapshot'\nimport { transcriptHistory, type transcriptRows, transcriptTail } from './top-transcript'\n\n/** A reconnect always receives current truth; deltas replace changed roots atomically. */\nexport interface TopSnapshotFrame {\n readonly sequence: number\n readonly observedAt: number\n readonly reset: boolean\n readonly snapshots: readonly TopSnapshot[]\n}\n\nexport interface TopWebOptions {\n readonly roots: readonly string[]\n /** Defaults to the installed agent-record browser asset export. */\n readonly assets?: string\n readonly host?: string\n readonly port?: number\n}\n\n/** Read-only web transport over the same snapshots as the terminal. No execution or writes. */\nexport async function serveTopWeb(options: TopWebOptions) {\n if (!options.roots.length) throw new Error('At least one --root is required')\n const roots = [...new Set(await Promise.all(options.roots.map((root) => realpath(root))))]\n const assets = await realpath(\n options.assets ??\n dirname(\n createRequire(import.meta.url).resolve('@drewstone/agent-record/workspace-viewer.js'),\n ),\n )\n for (const file of ['workspace-viewer.js', 'styles.css']) await stat(resolve(assets, file))\n const host = options.host ?? '127.0.0.1'\n const clients = new Set<ServerResponse>()\n const transcripts = new Set<() => void>()\n const snapshots = new Map<string, TopSnapshot>()\n const digests = new Map<string, string>()\n const watchers: FSWatcher[] = []\n let sequence = 0\n let reading = false\n let dirty = true\n let closed = false\n let scheduled: NodeJS.Timeout | undefined\n const send = (client: ServerResponse, frame: TopSnapshotFrame) => {\n if (client.writableLength > 1024 * 1024) return client.destroy()\n client.write(`id: ${frame.sequence}\\nevent: snapshot\\ndata: ${JSON.stringify(frame)}\\n\\n`)\n }\n const refresh = async () => {\n if (reading || closed) return\n reading = true\n dirty = false\n try {\n const changed: TopSnapshot[] = []\n for (const root of roots) {\n const snapshot = existsSync(resolve(root, 'observer.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root })\n : existsSync(resolve(root, 'spawn-journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'journal' })\n : existsSync(resolve(root, 'journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'workflow' })\n : await loadRunsRoot(root)\n const digest = createHash('sha256')\n .update(\n JSON.stringify(snapshot, (key, value) =>\n key === 'generatedAt' || key === 'latencyMs' ? undefined : value,\n ),\n )\n .digest('hex')\n snapshots.set(root, snapshot)\n if (digests.get(root) !== digest) {\n changed.push(snapshot)\n digests.set(root, digest)\n }\n }\n if (changed.length) {\n const frame = {\n sequence: ++sequence,\n observedAt: Date.now(),\n reset: false,\n snapshots: changed,\n }\n for (const client of clients) send(client, frame)\n }\n for (const update of transcripts) update()\n } finally {\n reading = false\n if (dirty && !closed) schedule()\n }\n }\n const schedule = () => {\n dirty = true\n if (!scheduled && !closed)\n scheduled = setTimeout(() => {\n scheduled = undefined\n void refresh().catch((error: unknown) => {\n for (const client of clients)\n client.write(\n `event: unavailable\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`,\n )\n })\n }, 16)\n }\n await refresh()\n for (const root of roots) watchers.push(watch(root, { recursive: true }, schedule))\n // Watch notifications may be coalesced or lost; the same loader reconciles them without a second model.\n const reconcile = setInterval(schedule, 500)\n const heartbeat = setInterval(() => {\n for (const client of clients) client.write(': alive\\n\\n')\n }, 15_000)\n const server = createServer((request, response) => {\n void (async () => {\n const base = `http://${request.headers.host}`\n const incomingHost = new URL(base).hostname.replace(/^\\[|\\]$/g, '')\n if (\n !request.headers.host ||\n ![host, '127.0.0.1', 'localhost', '::1'].includes(incomingHost) ||\n (request.headers.origin && request.headers.origin !== base)\n ) {\n response.writeHead(403).end()\n return\n }\n if (request.method !== 'GET' && request.method !== 'HEAD') {\n response.writeHead(405, { Allow: 'GET, HEAD' }).end()\n return\n }\n const path = new URL(request.url ?? '/', base).pathname\n response.setHeader('Cache-Control', 'no-store')\n response.setHeader('X-Content-Type-Options', 'nosniff')\n if (path === '/api/top/events') {\n if (request.method === 'HEAD') {\n response.writeHead(200, { 'Content-Type': 'text/event-stream' }).end()\n return\n }\n response.writeHead(200, { 'Content-Type': 'text/event-stream', 'X-Accel-Buffering': 'no' })\n response.flushHeaders()\n clients.add(response)\n send(response, {\n sequence,\n observedAt: Date.now(),\n reset: true,\n snapshots: [...snapshots.values()],\n })\n response.on('close', () => clients.delete(response))\n } else if (/^\\/api\\/top\\/agents\\/\\d+\\/[^/]+\\/[^/]+\\/stream$/.test(path)) {\n const [, , , , rootIndex, runId, workerId] = path.split('/').map(decodeURIComponent)\n const root = roots[Number(rootIndex)]\n const worker = (): WorkerView | undefined => {\n const run = root\n ? snapshots.get(root)?.supervisors.find((run) => run.id === runId)\n : undefined\n const node = run?.workers.find((node) => node.id === workerId)\n if (node || !run || run.id !== workerId) return node\n return {\n id: run.id,\n label: 'root',\n ...(root && existsSync(resolve(root, 'root-stream.jsonl'))\n ? { eventFile: resolve(root, 'root-stream.jsonl') }\n : {}),\n status:\n run.status === 'cancelled'\n ? 'cancelled'\n : run.status === 'done'\n ? 'done'\n : run.status === 'down'\n ? 'down'\n : 'running',\n startedAt: run.startedAt,\n endedAt: run.completedAt,\n latencyMs: run.totals.latencyMs,\n spend: run.driverSpend,\n metered: { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 },\n liveTail: run.progressTail,\n }\n }\n if (!worker()) {\n response.writeHead(404).end()\n return\n }\n let history: ReturnType<typeof transcriptRows> | undefined = await transcriptHistory(\n worker()!,\n root,\n snapshots\n .get(root!)\n ?.pursuit?.nodes.find((node) => node.runId === runId && node.id === workerId),\n )\n response.writeHead(200, { 'Content-Type': 'text/event-stream', 'X-Accel-Buffering': 'no' })\n response.flushHeaders()\n if (request.method === 'HEAD') {\n response.end()\n return\n }\n const generation = Date.now()\n response.write(`event: reset\\ndata: ${JSON.stringify({ generation })}\\n\\n`)\n const seen = new Set<string>()\n let lastSeq = 0\n const update = () => {\n const node = worker()\n if (!node || response.writableLength > 1024 * 1024) {\n response.destroy()\n return\n }\n const events = (history ?? transcriptTail(node)).flatMap((row) => {\n const key = createHash('sha256').update(JSON.stringify(row)).digest('hex')\n if (seen.has(key)) return []\n seen.add(key)\n if (seen.size > 2000) seen.delete(seen.values().next().value!)\n return [{ ...row, seq: ++lastSeq }]\n })\n history = undefined\n const alive = node.status === 'running'\n response.write(\n `event: rows\\ndata: ${JSON.stringify({ generation, events, lastSeq, alive, window: 'recorded-tail' })}\\n\\n`,\n )\n if (!alive) {\n response.write('event: end\\ndata: {}\\n\\n')\n response.end()\n }\n }\n transcripts.add(update)\n response.on('close', () => transcripts.delete(update))\n update()\n } else if (path === '/api/top') {\n response.writeHead(200, { 'Content-Type': 'application/json' })\n response.end(\n JSON.stringify({\n sequence,\n observedAt: Date.now(),\n reset: true,\n snapshots: [...snapshots.values()],\n }),\n )\n } else if (path === '/') {\n response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })\n response.end(\n '<!doctype html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Live agents</title><link rel=\"stylesheet\" href=\"/assets/styles.css\"></head><body><div id=\"agent-workspace\" data-mode=\"live\" data-api=\"/api/top\" data-theme=\"dark\"></div><script type=\"module\" src=\"/assets/workspace-viewer.js\"></script></body></html>',\n )\n } else if (path.startsWith('/assets/')) {\n const file = await realpath(resolve(assets, decodeURIComponent(path.slice(8))))\n if (!file.startsWith(assets + sep)) {\n response.writeHead(403).end()\n return\n }\n const kind = { '.js': 'text/javascript', '.css': 'text/css', '.woff2': 'font/woff2' }[\n extname(file)\n ]\n if (!kind) {\n response.writeHead(404).end()\n return\n }\n response.writeHead(200, { 'Content-Type': kind })\n response.end(request.method === 'HEAD' ? undefined : await readFile(file))\n } else response.writeHead(404).end()\n })().catch((error: unknown) => {\n if (!response.headersSent) response.writeHead(500, { 'Content-Type': 'application/json' })\n response.end(JSON.stringify({ error: String(error) }))\n })\n })\n let closing: Promise<void> | undefined\n const close = () =>\n (closing ??= (async () => {\n closed = true\n if (scheduled) clearTimeout(scheduled)\n clearInterval(reconcile)\n clearInterval(heartbeat)\n for (const watcher of watchers) watcher.close()\n for (const client of clients) client.end()\n transcripts.clear()\n server.closeAllConnections()\n await new Promise<void>((done, reject) =>\n server.close((error) =>\n error && (!('code' in error) || error.code !== 'ERR_SERVER_NOT_RUNNING')\n ? reject(error)\n : done(),\n ),\n )\n })())\n try {\n await new Promise<void>((done, reject) => {\n server.once('error', reject)\n server.listen(options.port ?? 0, host, done)\n })\n } catch (error) {\n await close()\n throw error\n }\n const address = server.address()\n if (!address || typeof address === 'string') throw new Error('Web server has no TCP address')\n return { url: `http://${host.includes(':') ? `[${host}]` : host}:${address.port}/`, close }\n}\n\n/** CLI options stay on agent-runtime-top; the renderer is supplied by its installed owner. */\nexport async function runTopWeb(argv: readonly string[]) {\n const values = (flag: string) =>\n argv.flatMap((arg, i) => (arg === flag ? [argv[i + 1] ?? ''] : []))\n const roots = values('--root')\n const port = Number(values('--port')[0] ?? 0)\n if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error('Invalid --port')\n const web = await serveTopWeb({\n roots: roots.length ? roots : [process.cwd()],\n ...(values('--assets')[0] ? { assets: values('--assets')[0] } : {}),\n port,\n ...(values('--host')[0] ? { host: values('--host')[0] } : {}),\n })\n process.stdout.write(`${JSON.stringify({ event: 'ready', url: web.url, pid: process.pid })}\\n`)\n const stop = () => {\n void web.close().catch((error: unknown) => {\n process.stderr.write(`${String(error)}\\n`)\n process.exitCode = 1\n })\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n return web\n}\n\n/** A journal root holds one `<runId>/observer.jsonl` per retained run beside any workspace runs. */\nasync function loadRunsRoot(root: string): Promise<TopSnapshot> {\n const workspace = loadTopSnapshot(root)\n const runIds = readdirSync(root, { withFileTypes: true })\n .filter(\n (entry) => entry.isDirectory() && existsSync(resolve(root, entry.name, 'observer.jsonl')),\n )\n .map((entry) => entry.name)\n if (!runIds.length) return workspace\n const runs = await Promise.all(\n runIds.map((runId) => loadTopSnapshot(root, { runDir: resolve(root, runId) })),\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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"}
|
package/dist/tui/bin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { l as cancelWorker, n as cancelRun, w as writeWorkerSteer, y as supervisorRunsRoot } from "../run-cancellation-
|
|
3
|
-
import { a as
|
|
2
|
+
import { l as cancelWorker, n as cancelRun, w as writeWorkerSteer, y as supervisorRunsRoot } from "../run-cancellation-Cpm-BIUu.js";
|
|
3
|
+
import { a as numberValue, c as totalSpend, i as loadTopSnapshot, o as parseSpend, r as aggregateSnapshot, s as parseTime, t as runTopWeb } from "../top-web-CkXPPXjI.js";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
6
|
import { hostname, userInfo } from "node:os";
|
|
@@ -694,7 +694,8 @@ function wrap(value, size) {
|
|
|
694
694
|
*
|
|
695
695
|
* @experimental
|
|
696
696
|
*/
|
|
697
|
-
|
|
697
|
+
if (process.argv.includes("--web")) await runTopWeb(process.argv.slice(2));
|
|
698
|
+
else runTopApp();
|
|
698
699
|
export {};
|
|
699
700
|
|
|
700
701
|
//# sourceMappingURL=bin.js.map
|
package/dist/tui/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","names":[],"sources":["../../src/tui/top-frame.ts","../../src/tui/top-app.ts","../../src/tui/bin.ts"],"sourcesContent":["import { supervisorRunsRoot } from '../runtime/supervise/run-layout'\nimport {\n aggregateSnapshot,\n numberValue,\n parseSpend,\n parseTime,\n type SpendStats,\n type SupervisorView,\n type TopSnapshot,\n totalSpend,\n type WorkerView,\n} from './top-snapshot'\n\ninterface RenderOptions {\n readonly width?: number\n readonly height?: number\n readonly color?: boolean\n readonly selectedSupervisorId?: string\n readonly selectedWorkerId?: string\n readonly focus?: 'supervisors' | 'workers'\n readonly mode?: 'overview' | 'detail' | 'log'\n readonly notice?: string\n readonly steerInput?: {\n readonly active: boolean\n readonly value: string\n readonly workerLabel?: string\n }\n}\n\nexport interface RenderTarget {\n readonly row: number\n readonly kind: 'supervisor' | 'worker'\n readonly id: string\n readonly supervisorId?: string\n}\n\ninterface RenderedTopFrame {\n readonly frame: string\n readonly targets: RenderTarget[]\n}\n// Width accounting depends on stripping SGR sequences, which begin with a literal ESC. Matching\n// the control character is the point of an ANSI-aware renderer, not an accident.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: SGR sequences begin with ESC\nconst ansiPattern = /\\x1b\\[[0-9;?]*[ -/]*[@-~]/g\n\nconst colors = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n bold: '\\x1b[1m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n inverse: '\\x1b[7m',\n}\n\n/** Render one snapshot to an ANSI frame. Use this when nothing needs to be clickable. */\nexport function renderTopFrame(snapshot: TopSnapshot, options: RenderOptions = {}): string {\n return renderTopFrameWithLayout(snapshot, options).frame\n}\n\n/**\n * Render one snapshot, returning the frame together with the row→entity map a mouse click resolves\n * against. The layout is the only thing that knows which row is which run or worker, so emitting it\n * alongside the text is what keeps click handling out of the renderer.\n */\nexport function renderTopFrameWithLayout(\n snapshot: TopSnapshot,\n options: RenderOptions = {},\n): RenderedTopFrame {\n const width = Math.max(88, options.width ?? 128)\n const height = Math.max(24, options.height ?? 42)\n const color = options.color ?? false\n const focus = options.focus ?? 'supervisors'\n const mode = options.mode ?? 'overview'\n const selectedSupervisor = selectEntity(snapshot.supervisors, options.selectedSupervisorId)\n const selectedWorker = selectedSupervisor\n ? selectEntity(selectedSupervisor.workers, options.selectedWorkerId)\n : undefined\n const targets: RenderTarget[] = []\n const lines: string[] = []\n\n const push = (line = '', target?: Omit<RenderTarget, 'row'>) => {\n if (lines.length >= height) return\n if (target) targets.push({ row: lines.length, ...target })\n lines.push(fitAnsi(line, width))\n }\n\n const aggregate = aggregateSnapshot(snapshot)\n push(\n `${paint('SUPERVISOR TOP', 'bold', color)} ${paint(snapshot.root, 'dim', color)} ` +\n `runs ${aggregate.supervisors} workers ${aggregate.workers} live ${aggregate.running} ` +\n `done ${aggregate.done} down ${aggregate.down} ` +\n `${formatMoney(aggregate.usd, aggregate.usdKnown)} tok ${formatTokens(aggregate.tokensInput, aggregate.tokensKnown)}/${formatTokens(aggregate.tokensOutput, aggregate.tokensKnown)}`,\n )\n push(\n `${paint('keys', 'dim', color)} up/down select left/right run tab focus enter detail o overview l log s steer c cancel mouse q quit`,\n )\n if (options.notice) push(paint(options.notice, 'yellow', color))\n if (snapshot.completeness === 'partial')\n push(\n paint(\n `partial snapshot: ${snapshot.diagnostics.length} source${\n snapshot.diagnostics.length === 1 ? '' : 's'\n } skipped or truncated; runs loaded ${snapshot.loaded}/${snapshot.discovered}`,\n 'yellow',\n color,\n ),\n )\n if (options.steerInput?.active) push(renderSteerInput(options.steerInput, width, color))\n push(rule(width, color))\n\n if (snapshot.supervisors.length === 0) {\n if (snapshot.discovered > 0) {\n push(paint('NO READABLE SUPERVISORS', 'yellow', color))\n push(\n `${snapshot.discovered} run director${snapshot.discovered === 1 ? 'y' : 'ies'} found under ${supervisorRunsRoot(snapshot.root)}, none readable`,\n )\n } else {\n push(paint('NO SUPERVISORS', 'yellow', color))\n push(`No run state under ${supervisorRunsRoot(snapshot.root)}`)\n }\n push(\n `A run appears here once its driver writes state.json; re-point with: agent-runtime-top <root>`,\n )\n return { frame: `${lines.join('\\n')}\\n`, targets }\n }\n\n push(sectionTitle('SUPERVISORS', focus === 'supervisors', color))\n push(\n ` id status workers spend tok in/out latency task`,\n )\n for (const supervisor of snapshot.supervisors.slice(0, 9)) {\n const selected = supervisor.id === selectedSupervisor?.id\n const status = statusText(supervisor.status, color)\n const pointer = selected ? paint('>', 'cyan', color) : ' '\n const rowFocus = selected && focus === 'supervisors' ? 'inverse' : undefined\n const workerSummary = `${supervisor.totals.running}/${supervisor.totals.workers} live`\n const task = compact(supervisor.task, 34)\n const line =\n `${pointer} ${pad(supervisor.id, 21)} ${pad(status, 12)} ${pad(workerSummary, 13)} ` +\n `${pad(formatMoney(supervisor.totals.usd, supervisor.totals.usdKnown), 12)} ` +\n `${pad(`${formatTokens(supervisor.totals.tokensInput, supervisor.totals.tokensKnown)}/${formatTokens(supervisor.totals.tokensOutput, supervisor.totals.tokensKnown)}`, 16)} ` +\n `${pad(formatDuration(supervisor.totals.latencyMs), 12)} ${task}`\n push(rowFocus ? paint(line, rowFocus, color) : line, { kind: 'supervisor', id: supervisor.id })\n }\n\n if (!selectedSupervisor) return { frame: `${lines.join('\\n')}\\n`, targets }\n\n push()\n push(sectionTitle(`WORKERS ${selectedSupervisor.id}`, focus === 'workers', color))\n push(\n ` id state runtime latency cost tok in/out score detail`,\n )\n for (const worker of selectedSupervisor.workers.slice(0, 12)) {\n const selected = worker.id === selectedWorker?.id\n const pointer = selected ? paint('>', 'cyan', color) : ' '\n const rowFocus = selected && focus === 'workers' ? 'inverse' : undefined\n const score = worker.verdict ?? (worker.status === 'done' ? 'done' : worker.status)\n const detail = worker.reason ?? worker.outRef ?? worker.parent ?? ''\n const spend = totalSpend(worker)\n const line =\n `${pointer} ${pad(worker.label, 12)} ${pad(statusText(worker.status, color), 12)} ` +\n `${pad(worker.runtime ?? '-', 10)} ${pad(formatDuration(worker.latencyMs), 12)} ` +\n `${pad(formatMoney(spend.usd, spend.usdKnown), 11)} ` +\n `${pad(`${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`, 16)} ` +\n `${pad(compact(score, 9), 10)} ${compact(detail, 30)}`\n push(rowFocus ? paint(line, rowFocus, color) : line, {\n kind: 'worker',\n id: worker.id,\n supervisorId: selectedSupervisor.id,\n })\n }\n if (selectedSupervisor.workers.length === 0) push(' no workers spawned yet')\n\n push()\n push(sectionTitle('OBSERVABILITY', false, color))\n for (const line of renderStatusBars(selectedSupervisor, width, color)) push(line)\n push()\n for (const line of renderSpendBars(selectedSupervisor, width, color, 'usd')) push(line)\n push()\n for (const line of renderSpendBars(selectedSupervisor, width, color, 'tokens')) push(line)\n push()\n for (const line of renderLatencyHistogram(selectedSupervisor, width, color)) push(line)\n\n push()\n if (mode === 'log') {\n push(sectionTitle('JOURNAL TAIL', false, color))\n for (const line of renderJournalTail(selectedSupervisor, width, color)) push(line)\n } else {\n push(sectionTitle(mode === 'detail' ? 'DETAIL' : 'RUN SUMMARY', false, color))\n for (const line of renderDetail(selectedSupervisor, selectedWorker, mode, width, color))\n push(line)\n }\n\n return { frame: `${lines.join('\\n')}\\n`, targets }\n}\n\nfunction renderStatusBars(supervisor: SupervisorView, width: number, color: boolean): string[] {\n const total = Math.max(1, supervisor.totals.workers)\n const barWidth = Math.max(12, Math.min(28, width - 58))\n return [\n `status ` +\n `${pad('running', 9)} ${bar(supervisor.totals.running, total, barWidth, '#', color, 'yellow')} ${supervisor.totals.running}` +\n ` ${pad('done', 5)} ${bar(supervisor.totals.done, total, barWidth, '#', color, 'green')} ${supervisor.totals.done}` +\n ` ${pad('down', 5)} ${bar(supervisor.totals.down, total, barWidth, '#', color, 'red')} ${supervisor.totals.down}`,\n ]\n}\n\nfunction renderSpendBars(\n supervisor: SupervisorView,\n width: number,\n color: boolean,\n channel: 'usd' | 'tokens',\n): string[] {\n const dollars = channel === 'usd'\n const amount = (spend: SpendStats) =>\n dollars ? spend.usd : spend.tokensInput + spend.tokensOutput\n const label = (spend: SpendStats) =>\n dollars\n ? formatMoney(spend.usd, spend.usdKnown)\n : `${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`\n const rows = supervisor.workers\n .map((worker) => ({ worker, spend: totalSpend(worker) }))\n .sort((a, b) => amount(b.spend) - amount(a.spend))\n .slice(0, 6)\n const max = Math.max(\n dollars ? 0.000001 : 1,\n ...rows.map((row) => amount(row.spend)),\n amount(supervisor.driverSpend),\n )\n const total = dollars\n ? formatMoney(supervisor.totals.usd, supervisor.totals.usdKnown)\n : `in ${formatTokens(supervisor.totals.tokensInput, supervisor.totals.tokensKnown)} / out ${formatTokens(supervisor.totals.tokensOutput, supervisor.totals.tokensKnown)}`\n const out = [\n `${dollars ? 'cost ' : 'tokens'} total ${total} driver ${label(supervisor.driverSpend)}`,\n ]\n const barWidth = Math.max(18, Math.min(46, width - (dollars ? 38 : 44)))\n for (const { worker, spend } of rows) {\n const visual = dollars\n ? bar(spend.usd, max, barWidth, '$', color, 'magenta')\n : stackedTokenBar(spend.tokensInput, spend.tokensOutput, max, barWidth, color)\n out.push(` ${pad(worker.label, 12)} ${visual} ${label(spend)}`)\n }\n if (rows.length === 0) out.push(` no worker ${dollars ? 'cost' : 'tokens'} yet`)\n return out\n}\n\nfunction renderLatencyHistogram(\n supervisor: SupervisorView,\n width: number,\n color: boolean,\n): string[] {\n const values = supervisor.workers.map((worker) => worker.latencyMs).filter((value) => value > 0)\n const summary = supervisor.totals.workerLatency\n const out = [\n `latency n=${summary.n} min ${formatDuration(summary.min)} p50 ${formatDuration(summary.median)} ` +\n `p90 ${formatDuration(summary.p90)} max ${formatDuration(summary.max)}`,\n ]\n if (values.length === 0) {\n out.push(' no latency samples yet')\n return out\n }\n const bins = histogram(values, 6)\n const maxCount = Math.max(1, ...bins.map((bin) => bin.count))\n const barWidth = Math.max(18, Math.min(48, width - 34))\n for (const bin of bins) {\n out.push(\n ` ${pad(`${formatDuration(bin.min)}-${formatDuration(bin.max)}`, 15)} ` +\n `${bar(bin.count, maxCount, barWidth, '#', color, 'blue')} ${bin.count}`,\n )\n }\n return out\n}\n\nfunction renderDetail(\n supervisor: SupervisorView,\n worker: WorkerView | undefined,\n mode: 'overview' | 'detail' | 'log',\n width: number,\n color: boolean,\n): string[] {\n if (mode === 'detail' && worker) {\n const spend = totalSpend(worker)\n return [\n `worker ${paint(worker.label, 'bold', color)} (${worker.id}) ${statusText(worker.status, color)} latency ${formatDuration(worker.latencyMs)}`,\n `tokens in/out ${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)} cost ${formatMoney(spend.usd, spend.usdKnown)} iterations ${spend.iterations}`,\n `parent ${worker.parent ?? '-'} runtime ${worker.runtime ?? '-'} out ${worker.outRef ?? '-'}${worker.infra ? ' infra' : ''}`,\n `events ${compact(worker.eventFile ?? '-', width - 8)}`,\n ...(worker.reason ? [`reason ${compact(worker.reason, width - 7)}`] : []),\n ...renderWorkerTail(worker, width, color),\n ]\n }\n\n const caps = [\n supervisor.maxSandboxes !== undefined ? `boxes ${supervisor.maxSandboxes}` : undefined,\n supervisor.maxUsd !== undefined ? `max ${formatMoney(supervisor.maxUsd)}` : undefined,\n supervisor.maxDepth !== undefined ? `depth ${supervisor.maxDepth}` : undefined,\n supervisor.maxLifetimeSeconds !== undefined\n ? `ttl ${supervisor.maxLifetimeSeconds}s`\n : undefined,\n ].filter((value): value is string => value !== undefined)\n return [\n `task ${compact(supervisor.task, width - 7)}`,\n `workspace ${compact(supervisor.workspaceDir, width - 12)}`,\n `verify ${compact(supervisor.verifyCmd ?? '-', width - 9)}`,\n `models worker ${supervisor.workerModel ?? '-'} / driver ${supervisor.driverModel ?? '-'} caps ${caps.join(' | ') || '-'}`,\n `progress ${compact(supervisor.progress ?? supervisor.verdict ?? supervisor.status, width - 10)}`,\n ]\n}\n\nfunction renderJournalTail(supervisor: SupervisorView, width: number, color: boolean): string[] {\n if (supervisor.journalTail.length === 0) return [' no journal events yet']\n return supervisor.journalTail.map((event) => {\n const at = event.at ? formatClock(event.at) : '--:--:--'\n if (event.kind === 'spawned')\n return ` ${at} ${paint('spawn', 'yellow', color)} ${pad(event.label ?? event.id, 16)} ${event.id}`\n if (event.kind !== 'cancelled') {\n const spend = parseSpend(event.kind === 'settled' ? event.spent : event.spend)\n const status =\n event.kind === 'settled'\n ? statusText(event.status ?? 'settled', color)\n : event.kind === 'metered'\n ? `${paint('meter', 'cyan', color)} `\n : `${paint('live', 'blue', color)} `\n return ` ${at} ${status} ${pad(event.id, 18)} ${formatMoney(spend.usd, spend.usdKnown)} ${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`\n }\n return ` ${at} ${paint('cancel', 'red', color)} ${pad(event.id, 18)} ${compact(event.reason ?? '', width - 32)}`\n })\n}\n\nfunction renderWorkerTail(worker: WorkerView, width: number, color: boolean): string[] {\n if (worker.liveTail.length === 0) return ['live events: none recorded yet']\n return [\n 'live events:',\n ...worker.liveTail\n .slice(-5)\n .map((line) => ` ${paint(compact(formatWorkerEvent(line), width - 2), 'dim', color)}`),\n ]\n}\n\nfunction renderSteerInput(\n input: NonNullable<RenderOptions['steerInput']>,\n width: number,\n color: boolean,\n): string {\n const target = input.workerLabel ?? '-'\n const value = compact(input.value, Math.max(10, width - target.length - 14))\n return `${paint('steer', 'cyan', color)} ${target} > ${value}${paint('_', 'inverse', color)}`\n}\n\nfunction formatWorkerEvent(line: string): string {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>\n const at = typeof parsed.at === 'string' ? formatClock(parsed.at) : '--:--:--'\n const kind = typeof parsed.kind === 'string' ? parsed.kind : 'event'\n if (kind === 'progress')\n return `${at} progress iter ${numberValue(parsed.iteration)} ${String(parsed.phase ?? '')}`\n if (kind === 'message') {\n const state = parsed.queued === true ? 'queued' : 'sent'\n const source =\n typeof parsed.source === 'string' && parsed.source.length > 0 ? `${parsed.source} ` : ''\n const message =\n typeof parsed.message === 'string' && parsed.message.length > 0 ? ` ${parsed.message}` : ''\n return `${at} ${source}steer ${state} delivered=${String(parsed.delivered)}${message}`\n }\n if (kind === 'verify') {\n return `${at} verify passed=${String(parsed.passed)} exit=${String(parsed.exitCode ?? '-')}${evidenceSnippet(parsed.outputTail, 160)}`\n }\n if (kind === 'finished') {\n const branch = typeof parsed.branch === 'string' ? ` branch=${parsed.branch}` : ''\n const files = typeof parsed.filesChanged === 'number' ? ` files=${parsed.filesChanged}` : ''\n const tests =\n typeof parsed.testPassed === 'boolean' ? ` tests=${String(parsed.testPassed)}` : ''\n return `${at} finished passed=${String(parsed.passed)} patchBytes=${numberValue(parsed.patchBytes)}${files}${tests}${branch}${evidenceSnippet(parsed.evidence, 220)}`\n }\n if (kind === 'error') return `${at} error ${String(parsed.error ?? '')}`\n return `${at} ${kind}`\n } catch {\n return line\n }\n}\n\n/** One-line the settle evidence / verify tail a worker event carries so the\n * failure is legible in the tail view (the full block stays in the ndjson). */\nfunction evidenceSnippet(value: unknown, max: number): string {\n if (typeof value !== 'string') return ''\n const oneLine = value.replace(/\\s+/g, ' ').trim()\n return oneLine ? ` :: ${compact(oneLine, max)}` : ''\n}\n\nfunction histogram(\n values: readonly number[],\n count: number,\n): Array<{ min: number; max: number; count: number }> {\n const min = Math.min(...values)\n const max = Math.max(...values)\n if (min === max) return [{ min, max, count: values.length }]\n const step = (max - min) / count\n return Array.from({ length: count }, (_, index) => {\n const low = min + step * index\n const high = index === count - 1 ? max : min + step * (index + 1)\n const binCount = values.filter(\n (value) => value >= low && (index === count - 1 ? value <= high : value < high),\n ).length\n return { min: low, max: high, count: binCount }\n }).filter((bin) => bin.count > 0)\n}\n\nfunction bar(\n value: number,\n max: number,\n width: number,\n ch: string,\n color: boolean,\n colorName: keyof typeof colors,\n): string {\n const filled = Math.max(0, Math.min(width, Math.round((value / Math.max(max, 0.000001)) * width)))\n const text = ch.repeat(filled).padEnd(width, '.')\n return paint(text, colorName, color)\n}\n\nfunction stackedTokenBar(\n input: number,\n output: number,\n max: number,\n width: number,\n color: boolean,\n): string {\n const inputWidth = Math.round((input / Math.max(max, 1)) * width)\n const outputWidth = Math.round((output / Math.max(max, 1)) * width)\n const clippedInput = Math.min(width, inputWidth)\n const clippedOutput = Math.min(width - clippedInput, outputWidth)\n const rest = Math.max(0, width - clippedInput - clippedOutput)\n return `${paint('#'.repeat(clippedInput), 'cyan', color)}${paint('+'.repeat(clippedOutput), 'green', color)}${'.'.repeat(rest)}`\n}\n\nfunction sectionTitle(title: string, focused: boolean, color: boolean): string {\n const text = focused ? `[${title}]` : title\n return paint(text, focused ? 'cyan' : 'bold', color)\n}\n\nfunction statusText(status: string, color: boolean): string {\n if (['completed', 'done', 'delivered', 'valid'].includes(status))\n return paint(status.toUpperCase(), 'green', color)\n if (['failed', 'down', 'cancelled', 'invalid', 'error'].includes(status))\n return paint(status.toUpperCase(), 'red', color)\n if (['running', 'spawned', 'settled'].includes(status))\n return paint(status.toUpperCase(), 'yellow', color)\n return paint(status.toUpperCase(), 'white', color)\n}\n\nfunction selectEntity<T extends { readonly id: string }>(\n entities: readonly T[],\n requested: string | undefined,\n): T | undefined {\n return (requested ? entities.find((entity) => entity.id === requested) : undefined) ?? entities[0]\n}\n\nfunction formatClock(value: string): string {\n const parsed = parseTime(value)\n if (parsed === undefined) return '--:--:--'\n return new Date(parsed).toISOString().slice(11, 19)\n}\n\nfunction formatMoney(value: number, known = true): string {\n if (!known) return value === 0 ? 'unknown' : `≥${formatMoney(value)} + unknown`\n if (value === 0) return '$0'\n if (Math.abs(value) < 0.01) return `$${value.toFixed(4)}`\n return `$${value.toFixed(2)}`\n}\n\nfunction formatTokens(value: number, known = true): string {\n if (!known) return value === 0 ? '?' : `≥${formatTokens(value)}?`\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`\n return `${Math.round(value)}`\n}\n\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '0s'\n if (ms < 1000) return `${Math.round(ms)}ms`\n const seconds = ms / 1000\n if (seconds < 60) return `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`\n const minutes = seconds / 60\n if (minutes < 60) return `${minutes.toFixed(minutes < 10 ? 1 : 0)}m`\n return `${(minutes / 60).toFixed(1)}h`\n}\n\nfunction compact(value: string, width: number): string {\n if (width <= 1) return ''\n if (value.length <= width) return value\n return `${value.slice(0, width - 1)}~`\n}\n\nfunction pad(value: string, width: number): string {\n const visible = visibleLength(value)\n if (visible >= width) return fitAnsi(value, width)\n return `${value}${' '.repeat(width - visible)}`\n}\n\nfunction rule(width: number, color: boolean): string {\n return paint('-'.repeat(width), 'dim', color)\n}\n\nfunction paint(\n value: string,\n colorName: keyof typeof colors | undefined,\n enabled: boolean,\n): string {\n if (!enabled || !colorName) return value\n return `${colors[colorName]}${value}${colors.reset}`\n}\n\nfunction visibleLength(value: string): number {\n return stripAnsi(value).length\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(ansiPattern, '')\n}\n\nfunction fitAnsi(value: string, width: number): string {\n if (visibleLength(value) <= width) return value\n let out = ''\n let visible = 0\n let cursor = 0\n // An escape sequence must be copied whole and counted as zero visible columns; truncating\n // inside one would emit a half-sequence the terminal interprets against the next line.\n for (const match of value.matchAll(ansiPattern)) {\n const text = value.slice(cursor, match.index)\n const remaining = width - 1 - visible\n out += text.slice(0, remaining)\n visible += Math.min(text.length, remaining)\n if (text.length > remaining) break\n out += match[0]\n cursor = match.index + match[0].length\n }\n if (visible < width - 1) out += value.slice(cursor, cursor + width - 1 - visible)\n out += '~'\n if (out.includes('\\x1b[') && !out.endsWith(colors.reset)) out += colors.reset\n return out\n}\n","/**\n * The interactive side of the supervisor-run TUI: a keypress/mouse loop over the frames\n * `./top-frame` renders, plus the operator controls that write back to the run — steer a live\n * worker, cancel one worker, and request cancellation of a whole run.\n *\n * The controls go through the owned run layout: steers via `writeWorkerSteer` (the durable inbox\n * append) and worker cancellation via `cancelWorker` (the acknowledged operation the runtime's\n * turn loop applies). Run-level cancellation targets the ROOT, which has no acknowledged runtime\n * path yet for a non-retained tree — it stays a `cancel.request.json` write inside the run\n * directory for a host process to honor. Nothing here joins a path from the workspace root.\n *\n * Extracted from the `loops` repo (`src/top.ts`). The module-level singletons are the origin's\n * shape and are kept: this drives one terminal, and `runTopApp` is its one entry point.\n *\n * @experimental\n */\n\nimport { randomUUID } from 'node:crypto'\nimport { hostname, userInfo } from 'node:os'\nimport { resolve } from 'node:path'\nimport { emitKeypressEvents } from 'node:readline'\nimport { cancelRun } from '../runtime/supervise/run-cancellation'\nimport { cancelWorker, writeWorkerSteer } from '../runtime/supervise/run-layout'\nimport { type RenderTarget, renderTopFrameWithLayout } from './top-frame'\nimport { loadTopSnapshot, type TopSnapshot } from './top-snapshot'\n\ninterface UiState {\n root: string\n color: boolean\n focus: 'supervisors' | 'workers'\n mode: 'overview' | 'detail' | 'log'\n selectedSupervisorId: string | undefined\n selectedWorkerId: string | undefined\n notice: string | undefined\n steerInput: {\n active: boolean\n value: string\n }\n}\n\n/** @experimental How the app was invoked. Defaults read `process.argv` / `process.cwd()`. */\ninterface TopAppOptions {\n readonly argv?: readonly string[]\n readonly cwd?: string\n}\n\nlet state: UiState = initialState([], process.cwd())\nlet snapshot: TopSnapshot = {\n root: state.root,\n generatedAt: 0,\n supervisors: [],\n completeness: 'complete',\n diagnostics: [],\n discovered: 0,\n loaded: 0,\n}\nlet targets: RenderTarget[] = []\nlet timer: NodeJS.Timeout | undefined\n\n/**\n * Render exactly one frame and return it. This is the non-interactive path — `--once`, a pipe, a\n * test — so it never touches raw mode, the alternate screen, or `process.exit`.\n */\nfunction renderTopOnce(options: TopAppOptions = {}): string {\n const args = [...(options.argv ?? process.argv.slice(2))]\n state = initialState(args, options.cwd ?? process.cwd())\n snapshot = loadTopSnapshot(state.root)\n clampSelection()\n return renderTopFrameWithLayout(snapshot, {\n color: state.color,\n width: process.stdout.columns ?? 128,\n focus: state.focus,\n mode: state.mode,\n ...(state.selectedSupervisorId ? { selectedSupervisorId: state.selectedSupervisorId } : {}),\n ...(state.selectedWorkerId ? { selectedWorkerId: state.selectedWorkerId } : {}),\n steerInput: renderSteerInputState(),\n }).frame\n}\n\n/**\n * Run the TUI. With a TTY on both ends and no `--once` this takes over the terminal until `q`;\n * otherwise it writes a single frame to stdout and returns.\n */\nexport function runTopApp(options: TopAppOptions = {}): void {\n const args = [...(options.argv ?? process.argv.slice(2))]\n if (!process.stdout.isTTY || !process.stdin.isTTY || args.includes('--once')) {\n process.stdout.write(renderTopOnce(options))\n return\n }\n state = initialState(args, options.cwd ?? process.cwd())\n snapshot = loadTopSnapshot(state.root)\n start()\n}\n\nfunction initialState(args: readonly string[], cwd: string): UiState {\n const rootArg = args.find((arg) => !arg.startsWith('-'))\n return {\n root: resolve(rootArg ?? cwd),\n color: Boolean(process.stdout.isTTY) && !args.includes('--no-color'),\n focus: args.includes('--detail') ? 'workers' : 'supervisors',\n mode: args.includes('--log') ? 'log' : args.includes('--detail') ? 'detail' : 'overview',\n selectedSupervisorId: undefined,\n selectedWorkerId: undefined,\n notice: undefined,\n steerInput: { active: false, value: '' },\n }\n}\n\nfunction start(): void {\n process.stdout.write('\\x1b[?1049h\\x1b[?25l\\x1b[?1000h\\x1b[?1006h')\n emitKeypressEvents(process.stdin)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on('keypress', onKey)\n process.stdin.on('data', onData)\n process.on('SIGINT', stop)\n draw()\n timer = setInterval(draw, 1000)\n}\n\nfunction stop(): void {\n if (timer) clearInterval(timer)\n process.stdin.setRawMode(false)\n process.stdout.write('\\x1b[?1000l\\x1b[?1006l\\x1b[?25h\\x1b[?1049l')\n process.exit(0)\n}\n\nfunction draw(): void {\n snapshot = loadTopSnapshot(state.root)\n clampSelection()\n const rendered = renderTopFrameWithLayout(snapshot, {\n width: process.stdout.columns ?? 128,\n height: process.stdout.rows ?? 42,\n color: state.color,\n focus: state.focus,\n mode: state.mode,\n ...(state.notice ? { notice: state.notice } : {}),\n ...(state.selectedSupervisorId ? { selectedSupervisorId: state.selectedSupervisorId } : {}),\n ...(state.selectedWorkerId ? { selectedWorkerId: state.selectedWorkerId } : {}),\n steerInput: renderSteerInputState(),\n })\n targets = rendered.targets\n process.stdout.write(`\\x1b[2J\\x1b[H${rendered.frame}`)\n}\n\nfunction onKey(str: string, key: { name?: string; ctrl?: boolean }): void {\n state.notice = undefined\n if (key.ctrl && key.name === 'c') stop()\n if (state.steerInput.active) {\n handleSteerInput(str, key)\n draw()\n return\n }\n if (key.name === 'q' || key.name === 'escape') stop()\n if (key.name === 'tab') {\n state.focus = state.focus === 'supervisors' ? 'workers' : 'supervisors'\n } else if (key.name === 'up') {\n moveSelection(-1)\n } else if (key.name === 'down') {\n moveSelection(1)\n } else if (key.name === 'left') {\n moveSupervisor(-1)\n } else if (key.name === 'right') {\n moveSupervisor(1)\n } else if (key.name === 'return') {\n state.mode = 'detail'\n state.focus = 'workers'\n } else if (key.name === 'o') {\n state.mode = 'overview'\n } else if (key.name === 'l') {\n state.mode = 'log'\n } else if (key.name === 's') {\n startSteerInput()\n } else if (key.name === 'c') {\n requestCancel()\n }\n draw()\n}\n\nfunction handleSteerInput(str: string, key: { name?: string; ctrl?: boolean }): void {\n if (key.name === 'escape') {\n state.steerInput = { active: false, value: '' }\n return\n }\n if (key.name === 'return') {\n submitSteerInput()\n return\n }\n if (key.name === 'backspace') {\n state.steerInput.value = state.steerInput.value.slice(0, -1)\n return\n }\n if (key.ctrl && key.name === 'u') {\n state.steerInput.value = ''\n return\n }\n if (\n key.ctrl ||\n key.name === 'tab' ||\n key.name === 'up' ||\n key.name === 'down' ||\n key.name === 'left' ||\n key.name === 'right'\n ) {\n return\n }\n if (!str || str === '\\r' || str === '\\n') return\n if ([...str].every((char) => char >= ' ' && char !== '\\x7f')) state.steerInput.value += str\n}\n\nfunction onData(data: Buffer): void {\n const click = parseMouse(data.toString('utf8'))\n if (!click) return\n const target = targets.find((candidate) => candidate.row === click.row)\n if (!target) return\n state.notice = undefined\n if (target.kind === 'supervisor') {\n state.focus = 'supervisors'\n state.selectedSupervisorId = target.id\n state.selectedWorkerId = undefined\n } else {\n state.focus = 'workers'\n state.mode = 'detail'\n state.selectedSupervisorId = target.supervisorId\n state.selectedWorkerId = target.id\n }\n draw()\n}\n\nfunction startSteerInput(): void {\n state.mode = 'detail'\n state.focus = 'workers'\n if (!selectedSupervisor()) {\n state.notice = 'no supervisor selected'\n return\n }\n if (!selectedWorker()) {\n state.notice = 'no worker selected'\n return\n }\n state.steerInput = { active: true, value: '' }\n}\n\nfunction submitSteerInput(): void {\n const supervisor = selectedSupervisor()\n const worker = selectedWorker()\n const message = state.steerInput.value\n state.steerInput = { active: false, value: '' }\n if (!supervisor) {\n state.notice = 'no supervisor selected'\n return\n }\n if (!worker) {\n state.notice = 'no worker selected'\n return\n }\n try {\n // The exact worker id routes this operation to the one manager that owns the child.\n const written = writeWorkerSteer(state.root, supervisor.id, worker.id, {\n operationId: randomUUID(),\n message,\n source: 'agent-runtime-top',\n })\n state.notice = `steer queued for ${supervisor.id}/${worker.label} (op ${written.request.operationId})`\n } catch (err) {\n state.notice = `steer failed: ${err instanceof Error ? err.message : String(err)}`\n }\n}\n\nfunction parseMouse(raw: string): { col: number; row: number } | undefined {\n // ESC is the literal first byte of an SGR mouse report; matching the control character IS the\n // parse, so the control-character rule does not apply to a terminal escape decoder.\n // biome-ignore lint/suspicious/noControlCharactersInRegex: SGR mouse reports begin with ESC\n const match = /\\x1b\\[<(\\d+);(\\d+);(\\d+)([mM])/.exec(raw)\n if (match?.[4] !== 'M') return undefined\n const col = Number(match[2])\n const row = Number(match[3])\n if (!Number.isFinite(col) || !Number.isFinite(row)) return undefined\n return { col: col - 1, row: row - 1 }\n}\n\nfunction moveSelection(delta: number): void {\n if (state.focus === 'supervisors') {\n moveSupervisor(delta)\n return\n }\n const supervisor = selectedSupervisor()\n if (!supervisor || supervisor.workers.length === 0) return\n const current = Math.max(\n 0,\n supervisor.workers.findIndex((worker) => worker.id === state.selectedWorkerId),\n )\n const next = wrap(current + delta, supervisor.workers.length)\n const worker = supervisor.workers[next]\n if (worker) state.selectedWorkerId = worker.id\n}\n\nfunction moveSupervisor(delta: number): void {\n if (snapshot.supervisors.length === 0) return\n const current = Math.max(\n 0,\n snapshot.supervisors.findIndex((supervisor) => supervisor.id === state.selectedSupervisorId),\n )\n const next = wrap(current + delta, snapshot.supervisors.length)\n const supervisor = snapshot.supervisors[next]\n if (!supervisor) return\n state.selectedSupervisorId = supervisor.id\n state.selectedWorkerId = supervisor.workers[0]?.id\n}\n\nfunction clampSelection(): void {\n if (snapshot.supervisors.length === 0) {\n state.selectedSupervisorId = undefined\n state.selectedWorkerId = undefined\n return\n }\n const supervisor = selectedSupervisor() ?? snapshot.supervisors[0]\n if (!supervisor) return\n state.selectedSupervisorId = supervisor.id\n const worker =\n supervisor.workers.find((candidate) => candidate.id === state.selectedWorkerId) ??\n supervisor.workers[0]\n state.selectedWorkerId = worker?.id\n}\n\nfunction selectedSupervisor(): TopSnapshot['supervisors'][number] | undefined {\n return snapshot.supervisors.find((supervisor) => supervisor.id === state.selectedSupervisorId)\n}\n\nfunction selectedWorker(): TopSnapshot['supervisors'][number]['workers'][number] | undefined {\n const supervisor = selectedSupervisor()\n return supervisor?.workers.find((worker) => worker.id === state.selectedWorkerId)\n}\n\nfunction renderSteerInputState(): { active: boolean; value: string; workerLabel?: string } {\n const worker = selectedWorker()\n return {\n active: state.steerInput.active,\n value: state.steerInput.value,\n ...(worker?.label ? { workerLabel: worker.label } : {}),\n }\n}\n\nfunction requestCancel(): void {\n const supervisor = selectedSupervisor()\n if (!supervisor) {\n state.notice = 'no supervisor selected'\n return\n }\n if (supervisor.status !== 'running') {\n state.notice = `${supervisor.id} is ${supervisor.status}; no cancel request written`\n return\n }\n // Worker focus cancels ONE worker through the acknowledged runtime path: the request lands in\n // the run layout's cancellation inbox, the run's own turn loop applies the abort to exactly\n // that worker's subtree, and the acknowledgement records what it proved.\n const worker = state.focus === 'workers' ? selectedWorker() : undefined\n if (worker) {\n if (worker.status !== 'running') {\n state.notice = `${worker.label} is ${worker.status}; nothing to cancel`\n return\n }\n // The request names the exact node id, so it routes to the manager that owns the worker at\n // ANY depth — the owning manager's turn loop applies the abort to exactly that subtree.\n try {\n const record = cancelWorker(supervisor.stateDir, worker.id, randomUUID(), {\n reason: 'operator requested cancel from TUI',\n source: 'agent-runtime-top',\n })\n state.notice =\n record.effect === 'unknown'\n ? `cancel queued for ${supervisor.id}/${worker.label} (op ${record.operationId}); awaiting runtime acknowledgement`\n : `cancel ${record.effect} for ${supervisor.id}/${worker.label} (op ${record.operationId})`\n } catch (err) {\n state.notice = `cancel request failed: ${err instanceof Error ? err.message : String(err)}`\n }\n return\n }\n // Supervisor focus cancels the WHOLE run through the same acknowledged contract: the request\n // lands in the run layout, the run's root manager aborts the whole tree through the one cascade\n // controller it already has, and `supervise()` records the terminal effect.\n try {\n const record = cancelRun(supervisor.stateDir, randomUUID(), {\n reason: 'operator requested cancel from TUI',\n source: 'agent-runtime-top',\n operator: `${userInfo().username}@${hostname()}`,\n })\n state.notice =\n record.effect === 'unknown'\n ? `run cancel queued for ${supervisor.id} (op ${record.operationId}); awaiting runtime acknowledgement`\n : `run cancel ${record.effect} for ${supervisor.id} (op ${record.operationId})`\n } catch (err) {\n state.notice = `cancel request failed: ${err instanceof Error ? err.message : String(err)}`\n }\n}\n\nfunction wrap(value: number, size: number): number {\n return ((value % size) + size) % size\n}\n","#!/usr/bin/env node\n\n/**\n * `agent-runtime-top` — watch the supervisor runs of one workspace.\n *\n * agent-runtime-top [root] [--once] [--no-color] [--detail] [--log]\n *\n * `root` is the workspace whose `.agent/supervisor/` runs are shown; it defaults to the current\n * directory. With a TTY on both ends the view refreshes every second and takes the keys it prints\n * in its header; otherwise (a pipe, `--once`) it writes one frame and exits.\n *\n * @experimental\n */\n\nimport { runTopApp } from './top-app'\n\nrunTopApp()\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bin.js","names":[],"sources":["../../src/tui/top-frame.ts","../../src/tui/top-app.ts","../../src/tui/bin.ts"],"sourcesContent":["import { supervisorRunsRoot } from '../runtime/supervise/run-layout'\nimport {\n aggregateSnapshot,\n numberValue,\n parseSpend,\n parseTime,\n type SpendStats,\n type SupervisorView,\n type TopSnapshot,\n totalSpend,\n type WorkerView,\n} from './top-snapshot'\n\ninterface RenderOptions {\n readonly width?: number\n readonly height?: number\n readonly color?: boolean\n readonly selectedSupervisorId?: string\n readonly selectedWorkerId?: string\n readonly focus?: 'supervisors' | 'workers'\n readonly mode?: 'overview' | 'detail' | 'log'\n readonly notice?: string\n readonly steerInput?: {\n readonly active: boolean\n readonly value: string\n readonly workerLabel?: string\n }\n}\n\nexport interface RenderTarget {\n readonly row: number\n readonly kind: 'supervisor' | 'worker'\n readonly id: string\n readonly supervisorId?: string\n}\n\ninterface RenderedTopFrame {\n readonly frame: string\n readonly targets: RenderTarget[]\n}\n// Width accounting depends on stripping SGR sequences, which begin with a literal ESC. Matching\n// the control character is the point of an ANSI-aware renderer, not an accident.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: SGR sequences begin with ESC\nconst ansiPattern = /\\x1b\\[[0-9;?]*[ -/]*[@-~]/g\n\nconst colors = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n bold: '\\x1b[1m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n inverse: '\\x1b[7m',\n}\n\n/** Render one snapshot to an ANSI frame. Use this when nothing needs to be clickable. */\nexport function renderTopFrame(snapshot: TopSnapshot, options: RenderOptions = {}): string {\n return renderTopFrameWithLayout(snapshot, options).frame\n}\n\n/**\n * Render one snapshot, returning the frame together with the row→entity map a mouse click resolves\n * against. The layout is the only thing that knows which row is which run or worker, so emitting it\n * alongside the text is what keeps click handling out of the renderer.\n */\nexport function renderTopFrameWithLayout(\n snapshot: TopSnapshot,\n options: RenderOptions = {},\n): RenderedTopFrame {\n const width = Math.max(88, options.width ?? 128)\n const height = Math.max(24, options.height ?? 42)\n const color = options.color ?? false\n const focus = options.focus ?? 'supervisors'\n const mode = options.mode ?? 'overview'\n const selectedSupervisor = selectEntity(snapshot.supervisors, options.selectedSupervisorId)\n const selectedWorker = selectedSupervisor\n ? selectEntity(selectedSupervisor.workers, options.selectedWorkerId)\n : undefined\n const targets: RenderTarget[] = []\n const lines: string[] = []\n\n const push = (line = '', target?: Omit<RenderTarget, 'row'>) => {\n if (lines.length >= height) return\n if (target) targets.push({ row: lines.length, ...target })\n lines.push(fitAnsi(line, width))\n }\n\n const aggregate = aggregateSnapshot(snapshot)\n push(\n `${paint('SUPERVISOR TOP', 'bold', color)} ${paint(snapshot.root, 'dim', color)} ` +\n `runs ${aggregate.supervisors} workers ${aggregate.workers} live ${aggregate.running} ` +\n `done ${aggregate.done} down ${aggregate.down} ` +\n `${formatMoney(aggregate.usd, aggregate.usdKnown)} tok ${formatTokens(aggregate.tokensInput, aggregate.tokensKnown)}/${formatTokens(aggregate.tokensOutput, aggregate.tokensKnown)}`,\n )\n push(\n `${paint('keys', 'dim', color)} up/down select left/right run tab focus enter detail o overview l log s steer c cancel mouse q quit`,\n )\n if (options.notice) push(paint(options.notice, 'yellow', color))\n if (snapshot.completeness === 'partial')\n push(\n paint(\n `partial snapshot: ${snapshot.diagnostics.length} source${\n snapshot.diagnostics.length === 1 ? '' : 's'\n } skipped or truncated; runs loaded ${snapshot.loaded}/${snapshot.discovered}`,\n 'yellow',\n color,\n ),\n )\n if (options.steerInput?.active) push(renderSteerInput(options.steerInput, width, color))\n push(rule(width, color))\n\n if (snapshot.supervisors.length === 0) {\n if (snapshot.discovered > 0) {\n push(paint('NO READABLE SUPERVISORS', 'yellow', color))\n push(\n `${snapshot.discovered} run director${snapshot.discovered === 1 ? 'y' : 'ies'} found under ${supervisorRunsRoot(snapshot.root)}, none readable`,\n )\n } else {\n push(paint('NO SUPERVISORS', 'yellow', color))\n push(`No run state under ${supervisorRunsRoot(snapshot.root)}`)\n }\n push(\n `A run appears here once its driver writes state.json; re-point with: agent-runtime-top <root>`,\n )\n return { frame: `${lines.join('\\n')}\\n`, targets }\n }\n\n push(sectionTitle('SUPERVISORS', focus === 'supervisors', color))\n push(\n ` id status workers spend tok in/out latency task`,\n )\n for (const supervisor of snapshot.supervisors.slice(0, 9)) {\n const selected = supervisor.id === selectedSupervisor?.id\n const status = statusText(supervisor.status, color)\n const pointer = selected ? paint('>', 'cyan', color) : ' '\n const rowFocus = selected && focus === 'supervisors' ? 'inverse' : undefined\n const workerSummary = `${supervisor.totals.running}/${supervisor.totals.workers} live`\n const task = compact(supervisor.task, 34)\n const line =\n `${pointer} ${pad(supervisor.id, 21)} ${pad(status, 12)} ${pad(workerSummary, 13)} ` +\n `${pad(formatMoney(supervisor.totals.usd, supervisor.totals.usdKnown), 12)} ` +\n `${pad(`${formatTokens(supervisor.totals.tokensInput, supervisor.totals.tokensKnown)}/${formatTokens(supervisor.totals.tokensOutput, supervisor.totals.tokensKnown)}`, 16)} ` +\n `${pad(formatDuration(supervisor.totals.latencyMs), 12)} ${task}`\n push(rowFocus ? paint(line, rowFocus, color) : line, { kind: 'supervisor', id: supervisor.id })\n }\n\n if (!selectedSupervisor) return { frame: `${lines.join('\\n')}\\n`, targets }\n\n push()\n push(sectionTitle(`WORKERS ${selectedSupervisor.id}`, focus === 'workers', color))\n push(\n ` id state runtime latency cost tok in/out score detail`,\n )\n for (const worker of selectedSupervisor.workers.slice(0, 12)) {\n const selected = worker.id === selectedWorker?.id\n const pointer = selected ? paint('>', 'cyan', color) : ' '\n const rowFocus = selected && focus === 'workers' ? 'inverse' : undefined\n const score = worker.verdict ?? (worker.status === 'done' ? 'done' : worker.status)\n const detail = worker.reason ?? worker.outRef ?? worker.parent ?? ''\n const spend = totalSpend(worker)\n const line =\n `${pointer} ${pad(worker.label, 12)} ${pad(statusText(worker.status, color), 12)} ` +\n `${pad(worker.runtime ?? '-', 10)} ${pad(formatDuration(worker.latencyMs), 12)} ` +\n `${pad(formatMoney(spend.usd, spend.usdKnown), 11)} ` +\n `${pad(`${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`, 16)} ` +\n `${pad(compact(score, 9), 10)} ${compact(detail, 30)}`\n push(rowFocus ? paint(line, rowFocus, color) : line, {\n kind: 'worker',\n id: worker.id,\n supervisorId: selectedSupervisor.id,\n })\n }\n if (selectedSupervisor.workers.length === 0) push(' no workers spawned yet')\n\n push()\n push(sectionTitle('OBSERVABILITY', false, color))\n for (const line of renderStatusBars(selectedSupervisor, width, color)) push(line)\n push()\n for (const line of renderSpendBars(selectedSupervisor, width, color, 'usd')) push(line)\n push()\n for (const line of renderSpendBars(selectedSupervisor, width, color, 'tokens')) push(line)\n push()\n for (const line of renderLatencyHistogram(selectedSupervisor, width, color)) push(line)\n\n push()\n if (mode === 'log') {\n push(sectionTitle('JOURNAL TAIL', false, color))\n for (const line of renderJournalTail(selectedSupervisor, width, color)) push(line)\n } else {\n push(sectionTitle(mode === 'detail' ? 'DETAIL' : 'RUN SUMMARY', false, color))\n for (const line of renderDetail(selectedSupervisor, selectedWorker, mode, width, color))\n push(line)\n }\n\n return { frame: `${lines.join('\\n')}\\n`, targets }\n}\n\nfunction renderStatusBars(supervisor: SupervisorView, width: number, color: boolean): string[] {\n const total = Math.max(1, supervisor.totals.workers)\n const barWidth = Math.max(12, Math.min(28, width - 58))\n return [\n `status ` +\n `${pad('running', 9)} ${bar(supervisor.totals.running, total, barWidth, '#', color, 'yellow')} ${supervisor.totals.running}` +\n ` ${pad('done', 5)} ${bar(supervisor.totals.done, total, barWidth, '#', color, 'green')} ${supervisor.totals.done}` +\n ` ${pad('down', 5)} ${bar(supervisor.totals.down, total, barWidth, '#', color, 'red')} ${supervisor.totals.down}`,\n ]\n}\n\nfunction renderSpendBars(\n supervisor: SupervisorView,\n width: number,\n color: boolean,\n channel: 'usd' | 'tokens',\n): string[] {\n const dollars = channel === 'usd'\n const amount = (spend: SpendStats) =>\n dollars ? spend.usd : spend.tokensInput + spend.tokensOutput\n const label = (spend: SpendStats) =>\n dollars\n ? formatMoney(spend.usd, spend.usdKnown)\n : `${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`\n const rows = supervisor.workers\n .map((worker) => ({ worker, spend: totalSpend(worker) }))\n .sort((a, b) => amount(b.spend) - amount(a.spend))\n .slice(0, 6)\n const max = Math.max(\n dollars ? 0.000001 : 1,\n ...rows.map((row) => amount(row.spend)),\n amount(supervisor.driverSpend),\n )\n const total = dollars\n ? formatMoney(supervisor.totals.usd, supervisor.totals.usdKnown)\n : `in ${formatTokens(supervisor.totals.tokensInput, supervisor.totals.tokensKnown)} / out ${formatTokens(supervisor.totals.tokensOutput, supervisor.totals.tokensKnown)}`\n const out = [\n `${dollars ? 'cost ' : 'tokens'} total ${total} driver ${label(supervisor.driverSpend)}`,\n ]\n const barWidth = Math.max(18, Math.min(46, width - (dollars ? 38 : 44)))\n for (const { worker, spend } of rows) {\n const visual = dollars\n ? bar(spend.usd, max, barWidth, '$', color, 'magenta')\n : stackedTokenBar(spend.tokensInput, spend.tokensOutput, max, barWidth, color)\n out.push(` ${pad(worker.label, 12)} ${visual} ${label(spend)}`)\n }\n if (rows.length === 0) out.push(` no worker ${dollars ? 'cost' : 'tokens'} yet`)\n return out\n}\n\nfunction renderLatencyHistogram(\n supervisor: SupervisorView,\n width: number,\n color: boolean,\n): string[] {\n const values = supervisor.workers.map((worker) => worker.latencyMs).filter((value) => value > 0)\n const summary = supervisor.totals.workerLatency\n const out = [\n `latency n=${summary.n} min ${formatDuration(summary.min)} p50 ${formatDuration(summary.median)} ` +\n `p90 ${formatDuration(summary.p90)} max ${formatDuration(summary.max)}`,\n ]\n if (values.length === 0) {\n out.push(' no latency samples yet')\n return out\n }\n const bins = histogram(values, 6)\n const maxCount = Math.max(1, ...bins.map((bin) => bin.count))\n const barWidth = Math.max(18, Math.min(48, width - 34))\n for (const bin of bins) {\n out.push(\n ` ${pad(`${formatDuration(bin.min)}-${formatDuration(bin.max)}`, 15)} ` +\n `${bar(bin.count, maxCount, barWidth, '#', color, 'blue')} ${bin.count}`,\n )\n }\n return out\n}\n\nfunction renderDetail(\n supervisor: SupervisorView,\n worker: WorkerView | undefined,\n mode: 'overview' | 'detail' | 'log',\n width: number,\n color: boolean,\n): string[] {\n if (mode === 'detail' && worker) {\n const spend = totalSpend(worker)\n return [\n `worker ${paint(worker.label, 'bold', color)} (${worker.id}) ${statusText(worker.status, color)} latency ${formatDuration(worker.latencyMs)}`,\n `tokens in/out ${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)} cost ${formatMoney(spend.usd, spend.usdKnown)} iterations ${spend.iterations}`,\n `parent ${worker.parent ?? '-'} runtime ${worker.runtime ?? '-'} out ${worker.outRef ?? '-'}${worker.infra ? ' infra' : ''}`,\n `events ${compact(worker.eventFile ?? '-', width - 8)}`,\n ...(worker.reason ? [`reason ${compact(worker.reason, width - 7)}`] : []),\n ...renderWorkerTail(worker, width, color),\n ]\n }\n\n const caps = [\n supervisor.maxSandboxes !== undefined ? `boxes ${supervisor.maxSandboxes}` : undefined,\n supervisor.maxUsd !== undefined ? `max ${formatMoney(supervisor.maxUsd)}` : undefined,\n supervisor.maxDepth !== undefined ? `depth ${supervisor.maxDepth}` : undefined,\n supervisor.maxLifetimeSeconds !== undefined\n ? `ttl ${supervisor.maxLifetimeSeconds}s`\n : undefined,\n ].filter((value): value is string => value !== undefined)\n return [\n `task ${compact(supervisor.task, width - 7)}`,\n `workspace ${compact(supervisor.workspaceDir, width - 12)}`,\n `verify ${compact(supervisor.verifyCmd ?? '-', width - 9)}`,\n `models worker ${supervisor.workerModel ?? '-'} / driver ${supervisor.driverModel ?? '-'} caps ${caps.join(' | ') || '-'}`,\n `progress ${compact(supervisor.progress ?? supervisor.verdict ?? supervisor.status, width - 10)}`,\n ]\n}\n\nfunction renderJournalTail(supervisor: SupervisorView, width: number, color: boolean): string[] {\n if (supervisor.journalTail.length === 0) return [' no journal events yet']\n return supervisor.journalTail.map((event) => {\n const at = event.at ? formatClock(event.at) : '--:--:--'\n if (event.kind === 'spawned')\n return ` ${at} ${paint('spawn', 'yellow', color)} ${pad(event.label ?? event.id, 16)} ${event.id}`\n if (event.kind !== 'cancelled') {\n const spend = parseSpend(event.kind === 'settled' ? event.spent : event.spend)\n const status =\n event.kind === 'settled'\n ? statusText(event.status ?? 'settled', color)\n : event.kind === 'metered'\n ? `${paint('meter', 'cyan', color)} `\n : `${paint('live', 'blue', color)} `\n return ` ${at} ${status} ${pad(event.id, 18)} ${formatMoney(spend.usd, spend.usdKnown)} ${formatTokens(spend.tokensInput, spend.tokensKnown)}/${formatTokens(spend.tokensOutput, spend.tokensKnown)}`\n }\n return ` ${at} ${paint('cancel', 'red', color)} ${pad(event.id, 18)} ${compact(event.reason ?? '', width - 32)}`\n })\n}\n\nfunction renderWorkerTail(worker: WorkerView, width: number, color: boolean): string[] {\n if (worker.liveTail.length === 0) return ['live events: none recorded yet']\n return [\n 'live events:',\n ...worker.liveTail\n .slice(-5)\n .map((line) => ` ${paint(compact(formatWorkerEvent(line), width - 2), 'dim', color)}`),\n ]\n}\n\nfunction renderSteerInput(\n input: NonNullable<RenderOptions['steerInput']>,\n width: number,\n color: boolean,\n): string {\n const target = input.workerLabel ?? '-'\n const value = compact(input.value, Math.max(10, width - target.length - 14))\n return `${paint('steer', 'cyan', color)} ${target} > ${value}${paint('_', 'inverse', color)}`\n}\n\nfunction formatWorkerEvent(line: string): string {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>\n const at = typeof parsed.at === 'string' ? formatClock(parsed.at) : '--:--:--'\n const kind = typeof parsed.kind === 'string' ? parsed.kind : 'event'\n if (kind === 'progress')\n return `${at} progress iter ${numberValue(parsed.iteration)} ${String(parsed.phase ?? '')}`\n if (kind === 'message') {\n const state = parsed.queued === true ? 'queued' : 'sent'\n const source =\n typeof parsed.source === 'string' && parsed.source.length > 0 ? `${parsed.source} ` : ''\n const message =\n typeof parsed.message === 'string' && parsed.message.length > 0 ? ` ${parsed.message}` : ''\n return `${at} ${source}steer ${state} delivered=${String(parsed.delivered)}${message}`\n }\n if (kind === 'verify') {\n return `${at} verify passed=${String(parsed.passed)} exit=${String(parsed.exitCode ?? '-')}${evidenceSnippet(parsed.outputTail, 160)}`\n }\n if (kind === 'finished') {\n const branch = typeof parsed.branch === 'string' ? ` branch=${parsed.branch}` : ''\n const files = typeof parsed.filesChanged === 'number' ? ` files=${parsed.filesChanged}` : ''\n const tests =\n typeof parsed.testPassed === 'boolean' ? ` tests=${String(parsed.testPassed)}` : ''\n return `${at} finished passed=${String(parsed.passed)} patchBytes=${numberValue(parsed.patchBytes)}${files}${tests}${branch}${evidenceSnippet(parsed.evidence, 220)}`\n }\n if (kind === 'error') return `${at} error ${String(parsed.error ?? '')}`\n return `${at} ${kind}`\n } catch {\n return line\n }\n}\n\n/** One-line the settle evidence / verify tail a worker event carries so the\n * failure is legible in the tail view (the full block stays in the ndjson). */\nfunction evidenceSnippet(value: unknown, max: number): string {\n if (typeof value !== 'string') return ''\n const oneLine = value.replace(/\\s+/g, ' ').trim()\n return oneLine ? ` :: ${compact(oneLine, max)}` : ''\n}\n\nfunction histogram(\n values: readonly number[],\n count: number,\n): Array<{ min: number; max: number; count: number }> {\n const min = Math.min(...values)\n const max = Math.max(...values)\n if (min === max) return [{ min, max, count: values.length }]\n const step = (max - min) / count\n return Array.from({ length: count }, (_, index) => {\n const low = min + step * index\n const high = index === count - 1 ? max : min + step * (index + 1)\n const binCount = values.filter(\n (value) => value >= low && (index === count - 1 ? value <= high : value < high),\n ).length\n return { min: low, max: high, count: binCount }\n }).filter((bin) => bin.count > 0)\n}\n\nfunction bar(\n value: number,\n max: number,\n width: number,\n ch: string,\n color: boolean,\n colorName: keyof typeof colors,\n): string {\n const filled = Math.max(0, Math.min(width, Math.round((value / Math.max(max, 0.000001)) * width)))\n const text = ch.repeat(filled).padEnd(width, '.')\n return paint(text, colorName, color)\n}\n\nfunction stackedTokenBar(\n input: number,\n output: number,\n max: number,\n width: number,\n color: boolean,\n): string {\n const inputWidth = Math.round((input / Math.max(max, 1)) * width)\n const outputWidth = Math.round((output / Math.max(max, 1)) * width)\n const clippedInput = Math.min(width, inputWidth)\n const clippedOutput = Math.min(width - clippedInput, outputWidth)\n const rest = Math.max(0, width - clippedInput - clippedOutput)\n return `${paint('#'.repeat(clippedInput), 'cyan', color)}${paint('+'.repeat(clippedOutput), 'green', color)}${'.'.repeat(rest)}`\n}\n\nfunction sectionTitle(title: string, focused: boolean, color: boolean): string {\n const text = focused ? `[${title}]` : title\n return paint(text, focused ? 'cyan' : 'bold', color)\n}\n\nfunction statusText(status: string, color: boolean): string {\n if (['completed', 'done', 'delivered', 'valid'].includes(status))\n return paint(status.toUpperCase(), 'green', color)\n if (['failed', 'down', 'cancelled', 'invalid', 'error'].includes(status))\n return paint(status.toUpperCase(), 'red', color)\n if (['running', 'spawned', 'settled'].includes(status))\n return paint(status.toUpperCase(), 'yellow', color)\n return paint(status.toUpperCase(), 'white', color)\n}\n\nfunction selectEntity<T extends { readonly id: string }>(\n entities: readonly T[],\n requested: string | undefined,\n): T | undefined {\n return (requested ? entities.find((entity) => entity.id === requested) : undefined) ?? entities[0]\n}\n\nfunction formatClock(value: string): string {\n const parsed = parseTime(value)\n if (parsed === undefined) return '--:--:--'\n return new Date(parsed).toISOString().slice(11, 19)\n}\n\nfunction formatMoney(value: number, known = true): string {\n if (!known) return value === 0 ? 'unknown' : `≥${formatMoney(value)} + unknown`\n if (value === 0) return '$0'\n if (Math.abs(value) < 0.01) return `$${value.toFixed(4)}`\n return `$${value.toFixed(2)}`\n}\n\nfunction formatTokens(value: number, known = true): string {\n if (!known) return value === 0 ? '?' : `≥${formatTokens(value)}?`\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`\n return `${Math.round(value)}`\n}\n\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '0s'\n if (ms < 1000) return `${Math.round(ms)}ms`\n const seconds = ms / 1000\n if (seconds < 60) return `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`\n const minutes = seconds / 60\n if (minutes < 60) return `${minutes.toFixed(minutes < 10 ? 1 : 0)}m`\n return `${(minutes / 60).toFixed(1)}h`\n}\n\nfunction compact(value: string, width: number): string {\n if (width <= 1) return ''\n if (value.length <= width) return value\n return `${value.slice(0, width - 1)}~`\n}\n\nfunction pad(value: string, width: number): string {\n const visible = visibleLength(value)\n if (visible >= width) return fitAnsi(value, width)\n return `${value}${' '.repeat(width - visible)}`\n}\n\nfunction rule(width: number, color: boolean): string {\n return paint('-'.repeat(width), 'dim', color)\n}\n\nfunction paint(\n value: string,\n colorName: keyof typeof colors | undefined,\n enabled: boolean,\n): string {\n if (!enabled || !colorName) return value\n return `${colors[colorName]}${value}${colors.reset}`\n}\n\nfunction visibleLength(value: string): number {\n return stripAnsi(value).length\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(ansiPattern, '')\n}\n\nfunction fitAnsi(value: string, width: number): string {\n if (visibleLength(value) <= width) return value\n let out = ''\n let visible = 0\n let cursor = 0\n // An escape sequence must be copied whole and counted as zero visible columns; truncating\n // inside one would emit a half-sequence the terminal interprets against the next line.\n for (const match of value.matchAll(ansiPattern)) {\n const text = value.slice(cursor, match.index)\n const remaining = width - 1 - visible\n out += text.slice(0, remaining)\n visible += Math.min(text.length, remaining)\n if (text.length > remaining) break\n out += match[0]\n cursor = match.index + match[0].length\n }\n if (visible < width - 1) out += value.slice(cursor, cursor + width - 1 - visible)\n out += '~'\n if (out.includes('\\x1b[') && !out.endsWith(colors.reset)) out += colors.reset\n return out\n}\n","/**\n * The interactive side of the supervisor-run TUI: a keypress/mouse loop over the frames\n * `./top-frame` renders, plus the operator controls that write back to the run — steer a live\n * worker, cancel one worker, and request cancellation of a whole run.\n *\n * The controls go through the owned run layout: steers via `writeWorkerSteer` (the durable inbox\n * append) and worker cancellation via `cancelWorker` (the acknowledged operation the runtime's\n * turn loop applies). Run-level cancellation targets the ROOT, which has no acknowledged runtime\n * path yet for a non-retained tree — it stays a `cancel.request.json` write inside the run\n * directory for a host process to honor. Nothing here joins a path from the workspace root.\n *\n * Extracted from the `loops` repo (`src/top.ts`). The module-level singletons are the origin's\n * shape and are kept: this drives one terminal, and `runTopApp` is its one entry point.\n *\n * @experimental\n */\n\nimport { randomUUID } from 'node:crypto'\nimport { hostname, userInfo } from 'node:os'\nimport { resolve } from 'node:path'\nimport { emitKeypressEvents } from 'node:readline'\nimport { cancelRun } from '../runtime/supervise/run-cancellation'\nimport { cancelWorker, writeWorkerSteer } from '../runtime/supervise/run-layout'\nimport { type RenderTarget, renderTopFrameWithLayout } from './top-frame'\nimport { loadTopSnapshot, type TopSnapshot } from './top-snapshot'\n\ninterface UiState {\n root: string\n color: boolean\n focus: 'supervisors' | 'workers'\n mode: 'overview' | 'detail' | 'log'\n selectedSupervisorId: string | undefined\n selectedWorkerId: string | undefined\n notice: string | undefined\n steerInput: {\n active: boolean\n value: string\n }\n}\n\n/** @experimental How the app was invoked. Defaults read `process.argv` / `process.cwd()`. */\ninterface TopAppOptions {\n readonly argv?: readonly string[]\n readonly cwd?: string\n}\n\nlet state: UiState = initialState([], process.cwd())\nlet snapshot: TopSnapshot = {\n root: state.root,\n generatedAt: 0,\n supervisors: [],\n completeness: 'complete',\n diagnostics: [],\n discovered: 0,\n loaded: 0,\n}\nlet targets: RenderTarget[] = []\nlet timer: NodeJS.Timeout | undefined\n\n/**\n * Render exactly one frame and return it. This is the non-interactive path — `--once`, a pipe, a\n * test — so it never touches raw mode, the alternate screen, or `process.exit`.\n */\nfunction renderTopOnce(options: TopAppOptions = {}): string {\n const args = [...(options.argv ?? process.argv.slice(2))]\n state = initialState(args, options.cwd ?? process.cwd())\n snapshot = loadTopSnapshot(state.root)\n clampSelection()\n return renderTopFrameWithLayout(snapshot, {\n color: state.color,\n width: process.stdout.columns ?? 128,\n focus: state.focus,\n mode: state.mode,\n ...(state.selectedSupervisorId ? { selectedSupervisorId: state.selectedSupervisorId } : {}),\n ...(state.selectedWorkerId ? { selectedWorkerId: state.selectedWorkerId } : {}),\n steerInput: renderSteerInputState(),\n }).frame\n}\n\n/**\n * Run the TUI. With a TTY on both ends and no `--once` this takes over the terminal until `q`;\n * otherwise it writes a single frame to stdout and returns.\n */\nexport function runTopApp(options: TopAppOptions = {}): void {\n const args = [...(options.argv ?? process.argv.slice(2))]\n if (!process.stdout.isTTY || !process.stdin.isTTY || args.includes('--once')) {\n process.stdout.write(renderTopOnce(options))\n return\n }\n state = initialState(args, options.cwd ?? process.cwd())\n snapshot = loadTopSnapshot(state.root)\n start()\n}\n\nfunction initialState(args: readonly string[], cwd: string): UiState {\n const rootArg = args.find((arg) => !arg.startsWith('-'))\n return {\n root: resolve(rootArg ?? cwd),\n color: Boolean(process.stdout.isTTY) && !args.includes('--no-color'),\n focus: args.includes('--detail') ? 'workers' : 'supervisors',\n mode: args.includes('--log') ? 'log' : args.includes('--detail') ? 'detail' : 'overview',\n selectedSupervisorId: undefined,\n selectedWorkerId: undefined,\n notice: undefined,\n steerInput: { active: false, value: '' },\n }\n}\n\nfunction start(): void {\n process.stdout.write('\\x1b[?1049h\\x1b[?25l\\x1b[?1000h\\x1b[?1006h')\n emitKeypressEvents(process.stdin)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on('keypress', onKey)\n process.stdin.on('data', onData)\n process.on('SIGINT', stop)\n draw()\n timer = setInterval(draw, 1000)\n}\n\nfunction stop(): void {\n if (timer) clearInterval(timer)\n process.stdin.setRawMode(false)\n process.stdout.write('\\x1b[?1000l\\x1b[?1006l\\x1b[?25h\\x1b[?1049l')\n process.exit(0)\n}\n\nfunction draw(): void {\n snapshot = loadTopSnapshot(state.root)\n clampSelection()\n const rendered = renderTopFrameWithLayout(snapshot, {\n width: process.stdout.columns ?? 128,\n height: process.stdout.rows ?? 42,\n color: state.color,\n focus: state.focus,\n mode: state.mode,\n ...(state.notice ? { notice: state.notice } : {}),\n ...(state.selectedSupervisorId ? { selectedSupervisorId: state.selectedSupervisorId } : {}),\n ...(state.selectedWorkerId ? { selectedWorkerId: state.selectedWorkerId } : {}),\n steerInput: renderSteerInputState(),\n })\n targets = rendered.targets\n process.stdout.write(`\\x1b[2J\\x1b[H${rendered.frame}`)\n}\n\nfunction onKey(str: string, key: { name?: string; ctrl?: boolean }): void {\n state.notice = undefined\n if (key.ctrl && key.name === 'c') stop()\n if (state.steerInput.active) {\n handleSteerInput(str, key)\n draw()\n return\n }\n if (key.name === 'q' || key.name === 'escape') stop()\n if (key.name === 'tab') {\n state.focus = state.focus === 'supervisors' ? 'workers' : 'supervisors'\n } else if (key.name === 'up') {\n moveSelection(-1)\n } else if (key.name === 'down') {\n moveSelection(1)\n } else if (key.name === 'left') {\n moveSupervisor(-1)\n } else if (key.name === 'right') {\n moveSupervisor(1)\n } else if (key.name === 'return') {\n state.mode = 'detail'\n state.focus = 'workers'\n } else if (key.name === 'o') {\n state.mode = 'overview'\n } else if (key.name === 'l') {\n state.mode = 'log'\n } else if (key.name === 's') {\n startSteerInput()\n } else if (key.name === 'c') {\n requestCancel()\n }\n draw()\n}\n\nfunction handleSteerInput(str: string, key: { name?: string; ctrl?: boolean }): void {\n if (key.name === 'escape') {\n state.steerInput = { active: false, value: '' }\n return\n }\n if (key.name === 'return') {\n submitSteerInput()\n return\n }\n if (key.name === 'backspace') {\n state.steerInput.value = state.steerInput.value.slice(0, -1)\n return\n }\n if (key.ctrl && key.name === 'u') {\n state.steerInput.value = ''\n return\n }\n if (\n key.ctrl ||\n key.name === 'tab' ||\n key.name === 'up' ||\n key.name === 'down' ||\n key.name === 'left' ||\n key.name === 'right'\n ) {\n return\n }\n if (!str || str === '\\r' || str === '\\n') return\n if ([...str].every((char) => char >= ' ' && char !== '\\x7f')) state.steerInput.value += str\n}\n\nfunction onData(data: Buffer): void {\n const click = parseMouse(data.toString('utf8'))\n if (!click) return\n const target = targets.find((candidate) => candidate.row === click.row)\n if (!target) return\n state.notice = undefined\n if (target.kind === 'supervisor') {\n state.focus = 'supervisors'\n state.selectedSupervisorId = target.id\n state.selectedWorkerId = undefined\n } else {\n state.focus = 'workers'\n state.mode = 'detail'\n state.selectedSupervisorId = target.supervisorId\n state.selectedWorkerId = target.id\n }\n draw()\n}\n\nfunction startSteerInput(): void {\n state.mode = 'detail'\n state.focus = 'workers'\n if (!selectedSupervisor()) {\n state.notice = 'no supervisor selected'\n return\n }\n if (!selectedWorker()) {\n state.notice = 'no worker selected'\n return\n }\n state.steerInput = { active: true, value: '' }\n}\n\nfunction submitSteerInput(): void {\n const supervisor = selectedSupervisor()\n const worker = selectedWorker()\n const message = state.steerInput.value\n state.steerInput = { active: false, value: '' }\n if (!supervisor) {\n state.notice = 'no supervisor selected'\n return\n }\n if (!worker) {\n state.notice = 'no worker selected'\n return\n }\n try {\n // The exact worker id routes this operation to the one manager that owns the child.\n const written = writeWorkerSteer(state.root, supervisor.id, worker.id, {\n operationId: randomUUID(),\n message,\n source: 'agent-runtime-top',\n })\n state.notice = `steer queued for ${supervisor.id}/${worker.label} (op ${written.request.operationId})`\n } catch (err) {\n state.notice = `steer failed: ${err instanceof Error ? err.message : String(err)}`\n }\n}\n\nfunction parseMouse(raw: string): { col: number; row: number } | undefined {\n // ESC is the literal first byte of an SGR mouse report; matching the control character IS the\n // parse, so the control-character rule does not apply to a terminal escape decoder.\n // biome-ignore lint/suspicious/noControlCharactersInRegex: SGR mouse reports begin with ESC\n const match = /\\x1b\\[<(\\d+);(\\d+);(\\d+)([mM])/.exec(raw)\n if (match?.[4] !== 'M') return undefined\n const col = Number(match[2])\n const row = Number(match[3])\n if (!Number.isFinite(col) || !Number.isFinite(row)) return undefined\n return { col: col - 1, row: row - 1 }\n}\n\nfunction moveSelection(delta: number): void {\n if (state.focus === 'supervisors') {\n moveSupervisor(delta)\n return\n }\n const supervisor = selectedSupervisor()\n if (!supervisor || supervisor.workers.length === 0) return\n const current = Math.max(\n 0,\n supervisor.workers.findIndex((worker) => worker.id === state.selectedWorkerId),\n )\n const next = wrap(current + delta, supervisor.workers.length)\n const worker = supervisor.workers[next]\n if (worker) state.selectedWorkerId = worker.id\n}\n\nfunction moveSupervisor(delta: number): void {\n if (snapshot.supervisors.length === 0) return\n const current = Math.max(\n 0,\n snapshot.supervisors.findIndex((supervisor) => supervisor.id === state.selectedSupervisorId),\n )\n const next = wrap(current + delta, snapshot.supervisors.length)\n const supervisor = snapshot.supervisors[next]\n if (!supervisor) return\n state.selectedSupervisorId = supervisor.id\n state.selectedWorkerId = supervisor.workers[0]?.id\n}\n\nfunction clampSelection(): void {\n if (snapshot.supervisors.length === 0) {\n state.selectedSupervisorId = undefined\n state.selectedWorkerId = undefined\n return\n }\n const supervisor = selectedSupervisor() ?? snapshot.supervisors[0]\n if (!supervisor) return\n state.selectedSupervisorId = supervisor.id\n const worker =\n supervisor.workers.find((candidate) => candidate.id === state.selectedWorkerId) ??\n supervisor.workers[0]\n state.selectedWorkerId = worker?.id\n}\n\nfunction selectedSupervisor(): TopSnapshot['supervisors'][number] | undefined {\n return snapshot.supervisors.find((supervisor) => supervisor.id === state.selectedSupervisorId)\n}\n\nfunction selectedWorker(): TopSnapshot['supervisors'][number]['workers'][number] | undefined {\n const supervisor = selectedSupervisor()\n return supervisor?.workers.find((worker) => worker.id === state.selectedWorkerId)\n}\n\nfunction renderSteerInputState(): { active: boolean; value: string; workerLabel?: string } {\n const worker = selectedWorker()\n return {\n active: state.steerInput.active,\n value: state.steerInput.value,\n ...(worker?.label ? { workerLabel: worker.label } : {}),\n }\n}\n\nfunction requestCancel(): void {\n const supervisor = selectedSupervisor()\n if (!supervisor) {\n state.notice = 'no supervisor selected'\n return\n }\n if (supervisor.status !== 'running') {\n state.notice = `${supervisor.id} is ${supervisor.status}; no cancel request written`\n return\n }\n // Worker focus cancels ONE worker through the acknowledged runtime path: the request lands in\n // the run layout's cancellation inbox, the run's own turn loop applies the abort to exactly\n // that worker's subtree, and the acknowledgement records what it proved.\n const worker = state.focus === 'workers' ? selectedWorker() : undefined\n if (worker) {\n if (worker.status !== 'running') {\n state.notice = `${worker.label} is ${worker.status}; nothing to cancel`\n return\n }\n // The request names the exact node id, so it routes to the manager that owns the worker at\n // ANY depth — the owning manager's turn loop applies the abort to exactly that subtree.\n try {\n const record = cancelWorker(supervisor.stateDir, worker.id, randomUUID(), {\n reason: 'operator requested cancel from TUI',\n source: 'agent-runtime-top',\n })\n state.notice =\n record.effect === 'unknown'\n ? `cancel queued for ${supervisor.id}/${worker.label} (op ${record.operationId}); awaiting runtime acknowledgement`\n : `cancel ${record.effect} for ${supervisor.id}/${worker.label} (op ${record.operationId})`\n } catch (err) {\n state.notice = `cancel request failed: ${err instanceof Error ? err.message : String(err)}`\n }\n return\n }\n // Supervisor focus cancels the WHOLE run through the same acknowledged contract: the request\n // lands in the run layout, the run's root manager aborts the whole tree through the one cascade\n // controller it already has, and `supervise()` records the terminal effect.\n try {\n const record = cancelRun(supervisor.stateDir, randomUUID(), {\n reason: 'operator requested cancel from TUI',\n source: 'agent-runtime-top',\n operator: `${userInfo().username}@${hostname()}`,\n })\n state.notice =\n record.effect === 'unknown'\n ? `run cancel queued for ${supervisor.id} (op ${record.operationId}); awaiting runtime acknowledgement`\n : `run cancel ${record.effect} for ${supervisor.id} (op ${record.operationId})`\n } catch (err) {\n state.notice = `cancel request failed: ${err instanceof Error ? err.message : String(err)}`\n }\n}\n\nfunction wrap(value: number, size: number): number {\n return ((value % size) + size) % size\n}\n","#!/usr/bin/env node\n\n/**\n * `agent-runtime-top` — watch the supervisor runs of one workspace.\n *\n * agent-runtime-top [root] [--once] [--no-color] [--detail] [--log]\n *\n * `root` is the workspace whose `.agent/supervisor/` runs are shown; it defaults to the current\n * directory. With a TTY on both ends the view refreshes every second and takes the keys it prints\n * in its header; otherwise (a pipe, `--once`) it writes one frame and exits.\n *\n * @experimental\n */\n\nimport { runTopApp } from './top-app'\nimport { runTopWeb } from './top-web'\n\nif (process.argv.includes('--web')) await runTopWeb(process.argv.slice(2))\nelse runTopApp()\n"],"mappings":"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"}
|
package/dist/tui/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Hr as provisionSupervisor, L as Spend, M as Budget, Wu as PursuitProjection } from "../types-
|
|
1
|
+
import { Hr as provisionSupervisor, L as Spend, M as Budget, Wu as PursuitProjection } from "../types-BfnQq-_k.js";
|
|
2
2
|
interface TopSnapshot {
|
|
3
3
|
readonly root: string;
|
|
4
4
|
readonly generatedAt: number;
|
|
@@ -145,6 +145,26 @@ export declare function loadTopSnapshot(rootDir: string, now?: number): TopSnaps
|
|
|
145
145
|
export declare function loadTopSnapshot(rootDir: string, options: {
|
|
146
146
|
runDir: string;
|
|
147
147
|
now?: number;
|
|
148
|
+
format?: 'workflow' | 'journal';
|
|
148
149
|
}): Promise<TopSnapshot>;
|
|
149
|
-
|
|
150
|
+
/** A reconnect always receives current truth; deltas replace changed roots atomically. */
|
|
151
|
+
interface TopSnapshotFrame {
|
|
152
|
+
readonly sequence: number;
|
|
153
|
+
readonly observedAt: number;
|
|
154
|
+
readonly reset: boolean;
|
|
155
|
+
readonly snapshots: readonly TopSnapshot[];
|
|
156
|
+
}
|
|
157
|
+
interface TopWebOptions {
|
|
158
|
+
readonly roots: readonly string[];
|
|
159
|
+
/** Defaults to the installed agent-record browser asset export. */
|
|
160
|
+
readonly assets?: string;
|
|
161
|
+
readonly host?: string;
|
|
162
|
+
readonly port?: number;
|
|
163
|
+
}
|
|
164
|
+
/** Read-only web transport over the same snapshots as the terminal. No execution or writes. */
|
|
165
|
+
export declare function serveTopWeb(options: TopWebOptions): Promise<{
|
|
166
|
+
url: string;
|
|
167
|
+
close: () => Promise<void>;
|
|
168
|
+
}>;
|
|
169
|
+
export { type BudgetStats, type Distribution, type SpendStats, type SupervisorTotals, type SupervisorView, type TopJournalEvent, type TopSnapshot, type TopSnapshotCompleteness, type TopSnapshotDiagnostic, type TopSnapshotDiagnosticReason, type TopSnapshotDiagnosticSource, type TopSnapshotFrame, type TopWebOptions, type WorkerView, provisionSupervisor };
|
|
150
170
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/tui/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as provisionSupervisor } from "../provision-supervisor-
|
|
2
|
-
import {
|
|
3
|
-
export { loadTopSnapshot, provisionSupervisor };
|
|
1
|
+
import { t as provisionSupervisor } from "../provision-supervisor-BWEeWag1.js";
|
|
2
|
+
import { i as loadTopSnapshot, n as serveTopWeb } from "../top-web-CkXPPXjI.js";
|
|
3
|
+
export { loadTopSnapshot, provisionSupervisor, serveTopWeb };
|