@evalops/maestro 0.10.21 → 0.10.23

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 (154) hide show
  1. package/dist/agent/agent.d.ts +1 -0
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js +15 -4
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/swarm/executor.d.ts.map +1 -1
  6. package/dist/agent/swarm/executor.js +68 -3
  7. package/dist/agent/swarm/executor.js.map +1 -1
  8. package/dist/agent/swarm/types.d.ts +3 -0
  9. package/dist/agent/swarm/types.d.ts.map +1 -1
  10. package/dist/agent/swarm/types.js.map +1 -1
  11. package/dist/agent/transport.d.ts.map +1 -1
  12. package/dist/agent/transport.js +7 -1
  13. package/dist/agent/transport.js.map +1 -1
  14. package/dist/audit/logger.d.ts +1 -1
  15. package/dist/bootstrap/tools-setup.d.ts.map +1 -1
  16. package/dist/bootstrap/tools-setup.js +3 -2
  17. package/dist/bootstrap/tools-setup.js.map +1 -1
  18. package/dist/cli/commands/a2a.d.ts.map +1 -1
  19. package/dist/cli/commands/a2a.js +141 -8
  20. package/dist/cli/commands/a2a.js.map +1 -1
  21. package/dist/cli/commands/codex.d.ts.map +1 -1
  22. package/dist/cli/commands/codex.js +4 -3
  23. package/dist/cli/commands/codex.js.map +1 -1
  24. package/dist/cli/commands/hosted-runner.d.ts +1 -0
  25. package/dist/cli/commands/hosted-runner.d.ts.map +1 -1
  26. package/dist/cli/commands/hosted-runner.js +31 -2
  27. package/dist/cli/commands/hosted-runner.js.map +1 -1
  28. package/dist/cli/commands/run.d.ts.map +1 -1
  29. package/dist/cli/commands/run.js +2 -9
  30. package/dist/cli/commands/run.js.map +1 -1
  31. package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -1
  32. package/dist/cli-tui/commands/a2a-handlers.js +55 -0
  33. package/dist/cli-tui/commands/a2a-handlers.js.map +1 -1
  34. package/dist/cli.js +3925 -2024
  35. package/dist/codex/compatibility.d.ts +17 -1
  36. package/dist/codex/compatibility.d.ts.map +1 -1
  37. package/dist/codex/compatibility.js +57 -1
  38. package/dist/codex/compatibility.js.map +1 -1
  39. package/dist/guardian/config.d.ts +8 -6
  40. package/dist/guardian/config.d.ts.map +1 -1
  41. package/dist/guardian/config.js +33 -7
  42. package/dist/guardian/config.js.map +1 -1
  43. package/dist/guardian/runner.d.ts.map +1 -1
  44. package/dist/guardian/runner.js +54 -9
  45. package/dist/guardian/runner.js.map +1 -1
  46. package/dist/mcp/config.d.ts.map +1 -1
  47. package/dist/mcp/config.js +2 -0
  48. package/dist/mcp/config.js.map +1 -1
  49. package/dist/mcp/fathom-cua.d.ts +3 -0
  50. package/dist/mcp/fathom-cua.d.ts.map +1 -0
  51. package/dist/mcp/fathom-cua.js +158 -0
  52. package/dist/mcp/fathom-cua.js.map +1 -0
  53. package/dist/mcp/index.d.ts +1 -0
  54. package/dist/mcp/index.d.ts.map +1 -1
  55. package/dist/mcp/index.js +1 -0
  56. package/dist/mcp/index.js.map +1 -1
  57. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
  58. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
  59. package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
  60. package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
  61. package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
  62. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
  63. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  64. package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
  65. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  66. package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
  67. package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
  68. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  69. package/dist/node_modules/@evalops/tui/package.json +1 -1
  70. package/dist/platform/a2a-cockpit.d.ts +90 -0
  71. package/dist/platform/a2a-cockpit.d.ts.map +1 -0
  72. package/dist/platform/a2a-cockpit.js +302 -0
  73. package/dist/platform/a2a-cockpit.js.map +1 -0
  74. package/dist/platform/a2a-fleet.d.ts +14 -0
  75. package/dist/platform/a2a-fleet.d.ts.map +1 -1
  76. package/dist/platform/a2a-fleet.js +66 -1
  77. package/dist/platform/a2a-fleet.js.map +1 -1
  78. package/dist/platform/a2a-ownership.d.ts +27 -0
  79. package/dist/platform/a2a-ownership.d.ts.map +1 -0
  80. package/dist/platform/a2a-ownership.js +149 -0
  81. package/dist/platform/a2a-ownership.js.map +1 -0
  82. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  83. package/dist/platform/a2a-task-ledger.js +29 -5
  84. package/dist/platform/a2a-task-ledger.js.map +1 -1
  85. package/dist/server/agent-trajectory-replay-lab.d.ts +36 -0
  86. package/dist/server/agent-trajectory-replay-lab.d.ts.map +1 -0
  87. package/dist/server/agent-trajectory-replay-lab.js +48 -0
  88. package/dist/server/agent-trajectory-replay-lab.js.map +1 -0
  89. package/dist/server/any-agent-control-plane-proof.d.ts +42 -0
  90. package/dist/server/any-agent-control-plane-proof.d.ts.map +1 -0
  91. package/dist/server/any-agent-control-plane-proof.js +175 -0
  92. package/dist/server/any-agent-control-plane-proof.js.map +1 -0
  93. package/dist/server/app-context.d.ts +1 -0
  94. package/dist/server/app-context.d.ts.map +1 -1
  95. package/dist/server/app-context.js.map +1 -1
  96. package/dist/server/handlers/a2a-cockpit.d.ts +3 -0
  97. package/dist/server/handlers/a2a-cockpit.d.ts.map +1 -0
  98. package/dist/server/handlers/a2a-cockpit.js +71 -0
  99. package/dist/server/handlers/a2a-cockpit.js.map +1 -0
  100. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  101. package/dist/server/handlers/headless-sessions.js +17 -2
  102. package/dist/server/handlers/headless-sessions.js.map +1 -1
  103. package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
  104. package/dist/server/handlers/session-artifacts.js +14 -58
  105. package/dist/server/handlers/session-artifacts.js.map +1 -1
  106. package/dist/server/handlers/session-replay-lab.d.ts +13 -0
  107. package/dist/server/handlers/session-replay-lab.d.ts.map +1 -0
  108. package/dist/server/handlers/session-replay-lab.js +80 -0
  109. package/dist/server/handlers/session-replay-lab.js.map +1 -0
  110. package/dist/server/handlers/stats.js +1 -1
  111. package/dist/server/handlers/stats.js.map +1 -1
  112. package/dist/server/handlers/status.d.ts +44 -3
  113. package/dist/server/handlers/status.d.ts.map +1 -1
  114. package/dist/server/handlers/status.js +227 -17
  115. package/dist/server/handlers/status.js.map +1 -1
  116. package/dist/server/headless-runtime-service.d.ts +17 -0
  117. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  118. package/dist/server/headless-runtime-service.js +143 -3
  119. package/dist/server/headless-runtime-service.js.map +1 -1
  120. package/dist/server/hosted-agent-runtime-progress.d.ts +17 -0
  121. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
  122. package/dist/server/hosted-agent-runtime-progress.js +352 -15
  123. package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
  124. package/dist/server/routes.d.ts.map +1 -1
  125. package/dist/server/routes.js +14 -0
  126. package/dist/server/routes.js.map +1 -1
  127. package/dist/services/intelligent-router/index.d.ts +1 -1
  128. package/dist/services/intelligent-router/index.d.ts.map +1 -1
  129. package/dist/services/intelligent-router/index.js +1 -1
  130. package/dist/services/intelligent-router/index.js.map +1 -1
  131. package/dist/services/intelligent-router/normalize.d.ts +10 -2
  132. package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
  133. package/dist/services/intelligent-router/normalize.js +20 -1
  134. package/dist/services/intelligent-router/normalize.js.map +1 -1
  135. package/dist/services/intelligent-router/service.d.ts.map +1 -1
  136. package/dist/services/intelligent-router/service.js +35 -0
  137. package/dist/services/intelligent-router/service.js.map +1 -1
  138. package/dist/services/intelligent-router/types.d.ts +13 -0
  139. package/dist/services/intelligent-router/types.d.ts.map +1 -1
  140. package/dist/services/intelligent-router/types.js +1 -0
  141. package/dist/services/intelligent-router/types.js.map +1 -1
  142. package/dist/telemetry/cli-command-aggregator.d.ts +1 -0
  143. package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -1
  144. package/dist/telemetry/cli-command-aggregator.js +23 -0
  145. package/dist/telemetry/cli-command-aggregator.js.map +1 -1
  146. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  147. package/dist/telemetry/maestro-event-bus.js +11 -5
  148. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  149. package/dist/telemetry/maestro-event-catalog.d.ts +15 -1
  150. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  151. package/dist/telemetry/maestro-event-catalog.js +30 -0
  152. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  153. package/dist/version.json +2 -2
  154. package/package.json +289 -283
