@evalops/maestro 0.10.17 → 0.10.20
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/README.md +56 -1
- package/dist/agent/action-approval.d.ts +12 -2
- package/dist/agent/action-approval.d.ts.map +1 -1
- package/dist/agent/action-approval.js +19 -32
- package/dist/agent/action-approval.js.map +1 -1
- package/dist/agent/agent.d.ts +1 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +26 -0
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/compaction.d.ts +2 -0
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +4 -2
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/modes.d.ts +56 -4
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +163 -2
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/prompt-recovery.d.ts.map +1 -1
- package/dist/agent/prompt-recovery.js +1 -3
- package/dist/agent/prompt-recovery.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +9 -1
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/codex-app-server.d.ts +12 -0
- package/dist/agent/providers/codex-app-server.d.ts.map +1 -0
- package/dist/agent/providers/codex-app-server.js +788 -0
- package/dist/agent/providers/codex-app-server.js.map +1 -0
- package/dist/agent/providers/google-gemini-cli.js +14 -3
- package/dist/agent/providers/google.js +22 -3
- package/dist/agent/providers/scripted.d.ts +11 -0
- package/dist/agent/providers/scripted.d.ts.map +1 -0
- package/dist/agent/providers/scripted.js +399 -0
- package/dist/agent/providers/scripted.js.map +1 -0
- package/dist/agent/providers/vertex.js +14 -3
- package/dist/agent/scenario-source.d.ts +19 -0
- package/dist/agent/scenario-source.d.ts.map +1 -0
- package/dist/agent/scenario-source.js +112 -0
- package/dist/agent/scenario-source.js.map +1 -0
- package/dist/agent/subagent-specs.d.ts +1 -1
- package/dist/agent/subagent-specs.js +1 -1
- package/dist/agent/subagent-specs.js.map +1 -1
- package/dist/agent/swarm/executor.d.ts +25 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +795 -20
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/runtime-events.d.ts +11 -0
- package/dist/agent/swarm/runtime-events.d.ts.map +1 -0
- package/dist/agent/swarm/runtime-events.js +26 -0
- package/dist/agent/swarm/runtime-events.js.map +1 -0
- package/dist/agent/swarm/types.d.ts +78 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/tracing.d.ts +1 -1
- package/dist/agent/tracing.d.ts.map +1 -1
- package/dist/agent/tracing.js +17 -9
- package/dist/agent/tracing.js.map +1 -1
- package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
- package/dist/agent/transport/create-provider-stream.js +14 -0
- package/dist/agent/transport/create-provider-stream.js.map +1 -1
- package/dist/agent/transport/stable-stringify.d.ts +2 -0
- package/dist/agent/transport/stable-stringify.d.ts.map +1 -0
- package/dist/agent/transport/stable-stringify.js +14 -0
- package/dist/agent/transport/stable-stringify.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +2 -15
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/agent/transport/tool-safety-pipeline.d.ts +5 -1
- package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
- package/dist/agent/transport/tool-safety-pipeline.js +184 -36
- package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
- package/dist/agent/transport.d.ts +8 -0
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +1613 -68
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/types.d.ts +170 -2
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/enterprise-routes.d.ts.map +1 -1
- package/dist/api/enterprise-routes.js +34 -3
- package/dist/api/enterprise-routes.js.map +1 -1
- package/dist/app-server/in-process-client.d.ts +32 -0
- package/dist/app-server/in-process-client.d.ts.map +1 -0
- package/dist/app-server/in-process-client.js +73 -0
- package/dist/app-server/in-process-client.js.map +1 -0
- package/dist/app-server/session-api.d.ts +36 -0
- package/dist/app-server/session-api.d.ts.map +1 -0
- package/dist/app-server/session-api.js +713 -0
- package/dist/app-server/session-api.js.map +1 -0
- package/dist/approvals/platform-action-approval.d.ts +3 -1
- package/dist/approvals/platform-action-approval.d.ts.map +1 -1
- package/dist/approvals/platform-action-approval.js +16 -9
- package/dist/approvals/platform-action-approval.js.map +1 -1
- package/dist/approvals/service-client.d.ts.map +1 -1
- package/dist/approvals/service-client.js +7 -7
- package/dist/approvals/service-client.js.map +1 -1
- package/dist/audit/logger.d.ts +4 -4
- package/dist/bootstrap/agent-creation-setup.d.ts +4 -0
- package/dist/bootstrap/agent-creation-setup.d.ts.map +1 -1
- package/dist/bootstrap/agent-creation-setup.js +3 -1
- package/dist/bootstrap/agent-creation-setup.js.map +1 -1
- package/dist/bootstrap/auth-setup.js +1 -1
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/bootstrap/event-subscriptions-setup.d.ts +6 -0
- package/dist/bootstrap/event-subscriptions-setup.d.ts.map +1 -1
- package/dist/bootstrap/event-subscriptions-setup.js +26 -2
- package/dist/bootstrap/event-subscriptions-setup.js.map +1 -1
- package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
- package/dist/bootstrap/model-resolution-setup.js +4 -1
- package/dist/bootstrap/model-resolution-setup.js.map +1 -1
- package/dist/bootstrap/tools-setup.d.ts +2 -1
- package/dist/bootstrap/tools-setup.d.ts.map +1 -1
- package/dist/bootstrap/tools-setup.js +5 -1
- package/dist/bootstrap/tools-setup.js.map +1 -1
- package/dist/cli/args.d.ts +9 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +130 -5
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts +9 -0
- package/dist/cli/commands/a2a.d.ts.map +1 -0
- package/dist/cli/commands/a2a.js +1714 -0
- package/dist/cli/commands/a2a.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +16 -2
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +223 -35
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/codex.d.ts +1 -1
- package/dist/cli/commands/codex.d.ts.map +1 -1
- package/dist/cli/commands/codex.js +145 -39
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli/commands/context.d.ts +10 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +176 -0
- package/dist/cli/commands/context.js.map +1 -0
- 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 +9 -1
- package/dist/cli/commands/hosted-runner.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +6 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/modes.d.ts +8 -0
- package/dist/cli/commands/modes.d.ts.map +1 -0
- package/dist/cli/commands/modes.js +151 -0
- package/dist/cli/commands/modes.js.map +1 -0
- package/dist/cli/commands/operating-plane.d.ts +14 -0
- package/dist/cli/commands/operating-plane.d.ts.map +1 -0
- package/dist/cli/commands/operating-plane.js +160 -0
- package/dist/cli/commands/operating-plane.js.map +1 -0
- package/dist/cli/commands/run.d.ts +87 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +356 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/scenario.d.ts +7 -0
- package/dist/cli/commands/scenario.d.ts.map +1 -0
- package/dist/cli/commands/scenario.js +195 -0
- package/dist/cli/commands/scenario.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +7 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +286 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/headless-protocol.d.ts +55 -1
- package/dist/cli/headless-protocol.d.ts.map +1 -1
- package/dist/cli/headless-protocol.js +446 -7
- package/dist/cli/headless-protocol.js.map +1 -1
- package/dist/cli/headless-runtime-selection.d.ts +38 -0
- package/dist/cli/headless-runtime-selection.d.ts.map +1 -0
- package/dist/cli/headless-runtime-selection.js +48 -0
- package/dist/cli/headless-runtime-selection.js.map +1 -0
- package/dist/cli/headless.d.ts +5 -1
- package/dist/cli/headless.d.ts.map +1 -1
- package/dist/cli/headless.js +11 -1
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/help.d.ts +3 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +136 -30
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/system-prompt.d.ts +22 -4
- package/dist/cli/system-prompt.d.ts.map +1 -1
- package/dist/cli/system-prompt.js +224 -127
- package/dist/cli/system-prompt.js.map +1 -1
- package/dist/cli-tui/commands/a2a-handlers.d.ts +7 -0
- package/dist/cli-tui/commands/a2a-handlers.d.ts.map +1 -0
- package/dist/cli-tui/commands/a2a-handlers.js +160 -0
- package/dist/cli-tui/commands/a2a-handlers.js.map +1 -0
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +15 -0
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/command-registry-adapter.js +10 -1
- package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -1
- package/dist/cli-tui/commands/handlers/mode-handler.d.ts.map +1 -1
- package/dist/cli-tui/commands/handlers/mode-handler.js +22 -10
- package/dist/cli-tui/commands/handlers/mode-handler.js.map +1 -1
- package/dist/cli-tui/commands/mcp-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/mcp-handlers.js +6 -5
- package/dist/cli-tui/commands/mcp-handlers.js.map +1 -1
- package/dist/cli-tui/commands/types.d.ts +1 -0
- package/dist/cli-tui/commands/types.d.ts.map +1 -1
- package/dist/cli-tui/commands/types.js.map +1 -1
- package/dist/cli-tui/commands/utility-handlers.d.ts +4 -0
- package/dist/cli-tui/commands/utility-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/utility-handlers.js +45 -6
- package/dist/cli-tui/commands/utility-handlers.js.map +1 -1
- package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
- package/dist/cli-tui/run/run-shell-command.js +14 -5
- package/dist/cli-tui/run/run-shell-command.js.map +1 -1
- package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
- package/dist/cli-tui/run/streaming-shell-command.js +14 -5
- package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts +1 -0
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +6 -2
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/command-registry-options.js +5 -0
- package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
- package/dist/cli-tui/utils/commands/review-prompt.d.ts +1 -1
- package/dist/cli-tui/utils/commands/review-prompt.d.ts.map +1 -1
- package/dist/cli-tui/utils/commands/review-prompt.js +8 -3
- package/dist/cli-tui/utils/commands/review-prompt.js.map +1 -1
- package/dist/cli-tui/utils/runtime-badges.d.ts +1 -0
- package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
- package/dist/cli-tui/utils/runtime-badges.js +7 -0
- package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
- package/dist/cli-tui/utils/text-formatting.d.ts +1 -0
- package/dist/cli-tui/utils/text-formatting.d.ts.map +1 -1
- package/dist/cli-tui/utils/text-formatting.js +5 -0
- package/dist/cli-tui/utils/text-formatting.js.map +1 -1
- package/dist/cli.js +49209 -26165
- package/dist/cli.js.map +1 -1
- package/dist/codex/app-server-client.d.ts +139 -0
- package/dist/codex/app-server-client.d.ts.map +1 -0
- package/dist/codex/app-server-client.js +352 -0
- package/dist/codex/app-server-client.js.map +1 -0
- package/dist/codex/compatibility.d.ts +48 -0
- package/dist/codex/compatibility.d.ts.map +1 -0
- package/dist/codex/compatibility.js +344 -0
- package/dist/codex/compatibility.js.map +1 -0
- package/dist/codex/subagent-dispatch-table.d.ts +66 -0
- package/dist/codex/subagent-dispatch-table.d.ts.map +1 -0
- package/dist/codex/subagent-dispatch-table.js +127 -0
- package/dist/codex/subagent-dispatch-table.js.map +1 -0
- package/dist/codex/subagent-workgraph.d.ts +56 -0
- package/dist/codex/subagent-workgraph.d.ts.map +1 -0
- package/dist/codex/subagent-workgraph.js +89 -0
- package/dist/codex/subagent-workgraph.js.map +1 -0
- package/dist/config/constants.d.ts +3 -1
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +9 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/feature-flags.d.ts +10 -1
- package/dist/config/feature-flags.d.ts.map +1 -1
- package/dist/config/feature-flags.js +17 -6
- package/dist/config/feature-flags.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/toml-config.d.ts +32 -0
- package/dist/config/toml-config.d.ts.map +1 -1
- package/dist/config/toml-config.js +152 -43
- package/dist/config/toml-config.js.map +1 -1
- package/dist/connectors/service-client.d.ts.map +1 -1
- package/dist/connectors/service-client.js +4 -7
- package/dist/connectors/service-client.js.map +1 -1
- package/dist/context/manifest-types.d.ts +59 -0
- package/dist/context/manifest-types.d.ts.map +1 -0
- package/dist/context/manifest-types.js +2 -0
- package/dist/context/manifest-types.js.map +1 -0
- package/dist/context/manifest.d.ts +16 -0
- package/dist/context/manifest.d.ts.map +1 -0
- package/dist/context/manifest.js +503 -0
- package/dist/context/manifest.js.map +1 -0
- package/dist/db/schema.d.ts +10 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/evalops/agent-bootstrap.d.ts +1 -0
- package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
- package/dist/evalops/agent-bootstrap.js +41 -1
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/evalops/env-aliases.d.ts +13 -0
- package/dist/evalops/env-aliases.d.ts.map +1 -0
- package/dist/evalops/env-aliases.js +60 -0
- package/dist/evalops/env-aliases.js.map +1 -0
- package/dist/evalops/managed-context.d.ts.map +1 -1
- package/dist/evalops/managed-context.js +28 -62
- package/dist/evalops/managed-context.js.map +1 -1
- package/dist/guardian/config.d.ts.map +1 -1
- package/dist/guardian/config.js +1 -0
- package/dist/guardian/config.js.map +1 -1
- package/dist/guardian/runner.d.ts +2 -0
- package/dist/guardian/runner.d.ts.map +1 -1
- package/dist/guardian/runner.js +105 -2
- package/dist/guardian/runner.js.map +1 -1
- package/dist/guardian/types.d.ts +1 -0
- package/dist/guardian/types.d.ts.map +1 -1
- package/dist/guardian/types.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +267 -55
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +89 -7
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/manager.d.ts +5 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +159 -4
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/platform-plugin.d.ts.map +1 -1
- package/dist/mcp/platform-plugin.js +9 -26
- package/dist/mcp/platform-plugin.js.map +1 -1
- package/dist/mcp/schema.d.ts +15 -0
- package/dist/mcp/schema.d.ts.map +1 -1
- package/dist/mcp/schema.js +24 -0
- package/dist/mcp/schema.js.map +1 -1
- package/dist/mcp/tool-bridge.d.ts +39 -10
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +101 -24
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/mcp/types.d.ts +27 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/mcp/workspace-trust.d.ts +10 -0
- package/dist/mcp/workspace-trust.d.ts.map +1 -0
- package/dist/mcp/workspace-trust.js +295 -0
- package/dist/mcp/workspace-trust.js.map +1 -0
- package/dist/memory/service-client.d.ts +1 -0
- package/dist/memory/service-client.d.ts.map +1 -1
- package/dist/memory/service-client.js +194 -9
- package/dist/memory/service-client.js.map +1 -1
- package/dist/models/builtin.d.ts.map +1 -1
- package/dist/models/builtin.js +66 -25
- package/dist/models/builtin.js.map +1 -1
- package/dist/models/config-loader.d.ts +10 -10
- package/dist/models/config-loader.d.ts.map +1 -1
- package/dist/models/config-loader.js +2 -0
- package/dist/models/config-loader.js.map +1 -1
- package/dist/models/registry.d.ts +1 -0
- package/dist/models/registry.d.ts.map +1 -1
- package/dist/models/registry.js +1 -0
- package/dist/models/registry.js.map +1 -1
- package/dist/oauth/device-identity.d.ts.map +1 -1
- package/dist/oauth/device-identity.js +1 -3
- package/dist/oauth/device-identity.js.map +1 -1
- package/dist/oauth/evalops.d.ts.map +1 -1
- package/dist/oauth/evalops.js +2 -5
- package/dist/oauth/evalops.js.map +1 -1
- package/dist/opentelemetry.d.ts.map +1 -1
- package/dist/opentelemetry.js +12 -12
- package/dist/opentelemetry.js.map +1 -1
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +11 -0
- package/dist/package-version.js.map +1 -0
- package/dist/packages/constants.d.ts +3 -0
- package/dist/packages/constants.d.ts.map +1 -0
- package/dist/packages/constants.js +3 -0
- package/dist/packages/constants.js.map +1 -0
- package/dist/packages/inspection.d.ts.map +1 -1
- package/dist/packages/inspection.js +2 -1
- package/dist/packages/inspection.js.map +1 -1
- package/dist/packages/search.d.ts.map +1 -1
- package/dist/packages/search.js +1 -1
- package/dist/packages/search.js.map +1 -1
- package/dist/platform/a2a-capability-market.d.ts +21 -0
- package/dist/platform/a2a-capability-market.d.ts.map +1 -0
- package/dist/platform/a2a-capability-market.js +176 -0
- package/dist/platform/a2a-capability-market.js.map +1 -0
- package/dist/platform/a2a-client.d.ts +217 -0
- package/dist/platform/a2a-client.d.ts.map +1 -0
- package/dist/platform/a2a-client.js +589 -0
- package/dist/platform/a2a-client.js.map +1 -0
- package/dist/platform/a2a-fleet.d.ts +41 -0
- package/dist/platform/a2a-fleet.d.ts.map +1 -0
- package/dist/platform/a2a-fleet.js +109 -0
- package/dist/platform/a2a-fleet.js.map +1 -0
- package/dist/platform/a2a-maestro-peer.d.ts +20 -0
- package/dist/platform/a2a-maestro-peer.d.ts.map +1 -0
- package/dist/platform/a2a-maestro-peer.js +176 -0
- package/dist/platform/a2a-maestro-peer.js.map +1 -0
- package/dist/platform/a2a-peer-pairing.d.ts +107 -0
- package/dist/platform/a2a-peer-pairing.d.ts.map +1 -0
- package/dist/platform/a2a-peer-pairing.js +489 -0
- package/dist/platform/a2a-peer-pairing.js.map +1 -0
- package/dist/platform/a2a-peer-registry.d.ts +68 -0
- package/dist/platform/a2a-peer-registry.d.ts.map +1 -0
- package/dist/platform/a2a-peer-registry.js +320 -0
- package/dist/platform/a2a-peer-registry.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts +86 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -0
- package/dist/platform/a2a-task-ledger.js +546 -0
- package/dist/platform/a2a-task-ledger.js.map +1 -0
- package/dist/platform/a2a-work-graph.d.ts +43 -0
- package/dist/platform/a2a-work-graph.d.ts.map +1 -0
- package/dist/platform/a2a-work-graph.js +267 -0
- package/dist/platform/a2a-work-graph.js.map +1 -0
- package/dist/platform/agent-registry-client.d.ts +327 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -0
- package/dist/platform/agent-registry-client.js +803 -0
- package/dist/platform/agent-registry-client.js.map +1 -0
- package/dist/platform/agent-runtime-client.d.ts +135 -1
- package/dist/platform/agent-runtime-client.d.ts.map +1 -1
- package/dist/platform/agent-runtime-client.js +467 -10
- package/dist/platform/agent-runtime-client.js.map +1 -1
- package/dist/platform/cerebro-facts-client.d.ts.map +1 -1
- package/dist/platform/cerebro-facts-client.js +4 -7
- package/dist/platform/cerebro-facts-client.js.map +1 -1
- package/dist/platform/client.d.ts +2 -0
- package/dist/platform/client.d.ts.map +1 -1
- package/dist/platform/client.js +7 -14
- package/dist/platform/client.js.map +1 -1
- package/dist/platform/core-services.d.ts +68 -0
- package/dist/platform/core-services.d.ts.map +1 -1
- package/dist/platform/core-services.js +68 -0
- package/dist/platform/core-services.js.map +1 -1
- package/dist/platform/fermata-eval-client.d.ts +195 -0
- package/dist/platform/fermata-eval-client.d.ts.map +1 -0
- package/dist/platform/fermata-eval-client.js +146 -0
- package/dist/platform/fermata-eval-client.js.map +1 -0
- package/dist/platform/fermata-scenario-suite.d.ts +99 -0
- package/dist/platform/fermata-scenario-suite.d.ts.map +1 -0
- package/dist/platform/fermata-scenario-suite.js +459 -0
- package/dist/platform/fermata-scenario-suite.js.map +1 -0
- package/dist/platform/maestro-timeline-client.d.ts.map +1 -1
- package/dist/platform/maestro-timeline-client.js +5 -11
- package/dist/platform/maestro-timeline-client.js.map +1 -1
- package/dist/platform/operating-plane-client.d.ts +156 -0
- package/dist/platform/operating-plane-client.d.ts.map +1 -0
- package/dist/platform/operating-plane-client.js +131 -0
- package/dist/platform/operating-plane-client.js.map +1 -0
- package/dist/platform/operating-plane-summary.d.ts +47 -0
- package/dist/platform/operating-plane-summary.d.ts.map +1 -0
- package/dist/platform/operating-plane-summary.js +209 -0
- package/dist/platform/operating-plane-summary.js.map +1 -0
- package/dist/platform/tool-execution-client.d.ts.map +1 -1
- package/dist/platform/tool-execution-client.js +4 -11
- package/dist/platform/tool-execution-client.js.map +1 -1
- package/dist/prompts/service-client.d.ts.map +1 -1
- package/dist/prompts/service-client.js +3 -5
- package/dist/prompts/service-client.js.map +1 -1
- package/dist/prompts/system-prompt.d.ts +3 -0
- package/dist/prompts/system-prompt.d.ts.map +1 -1
- package/dist/prompts/system-prompt.js +13 -3
- package/dist/prompts/system-prompt.js.map +1 -1
- package/dist/prompts/types.d.ts +2 -0
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/prompts/types.js.map +1 -1
- package/dist/providers/api-keys.d.ts +1 -1
- package/dist/providers/api-keys.d.ts.map +1 -1
- package/dist/providers/api-keys.js +2 -1
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +48 -25
- package/dist/providers/auth.js.map +1 -1
- package/dist/remote-runner/attach-client.d.ts.map +1 -1
- package/dist/remote-runner/attach-client.js +1 -0
- package/dist/remote-runner/attach-client.js.map +1 -1
- package/dist/remote-runner/client.d.ts.map +1 -1
- package/dist/remote-runner/client.js +4 -7
- package/dist/remote-runner/client.js.map +1 -1
- package/dist/rpc/rpc-types.d.ts.map +1 -1
- package/dist/rpc/rpc-types.js +1 -0
- package/dist/rpc/rpc-types.js.map +1 -1
- package/dist/safety/action-firewall.d.ts.map +1 -1
- package/dist/safety/action-firewall.js +69 -6
- package/dist/safety/action-firewall.js.map +1 -1
- package/dist/safety/attack-patterns.d.ts.map +1 -1
- package/dist/safety/attack-patterns.js +31 -14
- package/dist/safety/attack-patterns.js.map +1 -1
- package/dist/safety/bash-parser.d.ts.map +1 -1
- package/dist/safety/bash-parser.js +4 -3
- package/dist/safety/bash-parser.js.map +1 -1
- package/dist/safety/execpolicy.d.ts +15 -3
- package/dist/safety/execpolicy.d.ts.map +1 -1
- package/dist/safety/execpolicy.js +248 -37
- package/dist/safety/execpolicy.js.map +1 -1
- package/dist/safety/governance-service-client.d.ts.map +1 -1
- package/dist/safety/governance-service-client.js +4 -7
- package/dist/safety/governance-service-client.js.map +1 -1
- package/dist/safety/guarded-files.d.ts +34 -0
- package/dist/safety/guarded-files.d.ts.map +1 -0
- package/dist/safety/guarded-files.js +372 -0
- package/dist/safety/guarded-files.js.map +1 -0
- package/dist/safety/loop-detector.d.ts.map +1 -1
- package/dist/safety/loop-detector.js +6 -1
- package/dist/safety/loop-detector.js.map +1 -1
- package/dist/safety/permission-profile.d.ts +47 -0
- package/dist/safety/permission-profile.d.ts.map +1 -0
- package/dist/safety/permission-profile.js +349 -0
- package/dist/safety/permission-profile.js.map +1 -0
- package/dist/safety/safety-middleware.d.ts +5 -1
- package/dist/safety/safety-middleware.d.ts.map +1 -1
- package/dist/safety/safety-middleware.js +3 -2
- package/dist/safety/safety-middleware.js.map +1 -1
- package/dist/safety/suspicious-patterns.d.ts.map +1 -1
- package/dist/safety/suspicious-patterns.js +12 -7
- package/dist/safety/suspicious-patterns.js.map +1 -1
- package/dist/safety/tool-categorization.js +1 -1
- package/dist/safety/tool-categorization.js.map +1 -1
- package/dist/safety/validators/path-policy-validator.d.ts.map +1 -1
- package/dist/safety/validators/path-policy-validator.js +7 -0
- package/dist/safety/validators/path-policy-validator.js.map +1 -1
- package/dist/sandbox/index.d.ts +6 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +30 -4
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/native-sandbox.d.ts +3 -0
- package/dist/sandbox/native-sandbox.d.ts.map +1 -1
- package/dist/sandbox/native-sandbox.js +139 -18
- package/dist/sandbox/native-sandbox.js.map +1 -1
- package/dist/sentry.d.ts +17 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +91 -0
- package/dist/sentry.js.map +1 -0
- package/dist/server/agent-runtime-ledger.d.ts +141 -0
- package/dist/server/agent-runtime-ledger.d.ts.map +1 -0
- package/dist/server/agent-runtime-ledger.js +334 -0
- package/dist/server/agent-runtime-ledger.js.map +1 -0
- package/dist/server/agent-trajectory-inspection.d.ts +104 -0
- package/dist/server/agent-trajectory-inspection.d.ts.map +1 -0
- package/dist/server/agent-trajectory-inspection.js +168 -0
- package/dist/server/agent-trajectory-inspection.js.map +1 -0
- package/dist/server/agent-trajectory-replay.d.ts +56 -0
- package/dist/server/agent-trajectory-replay.d.ts.map +1 -0
- package/dist/server/agent-trajectory-replay.js +214 -0
- package/dist/server/agent-trajectory-replay.js.map +1 -0
- package/dist/server/agent-trajectory-scenarios.d.ts +109 -0
- package/dist/server/agent-trajectory-scenarios.d.ts.map +1 -0
- package/dist/server/agent-trajectory-scenarios.js +822 -0
- package/dist/server/agent-trajectory-scenarios.js.map +1 -0
- package/dist/server/agent-trajectory-scorers.d.ts +61 -0
- package/dist/server/agent-trajectory-scorers.d.ts.map +1 -0
- package/dist/server/agent-trajectory-scorers.js +162 -0
- package/dist/server/agent-trajectory-scorers.js.map +1 -0
- package/dist/server/agent-trajectory-validation.d.ts +7 -0
- package/dist/server/agent-trajectory-validation.d.ts.map +1 -0
- package/dist/server/agent-trajectory-validation.js +101 -0
- package/dist/server/agent-trajectory-validation.js.map +1 -0
- package/dist/server/agent-trajectory.d.ts +50 -0
- package/dist/server/agent-trajectory.d.ts.map +1 -0
- package/dist/server/agent-trajectory.js +159 -0
- package/dist/server/agent-trajectory.js.map +1 -0
- package/dist/server/app-context.d.ts +18 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +64 -27
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/health.d.ts +6 -0
- package/dist/server/handlers/health.d.ts.map +1 -1
- package/dist/server/handlers/health.js +6 -0
- package/dist/server/handlers/health.js.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.d.ts +69 -1
- package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.js +309 -18
- package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.d.ts +16 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.js +43 -0
- package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
- package/dist/server/handlers/mode.d.ts.map +1 -1
- package/dist/server/handlers/mode.js +3 -1
- package/dist/server/handlers/mode.js.map +1 -1
- package/dist/server/handlers/pending-requests.d.ts.map +1 -1
- package/dist/server/handlers/pending-requests.js +336 -51
- package/dist/server/handlers/pending-requests.js.map +1 -1
- package/dist/server/handlers/platform-a2a-push.d.ts +6 -0
- package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -0
- package/dist/server/handlers/platform-a2a-push.js +136 -0
- package/dist/server/handlers/platform-a2a-push.js.map +1 -0
- package/dist/server/handlers/sessions.d.ts.map +1 -1
- package/dist/server/handlers/sessions.js +21 -1
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +9 -2
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +39 -0
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-agent-runtime-progress.d.ts +144 -0
- package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -0
- package/dist/server/hosted-agent-runtime-progress.js +1650 -0
- package/dist/server/hosted-agent-runtime-progress.js.map +1 -0
- package/dist/server/hosted-runner-lease.d.ts +41 -0
- package/dist/server/hosted-runner-lease.d.ts.map +1 -0
- package/dist/server/hosted-runner-lease.js +140 -0
- package/dist/server/hosted-runner-lease.js.map +1 -0
- package/dist/server/hosted-session-manager.d.ts +16 -8
- package/dist/server/hosted-session-manager.d.ts.map +1 -1
- package/dist/server/hosted-session-manager.js +98 -76
- package/dist/server/hosted-session-manager.js.map +1 -1
- package/dist/server/junit-xml.d.ts +2 -0
- package/dist/server/junit-xml.d.ts.map +1 -0
- package/dist/server/junit-xml.js +9 -0
- package/dist/server/junit-xml.js.map +1 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +6 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/server/scenario-recorder.d.ts +56 -0
- package/dist/server/scenario-recorder.d.ts.map +1 -0
- package/dist/server/scenario-recorder.js +109 -0
- package/dist/server/scenario-recorder.js.map +1 -0
- package/dist/server/scripted-scenario-runner.d.ts +46 -0
- package/dist/server/scripted-scenario-runner.d.ts.map +1 -0
- package/dist/server/scripted-scenario-runner.js +190 -0
- package/dist/server/scripted-scenario-runner.js.map +1 -0
- package/dist/server/server-middlewares.d.ts +6 -2
- package/dist/server/server-middlewares.d.ts.map +1 -1
- package/dist/server/server-middlewares.js +8 -2
- package/dist/server/server-middlewares.js.map +1 -1
- package/dist/server/server-request-manager.d.ts +9 -1
- package/dist/server/server-request-manager.d.ts.map +1 -1
- package/dist/server/server-request-manager.js +49 -4
- package/dist/server/server-request-manager.js.map +1 -1
- package/dist/services/intelligent-router/service.d.ts +2 -0
- package/dist/services/intelligent-router/service.d.ts.map +1 -1
- package/dist/services/intelligent-router/service.js +4 -0
- package/dist/services/intelligent-router/service.js.map +1 -1
- package/dist/services/service-authority.d.ts +25 -0
- package/dist/services/service-authority.d.ts.map +1 -0
- package/dist/services/service-authority.js +143 -0
- package/dist/services/service-authority.js.map +1 -0
- package/dist/services/workspace-config/service.d.ts +2 -0
- package/dist/services/workspace-config/service.d.ts.map +1 -1
- package/dist/services/workspace-config/service.js +4 -0
- package/dist/services/workspace-config/service.js.map +1 -1
- package/dist/session/manager.d.ts +8 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +19 -4
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-branch.d.ts.map +1 -1
- package/dist/session/session-branch.js +5 -1
- package/dist/session/session-branch.js.map +1 -1
- package/dist/session/session-catalog.d.ts +7 -2
- package/dist/session/session-catalog.d.ts.map +1 -1
- package/dist/session/session-catalog.js +13 -2
- package/dist/session/session-catalog.js.map +1 -1
- package/dist/session/session-context.d.ts +6 -2
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +44 -4
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/session-graph-projection.d.ts +32 -0
- package/dist/session/session-graph-projection.d.ts.map +1 -0
- package/dist/session/session-graph-projection.js +133 -0
- package/dist/session/session-graph-projection.js.map +1 -0
- package/dist/session/types.d.ts +18 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js +8 -0
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.generated.d.ts +3 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -1
- package/dist/session/wire-format.generated.js +20 -0
- package/dist/session/wire-format.generated.js.map +1 -1
- package/dist/skills/eval-harness.d.ts +38 -0
- package/dist/skills/eval-harness.d.ts.map +1 -0
- package/dist/skills/eval-harness.js +112 -0
- package/dist/skills/eval-harness.js.map +1 -0
- package/dist/skills/index.d.ts +5 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +5 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/linter.d.ts +36 -0
- package/dist/skills/linter.d.ts.map +1 -0
- package/dist/skills/linter.js +398 -0
- package/dist/skills/linter.js.map +1 -0
- package/dist/skills/loader.d.ts +36 -6
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +169 -86
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/package-contract.d.ts +45 -0
- package/dist/skills/package-contract.d.ts.map +1 -0
- package/dist/skills/package-contract.js +153 -0
- package/dist/skills/package-contract.js.map +1 -0
- package/dist/skills/runtime-activation.d.ts +68 -0
- package/dist/skills/runtime-activation.d.ts.map +1 -0
- package/dist/skills/runtime-activation.js +228 -0
- package/dist/skills/runtime-activation.js.map +1 -0
- package/dist/skills/service-client.d.ts.map +1 -1
- package/dist/skills/service-client.js +3 -4
- package/dist/skills/service-client.js.map +1 -1
- package/dist/skills/tool.d.ts.map +1 -1
- package/dist/skills/tool.js +2 -0
- package/dist/skills/tool.js.map +1 -1
- package/dist/skills/types.d.ts +14 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/types.js.map +1 -1
- package/dist/telemetry/agent-operating-plane-context.d.ts +24 -0
- package/dist/telemetry/agent-operating-plane-context.d.ts.map +1 -0
- package/dist/telemetry/agent-operating-plane-context.js +54 -0
- package/dist/telemetry/agent-operating-plane-context.js.map +1 -0
- package/dist/telemetry/beacon.d.ts +24 -0
- package/dist/telemetry/beacon.d.ts.map +1 -0
- package/dist/telemetry/beacon.js +115 -0
- package/dist/telemetry/beacon.js.map +1 -0
- package/dist/telemetry/cli-command-aggregator.d.ts +36 -0
- package/dist/telemetry/cli-command-aggregator.d.ts.map +1 -0
- package/dist/telemetry/cli-command-aggregator.js +251 -0
- package/dist/telemetry/cli-command-aggregator.js.map +1 -0
- package/dist/telemetry/cli-startup.d.ts +21 -0
- package/dist/telemetry/cli-startup.d.ts.map +1 -0
- package/dist/telemetry/cli-startup.js +83 -0
- package/dist/telemetry/cli-startup.js.map +1 -0
- package/dist/telemetry/disablement.d.ts +13 -0
- package/dist/telemetry/disablement.d.ts.map +1 -0
- package/dist/telemetry/disablement.js +19 -0
- package/dist/telemetry/disablement.js.map +1 -0
- package/dist/telemetry/index.d.ts +6 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +6 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +52 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +179 -3
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +3 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +2 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
- package/dist/telemetry/maestro-platform-replay-fixture.js +74 -9
- package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
- package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +1 -1
- package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -1
- package/dist/telemetry/maestro-publisher-conformance-fixture.js +46 -11
- package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -1
- package/dist/telemetry/mcp-beacon.d.ts +20 -0
- package/dist/telemetry/mcp-beacon.d.ts.map +1 -0
- package/dist/telemetry/mcp-beacon.js +54 -0
- package/dist/telemetry/mcp-beacon.js.map +1 -0
- package/dist/telemetry/metadata-normalization.d.ts +7 -0
- package/dist/telemetry/metadata-normalization.d.ts.map +1 -0
- package/dist/telemetry/metadata-normalization.js +189 -0
- package/dist/telemetry/metadata-normalization.js.map +1 -0
- package/dist/telemetry/meter-service-client.d.ts.map +1 -1
- package/dist/telemetry/meter-service-client.js +5 -10
- package/dist/telemetry/meter-service-client.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +123 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +184 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/turn-tracker.d.ts +1 -0
- package/dist/telemetry/turn-tracker.d.ts.map +1 -1
- package/dist/telemetry/turn-tracker.js +22 -1
- package/dist/telemetry/turn-tracker.js.map +1 -1
- package/dist/telemetry/wide-events.d.ts +31 -1
- package/dist/telemetry/wide-events.d.ts.map +1 -1
- package/dist/telemetry/wide-events.js +229 -1
- package/dist/telemetry/wide-events.js.map +1 -1
- package/dist/telemetry.d.ts +39 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +160 -3
- package/dist/telemetry.js.map +1 -1
- package/dist/testing/test-verification-hook.d.ts.map +1 -1
- package/dist/testing/test-verification-hook.js +34 -21
- package/dist/testing/test-verification-hook.js.map +1 -1
- package/dist/tools/apply-patch-parser.d.ts +26 -0
- package/dist/tools/apply-patch-parser.d.ts.map +1 -0
- package/dist/tools/apply-patch-parser.js +146 -0
- package/dist/tools/apply-patch-parser.js.map +1 -0
- package/dist/tools/apply-patch.d.ts +42 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +648 -0
- package/dist/tools/apply-patch.js.map +1 -0
- package/dist/tools/ask-user.d.ts +1 -0
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/background/tool-handler.d.ts +1 -0
- package/dist/tools/background/tool-handler.d.ts.map +1 -1
- package/dist/tools/bash.d.ts +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/codesearch.d.ts +1 -0
- package/dist/tools/codesearch.d.ts.map +1 -1
- package/dist/tools/conductor-client.d.ts +1 -0
- package/dist/tools/conductor-client.d.ts.map +1 -1
- package/dist/tools/conductor-client.js +63 -0
- package/dist/tools/conductor-client.js.map +1 -1
- package/dist/tools/diff.d.ts +1 -0
- package/dist/tools/diff.d.ts.map +1 -1
- package/dist/tools/edit.d.ts +1 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/extract-document.d.ts +1 -0
- package/dist/tools/extract-document.d.ts.map +1 -1
- package/dist/tools/find.d.ts +10 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +236 -27
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/gh.d.ts +3 -0
- package/dist/tools/gh.d.ts.map +1 -1
- package/dist/tools/index.d.ts +50 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list.d.ts +1 -0
- package/dist/tools/list.d.ts.map +1 -1
- package/dist/tools/notebook.d.ts +1 -0
- package/dist/tools/notebook.d.ts.map +1 -1
- package/dist/tools/oracle.d.ts +1 -0
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +17 -32
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/parallel-execution.d.ts +13 -2
- package/dist/tools/parallel-execution.d.ts.map +1 -1
- package/dist/tools/parallel-execution.js +178 -7
- package/dist/tools/parallel-execution.js.map +1 -1
- package/dist/tools/parallel-ripgrep.d.ts +1 -0
- package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
- package/dist/tools/pipeline.d.ts +4 -0
- package/dist/tools/pipeline.d.ts.map +1 -1
- package/dist/tools/read.d.ts +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/search.d.ts +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/status.d.ts +1 -0
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/todo.d.ts +1 -0
- package/dist/tools/todo.d.ts.map +1 -1
- package/dist/tools/tool-dsl.d.ts +5 -1
- package/dist/tools/tool-dsl.d.ts.map +1 -1
- package/dist/tools/tool-dsl.js +1 -0
- package/dist/tools/tool-dsl.js.map +1 -1
- package/dist/tools/tool-result-cache.d.ts.map +1 -1
- package/dist/tools/tool-result-cache.js +1 -0
- package/dist/tools/tool-result-cache.js.map +1 -1
- package/dist/tools/typebox-tool.d.ts.map +1 -1
- package/dist/tools/typebox-tool.js +3 -0
- package/dist/tools/typebox-tool.js.map +1 -1
- package/dist/tools/webfetch.d.ts +1 -0
- package/dist/tools/webfetch.d.ts.map +1 -1
- package/dist/tools/websearch.d.ts +1 -0
- package/dist/tools/websearch.d.ts.map +1 -1
- package/dist/tools/write.d.ts +1 -0
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/utils/abort-error.d.ts +2 -0
- package/dist/utils/abort-error.d.ts.map +1 -0
- package/dist/utils/abort-error.js +7 -0
- package/dist/utils/abort-error.js.map +1 -0
- package/dist/utils/downstream.d.ts.map +1 -1
- package/dist/utils/downstream.js +4 -0
- package/dist/utils/downstream.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +14 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path-containment.d.ts +2 -0
- package/dist/utils/path-containment.d.ts.map +1 -0
- package/dist/utils/path-containment.js +14 -0
- package/dist/utils/path-containment.js.map +1 -0
- package/dist/utils/prompt-safe-text.d.ts +7 -0
- package/dist/utils/prompt-safe-text.d.ts.map +1 -0
- package/dist/utils/prompt-safe-text.js +44 -0
- package/dist/utils/prompt-safe-text.js.map +1 -0
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +32 -7
- package/dist/web-server.js.map +1 -1
- package/dist/workspace/root-resolver.d.ts +4 -1
- package/dist/workspace/root-resolver.d.ts.map +1 -1
- package/dist/workspace/root-resolver.js +16 -6
- package/dist/workspace/root-resolver.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts +8 -0
- package/node_modules/@evalops/contracts/dist/advisor-effort.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/advisor-effort.js +35 -0
- package/node_modules/@evalops/contracts/dist/advisor-effort.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts +10 -0
- package/node_modules/@evalops/contracts/dist/delegation-prompt.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/delegation-prompt.js +48 -0
- package/node_modules/@evalops/contracts/dist/delegation-prompt.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts +20 -0
- package/node_modules/@evalops/contracts/dist/guarded-files-settings.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/guarded-files-settings.js +147 -0
- package/node_modules/@evalops/contracts/dist/guarded-files-settings.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts +2 -0
- package/node_modules/@evalops/contracts/dist/headless-protocol-generated.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js +1 -0
- package/node_modules/@evalops/contracts/dist/headless-protocol-generated.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +280 -5
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +36 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/index.d.ts +15 -1
- package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/index.js +6 -0
- package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +593 -0
- package/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/maestro-app-server.js +218 -0
- package/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +91 -0
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +92 -61
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +3 -0
- package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts +28 -0
- package/node_modules/@evalops/contracts/dist/runtime-constraints.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/runtime-constraints.js +71 -0
- package/node_modules/@evalops/contracts/dist/runtime-constraints.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +7 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/runtime-server-request.js +2 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/scenario.d.ts +191 -0
- package/node_modules/@evalops/contracts/dist/scenario.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/scenario.js +4 -0
- package/node_modules/@evalops/contracts/dist/scenario.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/schemas.d.ts +17 -3
- package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/schemas.js +16 -0
- package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
- package/node_modules/@evalops/contracts/package.json +1 -1
- package/node_modules/@evalops/tui/package.json +1 -1
- package/package.json +41 -7
- package/skills/incident-triage/SKILL.md +40 -0
- package/skills/incident-triage/mcp.json +14 -0
- package/skills/incident-triage/reference/triage.md +20 -0
- package/skills/incident-triage/toolbox/incident-timeline +22 -0
- package/skills/incident-triage/toolbox/incident-timeline.cmd +16 -0
- package/skills/pr-review/SKILL.md +40 -0
- package/skills/pr-review/mcp.json +14 -0
- package/skills/pr-review/reference/rubric.md +20 -0
- package/skills/pr-review/toolbox/review-summary +20 -0
- package/skills/pr-review/toolbox/review-summary.cmd +14 -0
- package/skills/release-verification/SKILL.md +40 -0
- package/skills/release-verification/mcp.json +15 -0
- package/skills/release-verification/reference/checklist.md +21 -0
- package/skills/release-verification/toolbox/release-readiness +18 -0
- package/skills/release-verification/toolbox/release-readiness.cmd +12 -0
|
@@ -2,13 +2,16 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { mkdir, realpath, stat, writeFile } from "node:fs/promises";
|
|
3
3
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
|
-
import { HEADLESS_PROTOCOL_VERSION, createHeadlessRuntimeState, } from "../../cli/headless-protocol.js";
|
|
5
|
+
import { CODEX_SUBAGENT_TOOL_PREFIX, CODEX_SUBAGENT_WORK_GRAPH_SCHEMA, HEADLESS_PROTOCOL_VERSION, activeCodexSubagentStatus, buildCodexSubagentContinuityEdges, codexSubagentEdgeKey, codexSubagentOperation, codexSubagentStatusIsTerminal, createHeadlessRuntimeState, stringArray, } from "../../cli/headless-protocol.js";
|
|
6
|
+
import { markHostedRunnerLeaseDraining } from "../hosted-runner-lease.js";
|
|
6
7
|
import { ApiError, readJsonBody, sendJson } from "../server-utils.js";
|
|
7
8
|
const execFileAsync = promisify(execFile);
|
|
8
9
|
export const HOSTED_RUNNER_DRAIN_PATH = "/.well-known/evalops/remote-runner/drain";
|
|
9
10
|
export const HOSTED_RUNNER_DRAIN_PROTOCOL_VERSION = "evalops.remote-runner.drain.v1";
|
|
10
11
|
export const HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION = "evalops.remote-runner.snapshot-manifest.v1";
|
|
11
12
|
export const HOSTED_RUNNER_RETENTION_POLICY_VERSION = "evalops.remote-runner.retention.v1";
|
|
13
|
+
export const HOSTED_RUNNER_WORK_CONTINUITY_VERSION = "evalops.remote-runner.work-continuity.v1";
|
|
14
|
+
export const HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION = "evalops.remote-runner.platform-evidence.v1";
|
|
12
15
|
export var HostedRunnerDrainStatusValue;
|
|
13
16
|
(function (HostedRunnerDrainStatusValue) {
|
|
14
17
|
HostedRunnerDrainStatusValue["Drained"] = "drained";
|
|
@@ -40,6 +43,18 @@ export var HostedRunnerDrainRequestedByValue;
|
|
|
40
43
|
HostedRunnerDrainRequestedByValue["KubernetesPreStop"] = "kubernetes_prestop";
|
|
41
44
|
HostedRunnerDrainRequestedByValue["MaestroWebServer"] = "maestro_web_server";
|
|
42
45
|
})(HostedRunnerDrainRequestedByValue || (HostedRunnerDrainRequestedByValue = {}));
|
|
46
|
+
class HostedRunnerRuntimeDrainError extends Error {
|
|
47
|
+
constructor(message, runtime) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.name = "HostedRunnerRuntimeDrainError";
|
|
50
|
+
this.sessionId = runtime.sessionId;
|
|
51
|
+
this.sessionFile = runtime.sessionFile;
|
|
52
|
+
this.protocolVersion = runtime.protocolVersion;
|
|
53
|
+
this.cursor = runtime.cursor;
|
|
54
|
+
this.snapshot = runtime.snapshot;
|
|
55
|
+
this.recordPlatformDrain = runtime.recordPlatformDrain;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
43
58
|
function getString(value, field) {
|
|
44
59
|
if (value === undefined || value === null) {
|
|
45
60
|
return undefined;
|
|
@@ -222,15 +237,198 @@ function buildHostedRunnerRetentionPolicy() {
|
|
|
222
237
|
},
|
|
223
238
|
};
|
|
224
239
|
}
|
|
240
|
+
function buildHostedRunnerPlatformEvidence(input) {
|
|
241
|
+
const edges = input.workContinuity.codex_subagent_edges ?? [];
|
|
242
|
+
return {
|
|
243
|
+
protocol_version: HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION,
|
|
244
|
+
event_type: "hosted_runner_drain_manifest_recorded",
|
|
245
|
+
runner_session_id: input.hostedRunner.runnerSessionId,
|
|
246
|
+
...(input.hostedRunner.workspaceId
|
|
247
|
+
? { workspace_id: input.hostedRunner.workspaceId }
|
|
248
|
+
: {}),
|
|
249
|
+
...(input.hostedRunner.agentRunId
|
|
250
|
+
? { agent_run_id: input.hostedRunner.agentRunId }
|
|
251
|
+
: {}),
|
|
252
|
+
maestro_session_id: input.maestroSessionId,
|
|
253
|
+
status: input.status,
|
|
254
|
+
runtime_flush_status: input.runtime.flush_status,
|
|
255
|
+
manifest_path: input.manifestPath,
|
|
256
|
+
manifest_protocol_version: HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION,
|
|
257
|
+
created_at: input.createdAt,
|
|
258
|
+
...(input.reason ? { reason: input.reason } : {}),
|
|
259
|
+
...(input.requestedBy ? { requested_by: input.requestedBy } : {}),
|
|
260
|
+
work_continuity: {
|
|
261
|
+
protocol_version: input.workContinuity.protocol_version,
|
|
262
|
+
codex_subagent_schema_version: input.workContinuity.codex_subagent_schema_version,
|
|
263
|
+
active_tool_count: input.workContinuity.active_tool_count,
|
|
264
|
+
tracked_tool_count: input.workContinuity.tracked_tool_count,
|
|
265
|
+
pending_request_count: input.workContinuity.pending_request_count,
|
|
266
|
+
codex_subagent_tool_call_count: input.workContinuity.codex_subagent_tool_call_ids.length,
|
|
267
|
+
codex_subagent_child_run_count: input.workContinuity.codex_subagent_child_run_ids.length,
|
|
268
|
+
codex_subagent_thread_count: input.workContinuity.codex_subagent_thread_ids.length,
|
|
269
|
+
codex_subagent_edge_count: edges.length,
|
|
270
|
+
codex_subagent_tool_call_ids: input.workContinuity.codex_subagent_tool_call_ids,
|
|
271
|
+
codex_subagent_child_run_ids: input.workContinuity.codex_subagent_child_run_ids,
|
|
272
|
+
codex_subagent_thread_ids: input.workContinuity.codex_subagent_thread_ids,
|
|
273
|
+
...(edges.length > 0 ? { codex_subagent_edges: edges } : {}),
|
|
274
|
+
},
|
|
275
|
+
retention: {
|
|
276
|
+
policy_version: input.retentionPolicy.policy_version,
|
|
277
|
+
control_plane_metadata_visibility: input.retentionPolicy.visibility.control_plane_metadata,
|
|
278
|
+
runtime_snapshot_visibility: input.retentionPolicy.visibility.runtime_snapshot,
|
|
279
|
+
redaction_required_before_external_persistence: input.retentionPolicy.redaction.required_before_external_persistence,
|
|
280
|
+
},
|
|
281
|
+
evidence_refs: [
|
|
282
|
+
`remote-runner://sessions/${input.hostedRunner.runnerSessionId}/drain#manifest`,
|
|
283
|
+
`maestro://headless/sessions/${input.maestroSessionId}#drain`,
|
|
284
|
+
...(input.hostedRunner.agentRunId
|
|
285
|
+
? [`platform-agent-run:${input.hostedRunner.agentRunId}`]
|
|
286
|
+
: []),
|
|
287
|
+
],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function isRecord(value) {
|
|
291
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
292
|
+
}
|
|
293
|
+
function collectCodexSubagentEdgesFromSource(source, edges) {
|
|
294
|
+
const operation = codexSubagentOperation(source.tool);
|
|
295
|
+
if (!operation) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const status = activeCodexSubagentStatus(operation);
|
|
299
|
+
for (const edge of buildCodexSubagentContinuityEdges({
|
|
300
|
+
call_id: source.call_id,
|
|
301
|
+
tool_execution_id: source.tool_execution_id,
|
|
302
|
+
tool: source.tool,
|
|
303
|
+
args: source.args,
|
|
304
|
+
status,
|
|
305
|
+
})) {
|
|
306
|
+
edges.set(codexSubagentEdgeKey(edge), edge);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function collectCodexWorkArgs(args, childRunIds, threadIds, includeLooseArgs = false) {
|
|
310
|
+
if (!isRecord(args)) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
const graph = args.codexWorkGraph ?? args.codex_work_graph;
|
|
314
|
+
const hasCodexGraph = isRecord(graph) &&
|
|
315
|
+
(graph.schemaVersion === CODEX_SUBAGENT_WORK_GRAPH_SCHEMA ||
|
|
316
|
+
graph.schema_version === CODEX_SUBAGENT_WORK_GRAPH_SCHEMA);
|
|
317
|
+
if (!includeLooseArgs && !hasCodexGraph) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
for (const childRunId of stringArray(args.childRunIds ?? args.child_run_ids)) {
|
|
321
|
+
childRunIds.add(childRunId);
|
|
322
|
+
}
|
|
323
|
+
for (const threadId of stringArray(args.receiverThreadIds ?? args.receiver_thread_ids)) {
|
|
324
|
+
threadIds.add(threadId);
|
|
325
|
+
}
|
|
326
|
+
if (isRecord(graph)) {
|
|
327
|
+
const graphChildRuns = graph.childRuns ?? graph.child_runs;
|
|
328
|
+
for (const childRun of Array.isArray(graphChildRuns)
|
|
329
|
+
? graphChildRuns
|
|
330
|
+
: []) {
|
|
331
|
+
if (!isRecord(childRun)) {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const childRunId = childRun.childRunId ?? childRun.child_run_id;
|
|
335
|
+
if (typeof childRunId === "string" && childRunId) {
|
|
336
|
+
childRunIds.add(childRunId);
|
|
337
|
+
}
|
|
338
|
+
const threadId = childRun.threadId ?? childRun.thread_id;
|
|
339
|
+
if (typeof threadId === "string" && threadId) {
|
|
340
|
+
threadIds.add(threadId);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return includeLooseArgs || hasCodexGraph;
|
|
345
|
+
}
|
|
346
|
+
function collectHostedRunnerWorkContinuity(snapshot) {
|
|
347
|
+
const state = snapshot.state;
|
|
348
|
+
const codexToolCallIds = new Set();
|
|
349
|
+
const childRunIds = new Set();
|
|
350
|
+
const threadIds = new Set();
|
|
351
|
+
const codexSubagentEdges = new Map();
|
|
352
|
+
for (const edge of state.codex_subagent_edges ?? []) {
|
|
353
|
+
codexSubagentEdges.set(codexSubagentEdgeKey(edge), edge);
|
|
354
|
+
if (edge.spawn_tool_call_id) {
|
|
355
|
+
codexToolCallIds.add(edge.spawn_tool_call_id);
|
|
356
|
+
}
|
|
357
|
+
if (edge.wait_tool_call_id) {
|
|
358
|
+
codexToolCallIds.add(edge.wait_tool_call_id);
|
|
359
|
+
}
|
|
360
|
+
if (edge.child_run_id) {
|
|
361
|
+
childRunIds.add(edge.child_run_id);
|
|
362
|
+
}
|
|
363
|
+
if (edge.thread_id) {
|
|
364
|
+
threadIds.add(edge.thread_id);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const trackedSources = [
|
|
368
|
+
...state.tracked_tools,
|
|
369
|
+
...state.pending_approvals,
|
|
370
|
+
...state.pending_client_tools,
|
|
371
|
+
...state.pending_mcp_elicitations,
|
|
372
|
+
...state.pending_user_inputs,
|
|
373
|
+
...state.pending_tool_retries,
|
|
374
|
+
];
|
|
375
|
+
const codexTrackedSourceCallIds = new Set();
|
|
376
|
+
for (const source of trackedSources) {
|
|
377
|
+
const tool = source.tool;
|
|
378
|
+
const isCodexSubagentTool = tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX);
|
|
379
|
+
const hasCodexWorkArgs = collectCodexWorkArgs(source.args, childRunIds, threadIds, isCodexSubagentTool);
|
|
380
|
+
if (isCodexSubagentTool || hasCodexWorkArgs) {
|
|
381
|
+
codexTrackedSourceCallIds.add(source.call_id);
|
|
382
|
+
codexToolCallIds.add(source.call_id);
|
|
383
|
+
collectCodexSubagentEdgesFromSource(source, codexSubagentEdges);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
for (const activeTool of state.active_tools) {
|
|
387
|
+
if (activeTool.tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX)) {
|
|
388
|
+
const hasTrackedSource = codexToolCallIds.has(activeTool.call_id);
|
|
389
|
+
codexToolCallIds.add(activeTool.call_id);
|
|
390
|
+
if (!hasTrackedSource) {
|
|
391
|
+
collectCodexSubagentEdgesFromSource({ call_id: activeTool.call_id, tool: activeTool.tool }, codexSubagentEdges);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
const sortedEdges = [...codexSubagentEdges.values()].sort((left, right) => codexSubagentEdgeKey(left).localeCompare(codexSubagentEdgeKey(right)));
|
|
396
|
+
const activeCodexSubagentEdgeCount = sortedEdges.filter((edge) => !codexSubagentStatusIsTerminal(edge.status)).length;
|
|
397
|
+
const nonCodexActiveToolCount = state.active_tools.filter((tool) => !tool.tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX)).length;
|
|
398
|
+
const nonCodexTrackedToolCount = state.tracked_tools.filter((tool) => !codexTrackedSourceCallIds.has(tool.call_id)).length;
|
|
399
|
+
const trackedCodexSubagentCount = Math.max(codexToolCallIds.size, sortedEdges.length);
|
|
400
|
+
return {
|
|
401
|
+
protocol_version: HOSTED_RUNNER_WORK_CONTINUITY_VERSION,
|
|
402
|
+
codex_subagent_schema_version: CODEX_SUBAGENT_WORK_GRAPH_SCHEMA,
|
|
403
|
+
active_tool_count: sortedEdges.length > 0
|
|
404
|
+
? nonCodexActiveToolCount + activeCodexSubagentEdgeCount
|
|
405
|
+
: state.active_tools.length,
|
|
406
|
+
tracked_tool_count: sortedEdges.length > 0
|
|
407
|
+
? nonCodexTrackedToolCount + trackedCodexSubagentCount
|
|
408
|
+
: state.tracked_tools.length,
|
|
409
|
+
pending_request_count: state.pending_approvals.length +
|
|
410
|
+
state.pending_client_tools.length +
|
|
411
|
+
state.pending_mcp_elicitations.length +
|
|
412
|
+
state.pending_user_inputs.length +
|
|
413
|
+
state.pending_tool_retries.length,
|
|
414
|
+
codex_subagent_tool_call_ids: [...codexToolCallIds].sort(),
|
|
415
|
+
codex_subagent_child_run_ids: [...childRunIds].sort(),
|
|
416
|
+
codex_subagent_thread_ids: [...threadIds].sort(),
|
|
417
|
+
...(sortedEdges.length > 0 ? { codex_subagent_edges: sortedEdges } : {}),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
225
420
|
export async function drainHostedRunner(input, options) {
|
|
226
421
|
const hostedRunner = options.hostedRunner;
|
|
227
422
|
if (!hostedRunner?.enabled || !hostedRunner.runnerSessionId) {
|
|
228
423
|
return null;
|
|
229
424
|
}
|
|
230
|
-
|
|
231
|
-
|
|
425
|
+
const requestedAtDate = options.now?.() ?? new Date();
|
|
426
|
+
markHostedRunnerLeaseDraining(hostedRunner, requestedAtDate);
|
|
427
|
+
const requestedAt = requestedAtDate.toISOString();
|
|
232
428
|
const workspaceRoot = await resolveWorkspaceRoot(hostedRunner);
|
|
233
429
|
const snapshotRoot = resolve(workspaceRoot, hostedRunner.snapshotRoot ?? ".maestro/runner-snapshots");
|
|
430
|
+
await mkdir(snapshotRoot, { recursive: true });
|
|
431
|
+
const snapshotPath = join(snapshotRoot, safeManifestFileName(hostedRunner.runnerSessionId, requestedAt));
|
|
234
432
|
const exportPaths = await resolveWorkspaceExportPaths(workspaceRoot, input.exportPaths);
|
|
235
433
|
const activeSessionId = hostedRunner.activeMaestroSessionId ??
|
|
236
434
|
hostedRunner.configuredMaestroSessionId;
|
|
@@ -241,9 +439,14 @@ export async function drainHostedRunner(input, options) {
|
|
|
241
439
|
session_id: maestroSessionId,
|
|
242
440
|
};
|
|
243
441
|
let runtimeSnapshot;
|
|
442
|
+
let recordPlatformDrain;
|
|
244
443
|
if (activeSessionId && options.drainRuntime) {
|
|
245
444
|
try {
|
|
246
|
-
const runtimeResult = await options.drainRuntime(activeSessionId
|
|
445
|
+
const runtimeResult = await options.drainRuntime(activeSessionId, {
|
|
446
|
+
reason: input.reason,
|
|
447
|
+
requestedBy: input.requestedBy,
|
|
448
|
+
manifestPath: snapshotPath,
|
|
449
|
+
});
|
|
247
450
|
const runtimeProtocolVersion = runtimeResult?.protocolVersion ??
|
|
248
451
|
runtimeResult?.snapshot?.protocolVersion;
|
|
249
452
|
const runtimeCursor = runtimeResult?.cursor ?? runtimeResult?.snapshot?.cursor;
|
|
@@ -264,21 +467,46 @@ export async function drainHostedRunner(input, options) {
|
|
|
264
467
|
session_id: activeSessionId,
|
|
265
468
|
};
|
|
266
469
|
runtimeSnapshot = runtimeResult?.snapshot;
|
|
470
|
+
recordPlatformDrain = runtimeResult?.recordPlatformDrain;
|
|
267
471
|
}
|
|
268
472
|
catch (error) {
|
|
269
473
|
status = HostedRunnerDrainStatusValue.Interrupted;
|
|
474
|
+
const interruptedRuntime = error instanceof HostedRunnerRuntimeDrainError ? error : undefined;
|
|
475
|
+
runtimeSnapshot = interruptedRuntime?.snapshot;
|
|
476
|
+
recordPlatformDrain = interruptedRuntime?.recordPlatformDrain;
|
|
270
477
|
runtime = {
|
|
271
478
|
flush_status: HostedRunnerRuntimeFlushStatusValue.Failed,
|
|
272
|
-
session_id: activeSessionId,
|
|
479
|
+
session_id: interruptedRuntime?.sessionId ?? activeSessionId,
|
|
480
|
+
...(interruptedRuntime?.sessionFile
|
|
481
|
+
? { session_file: interruptedRuntime.sessionFile }
|
|
482
|
+
: {}),
|
|
483
|
+
...(interruptedRuntime?.protocolVersion
|
|
484
|
+
? { protocol_version: interruptedRuntime.protocolVersion }
|
|
485
|
+
: {}),
|
|
486
|
+
...(interruptedRuntime?.cursor !== undefined
|
|
487
|
+
? { cursor: interruptedRuntime.cursor }
|
|
488
|
+
: {}),
|
|
273
489
|
error: error instanceof Error ? error.message : String(error),
|
|
274
490
|
};
|
|
275
491
|
}
|
|
276
492
|
}
|
|
277
|
-
await mkdir(snapshotRoot, { recursive: true });
|
|
278
|
-
const snapshotPath = join(snapshotRoot, safeManifestFileName(hostedRunner.runnerSessionId, requestedAt));
|
|
279
493
|
const git = await collectGitState(workspaceRoot);
|
|
280
494
|
const snapshot = runtimeSnapshot ??
|
|
281
495
|
buildHostedRunnerSnapshot(maestroSessionId, workspaceRoot, runtime);
|
|
496
|
+
const workContinuity = collectHostedRunnerWorkContinuity(snapshot);
|
|
497
|
+
const retentionPolicy = buildHostedRunnerRetentionPolicy();
|
|
498
|
+
const platformEvidence = buildHostedRunnerPlatformEvidence({
|
|
499
|
+
hostedRunner,
|
|
500
|
+
status,
|
|
501
|
+
maestroSessionId,
|
|
502
|
+
createdAt: requestedAt,
|
|
503
|
+
manifestPath: snapshotPath,
|
|
504
|
+
runtime,
|
|
505
|
+
workContinuity,
|
|
506
|
+
retentionPolicy,
|
|
507
|
+
reason: input.reason,
|
|
508
|
+
requestedBy: input.requestedBy,
|
|
509
|
+
});
|
|
282
510
|
const manifest = {
|
|
283
511
|
protocol_version: HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION,
|
|
284
512
|
runner_session_id: hostedRunner.runnerSessionId,
|
|
@@ -298,18 +526,55 @@ export async function drainHostedRunner(input, options) {
|
|
|
298
526
|
mode: HostedRunnerWorkspaceExportModeValue.LocalPathContract,
|
|
299
527
|
paths: exportPaths,
|
|
300
528
|
},
|
|
529
|
+
work_continuity: workContinuity,
|
|
530
|
+
platform_evidence: platformEvidence,
|
|
301
531
|
snapshot,
|
|
302
|
-
retention_policy:
|
|
532
|
+
retention_policy: retentionPolicy,
|
|
303
533
|
...(git ? { git } : {}),
|
|
304
534
|
};
|
|
305
|
-
|
|
306
|
-
|
|
535
|
+
try {
|
|
536
|
+
await writeFile(snapshotPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
537
|
+
hostedRunner.lastDrain = {
|
|
538
|
+
status,
|
|
539
|
+
manifestPath: snapshotPath,
|
|
540
|
+
drainedAt: requestedAt,
|
|
541
|
+
...(input.reason ? { reason: input.reason } : {}),
|
|
542
|
+
...(input.requestedBy ? { requestedBy: input.requestedBy } : {}),
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
catch (error) {
|
|
546
|
+
const errorMessage = `Hosted runner drain manifest persistence failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
547
|
+
await recordPlatformDrain?.({
|
|
548
|
+
status: HostedRunnerDrainStatusValue.Interrupted,
|
|
549
|
+
reason: input.reason,
|
|
550
|
+
requestedBy: input.requestedBy,
|
|
551
|
+
flushStatus: runtime.flush_status,
|
|
552
|
+
manifestPath: snapshotPath,
|
|
553
|
+
platformEvidence: buildHostedRunnerPlatformEvidence({
|
|
554
|
+
hostedRunner,
|
|
555
|
+
status: HostedRunnerDrainStatusValue.Interrupted,
|
|
556
|
+
maestroSessionId,
|
|
557
|
+
createdAt: requestedAt,
|
|
558
|
+
manifestPath: snapshotPath,
|
|
559
|
+
runtime,
|
|
560
|
+
workContinuity,
|
|
561
|
+
retentionPolicy,
|
|
562
|
+
reason: input.reason,
|
|
563
|
+
requestedBy: input.requestedBy,
|
|
564
|
+
}),
|
|
565
|
+
errorMessage,
|
|
566
|
+
});
|
|
567
|
+
throw error;
|
|
568
|
+
}
|
|
569
|
+
await recordPlatformDrain?.({
|
|
307
570
|
status,
|
|
571
|
+
reason: input.reason,
|
|
572
|
+
requestedBy: input.requestedBy,
|
|
573
|
+
flushStatus: runtime.flush_status,
|
|
308
574
|
manifestPath: snapshotPath,
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
};
|
|
575
|
+
platformEvidence,
|
|
576
|
+
errorMessage: runtime.error,
|
|
577
|
+
});
|
|
313
578
|
return {
|
|
314
579
|
status,
|
|
315
580
|
runner_session_id: hostedRunner.runnerSessionId,
|
|
@@ -319,20 +584,46 @@ export async function drainHostedRunner(input, options) {
|
|
|
319
584
|
manifest,
|
|
320
585
|
};
|
|
321
586
|
}
|
|
322
|
-
async function drainActiveRuntime(context, sessionId) {
|
|
587
|
+
async function drainActiveRuntime(context, sessionId, _terminal) {
|
|
323
588
|
const runtime = context.headlessRuntimeService.getRuntimeBySessionId(sessionId);
|
|
324
589
|
if (!runtime) {
|
|
325
590
|
return null;
|
|
326
591
|
}
|
|
327
592
|
const snapshot = runtime.getSnapshot();
|
|
328
593
|
const sessionFile = runtime.getSessionFile();
|
|
329
|
-
|
|
594
|
+
const recordPlatformDrain = async (input) => {
|
|
595
|
+
await runtime.recordHostedAgentRuntimeDrain({
|
|
596
|
+
status: input.status,
|
|
597
|
+
reason: input.reason,
|
|
598
|
+
requestedBy: input.requestedBy,
|
|
599
|
+
flushStatus: input.flushStatus,
|
|
600
|
+
manifestPath: input.manifestPath,
|
|
601
|
+
platformEvidence: input.platformEvidence,
|
|
602
|
+
errorMessage: input.errorMessage
|
|
603
|
+
? `Hosted runner drain failed: ${input.errorMessage}`
|
|
604
|
+
: undefined,
|
|
605
|
+
});
|
|
606
|
+
};
|
|
607
|
+
try {
|
|
608
|
+
await runtime.dispose();
|
|
609
|
+
}
|
|
610
|
+
catch (error) {
|
|
611
|
+
throw new HostedRunnerRuntimeDrainError(error instanceof Error ? error.message : String(error), {
|
|
612
|
+
sessionId: snapshot.session_id,
|
|
613
|
+
sessionFile,
|
|
614
|
+
protocolVersion: snapshot.protocolVersion,
|
|
615
|
+
cursor: snapshot.cursor,
|
|
616
|
+
snapshot,
|
|
617
|
+
recordPlatformDrain,
|
|
618
|
+
});
|
|
619
|
+
}
|
|
330
620
|
return {
|
|
331
621
|
sessionId: snapshot.session_id,
|
|
332
622
|
sessionFile,
|
|
333
623
|
protocolVersion: snapshot.protocolVersion,
|
|
334
624
|
cursor: snapshot.cursor,
|
|
335
625
|
snapshot,
|
|
626
|
+
recordPlatformDrain,
|
|
336
627
|
};
|
|
337
628
|
}
|
|
338
629
|
export async function drainHostedRunnerForShutdown(context, options = {}) {
|
|
@@ -342,7 +633,7 @@ export async function drainHostedRunnerForShutdown(context, options = {}) {
|
|
|
342
633
|
HostedRunnerDrainRequestedByValue.MaestroWebServer,
|
|
343
634
|
}, {
|
|
344
635
|
hostedRunner: context.hostedRunner,
|
|
345
|
-
drainRuntime: (sessionId) => drainActiveRuntime(context, sessionId),
|
|
636
|
+
drainRuntime: (sessionId, terminal) => drainActiveRuntime(context, sessionId, terminal),
|
|
346
637
|
now: options.now,
|
|
347
638
|
});
|
|
348
639
|
}
|
|
@@ -352,7 +643,7 @@ export async function handleHostedRunnerDrain(req, res, context) {
|
|
|
352
643
|
const input = parseHostedRunnerDrainInput(body);
|
|
353
644
|
const result = await drainHostedRunner(input, {
|
|
354
645
|
hostedRunner: context.hostedRunner,
|
|
355
|
-
drainRuntime: (sessionId) => drainActiveRuntime(context, sessionId),
|
|
646
|
+
drainRuntime: (sessionId, terminal) => drainActiveRuntime(context, sessionId, terminal),
|
|
356
647
|
});
|
|
357
648
|
if (!result) {
|
|
358
649
|
sendJson(res, 404, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-runner-drain.js","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-drain.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { mkdir, realpath, stat, writeFile } from \"node:fs/promises\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n\tHEADLESS_PROTOCOL_VERSION,\n\tcreateHeadlessRuntimeState,\n} from \"../../cli/headless-protocol.js\";\nimport type { HostedRunnerContext, WebServerContext } from \"../app-context.js\";\nimport type { HeadlessRuntimeSnapshot } from \"../headless-runtime-service.js\";\nimport { ApiError, readJsonBody, sendJson } from \"../server-utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const HOSTED_RUNNER_DRAIN_PATH =\n\t\"/.well-known/evalops/remote-runner/drain\";\n\nexport const HOSTED_RUNNER_DRAIN_PROTOCOL_VERSION =\n\t\"evalops.remote-runner.drain.v1\";\n\nexport const HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION =\n\t\"evalops.remote-runner.snapshot-manifest.v1\";\n\nexport const HOSTED_RUNNER_RETENTION_POLICY_VERSION =\n\t\"evalops.remote-runner.retention.v1\";\n\nexport enum HostedRunnerDrainStatusValue {\n\tDrained = \"drained\",\n\tInterrupted = \"interrupted\",\n}\n\nexport enum HostedRunnerRuntimeFlushStatusValue {\n\tCompleted = \"completed\",\n\tFailed = \"failed\",\n\tSkipped = \"skipped\",\n}\n\nexport enum HostedRunnerWorkspaceExportPathTypeValue {\n\tFile = \"file\",\n\tDirectory = \"directory\",\n\tOther = \"other\",\n}\n\nexport enum HostedRunnerWorkspaceExportModeValue {\n\tLocalPathContract = \"local_path_contract\",\n}\n\nexport enum HostedRunnerDrainReasonValue {\n\tKubernetesPreStop = \"kubernetes_prestop\",\n\tProcessShutdown = \"process_shutdown\",\n}\n\nexport enum HostedRunnerDrainRequestedByValue {\n\tKubernetesPreStop = \"kubernetes_prestop\",\n\tMaestroWebServer = \"maestro_web_server\",\n}\n\nexport type HostedRunnerDrainStatus = HostedRunnerDrainStatusValue;\nexport type HostedRunnerRuntimeFlushStatus =\n\tHostedRunnerRuntimeFlushStatusValue;\nexport type HostedRunnerWorkspaceExportPathType =\n\tHostedRunnerWorkspaceExportPathTypeValue;\nexport type HostedRunnerWorkspaceExportMode =\n\tHostedRunnerWorkspaceExportModeValue;\nexport type HostedRunnerDrainReason = HostedRunnerDrainReasonValue | string;\nexport type HostedRunnerDrainRequestedBy =\n\t| HostedRunnerDrainRequestedByValue\n\t| string;\n\nexport interface HostedRunnerRetentionPolicy {\n\tpolicy_version: typeof HOSTED_RUNNER_RETENTION_POLICY_VERSION;\n\tmanaged_by: \"platform\";\n\tvisibility: {\n\t\tcontrol_plane_metadata: \"operator\";\n\t\tworkspace_export: \"tenant\";\n\t\truntime_snapshot: \"internal\";\n\t\truntime_logs: \"operator\";\n\t};\n\tredaction: {\n\t\trequired_before_external_persistence: Array<\n\t\t\t\"runtime_snapshot\" | \"runtime_logs\"\n\t\t>;\n\t\tforbidden_plaintext: Array<\n\t\t\t| \"provider_credentials\"\n\t\t\t| \"tool_secrets\"\n\t\t\t| \"attach_tokens\"\n\t\t\t| \"artifact_access_tokens\"\n\t\t\t| \"raw_environment\"\n\t\t>;\n\t};\n}\n\nexport interface HostedRunnerDrainInput {\n\treason?: HostedRunnerDrainReason;\n\trequestedBy?: HostedRunnerDrainRequestedBy;\n\texportPaths?: string[];\n}\n\nexport interface HostedRunnerRuntimeDrainResult {\n\tsessionId: string;\n\tsessionFile?: string;\n\tprotocolVersion?: string;\n\tcursor?: number;\n\tsnapshot?: HeadlessRuntimeSnapshot;\n}\n\nexport interface HostedRunnerWorkspaceExportPath {\n\tinput: string;\n\tpath: string;\n\trelative_path: string;\n\ttype: HostedRunnerWorkspaceExportPathType;\n}\n\nexport interface HostedRunnerSnapshotManifest {\n\tprotocol_version: typeof HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION;\n\trunner_session_id: string;\n\tworkspace_id?: string;\n\tagent_run_id?: string;\n\tmaestro_session_id: string;\n\treason?: string;\n\trequested_by?: string;\n\tcreated_at: string;\n\tworkspace_root: string;\n\truntime: {\n\t\tflush_status: HostedRunnerRuntimeFlushStatus;\n\t\terror?: string;\n\t\tsession_id: string;\n\t\tsession_file?: string;\n\t\tprotocol_version?: string;\n\t\tcursor?: number;\n\t};\n\tworkspace_export: {\n\t\tmode: HostedRunnerWorkspaceExportMode;\n\t\tpaths: HostedRunnerWorkspaceExportPath[];\n\t};\n\tsnapshot: HeadlessRuntimeSnapshot;\n\tretention_policy: HostedRunnerRetentionPolicy;\n\tgit?: {\n\t\tcommit?: string;\n\t\tbranch?: string;\n\t\tdirty?: boolean;\n\t};\n}\n\nexport interface HostedRunnerDrainResult {\n\tstatus: HostedRunnerDrainStatus;\n\trunner_session_id: string;\n\treason?: string;\n\trequested_by?: string;\n\tmanifest_path: string;\n\tmanifest: HostedRunnerSnapshotManifest;\n}\n\nexport interface DrainHostedRunnerOptions {\n\thostedRunner?: HostedRunnerContext;\n\tdrainRuntime?: (\n\t\tsessionId: string,\n\t) => Promise<HostedRunnerRuntimeDrainResult | null>;\n\tnow?: () => Date;\n}\n\ninterface HostedRunnerDrainRuntimeContext {\n\thostedRunner?: HostedRunnerContext;\n\theadlessRuntimeService: Pick<\n\t\tWebServerContext[\"headlessRuntimeService\"],\n\t\t\"getRuntimeBySessionId\"\n\t>;\n}\n\nexport interface DrainHostedRunnerForShutdownOptions {\n\tnow?: () => Date;\n\treason?: HostedRunnerDrainReason;\n\trequestedBy?: HostedRunnerDrainRequestedBy;\n}\n\nfunction getString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new ApiError(400, `${field} must be a string`);\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed || undefined;\n}\n\nfunction getStringArray(value: unknown, field: string): string[] | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new ApiError(400, `${field} must be an array of strings`);\n\t}\n\tconst strings = value.map((entry, index) => {\n\t\tif (typeof entry !== \"string\" || !entry.trim()) {\n\t\t\tthrow new ApiError(400, `${field}[${index}] must be a non-empty string`);\n\t\t}\n\t\tif (entry.includes(\"\\0\")) {\n\t\t\tthrow new ApiError(400, `${field}[${index}] contains a null byte`);\n\t\t}\n\t\treturn entry.trim();\n\t});\n\treturn strings.length ? strings : undefined;\n}\n\nexport function parseHostedRunnerDrainInput(\n\tbody: unknown,\n): HostedRunnerDrainInput {\n\tif (body === undefined || body === null) {\n\t\treturn {};\n\t}\n\tif (typeof body !== \"object\" || Array.isArray(body)) {\n\t\tthrow new ApiError(400, \"Drain payload must be a JSON object\");\n\t}\n\tconst record = body as Record<string, unknown>;\n\treturn {\n\t\treason:\n\t\t\tgetString(record.reason, \"reason\") ??\n\t\t\tgetString(record.stop_reason, \"stop_reason\"),\n\t\trequestedBy:\n\t\t\tgetString(record.requested_by, \"requested_by\") ??\n\t\t\tgetString(record.requestedBy, \"requestedBy\"),\n\t\texportPaths:\n\t\t\tgetStringArray(record.export_paths, \"export_paths\") ??\n\t\t\tgetStringArray(record.exportPaths, \"exportPaths\"),\n\t};\n}\n\nfunction isWithinPath(root: string, target: string): boolean {\n\tconst rel = relative(root, target);\n\treturn rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\nfunction safeManifestFileName(\n\trunnerSessionId: string,\n\trequestedAt: string,\n): string {\n\tconst safeSession = runnerSessionId.replace(/[^A-Za-z0-9_.-]/g, \"_\");\n\tconst safeTimestamp = requestedAt.replace(/[^A-Za-z0-9_.-]/g, \"_\");\n\treturn `${safeSession}-${safeTimestamp}.json`;\n}\n\nasync function resolveWorkspaceRoot(\n\thostedRunner: HostedRunnerContext,\n): Promise<string> {\n\ttry {\n\t\tconst workspaceRoot = await realpath(hostedRunner.workspaceRoot);\n\t\tconst stats = await stat(workspaceRoot);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new ApiError(\n\t\t\t\t503,\n\t\t\t\t\"Hosted runner workspace root is not a directory\",\n\t\t\t);\n\t\t}\n\t\treturn workspaceRoot;\n\t} catch (error) {\n\t\tif (error instanceof ApiError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new ApiError(\n\t\t\t503,\n\t\t\t`Hosted runner workspace root is unavailable: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`,\n\t\t);\n\t}\n}\n\nasync function resolveWorkspaceExportPaths(\n\tworkspaceRoot: string,\n\texportPaths: readonly string[] | undefined,\n): Promise<HostedRunnerWorkspaceExportPath[]> {\n\tconst requested = exportPaths?.length ? exportPaths : [\".\"];\n\tconst paths: HostedRunnerWorkspaceExportPath[] = [];\n\tfor (const input of requested) {\n\t\tconst logicalPath = isAbsolute(input)\n\t\t\t? resolve(input)\n\t\t\t: resolve(workspaceRoot, input);\n\t\tlet realPath: string;\n\t\ttry {\n\t\t\trealPath = await realpath(logicalPath);\n\t\t} catch (error) {\n\t\t\tthrow new ApiError(\n\t\t\t\t400,\n\t\t\t\t`Export path is unavailable: ${input} (${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t\tif (!isWithinPath(workspaceRoot, realPath)) {\n\t\t\tthrow new ApiError(\n\t\t\t\t400,\n\t\t\t\t`Export path escapes hosted runner workspace root: ${input}`,\n\t\t\t);\n\t\t}\n\t\tconst pathStat = await stat(realPath);\n\t\tpaths.push({\n\t\t\tinput,\n\t\t\tpath: realPath,\n\t\t\trelative_path: relative(workspaceRoot, realPath) || \".\",\n\t\t\ttype: pathStat.isDirectory()\n\t\t\t\t? HostedRunnerWorkspaceExportPathTypeValue.Directory\n\t\t\t\t: pathStat.isFile()\n\t\t\t\t\t? HostedRunnerWorkspaceExportPathTypeValue.File\n\t\t\t\t\t: HostedRunnerWorkspaceExportPathTypeValue.Other,\n\t\t});\n\t}\n\treturn paths;\n}\n\nasync function gitOutput(\n\tworkspaceRoot: string,\n\targs: readonly string[],\n): Promise<string | undefined> {\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"-C\", workspaceRoot, ...args],\n\t\t\t{\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\ttimeout: 1000,\n\t\t\t},\n\t\t);\n\t\tconst output = stdout.trim();\n\t\treturn output || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function collectGitState(\n\tworkspaceRoot: string,\n): Promise<HostedRunnerSnapshotManifest[\"git\"] | undefined> {\n\tconst [commit, branch, status] = await Promise.all([\n\t\tgitOutput(workspaceRoot, [\"rev-parse\", \"HEAD\"]),\n\t\tgitOutput(workspaceRoot, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]),\n\t\tgitOutput(workspaceRoot, [\"status\", \"--porcelain\"]),\n\t]);\n\tif (!commit && !branch && status === undefined) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(commit ? { commit } : {}),\n\t\t...(branch && branch !== \"HEAD\" ? { branch } : {}),\n\t\tdirty: Boolean(status),\n\t};\n}\n\nfunction buildHostedRunnerSnapshot(\n\tsessionId: string,\n\tworkspaceRoot: string,\n\truntime: HostedRunnerSnapshotManifest[\"runtime\"],\n): HeadlessRuntimeSnapshot {\n\tconst state = createHeadlessRuntimeState();\n\tstate.protocol_version =\n\t\truntime.protocol_version ?? HEADLESS_PROTOCOL_VERSION;\n\tstate.session_id = sessionId;\n\tstate.cwd = workspaceRoot;\n\tstate.provider = \"typescript\";\n\tstate.model = \"typescript-hosted-runner\";\n\tstate.is_ready =\n\t\truntime.flush_status === HostedRunnerRuntimeFlushStatusValue.Completed;\n\tstate.last_status =\n\t\truntime.flush_status === HostedRunnerRuntimeFlushStatusValue.Completed\n\t\t\t? \"Drained\"\n\t\t\t: runtime.flush_status === HostedRunnerRuntimeFlushStatusValue.Failed\n\t\t\t\t? \"Drain interrupted before runtime flush completed\"\n\t\t\t\t: \"Drain skipped: no runtime activity was available\";\n\tif (runtime.error) {\n\t\tstate.last_error = runtime.error;\n\t\tstate.last_error_type = \"protocol\";\n\t}\n\treturn {\n\t\tprotocolVersion: runtime.protocol_version ?? HEADLESS_PROTOCOL_VERSION,\n\t\tsession_id: sessionId,\n\t\tcursor: runtime.cursor ?? 0,\n\t\tlast_init: null,\n\t\tstate,\n\t};\n}\n\nfunction buildHostedRunnerRetentionPolicy(): HostedRunnerRetentionPolicy {\n\treturn {\n\t\tpolicy_version: HOSTED_RUNNER_RETENTION_POLICY_VERSION,\n\t\tmanaged_by: \"platform\",\n\t\tvisibility: {\n\t\t\tcontrol_plane_metadata: \"operator\",\n\t\t\tworkspace_export: \"tenant\",\n\t\t\truntime_snapshot: \"internal\",\n\t\t\truntime_logs: \"operator\",\n\t\t},\n\t\tredaction: {\n\t\t\trequired_before_external_persistence: [\n\t\t\t\t\"runtime_snapshot\",\n\t\t\t\t\"runtime_logs\",\n\t\t\t],\n\t\t\tforbidden_plaintext: [\n\t\t\t\t\"provider_credentials\",\n\t\t\t\t\"tool_secrets\",\n\t\t\t\t\"attach_tokens\",\n\t\t\t\t\"artifact_access_tokens\",\n\t\t\t\t\"raw_environment\",\n\t\t\t],\n\t\t},\n\t};\n}\n\nexport async function drainHostedRunner(\n\tinput: HostedRunnerDrainInput,\n\toptions: DrainHostedRunnerOptions,\n): Promise<HostedRunnerDrainResult | null> {\n\tconst hostedRunner = options.hostedRunner;\n\tif (!hostedRunner?.enabled || !hostedRunner.runnerSessionId) {\n\t\treturn null;\n\t}\n\n\thostedRunner.draining = true;\n\tconst requestedAt = (options.now?.() ?? new Date()).toISOString();\n\tconst workspaceRoot = await resolveWorkspaceRoot(hostedRunner);\n\tconst snapshotRoot = resolve(\n\t\tworkspaceRoot,\n\t\thostedRunner.snapshotRoot ?? \".maestro/runner-snapshots\",\n\t);\n\tconst exportPaths = await resolveWorkspaceExportPaths(\n\t\tworkspaceRoot,\n\t\tinput.exportPaths,\n\t);\n\tconst activeSessionId =\n\t\thostedRunner.activeMaestroSessionId ??\n\t\thostedRunner.configuredMaestroSessionId;\n\tconst maestroSessionId = activeSessionId ?? hostedRunner.runnerSessionId;\n\n\tlet status: HostedRunnerDrainStatus = HostedRunnerDrainStatusValue.Drained;\n\tlet runtime: HostedRunnerSnapshotManifest[\"runtime\"] = {\n\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Skipped,\n\t\tsession_id: maestroSessionId,\n\t};\n\tlet runtimeSnapshot: HeadlessRuntimeSnapshot | undefined;\n\n\tif (activeSessionId && options.drainRuntime) {\n\t\ttry {\n\t\t\tconst runtimeResult = await options.drainRuntime(activeSessionId);\n\t\t\tconst runtimeProtocolVersion =\n\t\t\t\truntimeResult?.protocolVersion ??\n\t\t\t\truntimeResult?.snapshot?.protocolVersion;\n\t\t\tconst runtimeCursor =\n\t\t\t\truntimeResult?.cursor ?? runtimeResult?.snapshot?.cursor;\n\t\t\truntime = runtimeResult\n\t\t\t\t? {\n\t\t\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Completed,\n\t\t\t\t\t\tsession_id: runtimeResult.sessionId,\n\t\t\t\t\t\t...(runtimeResult.sessionFile\n\t\t\t\t\t\t\t? { session_file: runtimeResult.sessionFile }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(runtimeProtocolVersion\n\t\t\t\t\t\t\t? { protocol_version: runtimeProtocolVersion }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(runtimeCursor !== undefined ? { cursor: runtimeCursor } : {}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Skipped,\n\t\t\t\t\t\tsession_id: activeSessionId,\n\t\t\t\t\t};\n\t\t\truntimeSnapshot = runtimeResult?.snapshot;\n\t\t} catch (error) {\n\t\t\tstatus = HostedRunnerDrainStatusValue.Interrupted;\n\t\t\truntime = {\n\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Failed,\n\t\t\t\tsession_id: activeSessionId,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tawait mkdir(snapshotRoot, { recursive: true });\n\tconst snapshotPath = join(\n\t\tsnapshotRoot,\n\t\tsafeManifestFileName(hostedRunner.runnerSessionId, requestedAt),\n\t);\n\tconst git = await collectGitState(workspaceRoot);\n\tconst snapshot =\n\t\truntimeSnapshot ??\n\t\tbuildHostedRunnerSnapshot(maestroSessionId, workspaceRoot, runtime);\n\tconst manifest: HostedRunnerSnapshotManifest = {\n\t\tprotocol_version: HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION,\n\t\trunner_session_id: hostedRunner.runnerSessionId,\n\t\t...(hostedRunner.workspaceId\n\t\t\t? { workspace_id: hostedRunner.workspaceId }\n\t\t\t: {}),\n\t\t...(hostedRunner.agentRunId\n\t\t\t? { agent_run_id: hostedRunner.agentRunId }\n\t\t\t: {}),\n\t\tmaestro_session_id: maestroSessionId,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requested_by: input.requestedBy } : {}),\n\t\tcreated_at: requestedAt,\n\t\tworkspace_root: workspaceRoot,\n\t\truntime,\n\t\tworkspace_export: {\n\t\t\tmode: HostedRunnerWorkspaceExportModeValue.LocalPathContract,\n\t\t\tpaths: exportPaths,\n\t\t},\n\t\tsnapshot,\n\t\tretention_policy: buildHostedRunnerRetentionPolicy(),\n\t\t...(git ? { git } : {}),\n\t};\n\n\tawait writeFile(\n\t\tsnapshotPath,\n\t\t`${JSON.stringify(manifest, null, 2)}\\n`,\n\t\t\"utf8\",\n\t);\n\thostedRunner.lastDrain = {\n\t\tstatus,\n\t\tmanifestPath: snapshotPath,\n\t\tdrainedAt: requestedAt,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requestedBy: input.requestedBy } : {}),\n\t};\n\n\treturn {\n\t\tstatus,\n\t\trunner_session_id: hostedRunner.runnerSessionId,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requested_by: input.requestedBy } : {}),\n\t\tmanifest_path: snapshotPath,\n\t\tmanifest,\n\t};\n}\n\nasync function drainActiveRuntime(\n\tcontext: HostedRunnerDrainRuntimeContext,\n\tsessionId: string,\n): Promise<HostedRunnerRuntimeDrainResult | null> {\n\tconst runtime =\n\t\tcontext.headlessRuntimeService.getRuntimeBySessionId(sessionId);\n\tif (!runtime) {\n\t\treturn null;\n\t}\n\tconst snapshot = runtime.getSnapshot();\n\tconst sessionFile = runtime.getSessionFile();\n\tawait runtime.dispose();\n\treturn {\n\t\tsessionId: snapshot.session_id,\n\t\tsessionFile,\n\t\tprotocolVersion: snapshot.protocolVersion,\n\t\tcursor: snapshot.cursor,\n\t\tsnapshot,\n\t};\n}\n\nexport async function drainHostedRunnerForShutdown(\n\tcontext: HostedRunnerDrainRuntimeContext,\n\toptions: DrainHostedRunnerForShutdownOptions = {},\n): Promise<HostedRunnerDrainResult | null> {\n\treturn drainHostedRunner(\n\t\t{\n\t\t\treason: options.reason ?? HostedRunnerDrainReasonValue.ProcessShutdown,\n\t\t\trequestedBy:\n\t\t\t\toptions.requestedBy ??\n\t\t\t\tHostedRunnerDrainRequestedByValue.MaestroWebServer,\n\t\t},\n\t\t{\n\t\t\thostedRunner: context.hostedRunner,\n\t\t\tdrainRuntime: (sessionId) => drainActiveRuntime(context, sessionId),\n\t\t\tnow: options.now,\n\t\t},\n\t);\n}\n\nexport async function handleHostedRunnerDrain(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n): Promise<void> {\n\tres.setHeader(\"Cache-Control\", \"no-store\");\n\tconst body = await readJsonBody<Record<string, unknown>>(req, 64_000);\n\tconst input = parseHostedRunnerDrainInput(body);\n\tconst result = await drainHostedRunner(input, {\n\t\thostedRunner: context.hostedRunner,\n\t\tdrainRuntime: (sessionId) => drainActiveRuntime(context, sessionId),\n\t});\n\n\tif (!result) {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t404,\n\t\t\t{\n\t\t\t\terror: \"hosted runner drain unavailable\",\n\t\t\t},\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t\treturn;\n\t}\n\n\tsendJson(\n\t\tres,\n\t\tresult.status === HostedRunnerDrainStatusValue.Interrupted ? 503 : 200,\n\t\t{\n\t\t\tprotocol_version: HOSTED_RUNNER_DRAIN_PROTOCOL_VERSION,\n\t\t\tstatus: result.status,\n\t\t\trunner_session_id: result.runner_session_id,\n\t\t\trequested_by: result.requested_by,\n\t\t\treason: result.reason,\n\t\t\tmanifest_path: result.manifest_path,\n\t\t\tmanifest: result.manifest,\n\t\t},\n\t\tcontext.corsHeaders,\n\t\treq,\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hosted-runner-drain.js","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-drain.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { mkdir, realpath, stat, writeFile } from \"node:fs/promises\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n\tCODEX_SUBAGENT_TOOL_PREFIX,\n\tCODEX_SUBAGENT_WORK_GRAPH_SCHEMA,\n\tHEADLESS_PROTOCOL_VERSION,\n\ttype HeadlessCodexSubagentContinuityEdge,\n\tactiveCodexSubagentStatus,\n\tbuildCodexSubagentContinuityEdges,\n\tcodexSubagentEdgeKey,\n\tcodexSubagentOperation,\n\tcodexSubagentStatusIsTerminal,\n\tcreateHeadlessRuntimeState,\n\tstringArray,\n} from \"../../cli/headless-protocol.js\";\nimport type { HostedRunnerContext, WebServerContext } from \"../app-context.js\";\nimport type { HeadlessRuntimeSnapshot } from \"../headless-runtime-service.js\";\nimport { markHostedRunnerLeaseDraining } from \"../hosted-runner-lease.js\";\nimport { ApiError, readJsonBody, sendJson } from \"../server-utils.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const HOSTED_RUNNER_DRAIN_PATH =\n\t\"/.well-known/evalops/remote-runner/drain\";\n\nexport const HOSTED_RUNNER_DRAIN_PROTOCOL_VERSION =\n\t\"evalops.remote-runner.drain.v1\";\n\nexport const HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION =\n\t\"evalops.remote-runner.snapshot-manifest.v1\";\n\nexport const HOSTED_RUNNER_RETENTION_POLICY_VERSION =\n\t\"evalops.remote-runner.retention.v1\";\n\nexport const HOSTED_RUNNER_WORK_CONTINUITY_VERSION =\n\t\"evalops.remote-runner.work-continuity.v1\";\n\nexport const HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION =\n\t\"evalops.remote-runner.platform-evidence.v1\";\n\nexport enum HostedRunnerDrainStatusValue {\n\tDrained = \"drained\",\n\tInterrupted = \"interrupted\",\n}\n\nexport enum HostedRunnerRuntimeFlushStatusValue {\n\tCompleted = \"completed\",\n\tFailed = \"failed\",\n\tSkipped = \"skipped\",\n}\n\nexport enum HostedRunnerWorkspaceExportPathTypeValue {\n\tFile = \"file\",\n\tDirectory = \"directory\",\n\tOther = \"other\",\n}\n\nexport enum HostedRunnerWorkspaceExportModeValue {\n\tLocalPathContract = \"local_path_contract\",\n}\n\nexport enum HostedRunnerDrainReasonValue {\n\tKubernetesPreStop = \"kubernetes_prestop\",\n\tProcessShutdown = \"process_shutdown\",\n}\n\nexport enum HostedRunnerDrainRequestedByValue {\n\tKubernetesPreStop = \"kubernetes_prestop\",\n\tMaestroWebServer = \"maestro_web_server\",\n}\n\nexport type HostedRunnerDrainStatus = HostedRunnerDrainStatusValue;\nexport type HostedRunnerRuntimeFlushStatus =\n\tHostedRunnerRuntimeFlushStatusValue;\nexport type HostedRunnerWorkspaceExportPathType =\n\tHostedRunnerWorkspaceExportPathTypeValue;\nexport type HostedRunnerWorkspaceExportMode =\n\tHostedRunnerWorkspaceExportModeValue;\nexport type HostedRunnerDrainReason = HostedRunnerDrainReasonValue | string;\nexport type HostedRunnerDrainRequestedBy =\n\t| HostedRunnerDrainRequestedByValue\n\t| string;\n\nexport interface HostedRunnerRetentionPolicy {\n\tpolicy_version: typeof HOSTED_RUNNER_RETENTION_POLICY_VERSION;\n\tmanaged_by: \"platform\";\n\tvisibility: {\n\t\tcontrol_plane_metadata: \"operator\";\n\t\tworkspace_export: \"tenant\";\n\t\truntime_snapshot: \"internal\";\n\t\truntime_logs: \"operator\";\n\t};\n\tredaction: {\n\t\trequired_before_external_persistence: Array<\n\t\t\t\"runtime_snapshot\" | \"runtime_logs\"\n\t\t>;\n\t\tforbidden_plaintext: Array<\n\t\t\t| \"provider_credentials\"\n\t\t\t| \"tool_secrets\"\n\t\t\t| \"attach_tokens\"\n\t\t\t| \"artifact_access_tokens\"\n\t\t\t| \"raw_environment\"\n\t\t>;\n\t};\n}\n\nexport interface HostedRunnerDrainInput {\n\treason?: HostedRunnerDrainReason;\n\trequestedBy?: HostedRunnerDrainRequestedBy;\n\texportPaths?: string[];\n}\n\nexport interface HostedRunnerRuntimeDrainResult {\n\tsessionId: string;\n\tsessionFile?: string;\n\tprotocolVersion?: string;\n\tcursor?: number;\n\tsnapshot?: HeadlessRuntimeSnapshot;\n\trecordPlatformDrain?: (\n\t\tinput: HostedRunnerPlatformDrainRecordInput,\n\t) => Promise<void>;\n}\n\nclass HostedRunnerRuntimeDrainError extends Error {\n\treadonly sessionId: string;\n\treadonly sessionFile?: string;\n\treadonly protocolVersion?: string;\n\treadonly cursor?: number;\n\treadonly snapshot?: HeadlessRuntimeSnapshot;\n\treadonly recordPlatformDrain?: (\n\t\tinput: HostedRunnerPlatformDrainRecordInput,\n\t) => Promise<void>;\n\n\tconstructor(message: string, runtime: HostedRunnerRuntimeDrainResult) {\n\t\tsuper(message);\n\t\tthis.name = \"HostedRunnerRuntimeDrainError\";\n\t\tthis.sessionId = runtime.sessionId;\n\t\tthis.sessionFile = runtime.sessionFile;\n\t\tthis.protocolVersion = runtime.protocolVersion;\n\t\tthis.cursor = runtime.cursor;\n\t\tthis.snapshot = runtime.snapshot;\n\t\tthis.recordPlatformDrain = runtime.recordPlatformDrain;\n\t}\n}\n\nexport interface HostedRunnerWorkspaceExportPath {\n\tinput: string;\n\tpath: string;\n\trelative_path: string;\n\ttype: HostedRunnerWorkspaceExportPathType;\n}\n\nexport interface HostedRunnerSnapshotManifest {\n\tprotocol_version: typeof HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION;\n\trunner_session_id: string;\n\tworkspace_id?: string;\n\tagent_run_id?: string;\n\tmaestro_session_id: string;\n\treason?: string;\n\trequested_by?: string;\n\tcreated_at: string;\n\tworkspace_root: string;\n\truntime: {\n\t\tflush_status: HostedRunnerRuntimeFlushStatus;\n\t\terror?: string;\n\t\tsession_id: string;\n\t\tsession_file?: string;\n\t\tprotocol_version?: string;\n\t\tcursor?: number;\n\t};\n\tworkspace_export: {\n\t\tmode: HostedRunnerWorkspaceExportMode;\n\t\tpaths: HostedRunnerWorkspaceExportPath[];\n\t};\n\twork_continuity: HostedRunnerWorkContinuity;\n\tplatform_evidence: HostedRunnerPlatformEvidence;\n\tsnapshot: HeadlessRuntimeSnapshot;\n\tretention_policy: HostedRunnerRetentionPolicy;\n\tgit?: {\n\t\tcommit?: string;\n\t\tbranch?: string;\n\t\tdirty?: boolean;\n\t};\n}\n\nexport interface HostedRunnerWorkContinuity {\n\tprotocol_version: typeof HOSTED_RUNNER_WORK_CONTINUITY_VERSION;\n\tcodex_subagent_schema_version: typeof CODEX_SUBAGENT_WORK_GRAPH_SCHEMA;\n\tactive_tool_count: number;\n\ttracked_tool_count: number;\n\tpending_request_count: number;\n\tcodex_subagent_tool_call_ids: string[];\n\tcodex_subagent_child_run_ids: string[];\n\tcodex_subagent_thread_ids: string[];\n\tcodex_subagent_edges?: HeadlessCodexSubagentContinuityEdge[];\n}\n\nexport interface HostedRunnerPlatformEvidence {\n\tprotocol_version: typeof HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION;\n\tevent_type: \"hosted_runner_drain_manifest_recorded\";\n\trunner_session_id: string;\n\tworkspace_id?: string;\n\tagent_run_id?: string;\n\tmaestro_session_id: string;\n\tstatus: HostedRunnerDrainStatus;\n\truntime_flush_status: HostedRunnerRuntimeFlushStatus;\n\tmanifest_path: string;\n\tmanifest_protocol_version: typeof HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION;\n\tcreated_at: string;\n\treason?: string;\n\trequested_by?: string;\n\twork_continuity: {\n\t\tprotocol_version: typeof HOSTED_RUNNER_WORK_CONTINUITY_VERSION;\n\t\tcodex_subagent_schema_version: typeof CODEX_SUBAGENT_WORK_GRAPH_SCHEMA;\n\t\tactive_tool_count: number;\n\t\ttracked_tool_count: number;\n\t\tpending_request_count: number;\n\t\tcodex_subagent_tool_call_count: number;\n\t\tcodex_subagent_child_run_count: number;\n\t\tcodex_subagent_thread_count: number;\n\t\tcodex_subagent_edge_count: number;\n\t\tcodex_subagent_tool_call_ids: string[];\n\t\tcodex_subagent_child_run_ids: string[];\n\t\tcodex_subagent_thread_ids: string[];\n\t\tcodex_subagent_edges?: HeadlessCodexSubagentContinuityEdge[];\n\t};\n\tretention: {\n\t\tpolicy_version: typeof HOSTED_RUNNER_RETENTION_POLICY_VERSION;\n\t\tcontrol_plane_metadata_visibility: \"operator\";\n\t\truntime_snapshot_visibility: \"internal\";\n\t\tredaction_required_before_external_persistence: Array<\n\t\t\t\"runtime_snapshot\" | \"runtime_logs\"\n\t\t>;\n\t};\n\tevidence_refs: string[];\n}\n\nexport interface HostedRunnerPlatformDrainRecordInput {\n\tstatus: HostedRunnerDrainStatus;\n\treason?: string;\n\trequestedBy?: string;\n\tflushStatus: HostedRunnerRuntimeFlushStatus;\n\tmanifestPath: string;\n\tplatformEvidence: HostedRunnerPlatformEvidence;\n\terrorMessage?: string;\n}\n\nexport interface HostedRunnerDrainResult {\n\tstatus: HostedRunnerDrainStatus;\n\trunner_session_id: string;\n\treason?: string;\n\trequested_by?: string;\n\tmanifest_path: string;\n\tmanifest: HostedRunnerSnapshotManifest;\n}\n\nexport interface DrainHostedRunnerOptions {\n\thostedRunner?: HostedRunnerContext;\n\tdrainRuntime?: (\n\t\tsessionId: string,\n\t\tterminal: HostedRunnerRuntimeTerminalInput,\n\t) => Promise<HostedRunnerRuntimeDrainResult | null>;\n\tnow?: () => Date;\n}\n\ninterface HostedRunnerDrainRuntimeContext {\n\thostedRunner?: HostedRunnerContext;\n\theadlessRuntimeService: Pick<\n\t\tWebServerContext[\"headlessRuntimeService\"],\n\t\t\"getRuntimeBySessionId\"\n\t>;\n}\n\nexport interface DrainHostedRunnerForShutdownOptions {\n\tnow?: () => Date;\n\treason?: HostedRunnerDrainReason;\n\trequestedBy?: HostedRunnerDrainRequestedBy;\n}\n\ninterface HostedRunnerRuntimeTerminalInput {\n\treason?: HostedRunnerDrainReason;\n\trequestedBy?: HostedRunnerDrainRequestedBy;\n\tmanifestPath?: string;\n}\n\nfunction getString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new ApiError(400, `${field} must be a string`);\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed || undefined;\n}\n\nfunction getStringArray(value: unknown, field: string): string[] | undefined {\n\tif (value === undefined || value === null) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new ApiError(400, `${field} must be an array of strings`);\n\t}\n\tconst strings = value.map((entry, index) => {\n\t\tif (typeof entry !== \"string\" || !entry.trim()) {\n\t\t\tthrow new ApiError(400, `${field}[${index}] must be a non-empty string`);\n\t\t}\n\t\tif (entry.includes(\"\\0\")) {\n\t\t\tthrow new ApiError(400, `${field}[${index}] contains a null byte`);\n\t\t}\n\t\treturn entry.trim();\n\t});\n\treturn strings.length ? strings : undefined;\n}\n\nexport function parseHostedRunnerDrainInput(\n\tbody: unknown,\n): HostedRunnerDrainInput {\n\tif (body === undefined || body === null) {\n\t\treturn {};\n\t}\n\tif (typeof body !== \"object\" || Array.isArray(body)) {\n\t\tthrow new ApiError(400, \"Drain payload must be a JSON object\");\n\t}\n\tconst record = body as Record<string, unknown>;\n\treturn {\n\t\treason:\n\t\t\tgetString(record.reason, \"reason\") ??\n\t\t\tgetString(record.stop_reason, \"stop_reason\"),\n\t\trequestedBy:\n\t\t\tgetString(record.requested_by, \"requested_by\") ??\n\t\t\tgetString(record.requestedBy, \"requestedBy\"),\n\t\texportPaths:\n\t\t\tgetStringArray(record.export_paths, \"export_paths\") ??\n\t\t\tgetStringArray(record.exportPaths, \"exportPaths\"),\n\t};\n}\n\nfunction isWithinPath(root: string, target: string): boolean {\n\tconst rel = relative(root, target);\n\treturn rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\nfunction safeManifestFileName(\n\trunnerSessionId: string,\n\trequestedAt: string,\n): string {\n\tconst safeSession = runnerSessionId.replace(/[^A-Za-z0-9_.-]/g, \"_\");\n\tconst safeTimestamp = requestedAt.replace(/[^A-Za-z0-9_.-]/g, \"_\");\n\treturn `${safeSession}-${safeTimestamp}.json`;\n}\n\nasync function resolveWorkspaceRoot(\n\thostedRunner: HostedRunnerContext,\n): Promise<string> {\n\ttry {\n\t\tconst workspaceRoot = await realpath(hostedRunner.workspaceRoot);\n\t\tconst stats = await stat(workspaceRoot);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new ApiError(\n\t\t\t\t503,\n\t\t\t\t\"Hosted runner workspace root is not a directory\",\n\t\t\t);\n\t\t}\n\t\treturn workspaceRoot;\n\t} catch (error) {\n\t\tif (error instanceof ApiError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new ApiError(\n\t\t\t503,\n\t\t\t`Hosted runner workspace root is unavailable: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`,\n\t\t);\n\t}\n}\n\nasync function resolveWorkspaceExportPaths(\n\tworkspaceRoot: string,\n\texportPaths: readonly string[] | undefined,\n): Promise<HostedRunnerWorkspaceExportPath[]> {\n\tconst requested = exportPaths?.length ? exportPaths : [\".\"];\n\tconst paths: HostedRunnerWorkspaceExportPath[] = [];\n\tfor (const input of requested) {\n\t\tconst logicalPath = isAbsolute(input)\n\t\t\t? resolve(input)\n\t\t\t: resolve(workspaceRoot, input);\n\t\tlet realPath: string;\n\t\ttry {\n\t\t\trealPath = await realpath(logicalPath);\n\t\t} catch (error) {\n\t\t\tthrow new ApiError(\n\t\t\t\t400,\n\t\t\t\t`Export path is unavailable: ${input} (${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t\tif (!isWithinPath(workspaceRoot, realPath)) {\n\t\t\tthrow new ApiError(\n\t\t\t\t400,\n\t\t\t\t`Export path escapes hosted runner workspace root: ${input}`,\n\t\t\t);\n\t\t}\n\t\tconst pathStat = await stat(realPath);\n\t\tpaths.push({\n\t\t\tinput,\n\t\t\tpath: realPath,\n\t\t\trelative_path: relative(workspaceRoot, realPath) || \".\",\n\t\t\ttype: pathStat.isDirectory()\n\t\t\t\t? HostedRunnerWorkspaceExportPathTypeValue.Directory\n\t\t\t\t: pathStat.isFile()\n\t\t\t\t\t? HostedRunnerWorkspaceExportPathTypeValue.File\n\t\t\t\t\t: HostedRunnerWorkspaceExportPathTypeValue.Other,\n\t\t});\n\t}\n\treturn paths;\n}\n\nasync function gitOutput(\n\tworkspaceRoot: string,\n\targs: readonly string[],\n): Promise<string | undefined> {\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"-C\", workspaceRoot, ...args],\n\t\t\t{\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\ttimeout: 1000,\n\t\t\t},\n\t\t);\n\t\tconst output = stdout.trim();\n\t\treturn output || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function collectGitState(\n\tworkspaceRoot: string,\n): Promise<HostedRunnerSnapshotManifest[\"git\"] | undefined> {\n\tconst [commit, branch, status] = await Promise.all([\n\t\tgitOutput(workspaceRoot, [\"rev-parse\", \"HEAD\"]),\n\t\tgitOutput(workspaceRoot, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]),\n\t\tgitOutput(workspaceRoot, [\"status\", \"--porcelain\"]),\n\t]);\n\tif (!commit && !branch && status === undefined) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(commit ? { commit } : {}),\n\t\t...(branch && branch !== \"HEAD\" ? { branch } : {}),\n\t\tdirty: Boolean(status),\n\t};\n}\n\nfunction buildHostedRunnerSnapshot(\n\tsessionId: string,\n\tworkspaceRoot: string,\n\truntime: HostedRunnerSnapshotManifest[\"runtime\"],\n): HeadlessRuntimeSnapshot {\n\tconst state = createHeadlessRuntimeState();\n\tstate.protocol_version =\n\t\truntime.protocol_version ?? HEADLESS_PROTOCOL_VERSION;\n\tstate.session_id = sessionId;\n\tstate.cwd = workspaceRoot;\n\tstate.provider = \"typescript\";\n\tstate.model = \"typescript-hosted-runner\";\n\tstate.is_ready =\n\t\truntime.flush_status === HostedRunnerRuntimeFlushStatusValue.Completed;\n\tstate.last_status =\n\t\truntime.flush_status === HostedRunnerRuntimeFlushStatusValue.Completed\n\t\t\t? \"Drained\"\n\t\t\t: runtime.flush_status === HostedRunnerRuntimeFlushStatusValue.Failed\n\t\t\t\t? \"Drain interrupted before runtime flush completed\"\n\t\t\t\t: \"Drain skipped: no runtime activity was available\";\n\tif (runtime.error) {\n\t\tstate.last_error = runtime.error;\n\t\tstate.last_error_type = \"protocol\";\n\t}\n\treturn {\n\t\tprotocolVersion: runtime.protocol_version ?? HEADLESS_PROTOCOL_VERSION,\n\t\tsession_id: sessionId,\n\t\tcursor: runtime.cursor ?? 0,\n\t\tlast_init: null,\n\t\tstate,\n\t};\n}\n\nfunction buildHostedRunnerRetentionPolicy(): HostedRunnerRetentionPolicy {\n\treturn {\n\t\tpolicy_version: HOSTED_RUNNER_RETENTION_POLICY_VERSION,\n\t\tmanaged_by: \"platform\",\n\t\tvisibility: {\n\t\t\tcontrol_plane_metadata: \"operator\",\n\t\t\tworkspace_export: \"tenant\",\n\t\t\truntime_snapshot: \"internal\",\n\t\t\truntime_logs: \"operator\",\n\t\t},\n\t\tredaction: {\n\t\t\trequired_before_external_persistence: [\n\t\t\t\t\"runtime_snapshot\",\n\t\t\t\t\"runtime_logs\",\n\t\t\t],\n\t\t\tforbidden_plaintext: [\n\t\t\t\t\"provider_credentials\",\n\t\t\t\t\"tool_secrets\",\n\t\t\t\t\"attach_tokens\",\n\t\t\t\t\"artifact_access_tokens\",\n\t\t\t\t\"raw_environment\",\n\t\t\t],\n\t\t},\n\t};\n}\n\nfunction buildHostedRunnerPlatformEvidence(input: {\n\thostedRunner: HostedRunnerContext;\n\tstatus: HostedRunnerDrainStatus;\n\tmaestroSessionId: string;\n\tcreatedAt: string;\n\tmanifestPath: string;\n\truntime: HostedRunnerSnapshotManifest[\"runtime\"];\n\tworkContinuity: HostedRunnerWorkContinuity;\n\tretentionPolicy: HostedRunnerRetentionPolicy;\n\treason?: string;\n\trequestedBy?: string;\n}): HostedRunnerPlatformEvidence {\n\tconst edges = input.workContinuity.codex_subagent_edges ?? [];\n\treturn {\n\t\tprotocol_version: HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION,\n\t\tevent_type: \"hosted_runner_drain_manifest_recorded\",\n\t\trunner_session_id: input.hostedRunner.runnerSessionId,\n\t\t...(input.hostedRunner.workspaceId\n\t\t\t? { workspace_id: input.hostedRunner.workspaceId }\n\t\t\t: {}),\n\t\t...(input.hostedRunner.agentRunId\n\t\t\t? { agent_run_id: input.hostedRunner.agentRunId }\n\t\t\t: {}),\n\t\tmaestro_session_id: input.maestroSessionId,\n\t\tstatus: input.status,\n\t\truntime_flush_status: input.runtime.flush_status,\n\t\tmanifest_path: input.manifestPath,\n\t\tmanifest_protocol_version: HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION,\n\t\tcreated_at: input.createdAt,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requested_by: input.requestedBy } : {}),\n\t\twork_continuity: {\n\t\t\tprotocol_version: input.workContinuity.protocol_version,\n\t\t\tcodex_subagent_schema_version:\n\t\t\t\tinput.workContinuity.codex_subagent_schema_version,\n\t\t\tactive_tool_count: input.workContinuity.active_tool_count,\n\t\t\ttracked_tool_count: input.workContinuity.tracked_tool_count,\n\t\t\tpending_request_count: input.workContinuity.pending_request_count,\n\t\t\tcodex_subagent_tool_call_count:\n\t\t\t\tinput.workContinuity.codex_subagent_tool_call_ids.length,\n\t\t\tcodex_subagent_child_run_count:\n\t\t\t\tinput.workContinuity.codex_subagent_child_run_ids.length,\n\t\t\tcodex_subagent_thread_count:\n\t\t\t\tinput.workContinuity.codex_subagent_thread_ids.length,\n\t\t\tcodex_subagent_edge_count: edges.length,\n\t\t\tcodex_subagent_tool_call_ids:\n\t\t\t\tinput.workContinuity.codex_subagent_tool_call_ids,\n\t\t\tcodex_subagent_child_run_ids:\n\t\t\t\tinput.workContinuity.codex_subagent_child_run_ids,\n\t\t\tcodex_subagent_thread_ids: input.workContinuity.codex_subagent_thread_ids,\n\t\t\t...(edges.length > 0 ? { codex_subagent_edges: edges } : {}),\n\t\t},\n\t\tretention: {\n\t\t\tpolicy_version: input.retentionPolicy.policy_version,\n\t\t\tcontrol_plane_metadata_visibility:\n\t\t\t\tinput.retentionPolicy.visibility.control_plane_metadata,\n\t\t\truntime_snapshot_visibility:\n\t\t\t\tinput.retentionPolicy.visibility.runtime_snapshot,\n\t\t\tredaction_required_before_external_persistence:\n\t\t\t\tinput.retentionPolicy.redaction.required_before_external_persistence,\n\t\t},\n\t\tevidence_refs: [\n\t\t\t`remote-runner://sessions/${input.hostedRunner.runnerSessionId}/drain#manifest`,\n\t\t\t`maestro://headless/sessions/${input.maestroSessionId}#drain`,\n\t\t\t...(input.hostedRunner.agentRunId\n\t\t\t\t? [`platform-agent-run:${input.hostedRunner.agentRunId}`]\n\t\t\t\t: []),\n\t\t],\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction collectCodexSubagentEdgesFromSource(\n\tsource: {\n\t\tcall_id: string;\n\t\ttool_execution_id?: string;\n\t\ttool: string;\n\t\targs?: unknown;\n\t},\n\tedges: Map<string, HeadlessCodexSubagentContinuityEdge>,\n): void {\n\tconst operation = codexSubagentOperation(source.tool);\n\tif (!operation) {\n\t\treturn;\n\t}\n\tconst status = activeCodexSubagentStatus(operation);\n\tfor (const edge of buildCodexSubagentContinuityEdges({\n\t\tcall_id: source.call_id,\n\t\ttool_execution_id: source.tool_execution_id,\n\t\ttool: source.tool,\n\t\targs: source.args,\n\t\tstatus,\n\t})) {\n\t\tedges.set(codexSubagentEdgeKey(edge), edge);\n\t}\n}\n\nfunction collectCodexWorkArgs(\n\targs: unknown,\n\tchildRunIds: Set<string>,\n\tthreadIds: Set<string>,\n\tincludeLooseArgs = false,\n): boolean {\n\tif (!isRecord(args)) {\n\t\treturn false;\n\t}\n\tconst graph = args.codexWorkGraph ?? args.codex_work_graph;\n\tconst hasCodexGraph =\n\t\tisRecord(graph) &&\n\t\t(graph.schemaVersion === CODEX_SUBAGENT_WORK_GRAPH_SCHEMA ||\n\t\t\tgraph.schema_version === CODEX_SUBAGENT_WORK_GRAPH_SCHEMA);\n\tif (!includeLooseArgs && !hasCodexGraph) {\n\t\treturn false;\n\t}\n\tfor (const childRunId of stringArray(\n\t\targs.childRunIds ?? args.child_run_ids,\n\t)) {\n\t\tchildRunIds.add(childRunId);\n\t}\n\tfor (const threadId of stringArray(\n\t\targs.receiverThreadIds ?? args.receiver_thread_ids,\n\t)) {\n\t\tthreadIds.add(threadId);\n\t}\n\tif (isRecord(graph)) {\n\t\tconst graphChildRuns = graph.childRuns ?? graph.child_runs;\n\t\tfor (const childRun of Array.isArray(graphChildRuns)\n\t\t\t? graphChildRuns\n\t\t\t: []) {\n\t\t\tif (!isRecord(childRun)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childRunId = childRun.childRunId ?? childRun.child_run_id;\n\t\t\tif (typeof childRunId === \"string\" && childRunId) {\n\t\t\t\tchildRunIds.add(childRunId);\n\t\t\t}\n\t\t\tconst threadId = childRun.threadId ?? childRun.thread_id;\n\t\t\tif (typeof threadId === \"string\" && threadId) {\n\t\t\t\tthreadIds.add(threadId);\n\t\t\t}\n\t\t}\n\t}\n\treturn includeLooseArgs || hasCodexGraph;\n}\n\nfunction collectHostedRunnerWorkContinuity(\n\tsnapshot: HeadlessRuntimeSnapshot,\n): HostedRunnerWorkContinuity {\n\tconst state = snapshot.state;\n\tconst codexToolCallIds = new Set<string>();\n\tconst childRunIds = new Set<string>();\n\tconst threadIds = new Set<string>();\n\tconst codexSubagentEdges = new Map<\n\t\tstring,\n\t\tHeadlessCodexSubagentContinuityEdge\n\t>();\n\tfor (const edge of state.codex_subagent_edges ?? []) {\n\t\tcodexSubagentEdges.set(codexSubagentEdgeKey(edge), edge);\n\t\tif (edge.spawn_tool_call_id) {\n\t\t\tcodexToolCallIds.add(edge.spawn_tool_call_id);\n\t\t}\n\t\tif (edge.wait_tool_call_id) {\n\t\t\tcodexToolCallIds.add(edge.wait_tool_call_id);\n\t\t}\n\t\tif (edge.child_run_id) {\n\t\t\tchildRunIds.add(edge.child_run_id);\n\t\t}\n\t\tif (edge.thread_id) {\n\t\t\tthreadIds.add(edge.thread_id);\n\t\t}\n\t}\n\tconst trackedSources = [\n\t\t...state.tracked_tools,\n\t\t...state.pending_approvals,\n\t\t...state.pending_client_tools,\n\t\t...state.pending_mcp_elicitations,\n\t\t...state.pending_user_inputs,\n\t\t...state.pending_tool_retries,\n\t];\n\tconst codexTrackedSourceCallIds = new Set<string>();\n\tfor (const source of trackedSources) {\n\t\tconst tool = source.tool;\n\t\tconst isCodexSubagentTool = tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX);\n\t\tconst hasCodexWorkArgs = collectCodexWorkArgs(\n\t\t\tsource.args,\n\t\t\tchildRunIds,\n\t\t\tthreadIds,\n\t\t\tisCodexSubagentTool,\n\t\t);\n\t\tif (isCodexSubagentTool || hasCodexWorkArgs) {\n\t\t\tcodexTrackedSourceCallIds.add(source.call_id);\n\t\t\tcodexToolCallIds.add(source.call_id);\n\t\t\tcollectCodexSubagentEdgesFromSource(source, codexSubagentEdges);\n\t\t}\n\t}\n\tfor (const activeTool of state.active_tools) {\n\t\tif (activeTool.tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX)) {\n\t\t\tconst hasTrackedSource = codexToolCallIds.has(activeTool.call_id);\n\t\t\tcodexToolCallIds.add(activeTool.call_id);\n\t\t\tif (!hasTrackedSource) {\n\t\t\t\tcollectCodexSubagentEdgesFromSource(\n\t\t\t\t\t{ call_id: activeTool.call_id, tool: activeTool.tool },\n\t\t\t\t\tcodexSubagentEdges,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconst sortedEdges = [...codexSubagentEdges.values()].sort((left, right) =>\n\t\tcodexSubagentEdgeKey(left).localeCompare(codexSubagentEdgeKey(right)),\n\t);\n\tconst activeCodexSubagentEdgeCount = sortedEdges.filter(\n\t\t(edge) => !codexSubagentStatusIsTerminal(edge.status),\n\t).length;\n\tconst nonCodexActiveToolCount = state.active_tools.filter(\n\t\t(tool) => !tool.tool.startsWith(CODEX_SUBAGENT_TOOL_PREFIX),\n\t).length;\n\tconst nonCodexTrackedToolCount = state.tracked_tools.filter(\n\t\t(tool) => !codexTrackedSourceCallIds.has(tool.call_id),\n\t).length;\n\tconst trackedCodexSubagentCount = Math.max(\n\t\tcodexToolCallIds.size,\n\t\tsortedEdges.length,\n\t);\n\treturn {\n\t\tprotocol_version: HOSTED_RUNNER_WORK_CONTINUITY_VERSION,\n\t\tcodex_subagent_schema_version: CODEX_SUBAGENT_WORK_GRAPH_SCHEMA,\n\t\tactive_tool_count:\n\t\t\tsortedEdges.length > 0\n\t\t\t\t? nonCodexActiveToolCount + activeCodexSubagentEdgeCount\n\t\t\t\t: state.active_tools.length,\n\t\ttracked_tool_count:\n\t\t\tsortedEdges.length > 0\n\t\t\t\t? nonCodexTrackedToolCount + trackedCodexSubagentCount\n\t\t\t\t: state.tracked_tools.length,\n\t\tpending_request_count:\n\t\t\tstate.pending_approvals.length +\n\t\t\tstate.pending_client_tools.length +\n\t\t\tstate.pending_mcp_elicitations.length +\n\t\t\tstate.pending_user_inputs.length +\n\t\t\tstate.pending_tool_retries.length,\n\t\tcodex_subagent_tool_call_ids: [...codexToolCallIds].sort(),\n\t\tcodex_subagent_child_run_ids: [...childRunIds].sort(),\n\t\tcodex_subagent_thread_ids: [...threadIds].sort(),\n\t\t...(sortedEdges.length > 0 ? { codex_subagent_edges: sortedEdges } : {}),\n\t};\n}\n\nexport async function drainHostedRunner(\n\tinput: HostedRunnerDrainInput,\n\toptions: DrainHostedRunnerOptions,\n): Promise<HostedRunnerDrainResult | null> {\n\tconst hostedRunner = options.hostedRunner;\n\tif (!hostedRunner?.enabled || !hostedRunner.runnerSessionId) {\n\t\treturn null;\n\t}\n\n\tconst requestedAtDate = options.now?.() ?? new Date();\n\tmarkHostedRunnerLeaseDraining(hostedRunner, requestedAtDate);\n\tconst requestedAt = requestedAtDate.toISOString();\n\tconst workspaceRoot = await resolveWorkspaceRoot(hostedRunner);\n\tconst snapshotRoot = resolve(\n\t\tworkspaceRoot,\n\t\thostedRunner.snapshotRoot ?? \".maestro/runner-snapshots\",\n\t);\n\tawait mkdir(snapshotRoot, { recursive: true });\n\tconst snapshotPath = join(\n\t\tsnapshotRoot,\n\t\tsafeManifestFileName(hostedRunner.runnerSessionId, requestedAt),\n\t);\n\tconst exportPaths = await resolveWorkspaceExportPaths(\n\t\tworkspaceRoot,\n\t\tinput.exportPaths,\n\t);\n\tconst activeSessionId =\n\t\thostedRunner.activeMaestroSessionId ??\n\t\thostedRunner.configuredMaestroSessionId;\n\tconst maestroSessionId = activeSessionId ?? hostedRunner.runnerSessionId;\n\n\tlet status: HostedRunnerDrainStatus = HostedRunnerDrainStatusValue.Drained;\n\tlet runtime: HostedRunnerSnapshotManifest[\"runtime\"] = {\n\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Skipped,\n\t\tsession_id: maestroSessionId,\n\t};\n\tlet runtimeSnapshot: HeadlessRuntimeSnapshot | undefined;\n\tlet recordPlatformDrain:\n\t\t| ((input: HostedRunnerPlatformDrainRecordInput) => Promise<void>)\n\t\t| undefined;\n\n\tif (activeSessionId && options.drainRuntime) {\n\t\ttry {\n\t\t\tconst runtimeResult = await options.drainRuntime(activeSessionId, {\n\t\t\t\treason: input.reason,\n\t\t\t\trequestedBy: input.requestedBy,\n\t\t\t\tmanifestPath: snapshotPath,\n\t\t\t});\n\t\t\tconst runtimeProtocolVersion =\n\t\t\t\truntimeResult?.protocolVersion ??\n\t\t\t\truntimeResult?.snapshot?.protocolVersion;\n\t\t\tconst runtimeCursor =\n\t\t\t\truntimeResult?.cursor ?? runtimeResult?.snapshot?.cursor;\n\t\t\truntime = runtimeResult\n\t\t\t\t? {\n\t\t\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Completed,\n\t\t\t\t\t\tsession_id: runtimeResult.sessionId,\n\t\t\t\t\t\t...(runtimeResult.sessionFile\n\t\t\t\t\t\t\t? { session_file: runtimeResult.sessionFile }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(runtimeProtocolVersion\n\t\t\t\t\t\t\t? { protocol_version: runtimeProtocolVersion }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(runtimeCursor !== undefined ? { cursor: runtimeCursor } : {}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Skipped,\n\t\t\t\t\t\tsession_id: activeSessionId,\n\t\t\t\t\t};\n\t\t\truntimeSnapshot = runtimeResult?.snapshot;\n\t\t\trecordPlatformDrain = runtimeResult?.recordPlatformDrain;\n\t\t} catch (error) {\n\t\t\tstatus = HostedRunnerDrainStatusValue.Interrupted;\n\t\t\tconst interruptedRuntime =\n\t\t\t\terror instanceof HostedRunnerRuntimeDrainError ? error : undefined;\n\t\t\truntimeSnapshot = interruptedRuntime?.snapshot;\n\t\t\trecordPlatformDrain = interruptedRuntime?.recordPlatformDrain;\n\t\t\truntime = {\n\t\t\t\tflush_status: HostedRunnerRuntimeFlushStatusValue.Failed,\n\t\t\t\tsession_id: interruptedRuntime?.sessionId ?? activeSessionId,\n\t\t\t\t...(interruptedRuntime?.sessionFile\n\t\t\t\t\t? { session_file: interruptedRuntime.sessionFile }\n\t\t\t\t\t: {}),\n\t\t\t\t...(interruptedRuntime?.protocolVersion\n\t\t\t\t\t? { protocol_version: interruptedRuntime.protocolVersion }\n\t\t\t\t\t: {}),\n\t\t\t\t...(interruptedRuntime?.cursor !== undefined\n\t\t\t\t\t? { cursor: interruptedRuntime.cursor }\n\t\t\t\t\t: {}),\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tconst git = await collectGitState(workspaceRoot);\n\tconst snapshot =\n\t\truntimeSnapshot ??\n\t\tbuildHostedRunnerSnapshot(maestroSessionId, workspaceRoot, runtime);\n\tconst workContinuity = collectHostedRunnerWorkContinuity(snapshot);\n\tconst retentionPolicy = buildHostedRunnerRetentionPolicy();\n\tconst platformEvidence = buildHostedRunnerPlatformEvidence({\n\t\thostedRunner,\n\t\tstatus,\n\t\tmaestroSessionId,\n\t\tcreatedAt: requestedAt,\n\t\tmanifestPath: snapshotPath,\n\t\truntime,\n\t\tworkContinuity,\n\t\tretentionPolicy,\n\t\treason: input.reason,\n\t\trequestedBy: input.requestedBy,\n\t});\n\tconst manifest: HostedRunnerSnapshotManifest = {\n\t\tprotocol_version: HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION,\n\t\trunner_session_id: hostedRunner.runnerSessionId,\n\t\t...(hostedRunner.workspaceId\n\t\t\t? { workspace_id: hostedRunner.workspaceId }\n\t\t\t: {}),\n\t\t...(hostedRunner.agentRunId\n\t\t\t? { agent_run_id: hostedRunner.agentRunId }\n\t\t\t: {}),\n\t\tmaestro_session_id: maestroSessionId,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requested_by: input.requestedBy } : {}),\n\t\tcreated_at: requestedAt,\n\t\tworkspace_root: workspaceRoot,\n\t\truntime,\n\t\tworkspace_export: {\n\t\t\tmode: HostedRunnerWorkspaceExportModeValue.LocalPathContract,\n\t\t\tpaths: exportPaths,\n\t\t},\n\t\twork_continuity: workContinuity,\n\t\tplatform_evidence: platformEvidence,\n\t\tsnapshot,\n\t\tretention_policy: retentionPolicy,\n\t\t...(git ? { git } : {}),\n\t};\n\n\ttry {\n\t\tawait writeFile(\n\t\t\tsnapshotPath,\n\t\t\t`${JSON.stringify(manifest, null, 2)}\\n`,\n\t\t\t\"utf8\",\n\t\t);\n\t\thostedRunner.lastDrain = {\n\t\t\tstatus,\n\t\t\tmanifestPath: snapshotPath,\n\t\t\tdrainedAt: requestedAt,\n\t\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t\t...(input.requestedBy ? { requestedBy: input.requestedBy } : {}),\n\t\t};\n\t} catch (error) {\n\t\tconst errorMessage = `Hosted runner drain manifest persistence failed: ${\n\t\t\terror instanceof Error ? error.message : String(error)\n\t\t}`;\n\t\tawait recordPlatformDrain?.({\n\t\t\tstatus: HostedRunnerDrainStatusValue.Interrupted,\n\t\t\treason: input.reason,\n\t\t\trequestedBy: input.requestedBy,\n\t\t\tflushStatus: runtime.flush_status,\n\t\t\tmanifestPath: snapshotPath,\n\t\t\tplatformEvidence: buildHostedRunnerPlatformEvidence({\n\t\t\t\thostedRunner,\n\t\t\t\tstatus: HostedRunnerDrainStatusValue.Interrupted,\n\t\t\t\tmaestroSessionId,\n\t\t\t\tcreatedAt: requestedAt,\n\t\t\t\tmanifestPath: snapshotPath,\n\t\t\t\truntime,\n\t\t\t\tworkContinuity,\n\t\t\t\tretentionPolicy,\n\t\t\t\treason: input.reason,\n\t\t\t\trequestedBy: input.requestedBy,\n\t\t\t}),\n\t\t\terrorMessage,\n\t\t});\n\t\tthrow error;\n\t}\n\tawait recordPlatformDrain?.({\n\t\tstatus,\n\t\treason: input.reason,\n\t\trequestedBy: input.requestedBy,\n\t\tflushStatus: runtime.flush_status,\n\t\tmanifestPath: snapshotPath,\n\t\tplatformEvidence,\n\t\terrorMessage: runtime.error,\n\t});\n\n\treturn {\n\t\tstatus,\n\t\trunner_session_id: hostedRunner.runnerSessionId,\n\t\t...(input.reason ? { reason: input.reason } : {}),\n\t\t...(input.requestedBy ? { requested_by: input.requestedBy } : {}),\n\t\tmanifest_path: snapshotPath,\n\t\tmanifest,\n\t};\n}\n\nasync function drainActiveRuntime(\n\tcontext: HostedRunnerDrainRuntimeContext,\n\tsessionId: string,\n\t_terminal: HostedRunnerRuntimeTerminalInput,\n): Promise<HostedRunnerRuntimeDrainResult | null> {\n\tconst runtime =\n\t\tcontext.headlessRuntimeService.getRuntimeBySessionId(sessionId);\n\tif (!runtime) {\n\t\treturn null;\n\t}\n\tconst snapshot = runtime.getSnapshot();\n\tconst sessionFile = runtime.getSessionFile();\n\tconst recordPlatformDrain = async (\n\t\tinput: HostedRunnerPlatformDrainRecordInput,\n\t) => {\n\t\tawait runtime.recordHostedAgentRuntimeDrain({\n\t\t\tstatus: input.status,\n\t\t\treason: input.reason,\n\t\t\trequestedBy: input.requestedBy,\n\t\t\tflushStatus: input.flushStatus,\n\t\t\tmanifestPath: input.manifestPath,\n\t\t\tplatformEvidence: input.platformEvidence,\n\t\t\terrorMessage: input.errorMessage\n\t\t\t\t? `Hosted runner drain failed: ${input.errorMessage}`\n\t\t\t\t: undefined,\n\t\t});\n\t};\n\ttry {\n\t\tawait runtime.dispose();\n\t} catch (error) {\n\t\tthrow new HostedRunnerRuntimeDrainError(\n\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t{\n\t\t\t\tsessionId: snapshot.session_id,\n\t\t\t\tsessionFile,\n\t\t\t\tprotocolVersion: snapshot.protocolVersion,\n\t\t\t\tcursor: snapshot.cursor,\n\t\t\t\tsnapshot,\n\t\t\t\trecordPlatformDrain,\n\t\t\t},\n\t\t);\n\t}\n\treturn {\n\t\tsessionId: snapshot.session_id,\n\t\tsessionFile,\n\t\tprotocolVersion: snapshot.protocolVersion,\n\t\tcursor: snapshot.cursor,\n\t\tsnapshot,\n\t\trecordPlatformDrain,\n\t};\n}\n\nexport async function drainHostedRunnerForShutdown(\n\tcontext: HostedRunnerDrainRuntimeContext,\n\toptions: DrainHostedRunnerForShutdownOptions = {},\n): Promise<HostedRunnerDrainResult | null> {\n\treturn drainHostedRunner(\n\t\t{\n\t\t\treason: options.reason ?? HostedRunnerDrainReasonValue.ProcessShutdown,\n\t\t\trequestedBy:\n\t\t\t\toptions.requestedBy ??\n\t\t\t\tHostedRunnerDrainRequestedByValue.MaestroWebServer,\n\t\t},\n\t\t{\n\t\t\thostedRunner: context.hostedRunner,\n\t\t\tdrainRuntime: (sessionId, terminal) =>\n\t\t\t\tdrainActiveRuntime(context, sessionId, terminal),\n\t\t\tnow: options.now,\n\t\t},\n\t);\n}\n\nexport async function handleHostedRunnerDrain(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n): Promise<void> {\n\tres.setHeader(\"Cache-Control\", \"no-store\");\n\tconst body = await readJsonBody<Record<string, unknown>>(req, 64_000);\n\tconst input = parseHostedRunnerDrainInput(body);\n\tconst result = await drainHostedRunner(input, {\n\t\thostedRunner: context.hostedRunner,\n\t\tdrainRuntime: (sessionId, terminal) =>\n\t\t\tdrainActiveRuntime(context, sessionId, terminal),\n\t});\n\n\tif (!result) {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t404,\n\t\t\t{\n\t\t\t\terror: \"hosted runner drain unavailable\",\n\t\t\t},\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t\treturn;\n\t}\n\n\tsendJson(\n\t\tres,\n\t\tresult.status === HostedRunnerDrainStatusValue.Interrupted ? 503 : 200,\n\t\t{\n\t\t\tprotocol_version: HOSTED_RUNNER_DRAIN_PROTOCOL_VERSION,\n\t\t\tstatus: result.status,\n\t\t\trunner_session_id: result.runner_session_id,\n\t\t\trequested_by: result.requested_by,\n\t\t\treason: result.reason,\n\t\t\tmanifest_path: result.manifest_path,\n\t\t\tmanifest: result.manifest,\n\t\t},\n\t\tcontext.corsHeaders,\n\t\treq,\n\t);\n}\n"]}
|