@evalops/maestro 0.10.26 → 0.10.29

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 (40) hide show
  1. package/dist/agent/transport/reusable-tool-results.d.ts +38 -0
  2. package/dist/agent/transport/reusable-tool-results.d.ts.map +1 -0
  3. package/dist/agent/transport/reusable-tool-results.js +432 -0
  4. package/dist/agent/transport/reusable-tool-results.js.map +1 -0
  5. package/dist/agent/transport.d.ts +1 -1
  6. package/dist/agent/transport.d.ts.map +1 -1
  7. package/dist/agent/transport.js +1 -430
  8. package/dist/agent/transport.js.map +1 -1
  9. package/dist/audit/logger.d.ts +2 -2
  10. package/dist/cli/commands/run.d.ts +15 -0
  11. package/dist/cli/commands/run.d.ts.map +1 -1
  12. package/dist/cli/commands/run.js +35 -0
  13. package/dist/cli/commands/run.js.map +1 -1
  14. package/dist/cli.js +750 -632
  15. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  16. package/dist/node_modules/@evalops/tui/package.json +1 -1
  17. package/dist/platform/agent-registry-client.d.ts +6 -0
  18. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  19. package/dist/platform/agent-registry-client.js +6 -0
  20. package/dist/platform/agent-registry-client.js.map +1 -1
  21. package/dist/server/agent-runtime-ledger.d.ts +5 -0
  22. package/dist/server/agent-runtime-ledger.d.ts.map +1 -1
  23. package/dist/server/agent-runtime-ledger.js +63 -0
  24. package/dist/server/agent-runtime-ledger.js.map +1 -1
  25. package/dist/server/headless-runtime/broker.d.ts +81 -0
  26. package/dist/server/headless-runtime/broker.d.ts.map +1 -0
  27. package/dist/server/headless-runtime/broker.js +201 -0
  28. package/dist/server/headless-runtime/broker.js.map +1 -0
  29. package/dist/server/headless-runtime-service.d.ts +3 -37
  30. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  31. package/dist/server/headless-runtime-service.js +1 -199
  32. package/dist/server/headless-runtime-service.js.map +1 -1
  33. package/dist/session/manager.d.ts +1 -0
  34. package/dist/session/manager.d.ts.map +1 -1
  35. package/dist/session/manager.js.map +1 -1
  36. package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
  37. package/dist/tools/parallel-ripgrep.js +11 -2
  38. package/dist/tools/parallel-ripgrep.js.map +1 -1
  39. package/dist/version.json +2 -2
  40. package/package.json +1 -1