@@ -0,0 +1,175 @@
1
+ export const ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA = "evalops.maestro.any-agent-control-plane-proof.v1";
2
+ function capability(id, label, status, evidence, blocker) {
3
+ return {
4
+ id,
5
+ label,
6
+ status,
7
+ evidence,
8
+ ...(blocker ? { blocker } : {}),
9
+ };
10
+ }
11
+ function latestDecision(decisions) {
12
+ return decisions?.[0];
13
+ }
14
+ function hasOnlyEvalSamples(input) {
15
+ return input.evalSamples > 0 && input.productionSamples === 0;
16
+ }
17
+ function routeCandidateKey(input) {
18
+ return `${input.taskType}:${input.provider}/${input.model}`;
19
+ }
20
+ function countEvalBackedRoutes(input) {
21
+ const routes = new Set();
22
+ for (const metric of input.routeMetrics ?? []) {
23
+ if (hasOnlyEvalSamples(metric)) {
24
+ routes.add(routeCandidateKey(metric));
25
+ }
26
+ }
27
+ for (const decision of input.routingDecisions ?? []) {
28
+ for (const score of decision.scores) {
29
+ if (score.evalBacked || hasOnlyEvalSamples(score)) {
30
+ routes.add(routeCandidateKey({
31
+ taskType: decision.taskType,
32
+ provider: score.provider,
33
+ model: score.model,
34
+ }));
35
+ }
36
+ }
37
+ }
38
+ return routes.size;
39
+ }
40
+ function proveDiscovery(a2a) {
41
+ if (!a2a) {
42
+ return capability("a2a_discovery", "A2A discovery", "failed", [], "No A2A cockpit summary was supplied.");
43
+ }
44
+ if (a2a.counts.onlinePeers > 0) {
45
+ return capability("a2a_discovery", "A2A discovery", "passed", [
46
+ `${a2a.counts.onlinePeers}/${a2a.counts.peers} peers online`,
47
+ ]);
48
+ }
49
+ if (a2a.counts.peers > 0) {
50
+ return capability("a2a_discovery", "A2A discovery", "warning", [`${a2a.counts.peers} peers registered`], "Registered A2A peers are currently unreachable.");
51
+ }
52
+ return capability("a2a_discovery", "A2A discovery", "failed", [], "No A2A peers are registered.");
53
+ }
54
+ function proveDelegation(a2a) {
55
+ if (!a2a) {
56
+ return capability("a2a_delegation", "A2A delegation", "failed", [], "No A2A cockpit summary was supplied.");
57
+ }
58
+ const delegateAction = a2a.nextActions.find((action) => action.command.startsWith("maestro a2a delegate "));
59
+ if (a2a.counts.tasks > 0) {
60
+ return capability("a2a_delegation", "A2A delegation", "passed", [
61
+ `${a2a.counts.tasks} delegated tasks tracked`,
62
+ ]);
63
+ }
64
+ if (delegateAction) {
65
+ return capability("a2a_delegation", "A2A delegation", "passed", [
66
+ delegateAction.command,
67
+ ]);
68
+ }
69
+ return capability("a2a_delegation", "A2A delegation", a2a.counts.onlinePeers > 0 ? "warning" : "failed", [], "No active task or delegation command is available.");
70
+ }
71
+ function proveRouting(decision) {
72
+ if (!decision) {
73
+ return capability("model_routing", "Model routing", "failed", [], "No intelligent-router decision was supplied.");
74
+ }
75
+ const selected = `${decision.selectedModel.provider}/${decision.selectedModel.model}`;
76
+ const evidence = [
77
+ `selected ${selected}`,
78
+ `fallbacks ${decision.fallbackChain.length}`,
79
+ `reason ${decision.reason}`,
80
+ ];
81
+ return capability("model_routing", "Model routing", decision.fallbackChain.length > 0 ? "passed" : "warning", evidence, decision.fallbackChain.length > 0
82
+ ? undefined
83
+ : "Routing decision has no fallback chain.");
84
+ }
85
+ function proveEvalRouting(input) {
86
+ const evalBackedRoutes = countEvalBackedRoutes(input);
87
+ if (evalBackedRoutes > 0) {
88
+ return capability("eval_backed_routing", "Eval-backed routing", "passed", [
89
+ `${evalBackedRoutes} route candidates have eval samples`,
90
+ ]);
91
+ }
92
+ if ((input.routingDecisions?.length ?? 0) > 0) {
93
+ return capability("eval_backed_routing", "Eval-backed routing", "warning", ["routing decisions exist"], "No route candidate includes eval-backed samples yet.");
94
+ }
95
+ return capability("eval_backed_routing", "Eval-backed routing", "failed", [], "No routing decisions or eval metrics were supplied.");
96
+ }
97
+ function proveObservability(runHealth) {
98
+ if (!runHealth) {
99
+ return capability("runtime_observability", "Runtime observability", "failed", [], "No run-health snapshot was supplied.");
100
+ }
101
+ return capability("runtime_observability", "Runtime observability", runHealth.status === "healthy" ? "passed" : "warning", [`runHealth ${runHealth.status}`, `${runHealth.slos.length} SLO lanes`], runHealth.status === "healthy"
102
+ ? undefined
103
+ : runHealth.diagnostics.join("; ") ||
104
+ `Runtime health is ${runHealth.status}.`);
105
+ }
106
+ function proveReplay(replayLab) {
107
+ if (!replayLab) {
108
+ return capability("trajectory_replay", "Trajectory replay", "failed", [], "No trajectory replay lab report was supplied.");
109
+ }
110
+ if (replayLab.summary.trajectoryEvents === 0) {
111
+ return capability("trajectory_replay", "Trajectory replay", "failed", [], "Replay lab has no trajectory events.");
112
+ }
113
+ return capability("trajectory_replay", "Trajectory replay", replayLab.summary.scoreFailures > 0 ? "warning" : "passed", [
114
+ `${replayLab.summary.trajectoryEvents} trajectory events`,
115
+ `${replayLab.summary.scoreFailures} score failures`,
116
+ `${replayLab.summary.jumpTargets} jump targets`,
117
+ ], replayLab.summary.scoreFailures > 0
118
+ ? "Replay lab has score failures."
119
+ : undefined);
120
+ }
121
+ function proveOperatorHandoff(a2a) {
122
+ if (!a2a) {
123
+ return capability("operator_handoff", "Operator handoff", "failed", [], "No A2A cockpit summary was supplied.");
124
+ }
125
+ const commands = a2a.nextActions.map((action) => action.command);
126
+ if (commands.length > 0) {
127
+ return capability("operator_handoff", "Operator handoff", "passed", [
128
+ `${commands.length} operator actions available`,
129
+ ]);
130
+ }
131
+ return capability("operator_handoff", "Operator handoff", a2a.counts.peers > 0 ? "warning" : "failed", [], "No next operator action was produced.");
132
+ }
133
+ function overallStatus(capabilities) {
134
+ if (capabilities.some((entry) => entry.status === "failed")) {
135
+ return "incomplete";
136
+ }
137
+ if (capabilities.some((entry) => entry.status === "warning")) {
138
+ return "needs_attention";
139
+ }
140
+ return "passed";
141
+ }
142
+ export function buildAnyAgentControlPlaneProof(input) {
143
+ const capabilities = [
144
+ proveDiscovery(input.a2a),
145
+ proveDelegation(input.a2a),
146
+ proveRouting(latestDecision(input.routingDecisions)),
147
+ proveEvalRouting(input),
148
+ proveObservability(input.runHealth),
149
+ proveReplay(input.replayLab),
150
+ proveOperatorHandoff(input.a2a),
151
+ ];
152
+ const passed = capabilities.filter((entry) => entry.status === "passed").length;
153
+ const warnings = capabilities.filter((entry) => entry.status === "warning").length;
154
+ const failed = capabilities.filter((entry) => entry.status === "failed").length;
155
+ return {
156
+ schemaVersion: ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA,
157
+ generatedAt: input.generatedAt ?? new Date().toISOString(),
158
+ status: overallStatus(capabilities),
159
+ summary: {
160
+ capabilities: capabilities.length,
161
+ passed,
162
+ warnings,
163
+ failed,
164
+ agentsObserved: input.a2a?.counts.peers ?? 0,
165
+ routingDecisions: input.routingDecisions?.length ?? 0,
166
+ evalBackedRoutes: countEvalBackedRoutes(input),
167
+ },
168
+ capabilities,
169
+ blockers: capabilities
170
+ .filter((entry) => entry.blocker)
171
+ .map((entry) => `${entry.label}: ${entry.blocker}`),
172
+ operatorNextActions: input.a2a?.nextActions.map((action) => action.command).slice(0, 5) ?? [],
173
+ };
174
+ }
175
+ //# sourceMappingURL=any-agent-control-plane-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"any-agent-control-plane-proof.js","sourceRoot":"","sources":["../../src/server/any-agent-control-plane-proof.ts"],"names":[],"mappings":"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","sourcesContent":["import type { A2ACockpitSummary } from \"../platform/a2a-cockpit.js\";\nimport type {\n\tModelPerformanceAggregate,\n\tRoutingDecision,\n} from \"../services/intelligent-router/types.js\";\nimport type { AgentTrajectoryReplayLabReport } from \"./agent-trajectory-replay-lab.js\";\nimport type { RunHealthSnapshot } from \"./handlers/status.js\";\n\nexport const ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA =\n\t\"evalops.maestro.any-agent-control-plane-proof.v1\";\n\nexport type AnyAgentControlPlaneProofStatus =\n\t| \"passed\"\n\t| \"needs_attention\"\n\t| \"incomplete\";\n\nexport type AnyAgentControlPlaneCapabilityStatus =\n\t| \"passed\"\n\t| \"warning\"\n\t| \"failed\";\n\nexport type AnyAgentControlPlaneCapabilityId =\n\t| \"a2a_discovery\"\n\t| \"a2a_delegation\"\n\t| \"model_routing\"\n\t| \"eval_backed_routing\"\n\t| \"runtime_observability\"\n\t| \"trajectory_replay\"\n\t| \"operator_handoff\";\n\nexport interface AnyAgentControlPlaneProofInput {\n\tgeneratedAt?: string;\n\ta2a?: A2ACockpitSummary;\n\troutingDecisions?: RoutingDecision[];\n\trouteMetrics?: ModelPerformanceAggregate[];\n\treplayLab?: AgentTrajectoryReplayLabReport;\n\trunHealth?: RunHealthSnapshot;\n}\n\nexport interface AnyAgentControlPlaneCapabilityProof {\n\tid: AnyAgentControlPlaneCapabilityId;\n\tlabel: string;\n\tstatus: AnyAgentControlPlaneCapabilityStatus;\n\tevidence: string[];\n\tblocker?: string;\n}\n\nexport interface AnyAgentControlPlaneProofReport {\n\tschemaVersion: typeof ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA;\n\tgeneratedAt: string;\n\tstatus: AnyAgentControlPlaneProofStatus;\n\tsummary: {\n\t\tcapabilities: number;\n\t\tpassed: number;\n\t\twarnings: number;\n\t\tfailed: number;\n\t\tagentsObserved: number;\n\t\troutingDecisions: number;\n\t\tevalBackedRoutes: number;\n\t};\n\tcapabilities: AnyAgentControlPlaneCapabilityProof[];\n\tblockers: string[];\n\toperatorNextActions: string[];\n}\n\nfunction capability(\n\tid: AnyAgentControlPlaneCapabilityId,\n\tlabel: string,\n\tstatus: AnyAgentControlPlaneCapabilityStatus,\n\tevidence: string[],\n\tblocker?: string,\n): AnyAgentControlPlaneCapabilityProof {\n\treturn {\n\t\tid,\n\t\tlabel,\n\t\tstatus,\n\t\tevidence,\n\t\t...(blocker ? { blocker } : {}),\n\t};\n}\n\nfunction latestDecision(\n\tdecisions: RoutingDecision[] | undefined,\n): RoutingDecision | undefined {\n\treturn decisions?.[0];\n}\n\nfunction hasOnlyEvalSamples(input: {\n\tevalSamples: number;\n\tproductionSamples: number;\n}): boolean {\n\treturn input.evalSamples > 0 && input.productionSamples === 0;\n}\n\nfunction routeCandidateKey(input: {\n\ttaskType: string;\n\tprovider: string;\n\tmodel: string;\n}): string {\n\treturn `${input.taskType}:${input.provider}/${input.model}`;\n}\n\nfunction countEvalBackedRoutes(input: AnyAgentControlPlaneProofInput): number {\n\tconst routes = new Set<string>();\n\tfor (const metric of input.routeMetrics ?? []) {\n\t\tif (hasOnlyEvalSamples(metric)) {\n\t\t\troutes.add(routeCandidateKey(metric));\n\t\t}\n\t}\n\tfor (const decision of input.routingDecisions ?? []) {\n\t\tfor (const score of decision.scores) {\n\t\t\tif (score.evalBacked || hasOnlyEvalSamples(score)) {\n\t\t\t\troutes.add(\n\t\t\t\t\trouteCandidateKey({\n\t\t\t\t\t\ttaskType: decision.taskType,\n\t\t\t\t\t\tprovider: score.provider,\n\t\t\t\t\t\tmodel: score.model,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn routes.size;\n}\n\nfunction proveDiscovery(\n\ta2a: A2ACockpitSummary | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!a2a) {\n\t\treturn capability(\n\t\t\t\"a2a_discovery\",\n\t\t\t\"A2A discovery\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No A2A cockpit summary was supplied.\",\n\t\t);\n\t}\n\tif (a2a.counts.onlinePeers > 0) {\n\t\treturn capability(\"a2a_discovery\", \"A2A discovery\", \"passed\", [\n\t\t\t`${a2a.counts.onlinePeers}/${a2a.counts.peers} peers online`,\n\t\t]);\n\t}\n\tif (a2a.counts.peers > 0) {\n\t\treturn capability(\n\t\t\t\"a2a_discovery\",\n\t\t\t\"A2A discovery\",\n\t\t\t\"warning\",\n\t\t\t[`${a2a.counts.peers} peers registered`],\n\t\t\t\"Registered A2A peers are currently unreachable.\",\n\t\t);\n\t}\n\treturn capability(\n\t\t\"a2a_discovery\",\n\t\t\"A2A discovery\",\n\t\t\"failed\",\n\t\t[],\n\t\t\"No A2A peers are registered.\",\n\t);\n}\n\nfunction proveDelegation(\n\ta2a: A2ACockpitSummary | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!a2a) {\n\t\treturn capability(\n\t\t\t\"a2a_delegation\",\n\t\t\t\"A2A delegation\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No A2A cockpit summary was supplied.\",\n\t\t);\n\t}\n\tconst delegateAction = a2a.nextActions.find((action) =>\n\t\taction.command.startsWith(\"maestro a2a delegate \"),\n\t);\n\tif (a2a.counts.tasks > 0) {\n\t\treturn capability(\"a2a_delegation\", \"A2A delegation\", \"passed\", [\n\t\t\t`${a2a.counts.tasks} delegated tasks tracked`,\n\t\t]);\n\t}\n\tif (delegateAction) {\n\t\treturn capability(\"a2a_delegation\", \"A2A delegation\", \"passed\", [\n\t\t\tdelegateAction.command,\n\t\t]);\n\t}\n\treturn capability(\n\t\t\"a2a_delegation\",\n\t\t\"A2A delegation\",\n\t\ta2a.counts.onlinePeers > 0 ? \"warning\" : \"failed\",\n\t\t[],\n\t\t\"No active task or delegation command is available.\",\n\t);\n}\n\nfunction proveRouting(\n\tdecision: RoutingDecision | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!decision) {\n\t\treturn capability(\n\t\t\t\"model_routing\",\n\t\t\t\"Model routing\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No intelligent-router decision was supplied.\",\n\t\t);\n\t}\n\tconst selected = `${decision.selectedModel.provider}/${decision.selectedModel.model}`;\n\tconst evidence = [\n\t\t`selected ${selected}`,\n\t\t`fallbacks ${decision.fallbackChain.length}`,\n\t\t`reason ${decision.reason}`,\n\t];\n\treturn capability(\n\t\t\"model_routing\",\n\t\t\"Model routing\",\n\t\tdecision.fallbackChain.length > 0 ? \"passed\" : \"warning\",\n\t\tevidence,\n\t\tdecision.fallbackChain.length > 0\n\t\t\t? undefined\n\t\t\t: \"Routing decision has no fallback chain.\",\n\t);\n}\n\nfunction proveEvalRouting(\n\tinput: AnyAgentControlPlaneProofInput,\n): AnyAgentControlPlaneCapabilityProof {\n\tconst evalBackedRoutes = countEvalBackedRoutes(input);\n\tif (evalBackedRoutes > 0) {\n\t\treturn capability(\"eval_backed_routing\", \"Eval-backed routing\", \"passed\", [\n\t\t\t`${evalBackedRoutes} route candidates have eval samples`,\n\t\t]);\n\t}\n\tif ((input.routingDecisions?.length ?? 0) > 0) {\n\t\treturn capability(\n\t\t\t\"eval_backed_routing\",\n\t\t\t\"Eval-backed routing\",\n\t\t\t\"warning\",\n\t\t\t[\"routing decisions exist\"],\n\t\t\t\"No route candidate includes eval-backed samples yet.\",\n\t\t);\n\t}\n\treturn capability(\n\t\t\"eval_backed_routing\",\n\t\t\"Eval-backed routing\",\n\t\t\"failed\",\n\t\t[],\n\t\t\"No routing decisions or eval metrics were supplied.\",\n\t);\n}\n\nfunction proveObservability(\n\trunHealth: RunHealthSnapshot | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!runHealth) {\n\t\treturn capability(\n\t\t\t\"runtime_observability\",\n\t\t\t\"Runtime observability\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No run-health snapshot was supplied.\",\n\t\t);\n\t}\n\treturn capability(\n\t\t\"runtime_observability\",\n\t\t\"Runtime observability\",\n\t\trunHealth.status === \"healthy\" ? \"passed\" : \"warning\",\n\t\t[`runHealth ${runHealth.status}`, `${runHealth.slos.length} SLO lanes`],\n\t\trunHealth.status === \"healthy\"\n\t\t\t? undefined\n\t\t\t: runHealth.diagnostics.join(\"; \") ||\n\t\t\t\t\t`Runtime health is ${runHealth.status}.`,\n\t);\n}\n\nfunction proveReplay(\n\treplayLab: AgentTrajectoryReplayLabReport | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!replayLab) {\n\t\treturn capability(\n\t\t\t\"trajectory_replay\",\n\t\t\t\"Trajectory replay\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No trajectory replay lab report was supplied.\",\n\t\t);\n\t}\n\tif (replayLab.summary.trajectoryEvents === 0) {\n\t\treturn capability(\n\t\t\t\"trajectory_replay\",\n\t\t\t\"Trajectory replay\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"Replay lab has no trajectory events.\",\n\t\t);\n\t}\n\treturn capability(\n\t\t\"trajectory_replay\",\n\t\t\"Trajectory replay\",\n\t\treplayLab.summary.scoreFailures > 0 ? \"warning\" : \"passed\",\n\t\t[\n\t\t\t`${replayLab.summary.trajectoryEvents} trajectory events`,\n\t\t\t`${replayLab.summary.scoreFailures} score failures`,\n\t\t\t`${replayLab.summary.jumpTargets} jump targets`,\n\t\t],\n\t\treplayLab.summary.scoreFailures > 0\n\t\t\t? \"Replay lab has score failures.\"\n\t\t\t: undefined,\n\t);\n}\n\nfunction proveOperatorHandoff(\n\ta2a: A2ACockpitSummary | undefined,\n): AnyAgentControlPlaneCapabilityProof {\n\tif (!a2a) {\n\t\treturn capability(\n\t\t\t\"operator_handoff\",\n\t\t\t\"Operator handoff\",\n\t\t\t\"failed\",\n\t\t\t[],\n\t\t\t\"No A2A cockpit summary was supplied.\",\n\t\t);\n\t}\n\tconst commands = a2a.nextActions.map((action) => action.command);\n\tif (commands.length > 0) {\n\t\treturn capability(\"operator_handoff\", \"Operator handoff\", \"passed\", [\n\t\t\t`${commands.length} operator actions available`,\n\t\t]);\n\t}\n\treturn capability(\n\t\t\"operator_handoff\",\n\t\t\"Operator handoff\",\n\t\ta2a.counts.peers > 0 ? \"warning\" : \"failed\",\n\t\t[],\n\t\t\"No next operator action was produced.\",\n\t);\n}\n\nfunction overallStatus(\n\tcapabilities: AnyAgentControlPlaneCapabilityProof[],\n): AnyAgentControlPlaneProofStatus {\n\tif (capabilities.some((entry) => entry.status === \"failed\")) {\n\t\treturn \"incomplete\";\n\t}\n\tif (capabilities.some((entry) => entry.status === \"warning\")) {\n\t\treturn \"needs_attention\";\n\t}\n\treturn \"passed\";\n}\n\nexport function buildAnyAgentControlPlaneProof(\n\tinput: AnyAgentControlPlaneProofInput,\n): AnyAgentControlPlaneProofReport {\n\tconst capabilities = [\n\t\tproveDiscovery(input.a2a),\n\t\tproveDelegation(input.a2a),\n\t\tproveRouting(latestDecision(input.routingDecisions)),\n\t\tproveEvalRouting(input),\n\t\tproveObservability(input.runHealth),\n\t\tproveReplay(input.replayLab),\n\t\tproveOperatorHandoff(input.a2a),\n\t];\n\tconst passed = capabilities.filter(\n\t\t(entry) => entry.status === \"passed\",\n\t).length;\n\tconst warnings = capabilities.filter(\n\t\t(entry) => entry.status === \"warning\",\n\t).length;\n\tconst failed = capabilities.filter(\n\t\t(entry) => entry.status === \"failed\",\n\t).length;\n\treturn {\n\t\tschemaVersion: ANY_AGENT_CONTROL_PLANE_PROOF_SCHEMA,\n\t\tgeneratedAt: input.generatedAt ?? new Date().toISOString(),\n\t\tstatus: overallStatus(capabilities),\n\t\tsummary: {\n\t\t\tcapabilities: capabilities.length,\n\t\t\tpassed,\n\t\t\twarnings,\n\t\t\tfailed,\n\t\t\tagentsObserved: input.a2a?.counts.peers ?? 0,\n\t\t\troutingDecisions: input.routingDecisions?.length ?? 0,\n\t\t\tevalBackedRoutes: countEvalBackedRoutes(input),\n\t\t},\n\t\tcapabilities,\n\t\tblockers: capabilities\n\t\t\t.filter((entry) => entry.blocker)\n\t\t\t.map((entry) => `${entry.label}: ${entry.blocker}`),\n\t\toperatorNextActions:\n\t\t\tinput.a2a?.nextActions.map((action) => action.command).slice(0, 5) ?? [],\n\t};\n}\n"]}
@@ -21,6 +21,7 @@ export interface HostedRunnerContext {
21
21
  ownerInstanceId?: string;
22
22
  workspaceRoot: string;
23
23
  snapshotRoot?: string;
24
+ restoreManifestPath?: string;
24
25
  listenHost?: string;
25
26
  listenPort?: number;
26
27
  workspaceId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tcontextId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
1
+ {"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\trestoreManifestPath?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tcontextId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export declare function handleA2ACockpit(req: IncomingMessage, res: ServerResponse, corsHeaders: Record<string, string>): Promise<void>;
3
+ //# sourceMappingURL=a2a-cockpit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-cockpit.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/a2a-cockpit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAUjE,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,71 @@
1
+ import { buildA2ACockpit } from "../../platform/a2a-cockpit.js";
2
+ import { getVerifiedRequestPrincipal } from "../authz.js";
3
+ import { ApiError, respondWithApiError, sendJson } from "../server-utils.js";
4
+ import { resolveSessionScope } from "../session-scope.js";
5
+ const DEFAULT_WEB_A2A_COCKPIT_TIMEOUT_MS = 2_500;
6
+ const MAX_WEB_A2A_COCKPIT_TIMEOUT_MS = 10_000;
7
+ export async function handleA2ACockpit(req, res, corsHeaders) {
8
+ try {
9
+ if (req.method !== "GET") {
10
+ throw new ApiError(405, "Method not allowed");
11
+ }
12
+ const url = new URL(req.url ?? "/api/a2a/cockpit", "http://localhost");
13
+ rejectHostedPathOverrides(url);
14
+ const cockpit = await buildA2ACockpit({
15
+ registryPath: undefined,
16
+ tasksPath: undefined,
17
+ timeoutMs: positiveIntegerQuery(url, "timeoutMs", {
18
+ max: MAX_WEB_A2A_COCKPIT_TIMEOUT_MS,
19
+ }) ?? DEFAULT_WEB_A2A_COCKPIT_TIMEOUT_MS,
20
+ peer: optionalQueryString(url, "peer"),
21
+ limit: positiveIntegerQuery(url, "limit"),
22
+ ownershipScope: ownershipScopeForRequest(req),
23
+ });
24
+ sendJson(res, 200, cockpit, corsHeaders, req);
25
+ }
26
+ catch (error) {
27
+ respondWithApiError(res, error, 500, corsHeaders, req);
28
+ }
29
+ }
30
+ function ownershipScopeForRequest(req) {
31
+ const principal = getVerifiedRequestPrincipal(req);
32
+ const scopeKey = resolveSessionScope(req) ??
33
+ (principal?.authMethod !== "anon" ? principal?.scopeKey : undefined);
34
+ if (!scopeKey) {
35
+ return undefined;
36
+ }
37
+ return {
38
+ scopeKey,
39
+ ...(principal?.subject ? { subject: principal.subject } : {}),
40
+ ...(principal?.userId ? { userId: principal.userId } : {}),
41
+ ...(principal?.keyId ? { keyId: principal.keyId } : {}),
42
+ ...(principal?.workspaceId ? { workspaceId: principal.workspaceId } : {}),
43
+ ...(principal?.orgId ? { orgId: principal.orgId } : {}),
44
+ ...(principal?.teamId ? { teamId: principal.teamId } : {}),
45
+ };
46
+ }
47
+ function rejectHostedPathOverrides(url) {
48
+ const blockedParams = ["registry", "tasks"].filter((key) => url.searchParams.has(key));
49
+ if (blockedParams.length > 0) {
50
+ throw new ApiError(400, `${blockedParams.join(", ")} query parameter${blockedParams.length === 1 ? " is" : "s are"} not supported by the hosted A2A cockpit`);
51
+ }
52
+ }
53
+ function optionalQueryString(url, key) {
54
+ const value = url.searchParams.get(key)?.trim();
55
+ return value ? value : undefined;
56
+ }
57
+ function positiveIntegerQuery(url, key, options = {}) {
58
+ const value = optionalQueryString(url, key);
59
+ if (!value) {
60
+ return undefined;
61
+ }
62
+ const parsed = Number(value);
63
+ if (!Number.isInteger(parsed) || parsed <= 0) {
64
+ throw new ApiError(400, `${key} must be a positive integer`);
65
+ }
66
+ if (options.max !== undefined && parsed > options.max) {
67
+ throw new ApiError(400, `${key} must be at most ${options.max}`);
68
+ }
69
+ return parsed;
70
+ }
71
+ //# sourceMappingURL=a2a-cockpit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-cockpit.js","sourceRoot":"","sources":["../../../src/server/handlers/a2a-cockpit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { buildA2ACockpit } from \"../../platform/a2a-cockpit.js\";\nimport type { A2AOwnershipScope } from \"../../platform/a2a-ownership.js\";\nimport { getVerifiedRequestPrincipal } from \"../authz.js\";\nimport { ApiError, respondWithApiError, sendJson } from \"../server-utils.js\";\nimport { resolveSessionScope } from \"../session-scope.js\";\n\nconst DEFAULT_WEB_A2A_COCKPIT_TIMEOUT_MS = 2_500;\nconst MAX_WEB_A2A_COCKPIT_TIMEOUT_MS = 10_000;\n\nexport async function handleA2ACockpit(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcorsHeaders: Record<string, string>,\n): Promise<void> {\n\ttry {\n\t\tif (req.method !== \"GET\") {\n\t\t\tthrow new ApiError(405, \"Method not allowed\");\n\t\t}\n\t\tconst url = new URL(req.url ?? \"/api/a2a/cockpit\", \"http://localhost\");\n\t\trejectHostedPathOverrides(url);\n\t\tconst cockpit = await buildA2ACockpit({\n\t\t\tregistryPath: undefined,\n\t\t\ttasksPath: undefined,\n\t\t\ttimeoutMs:\n\t\t\t\tpositiveIntegerQuery(url, \"timeoutMs\", {\n\t\t\t\t\tmax: MAX_WEB_A2A_COCKPIT_TIMEOUT_MS,\n\t\t\t\t}) ?? DEFAULT_WEB_A2A_COCKPIT_TIMEOUT_MS,\n\t\t\tpeer: optionalQueryString(url, \"peer\"),\n\t\t\tlimit: positiveIntegerQuery(url, \"limit\"),\n\t\t\townershipScope: ownershipScopeForRequest(req),\n\t\t});\n\t\tsendJson(res, 200, cockpit, corsHeaders, req);\n\t} catch (error) {\n\t\trespondWithApiError(res, error, 500, corsHeaders, req);\n\t}\n}\n\nfunction ownershipScopeForRequest(\n\treq: IncomingMessage,\n): A2AOwnershipScope | undefined {\n\tconst principal = getVerifiedRequestPrincipal(req);\n\tconst scopeKey =\n\t\tresolveSessionScope(req) ??\n\t\t(principal?.authMethod !== \"anon\" ? principal?.scopeKey : undefined);\n\tif (!scopeKey) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tscopeKey,\n\t\t...(principal?.subject ? { subject: principal.subject } : {}),\n\t\t...(principal?.userId ? { userId: principal.userId } : {}),\n\t\t...(principal?.keyId ? { keyId: principal.keyId } : {}),\n\t\t...(principal?.workspaceId ? { workspaceId: principal.workspaceId } : {}),\n\t\t...(principal?.orgId ? { orgId: principal.orgId } : {}),\n\t\t...(principal?.teamId ? { teamId: principal.teamId } : {}),\n\t};\n}\n\nfunction rejectHostedPathOverrides(url: URL): void {\n\tconst blockedParams = [\"registry\", \"tasks\"].filter((key) =>\n\t\turl.searchParams.has(key),\n\t);\n\tif (blockedParams.length > 0) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t`${blockedParams.join(\", \")} query parameter${\n\t\t\t\tblockedParams.length === 1 ? \" is\" : \"s are\"\n\t\t\t} not supported by the hosted A2A cockpit`,\n\t\t);\n\t}\n}\n\nfunction optionalQueryString(url: URL, key: string): string | undefined {\n\tconst value = url.searchParams.get(key)?.trim();\n\treturn value ? value : undefined;\n}\n\nfunction positiveIntegerQuery(\n\turl: URL,\n\tkey: string,\n\toptions: { max?: number } = {},\n): number | undefined {\n\tconst value = optionalQueryString(url, key);\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\tconst parsed = Number(value);\n\tif (!Number.isInteger(parsed) || parsed <= 0) {\n\t\tthrow new ApiError(400, `${key} must be a positive integer`);\n\t}\n\tif (options.max !== undefined && parsed > options.max) {\n\t\tthrow new ApiError(400, `${key} must be at most ${options.max}`);\n\t}\n\treturn parsed;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"headless-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAmBjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA2B1D,oBAAY,qBAAqB;IAChC,eAAe,sBAAsB;IACrC,qBAAqB,4BAA4B;CACjD;AA8qBD,wBAAsB,2BAA2B,CAChD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAQzB;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAazB;AAED,wBAAgB,0BAA0B,CACzC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAI/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAyD/B;AAED,wBAAsB,gCAAgC,CACrD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAW/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAiB/B;AAED,wBAAsB,+BAA+B,CACpD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAqB/B;AAED,wBAAgB,2BAA2B,CAC1C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAsE/B;AAED,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAsB/B"}
1
+ {"version":3,"file":"headless-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAmBjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4B1D,oBAAY,qBAAqB;IAChC,eAAe,sBAAsB;IACrC,qBAAqB,4BAA4B;CACjD;AA+rBD,wBAAsB,2BAA2B,CAChD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAQzB;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAazB;AAED,wBAAgB,0BAA0B,CACzC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAI/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAyD/B;AAED,wBAAsB,gCAAgC,CACrD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAW/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAiB/B;AAED,wBAAsB,+BAA+B,CACpD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAqB/B;AAED,wBAAgB,2BAA2B,CAC1C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAsE/B;AAED,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAsB/B"}
@@ -1,9 +1,11 @@
1
+ import { existsSync } from "node:fs";
1
2
  import { headlessApprovalModes, headlessConnectionRoles, headlessNotificationTypes, headlessServerRequestTypes, headlessThinkingLevels, headlessToAgentMessageSchemasByType, headlessToAgentMessageTypes, headlessUtilityOperations, } from "@evalops/contracts";
2
3
  import { Type } from "@sinclair/typebox";
3
4
  import { resolveExistingWorkspaceRoot } from "../../headless/workspace-root.js";
4
5
  import { recordMaestroSessionRuntimeTrigger } from "../../platform/agent-runtime-client.js";
5
6
  import { normalizeApprovalMode, resolveApprovalModeForRequest, } from "../approval-mode-store.js";
6
7
  import { getAuthScopeKey, getAuthSubject } from "../authz.js";
8
+ import { loadHostedRunnerRestoreManifest } from "../headless-runtime-service.js";
7
9
  import { bindHostedRunnerPlatformLease, claimHostedRunnerLease, evaluateHostedRunnerLeaseUse, } from "../hosted-runner-lease.js";
8
10
  import { getTraceParentHeader } from "../request-context.js";
9
11
  import { ApiError, getRequestHeader, readRequestBody, sendJson, } from "../server-utils.js";
@@ -293,11 +295,24 @@ function rethrowHeadlessConnectionLifecycleError(error) {
293
295
  async function ensureRuntime(req, context, input) {
294
296
  const sessionManager = createSessionManagerForRequest(req, false);
295
297
  const role = getHeadlessRole(req, input.role);
296
- const requestedSessionId = input.sessionId?.trim() || undefined;
298
+ const hostedRestoreSessionId = context.hostedRunner?.restoreManifestPath
299
+ ? (context.hostedRunner.activeMaestroSessionId ??
300
+ context.hostedRunner.configuredMaestroSessionId)
301
+ : undefined;
302
+ const requestedSessionId = input.sessionId?.trim() || hostedRestoreSessionId || undefined;
297
303
  const workspaceRoot = resolveRuntimeWorkspaceRoot(context, input.workspaceRoot);
298
304
  ensureHostedRunnerCanUseSession(context, requestedSessionId);
299
305
  if (requestedSessionId) {
300
- const sessionFile = sessionManager.getSessionFileById(requestedSessionId);
306
+ let sessionFile = sessionManager.getSessionFileById(requestedSessionId);
307
+ if (!sessionFile && context.hostedRunner?.restoreManifestPath) {
308
+ const restoreManifest = await loadHostedRunnerRestoreManifest(context.hostedRunner.restoreManifestPath);
309
+ const restoreSessionFile = restoreManifest?.maestro_session_id === requestedSessionId
310
+ ? restoreManifest.runtime.session_file
311
+ : undefined;
312
+ if (restoreSessionFile && existsSync(restoreSessionFile)) {
313
+ sessionFile = restoreSessionFile;
314
+ }
315
+ }
301
316
  if (!sessionFile) {
302
317
  throw new ApiError(404, "Session not found");
303
318
  }