@tangle-network/agent-runtime 2.3.8 → 2.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/{activation-Cks1h3Nw.d.ts → activation-B8dLwJj6.d.ts} +2 -2
  2. package/dist/{activation-CDPbi8JA.js → activation-BzNeFJDB.js} +4 -4
  3. package/dist/{activation-CDPbi8JA.js.map → activation-BzNeFJDB.js.map} +1 -1
  4. package/dist/agent.d.ts +1 -1
  5. package/dist/agent.js +3 -3
  6. package/dist/{bundle-PDYNXIEf.js → bundle-DhV73H6U.js} +2 -2
  7. package/dist/{bundle-PDYNXIEf.js.map → bundle-DhV73H6U.js.map} +1 -1
  8. package/dist/candidate-execution/index.js +4 -4
  9. package/dist/{coordination-manager-DNrb7zMg.js → coordination-manager-BluavEgY.js} +42 -152
  10. package/dist/coordination-manager-BluavEgY.js.map +1 -0
  11. package/dist/{coordination-map-routing-CUvwHAtv.js → coordination-map-routing-BllzcZov.js} +5 -2
  12. package/dist/coordination-map-routing-BllzcZov.js.map +1 -0
  13. package/dist/{delegate-CHdWyLz9.js → delegate-CYWL0MrO.js} +2 -2
  14. package/dist/{delegate-CHdWyLz9.js.map → delegate-CYWL0MrO.js.map} +1 -1
  15. package/dist/durable-file-DstVeHcj.js.map +1 -1
  16. package/dist/durable.d.ts +1 -1
  17. package/dist/durable.js +42 -202
  18. package/dist/durable.js.map +1 -1
  19. package/dist/{graph-oOdDpXFH.js → graph-ByNMeS0j.js} +8 -13
  20. package/dist/graph-ByNMeS0j.js.map +1 -0
  21. package/dist/{graph-registry-72DlMnUl.js → graph-registry-D6y6zffC.js} +2 -2
  22. package/dist/{graph-registry-72DlMnUl.js.map → graph-registry-D6y6zffC.js.map} +1 -1
  23. package/dist/{graph-registry-CAX15LO6.js → graph-registry-rV9mwxQO.js} +1 -1
  24. package/dist/{improve-BCjhWbVk.js → improve-D9A79N5a.js} +7 -7
  25. package/dist/{improve-BCjhWbVk.js.map → improve-D9A79N5a.js.map} +1 -1
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.js +10 -11
  28. package/dist/index.js.map +1 -1
  29. package/dist/intelligence.d.ts +2 -2
  30. package/dist/intelligence.js +7 -6
  31. package/dist/intelligence.js.map +1 -1
  32. package/dist/kernel.d.ts +1 -1
  33. package/dist/kernel.js +12 -12
  34. package/dist/{loop-runner-Bkvx4Saw.d.ts → loop-runner-D9fuOb69.d.ts} +2 -2
  35. package/dist/{loop-runner-Cy1K7f-A.js → loop-runner-DiMfhI_z.js} +2 -2
  36. package/dist/{loop-runner-Cy1K7f-A.js.map → loop-runner-DiMfhI_z.js.map} +1 -1
  37. package/dist/loop-runner-bin.d.ts +1 -1
  38. package/dist/loop-runner-bin.js +1 -1
  39. package/dist/mcp/bin.js +3 -3
  40. package/dist/mcp/index.d.ts +1 -1
  41. package/dist/mcp/index.js +6 -5
  42. package/dist/mcp/index.js.map +1 -1
  43. package/dist/{prepare-Bv6X2Wnx.js → prepare-DrHOZFJy.js} +3 -4
  44. package/dist/{prepare-Bv6X2Wnx.js.map → prepare-DrHOZFJy.js.map} +1 -1
  45. package/dist/{profile-Dir2A1_2.js → profile-BzzmKuIX.js} +3 -2
  46. package/dist/{profile-Dir2A1_2.js.map → profile-BzzmKuIX.js.map} +1 -1
  47. package/dist/profiles.d.ts +1 -1
  48. package/dist/{provision-supervisor-Pd95wA1X.js → provision-supervisor-DP5U58V4.js} +13 -5
  49. package/dist/provision-supervisor-DP5U58V4.js.map +1 -0
  50. package/dist/{run-cancellation-CzQZUlHr.js → run-cancellation-BxoFCpJ_.js} +208 -5
  51. package/dist/run-cancellation-BxoFCpJ_.js.map +1 -0
  52. package/dist/{runtime-CWZ9q7lU.js → runtime-DS5AgACg.js} +15 -16
  53. package/dist/{runtime-CWZ9q7lU.js.map → runtime-DS5AgACg.js.map} +1 -1
  54. package/dist/sandbox-profile-compat-DxegoIK5.js +65 -0
  55. package/dist/sandbox-profile-compat-DxegoIK5.js.map +1 -0
  56. package/dist/scope-DRaBilEX.js +16734 -0
  57. package/dist/scope-DRaBilEX.js.map +1 -0
  58. package/dist/{search-executor-CMPbMvpr.js → search-executor-DLo_9jUv.js} +4 -5
  59. package/dist/{search-executor-CMPbMvpr.js.map → search-executor-DLo_9jUv.js.map} +1 -1
  60. package/dist/{server-DyTbsg7n.js → server-DfHV4ajw.js} +4 -4
  61. package/dist/{server-DyTbsg7n.js.map → server-DfHV4ajw.js.map} +1 -1
  62. package/dist/{structural-rollout-BUqZsIhX.js → structural-rollout-BIjjZ_XX.js} +4 -5
  63. package/dist/{structural-rollout-BUqZsIhX.js.map → structural-rollout-BIjjZ_XX.js.map} +1 -1
  64. package/dist/{supervise-D1eYde7p.js → supervise-6BCQ73Xa.js} +34 -136
  65. package/dist/supervise-6BCQ73Xa.js.map +1 -0
  66. package/dist/{supervision-discovery-DmDWHwLu.js → supervision-discovery-Da5zebY2.js} +130 -5
  67. package/dist/supervision-discovery-Da5zebY2.js.map +1 -0
  68. package/dist/{supervisor-B8beIEqH.js → supervisor-3JHXy3tz.js} +7336 -19680
  69. package/dist/supervisor-3JHXy3tz.js.map +1 -0
  70. package/dist/testing.d.ts +1 -1
  71. package/dist/testing.js +13 -13
  72. package/dist/{top-web-CUDlOKu0.js → top-web-DK6lTMHG.js} +89 -64
  73. package/dist/top-web-DK6lTMHG.js.map +1 -0
  74. package/dist/tui/bin.js +3 -3
  75. package/dist/tui/index.d.ts +14 -8
  76. package/dist/tui/index.js +2 -2
  77. package/dist/{types-DzS0kBeK.d.ts → types-S3RbyJ4x.d.ts} +51 -65
  78. package/dist/{sandbox-profile-compat-DRiz9kME.js → workspace-streams-Dep2L6XD.js} +617 -57
  79. package/dist/workspace-streams-Dep2L6XD.js.map +1 -0
  80. package/package.json +2 -2
  81. package/dist/coordination-manager-DNrb7zMg.js.map +0 -1
  82. package/dist/coordination-map-routing-CUvwHAtv.js.map +0 -1
  83. package/dist/graph-oOdDpXFH.js.map +0 -1
  84. package/dist/provision-supervisor-Pd95wA1X.js.map +0 -1
  85. package/dist/root-stream-Bsh5WFcg.js +0 -4252
  86. package/dist/root-stream-Bsh5WFcg.js.map +0 -1
  87. package/dist/run-cancellation-CzQZUlHr.js.map +0 -1
  88. package/dist/sandbox-profile-compat-DRiz9kME.js.map +0 -1
  89. package/dist/supervise-D1eYde7p.js.map +0 -1
  90. package/dist/supervision-discovery-DmDWHwLu.js.map +0 -1
  91. package/dist/supervisor-B8beIEqH.js.map +0 -1
  92. package/dist/top-web-CUDlOKu0.js.map +0 -1
  93. package/dist/util-BX20UJ9X.js +0 -624
  94. package/dist/util-BX20UJ9X.js.map +0 -1
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Bv as DecideGate, By as McpToolDescriptor, Ch as ToolLoopCallContext, Ct as SuperviseProfileEntry, Dh as ToolLoopMessageRecord, Eh as ToolLoopCompactionOptions, Ip as PriorCoordination, Jv as ChildQuestionInbox, M as Budget, Nd as superviseWithTestBrain, Np as CoordinationDeliveryEvidence, Nv as CoordinationEvent, Oh as ToolLoopToolCall, Om as Inbox, Qf as ManagerWakePolicy, Rd as SuperviseTestOptions, Rf as supervisorAgentWithTestBrain, Sp as SupervisorFinalizer, Uy as BusRecord, Wv as RouteFlow, Yg as DeliverableSpec, Yv as EscalateQuestion, Zi as ResultBlobStore, _t as PeerAuditAccess, _y as MapOnSettleRoute, ap as StopRule, bt as SpawnPreflightContext, fd as runGraphWithTestBrain, ft as CoordinationTools, gt as MakeWorkerAgent, ht as GraphSubtasks, ld as RunGraphTestOptions, mt as GraphSubtaskPreparation, qf as SupervisorAgentTestDeps, rb as AnalyzeOnSettleRoute, sy as AuthorizeDownMessage, tb as AnalystRegistry, tm as SpawnResourceReader, ua as Agent, up as RunCancelRequest, uy as ContinuityMode, wh as ToolLoopChat, xt as SpawnRefusal, yh as RouterResponseReceipt, yt as SpawnPreflight, zv as WorkerWatchOptions, zx as HarnessTranscriptCapture } from "./types-DzS0kBeK.js";
1
+ import { Bv as DecideGate, Bx as HarnessTranscriptCapture, Ch as ToolLoopCallContext, Ct as SuperviseProfileEntry, Dh as ToolLoopMessageRecord, Eh as ToolLoopCompactionOptions, Ip as PriorCoordination, M as Budget, Nd as superviseWithTestBrain, Np as CoordinationDeliveryEvidence, Nv as CoordinationEvent, Oh as ToolLoopToolCall, Om as Inbox, Qf as ManagerWakePolicy, Rd as SuperviseTestOptions, Rf as supervisorAgentWithTestBrain, Sp as SupervisorFinalizer, Vy as McpToolDescriptor, Wv as RouteFlow, Wy as BusRecord, Xv as EscalateQuestion, Yg as DeliverableSpec, Yv as ChildQuestionInbox, Zi as ResultBlobStore, _t as PeerAuditAccess, ap as StopRule, bt as SpawnPreflightContext, cy as AuthorizeDownMessage, dy as ContinuityMode, fd as runGraphWithTestBrain, ft as CoordinationTools, gt as MakeWorkerAgent, ht as GraphSubtasks, ib as AnalyzeOnSettleRoute, ld as RunGraphTestOptions, mt as GraphSubtaskPreparation, nb as AnalystRegistry, qf as SupervisorAgentTestDeps, tm as SpawnResourceReader, ua as Agent, up as RunCancelRequest, vy as MapOnSettleRoute, wh as ToolLoopChat, xt as SpawnRefusal, yh as RouterResponseReceipt, yt as SpawnPreflight, zv as WorkerWatchOptions } from "./types-S3RbyJ4x.js";
2
2
  import { AgentImprovementProposal, AgentProfile, AgentProfileImprovementMeasuredComparison, SandboxSizePreset } from "@tangle-network/agent-interface";
