@tangle-network/agent-runtime 0.175.0 → 0.177.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.
Files changed (103) hide show
  1. package/README.md +4 -0
  2. package/dist/{activation-CsdJWRXX.js → activation-XVI_z1g3.js} +3 -3
  3. package/dist/{activation-CsdJWRXX.js.map → activation-XVI_z1g3.js.map} +1 -1
  4. package/dist/agent.d.ts +1 -1
  5. package/dist/agent.js +2 -2
  6. package/dist/{authoring-DsLNInAz.js → authoring-bXmPNfCI.js} +2 -2
  7. package/dist/{authoring-DsLNInAz.js.map → authoring-bXmPNfCI.js.map} +1 -1
  8. package/dist/candidate-execution/index.js +4 -4
  9. package/dist/{candidate-execution-BbMbyhgC.js → candidate-execution-fBNUyWyE.js} +10 -4
  10. package/dist/candidate-execution-fBNUyWyE.js.map +1 -0
  11. package/dist/{conversation-7XGKoDM6.js → conversation-BREx2hi-.js} +3 -3
  12. package/dist/{conversation-7XGKoDM6.js.map → conversation-BREx2hi-.js.map} +1 -1
  13. package/dist/conversation.d.ts +1 -1
  14. package/dist/conversation.js +1 -1
  15. package/dist/coordination-driver-xO1tkxy-.js +3063 -0
  16. package/dist/coordination-driver-xO1tkxy-.js.map +1 -0
  17. package/dist/durable-file-g3YdfEh4.js +131 -0
  18. package/dist/durable-file-g3YdfEh4.js.map +1 -0
  19. package/dist/durable.d.ts +2 -2
  20. package/dist/durable.js +1 -1
  21. package/dist/{environment-provider-DWjbGH8W.d.ts → environment-provider-5E82esWE.d.ts} +6 -3
  22. package/dist/{environment-provider-Bn3652YU.js → environment-provider-DKyMWQJd.js} +121 -17
  23. package/dist/environment-provider-DKyMWQJd.js.map +1 -0
  24. package/dist/environment-provider.d.ts +1 -1
  25. package/dist/environment-provider.js +1 -1
  26. package/dist/{graph-BbeHgLXH.js → graph-DwJXa1Ph.js} +3 -3
  27. package/dist/graph-DwJXa1Ph.js.map +1 -0
  28. package/dist/graph.d.ts +3 -3
  29. package/dist/graph.js +4 -4
  30. package/dist/{improvement-cycle-DKGDCukL.js → improvement-cycle-eiSv6aH4.js} +5 -5
  31. package/dist/{improvement-cycle-DKGDCukL.js.map → improvement-cycle-eiSv6aH4.js.map} +1 -1
  32. package/dist/{index-CIhkH7mq.d.ts → index-BnAiQVLD.d.ts} +290 -29
  33. package/dist/{index-CFMB9ux3.d.ts → index-Bs0uhf-y.d.ts} +2 -2
  34. package/dist/{index-Dk5X9eKg.d.ts → index-C9XTLVP1.d.ts} +4 -4
  35. package/dist/index.d.ts +7 -7
  36. package/dist/index.js +13 -13
  37. package/dist/intelligence.d.ts +4 -4
  38. package/dist/intelligence.js +6 -6
  39. package/dist/kernel.d.ts +6 -6
  40. package/dist/kernel.js +13 -11
  41. package/dist/{knowledge-BaAX0HVu.js → knowledge-Bmtj_7u7.js} +5 -5
  42. package/dist/{knowledge-BaAX0HVu.js.map → knowledge-Bmtj_7u7.js.map} +1 -1
  43. package/dist/knowledge.d.ts +1 -1
  44. package/dist/knowledge.js +1 -1
  45. package/dist/{loop-runner-bin-DRYApMiu.d.ts → loop-runner-bin-ChS5deJ0.d.ts} +3 -3
  46. package/dist/{loop-runner-bin-D63Tytdk.js → loop-runner-bin-GTN5wqCt.js} +3 -3
  47. package/dist/{loop-runner-bin-D63Tytdk.js.map → loop-runner-bin-GTN5wqCt.js.map} +1 -1
  48. package/dist/loop-runner-bin.d.ts +1 -1
  49. package/dist/loop-runner-bin.js +1 -1
  50. package/dist/{materialization-Ct3I4wu3.js → materialization-CekWK6OO.js} +5 -3
  51. package/dist/materialization-CekWK6OO.js.map +1 -0
  52. package/dist/mcp/bin.js +3 -3
  53. package/dist/mcp/index.d.ts +3 -3
  54. package/dist/mcp/index.js +5 -4
  55. package/dist/mcp/index.js.map +1 -1
  56. package/dist/{openai-tools-BBgjWYNw.js → openai-tools-BBj1QGJp.js} +2 -2
  57. package/dist/{openai-tools-BBgjWYNw.js.map → openai-tools-BBj1QGJp.js.map} +1 -1
  58. package/dist/{prepare-BAyaNoZu.js → prepare-Tip-2ZoZ.js} +2 -2
  59. package/dist/{prepare-BAyaNoZu.js.map → prepare-Tip-2ZoZ.js.map} +1 -1
  60. package/dist/primeintellect/index.d.ts +1 -1
  61. package/dist/{protected-model-port-T2UWrDNQ.js → protected-model-port-Dd3a1SRm.js} +2 -2
  62. package/dist/{protected-model-port-T2UWrDNQ.js.map → protected-model-port-Dd3a1SRm.js.map} +1 -1
  63. package/dist/provision-supervisor-zA__ayUX.js +1020 -0
  64. package/dist/provision-supervisor-zA__ayUX.js.map +1 -0
  65. package/dist/{redact-DvLf4x1m.d.ts → redact-DkRLcSiE.d.ts} +3 -3
  66. package/dist/run-layout-Cd_l2XWV.js +645 -0
  67. package/dist/run-layout-Cd_l2XWV.js.map +1 -0
  68. package/dist/{runtime-D5u1M6T5.d.ts → runtime-B2eZ76kG.d.ts} +3 -3
  69. package/dist/{runtime-CojgP-hr.js → runtime-CJNlF5wM.js} +16 -1095
  70. package/dist/runtime-CJNlF5wM.js.map +1 -0
  71. package/dist/{spawn-journal-Tgvp5VS5.js → spawn-journal--N8Ten1q.js} +3 -1
  72. package/dist/{spawn-journal-Tgvp5VS5.js.map → spawn-journal--N8Ten1q.js.map} +1 -1
  73. package/dist/{stream-agent-turn-DxQ3GOuR.d.ts → stream-agent-turn-ByY8po9W.d.ts} +2 -2
  74. package/dist/{stream-agent-turn-CKIpCbSq.js → stream-agent-turn-CPj9SqVm.js} +2 -2
  75. package/dist/{stream-agent-turn-CKIpCbSq.js.map → stream-agent-turn-CPj9SqVm.js.map} +1 -1
  76. package/dist/{structural-rollout-BUYA61iV.js → structural-rollout-BeAUK7Ta.js} +4 -4
  77. package/dist/{structural-rollout-BUYA61iV.js.map → structural-rollout-BeAUK7Ta.js.map} +1 -1
  78. package/dist/{supervise-Ci0RfWQF.js → supervise-HsRKOlKY.js} +405 -3374
  79. package/dist/supervise-HsRKOlKY.js.map +1 -0
  80. package/dist/{supervisor-Bt1XLCVq.js → supervisor-ChLgoYhG.js} +1620 -33
  81. package/dist/supervisor-ChLgoYhG.js.map +1 -0
  82. package/dist/testing.d.ts +2 -2
  83. package/dist/testing.js +13 -12
  84. package/dist/testing.js.map +1 -1
  85. package/dist/{top-app-3rYfFPTW.js → top-app-DIBApkt1.js} +25 -9
  86. package/dist/top-app-DIBApkt1.js.map +1 -0
  87. package/dist/tui/bin.js +1 -1
  88. package/dist/tui/index.d.ts +9 -1
  89. package/dist/tui/index.js +3 -2
  90. package/dist/{types-DjVO-p7R.d.ts → types-a2ZZUl80.d.ts} +25 -2
  91. package/dist/{workspace-archive-B0Hqp2eJ.js → workspace-archive-DOZAeeKU.js} +2 -2
  92. package/dist/{workspace-archive-B0Hqp2eJ.js.map → workspace-archive-DOZAeeKU.js.map} +1 -1
  93. package/package.json +6 -4
  94. package/dist/candidate-execution-BbMbyhgC.js.map +0 -1
  95. package/dist/environment-provider-Bn3652YU.js.map +0 -1
  96. package/dist/graph-BbeHgLXH.js.map +0 -1
  97. package/dist/materialization-Ct3I4wu3.js.map +0 -1
  98. package/dist/run-layout-C2jgwsCq.js +0 -393
  99. package/dist/run-layout-C2jgwsCq.js.map +0 -1
  100. package/dist/runtime-CojgP-hr.js.map +0 -1
  101. package/dist/supervise-Ci0RfWQF.js.map +0 -1
  102. package/dist/supervisor-Bt1XLCVq.js.map +0 -1
  103. package/dist/top-app-3rYfFPTW.js.map +0 -1
