@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.
- package/dist/agent/agent.d.ts +1 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +15 -4
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +68 -3
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +3 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +7 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/tools-setup.d.ts.map +1 -1
- package/dist/bootstrap/tools-setup.js +3 -2
- package/dist/bootstrap/tools-setup.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +141 -8
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/codex.d.ts.map +1 -1
- package/dist/cli/commands/codex.js +4 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli/commands/hosted-runner.d.ts +1 -0
- package/dist/cli/commands/hosted-runner.d.ts.map +1 -1
- package/dist/cli/commands/hosted-runner.js +31 -2
- package/dist/cli/commands/hosted-runner.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +2 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/a2a-handlers.js +55 -0
- package/dist/cli-tui/commands/a2a-handlers.js.map +1 -1
- package/dist/cli.js +3925 -2024
- package/dist/codex/compatibility.d.ts +17 -1
- package/dist/codex/compatibility.d.ts.map +1 -1
- package/dist/codex/compatibility.js +57 -1
- package/dist/codex/compatibility.js.map +1 -1
- package/dist/guardian/config.d.ts +8 -6
- package/dist/guardian/config.d.ts.map +1 -1
- package/dist/guardian/config.js +33 -7
- package/dist/guardian/config.js.map +1 -1
- package/dist/guardian/runner.d.ts.map +1 -1
- package/dist/guardian/runner.js +54 -9
- package/dist/guardian/runner.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +2 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts +3 -0
- package/dist/mcp/fathom-cua.d.ts.map +1 -0
- package/dist/mcp/fathom-cua.js +158 -0
- package/dist/mcp/fathom-cua.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/platform/a2a-cockpit.d.ts +90 -0
- package/dist/platform/a2a-cockpit.d.ts.map +1 -0
- package/dist/platform/a2a-cockpit.js +302 -0
- package/dist/platform/a2a-cockpit.js.map +1 -0
- package/dist/platform/a2a-fleet.d.ts +14 -0
- package/dist/platform/a2a-fleet.d.ts.map +1 -1
- package/dist/platform/a2a-fleet.js +66 -1
- package/dist/platform/a2a-fleet.js.map +1 -1
- package/dist/platform/a2a-ownership.d.ts +27 -0
- package/dist/platform/a2a-ownership.d.ts.map +1 -0
- package/dist/platform/a2a-ownership.js +149 -0
- package/dist/platform/a2a-ownership.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +29 -5
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/server/agent-trajectory-replay-lab.d.ts +36 -0
- package/dist/server/agent-trajectory-replay-lab.d.ts.map +1 -0
- package/dist/server/agent-trajectory-replay-lab.js +48 -0
- package/dist/server/agent-trajectory-replay-lab.js.map +1 -0
- package/dist/server/any-agent-control-plane-proof.d.ts +42 -0
- package/dist/server/any-agent-control-plane-proof.d.ts.map +1 -0
- package/dist/server/any-agent-control-plane-proof.js +175 -0
- package/dist/server/any-agent-control-plane-proof.js.map +1 -0
- package/dist/server/app-context.d.ts +1 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/a2a-cockpit.d.ts +3 -0
- package/dist/server/handlers/a2a-cockpit.d.ts.map +1 -0
- package/dist/server/handlers/a2a-cockpit.js +71 -0
- package/dist/server/handlers/a2a-cockpit.js.map +1 -0
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +17 -2
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
- package/dist/server/handlers/session-artifacts.js +14 -58
- package/dist/server/handlers/session-artifacts.js.map +1 -1
- package/dist/server/handlers/session-replay-lab.d.ts +13 -0
- package/dist/server/handlers/session-replay-lab.d.ts.map +1 -0
- package/dist/server/handlers/session-replay-lab.js +80 -0
- package/dist/server/handlers/session-replay-lab.js.map +1 -0
- package/dist/server/handlers/stats.js +1 -1
- package/dist/server/handlers/stats.js.map +1 -1
- package/dist/server/handlers/status.d.ts +44 -3
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +227 -17
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +17 -0
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +143 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.d.ts +17 -0
- package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.js +352 -15
- package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +14 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/services/intelligent-router/index.d.ts +1 -1
- package/dist/services/intelligent-router/index.d.ts.map +1 -1
- package/dist/services/intelligent-router/index.js +1 -1
- package/dist/services/intelligent-router/index.js.map +1 -1
- package/dist/services/intelligent-router/normalize.d.ts +10 -2
- package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
- package/dist/services/intelligent-router/normalize.js +20 -1
- package/dist/services/intelligent-router/normalize.js.map +1 -1
- package/dist/services/intelligent-router/service.d.ts.map +1 -1
- package/dist/services/intelligent-router/service.js +35 -0
- package/dist/services/intelligent-router/service.js.map +1 -1
- package/dist/services/intelligent-router/types.d.ts +13 -0
- package/dist/services/intelligent-router/types.d.ts.map +1 -1
- package/dist/services/intelligent-router/types.js +1 -0
- package/dist/services/intelligent-router/types.js.map +1 -1
- package/dist/telemetry/cli-command-aggregator.d.ts +1 -0
- package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -1
- package/dist/telemetry/cli-command-aggregator.js +23 -0
- package/dist/telemetry/cli-command-aggregator.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +11 -5
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +15 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +30 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +289 -283
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/codex.ts"],"names":[],"mappings":"
|
|
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,
|
|
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
|
|
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(`
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEN,0BAA0B,GAC1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,4BAA4B,EAC5B,2BAA2B,EAC3B,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,UAAmB,EACnB,SAAmB,EAAE;IAErB,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,OAAO;YACX,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO;QACR,KAAK,QAAQ;YACZ,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACR,KAAK,QAAQ;YACZ,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACR,KAAK,QAAQ;YACZ,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACR;YACC,OAAO,CAAC,KAAK,CACZ,KAAK,CAAC,GAAG,CACR,uFAAuF,CACvF,CACD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAmB,EAAE;IAC/C,MAAM,UAAU,GACf,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAC3C,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CACjC,CAAC;QACF,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CACtE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAClE,CAAC;YACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,wEAAwE,CACxE,CACD,CAAC;YACF,OAAO;QACR,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,wEAAwE,CACxE,CACD,CAAC;IACH,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACrE,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAC/D,CAAC;YACF,OAAO;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,4BAA4B,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CACjE,CAAC;IACH,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAC/D,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,oBAAoB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAC9D,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,2BAA2B,CAC9C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CACtC,CAAC;QACF,MAAM,aAAa,GAAG,sBAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,aAAa,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,uBAAuB,WAAW,MAAM,aAAa,CAAC,MAAM,WAAW,aAAa;aAClF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CACf,CACD,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CACzC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAC/C,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,SAAS,GACd,UAAU,CAAC,QAAQ,KAAK,OAAO;gBAC9B,CAAC,CAAC,KAAK,CAAC,GAAG;gBACX,CAAC,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS;oBAClC,CAAC,CAAC,KAAK,CAAC,MAAM;oBACd,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GACT,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAClE,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE;QACzB,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,OAAO,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA6B;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,GACT,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAClE,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE;YACzB,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CACtB,KAAc;IAEd,OAAO,CACN,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC1C,KAA4B,CAAC,IAAI,KAAK,SAAS;QAChD,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ;QAC5D,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,CAC5D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,CACN,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC1C,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAC/C,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IAMxC,OAAO,CACN,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC1C,KAA4B,CAAC,IAAI,KAAK,mBAAmB;QAC1D,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ;QAC5D,OAAQ,KAAuC,CAAC,eAAe;YAC9D,QAAQ;QACT,OAAQ,KAAgC,CAAC,QAAQ,KAAK,QAAQ,CAC9D,CAAC;AACH,CAAC","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"]}
|
|
@@ -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;
|
|
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") ??
|
|
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":"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","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;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands/run.js
CHANGED
|
@@ -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,
|
|
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":"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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 {\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":"
|
|
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>",
|