3
3
  /** What the brain returned for one turn, as the recorder keeps it. */
4
4
  interface RouterTranscriptReply {
package/dist/testing.js CHANGED
@@ -1,13 +1,13 @@
1
- import { P as canonicalCandidateDigest$1, R as immutableCandidateValue } from "./sandbox-profile-compat-DRiz9kME.js";
2
- import { c as verifyAgentImprovementProposal } from "./activation-CDPbi8JA.js";
3
- import { a as applyExactAgentProfileDiff, v as parseExactAgentProfile } from "./profile-Dir2A1_2.js";
4
- import { f as supervisorAgentWithTestBrain, r as superviseWithTestBrain, v as driverAgent } from "./supervise-D1eYde7p.js";
5
- import { r as runGraphWithTestBrain } from "./graph-oOdDpXFH.js";
1
+ import { I as immutableCandidateValue, M as canonicalCandidateDigest$1 } from "./workspace-streams-Dep2L6XD.js";
2
+ import { c as verifyAgentImprovementProposal } from "./activation-BzNeFJDB.js";
3
+ import { a as applyExactAgentProfileDiff, v as parseExactAgentProfile } from "./profile-BzzmKuIX.js";
4
+ import { f as supervisorAgentWithTestBrain, r as superviseWithTestBrain, v as driverAgent } from "./supervise-6BCQ73Xa.js";
5
+ import { r as runGraphWithTestBrain } from "./graph-ByNMeS0j.js";
6
6
  import { SANDBOX_SIZE_PRESET_NAMES, canonicalAgentProfileDigest } from "@tangle-network/agent-interface";
7
7
  // src/testing/fixtures/agent-improvement-proposal.json
8
8
  var agent_improvement_proposal_default = {
9
9
  changedSurfaces: ["prompt"],
10
- digest: "sha256:bc2730ed12d5b692b51ff04ab6f92b0a6c29bf774d0f4ad072ac57ffd3b1b529",
10
+ digest: "sha256:7b07c94be8c8ab0d1e4fd4e962ca3b3e93c9772526e210f100531da8ed101dde",
11
11
  evaluation: {
12
12
  "decision": {
13
13
  "contributingChecks": [
@@ -4578,7 +4578,7 @@ var agent_improvement_proposal_default = {
4578
4578
  ],
4579
4579
  "metadata": {
4580
4580
  "fixture": "agent-improvement-proposal",
4581
- "runtimeVersion": "2.3.8"
4581
+ "runtimeVersion": "2.3.11"
4582
4582
  },
4583
4583
  "objectives": [
4584
4584
  {
@@ -4689,8 +4689,8 @@ var agent_improvement_proposal_default = {
4689
4689
  "baselineContentHash": "sha256:5c21ee53e513fc604cb09754e21c392b24a424da0ef37dbf8f1ee4a8a0b08f09",
4690
4690
  "candidateContentHash": "sha256:60fcbb1c728194bd51d7d19cb732d1c3f1881dce7e0a6266b41c8b98cfd65693",
4691
4691
  "kind": "agent-eval-loop",
4692
- "recordDigest": "sha256:b659589da3f091ed34eed192410b09c50c83b71a1ee2570348f306850daebd43",
4693
- "runId": "agent-runtime-2.3.8-proposal-fixture",
4692
+ "recordDigest": "sha256:c4f9b13389fd4a6dc081648964f97fff48a3d8441ac07e0f5c0d9fe08929351e",
4693
+ "runId": "agent-runtime-2.3.11-proposal-fixture",
4694
4694
  "schema": "agent-candidate-experiment"
4695
4695
  }
4696
4696
  },
@@ -4713,12 +4713,12 @@ var agent_improvement_proposal_default = {
4713
4713
  }],
4714
4714
  kind: "agent-improvement-proposal",
4715
4715
  proposedAt: "2026-07-10T01:00:00.000Z",
4716
- runId: "agent-runtime-2.3.8-proposal-fixture"
4716
+ runId: "agent-runtime-2.3.11-proposal-fixture"
4717
4717
  };
4718
4718
  // src/testing/fixtures/agent-profile-improvement-proposal.json
4719
4719
  var agent_profile_improvement_proposal_default = {
4720
4720
  changedSurfaces: ["prompt", "skills"],
4721
- digest: "sha256:7f128a6cc0c0ff12cf25fe766eca49dae02fccd3a54f6f614a8e7b56be536a8c",
4721
+ digest: "sha256:d0e75e81ba8d6be624096b3284dacb212099aeeaf274b42160382029321a6cbb",
4722
4722
  evaluation: {
4723
4723
  "decision": {
4724
4724
  "contributingChecks": [
@@ -6352,7 +6352,7 @@ var agent_profile_improvement_proposal_default = {
6352
6352
  ],
6353
6353
  "metadata": {
6354
6354
  "fixture": "agent-profile-improvement-proposal",
6355
- "runtimeVersion": "2.3.8"
6355
+ "runtimeVersion": "2.3.11"
6356
6356
  },
6357
6357
  "objectives": [
6358
6358
  {
@@ -6463,7 +6463,7 @@ var agent_profile_improvement_proposal_default = {
6463
6463
  "baselineContentHash": "sha256:21c495a37c418c10bde64fbaa188beddeed31f1f051ea60a6a6582a9ee0db704",
6464
6464
  "candidateContentHash": "sha256:103f77bc8481601eef1ad5fe6ba84a40dffabc3a44f421f8c8559121edab84e9",
6465
6465
  "kind": "agent-eval-loop",
6466
- "recordDigest": "sha256:86ea45557fffc96f18e005100effa8e9a8349885f757a38c43d3e3cafeeeb7c8",
6466
+ "recordDigest": "sha256:840509cdc41929d6a76d07be2d31c5d01aa5c2e39389b77f7c239077bff06f60",
6467
6467
  "runId": "profile-improvement-1",
6468
6468
  "schema": "agent-profile-improvement-experiment"
6469
6469
  }
@@ -1,6 +1,7 @@
1
- import { C as FileSpawnJournal, E as FileResultBlobStore, Jt as recordValue, M as FileObserverJournal, T as spawnJournalRecordEvents, _ as supervisorRunsRoot, h as safeWorkerFile, r as nodeStreamFile, t as ROOT_STREAM_FILE, u as legacySupervisorRunsRoot } from "./root-stream-Bsh5WFcg.js";
1
+ import { Ki as recordValue, L as FileSpawnJournal, d as legacySupervisorRunsRoot, dn as FileObserverJournal, g as safeWorkerFile, i as nodeStreamFile, n as ROOT_STREAM_FILE, qt as FileResultBlobStore, v as supervisorRunsRoot, z as spawnJournalRecordEvents } from "./scope-DRaBilEX.js";
2
2
  import { r as parseCommittedJsonLines } from "./jsonl-file-BBP9Dz9w.js";
3
- import { n as projectPursuit, t as discoverDurableSupervisionRun } from "./supervision-discovery-DmDWHwLu.js";
3
+ import { h as rootCoordinationOwner, v as FileCoordinationLog } from "./run-cancellation-BxoFCpJ_.js";
4
+ import { d as projectPursuit, o as readFailureRecord, s as readSettleRecord, t as discoverDurableSupervisionRun } from "./supervision-discovery-Da5zebY2.js";
4
5
  import { createRequire } from "node:module";
5
6
  import { isRecord } from "@tangle-network/agent-core";
6
7
  import { createHash } from "node:crypto";
@@ -248,6 +249,40 @@ function readRecordedEvents(file, maxLines = 8) {
248
249
  closeSync(fd);
249
250
  }
250
251
  }
252
+ /** Read native progress files with bounded, path-only diagnostics. */
253
+ function readWorkerEventTails(dir) {
254
+ const out = /* @__PURE__ */ new Map();
255
+ const diagnostics = [];
256
+ const read = (path, key = join(dir, path)) => {
257
+ try {
258
+ if (existsSync(join(dir, path))) out.set(key, readRecordedEvents(join(dir, path)));
259
+ } catch {
260
+ diagnostics.push({
261
+ source: "worker-tail",
262
+ path,
263
+ reason: "unreadable"
264
+ });
265
+ }
266
+ };
267
+ read(ROOT_STREAM_FILE);
268
+ for (const folder of ["workers", "streams"]) {
269
+ if (!existsSync(join(dir, folder))) continue;
270
+ try {
271
+ for (const entry of readdirSync(join(dir, folder))) if (folder === "workers" && entry.endsWith(".ndjson") && !entry.endsWith(".inbox.ndjson")) read(join(folder, entry), entry.slice(0, -7));
272
+ else if (folder === "streams" && entry.endsWith(".jsonl")) read(join(folder, entry));
273
+ } catch {
274
+ diagnostics.push({
275
+ source: "worker-tail",
276
+ path: folder,
277
+ reason: "unreadable"
278
+ });
279
+ }
280
+ }
281
+ return {
282
+ value: out,
283
+ diagnostics
284
+ };
285
+ }
251
286
  // src/tui/workflow-journal.ts
252
287
  /** Native workflows have no Runtime accounting. Translate recorded lifecycle only. */
253
288
  function workflowJournal(runDir, text) {
@@ -255,24 +290,20 @@ function workflowJournal(runDir, text) {
255
290
  const events = [];
256
291
  const tails = /* @__PURE__ */ new Map();
257
292
  let first;
258
- let last;
259
293
  for (const row of rows) {
260
294
  if (typeof row.agentId !== "string" || !/^[\w-]+$/.test(row.agentId)) continue;
261
295
  const id = row.agentId;
262
296
  if (row.type === "started") {
263
297
  const file = join(runDir, `agent-${id}.jsonl`);
264
298
  let start;
265
- let end;
266
299
  try {
267
300
  const recorded = readRecordedEvents(file);
268
301
  tails.set(id, recorded);
269
302
  if (recorded.firstActivityAt !== void 0) start = new Date(recorded.firstActivityAt).toISOString();
270
- if (recorded.activity.lastActivityAt !== void 0) end = new Date(recorded.activity.lastActivityAt).toISOString();
271
303
  } catch (error) {
272
304
  if (error.code !== "ENOENT") throw error;
273
305
  }
274
306
  if (start && (!first || start < first)) first = start;
275
- if (end && (!last || end > last)) last = end;
276
307
  events.push({
277
308
  kind: "spawned",
278
309
  id,
@@ -314,8 +345,7 @@ function workflowJournal(runDir, text) {
314
345
  id: basename(runDir),
315
346
  events,
316
347
  tails,
317
- first,
318
- last
348
+ first
319
349
  };
320
350
  }
321
351
  // src/tui/top-snapshot.ts
@@ -423,6 +453,7 @@ function topSnapshot(root, now, supervisors, diagnostics = [], discovered = 1, p
423
453
  async function loadDurableTopSnapshot(rootDir, runDir, now, observed = true) {
424
454
  const root = resolve(rootDir);
425
455
  let pursuit;
456
+ let observations = [];
426
457
  let source = observed ? "observer-journal" : "journal";
427
458
  let path = observed ? "observer.jsonl" : "spawn-journal.jsonl";
428
459
  try {
@@ -434,7 +465,8 @@ async function loadDurableTopSnapshot(rootDir, runDir, now, observed = true) {
434
465
  path,
435
466
  reason: "missing"
436
467
  }]);
437
- pursuit = projectPursuit(await journal.read());
468
+ observations = await journal.read();
469
+ pursuit = projectPursuit(observations);
438
470
  }
439
471
  source = "journal";
440
472
  path = ".";
@@ -443,35 +475,62 @@ async function loadDurableTopSnapshot(rootDir, runDir, now, observed = true) {
443
475
  const journal = new FileSpawnJournal(discovery.spawnJournalPath);
444
476
  const latest = new Map(pursuit?.runs.map((run) => [run.runId, run]));
445
477
  const ids = pursuit ? [...latest.keys()].filter((id) => !discovery.roots.some((parent) => id.startsWith(`${parent}/`))) : discovery.roots;
478
+ path = "result.json";
479
+ const settled = await readSettleRecord(discovery.runDir);
480
+ if (settled && !ids.includes(settled.tree.root)) throw new Error("settle root is not discovered");
481
+ path = "failure.json";
482
+ const failure = await readFailureRecord(discovery.runDir);
446
483
  const tails = readWorkerEventTails(discovery.runDir);
484
+ const log = new FileCoordinationLog(discovery.coordinationLogPath);
485
+ path = "coordination-log.jsonl";
447
486
  return topSnapshot(root, now, await Promise.all(ids.map(async (id) => {
448
487
  const accounting = latest.get(id);
449
488
  const binding = discovery.roots.indexOf(id);
450
489
  if (binding < 0 && existsSync(discovery.spawnJournalPath)) throw new Error("observer run has no discovered spawn root");
451
490
  const events = binding < 0 ? [] : await journal.loadTree(id) ?? [];
452
491
  const spawn = events.find((event) => event.kind === "spawned" && event.id === id);
453
- const budget = spawn?.kind === "spawned" ? spawn.budget?.maxTokens : void 0;
454
- const terminal = events.filter((event) => event.id === id && (event.kind === "settled" || event.kind === "cancelled")).at(-1);
492
+ const reopen = events.filter((event) => event.kind === "reopened" && event.id === id && event.budget !== void 0).at(-1);
493
+ const budget = reopen?.kind === "reopened" && reopen.budget ? reopen.budget.maxTokens : spawn?.kind === "spawned" ? spawn.budget?.maxTokens : void 0;
494
+ const boundary = observations.find((record) => record.sequence === accounting?.firstSequence)?.event?.payload;
495
+ const coordinationOffset = isRecord(boundary) ? boundary.coordinationOffset : void 0;
496
+ const outcome = settled?.tree.root === id ? settled.kind === "winner" ? { kind: "winner" } : {
497
+ kind: "no-winner",
498
+ reason: settled.reason
499
+ } : failure?.runId === id && accounting?.status === "down" ? {
500
+ kind: "failed",
501
+ reason: failure.error.message
502
+ } : void 0;
503
+ const prior = spawn?.kind === "spawned" && spawn.identity ? await log.load(id, rootCoordinationOwner(spawn.identity)) : void 0;
504
+ let lastRoute;
505
+ const records = prior?.records ?? [];
506
+ if (coordinationOffset !== void 0 && (typeof coordinationOffset !== "number" || !Number.isSafeInteger(coordinationOffset) || coordinationOffset < 0 || coordinationOffset > records.length)) throw new Error("invalid attempt coordination offset");
507
+ const offset = typeof coordinationOffset === "number" ? coordinationOffset : accounting?.attemptIndex === 0 ? 0 : records.length;
508
+ for (const { event } of records.slice(offset)) if (event.type === "route" && (event.route.kind === "stopped" || event.route.kind === "unrouted")) lastRoute = event.route;
455
509
  const startedAt = accounting ? new Date(accounting.firstObservedAt).toISOString() : discovery.rootsBegunAt[binding];
456
- const completedAt = accounting?.settledAt === void 0 ? terminal?.at : new Date(accounting.settledAt).toISOString();
457
510
  const view = buildSupervisorView({
458
511
  id,
459
512
  task: id,
460
513
  workspaceDir: root,
461
- status: accounting && accounting.status !== "running" ? accounting.status : terminal?.kind === "settled" ? terminal.status : terminal ? "cancelled" : "running",
514
+ status: accounting?.status ?? "running",
462
515
  budget: budget ?? 0,
463
516
  budgetKnown: budget !== void 0,
464
517
  ...startedAt == null ? {} : { startedAt },
465
- ...completedAt === void 0 ? {} : { completedAt }
518
+ ...accounting?.settledAt === void 0 ? {} : { completedAt: new Date(accounting.settledAt).toISOString() }
466
519
  }, discovery.runDir, events.filter(isSpawnEvent), accounting?.error ? [accounting.error] : [], now, tails.value, accounting);
467
- return accounting ? view : {
468
- ...view,
469
- totals: {
470
- ...view.totals,
471
- usdKnown: false,
472
- tokensKnown: false
473
- }
474
- };
520
+ if (!accounting) Object.assign(view.totals, {
521
+ usdKnown: false,
522
+ tokensKnown: false
523
+ });
524
+ if (outcome) Object.assign(view, {
525
+ outcome,
526
+ status: outcome.kind === "winner" ? "done" : outcome.kind
527
+ });
528
+ if (lastRoute) Object.assign(view, {
529
+ lastRoute,
530
+ reason: lastRoute.kind === "stopped" ? lastRoute.reason : lastRoute.detail
531
+ });
532
+ else if (outcome && "reason" in outcome) Object.assign(view, { reason: outcome.reason });
533
+ return view;
475
534
  })), [...!observed ? [{
476
535
  source: "observer-journal",
477
536
  path: "observer.jsonl",
@@ -495,9 +554,8 @@ function observerSpend(spend, gaps = []) {
495
554
  };
496
555
  }
497
556
  /** Current writer-owned journal first; retain the retired name for recorded runs. */
498
- const journalFileNames = ["spawn-journal.jsonl", "journal.jsonl"];
499
557
  function readJournal(eventDir) {
500
- const path = journalFileNames.find((candidate) => existsSync(join(eventDir, candidate)));
558
+ const path = ["spawn-journal.jsonl", "journal.jsonl"].find((candidate) => existsSync(join(eventDir, candidate)));
501
559
  if (!path) return {
502
560
  value: [],
503
561
  diagnostics: []
@@ -542,15 +600,15 @@ function retainedTranscript(event) {
542
600
  }
543
601
  /** The canonical spawn receipt owns the cause; the public journal view stays compatible. */
544
602
  function recordedReason(event) {
545
- const reason = event?.reason;
546
- return typeof reason === "string" ? reason : void 0;
603
+ return isRecord(event) && typeof event.reason === "string" ? event.reason : void 0;
547
604
  }
548
605
  function buildSupervisorView(state, stateDir, events, progressTail, now, workerEventTails = /* @__PURE__ */ new Map(), accounting) {
549
606
  const workers = /* @__PURE__ */ new Map();
550
607
  let driverSpend = emptySpend;
551
608
  const journalRootId = events.find((event) => event.kind === "spawned" && !event.parent && event.label === "root")?.id;
552
609
  const isRoot = (id) => id === state.id || id === journalRootId;
553
- const rootReason = recordedReason(events.filter((event) => isRoot(event.id) && (event.kind === "settled" || event.kind === "cancelled")).at(-1));
610
+ const terminal = accounting ? void 0 : events.filter((event) => isRoot(event.id) && (event.kind === "settled" || event.kind === "cancelled")).at(-1);
611
+ const rootReason = recordedReason(terminal);
554
612
  for (const event of events) {
555
613
  if (isRoot(event.id) || event.kind === "spawned" && !event.parent && event.label === "root") {
556
614
  if (event.kind === "metered" && event.accountingOnly !== true) driverSpend = addSpend(driverSpend, parseSpend(event.spend));
@@ -611,7 +669,7 @@ function buildSupervisorView(state, stateDir, events, progressTail, now, workerE
611
669
  stateDir,
612
670
  ...rootReason === void 0 ? {} : { reason: rootReason },
613
671
  ...workerEventTails.get(join(stateDir, ROOT_STREAM_FILE))?.activity,
614
- status: state.status,
672
+ status: accounting?.status ?? (terminal?.kind === "settled" ? terminal.status ?? state.status : terminal ? "cancelled" : state.status),
615
673
  task: state.task,
616
674
  workspaceDir: state.workspaceDir,
617
675
  budget: state.budget,
@@ -634,6 +692,7 @@ function buildSupervisorView(state, stateDir, events, progressTail, now, workerE
634
692
  ], (value) => value !== void 0),
635
693
  ...state.result?.spentUsd !== void 0 ? { resultSpentUsd: state.result.spentUsd } : {},
636
694
  ...state.result?.spentTokens !== void 0 ? { resultSpentTokens: state.result.spentTokens } : {},
695
+ ...!state.completedAt && terminal?.at ? { completedAt: terminal.at } : {},
637
696
  workers: workerViews,
638
697
  progressTail: [...progressTail],
639
698
  journalTail: events.slice(-12),
@@ -797,41 +856,7 @@ function readSourceFile(file, source, path) {
797
856
  }
798
857
  }
799
858
  function tailLines(raw, maxLines) {
800
- if (raw === void 0) return [];
801
- return raw.trim().split("\n").filter(Boolean).slice(-maxLines);
802
- }
803
- function readWorkerEventTails(dir) {
804
- const out = /* @__PURE__ */ new Map();
805
- const diagnostics = [];
806
- const read = (path, key = join(dir, path)) => {
807
- try {
808
- if (existsSync(join(dir, path))) out.set(key, readRecordedEvents(join(dir, path)));
809
- } catch {
810
- diagnostics.push({
811
- source: "worker-tail",
812
- path,
813
- reason: "unreadable"
814
- });
815
- }
816
- };
817
- read(ROOT_STREAM_FILE);
818
- for (const folder of ["workers", "streams"]) {
819
- if (!existsSync(join(dir, folder))) continue;
820
- try {
821
- for (const entry of readdirSync(join(dir, folder))) if (folder === "workers" && entry.endsWith(".ndjson") && !entry.endsWith(".inbox.ndjson")) read(join(folder, entry), entry.slice(0, -7));
822
- else if (folder === "streams" && entry.endsWith(".jsonl")) read(join(folder, entry));
823
- } catch {
824
- diagnostics.push({
825
- source: "worker-tail",
826
- path: folder,
827
- reason: "unreadable"
828
- });
829
- }
830
- }
831
- return {
832
- value: out,
833
- diagnostics
834
- };
859
+ return raw?.trim().split("\n").filter(Boolean).slice(-maxLines) ?? [];
835
860
  }
836
861
  function readSupervisorState(dir) {
837
862
  const path = "state.json";
@@ -1207,4 +1232,4 @@ async function loadRunsRoot(root) {
1207
1232
  }
1208
1233
  export { numberValue as a, totalSpend as c, loadTopSnapshot as i, serveTopWeb as n, parseSpend as o, aggregateSnapshot as r, parseTime as s, runTopWeb as t };
1209
1234
 
1210
- //# sourceMappingURL=top-web-CUDlOKu0.js.map
1235
+ //# sourceMappingURL=top-web-DK6lTMHG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"top-web-DK6lTMHG.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, existsSync, fstatSync, openSync, readdirSync, readSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { StringDecoder } from 'node:string_decoder'\nimport type { PursuitNodeProjection } from '../durable/observer-projection'\nimport { FileResultBlobStore } from '../durable/spawn-journal/result-blob-store'\nimport { recordValue } from '../record-value'\nimport { ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport type { TopSnapshotDiagnostic, 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 retained = runDir ? await retainedTranscriptLines(worker, runDir) : []\n const native = transcriptRows(retained.length ? { ...worker, liveTail: retained } : 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 // Without its conversation, the agent's settled result is still what it delivered.\n const result =\n runDir && node?.outRef && worker.endedAt\n ? await new FileResultBlobStore(join(runDir, 'blobs')).get(node.outRef)\n : undefined\n if (result !== undefined)\n native.push({\n at: worker.endedAt!,\n event: {\n kind: 'notice',\n provenance: 'recorded-result',\n source: `result ${node!.outRef}; Runtime FileResultBlobStore`,\n text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),\n },\n })\n return [...rows, ...native]\n }\n return [...rows, ...transcriptRows({ liveTail: readTranscriptTail(worker.eventFile) })]\n}\n\n/**\n * A settled worker's retained Router conversation as progress lines, for an executor that ran its\n * tool loop in process and so streamed nothing. The messages carry no times; each takes the\n * worker's settlement time. Other harnesses' session files have their own formats and stay unread.\n */\nasync function retainedTranscriptLines(worker: WorkerView, runDir: string): Promise<string[]> {\n const at = worker.endedAt\n if (worker.transcript?.harness !== 'router' || at === undefined) return []\n const artifact = (await new FileResultBlobStore(join(runDir, 'blobs')).get(\n worker.transcript.ref,\n )) as { files?: { content?: unknown }[] } | undefined\n return (artifact?.files ?? []).flatMap((file) =>\n (typeof file.content === 'string' ? file.content.split('\\n') : []).flatMap((text) => {\n try {\n const message = recordValue(JSON.parse(text))\n return message?.role === 'assistant' || message?.role === 'tool'\n ? [JSON.stringify({ at, message })]\n : []\n } catch {\n return []\n }\n }),\n )\n}\n\n/** Present the recorded tail through sandbox-ui's existing agent-stream contract. */\nexport function transcriptRows(worker: Pick<WorkerView, 'liveTail'>) {\n const rows: {\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> | undefined\n try {\n value = recordValue(JSON.parse(line))\n } catch {\n continue\n }\n const timestamp = value?.timestamp ?? value?.at\n const time = typeof timestamp === 'string' ? Date.parse(timestamp) : timestamp\n if (typeof time !== 'number' || !Number.isFinite(new Date(time).getTime())) continue\n const at = new Date(time).toISOString()\n const push = (event: (typeof rows)[number]['event']) => rows.push({ at, event })\n const event = recordValue(value?.event)\n if (typeof event?.kind === 'string') {\n const kind =\n (\n {\n text_delta: 'text',\n reasoning_delta: 'reasoning',\n tool_call: 'tool-call',\n tool_result: 'tool-result',\n } as Record<string, string>\n )[event.kind] ?? event.kind\n push({ ...event, kind })\n continue\n }\n const message = recordValue(value?.message)\n if (!message) continue\n if (message.role === 'tool') {\n push({\n kind: 'tool-result',\n toolCallId: String(message.tool_call_id),\n result: message.content,\n })\n continue\n }\n for (const item of Array.isArray(message.tool_calls) ? message.tool_calls : []) {\n const call = recordValue(item),\n fn = recordValue(call?.function)\n if (call && fn)\n push({\n kind: 'tool-call',\n toolCallId: String(call.id),\n toolName: String(fn.name),\n args: fn.arguments,\n })\n }\n const parts =\n typeof message.content === 'string'\n ? [{ type: 'text', text: message.content }]\n : Array.isArray(message.content)\n ? message.content\n : []\n for (const part of parts) {\n if (!recordValue(part)) continue\n if (part.type === 'text' && typeof part.text === 'string')\n push({ kind: message.role === 'user' ? 'user' : 'text', text: part.text })\n else if (part.type === 'thinking' && typeof part.thinking === 'string')\n push({ kind: 'reasoning', text: part.thinking })\n else if (part.type === 'tool_use')\n push({\n kind: 'tool-call',\n toolCallId: String(part.id),\n toolName: String(part.name),\n args: part.input,\n })\n else if (part.type === 'tool_result')\n push({ kind: 'tool-result', toolCallId: String(part.tool_use_id), result: part.content })\n }\n }\n return rows\n}\n\n/** The bounded native/normalized tail shared by snapshot adapters and selected streams. */\nexport function readTranscriptTail(file: string) {\n return readRecordedEvents(file, 200).lines\n}\n\nexport function transcriptTail(worker: WorkerView) {\n return transcriptRows(\n worker.eventFile ? { ...worker, liveTail: readTranscriptTail(worker.eventFile) } : worker,\n )\n}\n\n/** Actual recorded event time and cadence; absence means no event evidence, never file mtime. */\nexport interface RecordedActivity {\n readonly lastActivityAt?: number\n readonly medianEventGapMs?: number\n}\n\nexport interface RecordedEvents {\n readonly file: string\n readonly lines: string[]\n readonly activity: RecordedActivity\n readonly firstActivityAt?: number\n}\n\ninterface Cursor {\n dev: number\n ino: number\n offset: number\n pending: string\n decoder: StringDecoder\n times: number[]\n lines: string[]\n result: RecordedEvents\n}\n\nconst cursors = new Map<string, Cursor>()\nconst activityKinds = new Set([\n 'text',\n 'reasoning',\n 'user',\n 'tool-call',\n 'tool-result',\n 'interaction',\n 'child_task',\n])\n\n/** Read appended UTF-8 bytes once; complete EOF JSON follows the durable reader contract. */\nexport function readRecordedEvents(file: string, maxLines = 8): RecordedEvents {\n const fd = openSync(file, 'r')\n try {\n const stat = fstatSync(fd)\n let cursor = cursors.get(file)\n if (\n !cursor ||\n cursor.dev !== stat.dev ||\n cursor.ino !== stat.ino ||\n stat.size < cursor.offset\n ) {\n cursor = {\n dev: stat.dev,\n ino: stat.ino,\n offset: 0,\n pending: '',\n decoder: new StringDecoder('utf8'),\n times: [],\n lines: [],\n result: { file, lines: [], activity: {} },\n }\n cursors.set(file, cursor)\n }\n if (stat.size === cursor.offset)\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n const lines = [...cursor.lines]\n const buffer = Buffer.alloc(Math.min(65_536, stat.size - cursor.offset))\n while (cursor.offset < stat.size) {\n const bytes = readSync(\n fd,\n buffer,\n 0,\n Math.min(buffer.length, stat.size - cursor.offset),\n cursor.offset,\n )\n if (!bytes) break\n cursor.offset += bytes\n const rows = (cursor.pending + cursor.decoder.write(buffer.subarray(0, bytes))).split('\\n')\n cursor.pending = rows.pop()!\n for (const line of rows) {\n if (!line.trim()) continue\n lines.push(line)\n if (lines.length > 200) lines.shift()\n // One source row is one instant even when a native message contains several parts.\n const activity = transcriptRows({ liveTail: [line] }).find((row) =>\n activityKinds.has(row.event.kind),\n )\n if (activity) cursor.times.push(Date.parse(activity.at))\n }\n }\n cursor.lines = lines\n // A complete EOF row is valid durable JSONL. Keep it separate until its newline arrives.\n let pending: string[] = []\n if (cursor.pending.trim()) {\n try {\n JSON.parse(cursor.pending)\n pending = [cursor.pending]\n } catch {\n // A torn row is still private to its writer.\n }\n }\n const final = transcriptRows({ liveTail: pending }).find((row) =>\n activityKinds.has(row.event.kind),\n )\n const times = (final ? [...cursor.times, Date.parse(final.at)] : cursor.times).sort(\n (a, b) => a - b,\n )\n const gaps = times\n .slice(1)\n .map((at, i) => at - times[i]!)\n .sort((a, b) => a - b)\n const mid = Math.floor(gaps.length / 2)\n cursor.result = {\n file,\n lines: [...lines, ...pending].slice(-200),\n ...(times.length ? { firstActivityAt: times[0]! } : {}),\n activity: {\n ...(times.length ? { lastActivityAt: times.at(-1)! } : {}),\n ...(gaps.length\n ? { medianEventGapMs: (gaps[Math.floor((gaps.length - 1) / 2)]! + gaps[mid]!) / 2 }\n : {}),\n },\n }\n return { ...cursor.result, lines: cursor.result.lines.slice(-maxLines) }\n } catch (error) {\n cursors.delete(file)\n throw error\n } finally {\n closeSync(fd)\n }\n}\n\n/** Read native progress files with bounded, path-only diagnostics. */\nexport function readWorkerEventTails(dir: string) {\n const out = new Map<string, RecordedEvents>()\n const diagnostics: TopSnapshotDiagnostic[] = []\n const read = (path: string, key = join(dir, path)) => {\n try {\n if (existsSync(join(dir, path))) out.set(key, readRecordedEvents(join(dir, path)))\n } catch {\n diagnostics.push({ source: 'worker-tail', path, reason: 'unreadable' })\n }\n }\n read(ROOT_STREAM_FILE)\n for (const folder of ['workers', 'streams']) {\n if (!existsSync(join(dir, folder))) continue\n try {\n for (const entry of readdirSync(join(dir, folder))) {\n // Inbox steer requests are not evidence that the executor emitted progress.\n if (folder === 'workers' && entry.endsWith('.ndjson') && !entry.endsWith('.inbox.ndjson'))\n read(join(folder, entry), entry.slice(0, -'.ndjson'.length))\n else if (folder === 'streams' && entry.endsWith('.jsonl')) read(join(folder, entry))\n }\n } catch {\n diagnostics.push({ source: 'worker-tail', path: folder, reason: 'unreadable' })\n }\n }\n return { value: out, diagnostics }\n}\n","import { basename, join } from 'node:path'\nimport { parseCommittedJsonLines } from '../durable/jsonl-file'\nimport type { TopJournalEvent } from './top-snapshot'\nimport { type RecordedEvents, readRecordedEvents } from './top-transcript'\n\n/** Native workflows have no Runtime accounting. Translate recorded lifecycle only. */\nexport function workflowJournal(runDir: string, text: string) {\n const rows = parseCommittedJsonLines<Record<string, unknown>>(text, 'journal.jsonl')\n const events: TopJournalEvent[] = []\n const tails = new Map<string, RecordedEvents>()\n let first: string | undefined\n for (const row of rows) {\n if (typeof row.agentId !== 'string' || !/^[\\w-]+$/.test(row.agentId)) continue\n const id = row.agentId\n if (row.type === 'started') {\n const file = join(runDir, `agent-${id}.jsonl`)\n let start: string | undefined\n try {\n const recorded = readRecordedEvents(file)\n tails.set(id, recorded)\n if (recorded.firstActivityAt !== undefined)\n start = new Date(recorded.firstActivityAt).toISOString()\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (start && (!first || start < first)) first = start\n events.push({\n kind: 'spawned',\n id,\n label: typeof row.label === 'string' ? row.label : id,\n runtime: 'claude-code',\n ...(start ? { at: start } : {}),\n })\n events.push({ kind: 'metered', id, spend: { usdKnown: false, tokensKnown: false } })\n } else if (row.type === 'result' || row.type === 'error' || row.type === 'cancelled') {\n const activity = tails.get(id)?.activity.lastActivityAt\n const at = activity === undefined ? undefined : new Date(activity).toISOString()\n const reason = typeof row.reason === 'string' ? { reason: row.reason } : {}\n events.push(\n row.type === 'cancelled'\n ? { kind: 'cancelled', id, ...(at ? { at } : {}), ...reason }\n : {\n kind: 'settled',\n id,\n status: row.type === 'error' ? 'down' : 'done',\n ...(at ? { at } : {}),\n spent: { usdKnown: false, tokensKnown: false },\n ...reason,\n },\n )\n }\n }\n return { id: basename(runDir), events, tails, first }\n}\n","/** Read-only topology, activity and accounting over writer-owned workspace and durable journals.\n * ANSI presentation lives in `./top-frame`.\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { isRecord } from '@tangle-network/agent-core'\nimport { FileObserverJournal, type ObserverRecord } from '../durable/observer-journal'\nimport {\n type PursuitProjection,\n type PursuitRunProjection,\n projectPursuit,\n} from '../durable/observer-projection'\nimport { readFailureRecord, readSettleRecord } from '../durable/settle-record'\nimport { FileSpawnJournal } from '../durable/spawn-journal/journal-store'\nimport { spawnJournalRecordEvents } from '../durable/spawn-journal/record-events'\nimport { discoverDurableSupervisionRun } from '../durable/supervision-discovery'\nimport type { RouteFlowEvent } from '../mcp/tools/coordination-route-contracts'\nimport { FileCoordinationLog } from '../runtime/supervise/coordination-log'\nimport { nodeStreamFile, ROOT_STREAM_FILE } from '../runtime/supervise/root-stream'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n} from '../runtime/supervise/run-layout'\nimport { rootCoordinationOwner } from '../runtime/supervise/supervise-identity'\nimport type { Budget, Spend, SpendChannel } from '../runtime/supervise/types'\nimport { type RecordedEvents, readWorkerEventTails } from './top-transcript'\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 {\n readonly source: TopSnapshotDiagnosticSource\n readonly path: string\n readonly reason: TopSnapshotDiagnosticReason\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 outcome?:\n | { readonly kind: 'winner' }\n | { readonly kind: 'no-winner' | 'failed'; readonly reason: string }\n readonly lastRoute?: Extract<RouteFlowEvent, { kind: 'stopped' | 'unrouted' }>\n readonly reason?: string\n /** Epoch milliseconds of actual recorded executor activity, independent of tail truncation. */\n readonly lastActivityAt?: number\n /** Median gap between all recorded activity instants, including real zero gaps. */\n readonly medianEventGapMs?: number\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 /** Epoch milliseconds of actual recorded executor activity, independent of tail truncation. */\n readonly lastActivityAt?: number\n /** Median gap between all recorded activity instants, including real zero gaps. */\n readonly medianEventGapMs?: number\n readonly outRef?: string\n /** The conversation the executor retained at settlement, when it retained one. */\n readonly transcript?: { readonly ref: string; readonly harness: 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\n/** A recovered value and bounded, run-relative read diagnostics. */\ninterface SourceRead<T> {\n readonly value: T\n readonly diagnostics: readonly TopSnapshotDiagnostic[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\n\n/** Read a point-in-time view without writing to the run. Missing or partial sources report\n * bounded diagnostics, and live event readers cache append offsets. `now` controls elapsed time.\n */\nexport function loadTopSnapshot(rootDir: string, now?: number): TopSnapshot\nexport function loadTopSnapshot(\n rootDir: string,\n options: { runDir: string; now?: number; format?: 'workflow' | 'journal' },\n): Promise<TopSnapshot>\nexport function loadTopSnapshot(\n rootDir: string,\n input: number | { runDir: string; now?: number; format?: 'workflow' | 'journal' } = Date.now(),\n): TopSnapshot | Promise<TopSnapshot> {\n if (typeof input !== 'number' && input.format === 'journal')\n return loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now(), false)\n if (typeof input !== 'number' && input.format === 'workflow') {\n const root = resolve(rootDir),\n dir = resolve(input.runDir),\n now = input.now ?? Date.now()\n const read = readSourceFile(join(dir, 'journal.jsonl'), 'journal', 'journal.jsonl')\n if (read.value === undefined)\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n read.diagnostics.length\n ? [...read.diagnostics]\n : [{ source: 'journal', path: 'journal.jsonl', reason: 'missing' }],\n ),\n )\n try {\n const journal = workflowJournal(dir, read.value)\n const supervisor = buildSupervisorView(\n {\n id: journal.id,\n task: journal.id,\n status: 'unobserved',\n workspaceDir: root,\n budget: 0,\n budgetKnown: false,\n ...(journal.first ? { startedAt: journal.first } : {}),\n },\n dir,\n journal.events,\n [],\n now,\n journal.tails,\n )\n return Promise.resolve(\n topSnapshot(root, now, [\n {\n ...supervisor,\n driverSpend: { ...supervisor.driverSpend, usdKnown: false, tokensKnown: false },\n totals: { ...supervisor.totals, usdKnown: false, tokensKnown: false },\n },\n ]),\n )\n } catch {\n return Promise.resolve(\n topSnapshot(\n root,\n now,\n [],\n [{ source: 'journal', path: 'journal.jsonl', reason: 'invalid-state' }],\n ),\n )\n }\n }\n if (typeof input !== 'number')\n return loadDurableTopSnapshot(rootDir, input.runDir, input.now ?? Date.now())\n const now = input\n const root = resolve(rootDir)\n const supervisors: SupervisorView[] = []\n const diagnostics: TopSnapshotDiagnostic[] = []\n let discovered = 0\n const report = (runId: string, sources: readonly TopSnapshotDiagnostic[]): void => {\n for (const source of sources) diagnostics.push({ ...source, runId })\n }\n // `.loops` is the pre-rename state dir; runs already on disk there stay visible.\n for (const runsRoot of [supervisorRunsRoot(root), legacySupervisorRunsRoot(root)]) {\n if (!existsSync(runsRoot)) continue\n for (const entry of readdirSync(runsRoot)) {\n const dir = join(runsRoot, entry)\n if (!isDirectory(dir)) continue\n discovered += 1\n const state = readSupervisorState(dir)\n report(entry, state.diagnostics)\n if (!state.value) continue\n const journal = readJournal(dir)\n const progress = readSourceFile(join(dir, 'progress.ndjson'), 'progress', 'progress.ndjson')\n const workerEvents = readWorkerEventTails(dir)\n report(entry, [...journal.diagnostics, ...progress.diagnostics, ...workerEvents.diagnostics])\n supervisors.push(\n buildSupervisorView(\n state.value,\n dir,\n journal.value,\n tailLines(progress.value, 8),\n now,\n workerEvents.value,\n ),\n )\n }\n }\n supervisors.sort((a, b) => String(b.startedAt ?? '').localeCompare(String(a.startedAt ?? '')))\n return topSnapshot(root, now, supervisors, diagnostics, discovered)\n}\n\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\n/** Observer-backed and older spawn-only runs share topology; missing accounting stays unknown. */\nasync function loadDurableTopSnapshot(\n rootDir: string,\n runDir: string,\n now: number,\n observed = true,\n): Promise<TopSnapshot> {\n const root = resolve(rootDir)\n let pursuit: PursuitProjection | undefined\n let observations: readonly ObserverRecord[] = []\n let source: TopSnapshotDiagnosticSource = observed ? 'observer-journal' : 'journal'\n let path = observed ? 'observer.jsonl' : 'spawn-journal.jsonl'\n try {\n if (typeof runDir !== 'string' || !runDir.trim())\n throw new TypeError('runDir must be non-empty')\n if (observed) {\n const journal = await FileObserverJournal.open(join(resolve(runDir), path))\n if (!journal) return topSnapshot(root, now, [], [{ source, path, reason: 'missing' }])\n observations = await journal.read()\n pursuit = projectPursuit(observations)\n }\n source = 'journal'\n path = '.'\n const discovery = await discoverDurableSupervisionRun(runDir)\n path = 'spawn-journal.jsonl'\n const journal = new FileSpawnJournal(discovery.spawnJournalPath)\n const latest = new Map(pursuit?.runs.map((run) => [run.runId, run]))\n // A child's metered turns already belong to its spawn tree, not another supervisor row.\n const ids = pursuit\n ? [...latest.keys()].filter(\n (id) => !discovery.roots.some((parent) => id.startsWith(`${parent}/`)),\n )\n : discovery.roots\n path = 'result.json'\n const settled = await readSettleRecord(discovery.runDir)\n if (settled && !ids.includes(settled.tree.root))\n throw new Error('settle root is not discovered')\n path = 'failure.json'\n const failure = await readFailureRecord(discovery.runDir)\n const tails = readWorkerEventTails(discovery.runDir)\n const log = new FileCoordinationLog(discovery.coordinationLogPath)\n path = 'coordination-log.jsonl'\n const supervisors = await Promise.all(\n ids.map(async (id) => {\n const accounting = latest.get(id)\n const binding = discovery.roots.indexOf(id)\n // Retained admissions can predate the spawn journal. An existing journal must bind the root.\n if (binding < 0 && existsSync(discovery.spawnJournalPath))\n throw new Error('observer run has no discovered spawn root')\n const events = binding < 0 ? [] : ((await journal.loadTree(id)) ?? [])\n const spawn = events.find((event) => event.kind === 'spawned' && event.id === id)\n const reopen = events\n .filter(\n (event) => event.kind === 'reopened' && event.id === id && event.budget !== undefined,\n )\n .at(-1)\n const budget =\n reopen?.kind === 'reopened' && reopen.budget\n ? reopen.budget.maxTokens\n : spawn?.kind === 'spawned'\n ? spawn.budget?.maxTokens\n : undefined\n const boundary = observations.find(\n (record) => record.sequence === accounting?.firstSequence,\n )?.event?.payload\n const coordinationOffset = isRecord(boundary) ? boundary.coordinationOffset : undefined\n\n const outcome: SupervisorView['outcome'] =\n settled?.tree.root === id\n ? settled.kind === 'winner'\n ? { kind: 'winner' }\n : { kind: 'no-winner', reason: settled.reason }\n : failure?.runId === id && accounting?.status === 'down'\n ? { kind: 'failed', reason: failure.error.message }\n : undefined\n const prior =\n spawn?.kind === 'spawned' && spawn.identity\n ? await log.load(id, rootCoordinationOwner(spawn.identity))\n : undefined\n let lastRoute: SupervisorView['lastRoute']\n const records = prior?.records ?? []\n if (\n coordinationOffset !== undefined &&\n (typeof coordinationOffset !== 'number' ||\n !Number.isSafeInteger(coordinationOffset) ||\n coordinationOffset < 0 ||\n coordinationOffset > records.length)\n )\n throw new Error('invalid attempt coordination offset')\n const offset =\n typeof coordinationOffset === 'number'\n ? coordinationOffset\n : accounting?.attemptIndex === 0\n ? 0\n : records.length\n for (const { event } of records.slice(offset)) {\n if (\n event.type === 'route' &&\n (event.route.kind === 'stopped' || event.route.kind === 'unrouted')\n )\n lastRoute = event.route\n }\n const startedAt = accounting\n ? new Date(accounting.firstObservedAt).toISOString()\n : discovery.rootsBegunAt[binding]\n const view = buildSupervisorView(\n {\n id,\n task: id,\n workspaceDir: root,\n status: accounting?.status ?? 'running',\n budget: budget ?? 0,\n budgetKnown: budget !== undefined,\n ...(startedAt == null ? {} : { startedAt }),\n ...(accounting?.settledAt === undefined\n ? {}\n : { completedAt: new Date(accounting.settledAt).toISOString() }),\n },\n discovery.runDir,\n events.filter(isSpawnEvent),\n accounting?.error ? [accounting.error] : [],\n now,\n tails.value,\n accounting,\n )\n if (!accounting) Object.assign(view.totals, { usdKnown: false, tokensKnown: false })\n if (outcome)\n Object.assign(view, {\n outcome,\n status: outcome.kind === 'winner' ? 'done' : outcome.kind,\n })\n if (lastRoute)\n Object.assign(view, {\n lastRoute,\n reason: lastRoute.kind === 'stopped' ? lastRoute.reason : lastRoute.detail,\n })\n else if (outcome && 'reason' in outcome) Object.assign(view, { reason: outcome.reason })\n return view\n }),\n )\n return topSnapshot(\n root,\n now,\n supervisors,\n [\n ...(!observed\n ? [\n {\n source: 'observer-journal' as const,\n path: 'observer.jsonl',\n reason: 'missing' as const,\n },\n ]\n : []),\n ...tails.diagnostics,\n ],\n observed ? 1 : ids.length,\n pursuit,\n )\n } catch (error) {\n const reason =\n isRecord(error) && typeof error.code === 'string' ? 'unreadable' : 'invalid-state'\n return topSnapshot(root, now, [], [{ source, path, reason }], 1, pursuit)\n }\n}\n\nfunction observerSpend(spend: Spend | undefined, gaps: readonly SpendChannel[] = []): SpendStats {\n const parsed = parseSpend(spend)\n return {\n ...parsed,\n usdKnown: spend !== undefined && parsed.usdKnown !== false && !gaps.includes('usd'),\n tokensKnown: spend !== undefined && parsed.tokensKnown !== false && !gaps.includes('tokens'),\n }\n}\n\n/** Current writer-owned journal first; retain the retired name for recorded runs. */\nfunction readJournal(eventDir: string): SourceRead<TopJournalEvent[]> {\n const path = ['spawn-journal.jsonl', 'journal.jsonl'].find((candidate) =>\n existsSync(join(eventDir, candidate)),\n )\n if (!path) return { value: [], diagnostics: [] }\n const read = readSourceFile(join(eventDir, path), 'journal', path)\n if (read.value === undefined) return { value: [], diagnostics: read.diagnostics }\n const out: TopJournalEvent[] = []\n let partial = false\n for (const line of read.value.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>\n const events =\n parsed.kind === 'event' || parsed.kind === 'events'\n ? spawnJournalRecordEvents(parsed)\n : [parsed]\n for (const event of events) if (isSpawnEvent(event)) out.push(event)\n } catch {\n // A corrupt line is expected while the writer is mid-append; keep the lines that parsed.\n partial = true\n }\n }\n return {\n value: out,\n diagnostics: partial ? [{ source: 'journal', path, reason: 'partial-json' }] : [],\n }\n}\n\n/** The settled spawn event's retained-conversation receipt, read without widening the public\n * `TopJournalEvent` type; the spawn journal already validated the record. */\nfunction retainedTranscript(event: object): { ref: string; harness: string } | undefined {\n const retained = (event as { harnessTranscript?: unknown }).harnessTranscript\n if (typeof retained !== 'object' || retained === null) return undefined\n const { status, transcriptRef, harness } = retained as Record<string, unknown>\n return status === 'available' && typeof transcriptRef === 'string' && typeof harness === 'string'\n ? { ref: transcriptRef, harness }\n : undefined\n}\n\n/** The canonical spawn receipt owns the cause; the public journal view stays compatible. */\nfunction recordedReason(event?: object): string | undefined {\n return isRecord(event) && typeof event.reason === 'string' ? event.reason : undefined\n}\n\nfunction buildSupervisorView(\n state: SupervisorState,\n stateDir: string,\n events: readonly TopJournalEvent[],\n progressTail: readonly string[],\n now: number,\n workerEventTails = new Map<string, RecordedEvents>(),\n accounting?: PursuitRunProjection,\n): SupervisorView {\n const workers = new Map<string, MutableWorker>()\n let driverSpend = emptySpend\n // State and journal have different producers and root ids. Exclude both, or the journal's\n // root becomes a phantom running worker that captures steer and cancel operations.\n const journalRootId = events.find(\n (event) => event.kind === 'spawned' && !event.parent && event.label === 'root',\n )?.id\n const isRoot = (id: string): boolean => id === state.id || id === journalRootId\n const terminal = accounting\n ? undefined\n : events\n .filter(\n (event) => isRoot(event.id) && (event.kind === 'settled' || event.kind === 'cancelled'),\n )\n .at(-1)\n const rootReason = recordedReason(terminal)\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 const reason = recordedReason(event)\n if (reason !== undefined) worker.reason = reason\n if (event.kind === 'settled') {\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.outRef) worker.outRef = event.outRef\n const transcript = retainedTranscript(event)\n if (transcript) worker.transcript = transcript\n if (event.infra !== undefined) worker.infra = event.infra\n const verdict = describeVerdict(event.verdict)\n if (verdict) worker.verdict = verdict\n } else {\n worker.status = 'cancelled'\n }\n if (event.kind === 'settled' || event.spent !== undefined) {\n worker.spend = addSpend(worker.spend, parseSpend(event.spent))\n // Live progress is cumulative; terminal spend replaces it rather than counting it twice.\n worker.metered = emptySpend\n }\n } else if (event.kind === 'progress') {\n worker.metered = parseSpend(event.spend)\n } else if (event.accountingOnly !== true) {\n worker.metered = addSpend(worker.metered, parseSpend(event.spend))\n }\n }\n\n if (accounting) {\n driverSpend = observerSpend(accounting.totals.exclusiveByNode[accounting.runId])\n for (const worker of workers.values()) {\n worker.spend = observerSpend(\n accounting.totals.exclusiveByNode[worker.id],\n accounting.spendGaps?.find((gap) => gap.id === worker.id)?.channels,\n )\n worker.metered = emptySpend\n }\n }\n const workerViews = [...workers.values()]\n .map((worker) => {\n // Tails are keyed by file stem, which the writer put through `safeWorkerFile`; a label\n // carrying characters that stem strips would otherwise never find its own events.\n const tail =\n workerEventTails.get(join(stateDir, nodeStreamFile(worker.id))) ??\n workerEventTails.get(worker.label) ??\n workerEventTails.get(safeWorkerFile(worker.label)) ??\n workerEventTails.get(safeWorkerFile(worker.id)) ??\n workerEventTails.get(worker.id)\n worker.liveTail = tail?.lines ?? []\n if (tail) {\n worker.eventFile = tail.file\n Object.assign(worker, tail.activity)\n }\n return finalizeWorker(worker, now)\n })\n .sort((a, b) => compareWorker(a, b))\n\n const totals = supervisorTotals(state, workerViews, driverSpend, now)\n if (accounting) {\n const spend = observerSpend(\n accounting.totals.inclusive,\n accounting.spendGaps?.flatMap((gap) => gap.channels),\n )\n Object.assign(totals, spend, { tokensTotal: spend.tokensInput + spend.tokensOutput })\n }\n return {\n id: state.id,\n stateDir,\n ...(rootReason === undefined ? {} : { reason: rootReason }),\n ...workerEventTails.get(join(stateDir, ROOT_STREAM_FILE))?.activity,\n status:\n accounting?.status ??\n (terminal?.kind === 'settled'\n ? (terminal.status ?? state.status)\n : terminal\n ? 'cancelled'\n : state.status),\n task: state.task,\n workspaceDir: state.workspaceDir,\n budget: state.budget,\n ...(state.budgetKnown === undefined ? {} : { budgetKnown: state.budgetKnown }),\n ...selectFields(\n state,\n [\n 'verifyCmd',\n 'workerModel',\n 'driverModel',\n 'verdict',\n 'progress',\n 'startedAt',\n 'completedAt',\n ],\n Boolean,\n ),\n ...selectFields(\n state,\n ['maxSandboxes', 'maxLifetimeSeconds', 'idleTimeoutSeconds', 'maxUsd', 'maxDepth'],\n (value) => value !== undefined,\n ),\n ...(state.result?.spentUsd !== undefined ? { resultSpentUsd: state.result.spentUsd } : {}),\n ...(state.result?.spentTokens !== undefined\n ? { resultSpentTokens: state.result.spentTokens }\n : {}),\n ...(!state.completedAt && terminal?.at ? { completedAt: terminal.at } : {}),\n workers: workerViews,\n progressTail: [...progressTail],\n journalTail: events.slice(-12),\n driverSpend,\n totals,\n }\n}\n\nfunction selectFields<T, K extends keyof T>(\n value: T,\n keys: readonly K[],\n include: (value: T[K]) => boolean,\n): Partial<Pick<T, K>> {\n const selected: Partial<Pick<T, K>> = {}\n for (const key of keys) if (include(value[key])) selected[key] = value[key]\n return selected\n}\n\nfunction ensureWorker(workers: Map<string, MutableWorker>, id: string): MutableWorker {\n const existing = workers.get(id)\n if (existing) return existing\n const created: MutableWorker = {\n id,\n label: id,\n status: 'running',\n spend: emptySpend,\n metered: emptySpend,\n liveTail: [],\n }\n workers.set(id, created)\n return created\n}\n\nfunction finalizeWorker(worker: MutableWorker, now: number): WorkerView {\n const startMs = parseTime(worker.startedAt)\n const endMs = parseTime(worker.endedAt) ?? (worker.status === 'running' ? now : startMs)\n const latencyMs = startMs !== undefined && endMs !== undefined ? Math.max(0, endMs - startMs) : 0\n return { ...worker, latencyMs }\n}\n\nfunction supervisorTotals(\n state: SupervisorState,\n workers: readonly WorkerView[],\n driverSpend: SpendStats,\n now: number,\n): SupervisorTotals {\n const spend = workers.map(totalSpend).reduce(addSpend, driverSpend)\n const counts = { running: 0, done: 0, down: 0, cancelled: 0 }\n for (const worker of workers) counts[worker.status] += 1\n const started = parseTime(state.startedAt)\n const completed = parseTime(state.completedAt)\n const latencyMs = started !== undefined ? Math.max(0, (completed ?? now) - started) : 0\n const latencies = workers.map((worker) => worker.latencyMs).filter((ms) => ms > 0)\n return {\n workers: workers.length,\n ...counts,\n ...(spend.usdKnown === false ? { usdKnown: false } : {}),\n ...(spend.tokensKnown === false ? { tokensKnown: false } : {}),\n inFlight: counts.running,\n settled: workers.length - counts.running,\n tokensInput: spend.tokensInput,\n tokensOutput: spend.tokensOutput,\n tokensTotal: spend.tokensInput + spend.tokensOutput,\n usd: spend.usd > 0 ? spend.usd : (state.result?.spentUsd ?? 0),\n latencyMs,\n workerLatency: distribution(latencies),\n }\n}\n\nexport function aggregateSnapshot(snapshot: TopSnapshot) {\n const complete = snapshot.completeness === 'complete'\n return {\n usdKnown: complete && snapshot.supervisors.every((row) => row.totals.usdKnown !== false),\n tokensKnown: complete && snapshot.supervisors.every((row) => row.totals.tokensKnown !== false),\n supervisors: snapshot.supervisors.length,\n workers: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.workers)),\n running: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.running)),\n done: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.done)),\n down: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.down)),\n usd: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.usd)),\n tokensInput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensInput)),\n tokensOutput: sum(snapshot.supervisors.map((supervisor) => supervisor.totals.tokensOutput)),\n }\n}\n\nfunction compareWorker(a: WorkerView, b: WorkerView): number {\n const aStart = parseTime(a.startedAt) ?? 0\n const bStart = parseTime(b.startedAt) ?? 0\n if (a.status === 'running' && b.status !== 'running') return -1\n if (b.status === 'running' && a.status !== 'running') return 1\n return aStart - bStart || a.label.localeCompare(b.label)\n}\n\nexport function totalSpend(worker: WorkerView): SpendStats {\n return addSpend(worker.spend, worker.metered)\n}\n\nfunction addSpend(a: SpendStats, b: SpendStats): SpendStats {\n return {\n iterations: a.iterations + b.iterations,\n tokensInput: a.tokensInput + b.tokensInput,\n tokensOutput: a.tokensOutput + b.tokensOutput,\n usd: a.usd + b.usd,\n ms: a.ms + b.ms,\n ...(a.usdKnown === false || b.usdKnown === false ? { usdKnown: false } : {}),\n ...(a.tokensKnown === false || b.tokensKnown === false ? { tokensKnown: false } : {}),\n }\n}\n\nexport function parseSpend(value: unknown): SpendStats {\n if (!isRecord(value)) return emptySpend\n const tokens = isRecord(value.tokens) ? value.tokens : {}\n return {\n ...(value.usdKnown === false ? { usdKnown: false } : {}),\n ...(value.tokensKnown === false || tokens.tokensKnown === false ? { tokensKnown: false } : {}),\n iterations: numberValue(value.iterations),\n tokensInput: numberValue(tokens.input),\n tokensOutput: numberValue(tokens.output),\n usd: numberValue(value.usd),\n ms: numberValue(value.ms),\n }\n}\n\nfunction parseBudget(value: unknown): BudgetStats | undefined {\n if (!isRecord(value)) return undefined\n const budget = selectFields(\n value,\n ['maxIterations', 'maxTokens', 'maxUsd'],\n (entry) => typeof entry === 'number',\n ) as BudgetStats\n return Object.keys(budget).length ? budget : undefined\n}\n\nfunction describeVerdict(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined\n if (typeof value.valid === 'boolean') return value.valid ? 'valid' : 'invalid'\n if (typeof value.score === 'number') return `score ${value.score.toFixed(2)}`\n return undefined\n}\n\nfunction distribution(values: readonly number[]): Distribution {\n const sorted = [...values].sort((a, b) => a - b)\n return {\n n: sorted.length,\n min: sorted[0] ?? 0,\n median: percentile(sorted, 0.5),\n p90: percentile(sorted, 0.9),\n max: sorted[sorted.length - 1] ?? 0,\n }\n}\n\nfunction percentile(sorted: readonly number[], p: number): number {\n if (sorted.length === 0) return 0\n const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * p) - 1))\n return sorted[idx] ?? 0\n}\n\n/** Missing files can predate their writer; failed reads report a path-only diagnostic. */\nfunction readSourceFile(\n file: string,\n source: TopSnapshotDiagnosticSource,\n path: string,\n): SourceRead<string | undefined> {\n if (!existsSync(file)) return { value: undefined, diagnostics: [] }\n try {\n return { value: readFileSync(file, 'utf8'), diagnostics: [] }\n } catch {\n return { value: undefined, diagnostics: [{ source, path, reason: 'unreadable' }] }\n }\n}\n\nfunction tailLines(raw: string | undefined, maxLines: number): string[] {\n return raw?.trim().split('\\n').filter(Boolean).slice(-maxLines) ?? []\n}\n\nfunction readSupervisorState(dir: string): SourceRead<SupervisorState | undefined> {\n const path = 'state.json'\n const read = readSourceFile(join(dir, path), 'supervisor-state', path)\n if (read.diagnostics.length > 0) return { value: undefined, diagnostics: read.diagnostics }\n const failed = (reason: TopSnapshotDiagnosticReason): SourceRead<undefined> => ({\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason }],\n })\n if (read.value === undefined) return failed('missing')\n try {\n const parsed: unknown = JSON.parse(read.value)\n return isSupervisorState(parsed) ? { value: parsed, diagnostics: [] } : failed('invalid-state')\n } catch {\n return failed('partial-json')\n }\n}\n\nfunction isSupervisorState(value: unknown): value is SupervisorState {\n return (\n isRecord(value) &&\n ['id', 'status', 'task', 'workspaceDir'].every((key) => typeof value[key] === 'string') &&\n typeof value.budget === 'number'\n )\n}\n\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 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 let inFlight: Promise<void> = Promise.resolve()\n const read = async () => {\n reading = true\n dirty = false\n try {\n const changed: TopSnapshot[] = []\n for (const root of roots) {\n const snapshot = existsSync(resolve(root, 'observer.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root })\n : existsSync(resolve(root, 'spawn-journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'journal' })\n : existsSync(resolve(root, 'journal.jsonl'))\n ? await loadTopSnapshot(root, { runDir: root, format: 'workflow' })\n : await loadRunsRoot(root)\n const digest = createHash('sha256')\n .update(\n JSON.stringify(snapshot, (key, value) =>\n key === 'generatedAt' || key === 'latencyMs' ? undefined : value,\n ),\n )\n .digest('hex')\n snapshots.set(root, snapshot)\n if (digests.get(root) !== digest) {\n changed.push(snapshot)\n digests.set(root, digest)\n }\n }\n if (changed.length) {\n const frame = {\n sequence: ++sequence,\n observedAt: Date.now(),\n reset: false,\n snapshots: changed,\n }\n for (const client of clients) send(client, frame)\n }\n for (const update of transcripts) update()\n } finally {\n reading = false\n if (dirty && !closed) schedule()\n }\n }\n const refresh = (): Promise<void> => {\n if (reading || closed) return inFlight\n inFlight = read()\n return inFlight\n }\n const schedule = () => {\n dirty = true\n if (!scheduled && !closed)\n scheduled = setTimeout(() => {\n scheduled = undefined\n void refresh().catch((error: unknown) => {\n for (const client of clients)\n client.write(\n `event: unavailable\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`,\n )\n })\n }, 16)\n }\n await refresh()\n for (const root of roots) watchers.push(watch(root, { recursive: true }, schedule))\n // Watch notifications may be coalesced or lost; the same loader reconciles them without a second model.\n const reconcile = setInterval(schedule, 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 // A runs root keeps each run's journals, blobs and root stream in `<root>/<runId>`.\n const own =\n root && existsSync(resolve(root, runId!, 'observer.jsonl'))\n ? resolve(root, runId!)\n : undefined\n const runDir = own ?? root\n const pursuit = own\n ? (await loadTopSnapshot(root!, { runDir: own })).pursuit\n : root\n ? snapshots.get(root)?.pursuit\n : undefined\n const worker = (): WorkerView | undefined => {\n const run = root\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 ...(runDir && existsSync(resolve(runDir, 'root-stream.jsonl'))\n ? { eventFile: resolve(runDir, '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 runDir,\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 clearInterval(reconcile)\n clearInterval(heartbeat)\n for (const watcher of watchers) watcher.close()\n // A caller closes right after its run settles: let a read in flight finish, then read once\n // more, so a terminal record appended just before close reaches connected clients.\n await inFlight.catch(() => undefined)\n await refresh().catch(() => undefined)\n closed = true\n if (scheduled) clearTimeout(scheduled)\n // The run is over for this viewer: say so, so a client stops instead of reconnecting.\n for (const client of clients) client.end('event: end\\ndata: {}\\n\\n')\n transcripts.clear()\n server.closeAllConnections()\n await new Promise<void>((done, reject) =>\n server.close((error) =>\n error && (!('code' in error) || error.code !== 'ERR_SERVER_NOT_RUNNING')\n ? reject(error)\n : done(),\n ),\n )\n })())\n try {\n await new Promise<void>((done, reject) => {\n server.once('error', reject)\n server.listen(options.port ?? 0, host, done)\n })\n } catch (error) {\n await close()\n throw error\n }\n const address = server.address()\n if (!address || typeof address === 'string') throw new Error('Web server has no TCP address')\n return { url: `http://${host.includes(':') ? `[${host}]` : host}:${address.port}/`, close }\n}\n\n/** CLI options stay on agent-runtime-top; the renderer is supplied by its installed owner. */\nexport async function runTopWeb(argv: readonly string[]) {\n const values = (flag: string) =>\n argv.flatMap((arg, i) => (arg === flag ? [argv[i + 1] ?? ''] : []))\n const roots = values('--root')\n const port = Number(values('--port')[0] ?? 0)\n if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error('Invalid --port')\n const web = await serveTopWeb({\n roots: roots.length ? roots : [process.cwd()],\n ...(values('--assets')[0] ? { assets: values('--assets')[0] } : {}),\n port,\n ...(values('--host')[0] ? { host: values('--host')[0] } : {}),\n })\n process.stdout.write(`${JSON.stringify({ event: 'ready', url: web.url, pid: process.pid })}\\n`)\n const stop = () => {\n void web.close().catch((error: unknown) => {\n process.stderr.write(`${String(error)}\\n`)\n process.exitCode = 1\n })\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n return web\n}\n\n/** A journal root holds one `<runId>/observer.jsonl` per retained run beside any workspace runs. */\nasync function loadRunsRoot(root: string): Promise<TopSnapshot> {\n const workspace = loadTopSnapshot(root)\n // A supervised run writes its spawn journal at begin and its observer journal after the first\n // turn; either one makes the run a card, so it appears as soon as supervision starts.\n const has = (runId: string, file: string) => existsSync(resolve(root, runId, file))\n const runIds = readdirSync(root, { withFileTypes: true })\n .filter(\n (entry) =>\n entry.isDirectory() &&\n (has(entry.name, 'observer.jsonl') || has(entry.name, 'spawn-journal.jsonl')),\n )\n .map((entry) => entry.name)\n if (!runIds.length) return workspace\n const runs = await Promise.all(\n runIds.map((runId) =>\n loadTopSnapshot(root, {\n runDir: resolve(root, runId),\n ...(has(runId, 'observer.jsonl') ? {} : { format: 'journal' as const }),\n }),\n ),\n )\n const diagnostics = [\n ...workspace.diagnostics,\n ...runs.flatMap((run, i) => run.diagnostics.map((d) => ({ ...d, runId: runIds[i] }))),\n ]\n const supervisors = [...workspace.supervisors, ...runs.flatMap((run) => run.supervisors)]\n return {\n ...workspace,\n supervisors,\n diagnostics,\n completeness: diagnostics.length ? 'partial' : 'complete',\n discovered: workspace.discovered + runIds.length,\n loaded: supervisors.length,\n }\n}\n"],"mappings":"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"}
package/dist/tui/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { _ as supervisorRunsRoot, s as cancelWorker, x as writeWorkerSteer } from "../root-stream-Bsh5WFcg.js";
3
- import { n as cancelRun } from "../run-cancellation-CzQZUlHr.js";
4
- 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-CUDlOKu0.js";
2
+ import { S as writeWorkerSteer, c as cancelWorker, v as supervisorRunsRoot } from "../scope-DRaBilEX.js";
3
+ import { n as cancelRun } from "../run-cancellation-BxoFCpJ_.js";
4
+ 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-DK6lTMHG.js";
5
5
  import { randomUUID } from "node:crypto";
6
6
  import { resolve } from "node:path";
7
7
  import { hostname, userInfo } from "node:os";