@@ -178,6 +178,61 @@ function isTerminalCandidate(entry) {
178
178
  function runStepStateForEntry(entry) {
179
179
  return entry.state === "blocked" ? "failed" : entry.state;
180
180
  }
181
+ function firstEvidenceId(entry, kind) {
182
+ return entry.evidence.find((anchor) => anchor.kind === kind)?.id;
183
+ }
184
+ function evidenceRefForAnchor(anchor) {
185
+ switch (anchor.kind) {
186
+ case "timeline_item":
187
+ return `timeline-item:${anchor.id}`;
188
+ case "tool_call":
189
+ return `tool-call:${anchor.id}`;
190
+ case "tool_execution":
191
+ return `tool-execution:${anchor.id}`;
192
+ case "approval_request":
193
+ return `approval-request:${anchor.id}`;
194
+ case "pending_request":
195
+ return `pending-request:${anchor.id}`;
196
+ case "agent_run":
197
+ return `agent-run:${anchor.id}`;
198
+ case "parent_agent_run":
199
+ return `parent-agent-run:${anchor.id}`;
200
+ case "child_agent_run":
201
+ return `child-agent-run:${anchor.id}`;
202
+ default:
203
+ return `${anchor.kind}:${anchor.id}`;
204
+ }
205
+ }
206
+ function uniqueStrings(values) {
207
+ return values.filter((value, index) => {
208
+ return (typeof value === "string" &&
209
+ value.length > 0 &&
210
+ values.indexOf(value) === index);
211
+ });
212
+ }
213
+ function evidenceRefsForEntry(entry) {
214
+ return uniqueStrings([
215
+ `trajectory-event:${entry.trajectoryEventId}`,
216
+ ...(entry.timelineItemId ? [`timeline-item:${entry.timelineItemId}`] : []),
217
+ ...entry.evidence.map(evidenceRefForAnchor),
218
+ ]);
219
+ }
220
+ function workItemPayloadForEntry(sessionId, entry) {
221
+ return {
222
+ maestroSessionId: sessionId,
223
+ ledgerEntryId: entry.id,
224
+ trajectoryEventId: entry.trajectoryEventId,
225
+ eventType: entry.type,
226
+ phase: entry.phase,
227
+ actor: entry.actor,
228
+ source: entry.source,
229
+ state: entry.state,
230
+ ...(entry.timelineItemId ? { timelineItemId: entry.timelineItemId } : {}),
231
+ ...(entry.toolName ? { toolName: entry.toolName } : {}),
232
+ ...(entry.summary ? { summary: entry.summary } : {}),
233
+ ...(entry.relatedIds.length > 0 ? { relatedIds: entry.relatedIds } : {}),
234
+ };
235
+ }
181
236
  function terminalEntry(entries) {
182
237
  const last = entries.at(-1);
183
238
  if (!last || !isTerminalState(last.state))
@@ -239,6 +294,9 @@ function buildPromotionPlan(runId, sessionId, generatedAt, entries) {
239
294
  },
240
295
  ];
241
296
  for (const entry of entries) {
297
+ const toolExecutionId = firstEvidenceId(entry, "tool_execution");
298
+ const evidenceRefs = evidenceRefsForEntry(entry);
299
+ const waitId = entry.platformShape.waitType ? entry.id : undefined;
242
300
  operations.push({
243
301
  operation: "record_run_step",
244
302
  id: `promote:${entry.id}:step`,
@@ -262,6 +320,11 @@ function buildPromotionPlan(runId, sessionId, generatedAt, entries) {
262
320
  state: entry.state,
263
321
  title: entry.title,
264
322
  timestamp: entry.timestamp,
323
+ ...(waitId ? { waitId } : {}),
324
+ ...(toolExecutionId ? { toolExecutionId } : {}),
325
+ evidenceRefs,
326
+ completionGate: "maestro_agent_runtime_ledger_recorded",
327
+ payload: workItemPayloadForEntry(sessionId, entry),
265
328
  },
266
329
  });
267
330
  if (entry.platformShape.waitType) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime-ledger.js","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n\tComposerRunTimelineVisibility,\n} from \"@evalops/contracts\";\nimport type { AgentTrajectoryReplayReport } from \"./agent-trajectory-replay.js\";\nimport type {\n\tAgentTrajectoryEvent,\n\tAgentTrajectoryReport,\n} from \"./agent-trajectory.js\";\n\nexport const AGENT_RUNTIME_LEDGER_SCHEMA =\n\t\"evalops.maestro.agent-runtime-ledger.v1\";\nexport const AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA =\n\t\"evalops.maestro.agent-runtime-replay-summary.v1\";\nexport const AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA =\n\t\"evalops.maestro.agent-runtime-promotion-plan.v1\";\n\nexport type AgentRuntimeLedgerEntryKind =\n\t| \"run\"\n\t| \"message\"\n\t| \"model_call\"\n\t| \"tool_call\"\n\t| \"tool_result\"\n\t| \"wait\"\n\t| \"checkpoint\"\n\t| \"artifact\"\n\t| \"evidence\"\n\t| \"governance\"\n\t| \"context\"\n\t| \"child_run\"\n\t| \"runtime\";\n\nexport type AgentRuntimeLedgerState =\n\t| \"pending\"\n\t| \"running\"\n\t| \"waiting\"\n\t| \"blocked\"\n\t| \"succeeded\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"skipped\";\n\ntype AgentRuntimePromotionStepState = Exclude<\n\tAgentRuntimeLedgerState,\n\t\"blocked\"\n>;\n\nexport interface AgentRuntimeLedgerEntry {\n\tid: string;\n\tsequence: number;\n\ttimestamp: string;\n\tkind: AgentRuntimeLedgerEntryKind;\n\tphase: AgentTrajectoryEvent[\"phase\"];\n\tactor: AgentTrajectoryEvent[\"actor\"];\n\ttype: string;\n\tstate: AgentRuntimeLedgerState;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineItem[\"source\"];\n\ttimelineItemId?: string;\n\ttrajectoryEventId: string;\n\ttoolName?: string;\n\tsummary?: string;\n\trelatedIds: string[];\n\tevidence: AgentTrajectoryEvent[\"evidence\"];\n\tplatformShape: {\n\t\tstepKind: string;\n\t\tworkItemKind: string;\n\t\twaitType?: string;\n\t};\n}\n\nexport interface AgentRuntimeLedgerReport {\n\tschemaVersion: typeof AGENT_RUNTIME_LEDGER_SCHEMA;\n\trun: {\n\t\tid: string;\n\t\tsessionId: string;\n\t\tsource: ComposerRunTimelineResponse[\"source\"];\n\t\tgeneratedAt: string;\n\t\tplatformBacked: boolean;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: {\n\t\tentries: number;\n\t\tpromotionOperations: number;\n\t\tbyKind: Record<string, number>;\n\t\tbyState: Record<string, number>;\n\t};\n\tentries: AgentRuntimeLedgerEntry[];\n\treplay: AgentRuntimeLedgerReplaySummary;\n\tpromotion: AgentRuntimePromotionPlan;\n}\n\nexport interface AgentRuntimeLedgerReplaySummary {\n\tschemaVersion: typeof AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA;\n\tdeterministic: boolean;\n\tevents: number;\n\tdeltas: number;\n\terrors: number;\n\twarnings: number;\n\tcursor: {\n\t\tstartSequence?: number;\n\t\tendSequence?: number;\n\t};\n}\n\nexport interface AgentRuntimePromotionPlan {\n\tschemaVersion: typeof AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA;\n\trunId: string;\n\tsessionId: string;\n\tidempotencyKey: string;\n\toperations: AgentRuntimePromotionOperation[];\n\twarnings: string[];\n}\n\nexport type AgentRuntimePromotionOperation =\n\t| {\n\t\t\toperation: \"handle_trigger\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\";\n\t\t\t\tsourceEventId: string;\n\t\t\t\tidempotencyKey: string;\n\t\t\t\tsessionId: string;\n\t\t\t\tgeneratedAt: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_step\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tstepId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimePromotionStepState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\ttoolName?: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_work_item\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tworkItemId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimeLedgerState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"wait_run\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\twaitId: string;\n\t\t\t\twaitType: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"complete_run\" | \"fail_run\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tstate: \"succeeded\" | \"failed\";\n\t\t\t\ttimestamp: string;\n\t\t\t\treason?: string;\n\t\t\t};\n\t };\n\nexport interface BuildAgentRuntimeLedgerOptions {\n\tsession: {\n\t\tid: string;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\ttimeline: ComposerRunTimelineResponse;\n\ttrajectory: AgentTrajectoryReport;\n\treplay: AgentTrajectoryReplayReport;\n}\n\nfunction increment(map: Record<string, number>, key: string): void {\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction timelineIdForEvent(event: AgentTrajectoryEvent): string | undefined {\n\treturn event.evidence.find((anchor) => anchor.kind === \"timeline_item\")?.id;\n}\n\nfunction stateForStatus(\n\tstatus: ComposerRunTimelineStatus,\n): AgentRuntimeLedgerState {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\tcase \"info\":\n\t\tcase \"approved\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tcase \"pending\":\n\t\t\treturn \"waiting\";\n\t\tcase \"denied\":\n\t\t\treturn \"blocked\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction kindForEvent(\n\tevent: AgentTrajectoryEvent,\n): AgentRuntimeLedgerEntryKind {\n\tswitch (event.kind) {\n\t\tcase \"session\":\n\t\t\treturn \"run\";\n\t\tcase \"message\":\n\t\t\treturn event.actor === \"assistant\" ? \"model_call\" : \"message\";\n\t\tcase \"tool\":\n\t\t\treturn event.type === \"tool.completed\" || event.type === \"tool.failed\"\n\t\t\t\t? \"tool_result\"\n\t\t\t\t: \"tool_call\";\n\t\tcase \"wait\":\n\t\t\treturn \"wait\";\n\t\tcase \"artifact\":\n\t\t\treturn \"artifact\";\n\t\tcase \"evidence\":\n\t\t\treturn \"evidence\";\n\t\tcase \"governance\":\n\t\t\treturn \"governance\";\n\t\tcase \"context\":\n\t\t\treturn event.type.startsWith(\"compaction.\") ? \"checkpoint\" : \"context\";\n\t\tcase \"agent\":\n\t\t\treturn \"child_run\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime\";\n\t\tdefault:\n\t\t\treturn \"runtime\";\n\t}\n}\n\nfunction stepKindForEntry(\n\tentryKind: AgentRuntimeLedgerEntryKind,\n\tevent: AgentTrajectoryEvent,\n): string {\n\tif (entryKind === \"model_call\") return \"AGENT_RUN_STEP_KIND_MODEL_CALL\";\n\tif (entryKind === \"tool_call\") return \"AGENT_RUN_STEP_KIND_TOOL_CALL_INTENT\";\n\tif (entryKind === \"tool_result\" && event.status === \"failed\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_ERROR\";\n\t}\n\tif (entryKind === \"tool_result\") return \"AGENT_RUN_STEP_KIND_TOOL_RESULT\";\n\tif (entryKind === \"wait\" || entryKind === \"governance\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_APPROVAL_WAIT\";\n\t}\n\treturn \"AGENT_RUN_STEP_KIND_SYSTEM\";\n}\n\nfunction workItemKindForEntry(kind: AgentRuntimeLedgerEntryKind): string {\n\tswitch (kind) {\n\t\tcase \"message\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_USER_INPUT\";\n\t\tcase \"model_call\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MODEL_CALL\";\n\t\tcase \"tool_call\":\n\t\tcase \"tool_result\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_TOOL_CALL\";\n\t\tcase \"child_run\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_CHILD_RUN\";\n\t\tcase \"wait\":\n\t\tcase \"governance\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_WAIT\";\n\t\tcase \"checkpoint\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_RECOVERY\";\n\t\tcase \"artifact\":\n\t\tcase \"evidence\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MEMORY\";\n\t\tdefault:\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_ROOT\";\n\t}\n}\n\nfunction waitTypeForEntry(\n\tkind: AgentRuntimeLedgerEntryKind,\n\ttimelineItem?: ComposerRunTimelineItem,\n): string | undefined {\n\tif (kind !== \"wait\") {\n\t\treturn undefined;\n\t}\n\tswitch (timelineItem?.pendingRequestKind) {\n\t\tcase \"approval\":\n\t\tcase \"tool_retry\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\t\tcase \"client_tool\":\n\t\tcase \"mcp_elicitation\":\n\t\tcase \"user_input\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\t}\n\tif (timelineItem?.approvalRequestId) return \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\tif (timelineItem?.pendingRequestId) return \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n}\n\nfunction buildLedgerEntries(\n\ttimeline: ComposerRunTimelineResponse,\n\ttrajectory: AgentTrajectoryReport,\n): AgentRuntimeLedgerEntry[] {\n\tconst timelineItemsById = new Map(\n\t\ttimeline.items.map((item) => [item.id, item] as const),\n\t);\n\treturn trajectory.events.map((event) => {\n\t\tconst kind = kindForEvent(event);\n\t\tconst state = stateForStatus(event.status);\n\t\tconst timelineItemId = timelineIdForEvent(event);\n\t\tconst timelineItem = timelineItemId\n\t\t\t? timelineItemsById.get(timelineItemId)\n\t\t\t: undefined;\n\t\tconst waitType = waitTypeForEntry(kind, timelineItem);\n\t\treturn {\n\t\t\tid: `ledger:${event.id}`,\n\t\t\tsequence: event.sequence,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind,\n\t\t\tphase: event.phase,\n\t\t\tactor: event.actor,\n\t\t\ttype: event.type,\n\t\t\tstate,\n\t\t\ttitle: event.title,\n\t\t\tvisibility: event.visibility,\n\t\t\tsource: event.source,\n\t\t\ttrajectoryEventId: event.id,\n\t\t\t...(timelineItemId ? { timelineItemId } : {}),\n\t\t\t...(event.toolName ? { toolName: event.toolName } : {}),\n\t\t\t...(event.summary ? { summary: event.summary } : {}),\n\t\t\trelatedIds: event.relatedIds ?? [],\n\t\t\tevidence: event.evidence,\n\t\t\tplatformShape: {\n\t\t\t\tstepKind: stepKindForEntry(kind, event),\n\t\t\t\tworkItemKind: workItemKindForEntry(kind),\n\t\t\t\t...(waitType ? { waitType } : {}),\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction replaySummary(\n\treplay: AgentTrajectoryReplayReport,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerReplaySummary {\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA,\n\t\tdeterministic: replay.counts.deltas === 0 && replay.counts.errors === 0,\n\t\tevents: replay.counts.events,\n\t\tdeltas: replay.counts.deltas,\n\t\terrors: replay.counts.errors,\n\t\twarnings: replay.counts.warnings,\n\t\tcursor: {\n\t\t\t...(entries[0] ? { startSequence: entries[0].sequence } : {}),\n\t\t\t...(entries.at(-1) ? { endSequence: entries.at(-1)?.sequence } : {}),\n\t\t},\n\t};\n}\n\nconst PASSIVE_TERMINAL_ENTRY_KINDS = new Set<AgentRuntimeLedgerEntryKind>([\n\t\"run\",\n\t\"wait\",\n\t\"governance\",\n]);\n\nfunction isTerminalState(state: AgentRuntimeLedgerState): boolean {\n\treturn (\n\t\tstate === \"succeeded\" ||\n\t\tstate === \"skipped\" ||\n\t\tstate === \"failed\" ||\n\t\tstate === \"cancelled\"\n\t);\n}\n\nfunction isTerminalCandidate(entry: AgentRuntimeLedgerEntry): boolean {\n\treturn (\n\t\tisTerminalState(entry.state) &&\n\t\t!PASSIVE_TERMINAL_ENTRY_KINDS.has(entry.kind)\n\t);\n}\n\nfunction runStepStateForEntry(\n\tentry: AgentRuntimeLedgerEntry,\n): AgentRuntimePromotionStepState {\n\treturn entry.state === \"blocked\" ? \"failed\" : entry.state;\n}\n\nfunction terminalEntry(\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerEntry | undefined {\n\tconst last = entries.at(-1);\n\tif (!last || !isTerminalState(last.state)) return undefined;\n\tif (isTerminalCandidate(last)) return last;\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (entry && isTerminalCandidate(entry)) return entry;\n\t}\n\treturn undefined;\n}\n\nfunction terminalOperation(\n\trunId: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionOperation | undefined {\n\tconst terminal = terminalEntry(entries);\n\tif (!terminal) return undefined;\n\tconst succeeded =\n\t\tterminal.state === \"succeeded\" || terminal.state === \"skipped\";\n\treturn {\n\t\toperation: succeeded ? \"complete_run\" : \"fail_run\",\n\t\tid: `promote:${runId}:terminal`,\n\t\tpayload: {\n\t\t\tstate: succeeded ? \"succeeded\" : \"failed\",\n\t\t\ttimestamp: terminal.timestamp,\n\t\t\t...(succeeded\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\treason: `Terminal ledger entry ended in ${terminal.state} state.`,\n\t\t\t\t\t}),\n\t\t},\n\t};\n}\n\nfunction terminalOperationWarning(\n\tentries: AgentRuntimeLedgerEntry[],\n): string | undefined {\n\tconst last = entries.at(-1);\n\tif (!last) {\n\t\treturn \"Terminal operation omitted because no ledger entries were available.\";\n\t}\n\tif (terminalEntry(entries)) {\n\t\treturn undefined;\n\t}\n\tif (isTerminalState(last.state)) {\n\t\treturn \"Terminal operation omitted because no substantive terminal ledger entry was available.\";\n\t}\n\treturn `Terminal operation omitted because final ledger entry ended in ${last.state} state.`;\n}\n\nfunction buildPromotionPlan(\n\trunId: string,\n\tsessionId: string,\n\tgeneratedAt: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionPlan {\n\tconst idempotencyKey = `maestro-local-ledger:${sessionId}:${runId}`;\n\tconst operations: AgentRuntimePromotionOperation[] = [\n\t\t{\n\t\t\toperation: \"handle_trigger\",\n\t\t\tid: `promote:${runId}:trigger`,\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\",\n\t\t\t\tsourceEventId: sessionId,\n\t\t\t\tidempotencyKey,\n\t\t\t\tsessionId,\n\t\t\t\tgeneratedAt,\n\t\t\t},\n\t\t},\n\t];\n\n\tfor (const entry of entries) {\n\t\toperations.push({\n\t\t\toperation: \"record_run_step\",\n\t\t\tid: `promote:${entry.id}:step`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tstepId: entry.id,\n\t\t\t\tkind: entry.platformShape.stepKind,\n\t\t\t\tstate: runStepStateForEntry(entry),\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t\t},\n\t\t});\n\t\toperations.push({\n\t\t\toperation: \"record_run_work_item\",\n\t\t\tid: `promote:${entry.id}:work-item`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tworkItemId: entry.id,\n\t\t\t\tkind: entry.platformShape.workItemKind,\n\t\t\t\tstate: entry.state,\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t},\n\t\t});\n\t\tif (entry.platformShape.waitType) {\n\t\t\toperations.push({\n\t\t\t\toperation: \"wait_run\",\n\t\t\t\tid: `promote:${entry.id}:wait`,\n\t\t\t\tledgerEntryId: entry.id,\n\t\t\t\tpayload: {\n\t\t\t\t\twaitId: entry.id,\n\t\t\t\t\twaitType: entry.platformShape.waitType,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tconst terminal = terminalOperation(runId, entries);\n\tif (terminal) operations.push(terminal);\n\tconst terminalWarning = terminalOperationWarning(entries);\n\tconst warnings = [\n\t\t\"Promotion plan is dry-run only; no Platform AgentRuntime writes were performed.\",\n\t\t...(terminalWarning ? [terminalWarning] : []),\n\t];\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA,\n\t\trunId,\n\t\tsessionId,\n\t\tidempotencyKey,\n\t\toperations,\n\t\twarnings,\n\t};\n}\n\nexport function buildAgentRuntimeLedgerReport(\n\toptions: BuildAgentRuntimeLedgerOptions,\n): AgentRuntimeLedgerReport {\n\tconst entries = buildLedgerEntries(options.timeline, options.trajectory);\n\tconst byKind: Record<string, number> = {};\n\tconst byState: Record<string, number> = {};\n\tfor (const entry of entries) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(byState, entry.state);\n\t}\n\tconst runId = options.trajectory.run.id;\n\tconst sessionId = options.trajectory.run.sessionId;\n\tconst promotion = buildPromotionPlan(\n\t\trunId,\n\t\tsessionId,\n\t\toptions.trajectory.run.generatedAt,\n\t\tentries,\n\t);\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_LEDGER_SCHEMA,\n\t\trun: {\n\t\t\tid: runId,\n\t\t\tsessionId,\n\t\t\tsource: options.timeline.source,\n\t\t\tgeneratedAt: options.trajectory.run.generatedAt,\n\t\t\tplatformBacked: options.trajectory.run.platformBacked,\n\t\t\t...(options.session.sessionFile\n\t\t\t\t? { sessionFile: options.session.sessionFile }\n\t\t\t\t: {}),\n\t\t\t...(options.session.cwd ? { cwd: options.session.cwd } : {}),\n\t\t\t...(options.session.model ? { model: options.session.model } : {}),\n\t\t},\n\t\tcounts: {\n\t\t\tentries: entries.length,\n\t\t\tpromotionOperations: promotion.operations.length,\n\t\t\tbyKind,\n\t\t\tbyState,\n\t\t},\n\t\tentries,\n\t\treplay: replaySummary(options.replay, entries),\n\t\tpromotion,\n\t};\n}\n"]}
