@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
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/codex.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CACvC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,MAAM,EAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/codex.ts"],"names":[],"mappings":"AAYA,wBAAsB,kBAAkB,CACvC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,MAAM,EAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -1,6 +1,6 @@
1
1
  import chalk from "chalk";
2
2
  import { createCodexAppServerClient, } from "../../codex/app-server-client.js";
3
- import { compileCodexDynamicToolSpecs, selectCodexDefaultTools, } from "../../codex/compatibility.js";
3
+ import { compileCodexDynamicToolSpecs, resolveCodexToolProfileName, selectCodexToolProfile, } from "../../codex/compatibility.js";
4
4
  import { codingTools } from "../../tools/index.js";
5
5
  export async function handleCodexCommand(subcommand, params = []) {
6
6
  switch (subcommand) {
@@ -98,9 +98,10 @@ async function handleDoctor() {
98
98
  else {
99
99
  console.log(chalk.green(`ChatGPT sign-in: ${accountDoctorLabel(account)}`));
100
100
  }
101
- const selectedTools = selectCodexDefaultTools(codingTools);
101
+ const profileName = resolveCodexToolProfileName(process.env.MAESTRO_CODEX_TOOL_PROFILE);
102
+ const selectedTools = selectCodexToolProfile(codingTools, profileName);
102
103
  const compiled = compileCodexDynamicToolSpecs(selectedTools);
103
- console.log(chalk.green(`Default Codex tool profile: ${selectedTools.length} tools (${selectedTools
104
+ console.log(chalk.green(`Codex tool profile (${profileName}): ${selectedTools.length} tools (${selectedTools
104
105
  .map((tool) => tool.name)
105
106
  .join(", ")})`));
106
107
  const errors = compiled.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/commands/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport {\n\ttype CodexAccountReadResult,\n\tcreateCodexAppServerClient,\n} from \"../../codex/app-server-client.js\";\nimport {\n\tcompileCodexDynamicToolSpecs,\n\tselectCodexDefaultTools,\n} from \"../../codex/compatibility.js\";\nimport { codingTools } from \"../../tools/index.js\";\n\nexport async function handleCodexCommand(\n\tsubcommand?: string,\n\tparams: string[] = [],\n): Promise<void> {\n\tswitch (subcommand) {\n\t\tcase \"login\":\n\t\t\tawait handleLogin(params);\n\t\t\treturn;\n\t\tcase \"logout\":\n\t\t\tawait handleLogout();\n\t\t\treturn;\n\t\tcase \"status\":\n\t\t\tawait handleStatus();\n\t\t\treturn;\n\t\tcase \"doctor\":\n\t\t\tawait handleDoctor();\n\t\t\treturn;\n\t\tdefault:\n\t\t\tconsole.error(\n\t\t\t\tchalk.red(\n\t\t\t\t\t'Unknown codex subcommand. Try \"maestro codex login\", \"logout\", \"status\", or \"doctor\".',\n\t\t\t\t),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function handleLogin(params: string[] = []): Promise<void> {\n\tconst deviceFlow =\n\t\tparams.includes(\"--device\") || params.includes(\"--device-code\");\n\tconsole.log(chalk.bold(\"Maestro OpenAI Codex Login\"));\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tconst login = await client.startChatGptLogin(\n\t\t\tdeviceFlow ? \"device\" : \"browser\",\n\t\t);\n\t\tif (isBrowserLogin(login)) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\"Open this URL in your browser to sign in with ChatGPT:\"),\n\t\t\t);\n\t\t\tconsole.log(chalk.underline(login.authUrl));\n\t\t\tconsole.log(chalk.dim(\"Waiting for ChatGPT sign-in to complete...\"));\n\t\t\tawait client.waitForLoginCompletion(login.loginId);\n\t\t} else if (isDeviceCodeLogin(login)) {\n\t\t\tconsole.log(chalk.yellow(\"Open this URL and enter the code:\"));\n\t\t\tconsole.log(chalk.underline(login.verificationUrl));\n\t\t\tconsole.log(chalk.bold(login.userCode));\n\t\t\tconsole.log(chalk.dim(\"Waiting for ChatGPT sign-in to complete...\"));\n\t\t\tawait client.waitForLoginCompletion(login.loginId);\n\t\t} else if (isApiKeyLogin(login)) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.green(\"OpenAI Codex is already configured with an API key.\"),\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim(\n\t\t\t\t\t'Select provider \"openai-codex\" or a model like \"openai-codex/gpt-5.5\".',\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported Codex login response: ${login.type}`);\n\t\t}\n\t\tconst account = await client.readAccount(true);\n\t\tconsole.log(chalk.green(`Signed in with ChatGPT${accountLabel(account)}.`));\n\t\tconsole.log(\n\t\t\tchalk.dim(\n\t\t\t\t'Select provider \"openai-codex\" or a model like \"openai-codex/gpt-5.5\".',\n\t\t\t),\n\t\t);\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleLogout(): Promise<void> {\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tawait client.logout();\n\t\tconsole.log(chalk.green(\"Signed out of ChatGPT for OpenAI Codex.\"));\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleStatus(): Promise<void> {\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tconst account = await client.readAccount(true);\n\t\tif (!account.account) {\n\t\t\tconsole.log(chalk.yellow(\"No ChatGPT sign-in for OpenAI Codex.\"));\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim('Run \"maestro codex login\" to sign in with ChatGPT.'),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(\n\t\t\tchalk.green(`OpenAI Codex is signed in${accountLabel(account)}.`),\n\t\t);\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleDoctor(): Promise<void> {\n\tconsole.log(chalk.bold(\"Maestro Codex Doctor\"));\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize({ experimentalApi: true });\n\t\tconst account = await client.readAccount(true);\n\t\tif (!account.account) {\n\t\t\tconsole.log(chalk.yellow(\"ChatGPT sign-in: missing\"));\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim('Run \"maestro codex login\" to sign in with ChatGPT.'),\n\t\t\t);\n\t\t\tprocess.exitCode = 1;\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\tchalk.green(`ChatGPT sign-in: ${accountDoctorLabel(account)}`),\n\t\t\t);\n\t\t}\n\n\t\tconst selectedTools = selectCodexDefaultTools(codingTools);\n\t\tconst compiled = compileCodexDynamicToolSpecs(selectedTools);\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`Default Codex tool profile: ${selectedTools.length} tools (${selectedTools\n\t\t\t\t\t.map((tool) => tool.name)\n\t\t\t\t\t.join(\", \")})`,\n\t\t\t),\n\t\t);\n\n\t\tconst errors = compiled.diagnostics.filter(\n\t\t\t(diagnostic) => diagnostic.severity === \"error\",\n\t\t);\n\t\tif (errors.length > 0) {\n\t\t\tprocess.exitCode = 1;\n\t\t\tconsole.log(chalk.red(`Dynamic tool schema: ${errors.length} error(s)`));\n\t\t} else {\n\t\t\tconsole.log(chalk.green(\"Dynamic tool schema: compatible\"));\n\t\t}\n\t\tfor (const diagnostic of compiled.diagnostics) {\n\t\t\tconst formatter =\n\t\t\t\tdiagnostic.severity === \"error\"\n\t\t\t\t\t? chalk.red\n\t\t\t\t\t: diagnostic.severity === \"warning\"\n\t\t\t\t\t\t? chalk.yellow\n\t\t\t\t\t\t: chalk.dim;\n\t\t\tconsole.log(formatter(`${diagnostic.code}: ${diagnostic.message}`));\n\t\t}\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nfunction accountLabel(state: CodexAccountReadResult): string {\n\tconst account = state.account;\n\tif (!account || account.type !== \"chatgpt\") {\n\t\treturn \"\";\n\t}\n\tconst plan =\n\t\ttypeof account.planType === \"string\" && account.planType.length > 0\n\t\t\t? `, ${account.planType}`\n\t\t\t: \"\";\n\treturn ` as ${account.email}${plan}`;\n}\n\nfunction accountDoctorLabel(state: CodexAccountReadResult): string {\n\tconst account = state.account;\n\tif (!account) {\n\t\treturn \"missing\";\n\t}\n\tif (account.type === \"chatgpt\") {\n\t\tconst plan =\n\t\t\ttypeof account.planType === \"string\" && account.planType.length > 0\n\t\t\t\t? `, ${account.planType}`\n\t\t\t\t: \"\";\n\t\treturn `${account.email}${plan}`;\n\t}\n\tif (account.type === \"apiKey\") {\n\t\treturn \"API key\";\n\t}\n\treturn account.type;\n}\n\nfunction isBrowserLogin(\n\tvalue: unknown,\n): value is { type: \"chatgpt\"; loginId: string; authUrl: string } {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"chatgpt\" &&\n\t\ttypeof (value as { loginId?: unknown }).loginId === \"string\" &&\n\t\ttypeof (value as { authUrl?: unknown }).authUrl === \"string\"\n\t);\n}\n\nfunction isApiKeyLogin(value: unknown): value is { type: \"apiKey\" } {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"apiKey\"\n\t);\n}\n\nfunction isDeviceCodeLogin(value: unknown): value is {\n\ttype: \"chatgptDeviceCode\";\n\tloginId: string;\n\tverificationUrl: string;\n\tuserCode: string;\n} {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"chatgptDeviceCode\" &&\n\t\ttypeof (value as { loginId?: unknown }).loginId === \"string\" &&\n\t\ttypeof (value as { verificationUrl?: unknown }).verificationUrl ===\n\t\t\t\"string\" &&\n\t\ttypeof (value as { userCode?: unknown }).userCode === \"string\"\n\t);\n}\n"]}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/commands/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport {\n\ttype CodexAccountReadResult,\n\tcreateCodexAppServerClient,\n} from \"../../codex/app-server-client.js\";\nimport {\n\tcompileCodexDynamicToolSpecs,\n\tresolveCodexToolProfileName,\n\tselectCodexToolProfile,\n} from \"../../codex/compatibility.js\";\nimport { codingTools } from \"../../tools/index.js\";\n\nexport async function handleCodexCommand(\n\tsubcommand?: string,\n\tparams: string[] = [],\n): Promise<void> {\n\tswitch (subcommand) {\n\t\tcase \"login\":\n\t\t\tawait handleLogin(params);\n\t\t\treturn;\n\t\tcase \"logout\":\n\t\t\tawait handleLogout();\n\t\t\treturn;\n\t\tcase \"status\":\n\t\t\tawait handleStatus();\n\t\t\treturn;\n\t\tcase \"doctor\":\n\t\t\tawait handleDoctor();\n\t\t\treturn;\n\t\tdefault:\n\t\t\tconsole.error(\n\t\t\t\tchalk.red(\n\t\t\t\t\t'Unknown codex subcommand. Try \"maestro codex login\", \"logout\", \"status\", or \"doctor\".',\n\t\t\t\t),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t}\n}\n\nasync function handleLogin(params: string[] = []): Promise<void> {\n\tconst deviceFlow =\n\t\tparams.includes(\"--device\") || params.includes(\"--device-code\");\n\tconsole.log(chalk.bold(\"Maestro OpenAI Codex Login\"));\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tconst login = await client.startChatGptLogin(\n\t\t\tdeviceFlow ? \"device\" : \"browser\",\n\t\t);\n\t\tif (isBrowserLogin(login)) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\"Open this URL in your browser to sign in with ChatGPT:\"),\n\t\t\t);\n\t\t\tconsole.log(chalk.underline(login.authUrl));\n\t\t\tconsole.log(chalk.dim(\"Waiting for ChatGPT sign-in to complete...\"));\n\t\t\tawait client.waitForLoginCompletion(login.loginId);\n\t\t} else if (isDeviceCodeLogin(login)) {\n\t\t\tconsole.log(chalk.yellow(\"Open this URL and enter the code:\"));\n\t\t\tconsole.log(chalk.underline(login.verificationUrl));\n\t\t\tconsole.log(chalk.bold(login.userCode));\n\t\t\tconsole.log(chalk.dim(\"Waiting for ChatGPT sign-in to complete...\"));\n\t\t\tawait client.waitForLoginCompletion(login.loginId);\n\t\t} else if (isApiKeyLogin(login)) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.green(\"OpenAI Codex is already configured with an API key.\"),\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim(\n\t\t\t\t\t'Select provider \"openai-codex\" or a model like \"openai-codex/gpt-5.5\".',\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported Codex login response: ${login.type}`);\n\t\t}\n\t\tconst account = await client.readAccount(true);\n\t\tconsole.log(chalk.green(`Signed in with ChatGPT${accountLabel(account)}.`));\n\t\tconsole.log(\n\t\t\tchalk.dim(\n\t\t\t\t'Select provider \"openai-codex\" or a model like \"openai-codex/gpt-5.5\".',\n\t\t\t),\n\t\t);\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleLogout(): Promise<void> {\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tawait client.logout();\n\t\tconsole.log(chalk.green(\"Signed out of ChatGPT for OpenAI Codex.\"));\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleStatus(): Promise<void> {\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize();\n\t\tconst account = await client.readAccount(true);\n\t\tif (!account.account) {\n\t\t\tconsole.log(chalk.yellow(\"No ChatGPT sign-in for OpenAI Codex.\"));\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim('Run \"maestro codex login\" to sign in with ChatGPT.'),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(\n\t\t\tchalk.green(`OpenAI Codex is signed in${accountLabel(account)}.`),\n\t\t);\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nasync function handleDoctor(): Promise<void> {\n\tconsole.log(chalk.bold(\"Maestro Codex Doctor\"));\n\tconst client = createCodexAppServerClient();\n\ttry {\n\t\tawait client.initialize({ experimentalApi: true });\n\t\tconst account = await client.readAccount(true);\n\t\tif (!account.account) {\n\t\t\tconsole.log(chalk.yellow(\"ChatGPT sign-in: missing\"));\n\t\t\tconsole.log(\n\t\t\t\tchalk.dim('Run \"maestro codex login\" to sign in with ChatGPT.'),\n\t\t\t);\n\t\t\tprocess.exitCode = 1;\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\tchalk.green(`ChatGPT sign-in: ${accountDoctorLabel(account)}`),\n\t\t\t);\n\t\t}\n\n\t\tconst profileName = resolveCodexToolProfileName(\n\t\t\tprocess.env.MAESTRO_CODEX_TOOL_PROFILE,\n\t\t);\n\t\tconst selectedTools = selectCodexToolProfile(codingTools, profileName);\n\t\tconst compiled = compileCodexDynamicToolSpecs(selectedTools);\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`Codex tool profile (${profileName}): ${selectedTools.length} tools (${selectedTools\n\t\t\t\t\t.map((tool) => tool.name)\n\t\t\t\t\t.join(\", \")})`,\n\t\t\t),\n\t\t);\n\n\t\tconst errors = compiled.diagnostics.filter(\n\t\t\t(diagnostic) => diagnostic.severity === \"error\",\n\t\t);\n\t\tif (errors.length > 0) {\n\t\t\tprocess.exitCode = 1;\n\t\t\tconsole.log(chalk.red(`Dynamic tool schema: ${errors.length} error(s)`));\n\t\t} else {\n\t\t\tconsole.log(chalk.green(\"Dynamic tool schema: compatible\"));\n\t\t}\n\t\tfor (const diagnostic of compiled.diagnostics) {\n\t\t\tconst formatter =\n\t\t\t\tdiagnostic.severity === \"error\"\n\t\t\t\t\t? chalk.red\n\t\t\t\t\t: diagnostic.severity === \"warning\"\n\t\t\t\t\t\t? chalk.yellow\n\t\t\t\t\t\t: chalk.dim;\n\t\t\tconsole.log(formatter(`${diagnostic.code}: ${diagnostic.message}`));\n\t\t}\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nfunction accountLabel(state: CodexAccountReadResult): string {\n\tconst account = state.account;\n\tif (!account || account.type !== \"chatgpt\") {\n\t\treturn \"\";\n\t}\n\tconst plan =\n\t\ttypeof account.planType === \"string\" && account.planType.length > 0\n\t\t\t? `, ${account.planType}`\n\t\t\t: \"\";\n\treturn ` as ${account.email}${plan}`;\n}\n\nfunction accountDoctorLabel(state: CodexAccountReadResult): string {\n\tconst account = state.account;\n\tif (!account) {\n\t\treturn \"missing\";\n\t}\n\tif (account.type === \"chatgpt\") {\n\t\tconst plan =\n\t\t\ttypeof account.planType === \"string\" && account.planType.length > 0\n\t\t\t\t? `, ${account.planType}`\n\t\t\t\t: \"\";\n\t\treturn `${account.email}${plan}`;\n\t}\n\tif (account.type === \"apiKey\") {\n\t\treturn \"API key\";\n\t}\n\treturn account.type;\n}\n\nfunction isBrowserLogin(\n\tvalue: unknown,\n): value is { type: \"chatgpt\"; loginId: string; authUrl: string } {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"chatgpt\" &&\n\t\ttypeof (value as { loginId?: unknown }).loginId === \"string\" &&\n\t\ttypeof (value as { authUrl?: unknown }).authUrl === \"string\"\n\t);\n}\n\nfunction isApiKeyLogin(value: unknown): value is { type: \"apiKey\" } {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"apiKey\"\n\t);\n}\n\nfunction isDeviceCodeLogin(value: unknown): value is {\n\ttype: \"chatgptDeviceCode\";\n\tloginId: string;\n\tverificationUrl: string;\n\tuserCode: string;\n} {\n\treturn (\n\t\tBoolean(value && typeof value === \"object\") &&\n\t\t(value as { type?: unknown }).type === \"chatgptDeviceCode\" &&\n\t\ttypeof (value as { loginId?: unknown }).loginId === \"string\" &&\n\t\ttypeof (value as { verificationUrl?: unknown }).verificationUrl ===\n\t\t\t\"string\" &&\n\t\ttypeof (value as { userCode?: unknown }).userCode === \"string\"\n\t);\n}\n"]}
@@ -4,6 +4,7 @@ export interface HostedRunnerConfig {
4
4
  ownerInstanceId?: string;
5
5
  workspaceRoot: string;
6
6
  snapshotRoot: string;
7
+ restoreManifestPath?: string;
7
8
  host?: string;
8
9
  port: number;
9
10
  workspaceId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hosted-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AASvE,MAAM,WAAW,kBAAkB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,0BAA0B;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AA6JD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAqE7B;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAoC7E;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,kBAAkB,GACxB,mBAAmB,CAgBrB;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,IAAI,CAAC,CAoBf"}
1
+ {"version":3,"file":"hosted-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hosted-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AASvE,MAAM,WAAW,kBAAkB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,0BAA0B;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAsLD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAkF7B;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAwC7E;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,kBAAkB,GACxB,mBAAmB,CAiBrB;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -1,4 +1,4 @@
1
- import { realpath, stat } from "node:fs/promises";
1
+ import { readFile, realpath, stat } from "node:fs/promises";
2
2
  import { resolve } from "node:path";
3
3
  import chalk from "chalk";
4
4
  const HOSTED_RUNNER_USAGE = `maestro hosted-runner [options]
@@ -8,6 +8,7 @@ Options:
8
8
  --owner-instance-id <id> Platform runtime owner generation for attach fencing
9
9
  --workspace-root <path> Workspace root mounted into the runtime pod (required)
10
10
  --snapshot-root <path> Directory for drain snapshot manifests
11
+ --restore-manifest <path> Restore runtime state from a prior drain manifest
11
12
  --listen <host:port> Address to bind, for example 0.0.0.0:8080
12
13
  --host <host> Bind host when --listen is not used
13
14
  --port <port> Bind port when --listen is not used
@@ -23,6 +24,7 @@ Environment:
23
24
  MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID, REMOTE_RUNNER_OWNER_INSTANCE_ID
24
25
  MAESTRO_WORKSPACE_ROOT
25
26
  MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT, REMOTE_RUNNER_SNAPSHOT_ROOT
27
+ MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST, REMOTE_RUNNER_RESTORE_MANIFEST
26
28
  MAESTRO_HOSTED_RUNNER_LISTEN, MAESTRO_HOSTED_RUNNER_HOST, MAESTRO_HOSTED_RUNNER_PORT, PORT
27
29
  MAESTRO_REMOTE_RUNNER_WORKSPACE_ID, MAESTRO_AGENT_ID, MAESTRO_AGENT_RUN_ID, MAESTRO_SESSION_ID
28
30
  MAESTRO_ATTACH_AUDIENCE`;
@@ -124,6 +126,19 @@ function resolveSnapshotRoot(path, workspaceRoot) {
124
126
  }
125
127
  return resolve(workspaceRoot, path);
126
128
  }
129
+ function resolveRestoreManifestPath(path, workspaceRoot) {
130
+ return path ? resolve(workspaceRoot, path) : undefined;
131
+ }
132
+ async function readRestoreManifestSessionId(path) {
133
+ if (!path) {
134
+ return undefined;
135
+ }
136
+ const raw = JSON.parse(await readFile(path, "utf8"));
137
+ const sessionId = typeof raw.maestro_session_id === "string"
138
+ ? raw.maestro_session_id.trim()
139
+ : "";
140
+ return sessionId || undefined;
141
+ }
127
142
  export function formatHostedRunnerUsage() {
128
143
  return HOSTED_RUNNER_USAGE;
129
144
  }
@@ -146,6 +161,12 @@ export async function resolveHostedRunnerConfig(args, env = process.env, options
146
161
  8080;
147
162
  const workspaceRoot = await resolveWorkspaceRoot(getLastFlag(parsed, "workspace-root") ??
148
163
  getEnvValue(env, ["MAESTRO_WORKSPACE_ROOT", "WORKSPACE_ROOT"]));
164
+ const restoreManifestPath = resolveRestoreManifestPath(getLastFlag(parsed, "restore-manifest") ??
165
+ getEnvValue(env, [
166
+ "MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST",
167
+ "REMOTE_RUNNER_RESTORE_MANIFEST",
168
+ ]), workspaceRoot);
169
+ const restoreManifestSessionId = await readRestoreManifestSessionId(restoreManifestPath);
149
170
  return {
150
171
  runnerSessionId,
151
172
  ownerInstanceId: getLastFlag(parsed, "owner-instance-id") ??
@@ -159,6 +180,7 @@ export async function resolveHostedRunnerConfig(args, env = process.env, options
159
180
  "MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT",
160
181
  "REMOTE_RUNNER_SNAPSHOT_ROOT",
161
182
  ]), workspaceRoot),
183
+ ...(restoreManifestPath ? { restoreManifestPath } : {}),
162
184
  host: listen.host ??
163
185
  getLastFlag(parsed, "host") ??
164
186
  env.MAESTRO_HOSTED_RUNNER_HOST,
@@ -171,7 +193,9 @@ export async function resolveHostedRunnerConfig(args, env = process.env, options
171
193
  agentId: getLastFlag(parsed, "agent-id") ??
172
194
  getEnvValue(env, ["MAESTRO_REMOTE_RUNNER_AGENT_ID", "MAESTRO_AGENT_ID"]),
173
195
  agentRunId: getLastFlag(parsed, "agent-run-id") ?? env.MAESTRO_AGENT_RUN_ID,
174
- maestroSessionId: getLastFlag(parsed, "maestro-session-id") ?? env.MAESTRO_SESSION_ID,
196
+ maestroSessionId: getLastFlag(parsed, "maestro-session-id") ??
197
+ env.MAESTRO_SESSION_ID ??
198
+ restoreManifestSessionId,
175
199
  attachAudience: getLastFlag(parsed, "attach-audience") ?? env.MAESTRO_ATTACH_AUDIENCE,
176
200
  };
177
201
  }
@@ -180,6 +204,10 @@ export function applyHostedRunnerEnvironment(config) {
180
204
  process.env.MAESTRO_RUNNER_SESSION_ID = config.runnerSessionId;
181
205
  process.env.MAESTRO_WORKSPACE_ROOT = config.workspaceRoot;
182
206
  process.env.MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT = config.snapshotRoot;
207
+ if (config.restoreManifestPath) {
208
+ process.env.MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST =
209
+ config.restoreManifestPath;
210
+ }
183
211
  if (config.ownerInstanceId) {
184
212
  process.env.MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID =
185
213
  config.ownerInstanceId;
@@ -215,6 +243,7 @@ export function toHostedRunnerContext(config) {
215
243
  ownerInstanceId: config.ownerInstanceId,
216
244
  workspaceRoot: config.workspaceRoot,
217
245
  snapshotRoot: config.snapshotRoot,
246
+ restoreManifestPath: config.restoreManifestPath,
218
247
  listenHost: config.host,
219
248
  listenPort: config.port,
220
249
  workspaceId: config.workspaceId,
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-runner.js","sourceRoot":"","sources":["../../../src/cli/commands/hosted-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpath, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport type { HostedRunnerContext } from \"../../server/app-context.js\";\n\ntype HostedRunnerFlagValue = true | string;\n\ninterface HostedRunnerOptions {\n\tflags: Map<string, HostedRunnerFlagValue[]>;\n\tpositionals: string[];\n}\n\nexport interface HostedRunnerConfig {\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot: string;\n\thost?: string;\n\tport: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tmaestroSessionId?: string;\n\tattachAudience?: string;\n}\n\ninterface HostedRunnerResolveOptions {\n\tdefaultPort?: number;\n}\n\nconst HOSTED_RUNNER_USAGE = `maestro hosted-runner [options]\n\nOptions:\n --runner-session-id <id> Platform remote-runner session id (required)\n --owner-instance-id <id> Platform runtime owner generation for attach fencing\n --workspace-root <path> Workspace root mounted into the runtime pod (required)\n --snapshot-root <path> Directory for drain snapshot manifests\n --listen <host:port> Address to bind, for example 0.0.0.0:8080\n --host <host> Bind host when --listen is not used\n --port <port> Bind port when --listen is not used\n --workspace-id <id> EvalOps workspace id for metadata\n --agent-id <id> Platform agent-registry agent id for metadata\n --agent-run-id <id> Platform AgentRun id for metadata\n --maestro-session-id <id> Existing Maestro session id for metadata\n --attach-audience <aud> Expected attach audience metadata\n --help Show this help\n\nEnvironment:\n MAESTRO_RUNNER_SESSION_ID, REMOTE_RUNNER_SESSION_ID\n MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID, REMOTE_RUNNER_OWNER_INSTANCE_ID\n MAESTRO_WORKSPACE_ROOT\n MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT, REMOTE_RUNNER_SNAPSHOT_ROOT\n MAESTRO_HOSTED_RUNNER_LISTEN, MAESTRO_HOSTED_RUNNER_HOST, MAESTRO_HOSTED_RUNNER_PORT, PORT\n MAESTRO_REMOTE_RUNNER_WORKSPACE_ID, MAESTRO_AGENT_ID, MAESTRO_AGENT_RUN_ID, MAESTRO_SESSION_ID\n MAESTRO_ATTACH_AUDIENCE`;\n\nfunction parseHostedRunnerOptions(\n\targs: readonly string[],\n): HostedRunnerOptions {\n\tconst flags = new Map<string, HostedRunnerFlagValue[]>();\n\tconst positionals: string[] = [];\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpositionals.push(...args.slice(index + 1));\n\t\t\tbreak;\n\t\t}\n\t\tif (!arg.startsWith(\"--\")) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tconst equalsIndex = arg.indexOf(\"=\");\n\t\tconst key = equalsIndex >= 0 ? arg.slice(2, equalsIndex) : arg.slice(2);\n\t\tconst inlineValue =\n\t\t\tequalsIndex >= 0 ? arg.slice(equalsIndex + 1) : undefined;\n\t\tconst next = args[index + 1];\n\t\tconst value =\n\t\t\tinlineValue !== undefined\n\t\t\t\t? inlineValue\n\t\t\t\t: next && !next.startsWith(\"--\")\n\t\t\t\t\t? next\n\t\t\t\t\t: true;\n\t\tif (inlineValue === undefined && value !== true) {\n\t\t\tindex += 1;\n\t\t}\n\t\tconst values = flags.get(key) ?? [];\n\t\tvalues.push(value);\n\t\tflags.set(key, values);\n\t}\n\n\treturn { flags, positionals };\n}\n\nfunction getLastFlag(\n\toptions: HostedRunnerOptions,\n\tkey: string,\n): string | undefined {\n\tconst values = options.flags.get(key);\n\tconst value = values?.at(-1);\n\treturn typeof value === \"string\" ? value.trim() : undefined;\n}\n\nfunction hasFlag(options: HostedRunnerOptions, key: string): boolean {\n\treturn options.flags.has(key);\n}\n\nfunction getEnvValue(\n\tenv: NodeJS.ProcessEnv,\n\tkeys: readonly string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = env[key]?.trim();\n\t\tif (value) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction parsePort(\n\tvalue: string | undefined,\n\tlabel: string,\n): number | undefined {\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\tif (!/^\\d+$/.test(value.trim())) {\n\t\tthrow new Error(`${label} must be a TCP port between 1 and 65535`);\n\t}\n\tconst port = Number.parseInt(value, 10);\n\tif (!Number.isInteger(port) || port <= 0 || port > 65535) {\n\t\tthrow new Error(`${label} must be a TCP port between 1 and 65535`);\n\t}\n\treturn port;\n}\n\nfunction parseListen(value: string | undefined): {\n\thost?: string;\n\tport?: number;\n} {\n\tif (!value) {\n\t\treturn {};\n\t}\n\tconst trimmed = value.trim();\n\tif (/^\\d+$/.test(trimmed)) {\n\t\treturn { port: parsePort(trimmed, \"--listen\") };\n\t}\n\tconst separatorIndex = trimmed.lastIndexOf(\":\");\n\tif (separatorIndex <= 0 || separatorIndex === trimmed.length - 1) {\n\t\tthrow new Error(\"--listen must be <host:port> or <port>\");\n\t}\n\treturn {\n\t\thost: trimmed.slice(0, separatorIndex),\n\t\tport: parsePort(trimmed.slice(separatorIndex + 1), \"--listen\"),\n\t};\n}\n\nasync function resolveWorkspaceRoot(path: string | undefined): Promise<string> {\n\tif (!path) {\n\t\tthrow new Error(\n\t\t\t\"maestro hosted-runner requires --workspace-root or MAESTRO_WORKSPACE_ROOT\",\n\t\t);\n\t}\n\tconst workspaceRoot = resolve(path);\n\tconst stats = await stat(workspaceRoot);\n\tif (!stats.isDirectory()) {\n\t\tthrow new Error(`Hosted runner workspace root is not a directory: ${path}`);\n\t}\n\treturn realpath(workspaceRoot);\n}\n\nfunction resolveSnapshotRoot(\n\tpath: string | undefined,\n\tworkspaceRoot: string,\n): string {\n\tif (!path) {\n\t\treturn resolve(workspaceRoot, \".maestro\", \"runner-snapshots\");\n\t}\n\treturn resolve(workspaceRoot, path);\n}\n\nexport function formatHostedRunnerUsage(): string {\n\treturn HOSTED_RUNNER_USAGE;\n}\n\nexport async function resolveHostedRunnerConfig(\n\targs: readonly string[],\n\tenv: NodeJS.ProcessEnv = process.env,\n\toptions: HostedRunnerResolveOptions = {},\n): Promise<HostedRunnerConfig> {\n\tconst parsed = parseHostedRunnerOptions(args);\n\tif (parsed.positionals.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Unexpected hosted-runner argument: ${parsed.positionals[0]}`,\n\t\t);\n\t}\n\n\tconst runnerSessionId =\n\t\tgetLastFlag(parsed, \"runner-session-id\") ??\n\t\tgetEnvValue(env, [\"MAESTRO_RUNNER_SESSION_ID\", \"REMOTE_RUNNER_SESSION_ID\"]);\n\tif (!runnerSessionId) {\n\t\tthrow new Error(\n\t\t\t\"maestro hosted-runner requires --runner-session-id or MAESTRO_RUNNER_SESSION_ID\",\n\t\t);\n\t}\n\n\tconst listen = parseListen(\n\t\tgetLastFlag(parsed, \"listen\") ?? env.MAESTRO_HOSTED_RUNNER_LISTEN,\n\t);\n\tconst port =\n\t\tlisten.port ??\n\t\tparsePort(getLastFlag(parsed, \"port\"), \"--port\") ??\n\t\tparsePort(env.MAESTRO_HOSTED_RUNNER_PORT, \"MAESTRO_HOSTED_RUNNER_PORT\") ??\n\t\tparsePort(env.PORT, \"PORT\") ??\n\t\toptions.defaultPort ??\n\t\t8080;\n\tconst workspaceRoot = await resolveWorkspaceRoot(\n\t\tgetLastFlag(parsed, \"workspace-root\") ??\n\t\t\tgetEnvValue(env, [\"MAESTRO_WORKSPACE_ROOT\", \"WORKSPACE_ROOT\"]),\n\t);\n\n\treturn {\n\t\trunnerSessionId,\n\t\townerInstanceId:\n\t\t\tgetLastFlag(parsed, \"owner-instance-id\") ??\n\t\t\tgetEnvValue(env, [\n\t\t\t\t\"MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID\",\n\t\t\t\t\"REMOTE_RUNNER_OWNER_INSTANCE_ID\",\n\t\t\t]),\n\t\tworkspaceRoot,\n\t\tsnapshotRoot: resolveSnapshotRoot(\n\t\t\tgetLastFlag(parsed, \"snapshot-root\") ??\n\t\t\t\tgetEnvValue(env, [\n\t\t\t\t\t\"MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT\",\n\t\t\t\t\t\"REMOTE_RUNNER_SNAPSHOT_ROOT\",\n\t\t\t\t]),\n\t\t\tworkspaceRoot,\n\t\t),\n\t\thost:\n\t\t\tlisten.host ??\n\t\t\tgetLastFlag(parsed, \"host\") ??\n\t\t\tenv.MAESTRO_HOSTED_RUNNER_HOST,\n\t\tport,\n\t\tworkspaceId:\n\t\t\tgetLastFlag(parsed, \"workspace-id\") ??\n\t\t\tgetEnvValue(env, [\n\t\t\t\t\"MAESTRO_REMOTE_RUNNER_WORKSPACE_ID\",\n\t\t\t\t\"MAESTRO_WORKSPACE_ID\",\n\t\t\t]),\n\t\tagentId:\n\t\t\tgetLastFlag(parsed, \"agent-id\") ??\n\t\t\tgetEnvValue(env, [\"MAESTRO_REMOTE_RUNNER_AGENT_ID\", \"MAESTRO_AGENT_ID\"]),\n\t\tagentRunId: getLastFlag(parsed, \"agent-run-id\") ?? env.MAESTRO_AGENT_RUN_ID,\n\t\tmaestroSessionId:\n\t\t\tgetLastFlag(parsed, \"maestro-session-id\") ?? env.MAESTRO_SESSION_ID,\n\t\tattachAudience:\n\t\t\tgetLastFlag(parsed, \"attach-audience\") ?? env.MAESTRO_ATTACH_AUDIENCE,\n\t};\n}\n\nexport function applyHostedRunnerEnvironment(config: HostedRunnerConfig): void {\n\tprocess.env.MAESTRO_HOSTED_RUNNER_MODE = \"1\";\n\tprocess.env.MAESTRO_RUNNER_SESSION_ID = config.runnerSessionId;\n\tprocess.env.MAESTRO_WORKSPACE_ROOT = config.workspaceRoot;\n\tprocess.env.MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT = config.snapshotRoot;\n\tif (config.ownerInstanceId) {\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID =\n\t\t\tconfig.ownerInstanceId;\n\t\tprocess.env.REMOTE_RUNNER_OWNER_INSTANCE_ID = config.ownerInstanceId;\n\t}\n\tprocess.env.MAESTRO_PROFILE ??= \"hosted-runner\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_KEY ??= \"1\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_REDIS ??= \"0\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_CSRF ??= \"0\";\n\tprocess.env.MAESTRO_AGENT_DIR ??= resolve(\n\t\tconfig.workspaceRoot,\n\t\t\".maestro\",\n\t\t\"agent\",\n\t);\n\tif (config.workspaceId) {\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_WORKSPACE_ID = config.workspaceId;\n\t}\n\tif (config.agentRunId) {\n\t\tprocess.env.MAESTRO_AGENT_RUN_ID = config.agentRunId;\n\t}\n\tif (config.agentId) {\n\t\tprocess.env.MAESTRO_AGENT_ID = config.agentId;\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_AGENT_ID = config.agentId;\n\t}\n\tif (config.maestroSessionId) {\n\t\tprocess.env.MAESTRO_SESSION_ID = config.maestroSessionId;\n\t}\n\tif (config.attachAudience) {\n\t\tprocess.env.MAESTRO_ATTACH_AUDIENCE = config.attachAudience;\n\t}\n\tprocess.chdir(config.workspaceRoot);\n}\n\nexport function toHostedRunnerContext(\n\tconfig: HostedRunnerConfig,\n): HostedRunnerContext {\n\treturn {\n\t\tenabled: true,\n\t\trunnerSessionId: config.runnerSessionId,\n\t\townerInstanceId: config.ownerInstanceId,\n\t\tworkspaceRoot: config.workspaceRoot,\n\t\tsnapshotRoot: config.snapshotRoot,\n\t\tlistenHost: config.host,\n\t\tlistenPort: config.port,\n\t\tworkspaceId: config.workspaceId,\n\t\tagentId: config.agentId,\n\t\tagentRunId: config.agentRunId,\n\t\tattachAudience: config.attachAudience,\n\t\tconfiguredMaestroSessionId: config.maestroSessionId,\n\t\tactiveMaestroSessionId: config.maestroSessionId,\n\t};\n}\n\nexport async function handleHostedRunnerCommand(\n\targs: readonly string[],\n\toptions: HostedRunnerResolveOptions = {},\n): Promise<void> {\n\tconst parsed = parseHostedRunnerOptions(args);\n\tif (hasFlag(parsed, \"help\")) {\n\t\tconsole.log(formatHostedRunnerUsage());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst config = await resolveHostedRunnerConfig(args, process.env, options);\n\t\tapplyHostedRunnerEnvironment(config);\n\t\tconst { startWebServer } = await import(\"../../web-server.js\");\n\t\tawait startWebServer(config.port, {\n\t\t\thost: config.host,\n\t\t\thostedRunner: toHostedRunnerContext(config),\n\t\t});\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(message));\n\t\tprocess.exit(1);\n\t}\n}\n"]}
1
+ {"version":3,"file":"hosted-runner.js","sourceRoot":"","sources":["../../../src/cli/commands/hosted-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AA6B1B,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;0BA0BF,CAAC;AAE3B,SAAS,wBAAwB,CAChC,IAAuB;IAEvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;IACzD,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,SAAS;QACV,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAClB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM;QACP,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,SAAS;QACV,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,WAAW,GAChB,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GACV,WAAW,KAAK,SAAS;YACxB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CAAC;QACV,IAAI,WAAW,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CACnB,OAA4B,EAC5B,GAAW;IAEX,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,SAAS,OAAO,CAAC,OAA4B,EAAE,GAAW;IACzD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CACnB,GAAsB,EACtB,IAAuB;IAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CACjB,KAAyB,EACzB,KAAa;IAEb,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAI7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO;QACN,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QACtC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;KAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAwB;IAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACd,2EAA2E,CAC3E,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAC3B,IAAwB,EACxB,aAAqB;IAErB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,0BAA0B,CAClC,IAAwB,EACxB,aAAqB;IAErB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,4BAA4B,CAC1C,IAAwB;IAExB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAElD,CAAC;IACF,MAAM,SAAS,GACd,OAAO,GAAG,CAAC,kBAAkB,KAAK,QAAQ;QACzC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;QAC/B,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,SAAS,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACtC,OAAO,mBAAmB,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG,EACpC,UAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACd,sCAAsC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAC7D,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GACpB,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;QACxC,WAAW,CAAC,GAAG,EAAE,CAAC,2BAA2B,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACd,iFAAiF,CACjF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CACzB,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,4BAA4B,CACjE,CAAC;IACF,MAAM,IAAI,GACT,MAAM,CAAC,IAAI;QACX,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;QAChD,SAAS,CAAC,GAAG,CAAC,0BAA0B,EAAE,4BAA4B,CAAC;QACvE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,WAAW;QACnB,IAAI,CAAC;IACN,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC/C,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC;QACpC,WAAW,CAAC,GAAG,EAAE,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAAC,CAC/D,CAAC;IACF,MAAM,mBAAmB,GAAG,0BAA0B,CACrD,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC;QACtC,WAAW,CAAC,GAAG,EAAE;YAChB,wCAAwC;YACxC,gCAAgC;SAChC,CAAC,EACH,aAAa,CACb,CAAC;IACF,MAAM,wBAAwB,GAC7B,MAAM,4BAA4B,CAAC,mBAAmB,CAAC,CAAC;IAEzD,OAAO;QACN,eAAe;QACf,eAAe,EACd,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;YACxC,WAAW,CAAC,GAAG,EAAE;gBAChB,yCAAyC;gBACzC,iCAAiC;aACjC,CAAC;QACH,aAAa;QACb,YAAY,EAAE,mBAAmB,CAChC,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC;YACnC,WAAW,CAAC,GAAG,EAAE;gBAChB,qCAAqC;gBACrC,6BAA6B;aAC7B,CAAC,EACH,aAAa,CACb;QACD,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,EACH,MAAM,CAAC,IAAI;YACX,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;YAC3B,GAAG,CAAC,0BAA0B;QAC/B,IAAI;QACJ,WAAW,EACV,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;YACnC,WAAW,CAAC,GAAG,EAAE;gBAChB,oCAAoC;gBACpC,sBAAsB;aACtB,CAAC;QACH,OAAO,EACN,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC;YAC/B,WAAW,CAAC,GAAG,EAAE,CAAC,gCAAgC,EAAE,kBAAkB,CAAC,CAAC;QACzE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,GAAG,CAAC,oBAAoB;QAC3E,gBAAgB,EACf,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC;YACzC,GAAG,CAAC,kBAAkB;YACtB,wBAAwB;QACzB,cAAc,EACb,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,GAAG,CAAC,uBAAuB;KACtE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAA0B;IACtE,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,GAAG,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,MAAM,CAAC,eAAe,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,aAAa,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,mCAAmC,GAAG,MAAM,CAAC,YAAY,CAAC;IACtE,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sCAAsC;YACjD,MAAM,CAAC,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,uCAAuC;YAClD,MAAM,CAAC,eAAe,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,MAAM,CAAC,eAAe,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,eAAe,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,OAAO,CACxC,MAAM,CAAC,aAAa,EACpB,UAAU,EACV,OAAO,CACP,CAAC;IACF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kCAAkC,GAAG,MAAM,CAAC,WAAW,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7D,CAAC;IACD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,MAAM,CAAC,cAAc,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,MAA0B;IAE1B,OAAO;QACN,OAAO,EAAE,IAAI;QACb,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,0BAA0B,EAAE,MAAM,CAAC,gBAAgB;QACnD,sBAAsB,EAAE,MAAM,CAAC,gBAAgB;KAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,IAAuB,EACvB,UAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3E,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC/D,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,YAAY,EAAE,qBAAqB,CAAC,MAAM,CAAC;SAC3C,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC","sourcesContent":["import { readFile, realpath, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport type { HostedRunnerContext } from \"../../server/app-context.js\";\n\ntype HostedRunnerFlagValue = true | string;\n\ninterface HostedRunnerOptions {\n\tflags: Map<string, HostedRunnerFlagValue[]>;\n\tpositionals: string[];\n}\n\nexport interface HostedRunnerConfig {\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot: string;\n\trestoreManifestPath?: string;\n\thost?: string;\n\tport: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tmaestroSessionId?: string;\n\tattachAudience?: string;\n}\n\ninterface HostedRunnerResolveOptions {\n\tdefaultPort?: number;\n}\n\nconst HOSTED_RUNNER_USAGE = `maestro hosted-runner [options]\n\nOptions:\n --runner-session-id <id> Platform remote-runner session id (required)\n --owner-instance-id <id> Platform runtime owner generation for attach fencing\n --workspace-root <path> Workspace root mounted into the runtime pod (required)\n --snapshot-root <path> Directory for drain snapshot manifests\n --restore-manifest <path> Restore runtime state from a prior drain manifest\n --listen <host:port> Address to bind, for example 0.0.0.0:8080\n --host <host> Bind host when --listen is not used\n --port <port> Bind port when --listen is not used\n --workspace-id <id> EvalOps workspace id for metadata\n --agent-id <id> Platform agent-registry agent id for metadata\n --agent-run-id <id> Platform AgentRun id for metadata\n --maestro-session-id <id> Existing Maestro session id for metadata\n --attach-audience <aud> Expected attach audience metadata\n --help Show this help\n\nEnvironment:\n MAESTRO_RUNNER_SESSION_ID, REMOTE_RUNNER_SESSION_ID\n MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID, REMOTE_RUNNER_OWNER_INSTANCE_ID\n MAESTRO_WORKSPACE_ROOT\n MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT, REMOTE_RUNNER_SNAPSHOT_ROOT\n MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST, REMOTE_RUNNER_RESTORE_MANIFEST\n MAESTRO_HOSTED_RUNNER_LISTEN, MAESTRO_HOSTED_RUNNER_HOST, MAESTRO_HOSTED_RUNNER_PORT, PORT\n MAESTRO_REMOTE_RUNNER_WORKSPACE_ID, MAESTRO_AGENT_ID, MAESTRO_AGENT_RUN_ID, MAESTRO_SESSION_ID\n MAESTRO_ATTACH_AUDIENCE`;\n\nfunction parseHostedRunnerOptions(\n\targs: readonly string[],\n): HostedRunnerOptions {\n\tconst flags = new Map<string, HostedRunnerFlagValue[]>();\n\tconst positionals: string[] = [];\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpositionals.push(...args.slice(index + 1));\n\t\t\tbreak;\n\t\t}\n\t\tif (!arg.startsWith(\"--\")) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tconst equalsIndex = arg.indexOf(\"=\");\n\t\tconst key = equalsIndex >= 0 ? arg.slice(2, equalsIndex) : arg.slice(2);\n\t\tconst inlineValue =\n\t\t\tequalsIndex >= 0 ? arg.slice(equalsIndex + 1) : undefined;\n\t\tconst next = args[index + 1];\n\t\tconst value =\n\t\t\tinlineValue !== undefined\n\t\t\t\t? inlineValue\n\t\t\t\t: next && !next.startsWith(\"--\")\n\t\t\t\t\t? next\n\t\t\t\t\t: true;\n\t\tif (inlineValue === undefined && value !== true) {\n\t\t\tindex += 1;\n\t\t}\n\t\tconst values = flags.get(key) ?? [];\n\t\tvalues.push(value);\n\t\tflags.set(key, values);\n\t}\n\n\treturn { flags, positionals };\n}\n\nfunction getLastFlag(\n\toptions: HostedRunnerOptions,\n\tkey: string,\n): string | undefined {\n\tconst values = options.flags.get(key);\n\tconst value = values?.at(-1);\n\treturn typeof value === \"string\" ? value.trim() : undefined;\n}\n\nfunction hasFlag(options: HostedRunnerOptions, key: string): boolean {\n\treturn options.flags.has(key);\n}\n\nfunction getEnvValue(\n\tenv: NodeJS.ProcessEnv,\n\tkeys: readonly string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = env[key]?.trim();\n\t\tif (value) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction parsePort(\n\tvalue: string | undefined,\n\tlabel: string,\n): number | undefined {\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\tif (!/^\\d+$/.test(value.trim())) {\n\t\tthrow new Error(`${label} must be a TCP port between 1 and 65535`);\n\t}\n\tconst port = Number.parseInt(value, 10);\n\tif (!Number.isInteger(port) || port <= 0 || port > 65535) {\n\t\tthrow new Error(`${label} must be a TCP port between 1 and 65535`);\n\t}\n\treturn port;\n}\n\nfunction parseListen(value: string | undefined): {\n\thost?: string;\n\tport?: number;\n} {\n\tif (!value) {\n\t\treturn {};\n\t}\n\tconst trimmed = value.trim();\n\tif (/^\\d+$/.test(trimmed)) {\n\t\treturn { port: parsePort(trimmed, \"--listen\") };\n\t}\n\tconst separatorIndex = trimmed.lastIndexOf(\":\");\n\tif (separatorIndex <= 0 || separatorIndex === trimmed.length - 1) {\n\t\tthrow new Error(\"--listen must be <host:port> or <port>\");\n\t}\n\treturn {\n\t\thost: trimmed.slice(0, separatorIndex),\n\t\tport: parsePort(trimmed.slice(separatorIndex + 1), \"--listen\"),\n\t};\n}\n\nasync function resolveWorkspaceRoot(path: string | undefined): Promise<string> {\n\tif (!path) {\n\t\tthrow new Error(\n\t\t\t\"maestro hosted-runner requires --workspace-root or MAESTRO_WORKSPACE_ROOT\",\n\t\t);\n\t}\n\tconst workspaceRoot = resolve(path);\n\tconst stats = await stat(workspaceRoot);\n\tif (!stats.isDirectory()) {\n\t\tthrow new Error(`Hosted runner workspace root is not a directory: ${path}`);\n\t}\n\treturn realpath(workspaceRoot);\n}\n\nfunction resolveSnapshotRoot(\n\tpath: string | undefined,\n\tworkspaceRoot: string,\n): string {\n\tif (!path) {\n\t\treturn resolve(workspaceRoot, \".maestro\", \"runner-snapshots\");\n\t}\n\treturn resolve(workspaceRoot, path);\n}\n\nfunction resolveRestoreManifestPath(\n\tpath: string | undefined,\n\tworkspaceRoot: string,\n): string | undefined {\n\treturn path ? resolve(workspaceRoot, path) : undefined;\n}\n\nasync function readRestoreManifestSessionId(\n\tpath: string | undefined,\n): Promise<string | undefined> {\n\tif (!path) {\n\t\treturn undefined;\n\t}\n\tconst raw = JSON.parse(await readFile(path, \"utf8\")) as {\n\t\tmaestro_session_id?: unknown;\n\t};\n\tconst sessionId =\n\t\ttypeof raw.maestro_session_id === \"string\"\n\t\t\t? raw.maestro_session_id.trim()\n\t\t\t: \"\";\n\treturn sessionId || undefined;\n}\n\nexport function formatHostedRunnerUsage(): string {\n\treturn HOSTED_RUNNER_USAGE;\n}\n\nexport async function resolveHostedRunnerConfig(\n\targs: readonly string[],\n\tenv: NodeJS.ProcessEnv = process.env,\n\toptions: HostedRunnerResolveOptions = {},\n): Promise<HostedRunnerConfig> {\n\tconst parsed = parseHostedRunnerOptions(args);\n\tif (parsed.positionals.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Unexpected hosted-runner argument: ${parsed.positionals[0]}`,\n\t\t);\n\t}\n\n\tconst runnerSessionId =\n\t\tgetLastFlag(parsed, \"runner-session-id\") ??\n\t\tgetEnvValue(env, [\"MAESTRO_RUNNER_SESSION_ID\", \"REMOTE_RUNNER_SESSION_ID\"]);\n\tif (!runnerSessionId) {\n\t\tthrow new Error(\n\t\t\t\"maestro hosted-runner requires --runner-session-id or MAESTRO_RUNNER_SESSION_ID\",\n\t\t);\n\t}\n\n\tconst listen = parseListen(\n\t\tgetLastFlag(parsed, \"listen\") ?? env.MAESTRO_HOSTED_RUNNER_LISTEN,\n\t);\n\tconst port =\n\t\tlisten.port ??\n\t\tparsePort(getLastFlag(parsed, \"port\"), \"--port\") ??\n\t\tparsePort(env.MAESTRO_HOSTED_RUNNER_PORT, \"MAESTRO_HOSTED_RUNNER_PORT\") ??\n\t\tparsePort(env.PORT, \"PORT\") ??\n\t\toptions.defaultPort ??\n\t\t8080;\n\tconst workspaceRoot = await resolveWorkspaceRoot(\n\t\tgetLastFlag(parsed, \"workspace-root\") ??\n\t\t\tgetEnvValue(env, [\"MAESTRO_WORKSPACE_ROOT\", \"WORKSPACE_ROOT\"]),\n\t);\n\tconst restoreManifestPath = resolveRestoreManifestPath(\n\t\tgetLastFlag(parsed, \"restore-manifest\") ??\n\t\t\tgetEnvValue(env, [\n\t\t\t\t\"MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST\",\n\t\t\t\t\"REMOTE_RUNNER_RESTORE_MANIFEST\",\n\t\t\t]),\n\t\tworkspaceRoot,\n\t);\n\tconst restoreManifestSessionId =\n\t\tawait readRestoreManifestSessionId(restoreManifestPath);\n\n\treturn {\n\t\trunnerSessionId,\n\t\townerInstanceId:\n\t\t\tgetLastFlag(parsed, \"owner-instance-id\") ??\n\t\t\tgetEnvValue(env, [\n\t\t\t\t\"MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID\",\n\t\t\t\t\"REMOTE_RUNNER_OWNER_INSTANCE_ID\",\n\t\t\t]),\n\t\tworkspaceRoot,\n\t\tsnapshotRoot: resolveSnapshotRoot(\n\t\t\tgetLastFlag(parsed, \"snapshot-root\") ??\n\t\t\t\tgetEnvValue(env, [\n\t\t\t\t\t\"MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT\",\n\t\t\t\t\t\"REMOTE_RUNNER_SNAPSHOT_ROOT\",\n\t\t\t\t]),\n\t\t\tworkspaceRoot,\n\t\t),\n\t\t...(restoreManifestPath ? { restoreManifestPath } : {}),\n\t\thost:\n\t\t\tlisten.host ??\n\t\t\tgetLastFlag(parsed, \"host\") ??\n\t\t\tenv.MAESTRO_HOSTED_RUNNER_HOST,\n\t\tport,\n\t\tworkspaceId:\n\t\t\tgetLastFlag(parsed, \"workspace-id\") ??\n\t\t\tgetEnvValue(env, [\n\t\t\t\t\"MAESTRO_REMOTE_RUNNER_WORKSPACE_ID\",\n\t\t\t\t\"MAESTRO_WORKSPACE_ID\",\n\t\t\t]),\n\t\tagentId:\n\t\t\tgetLastFlag(parsed, \"agent-id\") ??\n\t\t\tgetEnvValue(env, [\"MAESTRO_REMOTE_RUNNER_AGENT_ID\", \"MAESTRO_AGENT_ID\"]),\n\t\tagentRunId: getLastFlag(parsed, \"agent-run-id\") ?? env.MAESTRO_AGENT_RUN_ID,\n\t\tmaestroSessionId:\n\t\t\tgetLastFlag(parsed, \"maestro-session-id\") ??\n\t\t\tenv.MAESTRO_SESSION_ID ??\n\t\t\trestoreManifestSessionId,\n\t\tattachAudience:\n\t\t\tgetLastFlag(parsed, \"attach-audience\") ?? env.MAESTRO_ATTACH_AUDIENCE,\n\t};\n}\n\nexport function applyHostedRunnerEnvironment(config: HostedRunnerConfig): void {\n\tprocess.env.MAESTRO_HOSTED_RUNNER_MODE = \"1\";\n\tprocess.env.MAESTRO_RUNNER_SESSION_ID = config.runnerSessionId;\n\tprocess.env.MAESTRO_WORKSPACE_ROOT = config.workspaceRoot;\n\tprocess.env.MAESTRO_REMOTE_RUNNER_SNAPSHOT_ROOT = config.snapshotRoot;\n\tif (config.restoreManifestPath) {\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST =\n\t\t\tconfig.restoreManifestPath;\n\t}\n\tif (config.ownerInstanceId) {\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_OWNER_INSTANCE_ID =\n\t\t\tconfig.ownerInstanceId;\n\t\tprocess.env.REMOTE_RUNNER_OWNER_INSTANCE_ID = config.ownerInstanceId;\n\t}\n\tprocess.env.MAESTRO_PROFILE ??= \"hosted-runner\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_KEY ??= \"1\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_REDIS ??= \"0\";\n\tprocess.env.MAESTRO_WEB_REQUIRE_CSRF ??= \"0\";\n\tprocess.env.MAESTRO_AGENT_DIR ??= resolve(\n\t\tconfig.workspaceRoot,\n\t\t\".maestro\",\n\t\t\"agent\",\n\t);\n\tif (config.workspaceId) {\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_WORKSPACE_ID = config.workspaceId;\n\t}\n\tif (config.agentRunId) {\n\t\tprocess.env.MAESTRO_AGENT_RUN_ID = config.agentRunId;\n\t}\n\tif (config.agentId) {\n\t\tprocess.env.MAESTRO_AGENT_ID = config.agentId;\n\t\tprocess.env.MAESTRO_REMOTE_RUNNER_AGENT_ID = config.agentId;\n\t}\n\tif (config.maestroSessionId) {\n\t\tprocess.env.MAESTRO_SESSION_ID = config.maestroSessionId;\n\t}\n\tif (config.attachAudience) {\n\t\tprocess.env.MAESTRO_ATTACH_AUDIENCE = config.attachAudience;\n\t}\n\tprocess.chdir(config.workspaceRoot);\n}\n\nexport function toHostedRunnerContext(\n\tconfig: HostedRunnerConfig,\n): HostedRunnerContext {\n\treturn {\n\t\tenabled: true,\n\t\trunnerSessionId: config.runnerSessionId,\n\t\townerInstanceId: config.ownerInstanceId,\n\t\tworkspaceRoot: config.workspaceRoot,\n\t\tsnapshotRoot: config.snapshotRoot,\n\t\trestoreManifestPath: config.restoreManifestPath,\n\t\tlistenHost: config.host,\n\t\tlistenPort: config.port,\n\t\tworkspaceId: config.workspaceId,\n\t\tagentId: config.agentId,\n\t\tagentRunId: config.agentRunId,\n\t\tattachAudience: config.attachAudience,\n\t\tconfiguredMaestroSessionId: config.maestroSessionId,\n\t\tactiveMaestroSessionId: config.maestroSessionId,\n\t};\n}\n\nexport async function handleHostedRunnerCommand(\n\targs: readonly string[],\n\toptions: HostedRunnerResolveOptions = {},\n): Promise<void> {\n\tconst parsed = parseHostedRunnerOptions(args);\n\tif (hasFlag(parsed, \"help\")) {\n\t\tconsole.log(formatHostedRunnerUsage());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst config = await resolveHostedRunnerConfig(args, process.env, options);\n\t\tapplyHostedRunnerEnvironment(config);\n\t\tconst { startWebServer } = await import(\"../../web-server.js\");\n\t\tawait startWebServer(config.port, {\n\t\t\thost: config.host,\n\t\t\thostedRunner: toHostedRunnerContext(config),\n\t\t});\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.error(chalk.red(message));\n\t\tprocess.exit(1);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,wBAAwB,EAE7B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACN,KAAK,+BAA+B,EAEpC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACN,KAAK,2BAA2B,EAEhC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACN,KAAK,0BAA0B,EAG/B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACN,KAAK,qBAAqB,EAE1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAK5E,QAAA,MAAM,yBAAyB,0CAA0C,CAAC;AAW1E,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAGvE,UAAU,iBAAiB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,0BAA0B;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,UAAU,sBAAsB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,oBAAoB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAChC,aAAa,EAAE,OAAO,yBAAyB,CAAC;IAChD,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,0BAA0B,CAAC;IACnC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,aAAa,EAAE,oBAAoB,CAAC;IACpC,eAAe,EAAE,sBAAsB,CAAC;IACxC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,qBAAqB,CAAC;IAClC,gBAAgB,EAAE,2BAA2B,CAAC;IAC9C,eAAe,EAAE,0BAA0B,CAAC;IAC5C,oBAAoB,EAAE,+BAA+B,CAAC;IACtD,kBAAkB,EAAE,wBAAwB,CAAC;CAC7C;AAkMD,iBAAe,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAoFzC;AAoCD,iBAAS,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAsBxE;AAED,wBAAsB,gBAAgB,CACrC,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED,eAAO,MAAM,OAAO;;;CAGnB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import chalk from "chalk";
2
2
  import { parseMcpToolName } from "../../mcp/names.js";
3
3
  import { buildAgentRuntimeLedgerReport, } from "../../server/agent-runtime-ledger.js";
4
4
  import { buildAgentTrajectoryInspectionReport, } from "../../server/agent-trajectory-inspection.js";
5
+ import { DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES } from "../../server/agent-trajectory-replay-lab.js";
5
6
  import { replayAgentTrajectoryReport, } from "../../server/agent-trajectory-replay.js";
6
7
  import { scoreAgentTrajectoryReport, } from "../../server/agent-trajectory-scorers.js";
7
8
  import { buildAgentTrajectoryReport, } from "../../server/agent-trajectory.js";
@@ -9,14 +10,6 @@ import { buildComposerRunTimeline } from "../../server/session-timeline.js";
9
10
  import { SessionManager } from "../../session/manager.js";
10
11
  import { migrateToCurrentVersion } from "../../session/migration.js";
11
12
  const RUN_RECONSTRUCTION_SCHEMA = "evalops.maestro.run-reconstruction.v1";
12
- const RUN_INSPECT_TRAJECTORY_RULES = [
13
- {
14
- id: "final-event-has-evidence",
15
- severity: "error",
16
- description: "The final answer or runtime terminal event must have evidence.",
17
- finalEvidenceCoverage: true,
18
- },
19
- ];
20
13
  function usage() {
21
14
  return "Usage: maestro run inspect|ledger|replay|promote <session-id> [--json]";
22
15
  }
@@ -206,7 +199,7 @@ async function buildRunReconstructionReport(sessionId, options = {}) {
206
199
  });
207
200
  const trajectory = buildAgentTrajectoryReport(timeline);
208
201
  const trajectoryReplay = replayAgentTrajectoryReport(trajectory);
209
- const trajectoryScore = scoreAgentTrajectoryReport(trajectory, RUN_INSPECT_TRAJECTORY_RULES);
202
+ const trajectoryScore = scoreAgentTrajectoryReport(trajectory, DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES);
210
203
  const trajectoryInspection = buildAgentTrajectoryInspectionReport({
211
204
  timelineItems: timeline.items,
212
205
  trajectory,
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAEN,6BAA6B,GAC7B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEN,oCAAoC,GACpC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEN,2BAA2B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAGN,0BAA0B,GAC1B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAEN,0BAA0B,GAC1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,MAAM,yBAAyB,GAAG,uCAAuC,CAAC;AAC1E,MAAM,4BAA4B,GAAgC;IACjE;QACC,EAAE,EAAE,0BAA0B;QAC9B,QAAQ,EAAE,OAAO;QACjB,WAAW,EACV,gEAAgE;QACjE,qBAAqB,EAAE,IAAI;KAC3B;CACD,CAAC;AAiFF,SAAS,KAAK;IACb,OAAO,wEAAwE,CAAC;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,OAAuB;IAC1C,OAAO,OAAO,CAAC,IAAI,CAClB,CAAC,KAAK,EAA+B,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAChE,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC5B,MAAsC,EACtC,QAA6B;IAE7B,MAAM,QAAQ,GAAG,MAAM,EAAE,qBAAqB,CAAC;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAC3B,QAA8C,EAAE,OAAO,CACxD;QACA,CAAC,CAAC,CAAE,QAAmC,CAAC,OAAO,IAAI,EAAE,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IACN,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,MAAM,UAAU,GAAI,KAAkC,CAAC,UAAU,CAAC;QAClE,MAAM,YAAY,GAAI,KAAoC,CAAC,YAAY,CAAC;QACxE,IACC,IAAI,KAAK,aAAa;YACtB,UAAU,KAAK,SAAS;YACxB,UAAU,KAAK,QAAQ,EACtB,CAAC;YACF,WAAW,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,YAAY,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YACnE,MAAM,UAAU,GACd,KAAkC,CAAC,UAAU;gBAC7C,KAAkC,CAAC,UAAU;gBAC7C,KAAkC,CAAC,UAAU;gBAC7C,KAA0B,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,GAAG,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;IACF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IACD,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,WAAW;QACX,UAAU,EAAE,UAAU,CAAC,IAAI;KAC3B,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC9B,MAAsC,EACtC,QAA6B,EAC7B,aAAmC;IAEnC,MAAM,QAAQ,GAAG,MAAM,EAAE,sBAAsB,CAAC;IAChD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC7C,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,WAAW,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,YAAY,IAAI,CAAC,CAAC;YAClB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,UAAU,IAAI,CAAC,CAAC;YAChB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IAED,MAAM,OAAO,GAA2B;QACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,OAAO;QAC1D,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW;QAC/D,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU;QACjE,YAAY;QACZ,UAAU;QACV,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC;QAC9C,MAAM;QACN,QAAQ;QACR,QAAQ;KACR,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;QACnD,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACnC,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC3B,OAAO,CAAC,mBAAmB,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;QAC7D,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,CAAC,kBAAkB,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5D,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,GAA2B,EAAE,GAAY;IAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACxD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CACrB,QAA6B;IAE7B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO;QACN,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QACpC,MAAM;QACN,QAAQ;QACR,YAAY;KACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACrB,MAAkC,EAClC,aAAmC,EACnC,eAAuC;IAEvC,OAAO;QACN,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACtD,kBAAkB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACjE,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACxD,WAAW,EACV,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACF,eAAe,EAAE,eAAe,CAAC,eAAe,KAAK,SAAS;QAC9D,kBAAkB,EAAE,eAAe,CAAC,WAAW,GAAG,CAAC;QACnD,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACrD,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACtD,eAAe,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QAC5D,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACzD,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QAC3D,eAAe,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACzD,UAAU,EAAE,eAAe,CAAC,UAAU,GAAG,CAAC,IAAI,aAAa,CAAC,UAAU,GAAG,CAAC;KAC1E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAC1C,SAAiB,EACjB,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE;QACpD,UAAU,EAAE,OAAO,CAAC,UAAU;KAC9B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;QAC9B,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;KAC9B,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACzC,SAAS;QACT,OAAO;QACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,0BAA0B,CACjD,UAAU,EACV,4BAA4B,CAC5B,CAAC;IACF,MAAM,oBAAoB,GAAG,oCAAoC,CAAC;QACjE,aAAa,EAAE,QAAQ,CAAC,KAAK;QAC7B,UAAU;QACV,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,eAAe;KACtB,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;QACxD,OAAO,EAAE;YACR,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,WAAW;YACX,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD;QACD,QAAQ;QACR,UAAU;QACV,MAAM,EAAE,gBAAgB;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,aAAa,GAAuC;QACzD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW;KACX,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,aAAa,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;QACjB,aAAa,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IAChC,CAAC;IACD,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;QACnB,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,CAAC;IAED,OAAO;QACN,aAAa,EAAE,yBAAyB;QACxC,OAAO,EAAE,aAAa;QACtB,MAAM;QACN,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC;QACzD,aAAa,EAAE,OAAO;QACtB,eAAe;QACf,QAAQ;QACR,UAAU;QACV,gBAAgB;QAChB,eAAe;QACf,oBAAoB;QACpB,kBAAkB;KAClB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgC;IACvD,MAAM,MAAM,GAAkD;QAC7D,CAAC,cAAc,EAAE,eAAe,CAAC;QACjC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;QAC7C,CAAC,cAAc,EAAE,eAAe,CAAC;QACjC,CAAC,aAAa,EAAE,cAAc,CAAC;QAC/B,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;QACvC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;QAC7C,CAAC,aAAa,EAAE,cAAc,CAAC;QAC/B,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;QACvC,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,iBAAiB,EAAE,eAAe,CAAC;QACpC,CAAC,YAAY,EAAE,aAAa,CAAC;KAC7B,CAAC;IACF,OAAO,MAAM;SACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,QAA6B;IAC3D,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAA6B,EAAE,EAAE;QACxE,MAAM,KAAK,GAAG;YACb,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,KAAK;YACV,IAAI,CAAC,OAAO;SACZ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA+B;IAC/D,MAAM,KAAK,GAAG;QACb,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACtD,iBAAiB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;QAC7C,aAAa,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC1C,mBAAmB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;QAChD,sBAAsB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE;QACvD,kBAAkB,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,YAAY;QAChK,qBAAqB,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,UAAU;QAC5K,eAAe,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,2CAA2C,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,OAAO,EAAE;QACvJ,wBAAwB,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,mBAAmB,kDAAkD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAClP,aAAa,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC9C,mBAAmB,MAAM,CAAC,aAAa,CAAC,OAAO,aAAa,MAAM,CAAC,aAAa,CAAC,WAAW,UAAU,MAAM,CAAC,aAAa,CAAC,UAAU,eAAe;QACpJ,qBAAqB,MAAM,CAAC,eAAe,CAAC,OAAO,aAAa,MAAM,CAAC,eAAe,CAAC,WAAW,UAAU,MAAM,CAAC,eAAe,CAAC,UAAU,iBAAiB,MAAM,CAAC,eAAe,CAAC,YAAY,eAAe,MAAM,CAAC,eAAe,CAAC,UAAU,aAAa,MAAM,CAAC,eAAe,CAAC,WAAW,eAAe;QAC/S,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAC9B,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC;KACzC,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,UAAmB,EACnB,OAAiB,EAAE,EACnB,UAA6B,EAAE;IAE/B,IACC,UAAU,KAAK,SAAS;QACxB,UAAU,KAAK,QAAQ;QACvB,UAAU,KAAK,QAAQ;QACvB,UAAU,KAAK,SAAS,EACvB,CAAC;QACF,aAAa,CAAC,0BAA0B,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,aAAa,CAAC,sBAAsB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,aAAa,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO;IACR,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO;IACR,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO;IACR,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,4BAA4B;IAC5B,uBAAuB;CACvB,CAAC","sourcesContent":["import chalk from \"chalk\";\nimport { parseMcpToolName } from \"../../mcp/names.js\";\nimport {\n\ttype AgentRuntimeLedgerReport,\n\tbuildAgentRuntimeLedgerReport,\n} from \"../../server/agent-runtime-ledger.js\";\nimport {\n\ttype AgentTrajectoryInspectionReport,\n\tbuildAgentTrajectoryInspectionReport,\n} from \"../../server/agent-trajectory-inspection.js\";\nimport {\n\ttype AgentTrajectoryReplayReport,\n\treplayAgentTrajectoryReport,\n} from \"../../server/agent-trajectory-replay.js\";\nimport {\n\ttype AgentTrajectoryScoreReport,\n\ttype AgentTrajectoryScorerRule,\n\tscoreAgentTrajectoryReport,\n} from \"../../server/agent-trajectory-scorers.js\";\nimport {\n\ttype AgentTrajectoryReport,\n\tbuildAgentTrajectoryReport,\n} from \"../../server/agent-trajectory.js\";\nimport { buildComposerRunTimeline } from \"../../server/session-timeline.js\";\nimport { SessionManager } from \"../../session/manager.js\";\nimport { migrateToCurrentVersion } from \"../../session/migration.js\";\nimport type { SessionEntry, SessionHeaderEntry } from \"../../session/types.js\";\n\nconst RUN_RECONSTRUCTION_SCHEMA = \"evalops.maestro.run-reconstruction.v1\";\nconst RUN_INSPECT_TRAJECTORY_RULES: AgentTrajectoryScorerRule[] = [\n\t{\n\t\tid: \"final-event-has-evidence\",\n\t\tseverity: \"error\",\n\t\tdescription:\n\t\t\t\"The final answer or runtime terminal event must have evidence.\",\n\t\tfinalEvidenceCoverage: true,\n\t},\n];\n\ntype ComposerRunTimeline = ReturnType<typeof buildComposerRunTimeline>;\ntype ComposerRunTimelineItem = ComposerRunTimeline[\"items\"][number];\n\ninterface RunInspectOptions {\n\tjson?: boolean;\n\tsessionDir?: string;\n}\n\ninterface ReconstructionCountSummary {\n\ttimelineItems: number;\n\tbyType: Record<string, number>;\n\tbyStatus: Record<string, number>;\n\tbyVisibility: Record<string, number>;\n}\n\ninterface ReconstructionCoverage {\n\tpromptInputs: boolean;\n\tassistantResponses: boolean;\n\ttoolRequests: boolean;\n\ttoolResults: boolean;\n\tcontextManifest: boolean;\n\tcontextDiagnostics: boolean;\n\tfileChanges: boolean;\n\tartifacts: boolean;\n\tpolicyDecisions: boolean;\n\tdiagnostics: boolean;\n\tcompactions: boolean;\n\tpendingRequests: boolean;\n\tmcpContext: boolean;\n}\n\ninterface PromptContextSummary {\n\tentries: number;\n\tprojectDocs: number;\n\tmcpServers: number;\n}\n\ninterface ContextManifestSummary {\n\tprotocolVersion?: string;\n\tversion?: number;\n\tcwd?: string;\n\tentries: number;\n\tprojectDocs: number;\n\tmcpServers: number;\n\tmcpResources: number;\n\tmcpPrompts: number;\n\tdiagnostics: number;\n\tbyKind: Record<string, number>;\n\tbySource: Record<string, number>;\n\tbyStatus: Record<string, number>;\n\tprojectDocBytesRead?: number;\n\tprojectDocMaxBytes?: number;\n}\n\ninterface RunReconstructionReport {\n\tschemaVersion: typeof RUN_RECONSTRUCTION_SCHEMA;\n\tsession: {\n\t\tid: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tsessionFile: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: ReconstructionCountSummary;\n\tcoverage: ReconstructionCoverage;\n\tpromptContext: PromptContextSummary;\n\tcontextManifest: ContextManifestSummary;\n\ttimeline: ComposerRunTimeline;\n\ttrajectory: AgentTrajectoryReport;\n\ttrajectoryReplay: AgentTrajectoryReplayReport;\n\ttrajectoryScore: AgentTrajectoryScoreReport;\n\ttrajectoryInspection: AgentTrajectoryInspectionReport;\n\tagentRuntimeLedger: AgentRuntimeLedgerReport;\n}\n\nfunction usage(): string {\n\treturn \"Usage: maestro run inspect|ledger|replay|promote <session-id> [--json]\";\n}\n\nfunction exitWithUsage(message: string): never {\n\tconsole.error(chalk.red(message));\n\tconsole.error(chalk.dim(usage()));\n\tprocess.exit(1);\n}\n\nfunction findHeader(entries: SessionEntry[]): SessionHeaderEntry | undefined {\n\treturn entries.find(\n\t\t(entry): entry is SessionHeaderEntry => entry.type === \"session\",\n\t);\n}\n\nfunction promptContextSummary(\n\theader: SessionHeaderEntry | undefined,\n\ttimeline: ComposerRunTimeline,\n): PromptContextSummary {\n\tconst manifest = header?.promptContextManifest;\n\tconst entries = Array.isArray(\n\t\t(manifest as { entries?: unknown } | undefined)?.entries,\n\t)\n\t\t? ((manifest as { entries: unknown[] }).entries ?? [])\n\t\t: [];\n\tlet projectDocs = 0;\n\tconst mcpServers = new Set<string>();\n\tfor (const entry of entries) {\n\t\tif (!entry || typeof entry !== \"object\") continue;\n\t\tconst kind = (entry as { kind?: unknown }).kind;\n\t\tconst sourceKind = (entry as { sourceKind?: unknown }).sourceKind;\n\t\tconst resourceKind = (entry as { resourceKind?: unknown }).resourceKind;\n\t\tif (\n\t\t\tkind === \"project_doc\" ||\n\t\t\tsourceKind === \"project\" ||\n\t\t\tsourceKind === \"global\"\n\t\t) {\n\t\t\tprojectDocs += 1;\n\t\t} else if (kind === \"mcp_server\" || resourceKind === \"mcp_server\") {\n\t\t\tconst serverName =\n\t\t\t\t(entry as { serverName?: unknown }).serverName ??\n\t\t\t\t(entry as { resourceId?: unknown }).resourceId ??\n\t\t\t\t(entry as { providerId?: unknown }).providerId ??\n\t\t\t\t(entry as { id?: unknown }).id;\n\t\t\tmcpServers.add(typeof serverName === \"string\" ? serverName : \"unknown\");\n\t\t}\n\t}\n\tfor (const tool of header?.tools ?? []) {\n\t\tconst mcpTool = parseMcpToolName(tool.name);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\tfor (const item of timeline.items) {\n\t\tif (!item.toolName) continue;\n\t\tconst mcpTool = parseMcpToolName(item.toolName);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\treturn {\n\t\tentries: entries.length,\n\t\tprojectDocs,\n\t\tmcpServers: mcpServers.size,\n\t};\n}\n\nfunction contextManifestSummary(\n\theader: SessionHeaderEntry | undefined,\n\ttimeline: ComposerRunTimeline,\n\tpromptContext: PromptContextSummary,\n): ContextManifestSummary {\n\tconst manifest = header?.unifiedContextManifest;\n\tconst byKind: Record<string, number> = {};\n\tconst bySource: Record<string, number> = {};\n\tconst byStatus: Record<string, number> = {};\n\tconst mcpServers = new Set<string>();\n\tlet mcpResources = 0;\n\tlet mcpPrompts = 0;\n\tlet projectDocs = 0;\n\n\tfor (const entry of manifest?.entries ?? []) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(bySource, entry.source);\n\t\tincrement(byStatus, entry.status);\n\t\tif (entry.kind === \"project_doc\") {\n\t\t\tprojectDocs += 1;\n\t\t}\n\t\tif (entry.kind === \"mcp_server\") {\n\t\t\tmcpServers.add(entry.serverName ?? entry.id);\n\t\t}\n\t\tif (entry.kind === \"mcp_resource\") {\n\t\t\tmcpResources += 1;\n\t\t\tif (entry.serverName) {\n\t\t\t\tmcpServers.add(entry.serverName);\n\t\t\t}\n\t\t}\n\t\tif (entry.kind === \"mcp_prompt\") {\n\t\t\tmcpPrompts += 1;\n\t\t\tif (entry.serverName) {\n\t\t\t\tmcpServers.add(entry.serverName);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const tool of header?.tools ?? []) {\n\t\tconst mcpTool = parseMcpToolName(tool.name);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\tfor (const item of timeline.items) {\n\t\tif (!item.toolName) continue;\n\t\tconst mcpTool = parseMcpToolName(item.toolName);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\n\tconst summary: ContextManifestSummary = {\n\t\tentries: manifest?.entries.length ?? promptContext.entries,\n\t\tprojectDocs: manifest ? projectDocs : promptContext.projectDocs,\n\t\tmcpServers: manifest ? mcpServers.size : promptContext.mcpServers,\n\t\tmcpResources,\n\t\tmcpPrompts,\n\t\tdiagnostics: manifest?.diagnostics.length ?? 0,\n\t\tbyKind,\n\t\tbySource,\n\t\tbyStatus,\n\t};\n\tif (manifest) {\n\t\tsummary.protocolVersion = manifest.protocolVersion;\n\t\tsummary.version = manifest.version;\n\t\tsummary.cwd = manifest.cwd;\n\t\tsummary.projectDocBytesRead = manifest.projectDocs.bytesRead;\n\t\tif (manifest.projectDocs.maxBytes !== undefined) {\n\t\t\tsummary.projectDocMaxBytes = manifest.projectDocs.maxBytes;\n\t\t}\n\t}\n\treturn summary;\n}\n\nfunction increment(map: Record<string, number>, key: unknown): void {\n\tif (typeof key !== \"string\" || key.length === 0) return;\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction countTimeline(\n\ttimeline: ComposerRunTimeline,\n): ReconstructionCountSummary {\n\tconst byType: Record<string, number> = {};\n\tconst byStatus: Record<string, number> = {};\n\tconst byVisibility: Record<string, number> = {};\n\tfor (const item of timeline.items) {\n\t\tincrement(byType, item.type);\n\t\tincrement(byStatus, item.status);\n\t\tincrement(byVisibility, item.visibility);\n\t}\n\treturn {\n\t\ttimelineItems: timeline.items.length,\n\t\tbyType,\n\t\tbyStatus,\n\t\tbyVisibility,\n\t};\n}\n\nfunction buildCoverage(\n\tcounts: ReconstructionCountSummary,\n\tpromptContext: PromptContextSummary,\n\tcontextManifest: ContextManifestSummary,\n): ReconstructionCoverage {\n\treturn {\n\t\tpromptInputs: (counts.byType[\"message.user\"] ?? 0) > 0,\n\t\tassistantResponses: (counts.byType[\"message.assistant\"] ?? 0) > 0,\n\t\ttoolRequests: (counts.byType[\"tool.requested\"] ?? 0) > 0,\n\t\ttoolResults:\n\t\t\t(counts.byType[\"tool.completed\"] ?? 0) +\n\t\t\t\t(counts.byType[\"tool.failed\"] ?? 0) >\n\t\t\t0,\n\t\tcontextManifest: contextManifest.protocolVersion !== undefined,\n\t\tcontextDiagnostics: contextManifest.diagnostics > 0,\n\t\tfileChanges: (counts.byType[\"file.changed\"] ?? 0) > 0,\n\t\tartifacts: (counts.byType[\"artifact.linked\"] ?? 0) > 0,\n\t\tpolicyDecisions: (counts.byType[\"policy.decision\"] ?? 0) > 0,\n\t\tdiagnostics: (counts.byType[\"diagnostic.delta\"] ?? 0) > 0,\n\t\tcompactions: (counts.byType[\"compaction.created\"] ?? 0) > 0,\n\t\tpendingRequests: (counts.byType[\"wait.pending\"] ?? 0) > 0,\n\t\tmcpContext: contextManifest.mcpServers > 0 || promptContext.mcpServers > 0,\n\t};\n}\n\nasync function buildRunReconstructionReport(\n\tsessionId: string,\n\toptions: RunInspectOptions = {},\n): Promise<RunReconstructionReport | null> {\n\tconst manager = new SessionManager(false, undefined, {\n\t\tsessionDir: options.sessionDir,\n\t});\n\tconst sessionFile = manager.getSessionFileById(sessionId);\n\tif (!sessionFile) {\n\t\treturn null;\n\t}\n\tconst [session, entries] = await Promise.all([\n\t\tmanager.loadSession(sessionId),\n\t\tmanager.loadEntries(sessionId),\n\t]);\n\tif (!session || !entries) {\n\t\treturn null;\n\t}\n\tmigrateToCurrentVersion(entries);\n\n\tconst header = findHeader(entries);\n\tconst timeline = buildComposerRunTimeline({\n\t\tsessionId,\n\t\tentries,\n\t\tmessages: session.messages,\n\t});\n\tconst trajectory = buildAgentTrajectoryReport(timeline);\n\tconst trajectoryReplay = replayAgentTrajectoryReport(trajectory);\n\tconst trajectoryScore = scoreAgentTrajectoryReport(\n\t\ttrajectory,\n\t\tRUN_INSPECT_TRAJECTORY_RULES,\n\t);\n\tconst trajectoryInspection = buildAgentTrajectoryInspectionReport({\n\t\ttimelineItems: timeline.items,\n\t\ttrajectory,\n\t\treplay: trajectoryReplay,\n\t\tscore: trajectoryScore,\n\t});\n\tconst agentRuntimeLedger = buildAgentRuntimeLedgerReport({\n\t\tsession: {\n\t\t\tid: session.id,\n\t\t\tsessionFile,\n\t\t\t...(header?.cwd ? { cwd: header.cwd } : {}),\n\t\t\t...(header?.model ? { model: header.model } : {}),\n\t\t},\n\t\ttimeline,\n\t\ttrajectory,\n\t\treplay: trajectoryReplay,\n\t});\n\tconst counts = countTimeline(timeline);\n\tconst context = promptContextSummary(header, timeline);\n\tconst contextManifest = contextManifestSummary(header, timeline, context);\n\n\tconst sessionReport: RunReconstructionReport[\"session\"] = {\n\t\tid: session.id,\n\t\tcreatedAt: session.createdAt,\n\t\tupdatedAt: session.updatedAt,\n\t\tmessageCount: session.messageCount,\n\t\tsessionFile,\n\t};\n\tif (session.title) {\n\t\tsessionReport.title = session.title;\n\t}\n\tif (session.summary) {\n\t\tsessionReport.summary = session.summary;\n\t}\n\tif (header?.cwd) {\n\t\tsessionReport.cwd = header.cwd;\n\t}\n\tif (header?.model) {\n\t\tsessionReport.model = header.model;\n\t}\n\n\treturn {\n\t\tschemaVersion: RUN_RECONSTRUCTION_SCHEMA,\n\t\tsession: sessionReport,\n\t\tcounts,\n\t\tcoverage: buildCoverage(counts, context, contextManifest),\n\t\tpromptContext: context,\n\t\tcontextManifest,\n\t\ttimeline,\n\t\ttrajectory,\n\t\ttrajectoryReplay,\n\t\ttrajectoryScore,\n\t\ttrajectoryInspection,\n\t\tagentRuntimeLedger,\n\t};\n}\n\nfunction renderCoverage(coverage: ReconstructionCoverage): string {\n\tconst labels: Array<[keyof ReconstructionCoverage, string]> = [\n\t\t[\"promptInputs\", \"prompt inputs\"],\n\t\t[\"assistantResponses\", \"assistant responses\"],\n\t\t[\"toolRequests\", \"tool requests\"],\n\t\t[\"toolResults\", \"tool results\"],\n\t\t[\"contextManifest\", \"context manifest\"],\n\t\t[\"contextDiagnostics\", \"context diagnostics\"],\n\t\t[\"fileChanges\", \"file changes\"],\n\t\t[\"artifacts\", \"artifacts\"],\n\t\t[\"policyDecisions\", \"policy decisions\"],\n\t\t[\"diagnostics\", \"diagnostics\"],\n\t\t[\"compactions\", \"compactions\"],\n\t\t[\"pendingRequests\", \"pending waits\"],\n\t\t[\"mcpContext\", \"MCP context\"],\n\t];\n\treturn labels\n\t\t.map(([key, label]) => `${coverage[key] ? \"yes\" : \"no\"} ${label}`)\n\t\t.join(\", \");\n}\n\nfunction renderTimelinePreview(timeline: ComposerRunTimeline): string[] {\n\treturn timeline.items.slice(0, 12).map((item: ComposerRunTimelineItem) => {\n\t\tconst parts = [\n\t\t\titem.timestamp,\n\t\t\titem.type,\n\t\t\titem.status,\n\t\t\titem.title,\n\t\t\titem.summary,\n\t\t].filter(Boolean);\n\t\treturn ` - ${parts.join(\" | \")}`;\n\t});\n}\n\nfunction renderRunReconstruction(report: RunReconstructionReport): string {\n\tconst lines = [\n\t\tchalk.bold(`Run reconstruction: ${report.session.id}`),\n\t\t`Session file: ${report.session.sessionFile}`,\n\t\t`Messages: ${report.session.messageCount}`,\n\t\t`Timeline items: ${report.counts.timelineItems}`,\n\t\t`Trajectory events: ${report.trajectory.counts.events}`,\n\t\t`Replay deltas: ${report.trajectoryReplay.counts.deltas} (${report.trajectoryReplay.counts.errors} errors, ${report.trajectoryReplay.counts.warnings} warnings)`,\n\t\t`Trajectory score: ${report.trajectoryScore.counts.failed} failed, ${report.trajectoryScore.counts.warnings} warnings across ${report.trajectoryScore.counts.rules} rule(s)`,\n\t\t`Replay lab: ${report.trajectoryInspection.counts.jumpTargets} event/source jump target(s), redaction=${report.trajectoryInspection.redaction.default}`,\n\t\t`AgentRuntime ledger: ${report.agentRuntimeLedger.counts.entries} entries, ${report.agentRuntimeLedger.counts.promotionOperations} dry-run promotion op(s), replay deterministic=${report.agentRuntimeLedger.replay.deterministic ? \"yes\" : \"no\"}`,\n\t\t`Coverage: ${renderCoverage(report.coverage)}`,\n\t\t`Prompt context: ${report.promptContext.entries} entries (${report.promptContext.projectDocs} docs, ${report.promptContext.mcpServers} MCP servers)`,\n\t\t`Context manifest: ${report.contextManifest.entries} entries (${report.contextManifest.projectDocs} docs, ${report.contextManifest.mcpServers} MCP servers, ${report.contextManifest.mcpResources} resources, ${report.contextManifest.mcpPrompts} prompts, ${report.contextManifest.diagnostics} diagnostics)`,\n\t\t\"\",\n\t\tchalk.bold(\"Timeline preview\"),\n\t\t...renderTimelinePreview(report.timeline),\n\t];\n\tif (report.timeline.items.length > 12) {\n\t\tlines.push(` ... ${report.timeline.items.length - 12} more item(s)`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function handleRunCommand(\n\tsubcommand?: string,\n\targs: string[] = [],\n\toptions: RunInspectOptions = {},\n): Promise<void> {\n\tif (\n\t\tsubcommand !== \"inspect\" &&\n\t\tsubcommand !== \"ledger\" &&\n\t\tsubcommand !== \"replay\" &&\n\t\tsubcommand !== \"promote\"\n\t) {\n\t\texitWithUsage(\"Run subcommand required.\");\n\t}\n\tconst sessionId = args.find((arg) => !arg.startsWith(\"-\"));\n\tif (!sessionId) {\n\t\texitWithUsage(\"Session id required.\");\n\t}\n\n\tconst report = await buildRunReconstructionReport(sessionId, options);\n\tif (!report) {\n\t\texitWithUsage(`Session not found: ${sessionId}`);\n\t}\n\n\tif (subcommand === \"ledger\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger, null, 2));\n\t\treturn;\n\t}\n\tif (subcommand === \"replay\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger.replay, null, 2));\n\t\treturn;\n\t}\n\tif (subcommand === \"promote\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger.promotion, null, 2));\n\t\treturn;\n\t}\n\n\tif (options.json || args.includes(\"--json\")) {\n\t\tconsole.log(JSON.stringify(report, null, 2));\n\t\treturn;\n\t}\n\n\tconsole.log(renderRunReconstruction(report));\n}\n\nexport const testing = {\n\tbuildRunReconstructionReport,\n\trenderRunReconstruction,\n};\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { parseMcpToolName } from \"../../mcp/names.js\";\nimport {\n\ttype AgentRuntimeLedgerReport,\n\tbuildAgentRuntimeLedgerReport,\n} from \"../../server/agent-runtime-ledger.js\";\nimport {\n\ttype AgentTrajectoryInspectionReport,\n\tbuildAgentTrajectoryInspectionReport,\n} from \"../../server/agent-trajectory-inspection.js\";\nimport { DEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES } from \"../../server/agent-trajectory-replay-lab.js\";\nimport {\n\ttype AgentTrajectoryReplayReport,\n\treplayAgentTrajectoryReport,\n} from \"../../server/agent-trajectory-replay.js\";\nimport {\n\ttype AgentTrajectoryScoreReport,\n\tscoreAgentTrajectoryReport,\n} from \"../../server/agent-trajectory-scorers.js\";\nimport {\n\ttype AgentTrajectoryReport,\n\tbuildAgentTrajectoryReport,\n} from \"../../server/agent-trajectory.js\";\nimport { buildComposerRunTimeline } from \"../../server/session-timeline.js\";\nimport { SessionManager } from \"../../session/manager.js\";\nimport { migrateToCurrentVersion } from \"../../session/migration.js\";\nimport type { SessionEntry, SessionHeaderEntry } from \"../../session/types.js\";\n\nconst RUN_RECONSTRUCTION_SCHEMA = \"evalops.maestro.run-reconstruction.v1\";\n\ntype ComposerRunTimeline = ReturnType<typeof buildComposerRunTimeline>;\ntype ComposerRunTimelineItem = ComposerRunTimeline[\"items\"][number];\n\ninterface RunInspectOptions {\n\tjson?: boolean;\n\tsessionDir?: string;\n}\n\ninterface ReconstructionCountSummary {\n\ttimelineItems: number;\n\tbyType: Record<string, number>;\n\tbyStatus: Record<string, number>;\n\tbyVisibility: Record<string, number>;\n}\n\ninterface ReconstructionCoverage {\n\tpromptInputs: boolean;\n\tassistantResponses: boolean;\n\ttoolRequests: boolean;\n\ttoolResults: boolean;\n\tcontextManifest: boolean;\n\tcontextDiagnostics: boolean;\n\tfileChanges: boolean;\n\tartifacts: boolean;\n\tpolicyDecisions: boolean;\n\tdiagnostics: boolean;\n\tcompactions: boolean;\n\tpendingRequests: boolean;\n\tmcpContext: boolean;\n}\n\ninterface PromptContextSummary {\n\tentries: number;\n\tprojectDocs: number;\n\tmcpServers: number;\n}\n\ninterface ContextManifestSummary {\n\tprotocolVersion?: string;\n\tversion?: number;\n\tcwd?: string;\n\tentries: number;\n\tprojectDocs: number;\n\tmcpServers: number;\n\tmcpResources: number;\n\tmcpPrompts: number;\n\tdiagnostics: number;\n\tbyKind: Record<string, number>;\n\tbySource: Record<string, number>;\n\tbyStatus: Record<string, number>;\n\tprojectDocBytesRead?: number;\n\tprojectDocMaxBytes?: number;\n}\n\ninterface RunReconstructionReport {\n\tschemaVersion: typeof RUN_RECONSTRUCTION_SCHEMA;\n\tsession: {\n\t\tid: string;\n\t\ttitle?: string;\n\t\tsummary?: string;\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t\tmessageCount: number;\n\t\tsessionFile: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: ReconstructionCountSummary;\n\tcoverage: ReconstructionCoverage;\n\tpromptContext: PromptContextSummary;\n\tcontextManifest: ContextManifestSummary;\n\ttimeline: ComposerRunTimeline;\n\ttrajectory: AgentTrajectoryReport;\n\ttrajectoryReplay: AgentTrajectoryReplayReport;\n\ttrajectoryScore: AgentTrajectoryScoreReport;\n\ttrajectoryInspection: AgentTrajectoryInspectionReport;\n\tagentRuntimeLedger: AgentRuntimeLedgerReport;\n}\n\nfunction usage(): string {\n\treturn \"Usage: maestro run inspect|ledger|replay|promote <session-id> [--json]\";\n}\n\nfunction exitWithUsage(message: string): never {\n\tconsole.error(chalk.red(message));\n\tconsole.error(chalk.dim(usage()));\n\tprocess.exit(1);\n}\n\nfunction findHeader(entries: SessionEntry[]): SessionHeaderEntry | undefined {\n\treturn entries.find(\n\t\t(entry): entry is SessionHeaderEntry => entry.type === \"session\",\n\t);\n}\n\nfunction promptContextSummary(\n\theader: SessionHeaderEntry | undefined,\n\ttimeline: ComposerRunTimeline,\n): PromptContextSummary {\n\tconst manifest = header?.promptContextManifest;\n\tconst entries = Array.isArray(\n\t\t(manifest as { entries?: unknown } | undefined)?.entries,\n\t)\n\t\t? ((manifest as { entries: unknown[] }).entries ?? [])\n\t\t: [];\n\tlet projectDocs = 0;\n\tconst mcpServers = new Set<string>();\n\tfor (const entry of entries) {\n\t\tif (!entry || typeof entry !== \"object\") continue;\n\t\tconst kind = (entry as { kind?: unknown }).kind;\n\t\tconst sourceKind = (entry as { sourceKind?: unknown }).sourceKind;\n\t\tconst resourceKind = (entry as { resourceKind?: unknown }).resourceKind;\n\t\tif (\n\t\t\tkind === \"project_doc\" ||\n\t\t\tsourceKind === \"project\" ||\n\t\t\tsourceKind === \"global\"\n\t\t) {\n\t\t\tprojectDocs += 1;\n\t\t} else if (kind === \"mcp_server\" || resourceKind === \"mcp_server\") {\n\t\t\tconst serverName =\n\t\t\t\t(entry as { serverName?: unknown }).serverName ??\n\t\t\t\t(entry as { resourceId?: unknown }).resourceId ??\n\t\t\t\t(entry as { providerId?: unknown }).providerId ??\n\t\t\t\t(entry as { id?: unknown }).id;\n\t\t\tmcpServers.add(typeof serverName === \"string\" ? serverName : \"unknown\");\n\t\t}\n\t}\n\tfor (const tool of header?.tools ?? []) {\n\t\tconst mcpTool = parseMcpToolName(tool.name);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\tfor (const item of timeline.items) {\n\t\tif (!item.toolName) continue;\n\t\tconst mcpTool = parseMcpToolName(item.toolName);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\treturn {\n\t\tentries: entries.length,\n\t\tprojectDocs,\n\t\tmcpServers: mcpServers.size,\n\t};\n}\n\nfunction contextManifestSummary(\n\theader: SessionHeaderEntry | undefined,\n\ttimeline: ComposerRunTimeline,\n\tpromptContext: PromptContextSummary,\n): ContextManifestSummary {\n\tconst manifest = header?.unifiedContextManifest;\n\tconst byKind: Record<string, number> = {};\n\tconst bySource: Record<string, number> = {};\n\tconst byStatus: Record<string, number> = {};\n\tconst mcpServers = new Set<string>();\n\tlet mcpResources = 0;\n\tlet mcpPrompts = 0;\n\tlet projectDocs = 0;\n\n\tfor (const entry of manifest?.entries ?? []) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(bySource, entry.source);\n\t\tincrement(byStatus, entry.status);\n\t\tif (entry.kind === \"project_doc\") {\n\t\t\tprojectDocs += 1;\n\t\t}\n\t\tif (entry.kind === \"mcp_server\") {\n\t\t\tmcpServers.add(entry.serverName ?? entry.id);\n\t\t}\n\t\tif (entry.kind === \"mcp_resource\") {\n\t\t\tmcpResources += 1;\n\t\t\tif (entry.serverName) {\n\t\t\t\tmcpServers.add(entry.serverName);\n\t\t\t}\n\t\t}\n\t\tif (entry.kind === \"mcp_prompt\") {\n\t\t\tmcpPrompts += 1;\n\t\t\tif (entry.serverName) {\n\t\t\t\tmcpServers.add(entry.serverName);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const tool of header?.tools ?? []) {\n\t\tconst mcpTool = parseMcpToolName(tool.name);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\tfor (const item of timeline.items) {\n\t\tif (!item.toolName) continue;\n\t\tconst mcpTool = parseMcpToolName(item.toolName);\n\t\tif (mcpTool) {\n\t\t\tmcpServers.add(mcpTool.server);\n\t\t}\n\t}\n\n\tconst summary: ContextManifestSummary = {\n\t\tentries: manifest?.entries.length ?? promptContext.entries,\n\t\tprojectDocs: manifest ? projectDocs : promptContext.projectDocs,\n\t\tmcpServers: manifest ? mcpServers.size : promptContext.mcpServers,\n\t\tmcpResources,\n\t\tmcpPrompts,\n\t\tdiagnostics: manifest?.diagnostics.length ?? 0,\n\t\tbyKind,\n\t\tbySource,\n\t\tbyStatus,\n\t};\n\tif (manifest) {\n\t\tsummary.protocolVersion = manifest.protocolVersion;\n\t\tsummary.version = manifest.version;\n\t\tsummary.cwd = manifest.cwd;\n\t\tsummary.projectDocBytesRead = manifest.projectDocs.bytesRead;\n\t\tif (manifest.projectDocs.maxBytes !== undefined) {\n\t\t\tsummary.projectDocMaxBytes = manifest.projectDocs.maxBytes;\n\t\t}\n\t}\n\treturn summary;\n}\n\nfunction increment(map: Record<string, number>, key: unknown): void {\n\tif (typeof key !== \"string\" || key.length === 0) return;\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction countTimeline(\n\ttimeline: ComposerRunTimeline,\n): ReconstructionCountSummary {\n\tconst byType: Record<string, number> = {};\n\tconst byStatus: Record<string, number> = {};\n\tconst byVisibility: Record<string, number> = {};\n\tfor (const item of timeline.items) {\n\t\tincrement(byType, item.type);\n\t\tincrement(byStatus, item.status);\n\t\tincrement(byVisibility, item.visibility);\n\t}\n\treturn {\n\t\ttimelineItems: timeline.items.length,\n\t\tbyType,\n\t\tbyStatus,\n\t\tbyVisibility,\n\t};\n}\n\nfunction buildCoverage(\n\tcounts: ReconstructionCountSummary,\n\tpromptContext: PromptContextSummary,\n\tcontextManifest: ContextManifestSummary,\n): ReconstructionCoverage {\n\treturn {\n\t\tpromptInputs: (counts.byType[\"message.user\"] ?? 0) > 0,\n\t\tassistantResponses: (counts.byType[\"message.assistant\"] ?? 0) > 0,\n\t\ttoolRequests: (counts.byType[\"tool.requested\"] ?? 0) > 0,\n\t\ttoolResults:\n\t\t\t(counts.byType[\"tool.completed\"] ?? 0) +\n\t\t\t\t(counts.byType[\"tool.failed\"] ?? 0) >\n\t\t\t0,\n\t\tcontextManifest: contextManifest.protocolVersion !== undefined,\n\t\tcontextDiagnostics: contextManifest.diagnostics > 0,\n\t\tfileChanges: (counts.byType[\"file.changed\"] ?? 0) > 0,\n\t\tartifacts: (counts.byType[\"artifact.linked\"] ?? 0) > 0,\n\t\tpolicyDecisions: (counts.byType[\"policy.decision\"] ?? 0) > 0,\n\t\tdiagnostics: (counts.byType[\"diagnostic.delta\"] ?? 0) > 0,\n\t\tcompactions: (counts.byType[\"compaction.created\"] ?? 0) > 0,\n\t\tpendingRequests: (counts.byType[\"wait.pending\"] ?? 0) > 0,\n\t\tmcpContext: contextManifest.mcpServers > 0 || promptContext.mcpServers > 0,\n\t};\n}\n\nasync function buildRunReconstructionReport(\n\tsessionId: string,\n\toptions: RunInspectOptions = {},\n): Promise<RunReconstructionReport | null> {\n\tconst manager = new SessionManager(false, undefined, {\n\t\tsessionDir: options.sessionDir,\n\t});\n\tconst sessionFile = manager.getSessionFileById(sessionId);\n\tif (!sessionFile) {\n\t\treturn null;\n\t}\n\tconst [session, entries] = await Promise.all([\n\t\tmanager.loadSession(sessionId),\n\t\tmanager.loadEntries(sessionId),\n\t]);\n\tif (!session || !entries) {\n\t\treturn null;\n\t}\n\tmigrateToCurrentVersion(entries);\n\n\tconst header = findHeader(entries);\n\tconst timeline = buildComposerRunTimeline({\n\t\tsessionId,\n\t\tentries,\n\t\tmessages: session.messages,\n\t});\n\tconst trajectory = buildAgentTrajectoryReport(timeline);\n\tconst trajectoryReplay = replayAgentTrajectoryReport(trajectory);\n\tconst trajectoryScore = scoreAgentTrajectoryReport(\n\t\ttrajectory,\n\t\tDEFAULT_AGENT_TRAJECTORY_REPLAY_LAB_RULES,\n\t);\n\tconst trajectoryInspection = buildAgentTrajectoryInspectionReport({\n\t\ttimelineItems: timeline.items,\n\t\ttrajectory,\n\t\treplay: trajectoryReplay,\n\t\tscore: trajectoryScore,\n\t});\n\tconst agentRuntimeLedger = buildAgentRuntimeLedgerReport({\n\t\tsession: {\n\t\t\tid: session.id,\n\t\t\tsessionFile,\n\t\t\t...(header?.cwd ? { cwd: header.cwd } : {}),\n\t\t\t...(header?.model ? { model: header.model } : {}),\n\t\t},\n\t\ttimeline,\n\t\ttrajectory,\n\t\treplay: trajectoryReplay,\n\t});\n\tconst counts = countTimeline(timeline);\n\tconst context = promptContextSummary(header, timeline);\n\tconst contextManifest = contextManifestSummary(header, timeline, context);\n\n\tconst sessionReport: RunReconstructionReport[\"session\"] = {\n\t\tid: session.id,\n\t\tcreatedAt: session.createdAt,\n\t\tupdatedAt: session.updatedAt,\n\t\tmessageCount: session.messageCount,\n\t\tsessionFile,\n\t};\n\tif (session.title) {\n\t\tsessionReport.title = session.title;\n\t}\n\tif (session.summary) {\n\t\tsessionReport.summary = session.summary;\n\t}\n\tif (header?.cwd) {\n\t\tsessionReport.cwd = header.cwd;\n\t}\n\tif (header?.model) {\n\t\tsessionReport.model = header.model;\n\t}\n\n\treturn {\n\t\tschemaVersion: RUN_RECONSTRUCTION_SCHEMA,\n\t\tsession: sessionReport,\n\t\tcounts,\n\t\tcoverage: buildCoverage(counts, context, contextManifest),\n\t\tpromptContext: context,\n\t\tcontextManifest,\n\t\ttimeline,\n\t\ttrajectory,\n\t\ttrajectoryReplay,\n\t\ttrajectoryScore,\n\t\ttrajectoryInspection,\n\t\tagentRuntimeLedger,\n\t};\n}\n\nfunction renderCoverage(coverage: ReconstructionCoverage): string {\n\tconst labels: Array<[keyof ReconstructionCoverage, string]> = [\n\t\t[\"promptInputs\", \"prompt inputs\"],\n\t\t[\"assistantResponses\", \"assistant responses\"],\n\t\t[\"toolRequests\", \"tool requests\"],\n\t\t[\"toolResults\", \"tool results\"],\n\t\t[\"contextManifest\", \"context manifest\"],\n\t\t[\"contextDiagnostics\", \"context diagnostics\"],\n\t\t[\"fileChanges\", \"file changes\"],\n\t\t[\"artifacts\", \"artifacts\"],\n\t\t[\"policyDecisions\", \"policy decisions\"],\n\t\t[\"diagnostics\", \"diagnostics\"],\n\t\t[\"compactions\", \"compactions\"],\n\t\t[\"pendingRequests\", \"pending waits\"],\n\t\t[\"mcpContext\", \"MCP context\"],\n\t];\n\treturn labels\n\t\t.map(([key, label]) => `${coverage[key] ? \"yes\" : \"no\"} ${label}`)\n\t\t.join(\", \");\n}\n\nfunction renderTimelinePreview(timeline: ComposerRunTimeline): string[] {\n\treturn timeline.items.slice(0, 12).map((item: ComposerRunTimelineItem) => {\n\t\tconst parts = [\n\t\t\titem.timestamp,\n\t\t\titem.type,\n\t\t\titem.status,\n\t\t\titem.title,\n\t\t\titem.summary,\n\t\t].filter(Boolean);\n\t\treturn ` - ${parts.join(\" | \")}`;\n\t});\n}\n\nfunction renderRunReconstruction(report: RunReconstructionReport): string {\n\tconst lines = [\n\t\tchalk.bold(`Run reconstruction: ${report.session.id}`),\n\t\t`Session file: ${report.session.sessionFile}`,\n\t\t`Messages: ${report.session.messageCount}`,\n\t\t`Timeline items: ${report.counts.timelineItems}`,\n\t\t`Trajectory events: ${report.trajectory.counts.events}`,\n\t\t`Replay deltas: ${report.trajectoryReplay.counts.deltas} (${report.trajectoryReplay.counts.errors} errors, ${report.trajectoryReplay.counts.warnings} warnings)`,\n\t\t`Trajectory score: ${report.trajectoryScore.counts.failed} failed, ${report.trajectoryScore.counts.warnings} warnings across ${report.trajectoryScore.counts.rules} rule(s)`,\n\t\t`Replay lab: ${report.trajectoryInspection.counts.jumpTargets} event/source jump target(s), redaction=${report.trajectoryInspection.redaction.default}`,\n\t\t`AgentRuntime ledger: ${report.agentRuntimeLedger.counts.entries} entries, ${report.agentRuntimeLedger.counts.promotionOperations} dry-run promotion op(s), replay deterministic=${report.agentRuntimeLedger.replay.deterministic ? \"yes\" : \"no\"}`,\n\t\t`Coverage: ${renderCoverage(report.coverage)}`,\n\t\t`Prompt context: ${report.promptContext.entries} entries (${report.promptContext.projectDocs} docs, ${report.promptContext.mcpServers} MCP servers)`,\n\t\t`Context manifest: ${report.contextManifest.entries} entries (${report.contextManifest.projectDocs} docs, ${report.contextManifest.mcpServers} MCP servers, ${report.contextManifest.mcpResources} resources, ${report.contextManifest.mcpPrompts} prompts, ${report.contextManifest.diagnostics} diagnostics)`,\n\t\t\"\",\n\t\tchalk.bold(\"Timeline preview\"),\n\t\t...renderTimelinePreview(report.timeline),\n\t];\n\tif (report.timeline.items.length > 12) {\n\t\tlines.push(` ... ${report.timeline.items.length - 12} more item(s)`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function handleRunCommand(\n\tsubcommand?: string,\n\targs: string[] = [],\n\toptions: RunInspectOptions = {},\n): Promise<void> {\n\tif (\n\t\tsubcommand !== \"inspect\" &&\n\t\tsubcommand !== \"ledger\" &&\n\t\tsubcommand !== \"replay\" &&\n\t\tsubcommand !== \"promote\"\n\t) {\n\t\texitWithUsage(\"Run subcommand required.\");\n\t}\n\tconst sessionId = args.find((arg) => !arg.startsWith(\"-\"));\n\tif (!sessionId) {\n\t\texitWithUsage(\"Session id required.\");\n\t}\n\n\tconst report = await buildRunReconstructionReport(sessionId, options);\n\tif (!report) {\n\t\texitWithUsage(`Session not found: ${sessionId}`);\n\t}\n\n\tif (subcommand === \"ledger\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger, null, 2));\n\t\treturn;\n\t}\n\tif (subcommand === \"replay\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger.replay, null, 2));\n\t\treturn;\n\t}\n\tif (subcommand === \"promote\") {\n\t\tconsole.log(JSON.stringify(report.agentRuntimeLedger.promotion, null, 2));\n\t\treturn;\n\t}\n\n\tif (options.json || args.includes(\"--json\")) {\n\t\tconsole.log(JSON.stringify(report, null, 2));\n\t\treturn;\n\t}\n\n\tconsole.log(renderRunReconstruction(report));\n}\n\nexport const testing = {\n\tbuildRunReconstructionReport,\n\trenderRunReconstruction,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"a2a-handlers.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/commands/a2a-handlers.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,IAAI,IAAI,CAAC;CACtB;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,qBAAqB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwJf"}
1
+ {"version":3,"file":"a2a-handlers.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/commands/a2a-handlers.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,IAAI,IAAI,CAAC;CACtB;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,qBAAqB,GACzB,OAAO,CAAC,IAAI,CAAC,CAgNf"}
@@ -1,4 +1,5 @@
1
1
  import { parseA2AArgs } from "../../cli/commands/a2a.js";
2
+ import { buildA2ACockpit } from "../../platform/a2a-cockpit.js";
2
3
  import { inspectA2AFleet } from "../../platform/a2a-fleet.js";
3
4
  import { decodeA2APeerPairingCode } from "../../platform/a2a-peer-pairing.js";
4
5
  import { listA2APeers, upsertA2APeerFromPairingPayload, } from "../../platform/a2a-peer-registry.js";
@@ -53,6 +54,59 @@ export async function handleA2ATuiCommand(context, deps) {
53
54
  deps.requestRender();
54
55
  return;
55
56
  }
57
+ if (subcommand === "cockpit" || subcommand === "dashboard") {
58
+ const cockpit = await buildA2ACockpit({
59
+ registryPath: stringFlag(parsed.flags, "--registry"),
60
+ tasksPath: stringFlag(parsed.flags, "--tasks"),
61
+ timeoutMs: numberFlag(parsed.flags, "--timeout-ms"),
62
+ peer: stringFlag(parsed.flags, "--peer"),
63
+ limit: numberFlag(parsed.flags, "--limit"),
64
+ });
65
+ deps.addContent([
66
+ `A2A cockpit (${cockpit.registryPath})`,
67
+ [
68
+ `${cockpit.counts.onlinePeers}/${cockpit.counts.peers} peers online`,
69
+ `${cockpit.counts.runningTasks} running`,
70
+ `${cockpit.counts.actionRequiredTasks} waiting`,
71
+ `${cockpit.counts.failedTasks} failed`,
72
+ ].join(" · "),
73
+ cockpit.peers.length === 0
74
+ ? "No peers registered. Use /a2a accept <pairing-code>."
75
+ : cockpit.peers
76
+ .map((peer) => {
77
+ const last = peer.lastTask
78
+ ? ` last=${peer.lastTask.id} ${peer.lastTask.state}`
79
+ : "";
80
+ return `${peer.status} ${peer.name} ${peer.url}${last}`;
81
+ })
82
+ .join("\n"),
83
+ cockpit.tasks.length > 0
84
+ ? [
85
+ "Tasks",
86
+ cockpit.tasks
87
+ .map((task) => {
88
+ const peerLabel = task.orphanedPeer
89
+ ? `${task.peer} (orphaned peer)`
90
+ : task.peer;
91
+ return `${task.status} ${peerLabel} ${task.taskId} ${task.state} ${task.text}`;
92
+ })
93
+ .join("\n"),
94
+ ].join("\n")
95
+ : "No delegated tasks recorded yet.",
96
+ cockpit.nextActions.length > 0
97
+ ? [
98
+ "Next actions",
99
+ cockpit.nextActions
100
+ .map((action) => `${action.label}\n ${action.command}`)
101
+ .join("\n"),
102
+ ].join("\n")
103
+ : undefined,
104
+ ]
105
+ .filter(Boolean)
106
+ .join("\n"));
107
+ deps.requestRender();
108
+ return;
109
+ }
56
110
  if (subcommand === "tasks") {
57
111
  const peer = parsed.positionals.shift();
58
112
  const tasksPath = stringFlag(parsed.flags, "--tasks");
@@ -125,6 +179,7 @@ export async function handleA2ATuiCommand(context, deps) {
125
179
  }
126
180
  deps.addContent([
127
181
  "/a2a accept <pairing-code> [--name <peer>] [--default] [--token-env ENV]",
182
+ "/a2a cockpit [--peer <peer>]",
128
183
  "/a2a fleet",
129
184
  "/a2a peers",
130
185
  "/a2a delegate <peer> <text>",