package/dist/testing.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Lo as supervisorAgentWithTestBrain, Nn as DriverAgentOptions, Oo as SupervisorAgentTestDeps, Pn as driverAgent, an as runGraphWithTestBrain, go as superviseWithTestBrain, mo as SuperviseTestOptions, tn as RunGraphTestOptions } from "./index-CIhkH7mq.js";
2
- import { bt as ToolLoopChat, yt as ToolLoopCallContext } from "./runtime-D5u1M6T5.js";
1
+ import { Ho as SuperviseTestOptions, Nn as runGraphWithTestBrain, Wo as superviseWithTestBrain, cr as driverAgent, ds as supervisorAgentWithTestBrain, kn as RunGraphTestOptions, ns as SupervisorAgentTestDeps, sr as DriverAgentOptions } from "./index-BnAiQVLD.js";
2
+ import { bt as ToolLoopChat, yt as ToolLoopCallContext } from "./runtime-B2eZ76kG.js";
3
3
  import { AgentImprovementProposal, AgentProfile, AgentProfileImprovementMeasuredComparison, SandboxSizePreset } from "@tangle-network/agent-interface";
4
4
  //#region src/testing/index.d.ts
5
5
  /** A proposal produced by Runtime's opaque profile-improvement path. */
package/dist/testing.js CHANGED
@@ -1,12 +1,13 @@
1
- import { ct as immutableCandidateValue, et as parseExactAgentProfile, it as canonicalCandidateDigest$1, q as applyExactAgentProfileDiff } from "./prepare-BAyaNoZu.js";
2
- import { f as verifyAgentImprovementProposal } from "./improvement-cycle-DKGDCukL.js";
3
- import { c as supervisorAgentWithTestBrain, ft as driverAgent, r as superviseWithTestBrain } from "./supervise-Ci0RfWQF.js";
4
- import { i as runGraphWithTestBrain } from "./graph-BbeHgLXH.js";
1
+ import { ct as immutableCandidateValue, et as parseExactAgentProfile, it as canonicalCandidateDigest$1, q as applyExactAgentProfileDiff } from "./prepare-Tip-2ZoZ.js";
2
+ import { f as verifyAgentImprovementProposal } from "./improvement-cycle-eiSv6aH4.js";
3
+ import { r as driverAgent } from "./coordination-driver-xO1tkxy-.js";
4
+ import { c as supervisorAgentWithTestBrain, r as superviseWithTestBrain } from "./supervise-HsRKOlKY.js";
5
+ import { i as runGraphWithTestBrain } from "./graph-DwJXa1Ph.js";
5
6
  import { SANDBOX_SIZE_PRESET_NAMES } from "@tangle-network/agent-interface";
6
7
  //#region src/testing/fixtures/agent-improvement-proposal.json