1
+ {"version":3,"file":"agent-runtime-ledger.js","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n\tComposerRunTimelineVisibility,\n} from \"@evalops/contracts\";\nimport type { AgentTrajectoryReplayReport } from \"./agent-trajectory-replay.js\";\nimport type {\n\tAgentTrajectoryEvent,\n\tAgentTrajectoryReport,\n} from \"./agent-trajectory.js\";\n\nexport const AGENT_RUNTIME_LEDGER_SCHEMA =\n\t\"evalops.maestro.agent-runtime-ledger.v1\";\nexport const AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA =\n\t\"evalops.maestro.agent-runtime-replay-summary.v1\";\nexport const AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA =\n\t\"evalops.maestro.agent-runtime-promotion-plan.v1\";\n\nexport type AgentRuntimeLedgerEntryKind =\n\t| \"run\"\n\t| \"message\"\n\t| \"model_call\"\n\t| \"tool_call\"\n\t| \"tool_result\"\n\t| \"wait\"\n\t| \"checkpoint\"\n\t| \"artifact\"\n\t| \"evidence\"\n\t| \"governance\"\n\t| \"context\"\n\t| \"child_run\"\n\t| \"runtime\";\n\nexport type AgentRuntimeLedgerState =\n\t| \"pending\"\n\t| \"running\"\n\t| \"waiting\"\n\t| \"blocked\"\n\t| \"succeeded\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"skipped\";\n\ntype AgentRuntimePromotionStepState = Exclude<\n\tAgentRuntimeLedgerState,\n\t\"blocked\"\n>;\n\nexport interface AgentRuntimeLedgerEntry {\n\tid: string;\n\tsequence: number;\n\ttimestamp: string;\n\tkind: AgentRuntimeLedgerEntryKind;\n\tphase: AgentTrajectoryEvent[\"phase\"];\n\tactor: AgentTrajectoryEvent[\"actor\"];\n\ttype: string;\n\tstate: AgentRuntimeLedgerState;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineItem[\"source\"];\n\ttimelineItemId?: string;\n\ttrajectoryEventId: string;\n\ttoolName?: string;\n\tsummary?: string;\n\trelatedIds: string[];\n\tevidence: AgentTrajectoryEvent[\"evidence\"];\n\tplatformShape: {\n\t\tstepKind: string;\n\t\tworkItemKind: string;\n\t\twaitType?: string;\n\t};\n}\n\nexport interface AgentRuntimeLedgerReport {\n\tschemaVersion: typeof AGENT_RUNTIME_LEDGER_SCHEMA;\n\trun: {\n\t\tid: string;\n\t\tsessionId: string;\n\t\tsource: ComposerRunTimelineResponse[\"source\"];\n\t\tgeneratedAt: string;\n\t\tplatformBacked: boolean;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: {\n\t\tentries: number;\n\t\tpromotionOperations: number;\n\t\tbyKind: Record<string, number>;\n\t\tbyState: Record<string, number>;\n\t};\n\tentries: AgentRuntimeLedgerEntry[];\n\treplay: AgentRuntimeLedgerReplaySummary;\n\tpromotion: AgentRuntimePromotionPlan;\n}\n\nexport interface AgentRuntimeLedgerReplaySummary {\n\tschemaVersion: typeof AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA;\n\tdeterministic: boolean;\n\tevents: number;\n\tdeltas: number;\n\terrors: number;\n\twarnings: number;\n\tcursor: {\n\t\tstartSequence?: number;\n\t\tendSequence?: number;\n\t};\n}\n\nexport interface AgentRuntimePromotionPlan {\n\tschemaVersion: typeof AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA;\n\trunId: string;\n\tsessionId: string;\n\tidempotencyKey: string;\n\toperations: AgentRuntimePromotionOperation[];\n\twarnings: string[];\n}\n\nexport type AgentRuntimePromotionOperation =\n\t| {\n\t\t\toperation: \"handle_trigger\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\";\n\t\t\t\tsourceEventId: string;\n\t\t\t\tidempotencyKey: string;\n\t\t\t\tsessionId: string;\n\t\t\t\tgeneratedAt: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_step\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tstepId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimePromotionStepState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\ttoolName?: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_work_item\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tworkItemId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimeLedgerState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\twaitId?: string;\n\t\t\t\ttoolExecutionId?: string;\n\t\t\t\tevidenceRefs?: string[];\n\t\t\t\tcompletionGate?: string;\n\t\t\t\tpayload?: Record<string, unknown>;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"wait_run\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\twaitId: string;\n\t\t\t\twaitType: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"complete_run\" | \"fail_run\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tstate: \"succeeded\" | \"failed\";\n\t\t\t\ttimestamp: string;\n\t\t\t\treason?: string;\n\t\t\t};\n\t };\n\nexport interface BuildAgentRuntimeLedgerOptions {\n\tsession: {\n\t\tid: string;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\ttimeline: ComposerRunTimelineResponse;\n\ttrajectory: AgentTrajectoryReport;\n\treplay: AgentTrajectoryReplayReport;\n}\n\nfunction increment(map: Record<string, number>, key: string): void {\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction timelineIdForEvent(event: AgentTrajectoryEvent): string | undefined {\n\treturn event.evidence.find((anchor) => anchor.kind === \"timeline_item\")?.id;\n}\n\nfunction stateForStatus(\n\tstatus: ComposerRunTimelineStatus,\n): AgentRuntimeLedgerState {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\tcase \"info\":\n\t\tcase \"approved\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tcase \"pending\":\n\t\t\treturn \"waiting\";\n\t\tcase \"denied\":\n\t\t\treturn \"blocked\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction kindForEvent(\n\tevent: AgentTrajectoryEvent,\n): AgentRuntimeLedgerEntryKind {\n\tswitch (event.kind) {\n\t\tcase \"session\":\n\t\t\treturn \"run\";\n\t\tcase \"message\":\n\t\t\treturn event.actor === \"assistant\" ? \"model_call\" : \"message\";\n\t\tcase \"tool\":\n\t\t\treturn event.type === \"tool.completed\" || event.type === \"tool.failed\"\n\t\t\t\t? \"tool_result\"\n\t\t\t\t: \"tool_call\";\n\t\tcase \"wait\":\n\t\t\treturn \"wait\";\n\t\tcase \"artifact\":\n\t\t\treturn \"artifact\";\n\t\tcase \"evidence\":\n\t\t\treturn \"evidence\";\n\t\tcase \"governance\":\n\t\t\treturn \"governance\";\n\t\tcase \"context\":\n\t\t\treturn event.type.startsWith(\"compaction.\") ? \"checkpoint\" : \"context\";\n\t\tcase \"agent\":\n\t\t\treturn \"child_run\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime\";\n\t\tdefault:\n\t\t\treturn \"runtime\";\n\t}\n}\n\nfunction stepKindForEntry(\n\tentryKind: AgentRuntimeLedgerEntryKind,\n\tevent: AgentTrajectoryEvent,\n): string {\n\tif (entryKind === \"model_call\") return \"AGENT_RUN_STEP_KIND_MODEL_CALL\";\n\tif (entryKind === \"tool_call\") return \"AGENT_RUN_STEP_KIND_TOOL_CALL_INTENT\";\n\tif (entryKind === \"tool_result\" && event.status === \"failed\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_ERROR\";\n\t}\n\tif (entryKind === \"tool_result\") return \"AGENT_RUN_STEP_KIND_TOOL_RESULT\";\n\tif (entryKind === \"wait\" || entryKind === \"governance\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_APPROVAL_WAIT\";\n\t}\n\treturn \"AGENT_RUN_STEP_KIND_SYSTEM\";\n}\n\nfunction workItemKindForEntry(kind: AgentRuntimeLedgerEntryKind): string {\n\tswitch (kind) {\n\t\tcase \"message\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_USER_INPUT\";\n\t\tcase \"model_call\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MODEL_CALL\";\n\t\tcase \"tool_call\":\n\t\tcase \"tool_result\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_TOOL_CALL\";\n\t\tcase \"child_run\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_CHILD_RUN\";\n\t\tcase \"wait\":\n\t\tcase \"governance\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_WAIT\";\n\t\tcase \"checkpoint\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_RECOVERY\";\n\t\tcase \"artifact\":\n\t\tcase \"evidence\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MEMORY\";\n\t\tdefault:\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_ROOT\";\n\t}\n}\n\nfunction waitTypeForEntry(\n\tkind: AgentRuntimeLedgerEntryKind,\n\ttimelineItem?: ComposerRunTimelineItem,\n): string | undefined {\n\tif (kind !== \"wait\") {\n\t\treturn undefined;\n\t}\n\tswitch (timelineItem?.pendingRequestKind) {\n\t\tcase \"approval\":\n\t\tcase \"tool_retry\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\t\tcase \"client_tool\":\n\t\tcase \"mcp_elicitation\":\n\t\tcase \"user_input\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\t}\n\tif (timelineItem?.approvalRequestId) return \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\tif (timelineItem?.pendingRequestId) return \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n}\n\nfunction buildLedgerEntries(\n\ttimeline: ComposerRunTimelineResponse,\n\ttrajectory: AgentTrajectoryReport,\n): AgentRuntimeLedgerEntry[] {\n\tconst timelineItemsById = new Map(\n\t\ttimeline.items.map((item) => [item.id, item] as const),\n\t);\n\treturn trajectory.events.map((event) => {\n\t\tconst kind = kindForEvent(event);\n\t\tconst state = stateForStatus(event.status);\n\t\tconst timelineItemId = timelineIdForEvent(event);\n\t\tconst timelineItem = timelineItemId\n\t\t\t? timelineItemsById.get(timelineItemId)\n\t\t\t: undefined;\n\t\tconst waitType = waitTypeForEntry(kind, timelineItem);\n\t\treturn {\n\t\t\tid: `ledger:${event.id}`,\n\t\t\tsequence: event.sequence,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind,\n\t\t\tphase: event.phase,\n\t\t\tactor: event.actor,\n\t\t\ttype: event.type,\n\t\t\tstate,\n\t\t\ttitle: event.title,\n\t\t\tvisibility: event.visibility,\n\t\t\tsource: event.source,\n\t\t\ttrajectoryEventId: event.id,\n\t\t\t...(timelineItemId ? { timelineItemId } : {}),\n\t\t\t...(event.toolName ? { toolName: event.toolName } : {}),\n\t\t\t...(event.summary ? { summary: event.summary } : {}),\n\t\t\trelatedIds: event.relatedIds ?? [],\n\t\t\tevidence: event.evidence,\n\t\t\tplatformShape: {\n\t\t\t\tstepKind: stepKindForEntry(kind, event),\n\t\t\t\tworkItemKind: workItemKindForEntry(kind),\n\t\t\t\t...(waitType ? { waitType } : {}),\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction replaySummary(\n\treplay: AgentTrajectoryReplayReport,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerReplaySummary {\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA,\n\t\tdeterministic: replay.counts.deltas === 0 && replay.counts.errors === 0,\n\t\tevents: replay.counts.events,\n\t\tdeltas: replay.counts.deltas,\n\t\terrors: replay.counts.errors,\n\t\twarnings: replay.counts.warnings,\n\t\tcursor: {\n\t\t\t...(entries[0] ? { startSequence: entries[0].sequence } : {}),\n\t\t\t...(entries.at(-1) ? { endSequence: entries.at(-1)?.sequence } : {}),\n\t\t},\n\t};\n}\n\nconst PASSIVE_TERMINAL_ENTRY_KINDS = new Set<AgentRuntimeLedgerEntryKind>([\n\t\"run\",\n\t\"wait\",\n\t\"governance\",\n]);\n\nfunction isTerminalState(state: AgentRuntimeLedgerState): boolean {\n\treturn (\n\t\tstate === \"succeeded\" ||\n\t\tstate === \"skipped\" ||\n\t\tstate === \"failed\" ||\n\t\tstate === \"cancelled\"\n\t);\n}\n\nfunction isTerminalCandidate(entry: AgentRuntimeLedgerEntry): boolean {\n\treturn (\n\t\tisTerminalState(entry.state) &&\n\t\t!PASSIVE_TERMINAL_ENTRY_KINDS.has(entry.kind)\n\t);\n}\n\nfunction runStepStateForEntry(\n\tentry: AgentRuntimeLedgerEntry,\n): AgentRuntimePromotionStepState {\n\treturn entry.state === \"blocked\" ? \"failed\" : entry.state;\n}\n\nfunction firstEvidenceId(\n\tentry: AgentRuntimeLedgerEntry,\n\tkind: AgentTrajectoryEvent[\"evidence\"][number][\"kind\"],\n): string | undefined {\n\treturn entry.evidence.find((anchor) => anchor.kind === kind)?.id;\n}\n\nfunction evidenceRefForAnchor(\n\tanchor: AgentTrajectoryEvent[\"evidence\"][number],\n): string {\n\tswitch (anchor.kind) {\n\t\tcase \"timeline_item\":\n\t\t\treturn `timeline-item:${anchor.id}`;\n\t\tcase \"tool_call\":\n\t\t\treturn `tool-call:${anchor.id}`;\n\t\tcase \"tool_execution\":\n\t\t\treturn `tool-execution:${anchor.id}`;\n\t\tcase \"approval_request\":\n\t\t\treturn `approval-request:${anchor.id}`;\n\t\tcase \"pending_request\":\n\t\t\treturn `pending-request:${anchor.id}`;\n\t\tcase \"agent_run\":\n\t\t\treturn `agent-run:${anchor.id}`;\n\t\tcase \"parent_agent_run\":\n\t\t\treturn `parent-agent-run:${anchor.id}`;\n\t\tcase \"child_agent_run\":\n\t\t\treturn `child-agent-run:${anchor.id}`;\n\t\tdefault:\n\t\t\treturn `${anchor.kind}:${anchor.id}`;\n\t}\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n\treturn values.filter((value, index): value is string => {\n\t\treturn (\n\t\t\ttypeof value === \"string\" &&\n\t\t\tvalue.length > 0 &&\n\t\t\tvalues.indexOf(value) === index\n\t\t);\n\t});\n}\n\nfunction evidenceRefsForEntry(entry: AgentRuntimeLedgerEntry): string[] {\n\treturn uniqueStrings([\n\t\t`trajectory-event:${entry.trajectoryEventId}`,\n\t\t...(entry.timelineItemId ? [`timeline-item:${entry.timelineItemId}`] : []),\n\t\t...entry.evidence.map(evidenceRefForAnchor),\n\t]);\n}\n\nfunction workItemPayloadForEntry(\n\tsessionId: string,\n\tentry: AgentRuntimeLedgerEntry,\n): Record<string, unknown> {\n\treturn {\n\t\tmaestroSessionId: sessionId,\n\t\tledgerEntryId: entry.id,\n\t\ttrajectoryEventId: entry.trajectoryEventId,\n\t\teventType: entry.type,\n\t\tphase: entry.phase,\n\t\tactor: entry.actor,\n\t\tsource: entry.source,\n\t\tstate: entry.state,\n\t\t...(entry.timelineItemId ? { timelineItemId: entry.timelineItemId } : {}),\n\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t...(entry.summary ? { summary: entry.summary } : {}),\n\t\t...(entry.relatedIds.length > 0 ? { relatedIds: entry.relatedIds } : {}),\n\t};\n}\n\nfunction terminalEntry(\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerEntry | undefined {\n\tconst last = entries.at(-1);\n\tif (!last || !isTerminalState(last.state)) return undefined;\n\tif (isTerminalCandidate(last)) return last;\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (entry && isTerminalCandidate(entry)) return entry;\n\t}\n\treturn undefined;\n}\n\nfunction terminalOperation(\n\trunId: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionOperation | undefined {\n\tconst terminal = terminalEntry(entries);\n\tif (!terminal) return undefined;\n\tconst succeeded =\n\t\tterminal.state === \"succeeded\" || terminal.state === \"skipped\";\n\treturn {\n\t\toperation: succeeded ? \"complete_run\" : \"fail_run\",\n\t\tid: `promote:${runId}:terminal`,\n\t\tpayload: {\n\t\t\tstate: succeeded ? \"succeeded\" : \"failed\",\n\t\t\ttimestamp: terminal.timestamp,\n\t\t\t...(succeeded\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\treason: `Terminal ledger entry ended in ${terminal.state} state.`,\n\t\t\t\t\t}),\n\t\t},\n\t};\n}\n\nfunction terminalOperationWarning(\n\tentries: AgentRuntimeLedgerEntry[],\n): string | undefined {\n\tconst last = entries.at(-1);\n\tif (!last) {\n\t\treturn \"Terminal operation omitted because no ledger entries were available.\";\n\t}\n\tif (terminalEntry(entries)) {\n\t\treturn undefined;\n\t}\n\tif (isTerminalState(last.state)) {\n\t\treturn \"Terminal operation omitted because no substantive terminal ledger entry was available.\";\n\t}\n\treturn `Terminal operation omitted because final ledger entry ended in ${last.state} state.`;\n}\n\nfunction buildPromotionPlan(\n\trunId: string,\n\tsessionId: string,\n\tgeneratedAt: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionPlan {\n\tconst idempotencyKey = `maestro-local-ledger:${sessionId}:${runId}`;\n\tconst operations: AgentRuntimePromotionOperation[] = [\n\t\t{\n\t\t\toperation: \"handle_trigger\",\n\t\t\tid: `promote:${runId}:trigger`,\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\",\n\t\t\t\tsourceEventId: sessionId,\n\t\t\t\tidempotencyKey,\n\t\t\t\tsessionId,\n\t\t\t\tgeneratedAt,\n\t\t\t},\n\t\t},\n\t];\n\n\tfor (const entry of entries) {\n\t\tconst toolExecutionId = firstEvidenceId(entry, \"tool_execution\");\n\t\tconst evidenceRefs = evidenceRefsForEntry(entry);\n\t\tconst waitId = entry.platformShape.waitType ? entry.id : undefined;\n\t\toperations.push({\n\t\t\toperation: \"record_run_step\",\n\t\t\tid: `promote:${entry.id}:step`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tstepId: entry.id,\n\t\t\t\tkind: entry.platformShape.stepKind,\n\t\t\t\tstate: runStepStateForEntry(entry),\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t\t},\n\t\t});\n\t\toperations.push({\n\t\t\toperation: \"record_run_work_item\",\n\t\t\tid: `promote:${entry.id}:work-item`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tworkItemId: entry.id,\n\t\t\t\tkind: entry.platformShape.workItemKind,\n\t\t\t\tstate: entry.state,\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(waitId ? { waitId } : {}),\n\t\t\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t\t\tevidenceRefs,\n\t\t\t\tcompletionGate: \"maestro_agent_runtime_ledger_recorded\",\n\t\t\t\tpayload: workItemPayloadForEntry(sessionId, entry),\n\t\t\t},\n\t\t});\n\t\tif (entry.platformShape.waitType) {\n\t\t\toperations.push({\n\t\t\t\toperation: \"wait_run\",\n\t\t\t\tid: `promote:${entry.id}:wait`,\n\t\t\t\tledgerEntryId: entry.id,\n\t\t\t\tpayload: {\n\t\t\t\t\twaitId: entry.id,\n\t\t\t\t\twaitType: entry.platformShape.waitType,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tconst terminal = terminalOperation(runId, entries);\n\tif (terminal) operations.push(terminal);\n\tconst terminalWarning = terminalOperationWarning(entries);\n\tconst warnings = [\n\t\t\"Promotion plan is dry-run only; no Platform AgentRuntime writes were performed.\",\n\t\t...(terminalWarning ? [terminalWarning] : []),\n\t];\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA,\n\t\trunId,\n\t\tsessionId,\n\t\tidempotencyKey,\n\t\toperations,\n\t\twarnings,\n\t};\n}\n\nexport function buildAgentRuntimeLedgerReport(\n\toptions: BuildAgentRuntimeLedgerOptions,\n): AgentRuntimeLedgerReport {\n\tconst entries = buildLedgerEntries(options.timeline, options.trajectory);\n\tconst byKind: Record<string, number> = {};\n\tconst byState: Record<string, number> = {};\n\tfor (const entry of entries) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(byState, entry.state);\n\t}\n\tconst runId = options.trajectory.run.id;\n\tconst sessionId = options.trajectory.run.sessionId;\n\tconst promotion = buildPromotionPlan(\n\t\trunId,\n\t\tsessionId,\n\t\toptions.trajectory.run.generatedAt,\n\t\tentries,\n\t);\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_LEDGER_SCHEMA,\n\t\trun: {\n\t\t\tid: runId,\n\t\t\tsessionId,\n\t\t\tsource: options.timeline.source,\n\t\t\tgeneratedAt: options.trajectory.run.generatedAt,\n\t\t\tplatformBacked: options.trajectory.run.platformBacked,\n\t\t\t...(options.session.sessionFile\n\t\t\t\t? { sessionFile: options.session.sessionFile }\n\t\t\t\t: {}),\n\t\t\t...(options.session.cwd ? { cwd: options.session.cwd } : {}),\n\t\t\t...(options.session.model ? { model: options.session.model } : {}),\n\t\t},\n\t\tcounts: {\n\t\t\tentries: entries.length,\n\t\t\tpromotionOperations: promotion.operations.length,\n\t\t\tbyKind,\n\t\t\tbyState,\n\t\t},\n\t\tentries,\n\t\treplay: replaySummary(options.replay, entries),\n\t\tpromotion,\n\t};\n}\n"]}
@@ -0,0 +1,81 @@
1
+ import { type HeadlessNotificationType } from "@evalops/contracts";
2
+ import type { HeadlessFromAgentMessage, HeadlessInitMessage, HeadlessRuntimeState } from "../../cli/headless-protocol.js";
3
+ export interface HeadlessRuntimeSnapshot {
4
+ protocolVersion: string;
5
+ session_id: string;
6
+ cursor: number;
7
+ last_init: HeadlessInitMessage | null;
8
+ state: HeadlessRuntimeState;
9
+ }
10
+ export interface HeadlessRuntimeSnapshotEnvelope {
11
+ type: "snapshot";
12
+ snapshot: HeadlessRuntimeSnapshot;
13
+ }
14
+ export interface HeadlessRuntimeEventEnvelope {
15
+ type: "message";
16
+ cursor: number;
17
+ message: HeadlessFromAgentMessage;
18
+ }
19
+ export interface HeadlessRuntimeHeartbeatEnvelope {
20
+ type: "heartbeat";
21
+ cursor: number;
22
+ }
23
+ export interface HeadlessRuntimeResetEnvelope {
24
+ type: "reset";
25
+ reason: "lagged" | "replay_gap" | "restored_from_snapshot";
26
+ snapshot: HeadlessRuntimeSnapshot;
27
+ }
28
+ export type HeadlessRuntimeStreamEnvelope = HeadlessRuntimeSnapshotEnvelope | HeadlessRuntimeEventEnvelope | HeadlessRuntimeHeartbeatEnvelope | HeadlessRuntimeResetEnvelope;
29
+ export type RuntimeListener = (envelope: HeadlessRuntimeStreamEnvelope) => void;
30
+ export type SubscriberListener = () => void;
31
+ export interface HeadlessAttachedSubscription {
32
+ id: string;
33
+ next(): HeadlessRuntimeStreamEnvelope | null;
34
+ onAvailable(listener: SubscriberListener): () => void;
35
+ enqueue(envelope: HeadlessRuntimeStreamEnvelope): void;
36
+ close(): void;
37
+ }
38
+ export declare function createConnectionId(): string;
39
+ export declare function createSubscriptionId(): string;
40
+ export declare class HeadlessSubscriberMailbox {
41
+ readonly id: string;
42
+ readonly role: "viewer" | "controller";
43
+ readonly explicit: boolean;
44
+ readonly connectionId: string;
45
+ readonly optOutNotifications: HeadlessNotificationType[];
46
+ private readonly listeners;
47
+ private readonly queue;
48
+ private queuedReset;
49
+ private detachedAt;
50
+ private attached;
51
+ private allowRawAgentEvents;
52
+ constructor(id: string, role: "viewer" | "controller", explicit: boolean, connectionId: string, optOutNotifications?: HeadlessNotificationType[], allowRawAgentEvents?: boolean);
53
+ onAvailable(listener: SubscriberListener): () => void;
54
+ enqueue(envelope: HeadlessRuntimeStreamEnvelope, createReset: (reason: HeadlessRuntimeResetEnvelope["reason"]) => HeadlessRuntimeResetEnvelope): void;
55
+ next(): HeadlessRuntimeStreamEnvelope | null;
56
+ attach(): void;
57
+ detach(): void;
58
+ touch(): void;
59
+ isExpired(now?: number): boolean;
60
+ isAttached(): boolean;
61
+ allowsRawAgentEvents(): boolean;
62
+ setAllowRawAgentEvents(value: boolean): void;
63
+ private emit;
64
+ private shouldFilterEnvelope;
65
+ }
66
+ export declare class HeadlessRuntimeBroker {
67
+ private nextCursor;
68
+ private readonly listeners;
69
+ private readonly events;
70
+ private publishEnvelope;
71
+ publish(message: HeadlessFromAgentMessage): HeadlessRuntimeEventEnvelope;
72
+ createPrivateMessage(message: HeadlessFromAgentMessage): HeadlessRuntimeEventEnvelope;
73
+ private createMessageEnvelope;
74
+ publishSnapshot(createSnapshot: (cursor: number) => HeadlessRuntimeSnapshot): HeadlessRuntimeSnapshotEnvelope;
75
+ currentCursor(): number;
76
+ restoreFromSnapshot(snapshot: HeadlessRuntimeSnapshot): void;
77
+ replayFrom(cursor: number): HeadlessRuntimeStreamEnvelope[] | null;
78
+ subscribe(listener: RuntimeListener): () => void;
79
+ private getEnvelopeCursor;
80
+ }
81
+ //# sourceMappingURL=broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../../src/server/headless-runtime/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import { assertHeadlessFromAgentMessage, assertHeadlessRuntimeStreamEnvelope, } from "@evalops/contracts";
2
+ const MAX_BUFFERED_EVENTS = Number.parseInt(process.env.MAESTRO_HEADLESS_RUNTIME_EVENT_BUFFER || "", 10) || 512;
3
+ const MAX_SUBSCRIBER_MAILBOX_EVENTS = Number.parseInt(process.env.MAESTRO_HEADLESS_SUBSCRIBER_QUEUE || "", 10) ||
4
+ 128;
5
+ const MAX_SUBSCRIPTION_IDLE_MS = Number.parseInt(process.env.MAESTRO_HEADLESS_SUBSCRIPTION_IDLE_MS || "", 10) || 30 * 1000;
6
+ export function createConnectionId() {
7
+ return `conn_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
8
+ }
9
+ export function createSubscriptionId() {
10
+ return `sub_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
11
+ }
12
+ export class HeadlessSubscriberMailbox {
13
+ constructor(id, role, explicit, connectionId, optOutNotifications = [], allowRawAgentEvents = false) {
14
+ this.id = id;
15
+ this.role = role;
16
+ this.explicit = explicit;
17
+ this.connectionId = connectionId;
18
+ this.optOutNotifications = optOutNotifications;
19
+ this.listeners = new Set();
20
+ this.queue = [];
21
+ this.queuedReset = null;
22
+ this.attached = false;
23
+ this.detachedAt = explicit ? Date.now() : null;
24
+ this.allowRawAgentEvents = allowRawAgentEvents;
25
+ }
26
+ onAvailable(listener) {
27
+ this.listeners.add(listener);
28
+ return () => {
29
+ this.listeners.delete(listener);
30
+ };
31
+ }
32
+ enqueue(envelope, createReset) {
33
+ if (this.shouldFilterEnvelope(envelope)) {
34
+ return;
35
+ }
36
+ this.queue.push(envelope);
37
+ if (this.queue.length > MAX_SUBSCRIBER_MAILBOX_EVENTS) {
38
+ this.queue.length = 0;
39
+ this.queuedReset = createReset("lagged");
40
+ }
41
+ this.emit();
42
+ }
43
+ next() {
44
+ const next = this.queuedReset ?? this.queue.shift() ?? null;
45
+ if (next?.type === "reset") {
46
+ this.queuedReset = null;
47
+ }
48
+ return next;
49
+ }
50
+ attach() {
51
+ this.attached = true;
52
+ this.detachedAt = null;
53
+ this.emit();
54
+ }
55
+ detach() {
56
+ this.attached = false;
57
+ this.detachedAt = Date.now();
58
+ }
59
+ touch() {
60
+ if (this.explicit && !this.attached) {
61
+ this.detachedAt = Date.now();
62
+ }
63
+ }
64
+ isExpired(now = Date.now()) {
65
+ return (this.explicit &&
66
+ !this.attached &&
67
+ this.detachedAt !== null &&
68
+ now - this.detachedAt > MAX_SUBSCRIPTION_IDLE_MS);
69
+ }
70
+ isAttached() {
71
+ return this.attached;
72
+ }
73
+ allowsRawAgentEvents() {
74
+ return this.allowRawAgentEvents;
75
+ }
76
+ setAllowRawAgentEvents(value) {
77
+ this.allowRawAgentEvents = value;
78
+ }
79
+ emit() {
80
+ for (const listener of this.listeners) {
81
+ listener();
82
+ }
83
+ }
84
+ shouldFilterEnvelope(envelope) {
85
+ if (envelope.type === "heartbeat") {
86
+ return this.optOutNotifications.includes("heartbeat");
87
+ }
88
+ if (envelope.type !== "message") {
89
+ return false;
90
+ }
91
+ if (envelope.message.type === "raw_agent_event" &&
92
+ !this.allowRawAgentEvents) {
93
+ return true;
94
+ }
95
+ if (this.optOutNotifications.length === 0) {
96
+ return false;
97
+ }
98
+ switch (envelope.message.type) {
99
+ case "status":
100
+ return this.optOutNotifications.includes("status");
101
+ case "connection_info":
102
+ return this.optOutNotifications.includes("connection_info");
103
+ case "compaction":
104
+ return this.optOutNotifications.includes("compaction");
105
+ default:
106
+ return false;
107
+ }
108
+ }
109
+ }
110
+ export class HeadlessRuntimeBroker {
111
+ constructor() {
112
+ this.nextCursor = 1;
113
+ this.listeners = new Set();
114
+ this.events = [];
115
+ }
116
+ publishEnvelope(envelope) {
117
+ assertHeadlessRuntimeStreamEnvelope(envelope, "headless runtime stream envelope");
118
+ this.events.push(envelope);
119
+ while (this.events.length > MAX_BUFFERED_EVENTS) {
120
+ this.events.shift();
121
+ }
122
+ for (const listener of this.listeners) {
123
+ listener(envelope);
124
+ }
125
+ return envelope;
126
+ }
127
+ publish(message) {
128
+ const envelope = this.createMessageEnvelope(message);
129
+ return this.publishEnvelope(envelope);
130
+ }
131
+ createPrivateMessage(message) {
132
+ return this.createMessageEnvelope(message);
133
+ }
134
+ createMessageEnvelope(message) {
135
+ assertHeadlessFromAgentMessage(message, "headless runtime message");
136
+ const envelope = {
137
+ type: "message",
138
+ cursor: this.nextCursor++,
139
+ message,
140
+ };
141
+ return envelope;
142
+ }
143
+ publishSnapshot(createSnapshot) {
144
+ const cursor = this.nextCursor++;
145
+ const envelope = {
146
+ type: "snapshot",
147
+ snapshot: createSnapshot(cursor),
148
+ };
149
+ return this.publishEnvelope(envelope);
150
+ }
151
+ currentCursor() {
152
+ return this.nextCursor - 1;
153
+ }
154
+ restoreFromSnapshot(snapshot) {
155
+ const envelope = {
156
+ type: "reset",
157
+ reason: "restored_from_snapshot",
158
+ snapshot,
159
+ };
160
+ assertHeadlessRuntimeStreamEnvelope(envelope, "headless runtime restore envelope");
161
+ this.events.length = 0;
162
+ this.events.push(envelope);
163
+ this.nextCursor = Math.max(1, snapshot.cursor + 1);
164
+ }
165
+ replayFrom(cursor) {
166
+ if (this.events.length === 0) {
167
+ return [];
168
+ }
169
+ const first = this.events[0];
170
+ const earliest = this.getEnvelopeCursor(first) ?? this.nextCursor;
171
+ if (cursor < earliest - 1) {
172
+ if (first?.type === "reset" &&
173
+ first.reason === "restored_from_snapshot") {
174
+ return [...this.events];
175
+ }
176
+ return null;
177
+ }
178
+ return this.events.filter((event) => (this.getEnvelopeCursor(event) ?? 0) > cursor);
179
+ }
180
+ subscribe(listener) {
181
+ this.listeners.add(listener);
182
+ return () => {
183
+ this.listeners.delete(listener);
184
+ };
185
+ }
186
+ getEnvelopeCursor(envelope) {
187
+ if (!envelope) {
188
+ return undefined;
189
+ }
190
+ switch (envelope.type) {
191
+ case "message":
192
+ return envelope.cursor;
193
+ case "heartbeat":
194
+ return envelope.cursor;
195
+ case "snapshot":
196
+ case "reset":
197
+ return envelope.snapshot.cursor;
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/server/headless-runtime/broker.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype HeadlessNotificationType,\n\tassertHeadlessFromAgentMessage,\n\tassertHeadlessRuntimeStreamEnvelope,\n} from \"@evalops/contracts\";\nimport type {\n\tHeadlessFromAgentMessage,\n\tHeadlessInitMessage,\n\tHeadlessRuntimeState,\n} from \"../../cli/headless-protocol.js\";\n\nconst MAX_BUFFERED_EVENTS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_HEADLESS_RUNTIME_EVENT_BUFFER || \"\",\n\t\t10,\n\t) || 512;\nconst MAX_SUBSCRIBER_MAILBOX_EVENTS =\n\tNumber.parseInt(process.env.MAESTRO_HEADLESS_SUBSCRIBER_QUEUE || \"\", 10) ||\n\t128;\nconst MAX_SUBSCRIPTION_IDLE_MS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_HEADLESS_SUBSCRIPTION_IDLE_MS || \"\",\n\t\t10,\n\t) || 30 * 1000;\n\nexport interface HeadlessRuntimeSnapshot {\n\tprotocolVersion: string;\n\tsession_id: string;\n\tcursor: number;\n\tlast_init: HeadlessInitMessage | null;\n\tstate: HeadlessRuntimeState;\n}\n\nexport interface HeadlessRuntimeSnapshotEnvelope {\n\ttype: \"snapshot\";\n\tsnapshot: HeadlessRuntimeSnapshot;\n}\n\nexport interface HeadlessRuntimeEventEnvelope {\n\ttype: \"message\";\n\tcursor: number;\n\tmessage: HeadlessFromAgentMessage;\n}\n\nexport interface HeadlessRuntimeHeartbeatEnvelope {\n\ttype: \"heartbeat\";\n\tcursor: number;\n}\n\nexport interface HeadlessRuntimeResetEnvelope {\n\ttype: \"reset\";\n\treason: \"lagged\" | \"replay_gap\" | \"restored_from_snapshot\";\n\tsnapshot: HeadlessRuntimeSnapshot;\n}\n\nexport type HeadlessRuntimeStreamEnvelope =\n\t| HeadlessRuntimeSnapshotEnvelope\n\t| HeadlessRuntimeEventEnvelope\n\t| HeadlessRuntimeHeartbeatEnvelope\n\t| HeadlessRuntimeResetEnvelope;\n\nexport type RuntimeListener = (envelope: HeadlessRuntimeStreamEnvelope) => void;\nexport type SubscriberListener = () => void;\n\nexport interface HeadlessAttachedSubscription {\n\tid: string;\n\tnext(): HeadlessRuntimeStreamEnvelope | null;\n\tonAvailable(listener: SubscriberListener): () => void;\n\tenqueue(envelope: HeadlessRuntimeStreamEnvelope): void;\n\tclose(): void;\n}\n\nexport function createConnectionId(): string {\n\treturn `conn_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function createSubscriptionId(): string {\n\treturn `sub_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport class HeadlessSubscriberMailbox {\n\tprivate readonly listeners = new Set<SubscriberListener>();\n\tprivate readonly queue: HeadlessRuntimeStreamEnvelope[] = [];\n\tprivate queuedReset: HeadlessRuntimeResetEnvelope | null = null;\n\tprivate detachedAt: number | null;\n\tprivate attached = false;\n\tprivate allowRawAgentEvents: boolean;\n\n\tconstructor(\n\t\treadonly id: string,\n\t\treadonly role: \"viewer\" | \"controller\",\n\t\treadonly explicit: boolean,\n\t\treadonly connectionId: string,\n\t\treadonly optOutNotifications: HeadlessNotificationType[] = [],\n\t\tallowRawAgentEvents = false,\n\t) {\n\t\tthis.detachedAt = explicit ? Date.now() : null;\n\t\tthis.allowRawAgentEvents = allowRawAgentEvents;\n\t}\n\n\tonAvailable(listener: SubscriberListener): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\tenqueue(\n\t\tenvelope: HeadlessRuntimeStreamEnvelope,\n\t\tcreateReset: (\n\t\t\treason: HeadlessRuntimeResetEnvelope[\"reason\"],\n\t\t) => HeadlessRuntimeResetEnvelope,\n\t): void {\n\t\tif (this.shouldFilterEnvelope(envelope)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push(envelope);\n\t\tif (this.queue.length > MAX_SUBSCRIBER_MAILBOX_EVENTS) {\n\t\t\tthis.queue.length = 0;\n\t\t\tthis.queuedReset = createReset(\"lagged\");\n\t\t}\n\t\tthis.emit();\n\t}\n\n\tnext(): HeadlessRuntimeStreamEnvelope | null {\n\t\tconst next = this.queuedReset ?? this.queue.shift() ?? null;\n\t\tif (next?.type === \"reset\") {\n\t\t\tthis.queuedReset = null;\n\t\t}\n\t\treturn next;\n\t}\n\n\tattach(): void {\n\t\tthis.attached = true;\n\t\tthis.detachedAt = null;\n\t\tthis.emit();\n\t}\n\n\tdetach(): void {\n\t\tthis.attached = false;\n\t\tthis.detachedAt = Date.now();\n\t}\n\n\ttouch(): void {\n\t\tif (this.explicit && !this.attached) {\n\t\t\tthis.detachedAt = Date.now();\n\t\t}\n\t}\n\n\tisExpired(now = Date.now()): boolean {\n\t\treturn (\n\t\t\tthis.explicit &&\n\t\t\t!this.attached &&\n\t\t\tthis.detachedAt !== null &&\n\t\t\tnow - this.detachedAt > MAX_SUBSCRIPTION_IDLE_MS\n\t\t);\n\t}\n\n\tisAttached(): boolean {\n\t\treturn this.attached;\n\t}\n\n\tallowsRawAgentEvents(): boolean {\n\t\treturn this.allowRawAgentEvents;\n\t}\n\n\tsetAllowRawAgentEvents(value: boolean): void {\n\t\tthis.allowRawAgentEvents = value;\n\t}\n\n\tprivate emit(): void {\n\t\tfor (const listener of this.listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tprivate shouldFilterEnvelope(\n\t\tenvelope: HeadlessRuntimeStreamEnvelope,\n\t): boolean {\n\t\tif (envelope.type === \"heartbeat\") {\n\t\t\treturn this.optOutNotifications.includes(\"heartbeat\");\n\t\t}\n\t\tif (envelope.type !== \"message\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tenvelope.message.type === \"raw_agent_event\" &&\n\t\t\t!this.allowRawAgentEvents\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this.optOutNotifications.length === 0) {\n\t\t\treturn false;\n\t\t}\n\t\tswitch (envelope.message.type) {\n\t\t\tcase \"status\":\n\t\t\t\treturn this.optOutNotifications.includes(\"status\");\n\t\t\tcase \"connection_info\":\n\t\t\t\treturn this.optOutNotifications.includes(\"connection_info\");\n\t\t\tcase \"compaction\":\n\t\t\t\treturn this.optOutNotifications.includes(\"compaction\");\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport class HeadlessRuntimeBroker {\n\tprivate nextCursor = 1;\n\tprivate readonly listeners = new Set<RuntimeListener>();\n\tprivate readonly events: HeadlessRuntimeStreamEnvelope[] = [];\n\n\tprivate publishEnvelope(\n\t\tenvelope: HeadlessRuntimeStreamEnvelope,\n\t): HeadlessRuntimeStreamEnvelope {\n\t\tassertHeadlessRuntimeStreamEnvelope(\n\t\t\tenvelope,\n\t\t\t\"headless runtime stream envelope\",\n\t\t);\n\t\tthis.events.push(envelope);\n\t\twhile (this.events.length > MAX_BUFFERED_EVENTS) {\n\t\t\tthis.events.shift();\n\t\t}\n\t\tfor (const listener of this.listeners) {\n\t\t\tlistener(envelope);\n\t\t}\n\t\treturn envelope;\n\t}\n\n\tpublish(message: HeadlessFromAgentMessage): HeadlessRuntimeEventEnvelope {\n\t\tconst envelope = this.createMessageEnvelope(message);\n\t\treturn this.publishEnvelope(envelope) as HeadlessRuntimeEventEnvelope;\n\t}\n\n\tcreatePrivateMessage(\n\t\tmessage: HeadlessFromAgentMessage,\n\t): HeadlessRuntimeEventEnvelope {\n\t\treturn this.createMessageEnvelope(message);\n\t}\n\n\tprivate createMessageEnvelope(\n\t\tmessage: HeadlessFromAgentMessage,\n\t): HeadlessRuntimeEventEnvelope {\n\t\tassertHeadlessFromAgentMessage(message, \"headless runtime message\");\n\t\tconst envelope: HeadlessRuntimeEventEnvelope = {\n\t\t\ttype: \"message\",\n\t\t\tcursor: this.nextCursor++,\n\t\t\tmessage,\n\t\t};\n\t\treturn envelope;\n\t}\n\n\tpublishSnapshot(\n\t\tcreateSnapshot: (cursor: number) => HeadlessRuntimeSnapshot,\n\t): HeadlessRuntimeSnapshotEnvelope {\n\t\tconst cursor = this.nextCursor++;\n\t\tconst envelope: HeadlessRuntimeSnapshotEnvelope = {\n\t\t\ttype: \"snapshot\",\n\t\t\tsnapshot: createSnapshot(cursor),\n\t\t};\n\t\treturn this.publishEnvelope(envelope) as HeadlessRuntimeSnapshotEnvelope;\n\t}\n\n\tcurrentCursor(): number {\n\t\treturn this.nextCursor - 1;\n\t}\n\n\trestoreFromSnapshot(snapshot: HeadlessRuntimeSnapshot): void {\n\t\tconst envelope: HeadlessRuntimeResetEnvelope = {\n\t\t\ttype: \"reset\",\n\t\t\treason: \"restored_from_snapshot\",\n\t\t\tsnapshot,\n\t\t};\n\t\tassertHeadlessRuntimeStreamEnvelope(\n\t\t\tenvelope,\n\t\t\t\"headless runtime restore envelope\",\n\t\t);\n\t\tthis.events.length = 0;\n\t\tthis.events.push(envelope);\n\t\tthis.nextCursor = Math.max(1, snapshot.cursor + 1);\n\t}\n\n\treplayFrom(cursor: number): HeadlessRuntimeStreamEnvelope[] | null {\n\t\tif (this.events.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst first = this.events[0];\n\t\tconst earliest = this.getEnvelopeCursor(first) ?? this.nextCursor;\n\t\tif (cursor < earliest - 1) {\n\t\t\tif (\n\t\t\t\tfirst?.type === \"reset\" &&\n\t\t\t\tfirst.reason === \"restored_from_snapshot\"\n\t\t\t) {\n\t\t\t\treturn [...this.events];\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\treturn this.events.filter(\n\t\t\t(event) => (this.getEnvelopeCursor(event) ?? 0) > cursor,\n\t\t);\n\t}\n\n\tsubscribe(listener: RuntimeListener): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\tprivate getEnvelopeCursor(\n\t\tenvelope: HeadlessRuntimeStreamEnvelope | undefined,\n\t): number | undefined {\n\t\tif (!envelope) {\n\t\t\treturn undefined;\n\t\t}\n\t\tswitch (envelope.type) {\n\t\t\tcase \"message\":\n\t\t\t\treturn envelope.cursor;\n\t\t\tcase \"heartbeat\":\n\t\t\t\treturn envelope.cursor;\n\t\t\tcase \"snapshot\":\n\t\t\tcase \"reset\":\n\t\t\t\treturn envelope.snapshot.cursor;\n\t\t}\n\t}\n}\n"]}
@@ -1,21 +1,16 @@
1
1
  import { type HeadlessConnectionRole, type HeadlessNotificationType } from "@evalops/contracts";
