@evalops/maestro 0.10.45 → 0.10.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/providers/openai-codex-session.js +1 -1
- package/dist/agent/providers/openai-codex-session.js.map +1 -1
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/protocol-modes-api.js +1 -1
- package/dist/app-server/protocol-modes-api.js.map +1 -1
- package/dist/app-server/sandbox-check-api.d.ts +21 -0
- package/dist/app-server/{sandbox-proof-api.d.ts.map → sandbox-check-api.d.ts.map} +1 -1
- package/dist/app-server/{sandbox-proof-api.js → sandbox-check-api.js} +18 -18
- package/dist/app-server/{sandbox-proof-api.js.map → sandbox-check-api.js.map} +1 -1
- package/dist/app-server/session-api.d.ts +5 -5
- package/dist/app-server/session-api.js +18 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/codex.js +30 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli-tui/auth-state.d.ts +7 -0
- package/dist/cli-tui/auth-state.d.ts.map +1 -0
- package/dist/cli-tui/auth-state.js +46 -0
- package/dist/cli-tui/auth-state.js.map +1 -0
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +6 -1
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.d.ts +2 -5
- package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +6 -5
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +24 -11
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +1 -0
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +25 -2
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +2 -5
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -1
- package/dist/cli-tui/tui-renderer.d.ts +0 -4
- package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer.js +3 -28
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli.js +896 -497
- package/dist/codex/app-server-client.d.ts +8 -2
- package/dist/codex/app-server-client.d.ts.map +1 -1
- package/dist/codex/app-server-client.js +18 -4
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/codex/auth.d.ts +4 -0
- package/dist/codex/auth.d.ts.map +1 -0
- package/dist/codex/auth.js +103 -0
- package/dist/codex/auth.js.map +1 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/evalops/agent-bootstrap.js +2 -2
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +5 -1
- package/dist/main.js.map +1 -1
- package/dist/models/config-loader.d.ts +5 -5
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +19 -19
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +12 -13
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.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/oauth/index.d.ts +1 -0
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +42 -2
- package/dist/oauth/index.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +44 -10
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.d.ts +2 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.js +2 -0
- package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
- package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
- package/dist/server/handlers/platform-a2a-push.js +113 -2
- package/dist/server/handlers/platform-a2a-push.js.map +1 -1
- package/dist/server/headless-in-process-host.d.ts.map +1 -1
- package/dist/server/headless-in-process-host.js +1 -1
- package/dist/server/headless-in-process-host.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +9 -2
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +54 -15
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/tools/background/task-runtime.js +1 -1
- package/dist/tools/background/task-runtime.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +1 -1
- package/dist/app-server/sandbox-proof-api.d.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-sessions.js","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport {\n\ttype HeadlessConnectionRole,\n\theadlessApprovalModes,\n\theadlessConnectionRoles,\n\theadlessNotificationTypes,\n\theadlessServerRequestTypes,\n\theadlessThinkingLevels,\n\theadlessToAgentMessageSchemasByType,\n\theadlessToAgentMessageTypes,\n\theadlessUtilityOperations,\n} from \"@evalops/contracts\";\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport type { ApprovalMode } from \"../../agent/action-approval.js\";\nimport type { ThinkingLevel } from \"../../agent/types.js\";\nimport type { HeadlessToAgentMessage } from \"../../cli/headless-protocol.js\";\nimport { resolveExistingWorkspaceRoot } from \"../../headless/workspace-root.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport { recordMaestroSessionRuntimeTrigger } from \"../../platform/agent-runtime-client.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { getAuthScopeKey, getAuthSubject } from \"../authz.js\";\nimport type {\n\tHeadlessRuntimeConnectionSnapshot,\n\tHeadlessRuntimeHeartbeatSnapshot,\n\tHeadlessRuntimeStreamEnvelope,\n\tHeadlessSessionRuntime,\n} from \"../headless-runtime-service.js\";\nimport { loadHostedRunnerRestoreManifest } from \"../headless-runtime-service.js\";\nimport {\n\tbindHostedRunnerPlatformLease,\n\tclaimHostedRunnerLease,\n\tevaluateHostedRunnerLeaseUse,\n} from \"../hosted-runner-lease.js\";\nimport { getTraceParentHeader } from \"../request-context.js\";\nimport {\n\tApiError,\n\tgetRequestHeader,\n\treadRequestBody,\n\tsendJson,\n} from \"../server-utils.js\";\nimport { createSessionManagerForRequest } from \"../session-scope.js\";\nimport { parseAndValidateJson, validatePayload } from \"../validation.js\";\n\nexport enum HostedRunnerErrorType {\n\tRuntimeNotReady = \"runtime_not_ready\",\n\tRuntimeOwnedElsewhere = \"runtime_owned_elsewhere\",\n}\n\nconst HOSTED_RUNNER_ERROR_DOMAIN = \"maestro.hosted_runner\";\n\nfunction stringLiteralUnion<const T extends readonly string[]>(values: T) {\n\treturn Type.Unsafe<T[number]>(\n\t\tType.Union(\n\t\t\tvalues.map((value) => Type.Literal(value)) as unknown as [\n\t\t\t\tTSchema,\n\t\t\t\t...TSchema[],\n\t\t\t],\n\t\t),\n\t);\n}\n\nconst HeadlessOptOutNotificationsSchema = Type.Array(\n\tstringLiteralUnion(headlessNotificationTypes),\n\t{\n\t\tuniqueItems: true,\n\t},\n);\n\nconst HeadlessCreateBaseProperties = {\n\tsessionId: Type.Optional(Type.String()),\n\tprotocolVersion: Type.Optional(Type.String()),\n\tclientInfo: Type.Optional(\n\t\tType.Object({\n\t\t\tname: Type.String(),\n\t\t\tversion: Type.Optional(Type.String()),\n\t\t}),\n\t),\n\tworkspaceRoot: Type.Optional(Type.String()),\n\tmodel: Type.Optional(Type.String()),\n\tenableClientTools: Type.Optional(Type.Boolean()),\n\tcapabilities: Type.Optional(\n\t\tType.Object({\n\t\t\tserverRequests: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessServerRequestTypes), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tutilityOperations: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessUtilityOperations), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\trawAgentEvents: Type.Optional(Type.Boolean()),\n\t\t}),\n\t),\n\toptOutNotifications: Type.Optional(HeadlessOptOutNotificationsSchema),\n\trole: Type.Optional(stringLiteralUnion(headlessConnectionRoles)),\n\tclient: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"generic\"),\n\t\t\tType.Literal(\"vscode\"),\n\t\t\tType.Literal(\"jetbrains\"),\n\t\t\tType.Literal(\"conductor\"),\n\t\t]),\n\t),\n\tthinkingLevel: Type.Optional(stringLiteralUnion(headlessThinkingLevels)),\n\tapprovalMode: Type.Optional(stringLiteralUnion(headlessApprovalModes)),\n} as const;\n\nconst HeadlessSessionCreateSchema = Type.Object(HeadlessCreateBaseProperties);\n\nconst HeadlessConnectionCreateSchema = Type.Object({\n\t...HeadlessCreateBaseProperties,\n\tconnectionId: Type.Optional(Type.String()),\n\ttakeControl: Type.Optional(Type.Boolean()),\n});\n\nconst HeadlessMessageTypeSchema = Type.Object(\n\t{\n\t\ttype: stringLiteralUnion(headlessToAgentMessageTypes),\n\t},\n\t{ additionalProperties: true },\n);\n\nconst HeadlessSessionSubscribeSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tprotocolVersion: Type.Optional(Type.String()),\n\tclientInfo: Type.Optional(\n\t\tType.Object({\n\t\t\tname: Type.String(),\n\t\t\tversion: Type.Optional(Type.String()),\n\t\t}),\n\t),\n\tcapabilities: Type.Optional(\n\t\tType.Object({\n\t\t\tserverRequests: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessServerRequestTypes), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tutilityOperations: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessUtilityOperations), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\trawAgentEvents: Type.Optional(Type.Boolean()),\n\t\t}),\n\t),\n\toptOutNotifications: Type.Optional(HeadlessOptOutNotificationsSchema),\n\trole: Type.Optional(stringLiteralUnion(headlessConnectionRoles)),\n\ttakeControl: Type.Optional(Type.Boolean()),\n});\n\nconst HeadlessSessionUnsubscribeSchema = Type.Object({\n\tsubscriptionId: Type.String(),\n});\n\nconst HeadlessSessionHeartbeatSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tsubscriptionId: Type.Optional(Type.String()),\n});\n\nconst HeadlessSessionDisconnectSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tsubscriptionId: Type.Optional(Type.String()),\n});\n\ntype HeadlessSessionCreateInput = Static<typeof HeadlessSessionCreateSchema>;\ntype HeadlessConnectionCreateInput = Static<\n\ttypeof HeadlessConnectionCreateSchema\n>;\ntype HeadlessSessionSubscribeInput = Static<\n\ttypeof HeadlessSessionSubscribeSchema\n>;\ntype HeadlessSessionUnsubscribeInput = Static<\n\ttypeof HeadlessSessionUnsubscribeSchema\n>;\ntype HeadlessSessionHeartbeatInput = Static<\n\ttypeof HeadlessSessionHeartbeatSchema\n>;\ntype HeadlessSessionDisconnectInput = Static<\n\ttypeof HeadlessSessionDisconnectSchema\n>;\ntype HeadlessMessageTypeInput = Static<typeof HeadlessMessageTypeSchema>;\n\nasync function parseHeadlessMessage(\n\treq: IncomingMessage,\n): Promise<HeadlessToAgentMessage> {\n\tconst raw = await readRequestBody(req);\n\tif (!raw.length) {\n\t\tthrow new ApiError(400, \"Request body required\");\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw.toString());\n\t} catch {\n\t\tthrow new ApiError(400, \"Invalid JSON payload\");\n\t}\n\tconst envelope = validatePayload<HeadlessMessageTypeInput>(\n\t\tparsed,\n\t\tHeadlessMessageTypeSchema,\n\t\t\"body\",\n\t);\n\treturn validatePayload<HeadlessToAgentMessage>(\n\t\tparsed,\n\t\theadlessToAgentMessageSchemasByType[envelope.type],\n\t\t\"body\",\n\t);\n}\n\nfunction getHeadlessRole(\n\treq: IncomingMessage,\n\texplicitRole?: HeadlessConnectionRole,\n): HeadlessConnectionRole {\n\tif (explicitRole) {\n\t\treturn explicitRole;\n\t}\n\tconst headerRole = getRequestHeader(\n\t\treq,\n\t\t\"x-composer-headless-role\",\n\t\t\"x-maestro-headless-role\",\n\t);\n\treturn headerRole === \"viewer\" ? \"viewer\" : \"controller\";\n}\n\nfunction getViewerDisallowedServerRequest(\n\tserverRequests?: Static<\n\t\ttypeof HeadlessCreateBaseProperties.capabilities\n\t>[\"serverRequests\"],\n): \"mcp_elicitation\" | \"user_input\" | undefined {\n\tif (serverRequests?.includes(\"mcp_elicitation\")) {\n\t\treturn \"mcp_elicitation\";\n\t}\n\tif (serverRequests?.includes(\"user_input\")) {\n\t\treturn \"user_input\";\n\t}\n\treturn undefined;\n}\n\nfunction writeSse(res: ServerResponse, payload: unknown): boolean {\n\treturn res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n}\n\nfunction getHeadlessSubscriberId(req: IncomingMessage): string | undefined {\n\treturn (\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-headless-subscriber-id\",\n\t\t\t\"x-maestro-headless-subscriber-id\",\n\t\t) ?? undefined\n\t);\n}\n\nfunction getHeadlessConnectionId(req: IncomingMessage): string | undefined {\n\treturn (\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-headless-connection-id\",\n\t\t\t\"x-maestro-headless-connection-id\",\n\t\t) ?? undefined\n\t);\n}\n\nfunction parseOptOutNotifications(\n\treq: IncomingMessage,\n): HeadlessSessionSubscribeInput[\"optOutNotifications\"] {\n\tconst url = new URL(\n\t\treq.url || \"/\",\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\tconst raw = url.searchParams.get(\"optOutNotifications\");\n\tif (!raw) {\n\t\treturn undefined;\n\t}\n\tconst notifications = raw\n\t\t.split(\",\")\n\t\t.map((value) => value.trim())\n\t\t.filter(Boolean);\n\tif (notifications.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn validatePayload<\n\t\tNonNullable<HeadlessSessionSubscribeInput[\"optOutNotifications\"]>\n\t>(\n\t\tnotifications,\n\t\tHeadlessOptOutNotificationsSchema,\n\t\t\"query.optOutNotifications\",\n\t);\n}\n\nfunction getScopeKey(req: IncomingMessage): string {\n\treturn getAuthScopeKey(req);\n}\n\nfunction hostedRunnerErrorMetadata(\n\tcontext: WebServerContext,\n\tmetadata: Record<string, string | undefined>,\n): Record<string, string> {\n\tconst hostedRunner = context.hostedRunner;\n\tconst detailMetadata: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries({\n\t\trunner_session_id: hostedRunner?.runnerSessionId,\n\t\towner_instance_id: hostedRunner?.ownerInstanceId,\n\t\tworkspace_id: hostedRunner?.workspaceId,\n\t\tagent_run_id: hostedRunner?.agentRunId,\n\t\t...metadata,\n\t})) {\n\t\tif (value) {\n\t\t\tdetailMetadata[key] = value;\n\t\t}\n\t}\n\treturn detailMetadata;\n}\n\nfunction hostedRunnerOwnershipError(\n\tcontext: WebServerContext,\n\tmessage: string,\n\tmetadata: Record<string, string | undefined>,\n): ApiError {\n\treturn new ApiError(\n\t\t409,\n\t\tmessage,\n\t\t[\n\t\t\t{\n\t\t\t\treason: HostedRunnerErrorType.RuntimeOwnedElsewhere,\n\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\tmetadata: hostedRunnerErrorMetadata(context, metadata),\n\t\t\t},\n\t\t],\n\t\tHostedRunnerErrorType.RuntimeOwnedElsewhere,\n\t);\n}\n\nfunction hostedRunnerNotReadyError(\n\tcontext: WebServerContext,\n\tmessage: string,\n\tmetadata: Record<string, string | undefined>,\n): ApiError {\n\treturn new ApiError(\n\t\t503,\n\t\tmessage,\n\t\t[\n\t\t\t{\n\t\t\t\treason: HostedRunnerErrorType.RuntimeNotReady,\n\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\tmetadata: hostedRunnerErrorMetadata(context, metadata),\n\t\t\t},\n\t\t],\n\t\tHostedRunnerErrorType.RuntimeNotReady,\n\t);\n}\n\nfunction ensureHostedRunnerCanUseSession(\n\tcontext: WebServerContext,\n\trequestedSessionId: string | undefined,\n): void {\n\tconst hostedRunner = context.hostedRunner;\n\tif (!hostedRunner) {\n\t\treturn;\n\t}\n\tconst decision = evaluateHostedRunnerLeaseUse(\n\t\thostedRunner,\n\t\trequestedSessionId,\n\t);\n\tif (decision.ok) {\n\t\treturn;\n\t}\n\tif (decision.reason === \"runtime_draining\") {\n\t\tthrow hostedRunnerNotReadyError(context, decision.message, {\n\t\t\tdraining: \"true\",\n\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\trequested_maestro_session_id: requestedSessionId,\n\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t});\n\t}\n\tthrow hostedRunnerOwnershipError(context, decision.message, {\n\t\tmaestro_session_id: decision.activeSessionId,\n\t\trequested_maestro_session_id: decision.requestedSessionId,\n\t\tlease_generation: String(decision.snapshot.generation),\n\t});\n}\n\nfunction claimHostedRunnerSession(\n\tcontext: WebServerContext,\n\tsessionId: string,\n): void {\n\tconst hostedRunner = context.hostedRunner;\n\tif (!hostedRunner) {\n\t\treturn;\n\t}\n\tconst decision = claimHostedRunnerLease(hostedRunner, sessionId);\n\tif (!decision.ok) {\n\t\tif (decision.reason === \"runtime_draining\") {\n\t\t\tthrow hostedRunnerNotReadyError(context, decision.message, {\n\t\t\t\tdraining: \"true\",\n\t\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\t\trequested_maestro_session_id: decision.requestedSessionId ?? sessionId,\n\t\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t\t});\n\t\t}\n\t\tthrow hostedRunnerOwnershipError(context, decision.message, {\n\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\trequested_maestro_session_id: decision.requestedSessionId ?? sessionId,\n\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t});\n\t}\n}\n\nfunction resolveRuntimeWorkspaceRoot(\n\tcontext: WebServerContext,\n\tworkspaceRoot: string | undefined,\n): string | undefined {\n\tconst requestedRoot = workspaceRoot?.trim() || undefined;\n\tconst hostedRoot = context.hostedRunner?.workspaceRoot?.trim() || undefined;\n\n\tlet resolvedRequestedRoot: string | undefined;\n\tif (requestedRoot) {\n\t\ttry {\n\t\t\tresolvedRequestedRoot = resolveExistingWorkspaceRoot(requestedRoot);\n\t\t} catch {\n\t\t\tthrow new ApiError(400, `workspaceRoot not found: ${requestedRoot}`);\n\t\t}\n\t}\n\n\tlet resolvedHostedRoot: string | undefined;\n\tif (hostedRoot) {\n\t\ttry {\n\t\t\tresolvedHostedRoot = resolveExistingWorkspaceRoot(hostedRoot);\n\t\t} catch {\n\t\t\tthrow new ApiError(\n\t\t\t\t500,\n\t\t\t\t`Hosted runner workspace root is unavailable: ${hostedRoot}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (\n\t\tresolvedRequestedRoot &&\n\t\tresolvedHostedRoot &&\n\t\tresolvedRequestedRoot !== resolvedHostedRoot\n\t) {\n\t\tthrow new ApiError(\n\t\t\t409,\n\t\t\t`workspaceRoot must match hosted runner workspace root: ${resolvedHostedRoot}`,\n\t\t);\n\t}\n\n\treturn resolvedHostedRoot ?? resolvedRequestedRoot;\n}\n\nfunction rethrowHeadlessMessageError(error: unknown): never {\n\tif (!(error instanceof Error)) {\n\t\tthrow error;\n\t}\n\tif (error.message === \"Viewer headless connections cannot send messages\") {\n\t\tthrow new ApiError(403, error.message);\n\t}\n\tif (error.message === \"Headless subscriber not found\") {\n\t\tthrow new ApiError(404, error.message);\n\t}\n\tif (\n\t\terror.message === \"Headless connection not found\" ||\n\t\terror.message === \"Headless connection does not have controller access\" ||\n\t\terror.message.includes(\"is owned by another connection\")\n\t) {\n\t\tthrow new ApiError(403, error.message);\n\t}\n\tif (error.message.includes(\"Controller lease\")) {\n\t\tthrow new ApiError(409, error.message);\n\t}\n\tthrow new ApiError(403, error.message);\n}\n\nfunction rethrowHeadlessConnectionLifecycleError(error: unknown): never {\n\tif (!(error instanceof Error)) {\n\t\tthrow error;\n\t}\n\tif (error.message === \"Headless connection not found\") {\n\t\tthrow new ApiError(404, error.message);\n\t}\n\tif (\n\t\terror.message.includes(\"Controller lease\") ||\n\t\terror.message ===\n\t\t\t\"Headless connection role does not match subscription role\"\n\t) {\n\t\tthrow new ApiError(409, error.message);\n\t}\n\tthrow error;\n}\n\nasync function ensureRuntime(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tinput: HeadlessSessionCreateInput & {\n\t\tregisterConnection?: boolean;\n\t\trecordAgentRuntimeTrigger?: boolean;\n\t},\n) {\n\tconst sessionManager = createSessionManagerForRequest(req, false);\n\tconst role = getHeadlessRole(req, input.role);\n\tconst hostedRestoreSessionId = context.hostedRunner?.restoreManifestPath\n\t\t? (context.hostedRunner.activeMaestroSessionId ??\n\t\t\tcontext.hostedRunner.configuredMaestroSessionId)\n\t\t: undefined;\n\tconst requestedSessionId =\n\t\tinput.sessionId?.trim() || hostedRestoreSessionId || undefined;\n\tconst workspaceRoot = resolveRuntimeWorkspaceRoot(\n\t\tcontext,\n\t\tinput.workspaceRoot,\n\t);\n\tensureHostedRunnerCanUseSession(context, requestedSessionId);\n\tif (requestedSessionId) {\n\t\tlet sessionFile = sessionManager.getSessionFileById(requestedSessionId);\n\t\tif (!sessionFile && context.hostedRunner?.restoreManifestPath) {\n\t\t\tconst restoreManifest = await loadHostedRunnerRestoreManifest(\n\t\t\t\tcontext.hostedRunner.restoreManifestPath,\n\t\t\t);\n\t\t\tconst restoreSessionFile =\n\t\t\t\trestoreManifest?.maestro_session_id === requestedSessionId\n\t\t\t\t\t? restoreManifest.runtime.session_file\n\t\t\t\t\t: undefined;\n\t\t\tif (restoreSessionFile && existsSync(restoreSessionFile)) {\n\t\t\t\tsessionFile = restoreSessionFile;\n\t\t\t}\n\t\t}\n\t\tif (!sessionFile) {\n\t\t\tthrow new ApiError(404, \"Session not found\");\n\t\t}\n\t\tsessionManager.setSessionFile(sessionFile);\n\t}\n\n\tconst registeredModel = await context.getRegisteredModel(input.model);\n\tconst subject = getAuthSubject(req);\n\tif (\n\t\tinput.enableClientTools &&\n\t\t!input.capabilities?.serverRequests?.includes(\"client_tool\")\n\t) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t\"client_tool capability is required when enableClientTools is true\",\n\t\t);\n\t}\n\tif (role === \"viewer\" && input.enableClientTools) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t\"viewer headless connections cannot enable client-side tools\",\n\t\t);\n\t}\n\tconst disallowedViewerRequest = getViewerDisallowedServerRequest(\n\t\tinput.capabilities?.serverRequests,\n\t);\n\tif (role === \"viewer\" && disallowedViewerRequest) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t`viewer headless connections cannot negotiate ${disallowedViewerRequest} requests`,\n\t\t);\n\t}\n\tconst headerApproval = normalizeApprovalMode(\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-approval-mode\",\n\t\t\t\"x-maestro-approval-mode\",\n\t\t) ?? undefined,\n\t);\n\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\tsessionId: requestedSessionId ?? sessionManager.getSessionId(),\n\t\tsubject,\n\t\theaderApprovalMode: input.approvalMode ?? headerApproval,\n\t\tdefaultApprovalMode: context.defaultApprovalMode,\n\t});\n\n\tconst runtime = await context.headlessRuntimeService.ensureRuntime({\n\t\tscope_key: getScopeKey(req),\n\t\tsessionId: requestedSessionId,\n\t\tsubject,\n\t\tworkspaceRoot,\n\t\tclientProtocolVersion: input.protocolVersion,\n\t\tclientInfo: input.clientInfo,\n\t\tcapabilities: input.capabilities\n\t\t\t? {\n\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\toptOutNotifications: input.optOutNotifications,\n\t\trole,\n\t\tregisteredModel,\n\t\tthinkingLevel: (input.thinkingLevel ?? \"off\") as ThinkingLevel,\n\t\tapprovalMode: effectiveApproval,\n\t\tenableClientTools: input.enableClientTools,\n\t\tclient: input.client,\n\t\tregisterConnection: input.registerConnection ?? true,\n\t\tcontext,\n\t\tsessionManager,\n\t});\n\tif (context.hostedRunner) {\n\t\tclaimHostedRunnerSession(context, runtime.getSnapshot().session_id);\n\t}\n\tif (input.recordAgentRuntimeTrigger !== false) {\n\t\tawait recordPlatformAgentRuntimeSessionStart({\n\t\t\tcontext,\n\t\t\truntime,\n\t\t\tsubject,\n\t\t\tregisteredModel,\n\t\t\trole,\n\t\t\tthinkingLevel: (input.thinkingLevel ?? \"off\") as ThinkingLevel,\n\t\t\tapprovalMode: effectiveApproval,\n\t\t\tworkspaceRoot,\n\t\t\tinput,\n\t\t});\n\t}\n\treturn runtime;\n}\n\nasync function recordPlatformAgentRuntimeSessionStart(options: {\n\tcontext: WebServerContext;\n\truntime: HeadlessSessionRuntime;\n\tsubject?: string;\n\tregisteredModel: RegisteredModel;\n\trole: HeadlessConnectionRole;\n\tthinkingLevel: ThinkingLevel;\n\tapprovalMode: ApprovalMode;\n\tworkspaceRoot: string | undefined;\n\tinput: HeadlessSessionCreateInput;\n}): Promise<void> {\n\tconst snapshot = options.runtime.getSnapshot();\n\tconst hostedRunner = options.context.hostedRunner;\n\t// This is a projection, not ownership transfer. The local headless runtime\n\t// remains authoritative; Platform receives session-start metadata and trace\n\t// context so AgentRuntime, A2A, deploy smoke tests, and support endpoints can\n\t// all join on the same Maestro session.\n\tconst result = await recordMaestroSessionRuntimeTrigger({\n\t\tworkspaceId: hostedRunner?.workspaceId,\n\t\tagentId: hostedRunner?.agentId,\n\t\tsessionId: snapshot.session_id,\n\t\tactorId: options.subject,\n\t\tcorrelationId: `maestro-session:${snapshot.session_id}`,\n\t\ttraceparent: getTraceParentHeader(),\n\t\tmetadata: {\n\t\t\tmodel: options.registeredModel.id,\n\t\t\tprovider: options.registeredModel.provider,\n\t\t\trole: options.role,\n\t\t\tthinking_level: options.thinkingLevel,\n\t\t\tapproval_mode: options.approvalMode,\n\t\t\tclient: options.input.client ?? \"generic\",\n\t\t\tprotocol_version: options.input.protocolVersion,\n\t\t\tworkspace_root: options.workspaceRoot,\n\t\t\trunner_session_id: hostedRunner?.runnerSessionId,\n\t\t\towner_instance_id: hostedRunner?.ownerInstanceId,\n\t\t\tagent_id: hostedRunner?.agentId,\n\t\t},\n\t});\n\tif (!hostedRunner || !result) {\n\t\treturn;\n\t}\n\tconst a2aCorrelation = result.events.find(\n\t\t(event) => event.type === \"maestro.platform_runtime.a2a_correlated\",\n\t)?.attributes;\n\tbindHostedRunnerPlatformLease(hostedRunner, {\n\t\tagentRunId: result.run.id,\n\t\tagentId: result.run.linkage?.agentId,\n\t\tleaseToken: result.run.lease?.token,\n\t});\n\t// Store only support-grade handles on the hosted runner. The full run/task\n\t// state stays in Platform; health and identity endpoints expose these ids\n\t// for operators without making Platform a session-state dependency.\n\thostedRunner.a2aMessageId = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"a2a_message_id\")\n\t\t: undefined;\n\thostedRunner.a2aTaskId = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"a2a_task_id\")\n\t\t: undefined;\n\thostedRunner.agentRuntimeWorkerQueue = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"worker_queue\")\n\t\t: undefined;\n\thostedRunner.agentRuntimeCorrelationPath = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"correlation_path\")\n\t\t: undefined;\n}\n\nfunction stringAttribute(\n\tattributes: Record<string, unknown>,\n\tkey: string,\n): string | undefined {\n\tconst value = attributes[key];\n\treturn typeof value === \"string\" && value.trim().length > 0\n\t\t? value\n\t\t: undefined;\n}\n\nasync function ensureConnection(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tinput: HeadlessConnectionCreateInput,\n): Promise<HeadlessRuntimeConnectionSnapshot> {\n\tconst runtime = await ensureRuntime(req, context, {\n\t\t...input,\n\t\tregisterConnection: false,\n\t\trecordAgentRuntimeTrigger: false,\n\t});\n\tconst role = getHeadlessRole(req, input.role);\n\tconst heartbeat = runtime.registerConnection({\n\t\tconnectionId: input.connectionId,\n\t\tclientProtocolVersion: input.protocolVersion,\n\t\tclientInfo: input.clientInfo,\n\t\tcapabilities: input.capabilities\n\t\t\t? {\n\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\toptOutNotifications: input.optOutNotifications,\n\t\trole,\n\t\ttakeControl: input.takeControl,\n\t});\n\tconst snapshot = runtime.getSnapshot();\n\treturn {\n\t\t...heartbeat,\n\t\tsession_id: snapshot.session_id,\n\t\trole,\n\t\topt_out_notifications: input.optOutNotifications,\n\t\tsnapshot,\n\t};\n}\n\nfunction getRuntime(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tsessionId: string | undefined,\n) {\n\tif (!sessionId) {\n\t\tthrow new ApiError(400, \"Missing headless session id\");\n\t}\n\tensureHostedRunnerCanUseSession(context, sessionId);\n\tconst runtime = context.headlessRuntimeService.getRuntime(\n\t\tgetScopeKey(req),\n\t\tsessionId,\n\t);\n\tif (!runtime) {\n\t\tthrow new ApiError(404, \"Headless session not found\");\n\t}\n\tif (context.hostedRunner) {\n\t\tclaimHostedRunnerSession(context, runtime.getSnapshot().session_id);\n\t}\n\treturn runtime;\n}\n\nexport async function handleHeadlessSessionCreate(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\tconst input = await parseAndValidateJson<HeadlessSessionCreateInput>(\n\t\treq,\n\t\tHeadlessSessionCreateSchema,\n\t);\n\tconst runtime = await ensureRuntime(req, context, input);\n\tsendJson(res, 200, runtime.getSnapshot(), context.corsHeaders, req);\n}\n\nexport async function handleHeadlessConnectionCreate(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\tconst input = await parseAndValidateJson<HeadlessConnectionCreateInput>(\n\t\treq,\n\t\tHeadlessConnectionCreateSchema,\n\t);\n\tlet connection: HeadlessRuntimeConnectionSnapshot;\n\ttry {\n\t\tconnection = await ensureConnection(req, context, input);\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n\tsendJson(res, 200, connection, context.corsHeaders, req);\n}\n\nexport function handleHeadlessSessionState(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tsendJson(res, 200, runtime.getSnapshot(), context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionSubscribe(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionSubscribeInput>(\n\t\treq,\n\t\tHeadlessSessionSubscribeSchema,\n\t);\n\tconst role = getHeadlessRole(req, input.role);\n\tconst disallowedViewerRequest = getViewerDisallowedServerRequest(\n\t\tinput.capabilities?.serverRequests,\n\t);\n\tif (role === \"viewer\" && disallowedViewerRequest) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t`viewer headless connections cannot negotiate ${disallowedViewerRequest} requests`,\n\t\t);\n\t}\n\ttry {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\truntime.createSubscription({\n\t\t\t\tconnectionId: input.connectionId,\n\t\t\t\trole,\n\t\t\t\texplicit: true,\n\t\t\t\ttakeControl: input.takeControl,\n\t\t\t\tclientProtocolVersion: input.protocolVersion,\n\t\t\t\tclientInfo: input.clientInfo,\n\t\t\t\tcapabilities: input.capabilities\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\toptOutNotifications: input.optOutNotifications,\n\t\t\t}),\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t} catch (error) {\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\terror.message === \"Controller lease is already held by another connection\"\n\t\t) {\n\t\t\tthrow new ApiError(409, error.message);\n\t\t}\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\t(error.message === \"Headless connection not found\" ||\n\t\t\t\terror.message ===\n\t\t\t\t\t\"Headless connection role does not match subscription role\")\n\t\t) {\n\t\t\tthrow new ApiError(400, error.message);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function handleHeadlessSessionUnsubscribe(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionUnsubscribeInput>(\n\t\treq,\n\t\tHeadlessSessionUnsubscribeSchema,\n\t);\n\tif (!(await runtime.unsubscribe(input.subscriptionId))) {\n\t\tthrow new ApiError(404, \"Headless subscriber not found\");\n\t}\n\tsendJson(res, 200, { success: true }, context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionHeartbeat(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionHeartbeatInput>(\n\t\treq,\n\t\tHeadlessSessionHeartbeatSchema,\n\t);\n\tlet heartbeat: HeadlessRuntimeHeartbeatSnapshot;\n\ttry {\n\t\theartbeat = runtime.heartbeatConnection({\n\t\t\tconnectionId: input.connectionId ?? getHeadlessConnectionId(req),\n\t\t\tsubscriptionId: input.subscriptionId ?? getHeadlessSubscriberId(req),\n\t\t});\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n\tsendJson(res, 200, heartbeat, context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionDisconnect(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionDisconnectInput>(\n\t\treq,\n\t\tHeadlessSessionDisconnectSchema,\n\t);\n\ttry {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\tawait runtime.disconnectConnection({\n\t\t\t\tconnectionId: input.connectionId ?? getHeadlessConnectionId(req),\n\t\t\t\tsubscriptionId: input.subscriptionId ?? getHeadlessSubscriberId(req),\n\t\t\t}),\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n}\n\nexport function handleHeadlessSessionEvents(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst url = new URL(\n\t\treq.url || `/api/headless/sessions/${params?.id}/events`,\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\tconst cursorParam = url.searchParams.get(\"cursor\");\n\tconst cursor = cursorParam ? Number.parseInt(cursorParam, 10) : null;\n\tconst subscriptionId =\n\t\turl.searchParams.get(\"subscriptionId\") || getHeadlessSubscriberId(req);\n\n\tconst stream = subscriptionId\n\t\t? runtime.attachSubscription(subscriptionId)\n\t\t: runtime.createImplicitStream({\n\t\t\t\tcursor,\n\t\t\t\trole: getHeadlessRole(req),\n\t\t\t\toptOutNotifications: parseOptOutNotifications(req),\n\t\t\t});\n\tif (!stream) {\n\t\tthrow new ApiError(404, \"Headless subscriber not found\");\n\t}\n\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t\t...context.corsHeaders,\n\t});\n\tlet flushing = false;\n\n\tconst flush = () => {\n\t\tif (flushing || res.writableEnded) {\n\t\t\treturn;\n\t\t}\n\t\tflushing = true;\n\t\twhile (!res.writableEnded) {\n\t\t\tconst next = stream.next();\n\t\t\tif (!next) {\n\t\t\t\tflushing = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst wrote = writeSse(res, next);\n\t\t\tif (!wrote) {\n\t\t\t\tres.once(\"drain\", () => {\n\t\t\t\t\tflushing = false;\n\t\t\t\t\tflush();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tflushing = false;\n\t};\n\tconst stopListening = stream.onAvailable(flush);\n\tconst heartbeat = setInterval(() => {\n\t\tif (!res.writableEnded) {\n\t\t\tstream.enqueue(runtime.heartbeat());\n\t\t\tflush();\n\t\t}\n\t}, 15000);\n\theartbeat.unref();\n\n\tconst cleanup = () => {\n\t\tclearInterval(heartbeat);\n\t\tstopListening();\n\t\tstream.close();\n\t};\n\treq.on(\"close\", cleanup);\n\tres.on(\"close\", cleanup);\n\tflush();\n}\n\nexport async function handleHeadlessSessionMessage(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseHeadlessMessage(req);\n\ttry {\n\t\truntime.assertCanSend(\n\t\t\tgetHeadlessRole(req),\n\t\t\tgetHeadlessSubscriberId(req),\n\t\t\tgetHeadlessConnectionId(req),\n\t\t);\n\t} catch (error) {\n\t\trethrowHeadlessMessageError(error);\n\t}\n\ttry {\n\t\tawait runtime.send(input as HeadlessToAgentMessage, {\n\t\t\tconnectionId: getHeadlessConnectionId(req),\n\t\t\tsubscriptionId: getHeadlessSubscriberId(req),\n\t\t});\n\t} catch (error) {\n\t\trethrowHeadlessMessageError(error);\n\t}\n\tsendJson(res, 200, { success: true }, context.corsHeaders, req);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"headless-sessions.js","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport {\n\ttype HeadlessConnectionRole,\n\theadlessApprovalModes,\n\theadlessConnectionRoles,\n\theadlessNotificationTypes,\n\theadlessServerRequestTypes,\n\theadlessThinkingLevels,\n\theadlessToAgentMessageSchemasByType,\n\theadlessToAgentMessageTypes,\n\theadlessUtilityOperations,\n} from \"@evalops/contracts\";\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport type { ApprovalMode } from \"../../agent/action-approval.js\";\nimport type { ThinkingLevel } from \"../../agent/types.js\";\nimport type { HeadlessToAgentMessage } from \"../../cli/headless-protocol.js\";\nimport { resolveExistingWorkspaceRoot } from \"../../headless/workspace-root.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport { recordMaestroSessionRuntimeTrigger } from \"../../platform/agent-runtime-client.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { getAuthScopeKey, getAuthSubject } from \"../authz.js\";\nimport type {\n\tHeadlessAttachedSubscription,\n\tHeadlessRuntimeConnectionSnapshot,\n\tHeadlessRuntimeHeartbeatSnapshot,\n\tHeadlessRuntimeStreamEnvelope,\n\tHeadlessSessionRuntime,\n} from \"../headless-runtime-service.js\";\nimport {\n\tHeadlessRuntimeNotReadyError,\n\tloadHostedRunnerRestoreManifest,\n} from \"../headless-runtime-service.js\";\nimport {\n\tbindHostedRunnerPlatformLease,\n\tclaimHostedRunnerLease,\n\tevaluateHostedRunnerLeaseUse,\n} from \"../hosted-runner-lease.js\";\nimport { getTraceParentHeader } from \"../request-context.js\";\nimport {\n\tApiError,\n\tgetRequestHeader,\n\treadRequestBody,\n\tsendJson,\n} from \"../server-utils.js\";\nimport { createSessionManagerForRequest } from \"../session-scope.js\";\nimport { parseAndValidateJson, validatePayload } from \"../validation.js\";\n\nexport enum HostedRunnerErrorType {\n\tRuntimeNotReady = \"runtime_not_ready\",\n\tRuntimeOwnedElsewhere = \"runtime_owned_elsewhere\",\n}\n\nconst HOSTED_RUNNER_ERROR_DOMAIN = \"maestro.hosted_runner\";\n\nfunction stringLiteralUnion<const T extends readonly string[]>(values: T) {\n\treturn Type.Unsafe<T[number]>(\n\t\tType.Union(\n\t\t\tvalues.map((value) => Type.Literal(value)) as unknown as [\n\t\t\t\tTSchema,\n\t\t\t\t...TSchema[],\n\t\t\t],\n\t\t),\n\t);\n}\n\nconst HeadlessOptOutNotificationsSchema = Type.Array(\n\tstringLiteralUnion(headlessNotificationTypes),\n\t{\n\t\tuniqueItems: true,\n\t},\n);\n\nconst HeadlessCreateBaseProperties = {\n\tsessionId: Type.Optional(Type.String()),\n\tprotocolVersion: Type.Optional(Type.String()),\n\tclientInfo: Type.Optional(\n\t\tType.Object({\n\t\t\tname: Type.String(),\n\t\t\tversion: Type.Optional(Type.String()),\n\t\t}),\n\t),\n\tworkspaceRoot: Type.Optional(Type.String()),\n\tmodel: Type.Optional(Type.String()),\n\tenableClientTools: Type.Optional(Type.Boolean()),\n\tcapabilities: Type.Optional(\n\t\tType.Object({\n\t\t\tserverRequests: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessServerRequestTypes), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tutilityOperations: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessUtilityOperations), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\trawAgentEvents: Type.Optional(Type.Boolean()),\n\t\t}),\n\t),\n\toptOutNotifications: Type.Optional(HeadlessOptOutNotificationsSchema),\n\trole: Type.Optional(stringLiteralUnion(headlessConnectionRoles)),\n\tclient: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"generic\"),\n\t\t\tType.Literal(\"vscode\"),\n\t\t\tType.Literal(\"jetbrains\"),\n\t\t\tType.Literal(\"conductor\"),\n\t\t]),\n\t),\n\tthinkingLevel: Type.Optional(stringLiteralUnion(headlessThinkingLevels)),\n\tapprovalMode: Type.Optional(stringLiteralUnion(headlessApprovalModes)),\n} as const;\n\nconst HeadlessSessionCreateSchema = Type.Object(HeadlessCreateBaseProperties);\n\nconst HeadlessConnectionCreateSchema = Type.Object({\n\t...HeadlessCreateBaseProperties,\n\tconnectionId: Type.Optional(Type.String()),\n\ttakeControl: Type.Optional(Type.Boolean()),\n});\n\nconst HeadlessMessageTypeSchema = Type.Object(\n\t{\n\t\ttype: stringLiteralUnion(headlessToAgentMessageTypes),\n\t},\n\t{ additionalProperties: true },\n);\n\nconst HeadlessSessionSubscribeSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tprotocolVersion: Type.Optional(Type.String()),\n\tclientInfo: Type.Optional(\n\t\tType.Object({\n\t\t\tname: Type.String(),\n\t\t\tversion: Type.Optional(Type.String()),\n\t\t}),\n\t),\n\tcapabilities: Type.Optional(\n\t\tType.Object({\n\t\t\tserverRequests: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessServerRequestTypes), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tutilityOperations: Type.Optional(\n\t\t\t\tType.Array(stringLiteralUnion(headlessUtilityOperations), {\n\t\t\t\t\tuniqueItems: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t\trawAgentEvents: Type.Optional(Type.Boolean()),\n\t\t}),\n\t),\n\toptOutNotifications: Type.Optional(HeadlessOptOutNotificationsSchema),\n\trole: Type.Optional(stringLiteralUnion(headlessConnectionRoles)),\n\ttakeControl: Type.Optional(Type.Boolean()),\n});\n\nconst HeadlessSessionUnsubscribeSchema = Type.Object({\n\tsubscriptionId: Type.String(),\n});\n\nconst HeadlessSessionHeartbeatSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tsubscriptionId: Type.Optional(Type.String()),\n});\n\nconst HeadlessSessionDisconnectSchema = Type.Object({\n\tconnectionId: Type.Optional(Type.String()),\n\tsubscriptionId: Type.Optional(Type.String()),\n});\n\ntype HeadlessSessionCreateInput = Static<typeof HeadlessSessionCreateSchema>;\ntype HeadlessConnectionCreateInput = Static<\n\ttypeof HeadlessConnectionCreateSchema\n>;\ntype HeadlessSessionSubscribeInput = Static<\n\ttypeof HeadlessSessionSubscribeSchema\n>;\ntype HeadlessSessionUnsubscribeInput = Static<\n\ttypeof HeadlessSessionUnsubscribeSchema\n>;\ntype HeadlessSessionHeartbeatInput = Static<\n\ttypeof HeadlessSessionHeartbeatSchema\n>;\ntype HeadlessSessionDisconnectInput = Static<\n\ttypeof HeadlessSessionDisconnectSchema\n>;\ntype HeadlessMessageTypeInput = Static<typeof HeadlessMessageTypeSchema>;\n\nasync function parseHeadlessMessage(\n\treq: IncomingMessage,\n): Promise<HeadlessToAgentMessage> {\n\tconst raw = await readRequestBody(req);\n\tif (!raw.length) {\n\t\tthrow new ApiError(400, \"Request body required\");\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw.toString());\n\t} catch {\n\t\tthrow new ApiError(400, \"Invalid JSON payload\");\n\t}\n\tconst envelope = validatePayload<HeadlessMessageTypeInput>(\n\t\tparsed,\n\t\tHeadlessMessageTypeSchema,\n\t\t\"body\",\n\t);\n\treturn validatePayload<HeadlessToAgentMessage>(\n\t\tparsed,\n\t\theadlessToAgentMessageSchemasByType[envelope.type],\n\t\t\"body\",\n\t);\n}\n\nfunction getHeadlessRole(\n\treq: IncomingMessage,\n\texplicitRole?: HeadlessConnectionRole,\n): HeadlessConnectionRole {\n\tif (explicitRole) {\n\t\treturn explicitRole;\n\t}\n\tconst headerRole = getRequestHeader(\n\t\treq,\n\t\t\"x-composer-headless-role\",\n\t\t\"x-maestro-headless-role\",\n\t);\n\treturn headerRole === \"viewer\" ? \"viewer\" : \"controller\";\n}\n\nfunction getViewerDisallowedServerRequest(\n\tserverRequests?: Static<\n\t\ttypeof HeadlessCreateBaseProperties.capabilities\n\t>[\"serverRequests\"],\n): \"mcp_elicitation\" | \"user_input\" | undefined {\n\tif (serverRequests?.includes(\"mcp_elicitation\")) {\n\t\treturn \"mcp_elicitation\";\n\t}\n\tif (serverRequests?.includes(\"user_input\")) {\n\t\treturn \"user_input\";\n\t}\n\treturn undefined;\n}\n\nfunction writeSse(res: ServerResponse, payload: unknown): boolean {\n\treturn res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n}\n\nfunction getHeadlessSubscriberId(req: IncomingMessage): string | undefined {\n\treturn (\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-headless-subscriber-id\",\n\t\t\t\"x-maestro-headless-subscriber-id\",\n\t\t) ?? undefined\n\t);\n}\n\nfunction getHeadlessConnectionId(req: IncomingMessage): string | undefined {\n\treturn (\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-headless-connection-id\",\n\t\t\t\"x-maestro-headless-connection-id\",\n\t\t) ?? undefined\n\t);\n}\n\nfunction parseOptOutNotifications(\n\treq: IncomingMessage,\n): HeadlessSessionSubscribeInput[\"optOutNotifications\"] {\n\tconst url = new URL(\n\t\treq.url || \"/\",\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\tconst raw = url.searchParams.get(\"optOutNotifications\");\n\tif (!raw) {\n\t\treturn undefined;\n\t}\n\tconst notifications = raw\n\t\t.split(\",\")\n\t\t.map((value) => value.trim())\n\t\t.filter(Boolean);\n\tif (notifications.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn validatePayload<\n\t\tNonNullable<HeadlessSessionSubscribeInput[\"optOutNotifications\"]>\n\t>(\n\t\tnotifications,\n\t\tHeadlessOptOutNotificationsSchema,\n\t\t\"query.optOutNotifications\",\n\t);\n}\n\nfunction getScopeKey(req: IncomingMessage): string {\n\treturn getAuthScopeKey(req);\n}\n\nfunction hostedRunnerErrorMetadata(\n\tcontext: WebServerContext,\n\tmetadata: Record<string, string | undefined>,\n): Record<string, string> {\n\tconst hostedRunner = context.hostedRunner;\n\tconst detailMetadata: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries({\n\t\trunner_session_id: hostedRunner?.runnerSessionId,\n\t\towner_instance_id: hostedRunner?.ownerInstanceId,\n\t\tworkspace_id: hostedRunner?.workspaceId,\n\t\tagent_run_id: hostedRunner?.agentRunId,\n\t\t...metadata,\n\t})) {\n\t\tif (value) {\n\t\t\tdetailMetadata[key] = value;\n\t\t}\n\t}\n\treturn detailMetadata;\n}\n\nfunction hostedRunnerOwnershipError(\n\tcontext: WebServerContext,\n\tmessage: string,\n\tmetadata: Record<string, string | undefined>,\n): ApiError {\n\treturn new ApiError(\n\t\t409,\n\t\tmessage,\n\t\t[\n\t\t\t{\n\t\t\t\treason: HostedRunnerErrorType.RuntimeOwnedElsewhere,\n\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\tmetadata: hostedRunnerErrorMetadata(context, metadata),\n\t\t\t},\n\t\t],\n\t\tHostedRunnerErrorType.RuntimeOwnedElsewhere,\n\t);\n}\n\nfunction hostedRunnerNotReadyError(\n\tcontext: WebServerContext,\n\tmessage: string,\n\tmetadata: Record<string, string | undefined>,\n): ApiError {\n\treturn new ApiError(\n\t\t503,\n\t\tmessage,\n\t\t[\n\t\t\t{\n\t\t\t\treason: HostedRunnerErrorType.RuntimeNotReady,\n\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\tmetadata: hostedRunnerErrorMetadata(context, metadata),\n\t\t\t},\n\t\t],\n\t\tHostedRunnerErrorType.RuntimeNotReady,\n\t);\n}\n\nfunction ensureHostedRunnerCanUseSession(\n\tcontext: WebServerContext,\n\trequestedSessionId: string | undefined,\n): void {\n\tconst hostedRunner = context.hostedRunner;\n\tif (!hostedRunner) {\n\t\treturn;\n\t}\n\tconst decision = evaluateHostedRunnerLeaseUse(\n\t\thostedRunner,\n\t\trequestedSessionId,\n\t);\n\tif (decision.ok) {\n\t\treturn;\n\t}\n\tif (decision.reason === \"runtime_draining\") {\n\t\tthrow hostedRunnerNotReadyError(context, decision.message, {\n\t\t\tdraining: \"true\",\n\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\trequested_maestro_session_id: requestedSessionId,\n\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t});\n\t}\n\tthrow hostedRunnerOwnershipError(context, decision.message, {\n\t\tmaestro_session_id: decision.activeSessionId,\n\t\trequested_maestro_session_id: decision.requestedSessionId,\n\t\tlease_generation: String(decision.snapshot.generation),\n\t});\n}\n\nfunction claimHostedRunnerSession(\n\tcontext: WebServerContext,\n\tsessionId: string,\n): void {\n\tconst hostedRunner = context.hostedRunner;\n\tif (!hostedRunner) {\n\t\treturn;\n\t}\n\tconst decision = claimHostedRunnerLease(hostedRunner, sessionId);\n\tif (!decision.ok) {\n\t\tif (decision.reason === \"runtime_draining\") {\n\t\t\tthrow hostedRunnerNotReadyError(context, decision.message, {\n\t\t\t\tdraining: \"true\",\n\t\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\t\trequested_maestro_session_id: decision.requestedSessionId ?? sessionId,\n\t\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t\t});\n\t\t}\n\t\tthrow hostedRunnerOwnershipError(context, decision.message, {\n\t\t\tmaestro_session_id: decision.activeSessionId,\n\t\t\trequested_maestro_session_id: decision.requestedSessionId ?? sessionId,\n\t\t\tlease_generation: String(decision.snapshot.generation),\n\t\t});\n\t}\n}\n\nfunction resolveRuntimeWorkspaceRoot(\n\tcontext: WebServerContext,\n\tworkspaceRoot: string | undefined,\n): string | undefined {\n\tconst requestedRoot = workspaceRoot?.trim() || undefined;\n\tconst hostedRoot = context.hostedRunner?.workspaceRoot?.trim() || undefined;\n\n\tlet resolvedRequestedRoot: string | undefined;\n\tif (requestedRoot) {\n\t\ttry {\n\t\t\tresolvedRequestedRoot = resolveExistingWorkspaceRoot(requestedRoot);\n\t\t} catch {\n\t\t\tthrow new ApiError(400, `workspaceRoot not found: ${requestedRoot}`);\n\t\t}\n\t}\n\n\tlet resolvedHostedRoot: string | undefined;\n\tif (hostedRoot) {\n\t\ttry {\n\t\t\tresolvedHostedRoot = resolveExistingWorkspaceRoot(hostedRoot);\n\t\t} catch {\n\t\t\tthrow new ApiError(\n\t\t\t\t500,\n\t\t\t\t`Hosted runner workspace root is unavailable: ${hostedRoot}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (\n\t\tresolvedRequestedRoot &&\n\t\tresolvedHostedRoot &&\n\t\tresolvedRequestedRoot !== resolvedHostedRoot\n\t) {\n\t\tthrow new ApiError(\n\t\t\t409,\n\t\t\t`workspaceRoot must match hosted runner workspace root: ${resolvedHostedRoot}`,\n\t\t);\n\t}\n\n\treturn resolvedHostedRoot ?? resolvedRequestedRoot;\n}\n\nfunction rethrowHeadlessMessageError(error: unknown): never {\n\tif (!(error instanceof Error)) {\n\t\tthrow error;\n\t}\n\tif (error instanceof HeadlessRuntimeNotReadyError) {\n\t\tthrow new ApiError(\n\t\t\t503,\n\t\t\terror.message,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\treason: HostedRunnerErrorType.RuntimeNotReady,\n\t\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\t},\n\t\t\t],\n\t\t\tHostedRunnerErrorType.RuntimeNotReady,\n\t\t);\n\t}\n\tif (error.message === \"Viewer headless connections cannot send messages\") {\n\t\tthrow new ApiError(403, error.message);\n\t}\n\tif (error.message === \"Headless subscriber not found\") {\n\t\tthrow new ApiError(404, error.message);\n\t}\n\tif (\n\t\terror.message === \"Headless connection not found\" ||\n\t\terror.message === \"Headless connection does not have controller access\" ||\n\t\terror.message.includes(\"is owned by another connection\")\n\t) {\n\t\tthrow new ApiError(403, error.message);\n\t}\n\tif (error.message.includes(\"Controller lease\")) {\n\t\tthrow new ApiError(409, error.message);\n\t}\n\tthrow new ApiError(403, error.message);\n}\n\nfunction rethrowHeadlessConnectionLifecycleError(error: unknown): never {\n\tif (!(error instanceof Error)) {\n\t\tthrow error;\n\t}\n\tif (error instanceof HeadlessRuntimeNotReadyError) {\n\t\tthrow new ApiError(\n\t\t\t503,\n\t\t\terror.message,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\treason: HostedRunnerErrorType.RuntimeNotReady,\n\t\t\t\t\tdomain: HOSTED_RUNNER_ERROR_DOMAIN,\n\t\t\t\t},\n\t\t\t],\n\t\t\tHostedRunnerErrorType.RuntimeNotReady,\n\t\t);\n\t}\n\tif (error.message === \"Headless connection not found\") {\n\t\tthrow new ApiError(404, error.message);\n\t}\n\tif (\n\t\terror.message.includes(\"Controller lease\") ||\n\t\terror.message ===\n\t\t\t\"Headless connection role does not match subscription role\"\n\t) {\n\t\tthrow new ApiError(409, error.message);\n\t}\n\tthrow error;\n}\n\nasync function ensureRuntime(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tinput: HeadlessSessionCreateInput & {\n\t\tregisterConnection?: boolean;\n\t\trecordAgentRuntimeTrigger?: boolean;\n\t},\n) {\n\tconst sessionManager = createSessionManagerForRequest(req, false);\n\tconst role = getHeadlessRole(req, input.role);\n\tconst hostedRestoreSessionId = context.hostedRunner?.restoreManifestPath\n\t\t? (context.hostedRunner.activeMaestroSessionId ??\n\t\t\tcontext.hostedRunner.configuredMaestroSessionId)\n\t\t: undefined;\n\tconst requestedSessionId =\n\t\tinput.sessionId?.trim() || hostedRestoreSessionId || undefined;\n\tconst workspaceRoot = resolveRuntimeWorkspaceRoot(\n\t\tcontext,\n\t\tinput.workspaceRoot,\n\t);\n\tensureHostedRunnerCanUseSession(context, requestedSessionId);\n\tif (requestedSessionId) {\n\t\tlet sessionFile = sessionManager.getSessionFileById(requestedSessionId);\n\t\tif (!sessionFile && context.hostedRunner?.restoreManifestPath) {\n\t\t\tconst restoreManifest = await loadHostedRunnerRestoreManifest(\n\t\t\t\tcontext.hostedRunner.restoreManifestPath,\n\t\t\t);\n\t\t\tconst restoreSessionFile =\n\t\t\t\trestoreManifest?.maestro_session_id === requestedSessionId\n\t\t\t\t\t? restoreManifest.runtime.session_file\n\t\t\t\t\t: undefined;\n\t\t\tif (restoreSessionFile && existsSync(restoreSessionFile)) {\n\t\t\t\tsessionFile = restoreSessionFile;\n\t\t\t}\n\t\t}\n\t\tif (!sessionFile) {\n\t\t\tthrow new ApiError(404, \"Session not found\");\n\t\t}\n\t\tsessionManager.setSessionFile(sessionFile);\n\t}\n\n\tconst registeredModel = await context.getRegisteredModel(input.model);\n\tconst subject = getAuthSubject(req);\n\tif (\n\t\tinput.enableClientTools &&\n\t\t!input.capabilities?.serverRequests?.includes(\"client_tool\")\n\t) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t\"client_tool capability is required when enableClientTools is true\",\n\t\t);\n\t}\n\tif (role === \"viewer\" && input.enableClientTools) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t\"viewer headless connections cannot enable client-side tools\",\n\t\t);\n\t}\n\tconst disallowedViewerRequest = getViewerDisallowedServerRequest(\n\t\tinput.capabilities?.serverRequests,\n\t);\n\tif (role === \"viewer\" && disallowedViewerRequest) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t`viewer headless connections cannot negotiate ${disallowedViewerRequest} requests`,\n\t\t);\n\t}\n\tconst headerApproval = normalizeApprovalMode(\n\t\tgetRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-approval-mode\",\n\t\t\t\"x-maestro-approval-mode\",\n\t\t) ?? undefined,\n\t);\n\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\tsessionId: requestedSessionId ?? sessionManager.getSessionId(),\n\t\tsubject,\n\t\theaderApprovalMode: input.approvalMode ?? headerApproval,\n\t\tdefaultApprovalMode: context.defaultApprovalMode,\n\t});\n\n\tconst runtime = await context.headlessRuntimeService.ensureRuntime({\n\t\tscope_key: getScopeKey(req),\n\t\tsessionId: requestedSessionId,\n\t\tsubject,\n\t\tworkspaceRoot,\n\t\tclientProtocolVersion: input.protocolVersion,\n\t\tclientInfo: input.clientInfo,\n\t\tcapabilities: input.capabilities\n\t\t\t? {\n\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\toptOutNotifications: input.optOutNotifications,\n\t\trole,\n\t\tregisteredModel,\n\t\tthinkingLevel: (input.thinkingLevel ?? \"off\") as ThinkingLevel,\n\t\tapprovalMode: effectiveApproval,\n\t\tenableClientTools: input.enableClientTools,\n\t\tclient: input.client,\n\t\tregisterConnection: input.registerConnection ?? true,\n\t\tcontext,\n\t\tsessionManager,\n\t});\n\tif (context.hostedRunner) {\n\t\tclaimHostedRunnerSession(context, runtime.getSnapshot().session_id);\n\t}\n\tif (input.recordAgentRuntimeTrigger !== false) {\n\t\tawait recordPlatformAgentRuntimeSessionStart({\n\t\t\tcontext,\n\t\t\truntime,\n\t\t\tsubject,\n\t\t\tregisteredModel,\n\t\t\trole,\n\t\t\tthinkingLevel: (input.thinkingLevel ?? \"off\") as ThinkingLevel,\n\t\t\tapprovalMode: effectiveApproval,\n\t\t\tworkspaceRoot,\n\t\t\tinput,\n\t\t});\n\t}\n\treturn runtime;\n}\n\nasync function recordPlatformAgentRuntimeSessionStart(options: {\n\tcontext: WebServerContext;\n\truntime: HeadlessSessionRuntime;\n\tsubject?: string;\n\tregisteredModel: RegisteredModel;\n\trole: HeadlessConnectionRole;\n\tthinkingLevel: ThinkingLevel;\n\tapprovalMode: ApprovalMode;\n\tworkspaceRoot: string | undefined;\n\tinput: HeadlessSessionCreateInput;\n}): Promise<void> {\n\tconst snapshot = options.runtime.getSnapshot();\n\tconst hostedRunner = options.context.hostedRunner;\n\t// This is a projection, not ownership transfer. The local headless runtime\n\t// remains authoritative; Platform receives session-start metadata and trace\n\t// context so AgentRuntime, A2A, deploy smoke tests, and support endpoints can\n\t// all join on the same Maestro session.\n\tconst result = await recordMaestroSessionRuntimeTrigger({\n\t\tworkspaceId: hostedRunner?.workspaceId,\n\t\tagentId: hostedRunner?.agentId,\n\t\tsessionId: snapshot.session_id,\n\t\tactorId: options.subject,\n\t\tcorrelationId: `maestro-session:${snapshot.session_id}`,\n\t\ttraceparent: getTraceParentHeader(),\n\t\tmetadata: {\n\t\t\tmodel: options.registeredModel.id,\n\t\t\tprovider: options.registeredModel.provider,\n\t\t\trole: options.role,\n\t\t\tthinking_level: options.thinkingLevel,\n\t\t\tapproval_mode: options.approvalMode,\n\t\t\tclient: options.input.client ?? \"generic\",\n\t\t\tprotocol_version: options.input.protocolVersion,\n\t\t\tworkspace_root: options.workspaceRoot,\n\t\t\trunner_session_id: hostedRunner?.runnerSessionId,\n\t\t\towner_instance_id: hostedRunner?.ownerInstanceId,\n\t\t\tagent_id: hostedRunner?.agentId,\n\t\t},\n\t});\n\tif (!hostedRunner || !result) {\n\t\treturn;\n\t}\n\tconst a2aCorrelation = result.events.find(\n\t\t(event) => event.type === \"maestro.platform_runtime.a2a_correlated\",\n\t)?.attributes;\n\tbindHostedRunnerPlatformLease(hostedRunner, {\n\t\tagentRunId: result.run.id,\n\t\tagentId: result.run.linkage?.agentId,\n\t\tleaseToken: result.run.lease?.token,\n\t});\n\t// Store only support-grade handles on the hosted runner. The full run/task\n\t// state stays in Platform; health and identity endpoints expose these ids\n\t// for operators without making Platform a session-state dependency.\n\thostedRunner.a2aMessageId = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"a2a_message_id\")\n\t\t: undefined;\n\thostedRunner.a2aTaskId = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"a2a_task_id\")\n\t\t: undefined;\n\thostedRunner.agentRuntimeWorkerQueue = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"worker_queue\")\n\t\t: undefined;\n\thostedRunner.agentRuntimeCorrelationPath = a2aCorrelation\n\t\t? stringAttribute(a2aCorrelation, \"correlation_path\")\n\t\t: undefined;\n}\n\nfunction stringAttribute(\n\tattributes: Record<string, unknown>,\n\tkey: string,\n): string | undefined {\n\tconst value = attributes[key];\n\treturn typeof value === \"string\" && value.trim().length > 0\n\t\t? value\n\t\t: undefined;\n}\n\nasync function ensureConnection(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tinput: HeadlessConnectionCreateInput,\n): Promise<HeadlessRuntimeConnectionSnapshot> {\n\tconst runtime = await ensureRuntime(req, context, {\n\t\t...input,\n\t\tregisterConnection: false,\n\t\trecordAgentRuntimeTrigger: false,\n\t});\n\tconst role = getHeadlessRole(req, input.role);\n\tconst heartbeat = runtime.registerConnection({\n\t\tconnectionId: input.connectionId,\n\t\tclientProtocolVersion: input.protocolVersion,\n\t\tclientInfo: input.clientInfo,\n\t\tcapabilities: input.capabilities\n\t\t\t? {\n\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\toptOutNotifications: input.optOutNotifications,\n\t\trole,\n\t\ttakeControl: input.takeControl,\n\t});\n\tconst snapshot = runtime.getSnapshot();\n\treturn {\n\t\t...heartbeat,\n\t\tsession_id: snapshot.session_id,\n\t\trole,\n\t\topt_out_notifications: input.optOutNotifications,\n\t\tsnapshot,\n\t};\n}\n\nfunction getRuntime(\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n\tsessionId: string | undefined,\n) {\n\tif (!sessionId) {\n\t\tthrow new ApiError(400, \"Missing headless session id\");\n\t}\n\tensureHostedRunnerCanUseSession(context, sessionId);\n\tconst runtime = context.headlessRuntimeService.getRuntime(\n\t\tgetScopeKey(req),\n\t\tsessionId,\n\t);\n\tif (!runtime) {\n\t\tthrow new ApiError(404, \"Headless session not found\");\n\t}\n\tif (context.hostedRunner) {\n\t\tclaimHostedRunnerSession(context, runtime.getSnapshot().session_id);\n\t}\n\treturn runtime;\n}\n\nexport async function handleHeadlessSessionCreate(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\tconst input = await parseAndValidateJson<HeadlessSessionCreateInput>(\n\t\treq,\n\t\tHeadlessSessionCreateSchema,\n\t);\n\tlet runtime: HeadlessSessionRuntime;\n\ttry {\n\t\truntime = await ensureRuntime(req, context, input);\n\t} catch (error) {\n\t\tif (error instanceof HeadlessRuntimeNotReadyError) {\n\t\t\trethrowHeadlessConnectionLifecycleError(error);\n\t\t}\n\t\tthrow error;\n\t}\n\tsendJson(res, 200, runtime.getSnapshot(), context.corsHeaders, req);\n}\n\nexport async function handleHeadlessConnectionCreate(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\tconst input = await parseAndValidateJson<HeadlessConnectionCreateInput>(\n\t\treq,\n\t\tHeadlessConnectionCreateSchema,\n\t);\n\tlet connection: HeadlessRuntimeConnectionSnapshot;\n\ttry {\n\t\tconnection = await ensureConnection(req, context, input);\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n\tsendJson(res, 200, connection, context.corsHeaders, req);\n}\n\nexport function handleHeadlessSessionState(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tsendJson(res, 200, runtime.getSnapshot(), context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionSubscribe(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionSubscribeInput>(\n\t\treq,\n\t\tHeadlessSessionSubscribeSchema,\n\t);\n\tconst role = getHeadlessRole(req, input.role);\n\tconst disallowedViewerRequest = getViewerDisallowedServerRequest(\n\t\tinput.capabilities?.serverRequests,\n\t);\n\tif (role === \"viewer\" && disallowedViewerRequest) {\n\t\tthrow new ApiError(\n\t\t\t400,\n\t\t\t`viewer headless connections cannot negotiate ${disallowedViewerRequest} requests`,\n\t\t);\n\t}\n\ttry {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\truntime.createSubscription({\n\t\t\t\tconnectionId: input.connectionId,\n\t\t\t\trole,\n\t\t\t\texplicit: true,\n\t\t\t\ttakeControl: input.takeControl,\n\t\t\t\tclientProtocolVersion: input.protocolVersion,\n\t\t\t\tclientInfo: input.clientInfo,\n\t\t\t\tcapabilities: input.capabilities\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tserver_requests: input.capabilities.serverRequests,\n\t\t\t\t\t\t\tutility_operations: input.capabilities.utilityOperations,\n\t\t\t\t\t\t\traw_agent_events: input.capabilities.rawAgentEvents,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\toptOutNotifications: input.optOutNotifications,\n\t\t\t}),\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t} catch (error) {\n\t\tif (error instanceof HeadlessRuntimeNotReadyError) {\n\t\t\trethrowHeadlessConnectionLifecycleError(error);\n\t\t}\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\terror.message === \"Controller lease is already held by another connection\"\n\t\t) {\n\t\t\tthrow new ApiError(409, error.message);\n\t\t}\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\t(error.message === \"Headless connection not found\" ||\n\t\t\t\terror.message ===\n\t\t\t\t\t\"Headless connection role does not match subscription role\")\n\t\t) {\n\t\t\tthrow new ApiError(400, error.message);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function handleHeadlessSessionUnsubscribe(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionUnsubscribeInput>(\n\t\treq,\n\t\tHeadlessSessionUnsubscribeSchema,\n\t);\n\tif (!(await runtime.unsubscribe(input.subscriptionId))) {\n\t\tthrow new ApiError(404, \"Headless subscriber not found\");\n\t}\n\tsendJson(res, 200, { success: true }, context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionHeartbeat(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionHeartbeatInput>(\n\t\treq,\n\t\tHeadlessSessionHeartbeatSchema,\n\t);\n\tlet heartbeat: HeadlessRuntimeHeartbeatSnapshot;\n\ttry {\n\t\theartbeat = runtime.heartbeatConnection({\n\t\t\tconnectionId: input.connectionId ?? getHeadlessConnectionId(req),\n\t\t\tsubscriptionId: input.subscriptionId ?? getHeadlessSubscriberId(req),\n\t\t});\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n\tsendJson(res, 200, heartbeat, context.corsHeaders, req);\n}\n\nexport async function handleHeadlessSessionDisconnect(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseAndValidateJson<HeadlessSessionDisconnectInput>(\n\t\treq,\n\t\tHeadlessSessionDisconnectSchema,\n\t);\n\ttry {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\tawait runtime.disconnectConnection({\n\t\t\t\tconnectionId: input.connectionId ?? getHeadlessConnectionId(req),\n\t\t\t\tsubscriptionId: input.subscriptionId ?? getHeadlessSubscriberId(req),\n\t\t\t}),\n\t\t\tcontext.corsHeaders,\n\t\t\treq,\n\t\t);\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n}\n\nexport function handleHeadlessSessionEvents(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst url = new URL(\n\t\treq.url || `/api/headless/sessions/${params?.id}/events`,\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\tconst cursorParam = url.searchParams.get(\"cursor\");\n\tconst cursor = cursorParam ? Number.parseInt(cursorParam, 10) : null;\n\tconst subscriptionId =\n\t\turl.searchParams.get(\"subscriptionId\") || getHeadlessSubscriberId(req);\n\n\tlet stream: HeadlessAttachedSubscription | null;\n\ttry {\n\t\tstream = subscriptionId\n\t\t\t? runtime.attachSubscription(subscriptionId)\n\t\t\t: runtime.createImplicitStream({\n\t\t\t\t\tcursor,\n\t\t\t\t\trole: getHeadlessRole(req),\n\t\t\t\t\toptOutNotifications: parseOptOutNotifications(req),\n\t\t\t\t});\n\t} catch (error) {\n\t\trethrowHeadlessConnectionLifecycleError(error);\n\t}\n\tif (!stream) {\n\t\tthrow new ApiError(404, \"Headless subscriber not found\");\n\t}\n\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t\t...context.corsHeaders,\n\t});\n\tlet flushing = false;\n\n\tconst flush = () => {\n\t\tif (flushing || res.writableEnded) {\n\t\t\treturn;\n\t\t}\n\t\tflushing = true;\n\t\twhile (!res.writableEnded) {\n\t\t\tconst next = stream.next();\n\t\t\tif (!next) {\n\t\t\t\tflushing = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst wrote = writeSse(res, next);\n\t\t\tif (!wrote) {\n\t\t\t\tres.once(\"drain\", () => {\n\t\t\t\t\tflushing = false;\n\t\t\t\t\tflush();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tflushing = false;\n\t};\n\tconst stopListening = stream.onAvailable(flush);\n\tconst heartbeat = setInterval(() => {\n\t\tif (!res.writableEnded) {\n\t\t\tstream.enqueue(runtime.heartbeat());\n\t\t\tflush();\n\t\t}\n\t}, 15000);\n\theartbeat.unref();\n\n\tconst cleanup = () => {\n\t\tclearInterval(heartbeat);\n\t\tstopListening();\n\t\tstream.close();\n\t};\n\treq.on(\"close\", cleanup);\n\tres.on(\"close\", cleanup);\n\tflush();\n}\n\nexport async function handleHeadlessSessionMessage(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n\tparams?: Record<string, string>,\n) {\n\tconst runtime = getRuntime(req, context, params?.id);\n\tconst input = await parseHeadlessMessage(req);\n\ttry {\n\t\truntime.assertCanSend(\n\t\t\tgetHeadlessRole(req),\n\t\t\tgetHeadlessSubscriberId(req),\n\t\t\tgetHeadlessConnectionId(req),\n\t\t\t{ allowNotReady: input.type === \"shutdown\" },\n\t\t);\n\t} catch (error) {\n\t\trethrowHeadlessMessageError(error);\n\t}\n\ttry {\n\t\tawait runtime.send(input as HeadlessToAgentMessage, {\n\t\t\tconnectionId: getHeadlessConnectionId(req),\n\t\t\tsubscriptionId: getHeadlessSubscriberId(req),\n\t\t});\n\t} catch (error) {\n\t\trethrowHeadlessMessageError(error);\n\t}\n\tsendJson(res, 200, { success: true }, context.corsHeaders, req);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-runner-identity.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACN,KAAK,oCAAoC,EAEzC,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,2BAA2B,gDACM,CAAC;AAE/C,eAAO,MAAM,uCAAuC,sCAChB,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,EAAE,OAAO,uCAAuC,CAAC;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,aAAa,CAAC,EAAE;QACf,gBAAgB,EAAE,OAAO,oCAAoC,CAAC;QAC9D,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,yBAAyB,CAC9C,YAAY,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"hosted-runner-identity.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACN,KAAK,oCAAoC,EAEzC,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,2BAA2B,gDACM,CAAC;AAE/C,eAAO,MAAM,uCAAuC,sCAChB,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,EAAE,OAAO,uCAAuC,CAAC;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,aAAa,CAAC,EAAE;QACf,gBAAgB,EAAE,OAAO,oCAAoC,CAAC;QAC9D,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,yBAAyB,CAC9C,YAAY,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA6EtC;AAED,wBAAsB,0BAA0B,CAC/C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,YAAY,CAAC,EAAE,mBAAmB,GAChC,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -29,6 +29,8 @@ export async function buildHostedRunnerIdentity(hostedRunner) {
|
|
|
29
29
|
last_platform_a2a_push: {
|
|
30
30
|
kind: hostedRunner.lastPlatformA2APush.kind,
|
|
31
31
|
task_id: hostedRunner.lastPlatformA2APush.taskId,
|
|
32
|
+
message_id: hostedRunner.lastPlatformA2APush.messageId,
|
|
33
|
+
message_ids: hostedRunner.lastPlatformA2APush.messageIds,
|
|
32
34
|
context_id: hostedRunner.lastPlatformA2APush.contextId,
|
|
33
35
|
workspace_id: hostedRunner.lastPlatformA2APush.workspaceId,
|
|
34
36
|
organization_id: hostedRunner.lastPlatformA2APush.organizationId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-runner-identity.js","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-identity.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,yBAAyB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,MAAM,2BAA2B,GACvC,6CAA6C,CAAC;AAE/C,MAAM,CAAC,MAAM,uCAAuC,GACnD,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"hosted-runner-identity.js","sourceRoot":"","sources":["../../../src/server/handlers/hosted-runner-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { HostedRunnerContext } from \"../app-context.js\";\nimport {\n\ttype HOSTED_RUNNER_LEASE_PROTOCOL_VERSION,\n\thostedRunnerLeaseSnapshot,\n} from \"../hosted-runner-lease.js\";\nimport { sendJson } from \"../server-utils.js\";\nimport { checkHostedRunnerReadiness } from \"./health.js\";\n\nexport const HOSTED_RUNNER_IDENTITY_PATH =\n\t\"/.well-known/evalops/remote-runner/identity\";\n\nexport const HOSTED_RUNNER_IDENTITY_PROTOCOL_VERSION =\n\t\"evalops.remote-runner.identity.v1\";\n\nexport interface HostedRunnerIdentity {\n\tprotocol_version: typeof HOSTED_RUNNER_IDENTITY_PROTOCOL_VERSION;\n\trunner_session_id: string;\n\towner_instance_id: string;\n\tready: boolean;\n\tdraining: boolean;\n\tagent_id?: string;\n\tagent_run_id?: string;\n\ta2a_message_id?: string;\n\ta2a_task_id?: string;\n\tlast_platform_a2a_push?: {\n\t\tkind: string;\n\t\ttask_id?: string;\n\t\tmessage_id?: string;\n\t\tmessage_ids?: string[];\n\t\tcontext_id?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceived_at: string;\n\t\truntime_event_id?: string;\n\t\truntime_event_type?: string;\n\t\ttraceparent?: string;\n\t\ttracestate?: string;\n\t\torganization_id?: string;\n\t\tworkspace_id?: string;\n\t\ttenant_id?: string;\n\t\tagent_id?: string;\n\t\tactor_id?: string;\n\t};\n\tagent_runtime_worker_queue?: string;\n\tagent_runtime_correlation_path?: string;\n\truntime_lease?: {\n\t\tprotocol_version: typeof HOSTED_RUNNER_LEASE_PROTOCOL_VERSION;\n\t\tstate: string;\n\t\tgeneration: number;\n\t\tmaestro_session_id?: string;\n\t\tlease_token_present: boolean;\n\t\theartbeat_at: string;\n\t\tupdated_at: string;\n\t};\n\tdrain_status?: string;\n\tdrain_manifest_path?: string;\n\tdrained_at?: string;\n}\n\nexport async function buildHostedRunnerIdentity(\n\thostedRunner?: HostedRunnerContext,\n): Promise<HostedRunnerIdentity | null> {\n\tif (!hostedRunner?.runnerSessionId || !hostedRunner.ownerInstanceId) {\n\t\treturn null;\n\t}\n\n\tconst readiness = await checkHostedRunnerReadiness(hostedRunner);\n\tconst draining = readiness.status === \"draining\";\n\tconst lease = hostedRunnerLeaseSnapshot(hostedRunner);\n\n\treturn {\n\t\tprotocol_version: HOSTED_RUNNER_IDENTITY_PROTOCOL_VERSION,\n\t\trunner_session_id: hostedRunner.runnerSessionId,\n\t\towner_instance_id: hostedRunner.ownerInstanceId,\n\t\tready: readiness.status === \"ready\",\n\t\tdraining,\n\t\t...(hostedRunner.agentId ? { agent_id: hostedRunner.agentId } : {}),\n\t\t...(hostedRunner.agentRunId\n\t\t\t? { agent_run_id: hostedRunner.agentRunId }\n\t\t\t: {}),\n\t\t...(hostedRunner.a2aMessageId\n\t\t\t? { a2a_message_id: hostedRunner.a2aMessageId }\n\t\t\t: {}),\n\t\t...(hostedRunner.a2aTaskId ? { a2a_task_id: hostedRunner.a2aTaskId } : {}),\n\t\t...(hostedRunner.lastPlatformA2APush\n\t\t\t? {\n\t\t\t\t\tlast_platform_a2a_push: {\n\t\t\t\t\t\tkind: hostedRunner.lastPlatformA2APush.kind,\n\t\t\t\t\t\ttask_id: hostedRunner.lastPlatformA2APush.taskId,\n\t\t\t\t\t\tmessage_id: hostedRunner.lastPlatformA2APush.messageId,\n\t\t\t\t\t\tmessage_ids: hostedRunner.lastPlatformA2APush.messageIds,\n\t\t\t\t\t\tcontext_id: hostedRunner.lastPlatformA2APush.contextId,\n\t\t\t\t\t\tworkspace_id: hostedRunner.lastPlatformA2APush.workspaceId,\n\t\t\t\t\t\torganization_id: hostedRunner.lastPlatformA2APush.organizationId,\n\t\t\t\t\t\ttenant_id: hostedRunner.lastPlatformA2APush.tenantId,\n\t\t\t\t\t\tstate: hostedRunner.lastPlatformA2APush.state,\n\t\t\t\t\t\tfinal: hostedRunner.lastPlatformA2APush.final,\n\t\t\t\t\t\treceived_at: hostedRunner.lastPlatformA2APush.receivedAt,\n\t\t\t\t\t\truntime_event_id: hostedRunner.lastPlatformA2APush.runtimeEventId,\n\t\t\t\t\t\truntime_event_type:\n\t\t\t\t\t\t\thostedRunner.lastPlatformA2APush.runtimeEventType,\n\t\t\t\t\t\ttraceparent: hostedRunner.lastPlatformA2APush.traceparent,\n\t\t\t\t\t\ttracestate: hostedRunner.lastPlatformA2APush.tracestate,\n\t\t\t\t\t\tagent_id: hostedRunner.lastPlatformA2APush.agentId,\n\t\t\t\t\t\tactor_id: hostedRunner.lastPlatformA2APush.actorId,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(hostedRunner.agentRuntimeWorkerQueue\n\t\t\t? { agent_runtime_worker_queue: hostedRunner.agentRuntimeWorkerQueue }\n\t\t\t: {}),\n\t\t...(hostedRunner.agentRuntimeCorrelationPath\n\t\t\t? {\n\t\t\t\t\tagent_runtime_correlation_path:\n\t\t\t\t\t\thostedRunner.agentRuntimeCorrelationPath,\n\t\t\t\t}\n\t\t\t: {}),\n\t\truntime_lease: {\n\t\t\tprotocol_version: lease.protocolVersion,\n\t\t\tstate: lease.state,\n\t\t\tgeneration: lease.generation,\n\t\t\t...(lease.maestroSessionId\n\t\t\t\t? { maestro_session_id: lease.maestroSessionId }\n\t\t\t\t: {}),\n\t\t\tlease_token_present: Boolean(lease.leaseToken),\n\t\t\theartbeat_at: lease.heartbeatAt,\n\t\t\tupdated_at: lease.updatedAt,\n\t\t},\n\t\t...(hostedRunner.lastDrain?.status\n\t\t\t? { drain_status: hostedRunner.lastDrain.status }\n\t\t\t: {}),\n\t\t...(hostedRunner.lastDrain?.manifestPath\n\t\t\t? { drain_manifest_path: hostedRunner.lastDrain.manifestPath }\n\t\t\t: {}),\n\t\t...(hostedRunner.lastDrain?.drainedAt\n\t\t\t? { drained_at: hostedRunner.lastDrain.drainedAt }\n\t\t\t: {}),\n\t};\n}\n\nexport async function handleHostedRunnerIdentity(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcors: Record<string, string>,\n\thostedRunner?: HostedRunnerContext,\n): Promise<void> {\n\tres.setHeader(\"Cache-Control\", \"no-store\");\n\tconst identity = await buildHostedRunnerIdentity(hostedRunner);\n\tif (!identity) {\n\t\tsendJson(\n\t\t\tres,\n\t\t\t404,\n\t\t\t{\n\t\t\t\terror: \"hosted runner identity unavailable\",\n\t\t\t},\n\t\t\tcors,\n\t\t\treq,\n\t\t);\n\t\treturn;\n\t}\n\n\tsendJson(res, 200, identity, cors, req);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-a2a-push.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/platform-a2a-push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAS/E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AAOxE,wBAAgB,sCAAsC,IAAI,SAAS,MAAM,EAAE,CAE1E;
|
|
1
|
+
{"version":3,"file":"platform-a2a-push.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/platform-a2a-push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAS/E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AAOxE,wBAAgB,sCAAsC,IAAI,SAAS,MAAM,EAAE,CAE1E;AAkCD,wBAAsB,6BAA6B,CAClD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -47,6 +47,7 @@ function platformA2APushSnapshot(payload, req) {
|
|
|
47
47
|
return withPlatformA2APushContext({
|
|
48
48
|
kind: "statusUpdate",
|
|
49
49
|
taskId,
|
|
50
|
+
...messageIdFields(payload, payload.statusUpdate),
|
|
50
51
|
contextId: stringField(payload.statusUpdate, "contextId"),
|
|
51
52
|
...ownershipFields(payload, payload.statusUpdate),
|
|
52
53
|
state: statusState(payload.statusUpdate),
|
|
@@ -64,6 +65,7 @@ function platformA2APushSnapshot(payload, req) {
|
|
|
64
65
|
return withPlatformA2APushContext({
|
|
65
66
|
kind: "task",
|
|
66
67
|
taskId,
|
|
68
|
+
...messageIdFields(payload, payload.task),
|
|
67
69
|
contextId: stringField(payload.task, "contextId"),
|
|
68
70
|
...ownershipFields(payload, payload.task),
|
|
69
71
|
state: statusState(payload.task),
|
|
@@ -78,6 +80,7 @@ function platformA2APushSnapshot(payload, req) {
|
|
|
78
80
|
return withPlatformA2APushContext({
|
|
79
81
|
kind: "artifactUpdate",
|
|
80
82
|
taskId,
|
|
83
|
+
...messageIdFields(payload, payload.artifactUpdate),
|
|
81
84
|
contextId: stringField(payload.artifactUpdate, "contextId"),
|
|
82
85
|
...ownershipFields(payload, payload.artifactUpdate),
|
|
83
86
|
receivedAt: new Date().toISOString(),
|
|
@@ -85,12 +88,14 @@ function platformA2APushSnapshot(payload, req) {
|
|
|
85
88
|
}
|
|
86
89
|
if (isJsonObject(payload.message)) {
|
|
87
90
|
const taskId = stringField(payload.message, "taskId");
|
|
88
|
-
|
|
91
|
+
const messageFields = messageIdFields(payload, payload.message);
|
|
92
|
+
if (!messageFields.messageId) {
|
|
89
93
|
return null;
|
|
90
94
|
}
|
|
91
95
|
return withPlatformA2APushContext({
|
|
92
96
|
kind: "message",
|
|
93
|
-
taskId,
|
|
97
|
+
...optionalField("taskId", taskId),
|
|
98
|
+
...messageFields,
|
|
94
99
|
contextId: stringField(payload.message, "contextId"),
|
|
95
100
|
...ownershipFields(payload, payload.message),
|
|
96
101
|
receivedAt: new Date().toISOString(),
|
|
@@ -155,6 +160,17 @@ function assertHostedRunnerA2APushBoundary(hostedRunner, snapshot) {
|
|
|
155
160
|
hostedRunner.a2aTaskId !== snapshot.taskId) {
|
|
156
161
|
throw new ApiError(404, "A2A task not found");
|
|
157
162
|
}
|
|
163
|
+
if (hostedRunner?.a2aMessageId &&
|
|
164
|
+
snapshotHasBoundaryMessageIdEvidence(snapshot) &&
|
|
165
|
+
!snapshotIncludesMessageId(snapshot, hostedRunner.a2aMessageId)) {
|
|
166
|
+
throw new ApiError(404, "A2A message not found");
|
|
167
|
+
}
|
|
168
|
+
if (hostedRunner &&
|
|
169
|
+
snapshot.kind === "message" &&
|
|
170
|
+
!hostedRunner.a2aMessageId &&
|
|
171
|
+
!snapshotHasMessageBindingCorrelation(snapshot)) {
|
|
172
|
+
throw new ApiError(403, "A2A message push is missing correlation metadata");
|
|
173
|
+
}
|
|
158
174
|
if (!hostedRunner?.workspaceId) {
|
|
159
175
|
return;
|
|
160
176
|
}
|
|
@@ -174,6 +190,12 @@ function recordHostedRunnerA2APush(hostedRunner, snapshot) {
|
|
|
174
190
|
if (snapshot.taskId && !hostedRunner.a2aTaskId) {
|
|
175
191
|
hostedRunner.a2aTaskId = snapshot.taskId;
|
|
176
192
|
}
|
|
193
|
+
if (snapshot.messageId &&
|
|
194
|
+
!hostedRunner.a2aMessageId &&
|
|
195
|
+
snapshot.kind === "message" &&
|
|
196
|
+
snapshotHasMessageBindingCorrelation(snapshot)) {
|
|
197
|
+
hostedRunner.a2aMessageId = snapshot.messageId;
|
|
198
|
+
}
|
|
177
199
|
}
|
|
178
200
|
function statusState(value) {
|
|
179
201
|
const status = isJsonObject(value.status) ? value.status : undefined;
|
|
@@ -195,6 +217,92 @@ function ownershipFields(payload, value) {
|
|
|
195
217
|
...optionalField("tenantId", ownershipString(payload, value, ["tenantId", "tenant_id", "tenant"])),
|
|
196
218
|
};
|
|
197
219
|
}
|
|
220
|
+
function messageIdFields(payload, value) {
|
|
221
|
+
const messageIds = messageIdsFromSources(payload, value);
|
|
222
|
+
return {
|
|
223
|
+
...optionalField("messageId", messageIds[0]),
|
|
224
|
+
...(messageIds.length > 0 ? { messageIds } : {}),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
function messageIdsFromSources(payload, value) {
|
|
228
|
+
const result = [];
|
|
229
|
+
for (const source of messageIdSources(payload, value)) {
|
|
230
|
+
pushIdentifierStrings(result, source, [
|
|
231
|
+
"messageId",
|
|
232
|
+
"message_id",
|
|
233
|
+
"a2aMessageId",
|
|
234
|
+
"a2a_message_id",
|
|
235
|
+
]);
|
|
236
|
+
pushIdentifierArrayStrings(result, source, ["messageIds", "message_ids"]);
|
|
237
|
+
}
|
|
238
|
+
const payloadMessage = isJsonObject(payload.message)
|
|
239
|
+
? payload.message
|
|
240
|
+
: undefined;
|
|
241
|
+
if (payloadMessage) {
|
|
242
|
+
pushMessageObjectIdentifier(result, payloadMessage);
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
function messageIdSources(payload, value) {
|
|
247
|
+
const sources = [value, payload];
|
|
248
|
+
if (isJsonObject(value.artifact)) {
|
|
249
|
+
sources.push(value.artifact);
|
|
250
|
+
}
|
|
251
|
+
return sources;
|
|
252
|
+
}
|
|
253
|
+
function pushMessageObjectIdentifier(target, message) {
|
|
254
|
+
pushUniqueIdentifier(target, stringField(message, "id"));
|
|
255
|
+
pushIdentifierStrings(target, message, [
|
|
256
|
+
"messageId",
|
|
257
|
+
"message_id",
|
|
258
|
+
"a2aMessageId",
|
|
259
|
+
"a2a_message_id",
|
|
260
|
+
]);
|
|
261
|
+
}
|
|
262
|
+
function pushIdentifierStrings(target, value, keys) {
|
|
263
|
+
for (const key of keys) {
|
|
264
|
+
pushUniqueIdentifier(target, stringField(value, key));
|
|
265
|
+
const metadata = metadataString(value, key);
|
|
266
|
+
pushUniqueIdentifier(target, metadata);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function pushIdentifierArrayStrings(target, value, keys) {
|
|
270
|
+
for (const key of keys) {
|
|
271
|
+
const direct = value[key];
|
|
272
|
+
if (Array.isArray(direct)) {
|
|
273
|
+
for (const entry of direct) {
|
|
274
|
+
pushUniqueIdentifier(target, typeof entry === "string" ? entry.trim() : undefined);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const metadata = isJsonObject(value.metadata)
|
|
278
|
+
? value.metadata[key]
|
|
279
|
+
: undefined;
|
|
280
|
+
if (Array.isArray(metadata)) {
|
|
281
|
+
for (const entry of metadata) {
|
|
282
|
+
pushUniqueIdentifier(target, typeof entry === "string" ? entry.trim() : undefined);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function pushUniqueIdentifier(target, value) {
|
|
288
|
+
if (!value || target.some((entry) => sameMessageIdentifier(entry, value))) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
target.push(value);
|
|
292
|
+
}
|
|
293
|
+
function snapshotHasBoundaryMessageIdEvidence(snapshot) {
|
|
294
|
+
return (snapshot.kind === "message" ||
|
|
295
|
+
(snapshot.kind === "task" && Boolean(snapshot.messageIds?.length)));
|
|
296
|
+
}
|
|
297
|
+
function snapshotHasMessageBindingCorrelation(snapshot) {
|
|
298
|
+
return Boolean(snapshot.taskId || snapshot.workspaceId);
|
|
299
|
+
}
|
|
300
|
+
function snapshotIncludesMessageId(snapshot, messageId) {
|
|
301
|
+
return ((snapshot.messageId
|
|
302
|
+
? sameMessageIdentifier(snapshot.messageId, messageId)
|
|
303
|
+
: false) ||
|
|
304
|
+
(snapshot.messageIds ?? []).some((candidate) => sameMessageIdentifier(candidate, messageId)));
|
|
305
|
+
}
|
|
198
306
|
function ownershipString(payload, value, keys) {
|
|
199
307
|
for (const source of ownershipSources(payload, value)) {
|
|
200
308
|
for (const key of keys) {
|
|
@@ -230,6 +338,9 @@ function optionalField(key, value) {
|
|
|
230
338
|
function sameIdentifier(left, right) {
|
|
231
339
|
return left.trim().toLowerCase() === right.trim().toLowerCase();
|
|
232
340
|
}
|
|
341
|
+
function sameMessageIdentifier(left, right) {
|
|
342
|
+
return left.trim() === right.trim();
|
|
343
|
+
}
|
|
233
344
|
function stringField(value, key) {
|
|
234
345
|
const field = value[key];
|
|
235
346
|
return typeof field === "string" && field.trim().length > 0
|