@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.
- package/dist/agent/transport/reusable-tool-results.d.ts +38 -0
- package/dist/agent/transport/reusable-tool-results.d.ts.map +1 -0
- package/dist/agent/transport/reusable-tool-results.js +432 -0
- package/dist/agent/transport/reusable-tool-results.js.map +1 -0
- package/dist/agent/transport.d.ts +1 -1
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +1 -430
- package/dist/agent/transport.js.map +1 -1
- package/dist/audit/logger.d.ts +2 -2
- package/dist/cli/commands/run.d.ts +15 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +35 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli.js +750 -632
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/platform/agent-registry-client.d.ts +6 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -1
- package/dist/platform/agent-registry-client.js +6 -0
- package/dist/platform/agent-registry-client.js.map +1 -1
- package/dist/server/agent-runtime-ledger.d.ts +5 -0
- package/dist/server/agent-runtime-ledger.d.ts.map +1 -1
- package/dist/server/agent-runtime-ledger.js +63 -0
- package/dist/server/agent-runtime-ledger.js.map +1 -1
- package/dist/server/headless-runtime/broker.d.ts +81 -0
- package/dist/server/headless-runtime/broker.d.ts.map +1 -0
- package/dist/server/headless-runtime/broker.js +201 -0
- package/dist/server/headless-runtime/broker.js.map +1 -0
- package/dist/server/headless-runtime-service.d.ts +3 -37
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +1 -199
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/session/manager.d.ts +1 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js.map +1 -1
- package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
- package/dist/tools/parallel-ripgrep.js +11 -2
- package/dist/tools/parallel-ripgrep.js.map +1 -1
- package/dist/version.json +2 -2
- 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":"AAYA,MAAM,CAAC,MAAM,2BAA2B,GACvC,yCAAyC,CAAC;AAC3C,MAAM,CAAC,MAAM,mCAAmC,GAC/C,iDAAiD,CAAC;AACnD,MAAM,CAAC,MAAM,mCAAmC,GAC/C,iDAAiD,CAAC;AAiLnD,SAAS,SAAS,CAAC,GAA2B,EAAE,GAAW;IAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA2B;IACtD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CACtB,MAAiC;IAEjC,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACd,OAAO,WAAW,CAAC;QACpB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,SAAS,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,QAAQ,CAAC;QACjB;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CACpB,KAA2B;IAE3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACb,OAAO,KAAK,CAAC;QACd,KAAK,SAAS;YACb,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,KAAK,MAAM;YACV,OAAO,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;gBACrE,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,WAAW,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,MAAM,CAAC;QACf,KAAK,UAAU;YACd,OAAO,UAAU,CAAC;QACnB,KAAK,UAAU;YACd,OAAO,UAAU,CAAC;QACnB,KAAK,YAAY;YAChB,OAAO,YAAY,CAAC;QACrB,KAAK,SAAS;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,KAAK,OAAO;YACX,OAAO,WAAW,CAAC;QACpB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,SAAsC,EACtC,KAA2B;IAE3B,IAAI,SAAS,KAAK,YAAY;QAAE,OAAO,gCAAgC,CAAC;IACxE,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,sCAAsC,CAAC;IAC7E,IAAI,SAAS,KAAK,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,2BAA2B,CAAC;IACpC,CAAC;IACD,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,iCAAiC,CAAC;IAC1E,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QACxD,OAAO,mCAAmC,CAAC;IAC5C,CAAC;IACD,OAAO,4BAA4B,CAAC;AACrC,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAiC;IAC9D,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,SAAS;YACb,OAAO,iCAAiC,CAAC;QAC1C,KAAK,YAAY;YAChB,OAAO,iCAAiC,CAAC;QAC1C,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YACjB,OAAO,gCAAgC,CAAC;QACzC,KAAK,WAAW;YACf,OAAO,gCAAgC,CAAC;QACzC,KAAK,MAAM,CAAC;QACZ,KAAK,YAAY;YAChB,OAAO,2BAA2B,CAAC;QACpC,KAAK,YAAY;YAChB,OAAO,+BAA+B,CAAC;QACxC,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU;YACd,OAAO,6BAA6B,CAAC;QACtC;YACC,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,IAAiC,EACjC,YAAsC;IAEtC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,QAAQ,YAAY,EAAE,kBAAkB,EAAE,CAAC;QAC1C,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YAChB,OAAO,8BAA8B,CAAC;QACvC,KAAK,aAAa,CAAC;QACnB,KAAK,iBAAiB,CAAC;QACvB,KAAK,YAAY;YAChB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,IAAI,YAAY,EAAE,iBAAiB;QAAE,OAAO,8BAA8B,CAAC;IAC3E,IAAI,YAAY,EAAE,gBAAgB;QAAE,OAAO,2BAA2B,CAAC;IACvE,OAAO,8BAA8B,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAC1B,QAAqC,EACrC,UAAiC;IAEjC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAChC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAU,CAAC,CACtD,CAAC;IACF,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,cAAc;YAClC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QACb,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACtD,OAAO;YACN,EAAE,EAAE,UAAU,KAAK,CAAC,EAAE,EAAE;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,iBAAiB,EAAE,KAAK,CAAC,EAAE;YAC3B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE;gBACd,QAAQ,EAAE,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;gBACvC,YAAY,EAAE,oBAAoB,CAAC,IAAI,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACrB,MAAmC,EACnC,OAAkC;IAElC,OAAO;QACN,aAAa,EAAE,mCAAmC;QAClD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QACvE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;QAChC,MAAM,EAAE;YACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE;KACD,CAAC;AACH,CAAC;AAED,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAA8B;IACzE,KAAK;IACL,MAAM;IACN,YAAY;CACZ,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,KAA8B;IACtD,OAAO,CACN,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,WAAW,CACrB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA8B;IAC1D,OAAO,CACN,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAC7C,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC5B,KAA8B;IAE9B,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CACvB,KAA8B,EAC9B,IAAsD;IAEtD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,oBAAoB,CAC5B,MAAgD;IAEhD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,eAAe;YACnB,OAAO,iBAAiB,MAAM,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,WAAW;YACf,OAAO,aAAa,MAAM,CAAC,EAAE,EAAE,CAAC;QACjC,KAAK,gBAAgB;YACpB,OAAO,kBAAkB,MAAM,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,kBAAkB;YACtB,OAAO,oBAAoB,MAAM,CAAC,EAAE,EAAE,CAAC;QACxC,KAAK,iBAAiB;YACrB,OAAO,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,WAAW;YACf,OAAO,aAAa,MAAM,CAAC,EAAE,EAAE,CAAC;QACjC,KAAK,kBAAkB;YACtB,OAAO,oBAAoB,MAAM,CAAC,EAAE,EAAE,CAAC;QACxC,KAAK,iBAAiB;YACrB,OAAO,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC;QACvC;YACC,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;IACvC,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,MAAiC;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAmB,EAAE;QACtD,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA8B;IAC3D,OAAO,aAAa,CAAC;QACpB,oBAAoB,KAAK,CAAC,iBAAiB,EAAE;QAC7C,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC;KAC3C,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC/B,SAAiB,EACjB,KAA8B;IAE9B,OAAO;QACN,gBAAgB,EAAE,SAAS;QAC3B,aAAa,EAAE,KAAK,CAAC,EAAE;QACvB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACrB,OAAkC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CACzB,KAAa,EACb,OAAkC;IAElC,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,SAAS,GACd,QAAQ,CAAC,KAAK,KAAK,WAAW,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC;IAChE,OAAO;QACN,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU;QAClD,EAAE,EAAE,WAAW,KAAK,WAAW;QAC/B,OAAO,EAAE;YACR,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,GAAG,CAAC,SAAS;gBACZ,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACA,MAAM,EAAE,kCAAkC,QAAQ,CAAC,KAAK,SAAS;iBACjE,CAAC;SACJ;KACD,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAChC,OAAkC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,sEAAsE,CAAC;IAC/E,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,wFAAwF,CAAC;IACjG,CAAC;IACD,OAAO,kEAAkE,IAAI,CAAC,KAAK,SAAS,CAAC;AAC9F,CAAC;AAED,SAAS,kBAAkB,CAC1B,KAAa,EACb,SAAiB,EACjB,WAAmB,EACnB,OAAkC;IAElC,MAAM,cAAc,GAAG,wBAAwB,SAAS,IAAI,KAAK,EAAE,CAAC;IACpE,MAAM,UAAU,GAAqC;QACpD;YACC,SAAS,EAAE,gBAAgB;YAC3B,EAAE,EAAE,WAAW,KAAK,UAAU;YAC9B,OAAO,EAAE;gBACR,eAAe,EAAE,8BAA8B;gBAC/C,aAAa,EAAE,SAAS;gBACxB,cAAc;gBACd,SAAS;gBACT,WAAW;aACX;SACD;KACD,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,UAAU,CAAC,IAAI,CAAC;YACf,SAAS,EAAE,iBAAiB;YAC5B,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,OAAO;YAC9B,aAAa,EAAE,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK,CAAC,EAAE;gBAChB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ;gBAClC,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;SACD,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC;YACf,SAAS,EAAE,sBAAsB;YACjC,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,YAAY;YACnC,aAAa,EAAE,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE;gBACR,UAAU,EAAE,KAAK,CAAC,EAAE;gBACpB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY;gBACtC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,YAAY;gBACZ,cAAc,EAAE,uCAAuC;gBACvD,OAAO,EAAE,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC;aAClD;SACD,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC;gBACf,SAAS,EAAE,UAAU;gBACrB,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,OAAO;gBAC9B,aAAa,EAAE,KAAK,CAAC,EAAE;gBACvB,OAAO,EAAE;oBACR,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ;oBACtC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC1B;aACD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG;QAChB,iFAAiF;QACjF,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;IAEF,OAAO;QACN,aAAa,EAAE,mCAAmC;QAClD,KAAK;QACL,SAAS;QACT,cAAc;QACd,UAAU;QACV,QAAQ;KACR,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,OAAuC;IAEvC,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;IACnD,MAAM,SAAS,GAAG,kBAAkB,CACnC,KAAK,EACL,SAAS,EACT,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAClC,OAAO,CACP,CAAC;IAEF,OAAO;QACN,aAAa,EAAE,2BAA2B;QAC1C,GAAG,EAAE;YACJ,EAAE,EAAE,KAAK;YACT,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;YAC/B,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW;YAC/C,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc;YACrD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW;gBAC9B,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE;QACD,MAAM,EAAE;YACP,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,mBAAmB,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM;YAChD,MAAM;YACN,OAAO;SACP;QACD,OAAO;QACP,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;QAC9C,SAAS;KACT,CAAC;AACH,CAAC","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
|
|
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
|