2
2
  import type { ApprovalMode } from "../agent/action-approval.js";
3
3
  import type { ThinkingLevel } from "../agent/types.js";
4
- import { type HeadlessClientCapabilities, type HeadlessClientInfo, type HeadlessFromAgentMessage, type HeadlessInitMessage, type HeadlessRuntimeState, type HeadlessToAgentMessage } from "../cli/headless-protocol.js";
4
+ import { type HeadlessClientCapabilities, type HeadlessClientInfo, type HeadlessToAgentMessage } from "../cli/headless-protocol.js";
5
5
  import type { RegisteredModel } from "../models/registry.js";
6
6
  import type { SessionManager } from "../session/manager.js";
7
7
  import type { WebServerContext } from "./app-context.js";
8
+ import { type HeadlessAttachedSubscription, type HeadlessRuntimeHeartbeatEnvelope, type HeadlessRuntimeSnapshot, type HeadlessRuntimeStreamEnvelope, type RuntimeListener } from "./headless-runtime/broker.js";
8
9
  import { type HostedAgentRuntimeCompleteInput, type HostedAgentRuntimeDrainInput, type HostedAgentRuntimeFailInput } from "./hosted-agent-runtime-progress.js";
10
+ export type { HeadlessAttachedSubscription, HeadlessRuntimeEventEnvelope, HeadlessRuntimeHeartbeatEnvelope, HeadlessRuntimeResetEnvelope, HeadlessRuntimeSnapshot, HeadlessRuntimeSnapshotEnvelope, HeadlessRuntimeStreamEnvelope, } from "./headless-runtime/broker.js";
9
11
  declare const HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION = "evalops.remote-runner.snapshot-manifest.v1";
