@evalops/maestro 0.10.42 → 0.10.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/operating-plane.d.ts.map +1 -1
- package/dist/cli/commands/operating-plane.js +3 -2
- package/dist/cli/commands/operating-plane.js.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.js +247 -97
- package/dist/codex/subagent-dispatch-table.d.ts +1 -1
- package/dist/codex/subagent-dispatch-table.js +1 -1
- package/dist/codex/subagent-dispatch-table.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +12 -6
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
- package/dist/platform/a2a-completion-audit.js +28 -20
- package/dist/platform/a2a-completion-audit.js.map +1 -1
- package/dist/platform/a2a-maestro-peer.js +8 -7
- package/dist/platform/a2a-maestro-peer.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +2 -2
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.js +3 -3
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -1
- package/dist/platform/operating-plane-client.d.ts +2 -2
- package/dist/platform/operating-plane-client.d.ts.map +1 -1
- package/dist/platform/operating-plane-client.js.map +1 -1
- package/dist/platform/operating-plane-summary.d.ts +4 -4
- package/dist/platform/operating-plane-summary.d.ts.map +1 -1
- package/dist/platform/operating-plane-summary.js +39 -27
- package/dist/platform/operating-plane-summary.js.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.d.ts +28 -0
- package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.js +55 -2
- package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
- package/dist/server/session-timeline.d.ts.map +1 -1
- package/dist/server/session-timeline.js +112 -2
- package/dist/server/session-timeline.js.map +1 -1
- package/dist/tools/background/resource-monitor.d.ts.map +1 -1
- package/dist/tools/background/resource-monitor.js +8 -6
- package/dist/tools/background/resource-monitor.js.map +1 -1
- package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
- package/dist/tools/parallel-ripgrep.js +2 -2
- package/dist/tools/parallel-ripgrep.js.map +1 -1
- package/dist/tools/ripgrep-utils.d.ts +1 -0
- package/dist/tools/ripgrep-utils.d.ts.map +1 -1
- package/dist/tools/ripgrep-utils.js +4 -0
- package/dist/tools/ripgrep-utils.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +2 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +2 -2
|
@@ -3,7 +3,7 @@ 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
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
|
+
import { HOSTED_RUNNER_LEASE_PROTOCOL_VERSION, markHostedRunnerLeaseDraining, } from "../hosted-runner-lease.js";
|
|
7
7
|
import { ApiError, readJsonBody, sendJson } from "../server-utils.js";
|
|
8
8
|
const execFileAsync = promisify(execFile);
|
|
9
9
|
export const HOSTED_RUNNER_DRAIN_PATH = "/.well-known/evalops/remote-runner/drain";
|
|
@@ -12,6 +12,7 @@ export const HOSTED_RUNNER_SNAPSHOT_MANIFEST_VERSION = "evalops.remote-runner.sn
|
|
|
12
12
|
export const HOSTED_RUNNER_RETENTION_POLICY_VERSION = "evalops.remote-runner.retention.v1";
|
|
13
13
|
export const HOSTED_RUNNER_WORK_CONTINUITY_VERSION = "evalops.remote-runner.work-continuity.v1";
|
|
14
14
|
export const HOSTED_RUNNER_PLATFORM_EVIDENCE_VERSION = "evalops.remote-runner.platform-evidence.v1";
|
|
15
|
+
export const HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION = "evalops.remote-runner.runtime-continuity.v1";
|
|
15
16
|
export var HostedRunnerDrainStatusValue;
|
|
16
17
|
(function (HostedRunnerDrainStatusValue) {
|
|
17
18
|
HostedRunnerDrainStatusValue["Drained"] = "drained";
|
|
@@ -237,6 +238,32 @@ function buildHostedRunnerRetentionPolicy() {
|
|
|
237
238
|
},
|
|
238
239
|
};
|
|
239
240
|
}
|
|
241
|
+
function buildHostedRunnerRuntimeContinuity(input) {
|
|
242
|
+
return {
|
|
243
|
+
protocol_version: HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION,
|
|
244
|
+
handoff: "drain_restore",
|
|
245
|
+
source_runner_session_id: input.hostedRunner.runnerSessionId,
|
|
246
|
+
...(input.hostedRunner.ownerInstanceId
|
|
247
|
+
? { source_owner_instance_id: input.hostedRunner.ownerInstanceId }
|
|
248
|
+
: {}),
|
|
249
|
+
source_process_id: process.pid,
|
|
250
|
+
source_runtime_lease: {
|
|
251
|
+
protocol_version: HOSTED_RUNNER_LEASE_PROTOCOL_VERSION,
|
|
252
|
+
state: input.leaseSnapshot.state,
|
|
253
|
+
generation: input.leaseSnapshot.generation,
|
|
254
|
+
...(input.leaseSnapshot.maestroSessionId
|
|
255
|
+
? { maestro_session_id: input.leaseSnapshot.maestroSessionId }
|
|
256
|
+
: {}),
|
|
257
|
+
updated_at: input.leaseSnapshot.updatedAt,
|
|
258
|
+
},
|
|
259
|
+
restore_environment_key: "MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST",
|
|
260
|
+
restore_manifest_path: input.manifestPath,
|
|
261
|
+
evidence_refs: [
|
|
262
|
+
`remote-runner://sessions/${input.hostedRunner.runnerSessionId}/drain#snapshot`,
|
|
263
|
+
`maestro://headless/sessions/${input.maestroSessionId}#cursor:${input.runtime.cursor ?? 0}`,
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
240
267
|
function buildHostedRunnerPlatformEvidence(input) {
|
|
241
268
|
const edges = input.workContinuity.codex_subagent_edges ?? [];
|
|
242
269
|
return {
|
|
@@ -272,6 +299,22 @@ function buildHostedRunnerPlatformEvidence(input) {
|
|
|
272
299
|
codex_subagent_thread_ids: input.workContinuity.codex_subagent_thread_ids,
|
|
273
300
|
...(edges.length > 0 ? { codex_subagent_edges: edges } : {}),
|
|
274
301
|
},
|
|
302
|
+
runtime_continuity: {
|
|
303
|
+
protocol_version: input.runtimeContinuity.protocol_version,
|
|
304
|
+
handoff: input.runtimeContinuity.handoff,
|
|
305
|
+
...(input.runtimeContinuity.source_owner_instance_id
|
|
306
|
+
? {
|
|
307
|
+
source_owner_instance_id: input.runtimeContinuity.source_owner_instance_id,
|
|
308
|
+
}
|
|
309
|
+
: {}),
|
|
310
|
+
source_process_id: input.runtimeContinuity.source_process_id,
|
|
311
|
+
...(input.runtimeContinuity.source_runtime_lease
|
|
312
|
+
? {
|
|
313
|
+
source_runtime_lease_generation: input.runtimeContinuity.source_runtime_lease.generation,
|
|
314
|
+
}
|
|
315
|
+
: {}),
|
|
316
|
+
restore_manifest_path: input.runtimeContinuity.restore_manifest_path,
|
|
317
|
+
},
|
|
275
318
|
retention: {
|
|
276
319
|
policy_version: input.retentionPolicy.policy_version,
|
|
277
320
|
control_plane_metadata_visibility: input.retentionPolicy.visibility.control_plane_metadata,
|
|
@@ -423,7 +466,7 @@ export async function drainHostedRunner(input, options) {
|
|
|
423
466
|
return null;
|
|
424
467
|
}
|
|
425
468
|
const requestedAtDate = options.now?.() ?? new Date();
|
|
426
|
-
markHostedRunnerLeaseDraining(hostedRunner, requestedAtDate);
|
|
469
|
+
const leaseSnapshot = markHostedRunnerLeaseDraining(hostedRunner, requestedAtDate);
|
|
427
470
|
const requestedAt = requestedAtDate.toISOString();
|
|
428
471
|
const workspaceRoot = await resolveWorkspaceRoot(hostedRunner);
|
|
429
472
|
const snapshotRoot = resolve(workspaceRoot, hostedRunner.snapshotRoot ?? ".maestro/runner-snapshots");
|
|
@@ -495,6 +538,13 @@ export async function drainHostedRunner(input, options) {
|
|
|
495
538
|
buildHostedRunnerSnapshot(maestroSessionId, workspaceRoot, runtime);
|
|
496
539
|
const workContinuity = collectHostedRunnerWorkContinuity(snapshot);
|
|
497
540
|
const retentionPolicy = buildHostedRunnerRetentionPolicy();
|
|
541
|
+
const runtimeContinuity = buildHostedRunnerRuntimeContinuity({
|
|
542
|
+
hostedRunner,
|
|
543
|
+
maestroSessionId,
|
|
544
|
+
manifestPath: snapshotPath,
|
|
545
|
+
runtime,
|
|
546
|
+
leaseSnapshot,
|
|
547
|
+
});
|
|
498
548
|
const platformEvidence = buildHostedRunnerPlatformEvidence({
|
|
499
549
|
hostedRunner,
|
|
500
550
|
status,
|
|
@@ -502,6 +552,7 @@ export async function drainHostedRunner(input, options) {
|
|
|
502
552
|
createdAt: requestedAt,
|
|
503
553
|
manifestPath: snapshotPath,
|
|
504
554
|
runtime,
|
|
555
|
+
runtimeContinuity,
|
|
505
556
|
workContinuity,
|
|
506
557
|
retentionPolicy,
|
|
507
558
|
reason: input.reason,
|
|
@@ -526,6 +577,7 @@ export async function drainHostedRunner(input, options) {
|
|
|
526
577
|
mode: HostedRunnerWorkspaceExportModeValue.LocalPathContract,
|
|
527
578
|
paths: exportPaths,
|
|
528
579
|
},
|
|
580
|
+
runtime_continuity: runtimeContinuity,
|
|
529
581
|
work_continuity: workContinuity,
|
|
530
582
|
platform_evidence: platformEvidence,
|
|
531
583
|
snapshot,
|
|
@@ -557,6 +609,7 @@ export async function drainHostedRunner(input, options) {
|
|
|
557
609
|
createdAt: requestedAt,
|
|
558
610
|
manifestPath: snapshotPath,
|
|
559
611
|
runtime,
|
|
612
|
+
runtimeContinuity,
|
|
560
613
|
workContinuity,
|
|
561
614
|
retentionPolicy,
|
|
562
615
|
reason: input.reason,
|
|
@@ -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\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"]}
|
|
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 {\n\tHOSTED_RUNNER_LEASE_PROTOCOL_VERSION,\n\ttype HostedRunnerLeaseSnapshot,\n\tmarkHostedRunnerLeaseDraining,\n} 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 const HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION =\n\t\"evalops.remote-runner.runtime-continuity.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\truntime_continuity: HostedRunnerRuntimeContinuity;\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 HostedRunnerRuntimeContinuity {\n\tprotocol_version: typeof HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION;\n\thandoff: \"drain_restore\";\n\tsource_runner_session_id: string;\n\tsource_owner_instance_id?: string;\n\tsource_process_id: number;\n\tsource_runtime_lease?: {\n\t\tprotocol_version: typeof HOSTED_RUNNER_LEASE_PROTOCOL_VERSION;\n\t\tstate: HostedRunnerLeaseSnapshot[\"state\"];\n\t\tgeneration: number;\n\t\tmaestro_session_id?: string;\n\t\tupdated_at: string;\n\t};\n\trestore_environment_key: \"MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST\";\n\trestore_manifest_path: string;\n\tevidence_refs: string[];\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\truntime_continuity: {\n\t\tprotocol_version: typeof HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION;\n\t\thandoff: \"drain_restore\";\n\t\tsource_owner_instance_id?: string;\n\t\tsource_process_id: number;\n\t\tsource_runtime_lease_generation?: number;\n\t\trestore_manifest_path: string;\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 buildHostedRunnerRuntimeContinuity(input: {\n\thostedRunner: HostedRunnerContext;\n\tmaestroSessionId: string;\n\tmanifestPath: string;\n\truntime: HostedRunnerSnapshotManifest[\"runtime\"];\n\tleaseSnapshot: HostedRunnerLeaseSnapshot;\n}): HostedRunnerRuntimeContinuity {\n\treturn {\n\t\tprotocol_version: HOSTED_RUNNER_RUNTIME_CONTINUITY_VERSION,\n\t\thandoff: \"drain_restore\",\n\t\tsource_runner_session_id: input.hostedRunner.runnerSessionId,\n\t\t...(input.hostedRunner.ownerInstanceId\n\t\t\t? { source_owner_instance_id: input.hostedRunner.ownerInstanceId }\n\t\t\t: {}),\n\t\tsource_process_id: process.pid,\n\t\tsource_runtime_lease: {\n\t\t\tprotocol_version: HOSTED_RUNNER_LEASE_PROTOCOL_VERSION,\n\t\t\tstate: input.leaseSnapshot.state,\n\t\t\tgeneration: input.leaseSnapshot.generation,\n\t\t\t...(input.leaseSnapshot.maestroSessionId\n\t\t\t\t? { maestro_session_id: input.leaseSnapshot.maestroSessionId }\n\t\t\t\t: {}),\n\t\t\tupdated_at: input.leaseSnapshot.updatedAt,\n\t\t},\n\t\trestore_environment_key: \"MAESTRO_REMOTE_RUNNER_RESTORE_MANIFEST\",\n\t\trestore_manifest_path: input.manifestPath,\n\t\tevidence_refs: [\n\t\t\t`remote-runner://sessions/${input.hostedRunner.runnerSessionId}/drain#snapshot`,\n\t\t\t`maestro://headless/sessions/${input.maestroSessionId}#cursor:${\n\t\t\t\tinput.runtime.cursor ?? 0\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\truntimeContinuity: HostedRunnerRuntimeContinuity;\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\truntime_continuity: {\n\t\t\tprotocol_version: input.runtimeContinuity.protocol_version,\n\t\t\thandoff: input.runtimeContinuity.handoff,\n\t\t\t...(input.runtimeContinuity.source_owner_instance_id\n\t\t\t\t? {\n\t\t\t\t\t\tsource_owner_instance_id:\n\t\t\t\t\t\t\tinput.runtimeContinuity.source_owner_instance_id,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\tsource_process_id: input.runtimeContinuity.source_process_id,\n\t\t\t...(input.runtimeContinuity.source_runtime_lease\n\t\t\t\t? {\n\t\t\t\t\t\tsource_runtime_lease_generation:\n\t\t\t\t\t\t\tinput.runtimeContinuity.source_runtime_lease.generation,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\trestore_manifest_path: input.runtimeContinuity.restore_manifest_path,\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\tconst leaseSnapshot = markHostedRunnerLeaseDraining(\n\t\thostedRunner,\n\t\trequestedAtDate,\n\t);\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 runtimeContinuity = buildHostedRunnerRuntimeContinuity({\n\t\thostedRunner,\n\t\tmaestroSessionId,\n\t\tmanifestPath: snapshotPath,\n\t\truntime,\n\t\tleaseSnapshot,\n\t});\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\truntimeContinuity,\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\truntime_continuity: runtimeContinuity,\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\truntimeContinuity,\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-timeline.d.ts","sourceRoot":"","sources":["../../src/server/session-timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,sBAAsB,EAGtB,2BAA2B,EAE3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACX,UAAU,EAIV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,UAAU,+BAA+B;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"session-timeline.d.ts","sourceRoot":"","sources":["../../src/server/session-timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,sBAAsB,EAGtB,2BAA2B,EAE3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACX,UAAU,EAIV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,UAAU,+BAA+B;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAiyBD,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,+BAA+B,GACtC,2BAA2B,CAgD7B"}
|
|
@@ -30,6 +30,91 @@ function finiteNumber(value) {
|
|
|
30
30
|
function booleanValue(value) {
|
|
31
31
|
return typeof value === "boolean" ? value : undefined;
|
|
32
32
|
}
|
|
33
|
+
function stringValue(value) {
|
|
34
|
+
return typeof value === "string" && value.trim().length > 0
|
|
35
|
+
? value
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
function isPendingRequestKind(value) {
|
|
39
|
+
return (value === "approval" ||
|
|
40
|
+
value === "client_tool" ||
|
|
41
|
+
value === "mcp_elicitation" ||
|
|
42
|
+
value === "user_input" ||
|
|
43
|
+
value === "tool_retry");
|
|
44
|
+
}
|
|
45
|
+
function isPendingRequestSource(value) {
|
|
46
|
+
return value === "local" || value === "platform";
|
|
47
|
+
}
|
|
48
|
+
function isPendingRequestPlatformSource(value) {
|
|
49
|
+
return value === "approvals_service" || value === "tool_execution";
|
|
50
|
+
}
|
|
51
|
+
function pendingRequestFromCustomEntry(entry, sessionId, timestamp) {
|
|
52
|
+
if (entry.type !== "custom" || entry.customType !== "pending_request") {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const data = detailsRecord(entry.data);
|
|
56
|
+
const request = detailsRecord(data?.request) ?? data;
|
|
57
|
+
if (!request) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const id = stringValue(request.id);
|
|
61
|
+
const kind = request.kind;
|
|
62
|
+
const toolCallId = stringValue(request.toolCallId);
|
|
63
|
+
const toolName = stringValue(request.toolName);
|
|
64
|
+
const reason = stringValue(request.reason);
|
|
65
|
+
if (!id ||
|
|
66
|
+
!isPendingRequestKind(kind) ||
|
|
67
|
+
!toolCallId ||
|
|
68
|
+
!toolName ||
|
|
69
|
+
!reason) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const platformRecord = detailsRecord(request.platform);
|
|
73
|
+
const platformSource = platformRecord
|
|
74
|
+
? isPendingRequestPlatformSource(platformRecord.source)
|
|
75
|
+
? platformRecord.source
|
|
76
|
+
: undefined
|
|
77
|
+
: undefined;
|
|
78
|
+
const platform = platformSource
|
|
79
|
+
? {
|
|
80
|
+
source: platformSource,
|
|
81
|
+
...(stringValue(platformRecord?.toolExecutionId)
|
|
82
|
+
? { toolExecutionId: stringValue(platformRecord?.toolExecutionId) }
|
|
83
|
+
: {}),
|
|
84
|
+
...(stringValue(platformRecord?.approvalRequestId)
|
|
85
|
+
? {
|
|
86
|
+
approvalRequestId: stringValue(platformRecord?.approvalRequestId),
|
|
87
|
+
}
|
|
88
|
+
: {}),
|
|
89
|
+
}
|
|
90
|
+
: undefined;
|
|
91
|
+
return {
|
|
92
|
+
id,
|
|
93
|
+
kind,
|
|
94
|
+
status: "pending",
|
|
95
|
+
visibility: "user",
|
|
96
|
+
sessionId: stringValue(request.sessionId) ?? sessionId,
|
|
97
|
+
toolCallId,
|
|
98
|
+
toolName,
|
|
99
|
+
...(stringValue(request.displayName)
|
|
100
|
+
? { displayName: stringValue(request.displayName) }
|
|
101
|
+
: {}),
|
|
102
|
+
...(stringValue(request.summaryLabel)
|
|
103
|
+
? { summaryLabel: stringValue(request.summaryLabel) }
|
|
104
|
+
: {}),
|
|
105
|
+
...(stringValue(request.actionDescription)
|
|
106
|
+
? { actionDescription: stringValue(request.actionDescription) }
|
|
107
|
+
: {}),
|
|
108
|
+
args: request.args ?? {},
|
|
109
|
+
reason,
|
|
110
|
+
createdAt: normalizeTimestamp(request.createdAt, timestamp),
|
|
111
|
+
...(stringValue(request.expiresAt)
|
|
112
|
+
? { expiresAt: normalizeTimestamp(request.expiresAt, timestamp) }
|
|
113
|
+
: {}),
|
|
114
|
+
source: isPendingRequestSource(request.source) ? request.source : "local",
|
|
115
|
+
...(platform ? { platform } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
33
118
|
function textFromContent(content) {
|
|
34
119
|
if (typeof content === "string")
|
|
35
120
|
return content;
|
|
@@ -367,6 +452,9 @@ function pendingRequestTitle(request) {
|
|
|
367
452
|
}
|
|
368
453
|
function addPendingRequestItems(items, sessionId, pendingRequests, generatedAt) {
|
|
369
454
|
for (const request of pendingRequests) {
|
|
455
|
+
if (items.some((item) => item.type === "wait.pending" && item.pendingRequestId === request.id)) {
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
370
458
|
const summary = compactTimelineSummary(request.actionDescription || request.summaryLabel || request.reason);
|
|
371
459
|
const platformOperation = platformOperationForPending(request);
|
|
372
460
|
appendItem(items, {
|
|
@@ -522,6 +610,11 @@ function addEntryItems(items, sessionId, entries, generatedAt, context) {
|
|
|
522
610
|
break;
|
|
523
611
|
}
|
|
524
612
|
case "custom": {
|
|
613
|
+
const pendingRequest = pendingRequestFromCustomEntry(entry, sessionId, timestamp);
|
|
614
|
+
if (pendingRequest) {
|
|
615
|
+
addPendingRequestItems(items, sessionId, [pendingRequest], generatedAt);
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
525
618
|
appendItem(items, {
|
|
526
619
|
id: `custom:${entry.id}`,
|
|
527
620
|
sessionId,
|
|
@@ -546,6 +639,22 @@ function sortItems(items) {
|
|
|
546
639
|
return a.id.localeCompare(b.id);
|
|
547
640
|
});
|
|
548
641
|
}
|
|
642
|
+
function pendingRequestCountForItems(items) {
|
|
643
|
+
const pendingRequestIds = new Set();
|
|
644
|
+
let pendingWithoutId = 0;
|
|
645
|
+
for (const item of items) {
|
|
646
|
+
if (item.type !== "wait.pending") {
|
|
647
|
+
continue;
|
|
648
|
+
}
|
|
649
|
+
if (item.pendingRequestId) {
|
|
650
|
+
pendingRequestIds.add(item.pendingRequestId);
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
pendingWithoutId += 1;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
return pendingRequestIds.size + pendingWithoutId;
|
|
657
|
+
}
|
|
549
658
|
export function buildComposerRunTimeline(options) {
|
|
550
659
|
const generatedAt = options.generatedAt ?? new Date().toISOString();
|
|
551
660
|
const items = [];
|
|
@@ -567,13 +676,14 @@ export function buildComposerRunTimeline(options) {
|
|
|
567
676
|
}
|
|
568
677
|
}
|
|
569
678
|
addPendingRequestItems(items, options.sessionId, pendingRequests, generatedAt);
|
|
679
|
+
const sortedItems = sortItems(items);
|
|
570
680
|
return {
|
|
571
681
|
sessionId: options.sessionId,
|
|
572
682
|
source: "local",
|
|
573
683
|
generatedAt,
|
|
574
684
|
platformBacked: false,
|
|
575
|
-
pendingRequestCount:
|
|
576
|
-
items:
|
|
685
|
+
pendingRequestCount: pendingRequestCountForItems(sortedItems),
|
|
686
|
+
items: sortedItems,
|
|
577
687
|
};
|
|
578
688
|
}
|
|
579
689
|
//# sourceMappingURL=session-timeline.js.map
|