7
8
  var agent_improvement_proposal_default = {
8
9
  changedSurfaces: ["prompt"],
9
- digest: "sha256:9cbe973bcffdd0ca3dbb73f2488fa44605d465a007e519bce7dea48d1f0c14fe",
10
+ digest: "sha256:07002045923dd6972efab82a2322128d67b3d89a21db356cec82d410aa303e75",
10
11
  evaluation: {
11
12
  "decision": {
12
13
  "contributingChecks": [
@@ -4577,7 +4578,7 @@ var agent_improvement_proposal_default = {
4577
4578
  ],
4578
4579
  "metadata": {
4579
4580
  "fixture": "agent-improvement-proposal",
4580
- "runtimeVersion": "0.175.0"
4581
+ "runtimeVersion": "0.177.1"
4581
4582
  },
4582
4583
  "objectives": [
4583
4584
  {
@@ -4688,8 +4689,8 @@ var agent_improvement_proposal_default = {
4688
4689
  "baselineContentHash": "sha256:5c21ee53e513fc604cb09754e21c392b24a424da0ef37dbf8f1ee4a8a0b08f09",
4689
4690
  "candidateContentHash": "sha256:60fcbb1c728194bd51d7d19cb732d1c3f1881dce7e0a6266b41c8b98cfd65693",
4690
4691
  "kind": "agent-eval-loop",
4691
- "recordDigest": "sha256:b4ed2d8bf4990e8056cc1b2a6bfbe43b49687f30aa24301b8b747d175087e110",
4692
- "runId": "agent-runtime-0.175.0-proposal-fixture",
4692
+ "recordDigest": "sha256:4281b0eff022efe067655c7e4c6eaf78472b8b4d16f8f3382b32504a199dba17",
4693
+ "runId": "agent-runtime-0.177.1-proposal-fixture",
4693
4694
  "schema": "agent-candidate-experiment"
4694
4695
  }
4695
4696
  },
@@ -4712,13 +4713,13 @@ var agent_improvement_proposal_default = {
4712
4713
  }],
4713
4714
  kind: "agent-improvement-proposal",
4714
4715
  proposedAt: "2026-07-10T01:00:00.000Z",
4715
- runId: "agent-runtime-0.175.0-proposal-fixture"
4716
+ runId: "agent-runtime-0.177.1-proposal-fixture"
4716
4717
  };
4717
4718
  //#endregion
4718
4719
  //#region src/testing/fixtures/agent-profile-improvement-proposal.json
4719
4720
  var agent_profile_improvement_proposal_default = {
4720
4721
  changedSurfaces: ["prompt", "skills"],
4721
- digest: "sha256:0840635c3fe5e602c201bd3bdfeca4d6fc73119f267153413a5171dd22bbca38",
4722
+ digest: "sha256:4a265e5ce2560182633bac269ebc8bed6d56eed0aaebfd4848ce173d90d4b4a2",
4722
4723
  evaluation: {
4723
4724
  "decision": {
4724
4725
  "contributingChecks": [
@@ -6352,7 +6353,7 @@ var agent_profile_improvement_proposal_default = {
6352
6353
  ],
6353
6354
  "metadata": {
6354
6355
  "fixture": "agent-profile-improvement-proposal",
6355
- "runtimeVersion": "0.175.0"
6356
+ "runtimeVersion": "0.177.1"
6356
6357
  },
6357
6358
  "objectives": [
6358
6359
  {
@@ -6463,7 +6464,7 @@ var agent_profile_improvement_proposal_default = {
6463
6464
  "baselineContentHash": "sha256:21c495a37c418c10bde64fbaa188beddeed31f1f051ea60a6a6582a9ee0db704",
6464
6465
  "candidateContentHash": "sha256:103f77bc8481601eef1ad5fe6ba84a40dffabc3a44f421f8c8559121edab84e9",
6465
6466
  "kind": "agent-eval-loop",
6466
- "recordDigest": "sha256:8e30ee0ea01da6b81776049aa21383e0aab6206a8ae8b9196d8414b98ab4d19a",
6467
+ "recordDigest": "sha256:09ec9a2e0ffee5b89d8f3040b9b484aaf6e9ce61f36e777f973bf4164729b195",
6467
6468
  "runId": "profile-improvement-1",
6468
6469
  "schema": "agent-profile-improvement-experiment"
6469
6470
  }
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":["canonicalAgentImprovementProposalFixture","canonicalAgentProfileImprovementProposalFixture","canonicalAgentProfileImprovementStateFixture","canonicalCandidateDigest"],"sources":["../src/testing/fixtures/agent-improvement-proposal.json","../src/testing/fixtures/agent-profile-improvement-proposal.json","../src/testing/fixtures/agent-profile-improvement-state.json","../src/testing/index.ts"],"sourcesContent":["","","","import {\n type AgentImprovementProposal,\n type AgentProfile,\n type AgentProfileImprovementMeasuredComparison,\n SANDBOX_SIZE_PRESET_NAMES,\n type SandboxSizePreset,\n} from '@tangle-network/agent-interface'\n\nimport { canonicalCandidateDigest, immutableCandidateValue } from '../candidate-execution/digest'\nimport { applyExactAgentProfileDiff, parseExactAgentProfile } from '../candidate-execution/profile'\nimport { verifyAgentImprovementProposal } from '../intelligence/improvement-cycle'\nimport canonicalAgentImprovementProposalFixture from './fixtures/agent-improvement-proposal.json'\nimport canonicalAgentProfileImprovementProposalFixture from './fixtures/agent-profile-improvement-proposal.json'\nimport canonicalAgentProfileImprovementStateFixture from './fixtures/agent-profile-improvement-state.json'\n\nexport {\n type DriverAgentOptions,\n driverAgent,\n} from '../runtime/supervise/coordination-driver'\nexport {\n type RunGraphTestOptions,\n runGraphWithTestBrain,\n} from '../runtime/supervise/graph'\nexport {\n type SuperviseTestOptions,\n superviseWithTestBrain,\n} from '../runtime/supervise/supervise'\nexport {\n type SupervisorAgentTestDeps,\n supervisorAgentWithTestBrain,\n} from '../runtime/supervise/supervisor-agent'\nexport type { ToolLoopCallContext, ToolLoopChat } from '../runtime/tool-loop'\n\nconst serializedAgentImprovementProposalFixture = JSON.stringify(\n canonicalAgentImprovementProposalFixture,\n)\nconst serializedAgentProfileImprovementProposalFixture = JSON.stringify(\n canonicalAgentProfileImprovementProposalFixture,\n)\nconst serializedAgentProfileImprovementStateFixture = JSON.stringify(\n canonicalAgentProfileImprovementStateFixture,\n)\n\n/** A proposal produced by Runtime's opaque profile-improvement path. */\nexport type AgentProfileImprovementProposalFixture = Omit<\n AgentImprovementProposal,\n 'evaluation'\n> & {\n evaluation: AgentProfileImprovementMeasuredComparison\n}\n\n/** Complete private state for exercising profile activation and restore in consumer tests. */\nexport interface AgentProfileImprovementFixture {\n proposal: AgentProfileImprovementProposalFixture\n baselineProfile: AgentProfile\n candidateProfile: AgentProfile\n recommendedSize: SandboxSizePreset\n}\n\n/** Load an isolated, production-validated Runtime proposal for consumer tests. */\nexport function loadAgentImprovementProposalFixture(): AgentImprovementProposal {\n return verifyAgentImprovementProposal(JSON.parse(serializedAgentImprovementProposalFixture))\n}\n\n/** Load an isolated profile proposal and its private activation state for consumer tests. */\nexport function loadAgentProfileImprovementFixture(): AgentProfileImprovementFixture {\n const proposal = loadAgentProfileImprovementProposal()\n const state = parseAgentProfileImprovementState(\n JSON.parse(serializedAgentProfileImprovementStateFixture),\n )\n const experiment = proposal.evaluation.experiment\n const baselineStateDigest = profileStateDigest(state.baselineProfile, state.recommendedSize)\n const candidateStateDigest = profileStateDigest(state.candidateProfile, state.recommendedSize)\n if (\n baselineStateDigest !== experiment.baseline.stateDigest ||\n candidateStateDigest !== experiment.candidate.stateDigest\n ) {\n throw new Error('profile improvement fixture state does not match its proposal')\n }\n const appliedCandidate = experiment.change.reduce(\n (profile, change, index) =>\n applyExactAgentProfileDiff(profile, change, `profile improvement fixture change ${index}`),\n state.baselineProfile,\n )\n if (\n canonicalCandidateDigest(appliedCandidate) !== canonicalCandidateDigest(state.candidateProfile)\n ) {\n throw new Error('profile improvement fixture candidate does not match its proposal changes')\n }\n return immutableCandidateValue({ proposal, ...state })\n}\n\nfunction loadAgentProfileImprovementProposal(): AgentProfileImprovementProposalFixture {\n const proposal = verifyAgentImprovementProposal(\n JSON.parse(serializedAgentProfileImprovementProposalFixture),\n )\n if (proposal.evaluation.kind !== 'agent-profile-improvement-measured-comparison') {\n throw new Error('profile improvement fixture contains a sealed candidate comparison')\n }\n return { ...proposal, evaluation: proposal.evaluation }\n}\n\nfunction parseAgentProfileImprovementState(\n input: unknown,\n): Omit<AgentProfileImprovementFixture, 'proposal'> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n throw new Error('profile improvement fixture state must be an object')\n }\n const record = input as Record<string, unknown>\n const fields = Object.keys(record).sort()\n const expectedFields = ['baselineProfile', 'candidateProfile', 'recommendedSize']\n if (\n fields.length !== expectedFields.length ||\n fields.some((field, i) => field !== expectedFields[i])\n ) {\n throw new Error('profile improvement fixture state contains unsupported fields')\n }\n const recommendedSize = SANDBOX_SIZE_PRESET_NAMES.find((size) => size === record.recommendedSize)\n if (!recommendedSize) {\n throw new Error('profile improvement fixture has an invalid recommended size')\n }\n return {\n baselineProfile: parseExactAgentProfile(\n record.baselineProfile,\n 'profile improvement fixture baseline',\n ),\n candidateProfile: parseExactAgentProfile(\n record.candidateProfile,\n 'profile improvement fixture candidate',\n ),\n recommendedSize,\n }\n}\n\nfunction profileStateDigest(\n profile: AgentProfile,\n recommendedSize: SandboxSizePreset,\n): ReturnType<typeof canonicalCandidateDigest> {\n return canonicalCandidateDigest({ definition: profile, recommendedSize })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AGiCA,MAAM,4CAA4C,KAAK,UACrDA,kCACF;AACA,MAAM,mDAAmD,KAAK,UAC5DC,0CACF;AACA,MAAM,gDAAgD,KAAK,UACzDC,uCACF;;AAmBA,SAAgB,sCAAgE;CAC9E,OAAO,+BAA+B,KAAK,MAAM,yCAAyC,CAAC;AAC7F;;AAGA,SAAgB,qCAAqE;CACnF,MAAM,WAAW,oCAAoC;CACrD,MAAM,QAAQ,kCACZ,KAAK,MAAM,6CAA6C,CAC1D;CACA,MAAM,aAAa,SAAS,WAAW;CACvC,MAAM,sBAAsB,mBAAmB,MAAM,iBAAiB,MAAM,eAAe;CAC3F,MAAM,uBAAuB,mBAAmB,MAAM,kBAAkB,MAAM,eAAe;CAC7F,IACE,wBAAwB,WAAW,SAAS,eAC5C,yBAAyB,WAAW,UAAU,aAE9C,MAAM,IAAI,MAAM,+DAA+D;CAOjF,IACEC,2BANuB,WAAW,OAAO,QACxC,SAAS,QAAQ,UAChB,2BAA2B,SAAS,QAAQ,sCAAsC,OAAO,GAC3F,MAAM,eAGkC,CAAC,MAAMA,2BAAyB,MAAM,gBAAgB,GAE9F,MAAM,IAAI,MAAM,2EAA2E;CAE7F,OAAO,wBAAwB;EAAE;EAAU,GAAG;CAAM,CAAC;AACvD;AAEA,SAAS,sCAA8E;CACrF,MAAM,WAAW,+BACf,KAAK,MAAM,gDAAgD,CAC7D;CACA,IAAI,SAAS,WAAW,SAAS,iDAC/B,MAAM,IAAI,MAAM,oEAAoE;CAEtF,OAAO;EAAE,GAAG;EAAU,YAAY,SAAS;CAAW;AACxD;AAEA,SAAS,kCACP,OACkD;CAClD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,MAAM,qDAAqD;CAEvE,MAAM,SAAS;CACf,MAAM,SAAS,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK;CACxC,MAAM,iBAAiB;EAAC;EAAmB;EAAoB;CAAiB;CAChF,IACE,OAAO,WAAW,eAAe,UACjC,OAAO,MAAM,OAAO,MAAM,UAAU,eAAe,EAAE,GAErD,MAAM,IAAI,MAAM,+DAA+D;CAEjF,MAAM,kBAAkB,0BAA0B,MAAM,SAAS,SAAS,OAAO,eAAe;CAChG,IAAI,CAAC,iBACH,MAAM,IAAI,MAAM,6DAA6D;CAE/E,OAAO;EACL,iBAAiB,uBACf,OAAO,iBACP,sCACF;EACA,kBAAkB,uBAChB,OAAO,kBACP,uCACF;EACA;CACF;AACF;AAEA,SAAS,mBACP,SACA,iBAC6C;CAC7C,OAAOA,2BAAyB;EAAE,YAAY;EAAS;CAAgB,CAAC;AAC1E"}
1
+ {"version":3,"file":"testing.js","names":["canonicalAgentImprovementProposalFixture","canonicalAgentProfileImprovementProposalFixture","canonicalAgentProfileImprovementStateFixture","canonicalCandidateDigest"],"sources":["../src/testing/fixtures/agent-improvement-proposal.json","../src/testing/fixtures/agent-profile-improvement-proposal.json","../src/testing/fixtures/agent-profile-improvement-state.json","../src/testing/index.ts"],"sourcesContent":["","","","import {\n type AgentImprovementProposal,\n type AgentProfile,\n type AgentProfileImprovementMeasuredComparison,\n SANDBOX_SIZE_PRESET_NAMES,\n type SandboxSizePreset,\n} from '@tangle-network/agent-interface'\n\nimport { canonicalCandidateDigest, immutableCandidateValue } from '../candidate-execution/digest'\nimport { applyExactAgentProfileDiff, parseExactAgentProfile } from '../candidate-execution/profile'\nimport { verifyAgentImprovementProposal } from '../intelligence/improvement-cycle'\nimport canonicalAgentImprovementProposalFixture from './fixtures/agent-improvement-proposal.json'\nimport canonicalAgentProfileImprovementProposalFixture from './fixtures/agent-profile-improvement-proposal.json'\nimport canonicalAgentProfileImprovementStateFixture from './fixtures/agent-profile-improvement-state.json'\n\nexport {\n type DriverAgentOptions,\n driverAgent,\n} from '../runtime/supervise/coordination-driver'\nexport {\n type RunGraphTestOptions,\n runGraphWithTestBrain,\n} from '../runtime/supervise/graph'\nexport {\n type SuperviseTestOptions,\n superviseWithTestBrain,\n} from '../runtime/supervise/supervise'\nexport {\n type SupervisorAgentTestDeps,\n supervisorAgentWithTestBrain,\n} from '../runtime/supervise/supervisor-agent'\nexport type { ToolLoopCallContext, ToolLoopChat } from '../runtime/tool-loop'\n\nconst serializedAgentImprovementProposalFixture = JSON.stringify(\n canonicalAgentImprovementProposalFixture,\n)\nconst serializedAgentProfileImprovementProposalFixture = JSON.stringify(\n canonicalAgentProfileImprovementProposalFixture,\n)\nconst serializedAgentProfileImprovementStateFixture = JSON.stringify(\n canonicalAgentProfileImprovementStateFixture,\n)\n\n/** A proposal produced by Runtime's opaque profile-improvement path. */\nexport type AgentProfileImprovementProposalFixture = Omit<\n AgentImprovementProposal,\n 'evaluation'\n> & {\n evaluation: AgentProfileImprovementMeasuredComparison\n}\n\n/** Complete private state for exercising profile activation and restore in consumer tests. */\nexport interface AgentProfileImprovementFixture {\n proposal: AgentProfileImprovementProposalFixture\n baselineProfile: AgentProfile\n candidateProfile: AgentProfile\n recommendedSize: SandboxSizePreset\n}\n\n/** Load an isolated, production-validated Runtime proposal for consumer tests. */\nexport function loadAgentImprovementProposalFixture(): AgentImprovementProposal {\n return verifyAgentImprovementProposal(JSON.parse(serializedAgentImprovementProposalFixture))\n}\n\n/** Load an isolated profile proposal and its private activation state for consumer tests. */\nexport function loadAgentProfileImprovementFixture(): AgentProfileImprovementFixture {\n const proposal = loadAgentProfileImprovementProposal()\n const state = parseAgentProfileImprovementState(\n JSON.parse(serializedAgentProfileImprovementStateFixture),\n )\n const experiment = proposal.evaluation.experiment\n const baselineStateDigest = profileStateDigest(state.baselineProfile, state.recommendedSize)\n const candidateStateDigest = profileStateDigest(state.candidateProfile, state.recommendedSize)\n if (\n baselineStateDigest !== experiment.baseline.stateDigest ||\n candidateStateDigest !== experiment.candidate.stateDigest\n ) {\n throw new Error('profile improvement fixture state does not match its proposal')\n }\n const appliedCandidate = experiment.change.reduce(\n (profile, change, index) =>\n applyExactAgentProfileDiff(profile, change, `profile improvement fixture change ${index}`),\n state.baselineProfile,\n )\n if (\n canonicalCandidateDigest(appliedCandidate) !== canonicalCandidateDigest(state.candidateProfile)\n ) {\n throw new Error('profile improvement fixture candidate does not match its proposal changes')\n }\n return immutableCandidateValue({ proposal, ...state })\n}\n\nfunction loadAgentProfileImprovementProposal(): AgentProfileImprovementProposalFixture {\n const proposal = verifyAgentImprovementProposal(\n JSON.parse(serializedAgentProfileImprovementProposalFixture),\n )\n if (proposal.evaluation.kind !== 'agent-profile-improvement-measured-comparison') {\n throw new Error('profile improvement fixture contains a sealed candidate comparison')\n }\n return { ...proposal, evaluation: proposal.evaluation }\n}\n\nfunction parseAgentProfileImprovementState(\n input: unknown,\n): Omit<AgentProfileImprovementFixture, 'proposal'> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n throw new Error('profile improvement fixture state must be an object')\n }\n const record = input as Record<string, unknown>\n const fields = Object.keys(record).sort()\n const expectedFields = ['baselineProfile', 'candidateProfile', 'recommendedSize']\n if (\n fields.length !== expectedFields.length ||\n fields.some((field, i) => field !== expectedFields[i])\n ) {\n throw new Error('profile improvement fixture state contains unsupported fields')\n }\n const recommendedSize = SANDBOX_SIZE_PRESET_NAMES.find((size) => size === record.recommendedSize)\n if (!recommendedSize) {\n throw new Error('profile improvement fixture has an invalid recommended size')\n }\n return {\n baselineProfile: parseExactAgentProfile(\n record.baselineProfile,\n 'profile improvement fixture baseline',\n ),\n candidateProfile: parseExactAgentProfile(\n record.candidateProfile,\n 'profile improvement fixture candidate',\n ),\n recommendedSize,\n }\n}\n\nfunction profileStateDigest(\n profile: AgentProfile,\n recommendedSize: SandboxSizePreset,\n): ReturnType<typeof canonicalCandidateDigest> {\n return canonicalCandidateDigest({ definition: profile, recommendedSize })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AGiCA,MAAM,4CAA4C,KAAK,UACrDA,kCACF;AACA,MAAM,mDAAmD,KAAK,UAC5DC,0CACF;AACA,MAAM,gDAAgD,KAAK,UACzDC,uCACF;;AAmBA,SAAgB,sCAAgE;CAC9E,OAAO,+BAA+B,KAAK,MAAM,yCAAyC,CAAC;AAC7F;;AAGA,SAAgB,qCAAqE;CACnF,MAAM,WAAW,oCAAoC;CACrD,MAAM,QAAQ,kCACZ,KAAK,MAAM,6CAA6C,CAC1D;CACA,MAAM,aAAa,SAAS,WAAW;CACvC,MAAM,sBAAsB,mBAAmB,MAAM,iBAAiB,MAAM,eAAe;CAC3F,MAAM,uBAAuB,mBAAmB,MAAM,kBAAkB,MAAM,eAAe;CAC7F,IACE,wBAAwB,WAAW,SAAS,eAC5C,yBAAyB,WAAW,UAAU,aAE9C,MAAM,IAAI,MAAM,+DAA+D;CAOjF,IACEC,2BANuB,WAAW,OAAO,QACxC,SAAS,QAAQ,UAChB,2BAA2B,SAAS,QAAQ,sCAAsC,OAAO,GAC3F,MAAM,eAGkC,CAAC,MAAMA,2BAAyB,MAAM,gBAAgB,GAE9F,MAAM,IAAI,MAAM,2EAA2E;CAE7F,OAAO,wBAAwB;EAAE;EAAU,GAAG;CAAM,CAAC;AACvD;AAEA,SAAS,sCAA8E;CACrF,MAAM,WAAW,+BACf,KAAK,MAAM,gDAAgD,CAC7D;CACA,IAAI,SAAS,WAAW,SAAS,iDAC/B,MAAM,IAAI,MAAM,oEAAoE;CAEtF,OAAO;EAAE,GAAG;EAAU,YAAY,SAAS;CAAW;AACxD;AAEA,SAAS,kCACP,OACkD;CAClD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,MAAM,qDAAqD;CAEvE,MAAM,SAAS;CACf,MAAM,SAAS,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK;CACxC,MAAM,iBAAiB;EAAC;EAAmB;EAAoB;CAAiB;CAChF,IACE,OAAO,WAAW,eAAe,UACjC,OAAO,MAAM,OAAO,MAAM,UAAU,eAAe,EAAE,GAErD,MAAM,IAAI,MAAM,+DAA+D;CAEjF,MAAM,kBAAkB,0BAA0B,MAAM,SAAS,SAAS,OAAO,eAAe;CAChG,IAAI,CAAC,iBACH,MAAM,IAAI,MAAM,6DAA6D;CAE/E,OAAO;EACL,iBAAiB,uBACf,OAAO,iBACP,sCACF;EACA,kBAAkB,uBAChB,OAAO,kBACP,uCACF;EACA;CACF;AACF;AAEA,SAAS,mBACP,SACA,iBAC6C;CAC7C,OAAOA,2BAAyB;EAAE,YAAY;EAAS;CAAgB,CAAC;AAC1E"}
@@ -1,4 +1,4 @@
1
- import { f as safeWorkerFile, h as supervisorWorkersDir, i as legacySupervisorRunsRoot, m as supervisorRunsRoot, n as cancelWorker, t as cancelRun, w as writeWorkerSteer } from "./run-layout-C2jgwsCq.js";
1
+ import { _ as supervisorWorkersDir, a as legacySupervisorRunsRoot, g as supervisorRunsRoot, j as writeWorkerSteer, m as safeWorkerFile, n as cancelWorker, t as cancelRun } from "./run-layout-Cd_l2XWV.js";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { basename, join, resolve } from "node:path";
4
4
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
@@ -162,6 +162,7 @@ function buildSupervisorView(state, stateDir, events, progressTail, now, workerE
162
162
  const verdict = describeVerdict(event.verdict);
163
163
  if (verdict) worker.verdict = verdict;
164
164
  worker.spend = addSpend(worker.spend, parseSpend(event.spent));
165
+ worker.metered = emptySpend;
165
166
  continue;
166
167
  }
167
168
  if (event.kind === "cancelled") {
@@ -174,15 +175,22 @@ function buildSupervisorView(state, stateDir, events, progressTail, now, workerE
174
175
  }
175
176
  if (event.kind === "metered") {
176
177
  const spend = parseSpend(event.spend);
177
- if (isRoot(event.id)) driverSpend = addSpend(driverSpend, spend);
178
- else {
178
+ if (isRoot(event.id)) {
179
+ if (event.accountingOnly !== true) driverSpend = addSpend(driverSpend, spend);
180
+ } else {
179
181
  const worker = ensureWorker(workers, event.id, event.id);
180
- worker.metered = addSpend(worker.metered, spend);
182
+ if (event.accountingOnly !== true) worker.metered = addSpend(worker.metered, spend);
181
183
  }
184
+ continue;
185
+ }
186
+ if (event.kind === "progress") {
187
+ if (isRoot(event.id)) continue;
188
+ const worker = ensureWorker(workers, event.id, event.id);
189
+ worker.metered = parseSpend(event.spend);
182
190
  }
183
191
  }
184
192
  const workerViews = [...workers.values()].map((worker) => {
185
- const tail = workerEventTails.get(worker.label) ?? workerEventTails.get(safeWorkerFile(worker.label)) ?? workerEventTails.get(worker.id);
193
+ const tail = workerEventTails.get(worker.label) ?? workerEventTails.get(safeWorkerFile(worker.label)) ?? workerEventTails.get(safeWorkerFile(worker.id)) ?? workerEventTails.get(worker.id);
186
194
  worker.liveTail = tail?.lines ?? [];
187
195
  if (tail?.file) worker.eventFile = tail.file;
188
196
  return finalizeWorker(worker, now);
@@ -547,6 +555,10 @@ function renderJournalTail(supervisor, width, color) {
547
555
  const spend = parseSpend(event.spend);
548
556
  return ` ${at} ${paint("meter", "cyan", color)} ${pad(event.id, 18)} ${formatMoney(spend.usd)} ${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`;
549
557
  }
558
+ if (event.kind === "progress") {
559
+ const spend = parseSpend(event.spend);
560
+ return ` ${at} ${paint("live", "blue", color)} ${pad(event.id, 18)} ${formatMoney(spend.usd)} ${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`;
561
+ }
550
562
  return ` ${at} ${paint("cancel", "red", color)} ${pad(event.id, 18)} ${compact(event.reason ?? "", width - 32)}`;
551
563
  });
552
564
  }
@@ -780,7 +792,7 @@ function isSupervisorState(value) {
780
792
  return value !== void 0 && typeof value.id === "string" && typeof value.status === "string" && typeof value.task === "string" && typeof value.workspaceDir === "string" && typeof value.budget === "number";
781
793
  }
782
794
  function isSpawnEvent(value) {
783
- return value.kind === "spawned" && typeof value.id === "string" || value.kind === "settled" && typeof value.id === "string" || value.kind === "cancelled" && typeof value.id === "string" || value.kind === "metered" && typeof value.id === "string";
795
+ return value.kind === "spawned" && typeof value.id === "string" || value.kind === "settled" && typeof value.id === "string" || value.kind === "cancelled" && typeof value.id === "string" || value.kind === "metered" && typeof value.id === "string" || value.kind === "progress" && typeof value.id === "string";
784
796
  }
785
797
  function isRecord(value) {
786
798
  return typeof value === "object" && value !== null;
@@ -1084,8 +1096,12 @@ function submitSteerInput() {
1084
1096
  return;
1085
1097
  }
1086
1098
  try {
1087
- const written = writeWorkerSteer(state.root, supervisor.id, worker.label, message, "human");
1088
- state.notice = `steer queued for ${supervisor.id}/${written.worker}`;
1099
+ const written = writeWorkerSteer(state.root, supervisor.id, worker.id, {
1100
+ operationId: randomUUID(),
1101
+ message,
1102
+ source: "agent-runtime-top"
1103
+ });
1104
+ state.notice = `steer queued for ${supervisor.id}/${worker.label} (op ${written.request.operationId})`;
1089
1105
  } catch (err) {
1090
1106
  state.notice = `steer failed: ${err instanceof Error ? err.message : String(err)}`;
1091
1107
  }
@@ -1189,4 +1205,4 @@ function wrap(value, size) {
1189
1205
  //#endregion
1190
1206
  export { renderTopFrameWithLayout as a, renderTopFrame as i, runTopApp as n, loadTopSnapshot as r, renderTopOnce as t };
1191
1207
 
1192
- //# sourceMappingURL=top-app-3rYfFPTW.js.map
1208
+ //# sourceMappingURL=top-app-DIBApkt1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"top-app-DIBApkt1.js","names":[],"sources":["../src/tui/top-model.ts","../src/tui/top-app.ts"],"sourcesContent":["/**\n * The read side of the supervisor-run TUI: turn the on-disk run layout into one `TopSnapshot`, and\n * render that snapshot to an ANSI frame.\n *\n * This module never derives a run path itself. Every directory and per-worker file it reads comes\n * from `../runtime/supervise/run-layout` — the same module the writers use — so the reader cannot\n * drift from the layout the way an independently-versioned copy of the contract would.\n *\n * Extracted from the `loops` repo (`src/top-model.ts`), which held a hand-joined copy of the\n * layout. Rendering is deliberately unchanged: raw ANSI, zero dependencies.\n *\n * This is the OPERATOR view: what is on disk right now, for a human watching a workspace. It\n * carries no model-call identity, so its per-supervisor totals cannot be joined with root stream\n * events without double counting. A client that needs one execution's totals reads\n * `projectPursuit` from `../durable` instead.\n *\n * @experimental\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport {\n legacySupervisorRunsRoot,\n safeWorkerFile,\n supervisorRunsRoot,\n supervisorWorkersDir,\n} from '../runtime/supervise/run-layout'\n\nexport interface TopSnapshot {\n readonly root: string\n readonly generatedAt: number\n readonly supervisors: SupervisorView[]\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 whose state.json parsed into a valid supervisor view. */\n readonly loaded: number\n}\n\nexport type TopSnapshotCompleteness = 'complete' | 'partial'\n\nexport type TopSnapshotDiagnosticSource =\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 runId?: string\n readonly path: string\n readonly reason: TopSnapshotDiagnosticReason\n}\n\nexport interface SupervisorBase {\n readonly id: string\n readonly status: string\n readonly task: string\n readonly workspaceDir: string\n readonly budget: number\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 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 tokensInput: number\n readonly tokensOutput: number\n readonly tokensTotal: number\n readonly usd: 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 interface BudgetStats {\n readonly maxIterations?: number\n readonly maxTokens?: number\n readonly maxUsd?: number\n}\n\nexport interface SpendStats {\n readonly iterations: number\n readonly tokensInput: number\n readonly tokensOutput: number\n readonly usd: number\n readonly ms: number\n}\n\nexport type TopJournalEvent =\n | {\n readonly kind: 'spawned'\n readonly id: string\n readonly parent?: string\n readonly label?: string\n readonly budget?: unknown\n readonly runtime?: string\n readonly seq?: number\n readonly at?: string\n }\n | {\n readonly kind: 'settled'\n readonly id: string\n readonly status?: string\n readonly outRef?: string\n readonly verdict?: unknown\n readonly spent?: unknown\n readonly infra?: boolean\n readonly seq?: number\n readonly at?: string\n }\n | {\n readonly kind: 'cancelled'\n readonly id: string\n readonly reason?: string\n readonly seq?: number\n readonly at?: string\n }\n | {\n readonly kind: 'metered'\n readonly id: string\n readonly spend?: unknown\n readonly accountingOnly?: boolean\n readonly seq?: number\n readonly at?: string\n }\n | {\n readonly kind: 'progress'\n readonly id: string\n readonly spend?: unknown\n readonly seq?: number\n readonly at?: string\n }\n\ninterface SupervisorState extends SupervisorBase {\n readonly result?: {\n readonly spentUsd?: number\n readonly spentTokens?: number\n }\n}\n\ninterface MutableWorker {\n id: string\n label: string\n eventFile?: string\n parent?: string\n runtime?: string\n status: 'running' | 'done' | 'down' | 'cancelled'\n verdict?: string\n infra?: boolean\n startedAt?: string\n endedAt?: string\n budget?: BudgetStats\n spend: SpendStats\n metered: SpendStats\n liveTail: string[]\n outRef?: string\n reason?: string\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\nexport interface 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\nexport interface RenderedTopFrame {\n readonly frame: string\n readonly targets: RenderTarget[]\n}\n\nconst emptySpend: SpendStats = { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }\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/**\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 = Date.now()): TopSnapshot {\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 = readProgressTail(dir, 8)\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 progress.value,\n now,\n workerEvents.value,\n ),\n )\n }\n }\n supervisors.sort((a, b) => String(b.startedAt ?? '').localeCompare(String(a.startedAt ?? '')))\n return {\n root,\n generatedAt: now,\n supervisors,\n completeness: diagnostics.length === 0 ? 'complete' : 'partial',\n diagnostics,\n discovered,\n loaded: supervisors.length,\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 event = (parsed.event ?? parsed) as Record<string, unknown>\n 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): SupervisorView {\n const workers = new Map<string, MutableWorker>()\n let driverSpend = emptySpend\n // `state.json` and the spawn journal are written by DIFFERENT producers, and their ids need not\n // agree: the journal's root is the runtime's `runId`, which defaults to a literal unrelated to\n // the supervisor id the state file records. Recover the journal's own root from its parentless\n // root spawn, and treat EITHER id as the root everywhere. Checking only `state.id` — which the\n // metered/settled/cancelled branches used to do — manufactures a phantom worker named after the\n // runId that never settles, sorts first as RUNNING, and silently captures every steer and cancel.\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 (event.kind === 'spawned') {\n if (isRoot(event.id) || (!event.parent && event.label === 'root')) continue\n const worker = ensureWorker(workers, event.id, event.label ?? event.id)\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 continue\n }\n\n if (event.kind === 'settled') {\n if (isRoot(event.id)) continue\n const worker = ensureWorker(workers, event.id, event.id)\n worker.status = event.status === 'down' ? 'down' : 'done'\n if (event.at) worker.endedAt = event.at\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 worker.spend = addSpend(worker.spend, parseSpend(event.spent))\n // Live progress is cumulative observation. The terminal spend replaces it, so do not add\n // the two channels or a worker's final cost would be counted twice.\n worker.metered = emptySpend\n continue\n }\n\n if (event.kind === 'cancelled') {\n if (isRoot(event.id)) continue\n const worker = ensureWorker(workers, event.id, event.id)\n worker.status = 'cancelled'\n if (event.at) worker.endedAt = event.at\n if (event.reason) worker.reason = event.reason\n continue\n }\n\n if (event.kind === 'metered') {\n const spend = parseSpend(event.spend)\n if (isRoot(event.id)) {\n if (event.accountingOnly !== true) driverSpend = addSpend(driverSpend, spend)\n } else {\n const worker = ensureWorker(workers, event.id, event.id)\n if (event.accountingOnly !== true) worker.metered = addSpend(worker.metered, spend)\n }\n continue\n }\n\n if (event.kind === 'progress') {\n if (isRoot(event.id)) continue\n const worker = ensureWorker(workers, event.id, event.id)\n worker.metered = parseSpend(event.spend)\n }\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 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.verifyCmd ? { verifyCmd: state.verifyCmd } : {}),\n ...(state.workerModel ? { workerModel: state.workerModel } : {}),\n ...(state.driverModel ? { driverModel: state.driverModel } : {}),\n ...(state.verdict ? { verdict: state.verdict } : {}),\n ...(state.progress ? { progress: state.progress } : {}),\n ...(state.startedAt ? { startedAt: state.startedAt } : {}),\n ...(state.completedAt ? { completedAt: state.completedAt } : {}),\n ...(state.maxSandboxes !== undefined ? { maxSandboxes: state.maxSandboxes } : {}),\n ...(state.maxLifetimeSeconds !== undefined\n ? { maxLifetimeSeconds: state.maxLifetimeSeconds }\n : {}),\n ...(state.idleTimeoutSeconds !== undefined\n ? { idleTimeoutSeconds: state.idleTimeoutSeconds }\n : {}),\n ...(state.maxUsd !== undefined ? { maxUsd: state.maxUsd } : {}),\n ...(state.maxDepth !== undefined ? { maxDepth: state.maxDepth } : {}),\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\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 = selectSupervisor(snapshot, options.selectedSupervisorId)\n const selectedWorker = selectedSupervisor\n ? selectWorker(selectedSupervisor, 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)} tok ${formatTokens(aggregate.tokensInput)}/${formatTokens(aggregate.tokensOutput)}`,\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), 12)} ` +\n `${pad(`${formatTokens(supervisor.totals.tokensInput)}/${formatTokens(supervisor.totals.tokensOutput)}`, 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), 11)} ` +\n `${pad(`${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`, 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 renderCostBars(selectedSupervisor, width, color)) push(line)\n push()\n for (const line of renderTokenBars(selectedSupervisor, width, color)) 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 ensureWorker(\n workers: Map<string, MutableWorker>,\n id: string,\n label: string,\n): MutableWorker {\n const existing = workers.get(id)\n if (existing) return existing\n const created: MutableWorker = {\n id,\n label,\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 {\n id: worker.id,\n label: worker.label,\n ...(worker.eventFile ? { eventFile: worker.eventFile } : {}),\n ...(worker.parent ? { parent: worker.parent } : {}),\n ...(worker.runtime ? { runtime: worker.runtime } : {}),\n status: worker.status,\n ...(worker.verdict ? { verdict: worker.verdict } : {}),\n ...(worker.infra !== undefined ? { infra: worker.infra } : {}),\n ...(worker.startedAt ? { startedAt: worker.startedAt } : {}),\n ...(worker.endedAt ? { endedAt: worker.endedAt } : {}),\n latencyMs,\n ...(worker.budget ? { budget: worker.budget } : {}),\n spend: worker.spend,\n metered: worker.metered,\n liveTail: worker.liveTail,\n ...(worker.outRef ? { outRef: worker.outRef } : {}),\n ...(worker.reason ? { reason: worker.reason } : {}),\n }\n}\n\nfunction supervisorTotals(\n state: SupervisorState,\n workers: readonly WorkerView[],\n driverSpend: SpendStats,\n now: number,\n): SupervisorTotals {\n const workerSpends = workers.map(totalSpend)\n const tokenInput = sum(workerSpends.map((spend) => spend.tokensInput)) + driverSpend.tokensInput\n const tokenOutput =\n sum(workerSpends.map((spend) => spend.tokensOutput)) + driverSpend.tokensOutput\n const computedUsd = sum(workerSpends.map((spend) => spend.usd)) + driverSpend.usd\n const usd = computedUsd > 0 ? computedUsd : (state.result?.spentUsd ?? 0)\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 running: workers.filter((worker) => worker.status === 'running').length,\n done: workers.filter((worker) => worker.status === 'done').length,\n down: workers.filter((worker) => worker.status === 'down').length,\n cancelled: workers.filter((worker) => worker.status === 'cancelled').length,\n inFlight: workers.filter((worker) => worker.status === 'running').length,\n settled: workers.filter((worker) => worker.status !== 'running').length,\n tokensInput: tokenInput,\n tokensOutput: tokenOutput,\n tokensTotal: tokenInput + tokenOutput,\n usd,\n latencyMs,\n workerLatency: distribution(latencies),\n }\n}\n\nfunction aggregateSnapshot(snapshot: TopSnapshot): {\n supervisors: number\n workers: number\n running: number\n done: number\n down: number\n usd: number\n tokensInput: number\n tokensOutput: number\n} {\n return {\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\nfunction 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 }\n}\n\nfunction parseSpend(value: unknown): SpendStats {\n if (!isRecord(value)) return emptySpend\n const tokens = isRecord(value.tokens) ? value.tokens : {}\n return {\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 if (values.length === 0) return { n: 0, min: 0, median: 0, p90: 0, max: 0 }\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\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 renderCostBars(supervisor: SupervisorView, width: number, color: boolean): string[] {\n const workers = supervisor.workers\n .map((worker) => ({ worker, spend: totalSpend(worker) }))\n .sort((a, b) => b.spend.usd - a.spend.usd)\n .slice(0, 6)\n const maxUsd = Math.max(\n 0.000001,\n ...workers.map((row) => row.spend.usd),\n supervisor.driverSpend.usd,\n )\n const out = [\n `cost total ${formatMoney(supervisor.totals.usd)} driver ${formatMoney(supervisor.driverSpend.usd)}`,\n ]\n const barWidth = Math.max(18, Math.min(46, width - 38))\n for (const row of workers) {\n out.push(\n ` ${pad(row.worker.label, 12)} ${bar(row.spend.usd, maxUsd, barWidth, '$', color, 'magenta')} ${formatMoney(row.spend.usd)}`,\n )\n }\n if (workers.length === 0) out.push(' no worker cost yet')\n return out\n}\n\nfunction renderTokenBars(supervisor: SupervisorView, width: number, color: boolean): string[] {\n const rows = supervisor.workers\n .map((worker) => ({\n worker,\n spend: totalSpend(worker),\n total: totalSpend(worker).tokensInput + totalSpend(worker).tokensOutput,\n }))\n .sort((a, b) => b.total - a.total)\n .slice(0, 6)\n const maxTokens = Math.max(\n 1,\n ...rows.map((row) => row.total),\n supervisor.driverSpend.tokensInput + supervisor.driverSpend.tokensOutput,\n )\n const out = [\n `tokens total in ${formatTokens(supervisor.totals.tokensInput)} / out ${formatTokens(supervisor.totals.tokensOutput)} ` +\n `driver ${formatTokens(supervisor.driverSpend.tokensInput)}/${formatTokens(supervisor.driverSpend.tokensOutput)}`,\n ]\n const barWidth = Math.max(18, Math.min(46, width - 44))\n for (const row of rows) {\n out.push(\n ` ${pad(row.worker.label, 12)} ${stackedTokenBar(row.spend.tokensInput, row.spend.tokensOutput, maxTokens, barWidth, color)} ` +\n `${formatTokens(row.spend.tokensInput)}/${formatTokens(row.spend.tokensOutput)}`,\n )\n }\n if (rows.length === 0) out.push(' no worker 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)}/${formatTokens(spend.tokensOutput)} cost ${formatMoney(spend.usd)} 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 === 'settled') {\n const spend = parseSpend(event.spent)\n return ` ${at} ${statusText(event.status ?? 'settled', color)} ${pad(event.id, 18)} ${formatMoney(spend.usd)} ${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`\n }\n if (event.kind === 'metered') {\n const spend = parseSpend(event.spend)\n return ` ${at} ${paint('meter', 'cyan', color)} ${pad(event.id, 18)} ${formatMoney(spend.usd)} ${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`\n }\n if (event.kind === 'progress') {\n const spend = parseSpend(event.spend)\n return ` ${at} ${paint('live', 'blue', color)} ${pad(event.id, 18)} ${formatMoney(spend.usd)} ${formatTokens(spend.tokensInput)}/${formatTokens(spend.tokensOutput)}`\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 selectSupervisor(\n snapshot: TopSnapshot,\n requested: string | undefined,\n): SupervisorView | undefined {\n if (requested) {\n const found = snapshot.supervisors.find((supervisor) => supervisor.id === requested)\n if (found) return found\n }\n return snapshot.supervisors[0]\n}\n\nfunction selectWorker(\n supervisor: SupervisorView,\n requested: string | undefined,\n): WorkerView | undefined {\n if (requested) {\n const found = supervisor.workers.find((worker) => worker.id === requested)\n if (found) return found\n }\n return supervisor.workers[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 readProgressTail(dir: string, maxLines: number): SourceRead<string[]> {\n const path = 'progress.ndjson'\n const read = readSourceFile(join(dir, path), 'progress', path)\n return { value: tailLines(read.value, maxLines), diagnostics: read.diagnostics }\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 if (read.value === undefined)\n return {\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason: 'missing' }],\n }\n let parsed: Partial<SupervisorState>\n try {\n parsed = JSON.parse(read.value) as Partial<SupervisorState>\n } catch {\n return {\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason: 'partial-json' }],\n }\n }\n if (!isSupervisorState(parsed))\n return {\n value: undefined,\n diagnostics: [{ source: 'supervisor-state', path, reason: 'invalid-state' }],\n }\n return { value: parsed, diagnostics: [] }\n}\n\nfunction isSupervisorState(value: Partial<SupervisorState> | undefined): value is SupervisorState {\n return (\n value !== undefined &&\n typeof value.id === 'string' &&\n typeof value.status === 'string' &&\n typeof value.task === 'string' &&\n typeof value.workspaceDir === 'string' &&\n typeof value.budget === 'number'\n )\n}\n\nfunction isSpawnEvent(value: Record<string, unknown>): value is TopJournalEvent {\n return (\n (value.kind === 'spawned' && typeof value.id === 'string') ||\n (value.kind === 'settled' && typeof value.id === 'string') ||\n (value.kind === 'cancelled' && typeof value.id === 'string') ||\n (value.kind === 'metered' && typeof value.id === 'string') ||\n (value.kind === 'progress' && typeof value.id === 'string')\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\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nfunction 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\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): string {\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): string {\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 for (let i = 0; i < value.length; i += 1) {\n const ch = value[i]\n if (ch === '\\x1b') {\n const rest = value.slice(i)\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 // biome-ignore lint/suspicious/noControlCharactersInRegex: SGR sequences begin with ESC\n const match = /^\\x1b\\[[0-9;?]*[ -/]*[@-~]/.exec(rest)\n if (match) {\n out += match[0]\n i += match[0].length - 1\n continue\n }\n }\n if (visible >= width - 1) {\n out += '~'\n break\n }\n out += ch\n visible += 1\n }\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-model` 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 { resolve } from 'node:path'\nimport { emitKeypressEvents } from 'node:readline'\nimport { cancelRun, cancelWorker, writeWorkerSteer } from '../runtime/supervise/run-layout'\nimport {\n loadTopSnapshot,\n type RenderTarget,\n renderTopFrameWithLayout,\n type TopSnapshot,\n} from './top-model'\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()`. */\nexport interface 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 */\nexport function 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 })\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"],"mappings":"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"}
package/dist/tui/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as runTopApp } from "../top-app-3rYfFPTW.js";
2
+ import { n as runTopApp } from "../top-app-DIBApkt1.js";
3
3
  //#region src/tui/bin.ts
4
4
  /**
5
5
  * `agent-runtime-top` — watch the supervisor runs of one workspace.
@@ -1,3 +1,4 @@
1
+ import { an as provisionSupervisor, in as SupervisorCleanupReceipt, nn as ProvisionSupervisorRequest, rn as ProvisionedSupervisor, tn as ProvisionSupervisorConnection } from "../index-BnAiQVLD.js";
1
2
  //#region src/tui/top-app.d.ts
2
3
  /**
3
4
  * The interactive side of the supervisor-run TUI: a keypress/mouse loop over the frames
@@ -187,6 +188,13 @@ type TopJournalEvent = {
187
188
  readonly kind: 'metered';
188
189
  readonly id: string;
189
190
  readonly spend?: unknown;
191
+ readonly accountingOnly?: boolean;
192
+ readonly seq?: number;
193
+ readonly at?: string;
194
+ } | {
195
+ readonly kind: 'progress';
196
+ readonly id: string;
197
+ readonly spend?: unknown;
190
198
  readonly seq?: number;
191
199
  readonly at?: string;
192
200
  };
@@ -234,5 +242,5 @@ declare function renderTopFrame(snapshot: TopSnapshot, options?: RenderOptions):
234
242
  */
235
243
  declare function renderTopFrameWithLayout(snapshot: TopSnapshot, options?: RenderOptions): RenderedTopFrame;
236
244
  //#endregion
237
- export { type BudgetStats, type Distribution, type RenderOptions, type RenderTarget, type RenderedTopFrame, type SpendStats, type SupervisorBase, type SupervisorTotals, type SupervisorView, type TopAppOptions, type TopJournalEvent, type TopSnapshot, type TopSnapshotCompleteness, type TopSnapshotDiagnostic, type TopSnapshotDiagnosticReason, type TopSnapshotDiagnosticSource, type WorkerView, loadTopSnapshot, renderTopFrame, renderTopFrameWithLayout, renderTopOnce, runTopApp };
245
+ export { type BudgetStats, type Distribution, type ProvisionSupervisorConnection, type ProvisionSupervisorRequest, type ProvisionedSupervisor, type RenderOptions, type RenderTarget, type RenderedTopFrame, type SpendStats, type SupervisorBase, type SupervisorCleanupReceipt, type SupervisorTotals, type SupervisorView, type TopAppOptions, type TopJournalEvent, type TopSnapshot, type TopSnapshotCompleteness, type TopSnapshotDiagnostic, type TopSnapshotDiagnosticReason, type TopSnapshotDiagnosticSource, type WorkerView, loadTopSnapshot, provisionSupervisor, renderTopFrame, renderTopFrameWithLayout, renderTopOnce, runTopApp };
238
246
  //# sourceMappingURL=index.d.ts.map
package/dist/tui/index.js CHANGED
@@ -1,2 +1,3 @@
1
- import { a as renderTopFrameWithLayout, i as renderTopFrame, n as runTopApp, r as loadTopSnapshot, t as renderTopOnce } from "../top-app-3rYfFPTW.js";
2
- export { loadTopSnapshot, renderTopFrame, renderTopFrameWithLayout, renderTopOnce, runTopApp };
1
+ import { t as provisionSupervisor } from "../provision-supervisor-zA__ayUX.js";
2
+ import { a as renderTopFrameWithLayout, i as renderTopFrame, n as runTopApp, r as loadTopSnapshot, t as renderTopOnce } from "../top-app-DIBApkt1.js";
3
+ export { loadTopSnapshot, provisionSupervisor, renderTopFrame, renderTopFrameWithLayout, renderTopOnce, runTopApp };
@@ -1136,6 +1136,9 @@ interface Executor<Out> {
1136
1136
  * reads as `executor-exposes-no-interactive-session`, never as an empty handle.
1137
1137
  */
1138
1138
  interactive?(): WorkerInteractiveSession;
1139
+ /** Optional readiness signal for an executor whose exact interactive handle is created inside
1140
+ * `execute`. It resolves once to an available handle or a terminal unavailable reason. */
1141
+ interactiveReady?(): Promise<WorkerInteractiveSession>;
1139
1142
  /**
1140
1143
  * Optional provider-neutral CANCELLATION, distinct from `teardown`: it asks the backend to stop
1141
1144
  * the work and reports what the backend acknowledged, so a caller never has to read a local
@@ -1211,7 +1214,14 @@ type WorkerInteractiveUnavailableReason =
1211
1214
  * `interactive()` returns, so any executor — including one implemented outside this package —
1212
1215
  * answers with it. No first-party executor emits it yet: the sandbox arm must first ask its
1213
1216
  * provider whether it supports control, which agent-runtime#773 tracks. */
1214
- 'interactive-session-not-started';
1217
+ 'interactive-session-not-started' |
1218
+ /** A durable worker exists, but its process predates the exact binding contract or failed to
1219
+ * publish one. Runtime never guesses a provider session from conversation metadata. */
1220
+ 'interactive-binding-not-found' |
1221
+ /** The exact durable reference no longer resolves to a running provider process. */
1222
+ 'interactive-binding-stale' |
1223
+ /** The binding names a provider that this process did not register. */
1224
+ 'interactive-provider-not-registered';
1215
1225
  /**
1216
1226
  * One worker's attachable process, or the named reason there is none.
1217
1227
  *
@@ -2118,6 +2128,16 @@ type SpawnEvent = {
2118
2128
  providerModel?: ProviderModelExecutionEvidence;
2119
2129
  seq: number;
2120
2130
  at: string;
2131
+ } | {
2132
+ /** A live worker's cumulative metered spend, published while its stream is still running.
2133
+ * This is observation only: it never settles a node and never enters cost totals. The next
2134
+ * terminal `settled` event replaces it in read models, so a live snapshot can show movement
2135
+ * without charging the same spend twice. */
2136
+ kind: 'progress';
2137
+ id: NodeId;
2138
+ spend: Spend;
2139
+ seq: number;
2140
+ at: string;
2121
2141
  } | {
2122
2142
  /** A settled child whose executor teardown was never acknowledged: the run cannot prove the
2123
2143
  * resource is gone, so its capacity slot stays charged for the rest of the run. Recorded so
@@ -2290,6 +2310,9 @@ interface SupervisorOpts {
2290
2310
  readonly backend: string;
2291
2311
  readonly reason: 'no-env-channel' | 'no-worker-process' | 'caller-omitted';
2292
2312
  };
2313
+ /** Durable supervisor-run directory that receives exact worker interactive bindings.
2314
+ * `supervise({ runDir })` wires this automatically. Direct kernel callers omit it. */
2315
+ readonly interactiveBindingDir?: string;
2293
2316
  }
2294
2317
  /** Provider-observed model identity for the root manager's settled inference turns.
2295
2318
  * Runtime records this only from a Runtime-owned provider/bridge receipt; an authored profile
@@ -2491,4 +2514,4 @@ interface WidenGate<Out> {
2491
2514
  }
2492
2515
  //#endregion
2493
2516
  export { TreeView as $, RetainedRunIntentAdmission as $n, sanitizeRuntimeStreamEvent as $t, ProviderModelExecutionEvidence as A, RetainedInteractiveEnvironmentInput as An, RuntimeEventOtelOptions as At, Settled as B, RetainedInteractiveAdmission as Bn, padTraceId as Bt, NoWinnerError as C, ScopeProgressInput as Cn, EvalRunsExportResult as Ct, NodeStatus as D, ReconnectRetainedInteractiveRunOptions as Dn, OtelExportConfig as Dt, NodeSnapshot as E, readWorkerProgress as En, OtelAttribute as Et, RootMaterialization as F, NativeContextContinuationInput as Fn, createOtelExporter as Ft, SpawnRejection as G, RetainedRunAdmissionHook as Gn, RuntimeStreamEventSummary as Gt, SpawnJournal as H, RetainedInteractiveIntentAdmission as Hn, RuntimeEventCollector as Ht, RootProviderModelEvidence as I, ReconnectRetainedRunOptions as In, exportEvalRuns as It, SpendGap as J, RetainedRunDispatchedAdmission as Jn, SanitizedKnowledgeRequirement as Jt, Spend as K, RetainedRunCancelOptions as Kn, RuntimeTelemetryOptions as Kt, RootSignal as L, RecoverRetainedRunIntentOptions as Ln, generateSpanId as Lt, ResumedKeyState as M, RetainedInteractiveStartMaterial as Mn, buildLoopSpanNodes as Mt, ResumedWork as N, StartRetainedInteractiveRunOptions as Nn, buildRuntimeEventOtelSpans as Nt, ProfileMaterializationReceipt as O, RecoverRetainedInteractiveRunOptions as On, OtelExporter as Ot, RootHandle as P, NativeContextContinuationExecution as Pn, createOpenInferenceFileExporter as Pt, SupervisorOpts as Q, RetainedRunHandle as Qn, sanitizeKnowledgeReadinessReport as Qt, Runtime as R, RecoverRetainedRunOptions as Rn, loopEventToOtelSpan as Rt, MaterializedModelIdentity as S, ExecutorProgress as Sn, EvalRunsExportConfig as St, NodeId as T, createActivityLog as Tn, LoopSpanNode as Tt, SpawnOpts as U, RetainedInteractiveStartedAdmission as Un, RuntimeStreamEventCollector as Ut, SpawnEvent as V, RetainedInteractiveEnvironmentAdmission as Vn, toOtelAttributes as Vt, SpawnPrior as W, RetainedRunAdmission as Wn, RuntimeStreamEventSink as Wt, SupervisedResult as X, RetainedRunEnvironmentAdmission as Xn, createRuntimeStreamEventCollector as Xt, SteerableRootHandle as Y, RetainedRunEffect as Yn, createRuntimeEventCollector as Yt, Supervisor as Z, RetainedRunEventOptions as Zn, sanitizeAgentRuntimeEvent as Zt, ExecutorRegistry as _, decodeToolPart as _n, mergeTraceEnv as _t, DefaultVerdict as a, WaitSpec as an, WorkerInteractiveSession as at, Handle as b, ActivityNote as bn, EvalRunEvent as bt, ExecutorAccounting as c, pollFor as cn, WorkerTraceUnavailableReason as ct, ExecutorContext as d, waitUntil as dn, readWorkerTraceContext as dt, PendingWait as en, RetainedRunReplayPoint as er, UnconfirmedTeardown as et, ExecutorExecutionBinding as f, SessionMessageLike as fn, workerTraceEnv as ft, ExecutorProgressEvent as g, createPushTraceSource as gn, createPropagatingTraceEmitter as gt, ExecutorNodeContext as h, TraceSource as hn, TraceContext as ht, Budget as i, WaitRejection as in, StartRetainedRunOptions as ir, WidenGate as it, ResultBlobStore as j, RetainedInteractiveRunHandle as jn, buildLoopOtelSpans as jt, ProviderModelAttemptEvidence as k, RetainedInteractiveAdmissionHook as kn, OtelSpan as kt, ExecutorCancellation as l, timerAt as ln, WorkerTraceResolver as lt, ExecutorMaterialization as m, ToolStepInput as mn, workerTraceSeamKey as mt, AgentExecutionRef as n, WaitProbe as nn, RetainedRunStartMaterial as nr, UsageEvent as nt, ExecutionBindingReceipt as o, createWaitProbes as on, WorkerInteractiveUnavailableReason as ot, ExecutorFactory as p, SessionTraceBox as pn, workerTraceHeaders as pt, SpendChannel as q, RetainedRunCancellation as qn, SanitizedKnowledgeReadinessReport as qt, AgentSpec as r, WaitProbeRegistry as rn, StartRetainedRunInEnvironmentOptions as rr, WaitOpts as rt, Executor as s, isWaitOutcome as sn, WorkerTraceEvidence as st, Agent as t, WaitOutcome as tn, RetainedRunSnapshot as tr, UnknownMaterializationReason as tt, ExecutorCancellationRequest as u, validateWaitSpec as un, WorkerTraceSeamCarrier as ut, ExecutorResult as v, sandboxSessionTraceSource as vn, readTraceContextFromEnv as vt, NodeExecutionIdentity as w, WorkerProgress as wn, INTELLIGENCE_WIRE_VERSION as wt, MaterializedExecutionIdentity as x, DEFAULT_STALL_AFTER_MS as xn, EvalRunGeneration as xt, ExecutorToolCall as y, ActivityLog as yn, traceContextToEnv as yt, Scope as z, RecoverRetainedRunResult as zn, padSpanId as zt };
2494
- //# sourceMappingURL=types-DjVO-p7R.d.ts.map
2517
+ //# sourceMappingURL=types-a2ZZUl80.d.ts.map
@@ -1,4 +1,4 @@
1
- import { A as verifyMaterializedWorkspace, C as assertNoGitIndirection, D as captureMaterializedWorkspace, E as candidateWorkspaceManifest, G as isWellFormedUnicode, T as runCandidateGit, a as persistCandidateOutputArtifact, ct as immutableCandidateValue, it as canonicalCandidateDigest$1, k as verifyBytes, lt as omitTopLevelDigest, ot as deepFreezeCandidate, rt as canonicalCandidateBytes, st as embeddedCandidateArtifact, ut as sha256Bytes, w as readCandidateGitTreeFiles } from "./prepare-BAyaNoZu.js";
1
+ import { A as verifyMaterializedWorkspace, C as assertNoGitIndirection, D as captureMaterializedWorkspace, E as candidateWorkspaceManifest, G as isWellFormedUnicode, T as runCandidateGit, a as persistCandidateOutputArtifact, ct as immutableCandidateValue, it as canonicalCandidateDigest$1, k as verifyBytes, lt as omitTopLevelDigest, ot as deepFreezeCandidate, rt as canonicalCandidateBytes, st as embeddedCandidateArtifact, ut as sha256Bytes, w as readCandidateGitTreeFiles } from "./prepare-Tip-2ZoZ.js";
2
2
  import { agentCandidateBundleSchema } from "@tangle-network/agent-interface";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { dirname, isAbsolute, join, resolve, sep, win32 } from "node:path";
@@ -566,4 +566,4 @@ const typedArrayByteLengthGetter = requireTypedArrayGetter("byteLength");
566
566
  //#endregion
567
567
  export { sealAgentCandidateBundle as i, captureAgentCandidateWorkspaceFiles as n, createAgentCandidateWorkspacePort as r, captureAgentCandidateWorkspace as t };
568
568
 
569
- //# sourceMappingURL=workspace-archive-B0Hqp2eJ.js.map
569
+ //# sourceMappingURL=workspace-archive-DOZAeeKU.js.map