10
12
  export declare function inferFleetModelTier(provider: string, model: string): string | undefined;
11
13
  export declare function getFleetPlatformEventBusStatus(): NonNullable<FleetAgentInstance["platformEventBus"]> | undefined;
12
- export interface HeadlessRuntimeSnapshot {
13
- protocolVersion: string;
14
- session_id: string;
15
- cursor: number;
16
- last_init: HeadlessInitMessage | null;
17
- state: HeadlessRuntimeState;
18
- }
19
14
  export type HostedRunnerRestoreFlushStatus = "completed" | "failed" | "skipped";
20
15
  export interface HostedRunnerRestoreManifest {
21
16
  protocol_version: typeof HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION;
@@ -108,24 +103,6 @@ export interface FleetDashboardSnapshot {
108
103
  process: FleetProcessResources;
109
104
  instances: FleetAgentInstance[];
110
105
  }
111
- export interface HeadlessRuntimeSnapshotEnvelope {
112
- type: "snapshot";
113
- snapshot: HeadlessRuntimeSnapshot;
114
- }
115
- export interface HeadlessRuntimeEventEnvelope {
116
- type: "message";
117
- cursor: number;
118
- message: HeadlessFromAgentMessage;
119
- }
120
- export interface HeadlessRuntimeHeartbeatEnvelope {
121
- type: "heartbeat";
122
- cursor: number;
123
- }
124
- export interface HeadlessRuntimeResetEnvelope {
125
- type: "reset";
126
- reason: "lagged" | "replay_gap" | "restored_from_snapshot";
127
- snapshot: HeadlessRuntimeSnapshot;
128
- }
129
106
  export interface HeadlessRuntimeSubscriptionSnapshot {
130
107
  connection_id: string;
131
108
  subscription_id: string;
@@ -157,16 +134,6 @@ export interface HeadlessRuntimeConnectionClosedSnapshot {
157
134
  controller_connection_id: string | null;
158
135
  disconnected_subscription_ids: string[];
159
136
  }
160
- export type HeadlessRuntimeStreamEnvelope = HeadlessRuntimeSnapshotEnvelope | HeadlessRuntimeEventEnvelope | HeadlessRuntimeHeartbeatEnvelope | HeadlessRuntimeResetEnvelope;
161
- type RuntimeListener = (envelope: HeadlessRuntimeStreamEnvelope) => void;
162
- type SubscriberListener = () => void;
163
- export interface HeadlessAttachedSubscription {
164
- id: string;
165
- next(): HeadlessRuntimeStreamEnvelope | null;
166
- onAvailable(listener: SubscriberListener): () => void;
167
- enqueue(envelope: HeadlessRuntimeStreamEnvelope): void;
168
- close(): void;
169
- }
170
137
  type RuntimeOptions = {
171
138
  scope_key: string;
172
139
  session_id: string;
@@ -356,5 +323,4 @@ export declare class HeadlessRuntimeService {
356
323
  getFleetDashboardSnapshot(): FleetDashboardSnapshot;
357
324
  private cleanup;
358
325
  }
359
- export {};
360
326
  //# sourceMappingURL=headless-runtime-service.d.ts.map