@opengeni/db 4.2.2 → 4.3.0-canary.0
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/canonical-human-identities.js +3 -3
- package/dist/{chunk-6GAPAYZR.js → chunk-7JPLGBSA.js} +562 -86
- package/dist/chunk-7JPLGBSA.js.map +1 -0
- package/dist/{chunk-SNLIKELL.js → chunk-IHADTE7C.js} +2 -2
- package/dist/{chunk-7WX3R3YL.js → chunk-ILKJKDII.js} +7 -2
- package/dist/chunk-ILKJKDII.js.map +1 -0
- package/dist/{chunk-MGVOYVPS.js → chunk-NCSPNCQK.js} +3 -3
- package/dist/{chunk-B2KR3TEM.js → chunk-SGJDIF2D.js} +2 -2
- package/dist/{chunk-S4Y42VSX.js → chunk-Y5XFVJJM.js} +207 -3
- package/dist/chunk-Y5XFVJJM.js.map +1 -0
- package/dist/{chunk-FPTI4NP4.js → chunk-YGBOVXC7.js} +2 -2
- package/dist/{chunk-6Y7ZDVJ5.js → chunk-YGRT6VZO.js} +2 -2
- package/dist/{chunk-6IQ4X35Y.js → chunk-YVYBAWBU.js} +46 -1
- package/dist/chunk-YVYBAWBU.js.map +1 -0
- package/dist/connect-attempts.d.ts +60 -0
- package/dist/connection-setup-authority.d.ts +10 -0
- package/dist/connection-token-resolver.d.ts +11 -2
- package/dist/editable-artifact-durable-export.js +2 -2
- package/dist/editable-artifacts.js +3 -3
- package/dist/external-identities.d.ts +16 -0
- package/dist/external-identity-links.d.ts +74 -0
- package/dist/external-link-work.d.ts +51 -0
- package/dist/host-mcp-binding-match.d.ts +5 -0
- package/dist/host-mcp-bindings.d.ts +73 -0
- package/dist/host-mcp-task-authority.d.ts +47 -0
- package/dist/host-selection-identity.d.ts +6 -0
- package/dist/index.d.ts +51 -35
- package/dist/index.js +15171 -13775
- package/dist/index.js.map +1 -1
- package/dist/live-session-attempt.d.ts +275 -0
- package/dist/managed-auth-session-sets.js +3 -3
- package/dist/memory-domain.d.ts +3 -3
- package/dist/provision-roles.js +1 -1
- package/dist/retained-provider-commands.js +2 -2
- package/dist/runtime-posture.d.ts +6 -6
- package/dist/scheduled-task-revision-authority.d.ts +11 -0
- package/dist/schema.d.ts +1279 -9
- package/dist/schema.js +11 -1
- package/dist/session-background-commands.js +4 -4
- package/dist/session-command-output.js +4 -4
- package/dist/session-event-slices.js +2 -2
- package/dist/session-queue-commands.d.ts +7 -0
- package/dist/session-tenancy.d.ts +2 -0
- package/dist/session-tenancy.js +3 -3
- package/dist/video-generation.js +3 -3
- package/dist/workspace-authority.d.ts +4 -4
- package/dist/workspace-tool-defaults.js +4 -4
- package/drizzle/0437_organization_scoped_external_workspaces.sql +71 -0
- package/drizzle/0438_durable_connect_attempts.sql +95 -0
- package/drizzle/0439_external_identity_provisioning.sql +128 -0
- package/drizzle/0440_external_workspace_member_removal.sql +59 -0
- package/drizzle/0441_external_identity_membership_lifecycle.sql +163 -0
- package/drizzle/0442_external_owning_user_authority.sql +81 -0
- package/drizzle/0443_host_mcp_binding_registry.sql +93 -0
- package/drizzle/0444_host_mcp_delegations.sql +129 -0
- package/drizzle/0445_host_mcp_turn_authorities.sql +145 -0
- package/drizzle/0446_host_mcp_causal_continuation.sql +126 -0
- package/drizzle/0447_host_mcp_task_authorities.sql +264 -0
- package/drizzle/0448_host_mcp_child_authority.sql +115 -0
- package/drizzle/0449_external_identity_link_lifecycle.sql +107 -0
- package/drizzle/0450_external_identity_link_work.sql +179 -0
- package/drizzle/0451_external_link_preview_and_permission_ceiling.sql +82 -0
- package/drizzle/0452_external_link_scheduled_origin.sql +34 -0
- package/drizzle/0453_host_mcp_native_owner.sql +35 -0
- package/drizzle/0454_connect_origin_authority.sql +42 -0
- package/drizzle/0455_external_link_inventory_labels.sql +44 -0
- package/drizzle/0456_social_connection_versions.sql +14 -0
- package/drizzle/0457_canonical_session_scope_subject.sql +46 -0
- package/drizzle/0458_skill_review_wire_compatibility.sql +36 -0
- package/package.json +6 -6
- package/src/connect-attempts.ts +317 -0
- package/src/connection-authority.ts +9 -0
- package/src/connection-setup-authority.ts +35 -0
- package/src/connection-token-resolver.ts +177 -48
- package/src/external-identities.ts +70 -0
- package/src/external-identity-links.ts +364 -0
- package/src/external-link-work.ts +228 -0
- package/src/host-mcp-binding-match.ts +33 -0
- package/src/host-mcp-bindings.ts +741 -0
- package/src/host-mcp-task-authority.ts +383 -0
- package/src/host-selection-identity.ts +29 -0
- package/src/index.ts +398 -147
- package/src/live-session-attempt.ts +85 -0
- package/src/managed-human-provisioning.ts +6 -1
- package/src/memory-domain.ts +6 -11
- package/src/provision-roles.ts +3 -0
- package/src/runtime-posture.ts +47 -0
- package/src/scheduled-task-revision-authority.ts +30 -0
- package/src/schema.ts +228 -3
- package/src/session-control.ts +14 -0
- package/src/session-queue-commands.ts +11 -0
- package/src/session-tenancy.ts +7 -0
- package/src/workspace-authority.ts +5 -5
- package/dist/chunk-6GAPAYZR.js.map +0 -1
- package/dist/chunk-6IQ4X35Y.js.map +0 -1
- package/dist/chunk-7WX3R3YL.js.map +0 -1
- package/dist/chunk-S4Y42VSX.js.map +0 -1
- /package/dist/{chunk-SNLIKELL.js.map → chunk-IHADTE7C.js.map} +0 -0
- /package/dist/{chunk-MGVOYVPS.js.map → chunk-NCSPNCQK.js.map} +0 -0
- /package/dist/{chunk-B2KR3TEM.js.map → chunk-SGJDIF2D.js.map} +0 -0
- /package/dist/{chunk-FPTI4NP4.js.map → chunk-YGBOVXC7.js.map} +0 -0
- /package/dist/{chunk-6Y7ZDVJ5.js.map → chunk-YGRT6VZO.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session-background-commands.ts","../src/session-control.ts","../src/external-link-work.ts","../src/external-identities.ts","../src/external-identity-links.ts","../src/child-lifecycle-notices.ts","../src/session-tool-call-settlement.ts","../src/session-realtime-mirror.ts"],"sourcesContent":["import type {\n SessionBackgroundCommand,\n SessionBackgroundCommandActivity,\n} from \"@opengeni/contracts\";\nimport { SessionCommandFailure } from \"@opengeni/contracts\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { and, asc, desc, eq, getTableColumns, gte, inArray, sql } from \"drizzle-orm\";\n\nimport type { Database, SessionActivityDatabase } from \"./database\";\nimport { withRlsContext, withSessionActivityRlsContext } from \"./database\";\nimport * as schema from \"./schema\";\nimport { lockSessionEventWriteRows } from \"./session-control\";\nimport { fromPostgresLosslessJson } from \"./lossless-json\";\n\nexport type ConnectedMachineBackgroundCommandProof = {\n outcome: \"exited\" | \"lost\";\n exitCode: number | null;\n reason: string;\n failure?: SessionCommandFailure;\n observedAt: Date;\n};\n\nexport const SESSION_BACKGROUND_COMMAND_REASON_MAX_BYTES = 512;\n\nexport function boundedSessionBackgroundCommandReason(value: string, label: string): string {\n const normalized = value.trim();\n let bounded = \"\";\n let bytes = 0;\n for (const character of normalized) {\n const characterBytes = Buffer.byteLength(character, \"utf8\");\n if (bytes + characterBytes > SESSION_BACKGROUND_COMMAND_REASON_MAX_BYTES) break;\n bounded += character;\n bytes += characterBytes;\n }\n if (!bounded) throw new Error(`${label} must not be empty`);\n return bounded;\n}\n\nexport type SessionBackgroundCommandTerminalMutation = {\n prepare: (tx: SessionActivityDatabase) => Promise<void>;\n commit: (tx: SessionActivityDatabase, command: SessionBackgroundCommand) => Promise<void>;\n};\n\nexport type ConnectedMachineBackgroundCommandClaim = {\n commandId: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n claimId: string;\n state: \"running\" | \"stopping\";\n controlWorkspaceId: string;\n enrollmentId: string;\n connectionInstanceId: string;\n opId: string;\n reconcileAttempts: number;\n proof: ConnectedMachineBackgroundCommandProof | null;\n};\n\ntype ConnectedMachineBackgroundCommandClaimRow = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n claimId: string;\n commandState: string;\n controlWorkspaceId: string;\n enrollmentId: string;\n connectionInstanceId: string;\n opId: string;\n reconcileAttempts: number | string;\n reconcileProofOutcome: string | null;\n reconcileProofExitCode: number | string | null;\n reconcileProofReason: string | null;\n reconcileProofObservedAt: Date | string | null;\n};\n\nfunction commandPreview(value: string): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return Array.from(normalized).slice(0, 512).join(\"\");\n}\n\nconst commandObservationUnavailable = sql<boolean>`\n ${schema.sessionBackgroundCommands.state} in ('running','stopping') and exists (\n select 1 from sandbox_retained_processes process\n where process.id = ${schema.sessionBackgroundCommands.retainedProcessId}\n and process.account_id = ${schema.sessionBackgroundCommands.accountId}\n and process.workspace_id = ${schema.sessionBackgroundCommands.workspaceId}\n and process.session_id = ${schema.sessionBackgroundCommands.sessionId}\n and process.state = 'active'\n and process.last_reconcile_outcome in ('process_observation_unavailable',\n 'quarantined_process_observation_unavailable', 'provider_binding_missing',\n 'quarantined_provider_binding_missing', 'provider_binding_mismatch',\n 'quarantined_provider_binding_mismatch'))`;\n\nconst commandReadColumns = {\n ...getTableColumns(schema.sessionBackgroundCommands),\n observationUnavailable: commandObservationUnavailable,\n};\n\nfunction mapCommand(\n row: typeof schema.sessionBackgroundCommands.$inferSelect & { observationUnavailable?: boolean },\n): SessionBackgroundCommand {\n const terminal = row.state === \"exited\" || row.state === \"lost\";\n const legacyFailureCode =\n row.provider === \"connected_machine\"\n ? /^op_failure_([A-Za-z0-9_-]{1,128})$/.exec(row.settlementReason ?? \"\")?.[1]\n : undefined;\n // Application writes validate exact detail bounds. Older/restored rows may\n // meet the wider storage envelope without meeting that contract: preserve\n // failure truth and readable output rather than throwing on every read.\n const storedFailure = row.runnerFailure\n ? SessionCommandFailure.safeParse(row.runnerFailure)\n : null;\n const failure = !terminal\n ? undefined\n : row.runnerFailure\n ? storedFailure?.success\n ? storedFailure.data\n : {\n code: /^[A-Za-z0-9_-]{1,128}$/.test(row.runnerFailure.code)\n ? row.runnerFailure.code\n : \"INVALID_RUNNER_FAILURE\",\n detail: {\n metadata_error: \"Stored runner failure details do not match the retained contract.\",\n },\n retryable: false as const,\n }\n : legacyFailureCode\n ? { code: legacyFailureCode, retryable: false as const }\n : undefined;\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n sessionId: row.sessionId,\n provider: row.provider,\n state: row.state,\n ...(!terminal && row.observationUnavailable\n ? { observationStatus: \"unavailable\" as const }\n : {}),\n commandPreview: row.commandPreview,\n cancelRequestedAt: row.cancelRequestedAt?.toISOString() ?? null,\n exitCode: row.exitCode ?? null,\n settlementReason: row.settlementReason ?? null,\n ...(failure ? { failure } : {}),\n startedAt: row.startedAt.toISOString(),\n settledAt: row.settledAt?.toISOString() ?? null,\n completionObservedAt: row.completionObservedAt?.toISOString() ?? null,\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nexport async function backgroundCommandActivityForSessions(\n db: Database,\n input: { accountId: string; workspaceId: string; sessionIds: string[] },\n): Promise<Map<string, SessionBackgroundCommandActivity>> {\n if (input.sessionIds.length === 0) return new Map();\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const rows = await scopedDb\n .select({\n sessionId: schema.sessionBackgroundCommands.sessionId,\n count: sql<number>`count(*)::int`,\n stoppingCount: sql<number>`count(*) filter (where ${schema.sessionBackgroundCommands.state} = 'stopping')::int`,\n unavailableCount: sql<number>`count(*) filter (where ${commandObservationUnavailable})::int`,\n })\n .from(schema.sessionBackgroundCommands)\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n inArray(schema.sessionBackgroundCommands.sessionId, input.sessionIds),\n inArray(schema.sessionBackgroundCommands.state, [\"running\", \"stopping\"]),\n ),\n )\n .groupBy(schema.sessionBackgroundCommands.sessionId);\n return new Map(\n rows.map((row) => [\n row.sessionId,\n {\n state: Number(row.stoppingCount) > 0 ? (\"stopping\" as const) : (\"running\" as const),\n count: Number(row.count),\n ...(Number(row.unavailableCount) > 0\n ? { unavailableCount: Number(row.unavailableCount) }\n : {}),\n },\n ]),\n );\n },\n );\n}\n\nexport async function listSessionBackgroundCommands(\n db: Database,\n input: { accountId: string; workspaceId: string; sessionId: string; activeOnly?: boolean },\n): Promise<SessionBackgroundCommand[]> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const rows = await scopedDb\n .select(commandReadColumns)\n .from(schema.sessionBackgroundCommands)\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n ...(input.activeOnly\n ? [inArray(schema.sessionBackgroundCommands.state, [\"running\", \"stopping\"])]\n : []),\n ),\n )\n .orderBy(\n desc(schema.sessionBackgroundCommands.startedAt),\n desc(schema.sessionBackgroundCommands.id),\n )\n .limit(1000);\n return rows.map(mapCommand);\n },\n );\n}\n\n/** @internal Caller must already hold the canonical session/control fence. */\nexport async function insertManagedSessionBackgroundCommandInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n retainedProcessId: string;\n command: string;\n turnId?: string;\n attemptId?: string;\n executionGeneration?: number;\n },\n): Promise<SessionBackgroundCommand> {\n const [process] = await db\n .select({\n accountId: schema.sandboxRetainedProcesses.accountId,\n workspaceId: schema.sandboxRetainedProcesses.workspaceId,\n sessionId: schema.sandboxRetainedProcesses.sessionId,\n state: schema.sandboxRetainedProcesses.state,\n ownerActorKind: schema.sandboxRetainedProcesses.ownerActorKind,\n ownerActorId: schema.sandboxRetainedProcesses.ownerActorId,\n ownerTurnId: schema.sandboxRetainedProcesses.ownerTurnId,\n ownerAttemptId: schema.sandboxRetainedProcesses.ownerAttemptId,\n ownerExecutionGeneration: schema.sandboxRetainedProcesses.ownerExecutionGeneration,\n })\n .from(schema.sandboxRetainedProcesses)\n .where(eq(schema.sandboxRetainedProcesses.id, input.retainedProcessId))\n .for(\"update\")\n .limit(1);\n if (\n !process ||\n process.accountId !== input.accountId ||\n process.workspaceId !== input.workspaceId ||\n process.sessionId !== input.sessionId ||\n process.state !== \"active\"\n ) {\n throw new Error(\"Managed background command requires its exact active retained process\");\n }\n const [row] = await db\n .insert(schema.sessionBackgroundCommands)\n .values({\n id: input.commandId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n provider: \"managed\",\n state: \"running\",\n retainedProcessId: input.retainedProcessId,\n commandPreview: commandPreview(input.command),\n launchTurnId: input.turnId ?? null,\n launchAttemptId: input.attemptId ?? null,\n launchExecutionGeneration: input.executionGeneration ?? null,\n })\n .onConflictDoUpdate({\n target: schema.sessionBackgroundCommands.retainedProcessId,\n targetWhere: sql`${schema.sessionBackgroundCommands.retainedProcessId} is not null`,\n set: { updatedAt: new Date() },\n })\n .returning();\n if (!row) throw new Error(\"Managed background command adoption returned no row\");\n const legacyReplayMatches =\n row.launchTurnId === null &&\n row.launchAttemptId === null &&\n row.launchExecutionGeneration === null &&\n process.ownerActorKind === \"turn\" &&\n process.ownerActorId === input.attemptId &&\n process.ownerTurnId === input.turnId &&\n process.ownerAttemptId === input.attemptId &&\n process.ownerExecutionGeneration === input.executionGeneration;\n if (\n row.accountId !== input.accountId ||\n row.workspaceId !== input.workspaceId ||\n row.sessionId !== input.sessionId ||\n (!legacyReplayMatches &&\n (row.launchTurnId !== (input.turnId ?? null) ||\n row.launchAttemptId !== (input.attemptId ?? null) ||\n row.launchExecutionGeneration !== (input.executionGeneration ?? null))) ||\n row.provider !== \"managed\" ||\n row.retainedProcessId !== input.retainedProcessId\n ) {\n throw new Error(\"Managed background command adoption conflicted with another identity\");\n }\n return mapCommand(row);\n}\n\n/** @internal Caller must already hold the canonical exact-attempt fence. */\nexport async function insertConnectedMachineSessionBackgroundCommandInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n controlWorkspaceId: string;\n enrollmentId: string;\n connectionInstanceId: string;\n opId: string;\n command: string;\n turnId?: string;\n attemptId?: string;\n executionGeneration?: number;\n },\n): Promise<SessionBackgroundCommand> {\n const [row] = await db\n .insert(schema.sessionBackgroundCommands)\n .values({\n id: input.commandId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n provider: \"connected_machine\",\n state: \"running\",\n controlWorkspaceId: input.controlWorkspaceId,\n enrollmentId: input.enrollmentId,\n connectionInstanceId: input.connectionInstanceId,\n opId: input.opId,\n commandPreview: commandPreview(input.command),\n launchTurnId: input.turnId ?? null,\n launchAttemptId: input.attemptId ?? null,\n launchExecutionGeneration: input.executionGeneration ?? null,\n })\n .onConflictDoUpdate({\n target: [\n schema.sessionBackgroundCommands.controlWorkspaceId,\n schema.sessionBackgroundCommands.enrollmentId,\n schema.sessionBackgroundCommands.connectionInstanceId,\n schema.sessionBackgroundCommands.opId,\n ],\n targetWhere: sql`${schema.sessionBackgroundCommands.provider} = 'connected_machine'`,\n set: { updatedAt: new Date() },\n })\n .returning();\n if (!row) throw new Error(\"Connected Machine background command adoption returned no row\");\n if (\n row.accountId !== input.accountId ||\n row.workspaceId !== input.workspaceId ||\n row.sessionId !== input.sessionId ||\n row.launchTurnId !== (input.turnId ?? null) ||\n row.launchAttemptId !== (input.attemptId ?? null) ||\n row.launchExecutionGeneration !== (input.executionGeneration ?? null) ||\n row.provider !== \"connected_machine\" ||\n row.controlWorkspaceId !== input.controlWorkspaceId ||\n row.enrollmentId !== input.enrollmentId ||\n row.connectionInstanceId !== input.connectionInstanceId ||\n row.opId !== input.opId\n ) {\n throw new Error(\n \"Connected Machine background command adoption conflicted with another identity\",\n );\n }\n return mapCommand(row);\n}\n\n/** Claim exact Connected Machine locators globally for provider reconciliation.\n * The SECURITY DEFINER SQL function owns the bounded SKIP LOCKED inventory;\n * claim expiry is coordination recovery only and never implies command loss. */\nexport async function claimConnectedMachineSessionBackgroundCommands(\n db: Database,\n input: { claimId: string; limit: number; claimTtlMs: number; dueBefore?: Date },\n): Promise<ConnectedMachineBackgroundCommandClaim[]> {\n if (!Number.isSafeInteger(input.limit) || input.limit < 1 || input.limit > 100) {\n throw new Error(\"Connected command reconciliation limit must be between 1 and 100\");\n }\n if (\n !Number.isSafeInteger(input.claimTtlMs) ||\n input.claimTtlMs < 0 ||\n input.claimTtlMs > 3_600_000\n ) {\n throw new Error(\"Connected command reconciliation claim TTL is invalid\");\n }\n const rows = await db.execute<ConnectedMachineBackgroundCommandClaimRow>(sql`\n select account_id as \"accountId\",\n workspace_id as \"workspaceId\",\n session_id as \"sessionId\",\n command_id as \"commandId\",\n claim_id as \"claimId\",\n command_state as \"commandState\",\n control_workspace_id as \"controlWorkspaceId\",\n enrollment_id as \"enrollmentId\",\n connection_instance_id as \"connectionInstanceId\",\n op_id as \"opId\",\n reconcile_attempts as \"reconcileAttempts\",\n reconcile_proof_outcome as \"reconcileProofOutcome\",\n reconcile_proof_exit_code as \"reconcileProofExitCode\",\n reconcile_proof_reason as \"reconcileProofReason\",\n reconcile_proof_observed_at as \"reconcileProofObservedAt\"\n from opengeni_private.claim_connected_machine_background_commands(\n ${input.claimId}::uuid, ${input.limit}::integer, ${input.claimTtlMs}::bigint,\n ${(input.dueBefore ?? new Date()).toISOString()}::timestamptz\n )\n `);\n return rows.map((row: ConnectedMachineBackgroundCommandClaimRow) => {\n if (row.commandState !== \"running\" && row.commandState !== \"stopping\") {\n throw new Error(`Connected command claim returned invalid state ${row.commandState}`);\n }\n const proof =\n row.reconcileProofOutcome === null\n ? null\n : row.reconcileProofOutcome === \"exited\" || row.reconcileProofOutcome === \"lost\"\n ? {\n outcome: row.reconcileProofOutcome,\n exitCode:\n row.reconcileProofExitCode === null ? null : Number(row.reconcileProofExitCode),\n reason: row.reconcileProofReason!,\n observedAt:\n row.reconcileProofObservedAt instanceof Date\n ? row.reconcileProofObservedAt\n : new Date(row.reconcileProofObservedAt!),\n }\n : (() => {\n throw new Error(\n `Connected command claim returned invalid proof ${row.reconcileProofOutcome}`,\n );\n })();\n return {\n commandId: row.commandId,\n accountId: row.accountId,\n workspaceId: row.workspaceId,\n sessionId: row.sessionId,\n claimId: row.claimId,\n state: row.commandState,\n controlWorkspaceId: row.controlWorkspaceId,\n enrollmentId: row.enrollmentId,\n connectionInstanceId: row.connectionInstanceId,\n opId: row.opId,\n reconcileAttempts: Number(row.reconcileAttempts),\n proof,\n };\n });\n}\n\nfunction connectedClaimIdentityWhere(claim: ConnectedMachineBackgroundCommandClaim) {\n return and(\n eq(schema.sessionBackgroundCommands.id, claim.commandId),\n eq(schema.sessionBackgroundCommands.accountId, claim.accountId),\n eq(schema.sessionBackgroundCommands.workspaceId, claim.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, claim.sessionId),\n eq(schema.sessionBackgroundCommands.provider, \"connected_machine\"),\n eq(schema.sessionBackgroundCommands.controlWorkspaceId, claim.controlWorkspaceId),\n eq(schema.sessionBackgroundCommands.enrollmentId, claim.enrollmentId),\n eq(schema.sessionBackgroundCommands.connectionInstanceId, claim.connectionInstanceId),\n eq(schema.sessionBackgroundCommands.opId, claim.opId),\n eq(schema.sessionBackgroundCommands.reconcileClaimId, claim.claimId),\n inArray(schema.sessionBackgroundCommands.state, [\"running\", \"stopping\"]),\n );\n}\n\n/** Checkpoint one exact terminal provider observation before lifecycle settlement.\n * A retry may reuse an identical proof; a divergent proof is a hard identity fault. */\nexport async function recordConnectedMachineBackgroundCommandProof(\n db: Database,\n input: {\n claim: ConnectedMachineBackgroundCommandClaim;\n proof: ConnectedMachineBackgroundCommandProof;\n },\n): Promise<void> {\n const failure = input.proof.failure ? SessionCommandFailure.parse(input.proof.failure) : null;\n const reason = boundedSessionBackgroundCommandReason(\n input.proof.reason,\n \"Connected command proof reason\",\n );\n if (failure && reason !== `op_failure_${failure.code}`)\n throw new Error(\"Connected command failure code conflicts with proof reason\");\n if (input.proof.outcome === \"exited\" && input.proof.exitCode === null) {\n throw new Error(\"Connected command exit proof requires an exit code\");\n }\n if (input.proof.outcome === \"lost\" && input.proof.exitCode !== null) {\n throw new Error(\"Connected command loss proof cannot carry an exit code\");\n }\n await withRlsContext(\n db,\n { accountId: input.claim.accountId, workspaceId: input.claim.workspaceId },\n async (scopedDb) => {\n const [current] = await scopedDb\n .select()\n .from(schema.sessionBackgroundCommands)\n .where(connectedClaimIdentityWhere(input.claim))\n .for(\"update\")\n .limit(1);\n if (!current) throw new Error(\"Connected command proof was fenced by newer lifecycle state\");\n if (current.reconcileProofOutcome !== null) {\n const observedAt = current.reconcileProofObservedAt?.getTime() ?? null;\n if (\n current.reconcileProofOutcome !== input.proof.outcome ||\n current.reconcileProofExitCode !== input.proof.exitCode ||\n current.reconcileProofReason !== reason ||\n !isDeepStrictEqual(current.runnerFailure, failure) ||\n observedAt !== input.proof.observedAt.getTime()\n ) {\n throw new Error(\"Connected command reconciliation proof conflicts with durable proof\");\n }\n return;\n }\n const rows = await scopedDb\n .update(schema.sessionBackgroundCommands)\n .set({\n reconcileProofOutcome: input.proof.outcome,\n reconcileProofExitCode: input.proof.exitCode,\n reconcileProofReason: reason,\n runnerFailure: failure,\n reconcileProofObservedAt: input.proof.observedAt,\n lastReconcileOutcome: `proof_${input.proof.outcome}`,\n updatedAt: new Date(),\n })\n .where(connectedClaimIdentityWhere(input.claim))\n .returning({ id: schema.sessionBackgroundCommands.id });\n if (rows.length !== 1) {\n throw new Error(\"Connected command proof lost its exact claim during checkpoint\");\n }\n },\n );\n}\n\nexport async function deferConnectedMachineBackgroundCommandReconciliation(\n db: Database,\n input: {\n claim: ConnectedMachineBackgroundCommandClaim;\n outcome: string;\n retryAfterMs: number;\n },\n): Promise<boolean> {\n if (!Number.isSafeInteger(input.retryAfterMs) || input.retryAfterMs < 0) {\n throw new Error(\"Connected command reconciliation retry delay is invalid\");\n }\n const outcome = input.outcome.trim().slice(0, 64);\n if (!outcome) throw new Error(\"Connected command reconciliation outcome must not be empty\");\n return await withRlsContext(\n db,\n { accountId: input.claim.accountId, workspaceId: input.claim.workspaceId },\n async (scopedDb) => {\n const rows = await scopedDb\n .update(schema.sessionBackgroundCommands)\n .set({\n reconcileAfter: new Date(Date.now() + input.retryAfterMs),\n reconcileClaimId: null,\n reconcileClaimedAt: null,\n lastReconcileOutcome: outcome,\n updatedAt: new Date(),\n })\n .where(connectedClaimIdentityWhere(input.claim))\n .returning({ id: schema.sessionBackgroundCommands.id });\n return rows.length === 1;\n },\n );\n}\n\n/** Settle only from the proof already checkpointed under this exact claim. */\nexport async function settleClaimedConnectedMachineBackgroundCommandWithMutation(\n db: Database,\n input: { claim: ConnectedMachineBackgroundCommandClaim },\n mutateTerminal: SessionBackgroundCommandTerminalMutation,\n): Promise<boolean> {\n return await withSessionActivityRlsContext(\n db,\n { accountId: input.claim.accountId, workspaceId: input.claim.workspaceId },\n async (tx) => {\n await mutateTerminal.prepare(tx);\n const rows = await tx.execute<{ id: string }>(sql`\n update ${schema.sessionBackgroundCommands} command set\n state = command.reconcile_proof_outcome,\n exit_code = case\n when command.reconcile_proof_outcome = 'exited'\n then command.reconcile_proof_exit_code\n else null\n end,\n settlement_reason = command.reconcile_proof_reason,\n settled_at = command.reconcile_proof_observed_at,\n reconcile_claim_id = null,\n reconcile_claimed_at = null,\n last_reconcile_outcome = 'settled_' || command.reconcile_proof_outcome,\n updated_at = clock_timestamp()\n where command.id = ${input.claim.commandId}\n and command.account_id = ${input.claim.accountId}\n and command.workspace_id = ${input.claim.workspaceId}\n and command.session_id = ${input.claim.sessionId}\n and command.provider = 'connected_machine'\n and command.control_workspace_id = ${input.claim.controlWorkspaceId}\n and command.enrollment_id = ${input.claim.enrollmentId}\n and command.connection_instance_id = ${input.claim.connectionInstanceId}\n and command.op_id = ${input.claim.opId}\n and command.reconcile_claim_id = ${input.claim.claimId}\n and command.state in ('running', 'stopping')\n and command.reconcile_proof_outcome in ('exited', 'lost')\n and command.reconcile_proof_observed_at is not null\n returning command.id\n `);\n if (rows.length !== 1) return false;\n const [row] = await tx\n .select()\n .from(schema.sessionBackgroundCommands)\n .where(eq(schema.sessionBackgroundCommands.id, input.claim.commandId))\n .limit(1);\n if (!row) throw new Error(\"Settled Connected Machine command disappeared\");\n await mutateTerminal.commit(tx, mapCommand(row));\n return true;\n },\n );\n}\n\nexport async function requestSessionBackgroundCommandCancellation(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n subjectId: string;\n },\n): Promise<{ command: SessionBackgroundCommand | null; accepted: boolean }> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const [current] = await tx\n .select()\n .from(schema.sessionBackgroundCommands)\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.id, input.commandId),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!current) return { command: null, accepted: false };\n if (current.state !== \"running\") {\n return { command: mapCommand(current), accepted: false };\n }\n const [updated] = await tx\n .update(schema.sessionBackgroundCommands)\n .set({\n state: \"stopping\",\n cancelRequestedAt: new Date(),\n cancelRequestedBy: input.subjectId.slice(0, 1024),\n reconcileAfter: new Date(),\n reconcileClaimId: null,\n reconcileClaimedAt: null,\n updatedAt: new Date(),\n })\n .where(eq(schema.sessionBackgroundCommands.id, current.id))\n .returning();\n if (current.retainedProcessId) {\n await tx\n .update(schema.sandboxRetainedProcesses)\n .set({ reconcileAfter: new Date(), lastReconcileOutcome: \"cancel_requested\" })\n .where(\n and(\n eq(schema.sandboxRetainedProcesses.id, current.retainedProcessId),\n eq(schema.sandboxRetainedProcesses.state, \"active\"),\n sql`${schema.sandboxRetainedProcesses.reconcileClaimId} is null`,\n ),\n );\n }\n return { command: mapCommand(updated!), accepted: true };\n }),\n );\n}\n\n/**\n * Transfer every active command in one or more session subtrees to the\n * provider-neutral stopping state inside the caller's existing control\n * transaction. The workspace-control mutation already excludes concurrent\n * session-tree changes, so the recursive walk and state transition are one\n * atomic Pause/Cancel effect. Steer deliberately never calls this seam.\n */\nexport async function requestSessionBackgroundCommandCancellationsInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n rootSessionIds: string[];\n subjectId: string;\n },\n): Promise<number> {\n const rootSessionIds = [...new Set(input.rootSessionIds)];\n if (rootSessionIds.length === 0) return 0;\n const rows = await db.execute<{ commandCount: number | string }>(sql`\n with recursive roots(id) as (\n values ${sql.join(\n rootSessionIds.map((sessionId) => sql`(${sessionId}::uuid)`),\n sql`, `,\n )}\n ), subtree(id, path, cycle) as (\n select session.id, array[session.id]::uuid[], false\n from roots root\n join ${schema.sessions} session\n on session.workspace_id = ${input.workspaceId}\n and session.id = root.id\n union all\n select child.id, parent.path || child.id, child.id = any(parent.path)\n from subtree parent\n join ${schema.sessions} child\n on child.workspace_id = ${input.workspaceId}\n and child.parent_session_id = parent.id\n where not parent.cycle\n ), stopped as (\n update ${schema.sessionBackgroundCommands} command set\n state = 'stopping',\n cancel_requested_at = clock_timestamp(),\n cancel_requested_by = left(${input.subjectId}, 1024),\n reconcile_after = clock_timestamp(),\n reconcile_claim_id = null,\n reconcile_claimed_at = null,\n updated_at = clock_timestamp()\n where command.workspace_id = ${input.workspaceId}\n and command.session_id in (select id from subtree where not cycle)\n and command.state = 'running'\n returning command.retained_process_id\n ), nudged as (\n update ${schema.sandboxRetainedProcesses} process set\n reconcile_after = clock_timestamp(),\n reconcile_claim_id = null,\n reconcile_claimed_at = null,\n last_reconcile_outcome = 'cancel_requested'\n where process.id in (\n select stopped.retained_process_id\n from stopped\n where stopped.retained_process_id is not null\n )\n and process.state = 'active'\n returning process.id\n )\n select count(*)::integer as \"commandCount\" from stopped\n `);\n return Number(rows[0]?.commandCount ?? 0);\n}\n\n/** Workspace Pause owns every active command in that workspace. */\nexport async function requestWorkspaceBackgroundCommandCancellationsInTransaction(\n db: Database,\n input: { workspaceId: string; subjectId: string },\n): Promise<number> {\n const rows = await db.execute<{ commandCount: number | string }>(sql`\n with stopped as (\n update ${schema.sessionBackgroundCommands} command set\n state = 'stopping',\n cancel_requested_at = clock_timestamp(),\n cancel_requested_by = left(${input.subjectId}, 1024),\n reconcile_after = clock_timestamp(),\n reconcile_claim_id = null,\n reconcile_claimed_at = null,\n updated_at = clock_timestamp()\n where command.workspace_id = ${input.workspaceId}\n and command.state = 'running'\n returning command.retained_process_id\n ), nudged as (\n update ${schema.sandboxRetainedProcesses} process set\n reconcile_after = clock_timestamp(),\n reconcile_claim_id = null,\n reconcile_claimed_at = null,\n last_reconcile_outcome = 'cancel_requested'\n where process.id in (\n select stopped.retained_process_id\n from stopped\n where stopped.retained_process_id is not null\n )\n and process.state = 'active'\n returning process.id\n )\n select count(*)::integer as \"commandCount\" from stopped\n `);\n return Number(rows[0]?.commandCount ?? 0);\n}\n\nexport async function settleSessionBackgroundCommandForRetainedProcessInTransaction(\n tx: SessionActivityDatabase,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n retainedProcessId: string;\n outcome: \"exited\" | \"lost\";\n exitCode: number | null;\n reason: string;\n },\n mutateTerminal: SessionBackgroundCommandTerminalMutation,\n): Promise<SessionBackgroundCommand | null> {\n const reason = boundedSessionBackgroundCommandReason(\n input.reason,\n \"Managed command settlement reason\",\n );\n await mutateTerminal.prepare(tx);\n const [updatedRow] = await tx\n .update(schema.sessionBackgroundCommands)\n .set({\n state: input.outcome,\n exitCode: input.outcome === \"exited\" ? input.exitCode : null,\n settlementReason: reason,\n settledAt: new Date(),\n reconcileClaimId: null,\n reconcileClaimedAt: null,\n lastReconcileOutcome: `settled_${input.outcome}`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.retainedProcessId, input.retainedProcessId),\n inArray(schema.sessionBackgroundCommands.state, [\"running\", \"stopping\"]),\n ),\n )\n .returning();\n let row = updatedRow;\n if (!row) {\n const [current] = await tx\n .select()\n .from(schema.sessionBackgroundCommands)\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.retainedProcessId, input.retainedProcessId),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!current) return null;\n if (\n current.state !== input.outcome ||\n current.exitCode !== (input.outcome === \"exited\" ? input.exitCode : null)\n ) {\n throw new Error(\"Managed background command terminal state conflicts with process proof\");\n }\n const [existingEvent] = await tx\n .select({ id: schema.sessionEvents.id })\n .from(schema.sessionEvents)\n .where(\n and(\n eq(schema.sessionEvents.workspaceId, input.workspaceId),\n eq(schema.sessionEvents.sessionId, input.sessionId),\n eq(schema.sessionEvents.type, \"session.command.finished\"),\n sql`${schema.sessionEvents.payload} ->> 'commandId' = ${current.id}`,\n ),\n )\n .limit(1);\n if (existingEvent) return mapCommand(current);\n row = current;\n }\n const command = mapCommand(row);\n await mutateTerminal.commit(tx, command);\n return command;\n}\n\nexport async function settleConnectedMachineSessionBackgroundCommandWithMutation(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n controlWorkspaceId: string;\n enrollmentId: string;\n connectionInstanceId: string;\n opId: string;\n outcome: \"exited\" | \"lost\";\n exitCode: number | null;\n reason: string;\n failure?: SessionCommandFailure | undefined;\n },\n mutateTerminal: SessionBackgroundCommandTerminalMutation,\n): Promise<SessionBackgroundCommand | null> {\n const failure = input.failure ? SessionCommandFailure.parse(input.failure) : null;\n const reason = boundedSessionBackgroundCommandReason(\n input.reason,\n \"Connected command settlement reason\",\n );\n if (failure && reason !== `op_failure_${failure.code}`)\n throw new Error(\"Connected command failure code conflicts with settlement reason\");\n if (input.outcome === \"exited\" && input.exitCode === null) {\n throw new Error(\"Connected command exit settlement requires an exit code\");\n }\n if (input.outcome === \"lost\" && input.exitCode !== null) {\n throw new Error(\"Connected command loss settlement cannot carry an exit code\");\n }\n return await withSessionActivityRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (tx) => {\n await mutateTerminal.prepare(tx);\n const settledAt = new Date();\n const [row] = await tx\n .update(schema.sessionBackgroundCommands)\n .set({\n state: input.outcome,\n exitCode: input.outcome === \"exited\" ? input.exitCode : null,\n settlementReason: reason,\n runnerFailure: failure,\n settledAt,\n reconcileClaimId: null,\n reconcileClaimedAt: null,\n reconcileProofOutcome: input.outcome,\n reconcileProofExitCode: input.outcome === \"exited\" ? input.exitCode : null,\n reconcileProofReason: reason,\n reconcileProofObservedAt: settledAt,\n lastReconcileOutcome: `settled_${input.outcome}`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.id, input.commandId),\n eq(schema.sessionBackgroundCommands.provider, \"connected_machine\"),\n eq(schema.sessionBackgroundCommands.controlWorkspaceId, input.controlWorkspaceId),\n eq(schema.sessionBackgroundCommands.enrollmentId, input.enrollmentId),\n eq(schema.sessionBackgroundCommands.connectionInstanceId, input.connectionInstanceId),\n eq(schema.sessionBackgroundCommands.opId, input.opId),\n // A fast owner settlement cannot erase or replace metadata already\n // checkpointed by the reconciler under the exact command identity.\n sql`(${schema.sessionBackgroundCommands.runnerFailure} is null or\n ${schema.sessionBackgroundCommands.runnerFailure} = ${failure ? JSON.stringify(failure) : null}::jsonb)`,\n inArray(schema.sessionBackgroundCommands.state, [\"running\", \"stopping\"]),\n ),\n )\n .returning();\n if (!row) return null;\n const command = mapCommand(row);\n await mutateTerminal.commit(tx, command);\n return command;\n },\n );\n}\n\nexport async function getSessionBackgroundCommand(\n db: Database,\n input: { accountId: string; workspaceId: string; sessionId: string; commandId: string },\n): Promise<SessionBackgroundCommand | null> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [row] = await scopedDb\n .select(commandReadColumns)\n .from(schema.sessionBackgroundCommands)\n .where(\n and(\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.id, input.commandId),\n ),\n )\n .limit(1);\n return row ? mapCommand(row) : null;\n },\n );\n}\n\nexport type SessionCommandIdentity = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n commandId: string;\n};\n\n/** Observe terminal state, not output consumption. Native terminal-result adapters\n * call this after settlement. Session-first ordering serializes settlement and\n * inbox claiming; already delivered history is never rewritten. */\nexport async function observeSessionBackgroundCommandCompletion(\n db: Database,\n input: SessionCommandIdentity,\n): Promise<SessionBackgroundCommand | null> {\n return await withSessionActivityRlsContext(db, input, async (tx) => {\n const locks = await lockSessionEventWriteRows(tx, {\n workspaceId: input.workspaceId,\n controlLock: \"share\",\n sessionIds: [input.sessionId],\n });\n if (locks.sessions[0]?.accountId !== input.accountId) return null;\n const identity = and(\n eq(schema.sessionBackgroundCommands.accountId, input.accountId),\n eq(schema.sessionBackgroundCommands.workspaceId, input.workspaceId),\n eq(schema.sessionBackgroundCommands.sessionId, input.sessionId),\n eq(schema.sessionBackgroundCommands.id, input.commandId),\n );\n const [command] = await tx\n .select()\n .from(schema.sessionBackgroundCommands)\n .where(identity)\n .for(\"update\")\n .limit(1);\n if (!command) return null;\n if (command.state !== \"exited\" && command.state !== \"lost\") return mapCommand(command);\n const observedAt = command.completionObservedAt ?? new Date();\n await tx\n .update(schema.sessionBackgroundCommands)\n .set({ completionObservedAt: observedAt })\n .where(identity);\n await tx\n .update(schema.sessionSystemUpdates)\n .set({ state: \"superseded\" })\n .where(\n and(\n eq(schema.sessionSystemUpdates.accountId, input.accountId),\n eq(schema.sessionSystemUpdates.workspaceId, input.workspaceId),\n eq(schema.sessionSystemUpdates.sessionId, input.sessionId),\n eq(schema.sessionSystemUpdates.kind, \"background_command_result\"),\n eq(schema.sessionSystemUpdates.sourceId, input.commandId),\n eq(schema.sessionSystemUpdates.dedupeKey, `background-command-result:${input.commandId}`),\n eq(schema.sessionSystemUpdates.state, \"pending\"),\n ),\n );\n return mapCommand({ ...command, completionObservedAt: observedAt });\n });\n}\n\nexport const COMMAND_OUTPUT_DEFAULT_BYTES = 16_384;\nexport const COMMAND_OUTPUT_MAX_BYTES = 65_536;\nexport const COMMAND_OUTPUT_PAGE_ROWS = 64;\n\nexport function parseCommandOutputCursor(cursor: string | undefined, commandId: string) {\n if (cursor === undefined) return { sequence: 0, offset: 0 };\n if (cursor.length > 128) throw new Error(\"Invalid command output cursor\");\n const parts = cursor.split(\":\");\n if (\n parts.length !== 3 ||\n parts[0] !== commandId ||\n !/^\\d+$/.test(parts[1]!) ||\n !/^\\d+$/.test(parts[2]!)\n ) {\n throw new Error(\"Invalid command output cursor\");\n }\n const sequence = Number(parts[1]);\n const offset = Number(parts[2]);\n if (!Number.isSafeInteger(sequence) || !Number.isSafeInteger(offset))\n throw new Error(\"Invalid command output cursor\");\n return { sequence, offset };\n}\n\nexport type CommandOutputRow = {\n sequence: number;\n payload: unknown;\n payloadCodecVersion: number | null;\n};\n\n/** Cursor offsets are UTF-16 positions at code-point boundaries; budgets are UTF-8 bytes. */\nexport function projectCommandOutputPage(input: {\n commandId: string;\n cursor?: string | undefined;\n maxOutputBytes?: number | undefined;\n rows: CommandOutputRow[];\n}) {\n const start = parseCommandOutputCursor(input.cursor, input.commandId);\n const budget = input.maxOutputBytes ?? COMMAND_OUTPUT_DEFAULT_BYTES;\n if (!Number.isSafeInteger(budget) || budget < 4 || budget > COMMAND_OUTPUT_MAX_BYTES)\n throw new Error(\"maxOutputBytes must be between 4 and 65536\");\n let remaining = budget;\n let sequence = start.sequence;\n let offset = start.offset;\n const chunks: {\n sequence: number;\n stream: \"stdout\" | \"stderr\";\n streamFidelity: \"separate\" | \"merged\" | \"unknown\";\n chunk: string;\n }[] = [];\n const gaps: string[] = [];\n if (start.offset > 0 && input.rows[0]?.sequence !== start.sequence)\n gaps.push(\"cursor_output_no_longer_retained\");\n let consumed = 0;\n for (const row of input.rows.slice(0, COMMAND_OUTPUT_PAGE_ROWS)) {\n const payload = fromPostgresLosslessJson(row.payload, row.payloadCodecVersion) as Record<\n string,\n unknown\n >;\n const text = typeof payload?.chunk === \"string\" ? payload.chunk : \"\";\n if (typeof payload?.chunk !== \"string\") gaps.push(\"retained_event_has_no_output_chunk\");\n if (payload?.commandReadProjectionGap === true) gaps.push(\"retained_event_exceeds_read_limit\");\n if (payload?.truncation && typeof payload.truncation === \"object\")\n gaps.push(\"output_truncated_at_retention_boundary\");\n const begin = row.sequence === start.sequence ? start.offset : 0;\n if (\n begin > 0 &&\n begin < text.length &&\n text.charCodeAt(begin - 1) >= 0xd800 &&\n text.charCodeAt(begin - 1) <= 0xdbff &&\n text.charCodeAt(begin) >= 0xdc00 &&\n text.charCodeAt(begin) <= 0xdfff\n ) {\n throw new Error(\"Invalid command output cursor: offset splits a Unicode code point\");\n }\n if (begin > text.length) gaps.push(\"cursor_output_no_longer_retained\");\n let end = Math.min(begin, text.length);\n for (const character of text.slice(end)) {\n const bytes = Buffer.byteLength(character, \"utf8\");\n if (bytes > remaining) break;\n remaining -= bytes;\n end += character.length;\n }\n if (end > begin)\n chunks.push({\n sequence: row.sequence,\n stream: payload.stream === \"stderr\" ? \"stderr\" : \"stdout\",\n streamFidelity:\n payload.streamFidelity === \"merged\"\n ? \"merged\"\n : payload.streamFidelity === \"separate\"\n ? \"separate\"\n : \"unknown\",\n chunk: text.slice(begin, end),\n });\n if (end < text.length) {\n sequence = row.sequence;\n offset = end;\n break;\n }\n sequence = row.sequence + 1;\n offset = 0;\n consumed++;\n }\n return {\n chunks,\n nextCursor: `${input.commandId}:${sequence}:${offset}`,\n hasMore: consumed < input.rows.length,\n retention: {\n source: \"retained_session_events\" as const,\n completeness: \"unknown\" as const,\n gaps: [...new Set(gaps)],\n },\n };\n}\n\nexport async function readSessionBackgroundCommandOutput(\n db: Database,\n input: SessionCommandIdentity & {\n cursor?: string | undefined;\n maxOutputBytes?: number | undefined;\n },\n) {\n const cursor = parseCommandOutputCursor(input.cursor, input.commandId);\n // Validate the budget before any observation mutation.\n projectCommandOutputPage({ ...input, rows: [] });\n const command = await getSessionBackgroundCommand(db, input);\n if (!command) throw new Error(\"Background command not found in this session\");\n const rows = await withRlsContext(\n db,\n input,\n async (tx) =>\n await tx\n .select({\n sequence: schema.sessionEvents.sequence,\n // Bound legacy payloads in SQL too: LIMIT alone cannot bound one old event.\n // Oversized historical rows carry explicit loss rather than allocating an\n // unbounded JSON value in the API process.\n payload: sql<unknown>`case when octet_length(${schema.sessionEvents.payload}::text) <= 262144\n then ${schema.sessionEvents.payload}\n else jsonb_build_object('commandReadProjectionGap', true) end`,\n payloadCodecVersion: schema.sessionEvents.payloadCodecVersion,\n })\n .from(schema.sessionEvents)\n .where(\n and(\n eq(schema.sessionEvents.workspaceId, input.workspaceId),\n eq(schema.sessionEvents.sessionId, input.sessionId),\n eq(schema.sessionEvents.type, \"sandbox.command.output.delta\"),\n sql`${schema.sessionEvents.payload} ->> 'commandId' = ${input.commandId}`,\n gte(schema.sessionEvents.sequence, cursor.sequence),\n ),\n )\n .orderBy(asc(schema.sessionEvents.sequence))\n .limit(COMMAND_OUTPUT_PAGE_ROWS + 1),\n );\n const page = projectCommandOutputPage({ ...input, rows });\n // Only observe the terminal state actually used by this read. A finish racing\n // a running read must leave its notification pending.\n const terminal = command.state === \"exited\" || command.state === \"lost\";\n const observed = terminal ? await observeSessionBackgroundCommandCompletion(db, input) : command;\n return {\n commandId: command.id,\n state: command.state,\n exitCode: command.exitCode,\n settlementReason: command.settlementReason,\n ...(command.failure ? { failure: command.failure } : {}),\n terminal,\n completionObservedAt: observed?.completionObservedAt ?? null,\n ...page,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n boundWorkspaceControlEvent,\n childPausedClassification,\n McpPersonalConnectionDelegations,\n workspaceControlUtf8Bytes,\n type WorkspacePauseTimerRequest,\n type SessionMcpApprovalPolicy,\n type TurnInitiatorContext,\n} from \"@opengeni/contracts\";\nimport { and, eq, inArray, sql } from \"drizzle-orm\";\nimport type { Database, SessionActivityDatabase } from \"./database\";\nimport { withLosslessContentWriteVersion } from \"./lossless-json\";\nimport { nestedPostgresSqlState } from \"./persistence-errors\";\nimport { getExternalLinkTurnAuthorization } from \"./external-link-work\";\nimport * as schema from \"./schema\";\nimport {\n boundedChildPausedReason,\n childLifecycleNoticesEnabled,\n childPausedDedupeKey,\n childPausedSummary,\n childRequiresActionResolvedDedupeKey,\n childRequiresActionResolvedSummary,\n} from \"./child-lifecycle-notices\";\nimport { closePendingSessionToolCallsInTransaction } from \"./session-tool-call-settlement\";\nimport {\n mirrorSessionRealtimeContextInTransaction,\n renderRealtimeHumanInputResponseContext,\n} from \"./session-realtime-mirror\";\nimport {\n requestSessionBackgroundCommandCancellationsInTransaction,\n requestWorkspaceBackgroundCommandCancellationsInTransaction,\n} from \"./session-background-commands\";\n\ntype SessionEventInsertWithPayload = typeof schema.sessionEvents.$inferInsert & {\n payload: unknown;\n};\n\nexport const SESSION_ANCESTRY_LIMIT = 10_000;\n\nexport type WorkspaceControlLockMode = \"none\" | \"share\" | \"update\";\nexport type EffectiveControlState = \"active\" | \"paused\";\nexport type SessionCommandActor =\n | { type: \"human\" | \"operator\"; subjectId: string }\n | {\n type: \"service\";\n subjectId: string;\n subjectLabel?: string;\n context?: TurnInitiatorContext;\n }\n | {\n type: \"agent_attempt\";\n attemptId: string;\n sessionId: string;\n turnId: string;\n executionGeneration: number;\n };\nexport type SessionTurnAttemptOutcome =\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"superseded\"\n | \"requires_action\"\n | \"waiting_capacity\"\n | \"interrupted_recoverable\"\n | \"lease_lost_recoverable\"\n | \"pre_cutover_closed\";\n\nexport type EffectiveControlBlocker = {\n kind: \"session\" | \"workspace\";\n sessionId?: string;\n displayName: string;\n actor: string | null;\n reason: string | null;\n changedAt: Date | null;\n revision: number;\n};\n\nexport type EffectiveControlResumeOption = {\n scope: \"selected\" | \"session\" | \"workspace\";\n targetId?: string;\n selectedStateAfter: EffectiveControlState;\n remainingPrimaryBlocker?: EffectiveControlBlocker;\n impactCopy: string;\n};\n\nexport type EffectiveSessionControl = {\n state: EffectiveControlState;\n controlVersion: number;\n controlEtag: string;\n directState: EffectiveControlState;\n primaryBlocker: EffectiveControlBlocker | null;\n additionalBlockerCount: number;\n blockers: EffectiveControlBlocker[];\n resumeOptions: EffectiveControlResumeOption[];\n override: { rootSessionId: string; revision: number } | null;\n settlement: {\n state: \"stopping\";\n attemptCount: number;\n interruptionPendingCount: number;\n quiescencePendingCount: number;\n } | null;\n backgroundCommandSettlement: {\n state: \"stopping\";\n commandCount: number;\n } | null;\n};\n\n/**\n * The bounded control projection required by a locked activity-write fence.\n * Settlement and background-command summaries are read-model concerns and must\n * not extend the session-event critical section when admission only needs the\n * effective run state and blocker scope.\n */\nexport type SessionWriteAdmissionControl = {\n state: EffectiveControlState;\n controlVersion: number;\n primaryBlockerKind: EffectiveControlBlocker[\"kind\"] | null;\n};\n\ntype SettlementAttemptCounts = {\n attemptCount: number;\n interruptionPendingCount: number;\n quiescencePendingCount: number;\n};\n\nconst NO_SETTLEMENT_ATTEMPTS: SettlementAttemptCounts = {\n attemptCount: 0,\n interruptionPendingCount: 0,\n quiescencePendingCount: 0,\n};\n\nexport const SESSION_DISCOVERY_CONTROL_TITLE_MAX_CHARS = 200;\nexport const SESSION_DISCOVERY_CONTROL_TARGET_LIMIT = 100;\n\n/**\n * Purpose-built control projection for session discovery. Full blocker evidence,\n * actors/reasons, resume options, etags, and settlement state remain available\n * from the ordinary session detail APIs; this shape is intentionally only what\n * `sessions_list` renders.\n */\nexport type SessionDiscoveryControl = {\n state: EffectiveControlState;\n primaryBlocker: {\n kind: \"session\" | \"workspace\";\n sessionId?: string;\n displayName: string;\n displayNameOriginalChars: number;\n } | null;\n additionalBlockerCount: number;\n};\n\nexport function serializeEffectiveSessionControl(control: EffectiveSessionControl) {\n const blocker = (\n value: EffectiveControlBlocker,\n ): Omit<EffectiveControlBlocker, \"changedAt\"> & {\n changedAt: string | null;\n } => ({\n ...value,\n changedAt: value.changedAt?.toISOString() ?? null,\n });\n return {\n ...control,\n primaryBlocker: control.primaryBlocker ? blocker(control.primaryBlocker) : null,\n blockers: control.blockers.map(blocker),\n resumeOptions: control.resumeOptions.map(({ remainingPrimaryBlocker, ...option }) => ({\n ...option,\n ...(remainingPrimaryBlocker\n ? { remainingPrimaryBlocker: blocker(remainingPrimaryBlocker) }\n : {}),\n })),\n };\n}\n\nexport type WorkspaceControlRow = {\n workspaceId: string;\n accountId: string;\n revision: number | string;\n workspaceState: string;\n workspacePauseRevision: number | string | null;\n timerId: string | null;\n timerAction: string | null;\n timerDueAt: Date | string | null;\n timerPauseForSeconds: number | null;\n timerPauseRevision: number | string | null;\n reason: string | null;\n changedBy: string | null;\n changedAt: Date | string | null;\n};\n\ntype AncestryRow = {\n targetId: string;\n sessionId: string;\n parentSessionId: string | null;\n title: string | null;\n directState: string;\n directPauseRevision: number | string | null;\n subtreeRunOverrideRevision: number | string | null;\n controlVersion: number | string;\n directControlChangedBy: string | null;\n directControlReason: string | null;\n directControlChangedAt: Date | string | null;\n depth: number | string;\n cycle: boolean;\n};\n\ntype AncestryNode = Omit<AncestryRow, \"targetId\" | \"depth\" | \"cycle\">;\n\nexport type SessionCommandReceiptRow = typeof schema.sessionCommandReceipts.$inferSelect;\n\nexport class SessionControlInvariantError extends Error {\n readonly code = \"SESSION_CONTROL_INVARIANT\";\n\n constructor(message: string) {\n super(message);\n this.name = \"SessionControlInvariantError\";\n }\n}\n\nexport class SessionControlConflictError extends Error {\n readonly code = \"CONTROL_CHANGED\";\n\n constructor(message = \"The workstream control changed\") {\n super(message);\n this.name = \"SessionControlConflictError\";\n }\n}\n\nexport class SessionCommandIdempotencyError extends Error {\n readonly code = \"IDEMPOTENCY_KEY_REUSED\";\n\n constructor() {\n super(\"The operation key was already used with different input\");\n this.name = \"SessionCommandIdempotencyError\";\n }\n}\n\nexport class AgentCommandAuthorityError extends Error {\n constructor(\n readonly code: \"CALLER_STALE\" | \"CALLER_INTERRUPTED\" | \"TARGET_NOT_VERTICAL\" | \"SELF_STEER\",\n message: string,\n ) {\n super(message);\n this.name = \"AgentCommandAuthorityError\";\n }\n}\n\nexport async function assertAgentCommandAuthorityInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n actor: Extract<SessionCommandActor, { type: \"agent_attempt\" }>;\n targetSessionId: string;\n action: \"pause\" | \"resume\" | \"steer\" | \"message\" | \"goal\" | \"wait\";\n },\n): Promise<void> {\n if ([\"goal\", \"wait\"].includes(input.action) && input.targetSessionId !== input.actor.sessionId) {\n throw new SessionControlInvariantError(\"An agent self command must target its own session\");\n }\n // Every command caller establishes the control/workspace prefix first.\n // Reusing the event-write helper here keeps cross-session actor authority on\n // the same UUID-ordered session -> exact turn -> exact attempt suffix.\n const authorityLocks = await lockSessionEventWriteRows(db, {\n workspaceId: input.workspaceId,\n controlLock: \"already_locked\",\n workspaceLock: \"already_locked\",\n sessionIds: [input.actor.sessionId, input.targetSessionId],\n turnIds: [input.actor.turnId],\n attemptIds: [input.actor.attemptId],\n });\n const lockedSessions = authorityLocks.sessions;\n const callerSession = lockedSessions.find((row) => row.id === input.actor.sessionId);\n if (!callerSession) {\n throw new AgentCommandAuthorityError(\"CALLER_STALE\", \"The calling session no longer exists\");\n }\n const targetSession = lockedSessions.find((row) => row.id === input.targetSessionId);\n if (!targetSession) {\n throw new SessionControlInvariantError(`Target session not found: ${input.targetSessionId}`);\n }\n const rows = await db.execute<{\n attemptId: string;\n attemptState: string;\n attemptSessionId: string;\n attemptTurnId: string;\n executionGeneration: number;\n activeAttemptId: string | null;\n turnStatus: string;\n activeTurnId: string | null;\n interrupted: boolean;\n }>(sql`\n select\n attempt.id as \"attemptId\",\n attempt.state as \"attemptState\",\n attempt.session_id as \"attemptSessionId\",\n attempt.turn_id as \"attemptTurnId\",\n attempt.execution_generation as \"executionGeneration\",\n turn.active_attempt_id as \"activeAttemptId\",\n turn.status as \"turnStatus\",\n session.active_turn_id as \"activeTurnId\",\n exists (\n select 1\n from ${schema.sessionAttemptInterruptions} interruption\n where interruption.workspace_id = ${input.workspaceId}\n and interruption.attempt_id = attempt.id\n and interruption.state in ('pending', 'delivered', 'acknowledged')\n ) as interrupted\n from ${schema.sessionTurnAttempts} attempt\n join ${schema.sessionTurns} turn\n on turn.workspace_id = attempt.workspace_id and turn.id = attempt.turn_id\n join ${schema.sessions} session\n on session.workspace_id = attempt.workspace_id and session.id = attempt.session_id\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.id = ${input.actor.attemptId}\n `);\n const caller = rows[0];\n if (\n !caller ||\n ![\"claimed\", \"running\"].includes(caller.attemptState) ||\n caller.attemptSessionId !== input.actor.sessionId ||\n caller.attemptTurnId !== input.actor.turnId ||\n Number(caller.executionGeneration) !== input.actor.executionGeneration ||\n caller.activeAttemptId !== input.actor.attemptId ||\n caller.activeTurnId !== input.actor.turnId ||\n ![\"running\", \"requires_action\", \"recovering\", \"waiting_capacity\"].includes(caller.turnStatus)\n ) {\n throw new AgentCommandAuthorityError(\n \"CALLER_STALE\",\n \"The calling agent attempt no longer owns its turn\",\n );\n }\n if (caller.interrupted) {\n throw new AgentCommandAuthorityError(\n \"CALLER_INTERRUPTED\",\n \"The calling agent attempt is being interrupted\",\n );\n }\n const linked = await getExternalLinkTurnAuthorization(\n db,\n {\n accountId: callerSession.accountId,\n workspaceId: input.workspaceId,\n },\n input.actor.turnId,\n );\n if (linked && !linked.authorized)\n throw new AgentCommandAuthorityError(\n \"CALLER_STALE\",\n \"The calling agent's native identity link is no longer active\",\n );\n if (input.action === \"steer\" && input.targetSessionId === input.actor.sessionId) {\n throw new AgentCommandAuthorityError(\"SELF_STEER\", \"An agent cannot steer its own session\");\n }\n // Peer, parent, child, and unrelated-root targets are allowed here. Slack-private\n // and user_private denies remain in requireSessionAuthorization.\n}\n\nfunction asSafeRevision(value: number | string | null, label: string): number | null {\n if (value === null) return null;\n const revision = Number(value);\n if (!Number.isSafeInteger(revision) || revision < 0) {\n throw new SessionControlInvariantError(`${label} is not a safe non-negative revision`);\n }\n return revision;\n}\n\nfunction asDate(value: Date | string | null): Date | null {\n if (value === null) return null;\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalize(item)]),\n );\n }\n return value;\n}\n\nexport function canonicalSessionCommandHash(value: unknown): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(canonicalize(value)))\n .digest(\"hex\");\n}\n\nfunction controlEtag(value: unknown): string {\n return `sc1:${canonicalSessionCommandHash(value)}`;\n}\n\nfunction lockClause(mode: WorkspaceControlLockMode) {\n if (mode === \"none\") return sql.empty();\n return mode === \"update\" ? sql.raw(\"for update\") : sql.raw(\"for share\");\n}\n\n/**\n * Default bounded control-prefix wait for request-scoped API mutations (Send,\n * Steer, queued Steer, Pause/Resume/Cancel, workspace Pause/Resume, realtime\n * sync). The bound is one budget across every lock step of the admission\n * (advisory lock, row lock, and the savepoint escalation of a paused branch),\n * not a per-statement timeout. A request that cannot enter the workspace\n * control prefix within the budget fails with the typed, retryable\n * `WorkspaceControlBusyError` before any write instead of holding a pooled\n * connection and a snapshot for as long as the HTTP client (or ingress) keeps\n * the socket open. Worker settlement, claims, and event appends never pass a\n * bound: a legitimate wait there must not become a failed settlement.\n * The deployment value is `OPENGENI_WORKSPACE_CONTROL_LOCK_TIMEOUT_MS`, parsed\n * and validated once at boot by `@opengeni/config`\n * (`settings.workspaceControlLockTimeoutMs`) and handed to this module through\n * `configureWorkspaceControlRequestLockTimeoutMs` when the API app is built.\n * This module never reads `process.env` per request.\n */\nexport const WORKSPACE_CONTROL_REQUEST_LOCK_TIMEOUT_MS = 20_000;\n\nlet configuredRequestLockTimeoutMs = WORKSPACE_CONTROL_REQUEST_LOCK_TIMEOUT_MS;\n\n/**\n * Install the validated request-scoped budget for this process. The value is\n * process-global and last-writer-wins: the API calls this exactly once from\n * its settings at app composition (`createApp`), and every later\n * `workspaceControlRequestLockTimeoutMs()` read observes that value. Workers\n * never call it because they never pass a bound. A non-positive or\n * non-integer value is a programming error here (the config layer already\n * rejected it at boot).\n */\nexport function configureWorkspaceControlRequestLockTimeoutMs(lockTimeoutMs: number): void {\n if (!Number.isSafeInteger(lockTimeoutMs) || lockTimeoutMs <= 0) {\n throw new Error(\"Workspace control request lock timeout must be a positive integer (ms)\");\n }\n configuredRequestLockTimeoutMs = lockTimeoutMs;\n}\n\n/** The request-scoped budget in milliseconds currently configured for this process. */\nexport function workspaceControlRequestLockTimeoutMs(): number {\n return configuredRequestLockTimeoutMs;\n}\n\nexport class WorkspaceControlBusyError extends Error {\n readonly code = \"WORKSPACE_CONTROL_BUSY\";\n\n constructor(\n readonly workspaceId: string,\n readonly lockTimeoutMs: number,\n ) {\n super(\"The workspace control row is busy; retry shortly\");\n this.name = \"WorkspaceControlBusyError\";\n }\n}\n\n/**\n * One wall-clock budget shared by every lock step of one control-prefix\n * acquisition. Each step sets `lock_timeout` to the remaining budget, so the\n * total wait never exceeds the requested bound even when the advisory lock,\n * the row lock, and a savepoint escalation each wait in turn.\n */\nexport type WorkspaceControlLockBudget = {\n readonly totalMs: number;\n readonly deadlineAt: number;\n};\n\nexport function workspaceControlLockBudget(lockTimeoutMs: number): WorkspaceControlLockBudget {\n if (!Number.isFinite(lockTimeoutMs) || lockTimeoutMs <= 0) {\n throw new Error(\"Workspace control lockTimeoutMs must be a positive number\");\n }\n const totalMs = Math.max(1, Math.floor(lockTimeoutMs));\n return { totalMs, deadlineAt: Date.now() + totalMs };\n}\n\nexport type WorkspaceControlLockOptions = {\n /**\n * Bound the whole prefix acquisition in milliseconds. Omit for\n * worker/lifecycle writers. The previous `lock_timeout` is restored once the\n * prefix is held.\n */\n lockTimeoutMs?: number;\n /** Share an already running budget (used by the admission helper). */\n budget?: WorkspaceControlLockBudget;\n};\n\nfunction advisoryLockFunction(mode: Exclude<WorkspaceControlLockMode, \"none\">) {\n return mode === \"update\"\n ? sql.raw(\"pg_advisory_xact_lock\")\n : sql.raw(\"pg_advisory_xact_lock_shared\");\n}\n\nfunction lockBudgetFor(options: WorkspaceControlLockOptions): WorkspaceControlLockBudget | null {\n if (options.budget) return options.budget;\n if (options.lockTimeoutMs === undefined) return null;\n return workspaceControlLockBudget(options.lockTimeoutMs);\n}\n\n/** Run one lock-acquiring statement under the remaining budget. */\nasync function boundedLockStep<T>(\n db: Database,\n workspaceId: string,\n budget: WorkspaceControlLockBudget | null,\n step: () => Promise<T>,\n): Promise<T> {\n if (!budget) return await step();\n const remainingMs = budget.deadlineAt - Date.now();\n if (remainingMs <= 0) throw new WorkspaceControlBusyError(workspaceId, budget.totalMs);\n await db.execute(\n sql`select set_config('lock_timeout', ${`${Math.max(1, Math.floor(remainingMs))}ms`}, true)`,\n );\n try {\n return await step();\n } catch (error) {\n if (nestedPostgresSqlState(error) === \"55P03\") {\n // Deliberately no `cause`: the 55P03 must not stay reachable through the\n // cause chain, or persistence-retry classification and the delete-tree\n // `live_sandboxes` 55P03 mapping would reclassify this typed busy error.\n throw new WorkspaceControlBusyError(workspaceId, budget.totalMs);\n }\n throw error;\n }\n}\n\n/**\n * Lock the mandatory workspace inference-control row.\n *\n * `share` and `update` first take a transaction-scoped advisory lock on\n * `hashtextextended('workspace-control:<workspace id>', 0)` in the matching\n * mode and only then the row lock. The advisory lock is what makes the prefix\n * fair: PostgreSQL row locks let a new FOR SHARE requester join a share-locked\n * tuple without queueing behind an already waiting FOR UPDATE, so under\n * continuous share traffic (claims, settlement, appends across many sessions)\n * a genuine control mutation can starve indefinitely. Heavyweight locks have a\n * FIFO wait queue: a shared request conflicts with a waiting exclusive request\n * and queues behind it, so a mutator waits only for the holders that preceded\n * it, and sharers keep flowing between mutations. The row lock is retained\n * unchanged for FK/consistency semantics and for SQL-function writers that\n * lock the row directly (session-create triggers and capability functions).\n *\n * Invariant: a transaction that locks this row through any other path (a\n * SECURITY DEFINER function, a trigger, raw SQL) must already hold the prefix\n * through this helper or must never call this helper afterwards for the same\n * workspace. Requesting the advisory lock after holding the row lock can\n * deadlock against a mutator that holds the advisory lock and waits for the\n * row. Every current SQL-function locker either runs in its own transaction or\n * runs after this helper in the same transaction.\n */\nexport async function lockWorkspaceInferenceControl(\n db: Database,\n workspaceId: string,\n mode: WorkspaceControlLockMode,\n options: WorkspaceControlLockOptions = {},\n): Promise<WorkspaceControlRow> {\n const budget = lockBudgetFor(options);\n const [prior] = budget\n ? await db.execute<{ value: string }>(sql`select current_setting('lock_timeout') as value`)\n : [];\n if (mode !== \"none\") {\n await boundedLockStep(db, workspaceId, budget, () =>\n db.execute(\n sql`select ${advisoryLockFunction(mode)}(hashtextextended(${`workspace-control:${workspaceId}`}, 0))`,\n ),\n );\n }\n const rows = await boundedLockStep(db, workspaceId, budget, () =>\n db.execute<WorkspaceControlRow>(sql`\n select\n workspace_id as \"workspaceId\",\n account_id as \"accountId\",\n revision,\n workspace_state as \"workspaceState\",\n workspace_pause_revision as \"workspacePauseRevision\",\n timer_id as \"timerId\", timer_action as \"timerAction\",\n timer_due_at as \"timerDueAt\", timer_pause_for_seconds as \"timerPauseForSeconds\",\n timer_pause_revision as \"timerPauseRevision\",\n reason,\n changed_by as \"changedBy\",\n changed_at as \"changedAt\"\n from ${schema.workspaceInferenceControls}\n where workspace_id = ${workspaceId}\n ${lockClause(mode)}\n `),\n );\n if (budget) {\n await db.execute(sql`select set_config('lock_timeout', ${prior?.value ?? \"0\"}, true)`);\n }\n const row = rows[0];\n if (!row) {\n throw new SessionControlInvariantError(\n `Workspace ${workspaceId} has no mandatory inference-control row`,\n );\n }\n return row;\n}\n\nexport type WorkspaceControlAdmissionLock = {\n control: WorkspaceControlRow;\n mode: \"share\" | \"update\";\n};\n\nconst WORKSPACE_CONTROL_ADMISSION_SAVEPOINT = \"opengeni_workspace_control_admission\";\n\n/**\n * Lock the workspace control prefix for an admission. Callers that may resume\n * a paused branch request escalation; inert queue admission stays shared.\n *\n * The common case (the target branch is active) holds only `FOR SHARE`. That\n * still excludes every control mutation (Pause/Resume/Cancel, workspace\n * control, auto-resume all take `FOR UPDATE`), so the effective state observed\n * here cannot change for the rest of the transaction, while other Sends,\n * Steers, claims, and event appends on the workspace proceed concurrently.\n *\n * When the branch is paused the admission must advance the workspace control\n * revision, so it needs `FOR UPDATE`. Upgrading in place would deadlock as soon\n * as two sharers decide to upgrade together (each waits for the other's share\n * lock), so the shared prefix is taken inside a savepoint and rolled back\n * before the exclusive prefix is requested: PostgreSQL releases row locks and\n * transaction-level advisory locks acquired inside a rolled-back savepoint, so\n * the exclusive request queues normally behind other holders.\n *\n * Callers that already hold the prefix exclusively (for example a realtime\n * sync that admitted a delegation) simply observe their own stronger lock.\n */\nexport async function lockWorkspaceInferenceControlForAdmission(\n db: Database,\n input: {\n workspaceId: string;\n sessionId: string;\n resumePausedBranch: boolean;\n } & WorkspaceControlLockOptions,\n): Promise<WorkspaceControlAdmissionLock> {\n // One budget spans the shared attempt and any escalation to the exclusive\n // prefix, so the caller's bound is the total wait, not a per-step timeout.\n const lockOptions: WorkspaceControlLockOptions =\n input.lockTimeoutMs === undefined\n ? {}\n : { budget: workspaceControlLockBudget(input.lockTimeoutMs) };\n await db.execute(sql.raw(`savepoint ${WORKSPACE_CONTROL_ADMISSION_SAVEPOINT}`));\n const shared = await lockWorkspaceInferenceControl(db, input.workspaceId, \"share\", lockOptions);\n if (!input.resumePausedBranch) {\n await db.execute(sql.raw(`release savepoint ${WORKSPACE_CONTROL_ADMISSION_SAVEPOINT}`));\n return { control: shared, mode: \"share\" };\n }\n const effective = await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n workspaceControl: shared,\n });\n if (effective.state === \"active\") {\n await db.execute(sql.raw(`release savepoint ${WORKSPACE_CONTROL_ADMISSION_SAVEPOINT}`));\n return { control: shared, mode: \"share\" };\n }\n await db.execute(sql.raw(`rollback to savepoint ${WORKSPACE_CONTROL_ADMISSION_SAVEPOINT}`));\n await db.execute(sql.raw(`release savepoint ${WORKSPACE_CONTROL_ADMISSION_SAVEPOINT}`));\n return {\n control: await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\", lockOptions),\n mode: \"update\",\n };\n}\n\nexport type SessionEventWriteLockInput = {\n workspaceId: string;\n /**\n * Control-aware writes take this lock first. Callers that already hold the\n * workspace control row (for example a Pause mutation under FOR UPDATE) say\n * `already_locked`; ordinary audit/title appends explicitly use `none`.\n */\n controlLock: WorkspaceControlLockMode | \"already_locked\" | \"none\";\n /** Used only when a staged caller already established the workspace prefix. */\n workspaceLock?: \"key_share\" | \"already_locked\";\n /**\n * Semantic writers retain FOR NO KEY UPDATE. Cursor-authoritative raw-only\n * appends need only the FK-compatible identity hold; KEY SHARE is compatible\n * with semantic NO KEY UPDATE and therefore removes the wide session row as\n * their serialization mutex without inverting the rolling lock order.\n */\n sessionLock?: \"no_key_update\" | \"key_share\";\n sessionIds?: string[];\n turnIds?: string[];\n attemptIds?: string[];\n};\n\nexport type SessionEventWriteLocks = {\n control: WorkspaceControlRow | null;\n workspace: typeof schema.workspaces.$inferSelect | null;\n sessions: Array<typeof schema.sessions.$inferSelect>;\n cursors: Array<typeof schema.sessionEventCursors.$inferSelect>;\n turns: Array<typeof schema.sessionTurns.$inferSelect>;\n attempts: Array<typeof schema.sessionTurnAttempts.$inferSelect>;\n};\n\n/**\n * Establish the one canonical lock prefix for every `session_events` writer:\n *\n * workspace-control advisory lock + workspace_inference_controls row\n * (when control-aware; see `lockWorkspaceInferenceControl`)\n * -> actual workspaces row FOR KEY SHARE\n * -> session rows FOR NO KEY UPDATE (semantic) or KEY SHARE (raw), UUID ordered\n * -> session event cursor rows FOR UPDATE, UUID ordered\n * -> exact turn rows FOR UPDATE, UUID ordered\n * -> exact attempt rows FOR UPDATE, UUID ordered\n *\n * Control-aware writers that do not mutate the control row take it `share`;\n * only genuine control mutations (Pause/Resume/Cancel, workspace control,\n * auto-resume, settings narrowing, quiescent tree deletion) take `update`.\n * Prompt admission declares whether it may resume a paused branch through\n * `lockWorkspaceInferenceControlForAdmission`.\n *\n * `FOR KEY SHARE` is deliberate. Event inserts need the workspace key to remain\n * stable for their FK, but they do not mutate the workspace. The old generic\n * `FOR UPDATE` lock serialized unrelated sessions and inverted the activity\n * path's session -> implicit workspace-FK edge.\n *\n * `FOR NO KEY UPDATE` is equally deliberate for semantic session writers.\n * Cursor-authoritative raw-only writers use `FOR KEY SHARE`: it preserves the\n * session identity against deletion while remaining compatible with semantic\n * `FOR NO KEY UPDATE`. Keeping this rolling session-before-cursor order avoids\n * an inversion with old binaries and quiescent cascade deletion; the compact\n * cursor row, not the wide session row, is the raw ordering mutex.\n *\n * Complex lifecycle transactions may acquire allocator/control locks before\n * this helper and may discover exact turn IDs only after locking the session.\n * They use the explicit `already_locked` stages, while retaining the same\n * monotonic table order. New event writers should prefer one complete call.\n *\n * Retained-screenshot prepare is not an event writer, but its INSERT still\n * KEY SHAREs the turn and attempt through FKs. It must take this same prefix\n * first: PostgreSQL fires those FK checks in catalog name/OID order, which can\n * be attempt-then-turn and otherwise deadlocks against this helper.\n */\nexport async function lockSessionEventWriteRows(\n db: Database,\n input: SessionEventWriteLockInput,\n): Promise<SessionEventWriteLocks> {\n const controlLock = input.controlLock;\n const control =\n controlLock === \"share\" || controlLock === \"update\"\n ? await lockWorkspaceInferenceControl(db, input.workspaceId, controlLock)\n : null;\n\n let workspace: typeof schema.workspaces.$inferSelect | null = null;\n if ((input.workspaceLock ?? \"key_share\") === \"key_share\") {\n const [lockedWorkspace] = await db\n .select()\n .from(schema.workspaces)\n .where(eq(schema.workspaces.id, input.workspaceId))\n .for(\"key share\")\n .limit(1);\n workspace = lockedWorkspace ?? null;\n }\n\n const sessionIds = [...new Set(input.sessionIds ?? [])].sort();\n const sessionLock = input.sessionLock ?? \"no_key_update\";\n let sessions =\n sessionIds.length > 0\n ? await db\n .select()\n .from(schema.sessions)\n .where(\n and(\n eq(schema.sessions.workspaceId, input.workspaceId),\n inArray(schema.sessions.id, sessionIds),\n ),\n )\n .orderBy(schema.sessions.id)\n .for(sessionLock === \"key_share\" ? \"key share\" : \"no key update\")\n : [];\n\n const cursors =\n sessions.length > 0\n ? await db\n .select()\n .from(schema.sessionEventCursors)\n .where(\n and(\n eq(schema.sessionEventCursors.workspaceId, input.workspaceId),\n inArray(\n schema.sessionEventCursors.sessionId,\n sessions.map((session) => session.id),\n ),\n ),\n )\n .orderBy(schema.sessionEventCursors.sessionId)\n .for(\"update\")\n : [];\n if (cursors.length !== sessions.length) {\n throw new SessionControlInvariantError(\n `Session event cursor lock set was incomplete for workspace ${input.workspaceId}`,\n );\n }\n if (sessionLock === \"key_share\" && sessions.length > 0) {\n // KEY SHARE is intentionally compatible with a semantic writer's NO KEY\n // UPDATE. If that writer reached the cursor first it may have committed a\n // control/authority/session-state change after our initial identity read.\n // Re-read only after owning the cursor so the attempt fence evaluates the\n // latest committed session state while later semantic writers wait here.\n sessions = await db\n .select()\n .from(schema.sessions)\n .where(\n and(\n eq(schema.sessions.workspaceId, input.workspaceId),\n inArray(schema.sessions.id, sessionIds),\n ),\n )\n .orderBy(schema.sessions.id)\n .for(\"key share\");\n }\n const canonicalSessions = sessions.map((session, index) => {\n const cursor = cursors[index]!;\n if (\n cursor.sessionId !== session.id ||\n cursor.accountId !== session.accountId ||\n cursor.workspaceId !== session.workspaceId\n ) {\n throw new SessionControlInvariantError(\n `Session event cursor identity failed for session ${session.id}`,\n );\n }\n // The cursor is the allocation authority. The wide session column remains\n // a rolling compatibility/read projection until every reader is cut over.\n // It may lag after the later pure-append activation, but it must never lead\n // the durable cursor or an old writer could have committed an unverified\n // sequence.\n if (cursor.lastSequence < session.lastSequence) {\n throw new SessionControlInvariantError(\n `Session event cursor is behind session projection for session ${session.id}`,\n );\n }\n return { ...session, lastSequence: cursor.lastSequence };\n });\n\n const turnIds = [...new Set(input.turnIds ?? [])].sort();\n const turns =\n turnIds.length > 0\n ? await db\n .select()\n .from(schema.sessionTurns)\n .where(\n and(\n eq(schema.sessionTurns.workspaceId, input.workspaceId),\n inArray(schema.sessionTurns.id, turnIds),\n ),\n )\n .orderBy(schema.sessionTurns.id)\n .for(\"update\")\n : [];\n\n const attemptIds = [...new Set(input.attemptIds ?? [])].sort();\n const attempts =\n attemptIds.length > 0\n ? await db\n .select()\n .from(schema.sessionTurnAttempts)\n .where(\n and(\n eq(schema.sessionTurnAttempts.workspaceId, input.workspaceId),\n inArray(schema.sessionTurnAttempts.id, attemptIds),\n ),\n )\n .orderBy(schema.sessionTurnAttempts.id)\n .for(\"update\")\n : [];\n\n return { control, workspace, sessions: canonicalSessions, cursors, turns, attempts };\n}\n\nexport async function registerSessionTurnAttemptClaim(\n db: Database,\n input: {\n id: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n executionGeneration: number;\n temporalWorkflowId: string;\n temporalWorkflowRunId: string;\n temporalActivityId: string;\n verifiedControlRevision: number;\n authorityEpoch: number;\n authorityVisibility: \"user_private\" | \"workspace_shared\";\n authorityOwnerOrganizationMembershipId: string | null;\n personalResourceProtocolVersion: number;\n mcpApprovalPolicies: Record<string, SessionMcpApprovalPolicy>;\n connectorActionPolicies: schema.ConnectorActionPolicySnapshotEntry[];\n },\n): Promise<typeof schema.sessionTurnAttempts.$inferSelect> {\n const authoritySnapshot = assertSessionAuthoritySnapshot({\n attemptId: input.id,\n authorityEpoch: input.authorityEpoch,\n authorityVisibility: input.authorityVisibility,\n authorityOwnerOrganizationMembershipId: input.authorityOwnerOrganizationMembershipId,\n });\n const [inserted] = await db\n .insert(schema.sessionTurnAttempts)\n .values({\n ...input,\n ...authoritySnapshot,\n state: \"claimed\",\n })\n // Only an idempotent replay of this exact preallocated attempt ID may\n // enter the comparison path below. A collision on live-session, live-turn,\n // or Temporal dispatch ownership is a distinct invariant violation and\n // must not be disguised as an attempt-ID conflict.\n .onConflictDoNothing({ target: schema.sessionTurnAttempts.id })\n .returning();\n if (inserted) return inserted;\n const [existing] = await db\n .select()\n .from(schema.sessionTurnAttempts)\n .where(\n and(\n eq(schema.sessionTurnAttempts.workspaceId, input.workspaceId),\n eq(schema.sessionTurnAttempts.id, input.id),\n ),\n )\n .for(\"update\")\n .limit(1);\n const existingAuthoritySnapshot = existing\n ? assertSessionAuthoritySnapshot({\n attemptId: existing.id,\n authorityEpoch: existing.authorityEpoch,\n authorityVisibility: existing.authorityVisibility,\n authorityOwnerOrganizationMembershipId: existing.authorityOwnerOrganizationMembershipId,\n })\n : null;\n if (\n !existing ||\n existing.accountId !== input.accountId ||\n existing.sessionId !== input.sessionId ||\n existing.turnId !== input.turnId ||\n existing.executionGeneration !== input.executionGeneration ||\n !existingAuthoritySnapshot ||\n !sessionAuthoritySnapshotsEqual(existingAuthoritySnapshot, authoritySnapshot) ||\n existing.temporalWorkflowId !== input.temporalWorkflowId ||\n existing.temporalWorkflowRunId !== input.temporalWorkflowRunId ||\n existing.temporalActivityId !== input.temporalActivityId ||\n existing.personalResourceProtocolVersion !== input.personalResourceProtocolVersion ||\n JSON.stringify(existing.connectorActionPolicies) !==\n JSON.stringify(input.connectorActionPolicies) ||\n existing.state === \"closed\"\n ) {\n throw new SessionControlInvariantError(\n `Attempt ${input.id} conflicts with a different or closed ownership chain`,\n );\n }\n return existing;\n}\n\nexport type SessionAuthoritySnapshot = {\n authorityEpoch: number;\n authorityVisibility: \"user_private\" | \"workspace_shared\";\n authorityOwnerOrganizationMembershipId: string | null;\n};\n\n/**\n * Validate the complete accepted-attempt authority tuple. Missing or partial\n * values are not legacy defaults: current claim writers must provide the\n * exact locked session authority explicitly.\n */\nexport function assertSessionAuthoritySnapshot(input: {\n attemptId?: string;\n authorityEpoch: unknown;\n authorityVisibility: unknown;\n authorityOwnerOrganizationMembershipId: unknown;\n}): SessionAuthoritySnapshot {\n const valid =\n Number.isSafeInteger(input.authorityEpoch) &&\n (input.authorityEpoch as number) > 0 &&\n (input.authorityVisibility === \"user_private\" ||\n input.authorityVisibility === \"workspace_shared\") &&\n ((input.authorityVisibility === \"user_private\" &&\n typeof input.authorityOwnerOrganizationMembershipId === \"string\") ||\n (input.authorityVisibility === \"workspace_shared\" &&\n (input.authorityOwnerOrganizationMembershipId === null ||\n typeof input.authorityOwnerOrganizationMembershipId === \"string\")));\n if (!valid) {\n throw new SessionControlInvariantError(\n `Attempt ${input.attemptId ?? \"unknown\"} has an invalid session authority snapshot`,\n );\n }\n return {\n authorityEpoch: input.authorityEpoch as number,\n authorityVisibility:\n input.authorityVisibility as SessionAuthoritySnapshot[\"authorityVisibility\"],\n authorityOwnerOrganizationMembershipId: input.authorityOwnerOrganizationMembershipId as\n | string\n | null,\n };\n}\n\nexport function sessionAuthoritySnapshotMatchesSession(\n snapshot: SessionAuthoritySnapshot,\n session: Pick<\n typeof schema.sessions.$inferSelect,\n \"authorityEpoch\" | \"visibility\" | \"ownerOrganizationMembershipId\"\n >,\n): boolean {\n return (\n snapshot.authorityEpoch === session.authorityEpoch &&\n snapshot.authorityVisibility === session.visibility &&\n snapshot.authorityOwnerOrganizationMembershipId ===\n (session.ownerOrganizationMembershipId ?? null)\n );\n}\n\nexport function sessionAuthoritySnapshotsEqual(\n left: Pick<\n SessionAuthoritySnapshot,\n \"authorityEpoch\" | \"authorityVisibility\" | \"authorityOwnerOrganizationMembershipId\"\n >,\n right: Pick<\n SessionAuthoritySnapshot,\n \"authorityEpoch\" | \"authorityVisibility\" | \"authorityOwnerOrganizationMembershipId\"\n >,\n): boolean {\n return (\n left.authorityEpoch === right.authorityEpoch &&\n left.authorityVisibility === right.authorityVisibility &&\n left.authorityOwnerOrganizationMembershipId === right.authorityOwnerOrganizationMembershipId\n );\n}\n\n/**\n * Close the exact first-class owner while the caller still holds the owning\n * session/turn locks. Every path that clears `session_turns.active_attempt_id`\n * must call this in the same transaction; otherwise a later claim would either\n * collide with a zombie live owner or have to weaken the ownership fence.\n */\nexport async function closeSessionTurnAttemptInTransaction(\n db: Database,\n input: {\n id: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n executionGeneration: number;\n outcome: SessionTurnAttemptOutcome;\n closedAt?: Date;\n },\n): Promise<{ action: \"closed\" | \"already_closed\" }> {\n const [attempt] = await db\n .select()\n .from(schema.sessionTurnAttempts)\n .where(\n and(\n eq(schema.sessionTurnAttempts.workspaceId, input.workspaceId),\n eq(schema.sessionTurnAttempts.id, input.id),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (\n !attempt ||\n attempt.accountId !== input.accountId ||\n attempt.sessionId !== input.sessionId ||\n attempt.turnId !== input.turnId ||\n attempt.executionGeneration !== input.executionGeneration\n ) {\n throw new SessionControlInvariantError(\n `Attempt ${input.id} does not own the expected session turn generation`,\n );\n }\n if (attempt.state === \"closed\") {\n if (attempt.outcome !== input.outcome) {\n throw new SessionControlInvariantError(\n `Attempt ${input.id} is already closed as ${attempt.outcome ?? \"unknown\"}`,\n );\n }\n return { action: \"already_closed\" };\n }\n if (attempt.state !== \"claimed\" && attempt.state !== \"running\") {\n throw new SessionControlInvariantError(\n `Attempt ${input.id} has invalid live state ${attempt.state}`,\n );\n }\n const now = input.closedAt ?? new Date();\n const [closed] = await db\n .update(schema.sessionTurnAttempts)\n .set({\n state: \"closed\",\n outcome: input.outcome,\n workerId: null,\n leaseId: null,\n leaseExpiresAt: null,\n closedAt: now,\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.sessionTurnAttempts.workspaceId, input.workspaceId),\n eq(schema.sessionTurnAttempts.id, input.id),\n sql`${schema.sessionTurnAttempts.state} in ('claimed', 'running')`,\n ),\n )\n .returning({ id: schema.sessionTurnAttempts.id });\n if (!closed) {\n throw new SessionControlInvariantError(`Attempt ${input.id} changed while locked`);\n }\n return { action: \"closed\" };\n}\n\nfunction targetValues(sessionIds: string[]) {\n if (sessionIds.length === 0) {\n throw new SessionControlInvariantError(\"At least one target session is required\");\n }\n return sql.join(\n sessionIds.map((id) => sql`(${id}::uuid)`),\n sql`, `,\n );\n}\n\nconst TARGET_PATH_PROJECTION_LIMIT = 128;\n\nasync function loadTargetAncestryRows(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<AncestryRow[]> {\n return await db.execute<AncestryRow>(sql`\n with recursive targets(id) as (values ${targetValues(sessionIds)}),\n ancestry as (\n select\n target.id as target_id,\n session.id as session_id,\n session.parent_session_id,\n session.title,\n session.direct_control_state,\n session.direct_pause_revision,\n session.subtree_run_override_revision,\n session.control_version,\n session.direct_control_changed_by,\n session.direct_control_reason,\n session.direct_control_changed_at,\n 0::integer as depth,\n array[session.id]::uuid[] as path,\n false as cycle\n from targets target\n join ${schema.sessions} session\n on session.workspace_id = ${workspaceId} and session.id = target.id\n union all\n select\n child.target_id,\n parent.id,\n parent.parent_session_id,\n parent.title,\n parent.direct_control_state,\n parent.direct_pause_revision,\n parent.subtree_run_override_revision,\n parent.control_version,\n parent.direct_control_changed_by,\n parent.direct_control_reason,\n parent.direct_control_changed_at,\n child.depth + 1,\n child.path || parent.id,\n parent.id = any(child.path)\n from ancestry child\n join ${schema.sessions} parent\n on parent.workspace_id = ${workspaceId} and parent.id = child.parent_session_id\n where child.parent_session_id is not null\n and not child.cycle\n and child.depth < ${SESSION_ANCESTRY_LIMIT}\n )\n select\n target_id as \"targetId\",\n session_id as \"sessionId\",\n parent_session_id as \"parentSessionId\",\n title,\n direct_control_state as \"directState\",\n direct_pause_revision as \"directPauseRevision\",\n subtree_run_override_revision as \"subtreeRunOverrideRevision\",\n control_version as \"controlVersion\",\n direct_control_changed_by as \"directControlChangedBy\",\n direct_control_reason as \"directControlReason\",\n direct_control_changed_at as \"directControlChangedAt\",\n depth,\n cycle\n from ancestry\n order by target_id, depth\n `);\n}\n\nasync function loadAncestryNodes(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<Map<string, AncestryNode>> {\n const rows = await db.execute<AncestryNode>(sql`\n with recursive targets(id) as (values ${targetValues(sessionIds)}),\n ancestry_ids(id) as (\n select session.id\n from targets target\n join ${schema.sessions} session\n on session.workspace_id = ${workspaceId} and session.id = target.id\n union\n select parent.id\n from ancestry_ids child\n join ${schema.sessions} current\n on current.workspace_id = ${workspaceId} and current.id = child.id\n join ${schema.sessions} parent\n on parent.workspace_id = current.workspace_id\n and parent.id = current.parent_session_id\n )\n select\n session.id as \"sessionId\",\n session.parent_session_id as \"parentSessionId\",\n session.title,\n session.direct_control_state as \"directState\",\n session.direct_pause_revision as \"directPauseRevision\",\n session.subtree_run_override_revision as \"subtreeRunOverrideRevision\",\n session.control_version as \"controlVersion\",\n session.direct_control_changed_by as \"directControlChangedBy\",\n session.direct_control_reason as \"directControlReason\",\n session.direct_control_changed_at as \"directControlChangedAt\"\n from ancestry_ids ancestry\n join ${schema.sessions} session\n on session.workspace_id = ${workspaceId} and session.id = ancestry.id\n `);\n return new Map(rows.map((row: AncestryNode) => [row.sessionId, row]));\n}\n\nfunction ancestryRowsForTarget(targetId: string, nodes: Map<string, AncestryNode>): AncestryRow[] {\n const rows: AncestryRow[] = [];\n const path = new Set<string>();\n let sessionId: string | null = targetId;\n for (let depth = 0; sessionId !== null; depth += 1) {\n const node = nodes.get(sessionId);\n if (!node) break;\n const cycle = path.has(sessionId);\n rows.push({ ...node, targetId, depth, cycle });\n if (cycle || depth >= SESSION_ANCESTRY_LIMIT) break;\n path.add(sessionId);\n sessionId = node.parentSessionId;\n }\n return rows;\n}\n\nfunction assertCompleteAncestry(sessionId: string, rows: AncestryRow[]): void {\n if (rows.length === 0) {\n throw new SessionControlInvariantError(`Session ${sessionId} does not exist in its workspace`);\n }\n if (rows.some((row) => row.cycle)) {\n throw new SessionControlInvariantError(`Session ${sessionId} has cyclic ancestry`);\n }\n const last = rows.at(-1)!;\n const depth = Number(last.depth);\n if (last.parentSessionId !== null) {\n throw new SessionControlInvariantError(\n depth >= SESSION_ANCESTRY_LIMIT\n ? `Session ${sessionId} ancestry exceeds ${SESSION_ANCESTRY_LIMIT}`\n : `Session ${sessionId} has a missing ancestor ${last.parentSessionId}`,\n );\n }\n}\n\nfunction blockerForSession(row: AncestryRow, revision: number): EffectiveControlBlocker {\n return {\n kind: \"session\",\n sessionId: row.sessionId,\n displayName: row.title?.trim() || \"Untitled session\",\n actor: row.directControlChangedBy,\n reason: row.directControlReason,\n changedAt: asDate(row.directControlChangedAt),\n revision,\n };\n}\n\nfunction projectEffectiveControl(\n workspace: WorkspaceControlRow,\n targetId: string,\n rows: AncestryRow[],\n settlementAttempts: SettlementAttemptCounts,\n stoppingBackgroundCommandCount: number,\n): EffectiveSessionControl {\n assertCompleteAncestry(targetId, rows);\n const workspaceRevision = asSafeRevision(workspace.revision, \"workspace control revision\")!;\n const path = rows.map((row) => ({\n row,\n depth: Number(row.depth),\n pauseRevision: asSafeRevision(row.directPauseRevision, \"direct pause revision\"),\n overrideRevision: asSafeRevision(\n row.subtreeRunOverrideRevision,\n \"subtree run override revision\",\n ),\n controlVersion: asSafeRevision(row.controlVersion, \"session control version\")!,\n }));\n\n const undefeated: Array<{ blocker: EffectiveControlBlocker; depth: number }> = [];\n for (const candidate of path) {\n if (candidate.row.directState !== \"paused\" || candidate.pauseRevision === null) continue;\n const defeated = path.some(\n (possibleOverride) =>\n possibleOverride.depth < candidate.depth &&\n possibleOverride.overrideRevision !== null &&\n possibleOverride.overrideRevision > candidate.pauseRevision!,\n );\n if (!defeated) {\n undefeated.push({\n blocker: blockerForSession(candidate.row, candidate.pauseRevision),\n depth: candidate.depth,\n });\n }\n }\n\n const workspacePauseRevision = asSafeRevision(\n workspace.workspacePauseRevision,\n \"workspace pause revision\",\n );\n if (workspace.workspaceState === \"paused\") {\n if (workspacePauseRevision === null) {\n throw new SessionControlInvariantError(\"Paused workspace is missing its pause revision\");\n }\n const defeated = path.some(\n (candidate) =>\n candidate.overrideRevision !== null && candidate.overrideRevision > workspacePauseRevision,\n );\n if (!defeated) {\n undefeated.push({\n blocker: {\n kind: \"workspace\",\n displayName: \"Workspace\",\n actor: workspace.changedBy,\n reason: workspace.reason,\n changedAt: asDate(workspace.changedAt),\n revision: workspacePauseRevision,\n },\n depth: Number.POSITIVE_INFINITY,\n });\n }\n }\n\n undefeated.sort((left, right) => left.depth - right.depth);\n const blockers = undefeated.map(({ blocker }) => blocker);\n const primaryBlocker = blockers[0] ?? null;\n const target = path[0]!;\n const override = path\n .filter((candidate) => candidate.overrideRevision !== null)\n .sort((left, right) => right.overrideRevision! - left.overrideRevision!)[0];\n\n const options: EffectiveControlResumeOption[] = [];\n if (blockers.length > 0) {\n options.push({\n scope: \"selected\",\n targetId,\n selectedStateAfter: \"active\",\n impactCopy: \"Resume this session and its descendants without changing sibling workstreams.\",\n });\n for (const entry of undefeated) {\n if (entry.blocker.kind !== \"session\" || entry.blocker.sessionId === targetId) continue;\n const remaining = undefeated.find(\n (candidate) =>\n candidate.depth < entry.depth && candidate.blocker.sessionId !== entry.blocker.sessionId,\n )?.blocker;\n options.push({\n scope: \"session\",\n targetId: entry.blocker.sessionId!,\n selectedStateAfter: remaining ? \"paused\" : \"active\",\n ...(remaining ? { remainingPrimaryBlocker: remaining } : {}),\n impactCopy: `Resume the workstream rooted at ${entry.blocker.displayName}.`,\n });\n }\n if (workspace.workspaceState === \"paused\") {\n const remaining = undefeated.find((entry) => entry.blocker.kind === \"session\")?.blocker;\n options.push({\n scope: \"workspace\",\n selectedStateAfter: remaining ? \"paused\" : \"active\",\n ...(remaining ? { remainingPrimaryBlocker: remaining } : {}),\n impactCopy: \"Resume the entire workspace; narrower session pauses remain in force.\",\n });\n }\n }\n\n const etagFacts = {\n workspace: {\n state: workspace.workspaceState,\n pauseRevision: workspacePauseRevision,\n },\n path: path.map((candidate) => ({\n sessionId: candidate.row.sessionId,\n directState: candidate.row.directState,\n pauseRevision: candidate.pauseRevision,\n overrideRevision: candidate.overrideRevision,\n })),\n };\n\n return {\n state: blockers.length > 0 ? \"paused\" : \"active\",\n controlVersion: Math.max(\n workspaceRevision,\n ...path.map((candidate) => candidate.controlVersion),\n ),\n controlEtag: controlEtag(etagFacts),\n directState: target.row.directState === \"paused\" ? \"paused\" : \"active\",\n primaryBlocker,\n additionalBlockerCount: Math.max(0, blockers.length - 1),\n blockers,\n resumeOptions: options,\n override:\n override?.overrideRevision === null || !override\n ? null\n : {\n rootSessionId: override.row.sessionId,\n revision: override.overrideRevision,\n },\n settlement:\n settlementAttempts.attemptCount > 0 ? { state: \"stopping\", ...settlementAttempts } : null,\n backgroundCommandSettlement:\n stoppingBackgroundCommandCount > 0\n ? { state: \"stopping\", commandCount: stoppingBackgroundCommandCount }\n : null,\n };\n}\n\nasync function stoppingBackgroundCommandCounts(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<Map<string, number>> {\n const rows = await db.execute<{ sessionId: string; commandCount: number | string }>(sql`\n with recursive targets(id) as (values ${targetValues(sessionIds)}),\n descendants(target_id, session_id, depth, path) as (\n select target.id, target.id, 0::integer, array[target.id]::uuid[] from targets target\n union all\n select parent.target_id, child.id, parent.depth + 1, parent.path || child.id\n from descendants parent\n join ${schema.sessions} child\n on child.workspace_id = ${workspaceId} and child.parent_session_id = parent.session_id\n where not child.id = any(parent.path) and parent.depth < ${SESSION_ANCESTRY_LIMIT}\n )\n select descendant.target_id as \"sessionId\", count(distinct command.id)::integer as \"commandCount\"\n from descendants descendant\n join ${schema.sessionBackgroundCommands} command\n on command.workspace_id = ${workspaceId} and command.session_id = descendant.session_id\n and command.state = 'stopping'\n group by descendant.target_id\n `);\n return new Map(\n rows.map((row: { sessionId: string; commandCount: number | string }) => [\n row.sessionId,\n Number(row.commandCount),\n ]),\n );\n}\n\nasync function settlementAttemptCounts(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<Map<string, SettlementAttemptCounts>> {\n // Drive the projection from the requested targets through the indexed\n // parent_session_id edge. The inverse plan scanned every interruption in a\n // workspace before walking upward, making one session read proportional to\n // a high-volume orchestrator workspace's entire interruption history.\n const rows = await db.execute<{\n sessionId: string;\n attemptCount: number | string;\n interruptionPendingCount: number | string;\n quiescencePendingCount: number | string;\n }>(sql`\n with recursive targets(id) as (values ${targetValues(sessionIds)}),\n descendant_sessions(target_id, session_id, depth, path) as (\n select target.id, target.id, 0::integer, array[target.id]::uuid[]\n from targets target\n union all\n select\n descendant.target_id,\n child.id,\n descendant.depth + 1,\n descendant.path || child.id\n from descendant_sessions descendant\n join ${schema.sessions} child\n on child.workspace_id = ${workspaceId}\n and child.parent_session_id = descendant.session_id\n where not child.id = any(descendant.path)\n and descendant.depth < ${SESSION_ANCESTRY_LIMIT}\n ), interruptions as (\n select\n descendant.target_id,\n interruption.attempt_id,\n bool_or(interruption.state in ('pending', 'delivered', 'acknowledged'))\n as interruption_pending,\n bool_or(\n interruption.state in ('settled', 'rejected_stale')\n and attempt.quiesced_at is null\n ) as quiescence_pending\n from descendant_sessions descendant\n join ${schema.sessionAttemptInterruptions} interruption\n on interruption.workspace_id = ${workspaceId}\n and interruption.session_id = descendant.session_id\n join ${schema.sessionTurnAttempts} attempt\n on attempt.workspace_id = interruption.workspace_id\n and attempt.id = interruption.attempt_id\n where (\n interruption.state in ('pending', 'delivered', 'acknowledged')\n or (\n interruption.state in ('settled', 'rejected_stale')\n and attempt.quiesced_at is null\n )\n )\n group by descendant.target_id, interruption.attempt_id\n )\n select\n target.id as \"sessionId\",\n count(interruption.attempt_id)::integer as \"attemptCount\",\n count(interruption.attempt_id)\n filter (where interruption.interruption_pending)::integer as \"interruptionPendingCount\",\n count(interruption.attempt_id)\n filter (where interruption.quiescence_pending)::integer as \"quiescencePendingCount\"\n from targets target\n join interruptions interruption on interruption.target_id = target.id\n group by target.id\n `);\n return new Map(\n rows.map(\n (row: {\n sessionId: string;\n attemptCount: number | string;\n interruptionPendingCount: number | string;\n quiescencePendingCount: number | string;\n }) => [\n row.sessionId,\n {\n attemptCount: Number(row.attemptCount),\n interruptionPendingCount: Number(row.interruptionPendingCount),\n quiescencePendingCount: Number(row.quiescencePendingCount),\n },\n ],\n ),\n );\n}\n\nexport async function evaluateSessionControls(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n options: {\n lock?: WorkspaceControlLockMode;\n /** Reuse a control row already locked before workspace/session/turn rows. */\n workspaceControl?: WorkspaceControlRow | undefined;\n } = {},\n): Promise<Map<string, EffectiveSessionControl>> {\n const uniqueIds = [...new Set(sessionIds)];\n if (uniqueIds.length === 0) {\n return new Map();\n }\n if (options.workspaceControl && options.workspaceControl.workspaceId !== workspaceId) {\n throw new SessionControlInvariantError(\n `Locked workspace control ${options.workspaceControl.workspaceId} does not match ${workspaceId}`,\n );\n }\n const workspace =\n options.workspaceControl ??\n (await lockWorkspaceInferenceControl(db, workspaceId, options.lock ?? \"share\"));\n const stopping = await settlementAttemptCounts(db, workspaceId, uniqueIds);\n const stoppingCommands = await stoppingBackgroundCommandCounts(db, workspaceId, uniqueIds);\n const result = new Map<string, EffectiveSessionControl>();\n if (uniqueIds.length <= TARGET_PATH_PROJECTION_LIMIT) {\n // PostgreSQL's direct target-path plan is substantially faster for the\n // ordinary one-session and paged-list cases. Keep its bounded row shape.\n const ancestry = await loadTargetAncestryRows(db, workspaceId, uniqueIds);\n const ancestryByTarget = new Map<string, AncestryRow[]>();\n for (const row of ancestry) {\n const rows = ancestryByTarget.get(row.targetId);\n if (rows) rows.push(row);\n else ancestryByTarget.set(row.targetId, [row]);\n }\n for (const sessionId of uniqueIds) {\n result.set(\n sessionId,\n projectEffectiveControl(\n workspace,\n sessionId,\n ancestryByTarget.get(sessionId) ?? [],\n stopping.get(sessionId) ?? NO_SETTLEMENT_ATTEMPTS,\n stoppingCommands.get(sessionId) ?? 0,\n ),\n );\n }\n return result;\n }\n\n // Large sets fetch each shared ancestor exactly once. Returning one row per\n // target/ancestor pair makes a 10k-session tree explode into millions of\n // protocol objects even though the tree itself contains only 10k nodes.\n const ancestry = await loadAncestryNodes(db, workspaceId, uniqueIds);\n for (const sessionId of uniqueIds) {\n result.set(\n sessionId,\n projectEffectiveControl(\n workspace,\n sessionId,\n ancestryRowsForTarget(sessionId, ancestry),\n stopping.get(sessionId) ?? NO_SETTLEMENT_ATTEMPTS,\n stoppingCommands.get(sessionId) ?? 0,\n ),\n );\n }\n return result;\n}\n\n/**\n * Evaluate only the control facts needed to admit an already locked session\n * write. The workspace-control row must be reused when the caller established\n * the canonical prefix before session/turn/attempt locks.\n *\n * Deliberately omit settlementAttemptCounts and\n * stoppingBackgroundCommandCounts: those recursive summaries do not affect\n * effective pause state and their results are discarded by the write fence.\n */\nexport async function evaluateSessionWriteAdmissionControl(\n db: Database,\n workspaceId: string,\n sessionId: string,\n options: {\n lock?: WorkspaceControlLockMode;\n workspaceControl?: WorkspaceControlRow | undefined;\n } = {},\n): Promise<SessionWriteAdmissionControl> {\n if (options.workspaceControl && options.workspaceControl.workspaceId !== workspaceId) {\n throw new SessionControlInvariantError(\n `Locked workspace control ${options.workspaceControl.workspaceId} does not match ${workspaceId}`,\n );\n }\n const workspace =\n options.workspaceControl ??\n (await lockWorkspaceInferenceControl(db, workspaceId, options.lock ?? \"share\"));\n const projected = projectEffectiveControl(\n workspace,\n sessionId,\n await loadTargetAncestryRows(db, workspaceId, [sessionId]),\n NO_SETTLEMENT_ATTEMPTS,\n 0,\n );\n return {\n state: projected.state,\n controlVersion: projected.controlVersion,\n primaryBlockerKind: projected.primaryBlocker?.kind ?? null,\n };\n}\n\ntype SessionDiscoveryControlRow = {\n targetId: string;\n ancestryCount: number | string;\n reachedRoot: boolean;\n maxDepth: number | string | null;\n blockerCount: number | string;\n primaryKind: \"session\" | \"workspace\" | null;\n primarySessionId: string | null;\n primaryDisplayName: string | null;\n primaryDisplayNameOriginalChars: number | string | null;\n};\n\n/**\n * Return one compact aggregate row per target for `sessions_list`.\n *\n * Unlike `evaluateSessionControls`, the database boundary never returns a row\n * per blocker/ancestor, nor does application code construct blocker or resume\n * option arrays. The recursive walk carries no growing visited-path array: a\n * missing ancestor stops below the limit, while a cycle cannot reach a root and\n * therefore runs into the hard `SESSION_ANCESTRY_LIMIT`. The externally\n * supplied target set is capped by `SESSION_DISCOVERY_CONTROL_TARGET_LIMIT`.\n */\nexport async function evaluateSessionDiscoveryControls(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<Map<string, SessionDiscoveryControl>> {\n const uniqueIds = [...new Set(sessionIds)];\n if (uniqueIds.length === 0) return new Map();\n if (uniqueIds.length > SESSION_DISCOVERY_CONTROL_TARGET_LIMIT) {\n throw new SessionControlInvariantError(\n `Session discovery control projection exceeds ${SESSION_DISCOVERY_CONTROL_TARGET_LIMIT} targets`,\n );\n }\n\n // Discovery owns one read-only repeatable-read snapshot, so this projection\n // must not join the writer lock graph merely to keep workspace/session facts\n // coherent. The snapshot is the consistency boundary.\n const workspace = await lockWorkspaceInferenceControl(db, workspaceId, \"none\");\n const workspacePauseRevision = asSafeRevision(\n workspace.workspacePauseRevision,\n \"workspace pause revision\",\n );\n if (workspace.workspaceState === \"paused\" && workspacePauseRevision === null) {\n throw new SessionControlInvariantError(\"Paused workspace is missing its pause revision\");\n }\n\n const rows = await db.execute<SessionDiscoveryControlRow>(sql`\n with recursive targets(id) as (values ${targetValues(uniqueIds)}),\n ancestry as (\n select\n target.id as target_id,\n session.id as session_id,\n session.parent_session_id,\n left(coalesce(nullif(btrim(session.title), ''), 'Untitled session'), ${SESSION_DISCOVERY_CONTROL_TITLE_MAX_CHARS}) as display_name,\n char_length(coalesce(nullif(btrim(session.title), ''), 'Untitled session'))::integer as display_name_original_chars,\n session.direct_control_state,\n session.direct_pause_revision,\n session.subtree_run_override_revision,\n 0::integer as depth\n from targets target\n join ${schema.sessions} session\n on session.workspace_id = ${workspaceId} and session.id = target.id\n union all\n select\n child.target_id,\n parent.id,\n parent.parent_session_id,\n left(coalesce(nullif(btrim(parent.title), ''), 'Untitled session'), ${SESSION_DISCOVERY_CONTROL_TITLE_MAX_CHARS}),\n char_length(coalesce(nullif(btrim(parent.title), ''), 'Untitled session'))::integer,\n parent.direct_control_state,\n parent.direct_pause_revision,\n parent.subtree_run_override_revision,\n child.depth + 1\n from ancestry child\n join ${schema.sessions} parent\n on parent.workspace_id = ${workspaceId} and parent.id = child.parent_session_id\n where child.parent_session_id is not null\n and child.depth < ${SESSION_ANCESTRY_LIMIT}\n ),\n path as (\n select\n ancestry.*,\n max(ancestry.subtree_run_override_revision) over (\n partition by ancestry.target_id\n order by ancestry.depth\n rows between unbounded preceding and 1 preceding\n ) as descendant_override_revision\n from ancestry\n ),\n session_blockers as (\n select\n path.target_id,\n 'session'::text as kind,\n path.session_id,\n path.display_name,\n path.display_name_original_chars,\n path.depth\n from path\n where path.direct_control_state = 'paused'\n and path.direct_pause_revision is not null\n and (\n path.descendant_override_revision is null\n or path.descendant_override_revision <= path.direct_pause_revision\n )\n ),\n workspace_blockers as (\n select\n target.id as target_id,\n 'workspace'::text as kind,\n null::uuid as session_id,\n 'Workspace'::text as display_name,\n 9::integer as display_name_original_chars,\n ${SESSION_ANCESTRY_LIMIT + 1}::integer as depth\n from targets target\n where ${workspace.workspaceState === \"paused\"}\n and not exists (\n select 1\n from path\n where path.target_id = target.id\n and path.subtree_run_override_revision is not null\n and path.subtree_run_override_revision > ${workspacePauseRevision}\n )\n ),\n blockers as (\n select * from session_blockers\n union all\n select * from workspace_blockers\n ),\n primary_blockers as (\n select distinct on (blockers.target_id)\n blockers.target_id,\n blockers.kind,\n blockers.session_id,\n blockers.display_name,\n blockers.display_name_original_chars\n from blockers\n order by blockers.target_id, blockers.depth\n ),\n blocker_counts as (\n select blockers.target_id, count(*)::integer as blocker_count\n from blockers\n group by blockers.target_id\n ),\n ancestry_metadata as (\n select\n ancestry.target_id,\n count(*)::integer as ancestry_count,\n bool_or(ancestry.parent_session_id is null) as reached_root,\n max(ancestry.depth)::integer as max_depth\n from ancestry\n group by ancestry.target_id\n )\n select\n target.id as \"targetId\",\n coalesce(metadata.ancestry_count, 0)::integer as \"ancestryCount\",\n coalesce(metadata.reached_root, false) as \"reachedRoot\",\n metadata.max_depth as \"maxDepth\",\n coalesce(counts.blocker_count, 0)::integer as \"blockerCount\",\n primary_blocker.kind as \"primaryKind\",\n primary_blocker.session_id as \"primarySessionId\",\n primary_blocker.display_name as \"primaryDisplayName\",\n primary_blocker.display_name_original_chars as \"primaryDisplayNameOriginalChars\"\n from targets target\n left join ancestry_metadata metadata on metadata.target_id = target.id\n left join blocker_counts counts on counts.target_id = target.id\n left join primary_blockers primary_blocker on primary_blocker.target_id = target.id\n order by target.id\n `);\n\n const result = new Map<string, SessionDiscoveryControl>();\n for (const row of rows) {\n const ancestryCount = Number(row.ancestryCount);\n const maxDepth = row.maxDepth === null ? null : Number(row.maxDepth);\n if (ancestryCount === 0) {\n throw new SessionControlInvariantError(\n `Session ${row.targetId} does not exist in its workspace`,\n );\n }\n if (!row.reachedRoot) {\n throw new SessionControlInvariantError(\n maxDepth !== null && maxDepth >= SESSION_ANCESTRY_LIMIT\n ? `Session ${row.targetId} ancestry exceeds ${SESSION_ANCESTRY_LIMIT}`\n : `Session ${row.targetId} has a missing ancestor`,\n );\n }\n\n const blockerCount = Number(row.blockerCount);\n const primaryBlocker = row.primaryKind\n ? {\n kind: row.primaryKind,\n ...(row.primarySessionId ? { sessionId: row.primarySessionId } : {}),\n displayName:\n row.primaryDisplayName ??\n (row.primaryKind === \"workspace\" ? \"Workspace\" : \"Untitled session\"),\n displayNameOriginalChars: Number(\n row.primaryDisplayNameOriginalChars ??\n (row.primaryKind === \"workspace\" ? 9 : \"Untitled session\".length),\n ),\n }\n : null;\n if (blockerCount > 0 !== (primaryBlocker !== null)) {\n throw new SessionControlInvariantError(\n `Session ${row.targetId} discovery blocker aggregate is inconsistent`,\n );\n }\n result.set(row.targetId, {\n state: blockerCount > 0 ? \"paused\" : \"active\",\n primaryBlocker,\n additionalBlockerCount: Math.max(0, blockerCount - 1),\n });\n }\n if (result.size !== uniqueIds.length) {\n throw new SessionControlInvariantError(\"Session discovery control projection is incomplete\");\n }\n return result;\n}\n\nexport async function evaluateSessionControl(\n db: Database,\n workspaceId: string,\n sessionId: string,\n options: {\n lock?: WorkspaceControlLockMode;\n workspaceControl?: WorkspaceControlRow | undefined;\n } = {},\n): Promise<EffectiveSessionControl> {\n return (await evaluateSessionControls(db, workspaceId, [sessionId], options)).get(sessionId)!;\n}\n\nasync function findCommandReceipt(\n db: Database,\n input: {\n workspaceId: string;\n actor: SessionCommandActor;\n action: string;\n targetSessionId: string | null;\n targetTurnId: string | null;\n operationKey: string;\n identityScope: \"actor\" | \"target_operation\";\n },\n): Promise<SessionCommandReceiptRow | null> {\n const actorSubjectId = input.actor.type === \"agent_attempt\" ? null : input.actor.subjectId;\n const actorAttemptId = input.actor.type === \"agent_attempt\" ? input.actor.attemptId : null;\n const identity =\n input.identityScope === \"target_operation\"\n ? and(\n eq(schema.sessionCommandReceipts.workspaceId, input.workspaceId),\n eq(schema.sessionCommandReceipts.actorType, \"agent_attempt\"),\n eq(schema.sessionCommandReceipts.action, input.action),\n eq(schema.sessionCommandReceipts.targetSessionId, input.targetSessionId!),\n sql`${schema.sessionCommandReceipts.targetTurnId} is null`,\n eq(schema.sessionCommandReceipts.operationKey, input.operationKey),\n )\n : and(\n eq(schema.sessionCommandReceipts.workspaceId, input.workspaceId),\n eq(schema.sessionCommandReceipts.actorType, input.actor.type),\n sql`${schema.sessionCommandReceipts.actorSubjectId} is not distinct from ${actorSubjectId}`,\n sql`${schema.sessionCommandReceipts.actorAttemptId} is not distinct from ${actorAttemptId}::uuid`,\n eq(schema.sessionCommandReceipts.action, input.action),\n sql`${schema.sessionCommandReceipts.targetSessionId} is not distinct from ${input.targetSessionId}::uuid`,\n sql`${schema.sessionCommandReceipts.targetTurnId} is not distinct from ${input.targetTurnId}::uuid`,\n eq(schema.sessionCommandReceipts.operationKey, input.operationKey),\n );\n const rows = await db.select().from(schema.sessionCommandReceipts).where(identity).for(\"update\");\n return rows[0] ?? null;\n}\n\nexport type SessionPromptCommandAction = \"prompt.send\" | \"prompt.steer\";\n\nasync function findPromptCommandReceipts(\n db: Database,\n input: {\n workspaceId: string;\n actor: SessionCommandActor;\n operationKey: string;\n lock?: \"none\" | \"update\";\n },\n): Promise<SessionCommandReceiptRow[]> {\n const actorSubjectId = input.actor.type === \"agent_attempt\" ? null : input.actor.subjectId;\n const actorAttemptId = input.actor.type === \"agent_attempt\" ? input.actor.attemptId : null;\n const query = db\n .select()\n .from(schema.sessionCommandReceipts)\n .where(\n and(\n eq(schema.sessionCommandReceipts.workspaceId, input.workspaceId),\n eq(schema.sessionCommandReceipts.actorType, input.actor.type),\n sql`${schema.sessionCommandReceipts.actorSubjectId} is not distinct from ${actorSubjectId}`,\n sql`${schema.sessionCommandReceipts.actorAttemptId} is not distinct from ${actorAttemptId}::uuid`,\n inArray(schema.sessionCommandReceipts.action, [\"prompt.send\", \"prompt.steer\"]),\n eq(schema.sessionCommandReceipts.operationKey, input.operationKey),\n ),\n );\n const rows = input.lock === \"update\" ? await query.for(\"update\") : await query;\n return rows;\n}\n\nfunction fingerprintedPromptCommandReceipt(\n receipts: readonly SessionCommandReceiptRow[],\n): SessionCommandReceiptRow | null {\n const fingerprinted = receipts.filter(\n (receipt) => typeof receipt.result.boundaryRequestHash === \"string\",\n );\n if (fingerprinted.length > 1) {\n throw new SessionControlInvariantError(\n \"Prompt operation key resolved to multiple fingerprinted receipts\",\n );\n }\n return fingerprinted[0] ?? null;\n}\n\nfunction assertPromptCommandReceiptIdentity(\n receipt: SessionCommandReceiptRow,\n input: {\n action: SessionPromptCommandAction;\n targetSessionId: string;\n boundaryRequestHash: string;\n },\n): void {\n if (\n receipt.action !== input.action ||\n receipt.targetSessionId !== input.targetSessionId ||\n receipt.targetTurnId !== null ||\n (typeof receipt.result.boundaryRequestHash === \"string\" &&\n receipt.result.boundaryRequestHash !== input.boundaryRequestHash)\n ) {\n throw new SessionCommandIdempotencyError();\n }\n}\n\n/**\n * Prompt operation keys are actor-scoped across target sessions and across the\n * Send/Steer action pair. The advisory lock closes the gap left by the legacy\n * action/target-specific unique index without changing old receipt identities.\n */\nexport async function reserveSessionPromptCommandReceipt(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n actor: SessionCommandActor;\n action: SessionPromptCommandAction;\n targetSessionId: string;\n operationKey: string;\n canonicalRequestHash: string;\n boundaryRequestHash: string;\n },\n): Promise<{ receipt: SessionCommandReceiptRow; replay: boolean }> {\n await lockSessionPromptCommandOperation(db, input);\n const existingReceipts = await findPromptCommandReceipts(db, {\n workspaceId: input.workspaceId,\n actor: input.actor,\n operationKey: input.operationKey,\n lock: \"update\",\n });\n const fingerprinted = fingerprintedPromptCommandReceipt(existingReceipts);\n if (fingerprinted) {\n assertPromptCommandReceiptIdentity(fingerprinted, input);\n return { receipt: fingerprinted, replay: true };\n }\n const legacyExact = existingReceipts.find(\n (receipt) =>\n receipt.action === input.action &&\n receipt.targetSessionId === input.targetSessionId &&\n receipt.targetTurnId === null,\n );\n if (legacyExact) {\n if (legacyExact.canonicalRequestHash !== input.canonicalRequestHash) {\n throw new SessionCommandIdempotencyError();\n }\n return { receipt: legacyExact, replay: true };\n }\n return await reserveSessionCommandReceipt(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actor: input.actor,\n action: input.action,\n targetSessionId: input.targetSessionId,\n targetTurnId: null,\n operationKey: input.operationKey,\n canonicalRequestHash: input.canonicalRequestHash,\n ...(existingReceipts.length === 0\n ? { initialResult: { boundaryRequestHash: input.boundaryRequestHash } }\n : {}),\n });\n}\n\n/** Serialize one actor-scoped prompt operation before replay or reservation. */\nexport async function lockSessionPromptCommandOperation(\n db: Database,\n input: {\n workspaceId: string;\n actor: SessionCommandActor;\n operationKey: string;\n },\n): Promise<void> {\n const actorIdentity =\n input.actor.type === \"agent_attempt\"\n ? `attempt:${input.actor.attemptId}`\n : `${input.actor.type}:${input.actor.subjectId}`;\n await db.execute(\n sql`select pg_advisory_xact_lock(hashtextextended(${`session-prompt:${input.workspaceId}:${actorIdentity}:${input.operationKey}`}, 0))`,\n );\n}\n\n/** Return only a fully committed exact prompt receipt with the new boundary fingerprint. */\nexport async function getCompletedSessionPromptCommandReceipt(\n db: Database,\n input: {\n workspaceId: string;\n actor: SessionCommandActor;\n action: SessionPromptCommandAction;\n targetSessionId: string;\n operationKey: string;\n boundaryRequestHash: string;\n },\n): Promise<SessionCommandReceiptRow | null> {\n const receipt = fingerprintedPromptCommandReceipt(\n await findPromptCommandReceipts(db, {\n workspaceId: input.workspaceId,\n actor: input.actor,\n operationKey: input.operationKey,\n }),\n );\n if (!receipt) return null;\n assertPromptCommandReceiptIdentity(receipt, input);\n if (\n typeof receipt.result.boundaryRequestHash !== \"string\" ||\n receipt.appliedQueueVersion === null\n ) {\n return null;\n }\n return receipt;\n}\n\nexport async function reserveSessionCommandReceipt(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n actor: SessionCommandActor;\n action: string;\n targetSessionId: string | null;\n targetTurnId: string | null;\n operationKey: string;\n canonicalRequestHash: string;\n identityScope?: \"actor\" | \"target_operation\";\n initialResult?: Record<string, unknown>;\n },\n): Promise<{ receipt: SessionCommandReceiptRow; replay: boolean }> {\n if (!input.operationKey.trim()) throw new Error(\"operationKey must not be empty\");\n const identityScope = input.identityScope ?? \"actor\";\n if (\n identityScope === \"target_operation\" &&\n (input.actor.type !== \"agent_attempt\" ||\n ![\"goal.update\", \"goal.progress\", \"session.wait_for_input\"].includes(input.action) ||\n input.targetSessionId === null ||\n input.targetTurnId !== null)\n ) {\n throw new SessionControlInvariantError(\n \"Target-scoped receipt identity is reserved for agent self commands\",\n );\n }\n const actorSubjectId = input.actor.type === \"agent_attempt\" ? null : input.actor.subjectId;\n const actorAttemptId = input.actor.type === \"agent_attempt\" ? input.actor.attemptId : null;\n const [inserted] = await db\n .insert(schema.sessionCommandReceipts)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorType: input.actor.type,\n actorSubjectId,\n actorAttemptId,\n action: input.action,\n targetSessionId: input.targetSessionId,\n targetTurnId: input.targetTurnId,\n operationKey: input.operationKey,\n canonicalRequestHash: input.canonicalRequestHash,\n result: input.initialResult ?? {},\n })\n .onConflictDoNothing()\n .returning();\n const receipt =\n inserted ??\n (await findCommandReceipt(db, {\n workspaceId: input.workspaceId,\n actor: input.actor,\n action: input.action,\n targetSessionId: input.targetSessionId,\n targetTurnId: input.targetTurnId,\n operationKey: input.operationKey,\n identityScope,\n }));\n if (!receipt) throw new SessionControlInvariantError(\"Command receipt conflict was not readable\");\n if (receipt.canonicalRequestHash !== input.canonicalRequestHash) {\n throw new SessionCommandIdempotencyError();\n }\n return { receipt, replay: !inserted };\n}\n\nfunction nextRevision(workspace: WorkspaceControlRow): number {\n const current = asSafeRevision(workspace.revision, \"workspace control revision\")!;\n if (current >= Number.MAX_SAFE_INTEGER) {\n throw new SessionControlInvariantError(\"Workspace control revision is exhausted\");\n }\n return current + 1;\n}\n\nasync function advanceWorkspaceRevision(\n db: Database,\n workspaceId: string,\n revision: number,\n): Promise<void> {\n const rows = await db\n .update(schema.workspaceInferenceControls)\n .set({ revision, updatedAt: new Date() })\n .where(\n and(\n eq(schema.workspaceInferenceControls.workspaceId, workspaceId),\n eq(schema.workspaceInferenceControls.revision, revision - 1),\n ),\n )\n .returning({ workspaceId: schema.workspaceInferenceControls.workspaceId });\n if (rows.length !== 1) {\n throw new SessionControlInvariantError(\n \"Workspace control revision did not advance exactly once\",\n );\n }\n}\n\nasync function registerContinuableWakes(\n db: Database,\n input: { workspaceId: string; rootSessionId: string | null; reason: string },\n): Promise<number> {\n const rows = await db.execute<{ wakeCount: number | string }>(sql`\n with eligible as (\n select *\n from opengeni_private.list_continuable_sessions(\n ${input.workspaceId}::uuid,\n ${input.rootSessionId}::uuid\n )\n ), upserted as (\n insert into ${schema.sessionWorkflowWakeOutbox} (\n session_id, account_id, workspace_id, temporal_workflow_id, reason\n )\n select session_id, account_id, workspace_id, temporal_workflow_id, ${input.reason}\n from eligible\n on conflict (session_id) do update set\n wake_revision = ${schema.sessionWorkflowWakeOutbox}.wake_revision + 1,\n temporal_workflow_id = excluded.temporal_workflow_id,\n reason = excluded.reason,\n attempts = 0,\n next_attempt_at = now(),\n last_error = null,\n updated_at = now()\n returning session_id\n )\n select count(*)::bigint as \"wakeCount\" from upserted\n `);\n return Number(rows[0]?.wakeCount ?? 0);\n}\n\nasync function registerDescendantWakes(\n db: Database,\n input: { workspaceId: string; sessionId: string; reason: string },\n): Promise<number> {\n return await registerContinuableWakes(db, {\n workspaceId: input.workspaceId,\n rootSessionId: input.sessionId,\n reason: input.reason,\n });\n}\n\nasync function registerWorkspaceWakes(\n db: Database,\n input: { workspaceId: string; reason: string },\n): Promise<number> {\n return await registerContinuableWakes(db, {\n workspaceId: input.workspaceId,\n rootSessionId: null,\n reason: input.reason,\n });\n}\n\n/**\n * Pause never needs to rediscover ordinary continuable work: it closes\n * admission. Only workflows owning an interruption created by this exact\n * command must wake so they can settle their in-flight attempt. The operation\n * receipt is indexed and bounds this to the number of affected attempts rather\n * than the size or depth of the paused tree.\n */\nasync function registerInterruptionWakes(\n db: Database,\n input: { operationId: string; reason: string },\n): Promise<number> {\n const rows = await db.execute<{ wakeCount: number | string }>(sql`\n with eligible as (\n select distinct\n session.id as session_id,\n session.account_id,\n session.workspace_id,\n coalesce(session.temporal_workflow_id, 'session-' || session.id::text)\n as temporal_workflow_id\n from ${schema.sessionAttemptInterruptions} interruption\n join ${schema.sessions} session\n on session.workspace_id = interruption.workspace_id\n and session.id = interruption.session_id\n where interruption.operation_id = ${input.operationId}::uuid\n and interruption.state in ('pending', 'delivered', 'acknowledged')\n ), upserted as (\n insert into ${schema.sessionWorkflowWakeOutbox} (\n session_id, account_id, workspace_id, temporal_workflow_id, reason\n )\n select session_id, account_id, workspace_id, temporal_workflow_id, ${input.reason}\n from eligible\n on conflict (session_id) do update set\n wake_revision = ${schema.sessionWorkflowWakeOutbox}.wake_revision + 1,\n temporal_workflow_id = excluded.temporal_workflow_id,\n reason = excluded.reason,\n attempts = 0,\n next_attempt_at = now(),\n last_error = null,\n updated_at = now()\n returning session_id\n )\n select count(*)::bigint as \"wakeCount\" from upserted\n `);\n return Number(rows[0]?.wakeCount ?? 0);\n}\n\n/**\n * Terminal cancellation must wake every affected workflow, including sessions\n * parked at an approval, capacity, or other no-active-attempt boundary. Those\n * sessions have no new interruption row, so the ordinary Pause wake selector\n * cannot discover them. Signal-with-start is intentional here: a closed\n * workflow cheaply re-reads the terminal row and exits, while an open workflow\n * is released from an otherwise unbounded durable wait.\n */\nasync function registerCancellationWakes(\n db: Database,\n input: { workspaceId: string; sessionIds: string[] },\n): Promise<number> {\n if (input.sessionIds.length === 0) return 0;\n const sessionIds = sql.join(\n input.sessionIds.map((id) => sql`${id}::uuid`),\n sql`, `,\n );\n const rows = await db.execute<{ wakeCount: number | string }>(sql`\n with eligible as (\n select\n session.id as session_id,\n session.account_id,\n session.workspace_id,\n coalesce(session.temporal_workflow_id, 'session-' || session.id::text)\n as temporal_workflow_id\n from ${schema.sessions} session\n where session.workspace_id = ${input.workspaceId}\n and session.id in (${sessionIds})\n ), upserted as (\n insert into ${schema.sessionWorkflowWakeOutbox} (\n session_id, account_id, workspace_id, temporal_workflow_id, reason, control_revision\n )\n select session_id, account_id, workspace_id, temporal_workflow_id, 'session_cancelled', 1\n from eligible\n on conflict (session_id) do update set\n wake_revision = ${schema.sessionWorkflowWakeOutbox}.wake_revision + 1,\n control_revision = ${schema.sessionWorkflowWakeOutbox}.wake_revision + 1,\n temporal_workflow_id = excluded.temporal_workflow_id,\n reason = excluded.reason,\n attempts = 0,\n next_attempt_at = now(),\n last_error = null,\n updated_at = now()\n returning session_id\n )\n select count(*)::bigint as \"wakeCount\" from upserted\n `);\n return Number(rows[0]?.wakeCount ?? 0);\n}\n\n/** Register one exact post-commit Temporal nudge without encoding eligibility in\n * the transport. The workflow re-reads canonical Postgres state; coalescing is\n * revisioned so a lost or stale delivery cannot hide a later mutation. */\nexport async function registerSessionWorkflowWakeInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n temporalWorkflowId: string;\n reason: string;\n controlRequested?: boolean;\n },\n): Promise<number> {\n const [row] = await db\n .insert(schema.sessionWorkflowWakeOutbox)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n temporalWorkflowId: input.temporalWorkflowId,\n controlRevision: input.controlRequested ? 1 : 0,\n reason: input.reason,\n })\n .onConflictDoUpdate({\n target: schema.sessionWorkflowWakeOutbox.sessionId,\n set: {\n temporalWorkflowId: input.temporalWorkflowId,\n wakeRevision: sql`${schema.sessionWorkflowWakeOutbox.wakeRevision} + 1`,\n controlRevision: input.controlRequested\n ? sql`${schema.sessionWorkflowWakeOutbox.wakeRevision} + 1`\n : sql`${schema.sessionWorkflowWakeOutbox.controlRevision}`,\n reason: input.reason,\n attempts: 0,\n nextAttemptAt: new Date(),\n lastError: null,\n updatedAt: new Date(),\n },\n })\n .returning({ wakeRevision: schema.sessionWorkflowWakeOutbox.wakeRevision });\n if (!row) {\n throw new SessionControlInvariantError(`Failed to register wake for ${input.sessionId}`);\n }\n return Number(row.wakeRevision);\n}\n\n/**\n * Internal producers share one outstanding session-level receipt. While a wake\n * remains undelivered, another update makes that same batch richer instead of\n * manufacturing another transport revision or sequential model turn.\n */\nexport async function registerInternalUpdateWakeInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n temporalWorkflowId: string;\n },\n): Promise<{ wakeRevision: number; shouldSignal: boolean }> {\n const [existing] = await db\n .select()\n .from(schema.sessionWorkflowWakeOutbox)\n .where(\n and(\n eq(schema.sessionWorkflowWakeOutbox.workspaceId, input.workspaceId),\n eq(schema.sessionWorkflowWakeOutbox.sessionId, input.sessionId),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (existing && existing.wakeRevision > existing.deliveredRevision) {\n await db\n .update(schema.sessionWorkflowWakeOutbox)\n .set({\n temporalWorkflowId: input.temporalWorkflowId,\n reason: \"internal_update_batch\",\n nextAttemptAt: new Date(),\n lastError: null,\n updatedAt: new Date(),\n })\n .where(eq(schema.sessionWorkflowWakeOutbox.sessionId, input.sessionId));\n return { wakeRevision: existing.wakeRevision, shouldSignal: false };\n }\n return {\n wakeRevision: await registerSessionWorkflowWakeInTransaction(db, {\n ...input,\n reason: \"internal_update_batch\",\n }),\n shouldSignal: true,\n };\n}\n\nasync function interruptDescendantAttempts(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n operationId: string;\n kind: \"session_pause\" | \"steer\" | \"maintenance\";\n controlRevision: number;\n },\n): Promise<number> {\n const rows = await db.execute<{ count: number | string }>(sql`\n with recursive live_attempts as (\n select attempt.id, attempt.account_id, attempt.workspace_id, attempt.session_id\n from ${schema.sessionTurnAttempts} attempt\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.state in ('claimed', 'running')\n ), attempt_ancestry(attempt_id, account_id, workspace_id, session_id, ancestor_id, depth, path) as (\n select\n attempt.id,\n attempt.account_id,\n attempt.workspace_id,\n attempt.session_id,\n attempt.session_id,\n 0::integer,\n array[attempt.session_id]::uuid[]\n from live_attempts attempt\n union all\n select\n ancestry.attempt_id,\n ancestry.account_id,\n ancestry.workspace_id,\n ancestry.session_id,\n current.parent_session_id,\n ancestry.depth + 1,\n ancestry.path || current.parent_session_id\n from attempt_ancestry ancestry\n join ${schema.sessions} current\n on current.workspace_id = ${input.workspaceId} and current.id = ancestry.ancestor_id\n where current.parent_session_id is not null\n and not current.parent_session_id = any(ancestry.path)\n and ancestry.depth < ${SESSION_ANCESTRY_LIMIT}\n ), inserted as (\n insert into ${schema.sessionAttemptInterruptions} (\n account_id, workspace_id, session_id, operation_id, attempt_id,\n kind, control_revision\n )\n select ancestry.account_id, ancestry.workspace_id, ancestry.session_id,\n ${input.operationId}::uuid, ancestry.attempt_id, ${input.kind}, ${input.controlRevision}\n from attempt_ancestry ancestry\n where ancestry.ancestor_id = ${input.sessionId}\n on conflict (operation_id, attempt_id) do nothing\n returning id\n )\n select count(*)::integer as count from inserted\n `);\n return Number(rows[0]?.count ?? 0);\n}\n\nasync function interruptWorkspaceAttempts(\n db: Database,\n input: {\n workspaceId: string;\n operationId: string;\n controlRevision: number;\n },\n): Promise<number> {\n const rows = await db.execute<{ count: number | string }>(sql`\n with inserted as (\n insert into ${schema.sessionAttemptInterruptions} (\n account_id, workspace_id, session_id, operation_id, attempt_id,\n kind, control_revision\n )\n select attempt.account_id, attempt.workspace_id, attempt.session_id,\n ${input.operationId}::uuid, attempt.id, 'workspace_pause',\n ${input.controlRevision}\n from ${schema.sessionTurnAttempts} attempt\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.state in ('claimed', 'running')\n on conflict (operation_id, attempt_id) do nothing\n returning id\n )\n select count(*)::integer as count from inserted\n `);\n return Number(rows[0]?.count ?? 0);\n}\n\nexport async function updateSessionCommandReceiptResult(\n db: Database,\n receiptId: string,\n input: {\n controlRevision?: number | null;\n queueVersion?: number | null;\n turnVersion?: number | null;\n draftRevision?: number | null;\n result: Record<string, unknown>;\n },\n): Promise<SessionCommandReceiptRow> {\n const [receipt] = await db\n .update(schema.sessionCommandReceipts)\n .set({\n ...(input.controlRevision !== undefined\n ? { appliedControlRevision: input.controlRevision }\n : {}),\n ...(input.queueVersion !== undefined ? { appliedQueueVersion: input.queueVersion } : {}),\n ...(input.turnVersion !== undefined ? { appliedTurnVersion: input.turnVersion } : {}),\n ...(input.draftRevision !== undefined ? { appliedDraftRevision: input.draftRevision } : {}),\n result: input.result,\n updatedAt: new Date(),\n })\n .where(eq(schema.sessionCommandReceipts.id, receiptId))\n .returning();\n if (!receipt) throw new SessionControlInvariantError(\"Command receipt disappeared\");\n return receipt;\n}\n\nexport type SessionControlMutationResult = {\n receipt: SessionCommandReceiptRow;\n control: EffectiveSessionControl;\n sessionControlEventId: string | null;\n workspaceControlEventId: string | null;\n interruptionCount: number;\n backgroundCommandCount: number;\n wakeCount: number;\n cancelledSessionCount: number;\n cancelledTurnCount: number;\n affectedSessionEvents: Array<{ sessionId: string; eventIds: string[] }>;\n workflowWake: SessionControlWorkflowWake | null;\n outcome: \"changed\" | \"unchanged\" | \"replayed\";\n replay: boolean;\n};\n\nexport type SessionControlWorkflowWake = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n temporalWorkflowId: string;\n wakeRevision: number;\n};\n\nasync function pendingSessionControlWorkflowWake(\n db: Database,\n workspaceId: string,\n sessionId: string,\n wakeCount: number,\n): Promise<SessionControlWorkflowWake | null> {\n if (wakeCount === 0) return null;\n const [wake] = await db\n .select({\n accountId: schema.sessionWorkflowWakeOutbox.accountId,\n workspaceId: schema.sessionWorkflowWakeOutbox.workspaceId,\n sessionId: schema.sessionWorkflowWakeOutbox.sessionId,\n temporalWorkflowId: schema.sessionWorkflowWakeOutbox.temporalWorkflowId,\n wakeRevision: schema.sessionWorkflowWakeOutbox.wakeRevision,\n deliveredRevision: schema.sessionWorkflowWakeOutbox.deliveredRevision,\n })\n .from(schema.sessionWorkflowWakeOutbox)\n .where(\n and(\n eq(schema.sessionWorkflowWakeOutbox.workspaceId, workspaceId),\n eq(schema.sessionWorkflowWakeOutbox.sessionId, sessionId),\n ),\n )\n .limit(1);\n if (!wake || wake.wakeRevision <= wake.deliveredRevision) return null;\n return {\n accountId: wake.accountId,\n workspaceId: wake.workspaceId,\n sessionId: wake.sessionId,\n temporalWorkflowId: wake.temporalWorkflowId,\n wakeRevision: wake.wakeRevision,\n };\n}\n\nasync function sessionPauseEffectsNeeded(\n db: Database,\n input: { workspaceId: string; sessionId: string; directPauseRevision: number },\n): Promise<boolean> {\n const rows = await db.execute<{ needed: boolean }>(sql`\n with recursive subtree(id, path, cycle) as (\n select session.id, array[session.id]::uuid[], false\n from ${schema.sessions} session\n where session.workspace_id = ${input.workspaceId}\n and session.id = ${input.sessionId}\n union all\n select child.id, parent.path || child.id, child.id = any(parent.path)\n from subtree parent\n join ${schema.sessions} child\n on child.workspace_id = ${input.workspaceId}\n and child.parent_session_id = parent.id\n where not parent.cycle\n and cardinality(parent.path) <= ${SESSION_ANCESTRY_LIMIT}\n ), scoped_sessions as (\n select session.id, session.subtree_run_override_revision\n from subtree\n join ${schema.sessions} session\n on session.workspace_id = ${input.workspaceId}\n and session.id = subtree.id\n where not subtree.cycle\n )\n select exists (\n select 1\n from scoped_sessions session\n where session.subtree_run_override_revision > ${input.directPauseRevision}\n union all\n select 1\n from ${schema.sessionTurnAttempts} attempt\n join scoped_sessions session on session.id = attempt.session_id\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.state in ('claimed', 'running')\n and not exists (\n select 1\n from ${schema.sessionAttemptInterruptions} interruption\n where interruption.workspace_id = attempt.workspace_id\n and interruption.attempt_id = attempt.id\n and interruption.kind in ('session_pause', 'workspace_pause')\n and interruption.state in ('pending', 'delivered', 'acknowledged')\n )\n union all\n select 1\n from ${schema.sessionBackgroundCommands} command\n join scoped_sessions session on session.id = command.session_id\n where command.workspace_id = ${input.workspaceId}\n and command.state = 'running'\n ) as needed\n `);\n return rows[0]?.needed ?? false;\n}\n\nasync function workspacePauseEffectsNeeded(\n db: Database,\n input: { workspaceId: string; workspacePauseRevision: number },\n): Promise<boolean> {\n const rows = await db.execute<{ needed: boolean }>(sql`\n select exists (\n select 1\n from ${schema.sessions} session\n where session.workspace_id = ${input.workspaceId}\n and session.subtree_run_override_revision > ${input.workspacePauseRevision}\n union all\n select 1\n from ${schema.sessionTurnAttempts} attempt\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.state in ('claimed', 'running')\n and not exists (\n select 1\n from ${schema.sessionAttemptInterruptions} interruption\n where interruption.workspace_id = attempt.workspace_id\n and interruption.attempt_id = attempt.id\n and interruption.kind in ('session_pause', 'workspace_pause')\n and interruption.state in ('pending', 'delivered', 'acknowledged')\n )\n union all\n select 1\n from ${schema.sessionBackgroundCommands} command\n where command.workspace_id = ${input.workspaceId}\n and command.state = 'running'\n ) as needed\n `);\n return rows[0]?.needed ?? false;\n}\n\nasync function continuableWakeRepairNeeded(\n db: Database,\n input: { workspaceId: string; rootSessionId: string | null },\n): Promise<boolean> {\n const rows = await db.execute<{ needed: boolean }>(sql`\n select exists (\n select 1\n from opengeni_private.list_continuable_sessions(\n ${input.workspaceId}::uuid,\n ${input.rootSessionId}::uuid\n ) eligible\n left join ${schema.sessionWorkflowWakeOutbox} wake\n on wake.workspace_id = eligible.workspace_id\n and wake.session_id = eligible.session_id\n where wake.session_id is null\n or wake.wake_revision <= wake.delivered_revision\n ) as needed\n `);\n return rows[0]?.needed ?? false;\n}\n\nasync function loadSessionSubtreeIds(\n db: Database,\n workspaceId: string,\n rootSessionId: string,\n): Promise<{ sessionIds: string[]; rootParentSessionId: string | null }> {\n const rows: Array<{\n id: string;\n rootParentSessionId: string | null;\n depth: number | string;\n cycle: boolean;\n }> = await db.execute(sql`\n with recursive subtree(id, root_parent_session_id, depth, path, cycle) as (\n select session.id, session.parent_session_id, 0::integer, array[session.id]::uuid[], false\n from ${schema.sessions} session\n where session.workspace_id = ${workspaceId} and session.id = ${rootSessionId}\n union all\n select child.id, parent.root_parent_session_id, parent.depth + 1,\n parent.path || child.id, child.id = any(parent.path)\n from subtree parent\n join ${schema.sessions} child\n on child.workspace_id = ${workspaceId} and child.parent_session_id = parent.id\n where parent.depth < ${SESSION_ANCESTRY_LIMIT} and not parent.cycle\n )\n select id, root_parent_session_id as \"rootParentSessionId\", depth, cycle\n from subtree\n order by id\n `);\n if (rows.length === 0) {\n throw new SessionControlInvariantError(`Session ${rootSessionId} does not exist`);\n }\n if (rows.some((row) => row.cycle || Number(row.depth) >= SESSION_ANCESTRY_LIMIT)) {\n throw new SessionControlInvariantError(`Session ${rootSessionId} subtree is invalid`);\n }\n return {\n sessionIds: rows.map((row) => row.id),\n rootParentSessionId: rows[0]?.rootParentSessionId ?? null,\n };\n}\n\nconst TERMINAL_CANCELLATION_LIVE_TURN_STATUSES = [\n \"queued\",\n \"running\",\n \"requires_action\",\n \"recovering\",\n \"waiting_capacity\",\n];\n\nasync function loadCancellationTurnIds(\n db: Database,\n workspaceId: string,\n sessionIds: string[],\n): Promise<string[]> {\n const rows = await db\n .select({ id: schema.sessionTurns.id })\n .from(schema.sessionTurns)\n .where(\n and(\n eq(schema.sessionTurns.workspaceId, workspaceId),\n inArray(schema.sessionTurns.sessionId, sessionIds),\n inArray(schema.sessionTurns.status, TERMINAL_CANCELLATION_LIVE_TURN_STATUSES),\n ),\n )\n .orderBy(schema.sessionTurns.id);\n return rows.map((row) => row.id);\n}\n\nasync function loadParentSessionId(\n db: Database,\n workspaceId: string,\n sessionId: string,\n): Promise<string | null> {\n const [row] = await db\n .select({ parentSessionId: schema.sessions.parentSessionId })\n .from(schema.sessions)\n .where(and(eq(schema.sessions.workspaceId, workspaceId), eq(schema.sessions.id, sessionId)))\n .limit(1);\n return row?.parentSessionId ?? null;\n}\n\n/**\n * The one control-plane child -> parent outbox insert (terminal cancellation,\n * direct Pause, and cancelled human-input resolutions). The caller holds the\n * canonical prefix with the child and its parent locked UUID-ordered; the\n * causal parent-turn personal delegation snapshot is copied verbatim.\n */\nasync function insertChildOutboxRowInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n childSession: typeof schema.sessions.$inferSelect;\n parentSession: typeof schema.sessions.$inferSelect | null;\n dedupeKey: string;\n kind: \"child_terminal_result\" | \"child_paused\" | \"child_requires_action_resolved\";\n classification: \"info\" | \"action_required\";\n summary: string;\n payload: Record<string, unknown> & { type: string };\n lineage?: Record<string, unknown>;\n },\n): Promise<void> {\n const parentSessionId = input.childSession.parentSessionId;\n if (!parentSessionId) return;\n if (!input.parentSession || input.parentSession.id !== parentSessionId) {\n throw new SessionControlInvariantError(\n `Parent session ${parentSessionId} was not locked with child ${input.childSession.id}`,\n );\n }\n if (input.parentSession.status === \"cancelled\") return;\n if (input.payload.type !== input.kind) {\n throw new SessionControlInvariantError(\n `Child outbox ${input.kind} payload discriminator mismatch`,\n );\n }\n let personalConnectionDelegations: (typeof schema.sessionTurns.$inferSelect)[\"personalConnectionDelegations\"] =\n [];\n if (input.childSession.parentTurnId) {\n const [parentTurn] = await db\n .select({\n delegations: schema.sessionTurns.personalConnectionDelegations,\n })\n .from(schema.sessionTurns)\n .where(\n and(\n eq(schema.sessionTurns.workspaceId, input.workspaceId),\n eq(schema.sessionTurns.sessionId, parentSessionId),\n eq(schema.sessionTurns.id, input.childSession.parentTurnId),\n ),\n )\n .limit(1);\n if (parentTurn) {\n const parsed = McpPersonalConnectionDelegations.safeParse(parentTurn.delegations);\n if (!parsed.success) {\n throw new SessionControlInvariantError(\n `Invalid personal MCP delegation snapshot at session_turns:${input.workspaceId}:${parentSessionId}:${input.childSession.parentTurnId}`,\n );\n }\n personalConnectionDelegations = parsed.data.map((delegation) => ({\n ...delegation,\n }));\n }\n }\n await db\n .insert(schema.sessionSystemUpdateOutbox)\n .values(\n withLosslessContentWriteVersion(\n withLosslessContentWriteVersion(\n {\n accountId: input.childSession.accountId,\n workspaceId: input.workspaceId,\n sourceSessionId: input.childSession.id,\n targetSessionId: parentSessionId,\n dedupeKey: input.dedupeKey,\n kind: input.kind,\n classification: input.classification,\n sourceId: input.childSession.id,\n summary: input.summary,\n payload: input.payload,\n lineage: {\n childSessionId: input.childSession.id,\n parentSessionId,\n ...(input.childSession.parentTurnId\n ? { parentTurnId: input.childSession.parentTurnId }\n : {}),\n ...(input.lineage ?? {}),\n },\n personalConnectionDelegations,\n },\n \"summary\",\n \"summaryCodecVersion\",\n ),\n \"payload\",\n \"payloadCodecVersion\",\n ),\n )\n .onConflictDoNothing({\n target: [\n schema.sessionSystemUpdateOutbox.workspaceId,\n schema.sessionSystemUpdateOutbox.dedupeKey,\n ],\n });\n}\n\nasync function enqueueCancelledChildOutboxInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n rootSession: typeof schema.sessions.$inferSelect;\n parentSession: typeof schema.sessions.$inferSelect | null;\n },\n): Promise<void> {\n await insertChildOutboxRowInTransaction(db, {\n workspaceId: input.workspaceId,\n childSession: input.rootSession,\n parentSession: input.parentSession,\n dedupeKey: `child-completion:${input.rootSession.id}:cancelled`,\n kind: \"child_terminal_result\",\n classification: \"info\",\n summary: \"Child session was terminally cancelled.\",\n payload: {\n type: \"child_terminal_result\",\n childSessionId: input.rootSession.id,\n status: \"cancelled\",\n },\n });\n}\n\n/** child_paused notice for a direct Pause of a child; gated by the rollout flag. */\nasync function enqueueChildPausedOutboxInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n childSession: typeof schema.sessions.$inferSelect;\n parentSession: typeof schema.sessions.$inferSelect;\n operationId: string;\n actorKind: \"human\" | \"api\" | \"agent\";\n reason: string | null;\n },\n): Promise<void> {\n if (!childLifecycleNoticesEnabled()) return;\n const payload = {\n type: \"child_paused\" as const,\n childSessionId: input.childSession.id,\n operationId: input.operationId,\n actorKind: input.actorKind,\n reason: boundedChildPausedReason(input.reason),\n };\n await insertChildOutboxRowInTransaction(db, {\n workspaceId: input.workspaceId,\n childSession: input.childSession,\n parentSession: input.parentSession,\n dedupeKey: childPausedDedupeKey({\n childSessionId: input.childSession.id,\n receiptId: input.operationId,\n }),\n kind: \"child_paused\",\n classification: childPausedClassification(input.actorKind),\n summary: childPausedSummary(input.childSession.id, payload),\n payload,\n });\n}\n\n/**\n * Terminal cancellation of the selected root's pending human-input rows: each\n * becomes one child_requires_action_resolved notice for the surviving parent\n * so its pending child_requires_action can be superseded. Cancelled\n * descendants do not notify parents inside the same terminal subtree.\n */\nasync function enqueueCancelledChildRequiresActionResolvedOutboxInTransaction(\n db: Database,\n input: {\n workspaceId: string;\n rootSession: typeof schema.sessions.$inferSelect;\n parentSession: typeof schema.sessions.$inferSelect | null;\n cancelledHumanInputs: ReadonlyArray<{\n id: string;\n sessionId: string;\n turnId: string;\n turnGeneration: number;\n }>;\n },\n): Promise<void> {\n if (!childLifecycleNoticesEnabled() || !input.parentSession) return;\n for (const humanInput of input.cancelledHumanInputs) {\n if (humanInput.sessionId !== input.rootSession.id) continue;\n const payload = {\n type: \"child_requires_action_resolved\" as const,\n childSessionId: input.rootSession.id,\n childTurnId: humanInput.turnId,\n childTurnGeneration: humanInput.turnGeneration,\n requestId: humanInput.id,\n approvalId: null,\n outcome: \"cancelled\" as const,\n respondedByKind: \"system\" as const,\n };\n await insertChildOutboxRowInTransaction(db, {\n workspaceId: input.workspaceId,\n childSession: input.rootSession,\n parentSession: input.parentSession,\n dedupeKey: childRequiresActionResolvedDedupeKey({\n childSessionId: input.rootSession.id,\n turnId: humanInput.turnId,\n turnGeneration: humanInput.turnGeneration,\n requestId: humanInput.id,\n approvalId: null,\n }),\n kind: \"child_requires_action_resolved\",\n classification: \"info\",\n summary: childRequiresActionResolvedSummary(input.rootSession.id, payload),\n payload,\n lineage: { turnId: humanInput.turnId },\n });\n }\n}\n\nasync function assertSessionBranchIsNotCancelled(\n db: Database,\n workspaceId: string,\n sessionId: string,\n): Promise<void> {\n const rows = await db.execute<{\n cancelled: boolean;\n invalid: boolean;\n }>(sql`\n with recursive ancestry(id, parent_id, status, depth, path, cycle) as (\n select session.id, session.parent_session_id, session.status, 0::integer,\n array[session.id]::uuid[], false\n from ${schema.sessions} session\n where session.workspace_id = ${workspaceId} and session.id = ${sessionId}\n union all\n select parent.id, parent.parent_session_id, parent.status, child.depth + 1,\n child.path || parent.id, parent.id = any(child.path)\n from ancestry child\n join ${schema.sessions} parent\n on parent.workspace_id = ${workspaceId} and parent.id = child.parent_id\n where child.depth < ${SESSION_ANCESTRY_LIMIT} and not child.cycle\n )\n select\n coalesce(bool_or(status = 'cancelled'), false) as cancelled,\n count(*) = 0 or coalesce(bool_or(cycle), false)\n or coalesce(max(depth), 0) >= ${SESSION_ANCESTRY_LIMIT} as invalid\n from ancestry\n `);\n if (rows[0]?.invalid) {\n throw new SessionControlInvariantError(`Session ${sessionId} ancestry is invalid`);\n }\n if (rows[0]?.cancelled) {\n throw new SessionControlConflictError(\"Cancelled session subtree cannot accept work\");\n }\n}\n\nasync function cancelSessionSubtreeInTransaction(\n db: SessionActivityDatabase,\n input: {\n accountId: string;\n workspaceId: string;\n rootSessionId: string;\n sessionIds: string[];\n lockedSessions: Array<typeof schema.sessions.$inferSelect>;\n candidateTurnIds: string[];\n lockedTurns: Array<typeof schema.sessionTurns.$inferSelect>;\n actor: string;\n reason: string | null;\n operationId: string;\n rootControlEventId: string;\n },\n): Promise<{\n cancelledSessionCount: number;\n cancelledTurnCount: number;\n affectedSessionEvents: Array<{ sessionId: string; eventIds: string[] }>;\n}> {\n const candidateTurnIdSet = new Set(input.candidateTurnIds);\n const candidateTurns = input.lockedTurns.filter((turn) => candidateTurnIdSet.has(turn.id));\n if (candidateTurns.length !== candidateTurnIdSet.size) {\n throw new SessionControlInvariantError(\"Cancellation candidate turns changed while locking\");\n }\n // The outer command acquired every session and candidate turn in one UUID-\n // sorted call before the actor attempt. Repeat only those already-held locks\n // so this event-writing suffix retains a directly auditable lock contract;\n // this call must never discover or acquire a new row.\n const suffixLocks = await lockSessionEventWriteRows(db, {\n workspaceId: input.workspaceId,\n controlLock: \"already_locked\",\n workspaceLock: \"already_locked\",\n sessionIds: input.lockedSessions.map((session) => session.id),\n turnIds: input.candidateTurnIds,\n });\n if (\n suffixLocks.sessions.length !== input.lockedSessions.length ||\n suffixLocks.turns.length !== candidateTurnIdSet.size\n ) {\n throw new SessionControlInvariantError(\"Cancellation rows changed under canonical locks\");\n }\n const sessionIdSet = new Set(input.sessionIds);\n const rootSession = input.lockedSessions.find((session) => session.id === input.rootSessionId);\n if (!rootSession) {\n throw new SessionControlInvariantError(\n `Cancellation root ${input.rootSessionId} was not locked with its subtree`,\n );\n }\n const rootParentSession = rootSession.parentSessionId\n ? (input.lockedSessions.find((session) => session.id === rootSession.parentSessionId) ?? null)\n : null;\n const candidateTurnById = new Map(candidateTurns.map((turn) => [turn.id, turn]));\n const liveTurnIds = new Set(\n input.lockedSessions\n .filter((session) => session.activeTurnId !== null)\n .flatMap((session) => {\n const turn = session.activeTurnId ? candidateTurnById.get(session.activeTurnId) : undefined;\n if (turn?.activeAttemptId === null) return [];\n return turn ? [turn.id] : [];\n }),\n );\n const immediatelyCancelledTurns = candidateTurns.filter((turn) => !liveTurnIds.has(turn.id));\n const cancelledTurnsBySession = new Map<string, typeof immediatelyCancelledTurns>();\n for (const turn of immediatelyCancelledTurns) {\n const turns = cancelledTurnsBySession.get(turn.sessionId);\n if (turns) turns.push(turn);\n else cancelledTurnsBySession.set(turn.sessionId, [turn]);\n }\n const immediatelyCancelledTurnIds = immediatelyCancelledTurns.map((turn) => turn.id);\n const now = new Date();\n let cancelledHumanInputs: Array<{\n id: string;\n sessionId: string;\n turnId: string;\n turnGeneration: number;\n questions: (typeof schema.sessionHumanInputRequests.$inferSelect)[\"questions\"];\n }> = [];\n if (immediatelyCancelledTurnIds.length > 0) {\n await db\n .update(schema.sessionTurns)\n .set({\n status: \"cancelled\",\n activeAttemptId: null,\n cancelledBy: input.actor,\n cancelReason: input.reason ?? \"session_cancelled\",\n version: sql`${schema.sessionTurns.version} + 1`,\n finishedAt: now,\n updatedAt: now,\n })\n .where(inArray(schema.sessionTurns.id, immediatelyCancelledTurnIds));\n cancelledHumanInputs = await db\n .update(schema.sessionHumanInputRequests)\n .set({\n status: \"cancelled\",\n response: { outcome: \"cancelled\" },\n respondedBy: input.actor,\n respondedAt: now,\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.sessionHumanInputRequests.workspaceId, input.workspaceId),\n inArray(schema.sessionHumanInputRequests.turnId, immediatelyCancelledTurnIds),\n eq(schema.sessionHumanInputRequests.status, \"pending\"),\n ),\n )\n .returning({\n id: schema.sessionHumanInputRequests.id,\n sessionId: schema.sessionHumanInputRequests.sessionId,\n turnId: schema.sessionHumanInputRequests.turnId,\n turnGeneration: schema.sessionHumanInputRequests.turnGeneration,\n questions: schema.sessionHumanInputRequests.questions,\n });\n await db\n .update(schema.codexCapacityWaiters)\n .set({\n status: \"superseded\",\n lastWakeReason: \"session_cancelled\",\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.codexCapacityWaiters.workspaceId, input.workspaceId),\n inArray(schema.codexCapacityWaiters.blockedTurnId, immediatelyCancelledTurnIds),\n eq(schema.codexCapacityWaiters.status, \"waiting\"),\n ),\n );\n }\n const cancelledSystemUpdates = await db\n .update(schema.sessionSystemUpdates)\n .set({ state: \"cancelled\" })\n .where(\n and(\n eq(schema.sessionSystemUpdates.workspaceId, input.workspaceId),\n inArray(schema.sessionSystemUpdates.sessionId, input.sessionIds),\n eq(schema.sessionSystemUpdates.state, \"pending\"),\n ),\n )\n .returning({\n id: schema.sessionSystemUpdates.id,\n sessionId: schema.sessionSystemUpdates.sessionId,\n });\n const humanInputsByTurn = new Map<string, typeof cancelledHumanInputs>();\n for (const humanInput of cancelledHumanInputs) {\n const inputs = humanInputsByTurn.get(humanInput.turnId);\n if (inputs) inputs.push(humanInput);\n else humanInputsByTurn.set(humanInput.turnId, [humanInput]);\n }\n const systemUpdatesBySession = new Map<string, typeof cancelledSystemUpdates>();\n for (const update of cancelledSystemUpdates) {\n const updates = systemUpdatesBySession.get(update.sessionId);\n if (updates) updates.push(update);\n else systemUpdatesBySession.set(update.sessionId, [update]);\n }\n\n const affectedSessionEvents: Array<{\n sessionId: string;\n eventIds: string[];\n }> = [];\n for (const session of input.lockedSessions) {\n if (!sessionIdSet.has(session.id)) continue;\n let sequence = session.lastSequence + (session.id === input.rootSessionId ? 1 : 0);\n const cancelledTurns = cancelledTurnsBySession.get(session.id) ?? [];\n const preinsertedEvents: Array<{ id: string; sequence: number }> = [];\n const eventValues: SessionEventInsertWithPayload[] = [];\n for (const update of (systemUpdatesBySession.get(session.id) ?? []).sort((left, right) =>\n left.id.localeCompare(right.id),\n )) {\n eventValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n sequence: ++sequence,\n type: \"system.update.cancelled\",\n payload: { updateId: update.id, reason: \"session_cancelled\" },\n occurredAt: now,\n });\n }\n for (const turn of cancelledTurns) {\n const closedTools = await closePendingSessionToolCallsInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n turnId: turn.id,\n reason: \"session_cancelled\",\n sequence,\n now,\n });\n sequence = closedTools.sequence;\n preinsertedEvents.push(\n ...closedTools.events.map((event) => ({\n id: event.id,\n sequence: event.sequence,\n })),\n );\n for (const humanInput of (humanInputsByTurn.get(turn.id) ?? []).sort((left, right) =>\n left.id.localeCompare(right.id),\n )) {\n eventValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n sequence: ++sequence,\n type: \"user.humanInputResponse\",\n turnId: turn.id,\n turnGeneration: turn.executionGeneration,\n ...(turn.id === session.activeTurnId ? { turnAssociation: \"current\" as const } : {}),\n payload: {\n requestId: humanInput.id,\n response: { outcome: \"cancelled\" },\n },\n occurredAt: now,\n });\n }\n eventValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n sequence: ++sequence,\n type: \"turn.cancelled\",\n turnId: turn.id,\n turnGeneration: turn.executionGeneration,\n ...(turn.id === session.activeTurnId ? { turnAssociation: \"current\" as const } : {}),\n payload: {\n reason: input.reason ?? \"session_cancelled\",\n operationId: input.operationId,\n },\n occurredAt: now,\n });\n }\n if (session.status !== \"cancelled\") {\n eventValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n sequence: ++sequence,\n type: \"session.status.changed\",\n payload: {\n status: \"cancelled\",\n reason: input.reason ?? \"session_cancelled\",\n operationId: input.operationId,\n },\n occurredAt: now,\n });\n }\n const inserted =\n eventValues.length > 0\n ? await db\n .insert(schema.sessionEvents)\n .values(withLosslessContentWriteVersion(eventValues, \"payload\", \"payloadCodecVersion\"))\n .returning({\n id: schema.sessionEvents.id,\n sequence: schema.sessionEvents.sequence,\n type: schema.sessionEvents.type,\n turnId: schema.sessionEvents.turnId,\n payload: schema.sessionEvents.payload,\n })\n : [];\n const cancelledHumanInputsById = new Map(\n cancelledHumanInputs\n .filter((request) => request.sessionId === session.id)\n .map((request) => [request.id, request]),\n );\n for (const event of inserted) {\n if (event.type !== \"user.humanInputResponse\") continue;\n const payload = event.payload as { requestId?: unknown };\n const request =\n typeof payload.requestId === \"string\"\n ? cancelledHumanInputsById.get(payload.requestId)\n : null;\n if (!request) continue;\n await mirrorSessionRealtimeContextInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: session.id,\n sourceKind: \"human_input_response\",\n sourceId: event.id,\n turnId: event.turnId,\n channel: null,\n text: renderRealtimeHumanInputResponseContext({\n requestId: request.id,\n questions: request.questions,\n response: { outcome: \"cancelled\" },\n }),\n payload: {\n requestId: request.id,\n outcome: \"cancelled\",\n sourceEventId: event.id,\n },\n now,\n });\n }\n const liveTurnId =\n session.activeTurnId && liveTurnIds.has(session.activeTurnId) ? session.activeTurnId : null;\n await db\n .update(schema.sessions)\n .set({\n status: \"cancelled\",\n activeTurnId: liveTurnId,\n queueVersion: sql`${schema.sessions.queueVersion} + 1`,\n queueHeadPosition: 0,\n queueTailPosition: 0,\n lastSequence: sequence,\n updatedAt: now,\n })\n .where(\n and(eq(schema.sessions.workspaceId, input.workspaceId), eq(schema.sessions.id, session.id)),\n );\n const eventIds = [...preinsertedEvents, ...inserted]\n .sort((left, right) => left.sequence - right.sequence)\n .map((event) => event.id);\n if (session.id === input.rootSessionId) eventIds.unshift(input.rootControlEventId);\n if (eventIds.length > 0) affectedSessionEvents.push({ sessionId: session.id, eventIds });\n }\n await enqueueCancelledChildRequiresActionResolvedOutboxInTransaction(db, {\n workspaceId: input.workspaceId,\n rootSession,\n parentSession: rootParentSession,\n cancelledHumanInputs,\n });\n await enqueueCancelledChildOutboxInTransaction(db, {\n workspaceId: input.workspaceId,\n rootSession,\n parentSession: rootParentSession,\n });\n return {\n cancelledSessionCount: input.sessionIds.length,\n cancelledTurnCount: candidateTurns.length,\n affectedSessionEvents,\n };\n}\n\nexport async function mutateSessionControlInTransaction(\n db: SessionActivityDatabase,\n input: {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n actor: SessionCommandActor;\n operationKey: string;\n action: \"pause\" | \"resume\" | \"cancel\";\n reason?: string | null;\n expectedControlEtag?: string | null;\n /** Request-scoped callers bound the control prefix wait; lifecycle callers omit it. */\n controlLockTimeoutMs?: number;\n },\n): Promise<SessionControlMutationResult> {\n const workspace = await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\", {\n ...(input.controlLockTimeoutMs !== undefined\n ? { lockTimeoutMs: input.controlLockTimeoutMs }\n : {}),\n });\n const cancellationSubtree =\n input.action === \"cancel\"\n ? await loadSessionSubtreeIds(db, input.workspaceId, input.sessionId)\n : { sessionIds: [input.sessionId], rootParentSessionId: null };\n const cancellationSessionIds = cancellationSubtree.sessionIds;\n const cancellationTurnIds =\n input.action === \"cancel\"\n ? await loadCancellationTurnIds(db, input.workspaceId, cancellationSessionIds)\n : [];\n // A direct Pause of a child notifies its parent (child_paused) through the\n // outbox in this same commit, so the parent joins the UUID-ordered session\n // lock exactly like Cancel locks the root's surviving parent.\n const pauseParentSessionId =\n input.action === \"pause\" && childLifecycleNoticesEnabled()\n ? await loadParentSessionId(db, input.workspaceId, input.sessionId)\n : null;\n const lineageParentSessionId = cancellationSubtree.rootParentSessionId ?? pauseParentSessionId;\n const locks = await lockSessionEventWriteRows(db, {\n workspaceId: input.workspaceId,\n controlLock: \"already_locked\",\n sessionIds:\n input.actor.type === \"agent_attempt\"\n ? [\n input.actor.sessionId,\n ...cancellationSessionIds,\n ...(lineageParentSessionId ? [lineageParentSessionId] : []),\n ]\n : [...cancellationSessionIds, ...(lineageParentSessionId ? [lineageParentSessionId] : [])],\n turnIds:\n input.actor.type === \"agent_attempt\"\n ? [input.actor.turnId, ...cancellationTurnIds]\n : cancellationTurnIds,\n attemptIds: input.actor.type === \"agent_attempt\" ? [input.actor.attemptId] : [],\n });\n if (input.action === \"cancel\" || pauseParentSessionId !== null) {\n const rootSession = locks.sessions.find((session) => session.id === input.sessionId);\n if (!rootSession || rootSession.parentSessionId !== lineageParentSessionId) {\n throw new SessionControlInvariantError(\n `Session ${input.sessionId} parent changed while establishing ${input.action} locks`,\n );\n }\n }\n const hash = canonicalSessionCommandHash({\n action: input.action,\n reason: input.reason ?? null,\n expectedControlEtag: input.expectedControlEtag ?? null,\n });\n const reserved = await reserveSessionCommandReceipt(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actor: input.actor,\n action: `session.${input.action}`,\n targetSessionId: input.sessionId,\n targetTurnId: null,\n operationKey: input.operationKey,\n canonicalRequestHash: hash,\n });\n if (reserved.replay) {\n const storedOutcome = reserved.receipt.result.outcome;\n const unchanged =\n storedOutcome === \"unchanged\" && reserved.receipt.appliedControlRevision === null;\n if (!unchanged && reserved.receipt.appliedControlRevision === null) {\n throw new SessionControlInvariantError(\n \"Replayed session control receipt has no applied control revision\",\n );\n }\n const workspaceControlEventId = unchanged\n ? null\n : String(reserved.receipt.result.workspaceControlEventId ?? \"\");\n if (!unchanged && !workspaceControlEventId) {\n throw new SessionControlInvariantError(\"Replayed session control receipt has no event\");\n }\n const sessionControlEventId = unchanged ? null : String(reserved.receipt.result.eventId ?? \"\");\n if (!unchanged && !sessionControlEventId) {\n throw new SessionControlInvariantError(\n \"Replayed session control receipt has no session event\",\n );\n }\n const wakeCount = Number(reserved.receipt.result.wakeCount ?? 0);\n return {\n receipt: reserved.receipt,\n control: await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n workspaceControl: workspace,\n }),\n sessionControlEventId,\n workspaceControlEventId,\n interruptionCount: Number(reserved.receipt.result.interruptionCount ?? 0),\n backgroundCommandCount: Number(reserved.receipt.result.backgroundCommandCount ?? 0),\n wakeCount,\n cancelledSessionCount: Number(reserved.receipt.result.cancelledSessionCount ?? 0),\n cancelledTurnCount: Number(reserved.receipt.result.cancelledTurnCount ?? 0),\n affectedSessionEvents: Array.isArray(reserved.receipt.result.affectedSessionEvents)\n ? (reserved.receipt.result.affectedSessionEvents as Array<{\n sessionId: string;\n eventIds: string[];\n }>)\n : sessionControlEventId\n ? [{ sessionId: input.sessionId, eventIds: [sessionControlEventId] }]\n : [],\n workflowWake: await pendingSessionControlWorkflowWake(\n db,\n input.workspaceId,\n input.sessionId,\n wakeCount,\n ),\n outcome: \"replayed\",\n replay: true,\n };\n }\n if (input.actor.type === \"agent_attempt\") {\n await assertAgentCommandAuthorityInTransaction(db, {\n workspaceId: input.workspaceId,\n actor: input.actor,\n targetSessionId: input.sessionId,\n action: input.action === \"cancel\" ? \"pause\" : input.action,\n });\n }\n if (input.action === \"resume\") {\n await assertSessionBranchIsNotCancelled(db, input.workspaceId, input.sessionId);\n }\n const before = await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n workspaceControl: workspace,\n });\n if (input.expectedControlEtag && input.expectedControlEtag !== before.controlEtag) {\n throw new SessionControlConflictError();\n }\n\n if (input.action !== \"cancel\") {\n const targetSession = locks.sessions.find((session) => session.id === input.sessionId);\n if (!targetSession) {\n throw new SessionControlInvariantError(`Session ${input.sessionId} disappeared`);\n }\n const directPauseRevision = asSafeRevision(\n targetSession.directPauseRevision,\n \"direct pause revision\",\n );\n const changed =\n input.action === \"pause\"\n ? targetSession.directControlState !== \"paused\" ||\n directPauseRevision === null ||\n (await sessionPauseEffectsNeeded(db, {\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n directPauseRevision,\n }))\n : before.state === \"paused\" ||\n (await continuableWakeRepairNeeded(db, {\n workspaceId: input.workspaceId,\n rootSessionId: input.sessionId,\n }));\n if (!changed) {\n // Repeating Pause may repair a lost reconciliation wake without changing\n // control authority. The exact closed attempt still needs the existing\n // worker's Temporal and writer-set proof; this is never new turn work.\n const [quiescence] =\n input.action === \"pause\"\n ? await db.execute<{ needed: boolean }>(sql`\n select exists (\n select 1 from ${schema.sessionTurnAttempts} attempt\n where attempt.workspace_id = ${input.workspaceId}\n and attempt.session_id = ${input.sessionId}\n and attempt.state = 'closed'\n and attempt.quiesced_at is null\n and exists (\n select 1 from ${schema.sessionAttemptInterruptions} interruption\n where interruption.workspace_id = attempt.workspace_id\n and interruption.session_id = attempt.session_id\n and interruption.attempt_id = attempt.id\n and interruption.state in ('settled', 'rejected_stale')\n )\n ) as needed\n `)\n : [];\n const wakeCount = quiescence?.needed ? 1 : 0;\n if (wakeCount > 0) {\n await registerSessionWorkflowWakeInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n temporalWorkflowId: targetSession.temporalWorkflowId ?? `session-${input.sessionId}`,\n reason: \"session_pause_quiescence_reconciliation\",\n });\n }\n const receipt = await updateSessionCommandReceiptResult(db, reserved.receipt.id, {\n result: {\n outcome: \"unchanged\",\n interruptionCount: 0,\n backgroundCommandCount: 0,\n wakeCount,\n cancelledSessionCount: 0,\n cancelledTurnCount: 0,\n affectedSessionEvents: [],\n },\n });\n return {\n receipt,\n control: before,\n sessionControlEventId: null,\n workspaceControlEventId: null,\n interruptionCount: 0,\n backgroundCommandCount: 0,\n wakeCount,\n cancelledSessionCount: 0,\n cancelledTurnCount: 0,\n affectedSessionEvents: [],\n workflowWake: await pendingSessionControlWorkflowWake(\n db,\n input.workspaceId,\n input.sessionId,\n wakeCount,\n ),\n outcome: \"unchanged\",\n replay: false,\n };\n }\n }\n\n const targetSession = locks.sessions.find((session) => session.id === input.sessionId);\n if (!targetSession) {\n throw new SessionControlInvariantError(`Session ${input.sessionId} disappeared`);\n }\n\n const revision = nextRevision(workspace);\n await advanceWorkspaceRevision(db, input.workspaceId, revision);\n const updatedRows = await db\n .update(schema.sessions)\n .set(\n input.action === \"pause\" || input.action === \"cancel\"\n ? {\n directControlState: \"paused\",\n directPauseRevision: revision,\n controlVersion: revision,\n directControlReason: input.reason ?? null,\n directControlChangedBy:\n input.actor.type === \"agent_attempt\"\n ? `attempt:${input.actor.attemptId}`\n : input.actor.subjectId,\n directControlChangedAt: new Date(),\n updatedAt: new Date(),\n }\n : {\n directControlState: \"active\",\n directPauseRevision: null,\n subtreeRunOverrideRevision: revision,\n controlVersion: revision,\n directControlReason: input.reason ?? null,\n directControlChangedBy:\n input.actor.type === \"agent_attempt\"\n ? `attempt:${input.actor.attemptId}`\n : input.actor.subjectId,\n directControlChangedAt: new Date(),\n updatedAt: new Date(),\n },\n )\n .where(\n and(\n eq(schema.sessions.workspaceId, input.workspaceId),\n input.action === \"cancel\"\n ? inArray(schema.sessions.id, cancellationSessionIds)\n : eq(schema.sessions.id, input.sessionId),\n ),\n )\n .returning({ id: schema.sessions.id });\n const updated = updatedRows.find((row) => row.id === input.sessionId);\n if (!updated) throw new SessionControlInvariantError(`Session ${input.sessionId} disappeared`);\n\n const actor =\n input.actor.type === \"agent_attempt\"\n ? `attempt:${input.actor.attemptId}`\n : input.actor.subjectId;\n const backgroundCommandCount =\n input.action === \"pause\" || input.action === \"cancel\"\n ? await requestSessionBackgroundCommandCancellationsInTransaction(db, {\n workspaceId: input.workspaceId,\n rootSessionIds: [input.sessionId],\n subjectId: actor,\n })\n : 0;\n const workspaceControlEventId = await insertWorkspaceControlEventInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n revision,\n scope: \"session\",\n rootSessionId: input.sessionId,\n action: input.action === \"cancel\" ? \"pause\" : input.action,\n automatic: false,\n reason: input.reason ?? null,\n actor,\n });\n\n const interruptionCount =\n input.action === \"pause\" || input.action === \"cancel\"\n ? await interruptDescendantAttempts(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n operationId: reserved.receipt.id,\n kind: \"session_pause\",\n controlRevision: revision,\n })\n : 0;\n const wakeCount =\n input.action === \"cancel\"\n ? await registerCancellationWakes(db, {\n workspaceId: input.workspaceId,\n sessionIds: cancellationSessionIds,\n })\n : input.action === \"pause\"\n ? await registerInterruptionWakes(db, {\n operationId: reserved.receipt.id,\n reason: \"session_pause_interruption\",\n })\n : await registerDescendantWakes(db, {\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n reason: \"session_resume\",\n });\n const [controlEvent] = await db\n .insert(schema.sessionEvents)\n .values(\n withLosslessContentWriteVersion(\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n sequence: targetSession.lastSequence + 1,\n type:\n input.action === \"pause\" || input.action === \"cancel\"\n ? \"session.control.paused\"\n : \"session.control.resumed\",\n payload: {\n operationId: reserved.receipt.id,\n revision,\n actor,\n ...(input.reason ? { reason: input.reason } : {}),\n ...(input.action === \"cancel\" ? { terminal: true } : {}),\n interruptionCount,\n },\n occurredAt: new Date(),\n },\n \"payload\",\n \"payloadCodecVersion\",\n ),\n )\n .returning({ id: schema.sessionEvents.id });\n if (!controlEvent)\n throw new SessionControlInvariantError(\"Session control event was not inserted\");\n await db\n .update(schema.sessions)\n .set({ lastSequence: targetSession.lastSequence + 1, updatedAt: new Date() })\n .where(eq(schema.sessions.id, input.sessionId));\n await db.insert(schema.auditEvents).values(\n withLosslessContentWriteVersion(\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: actor,\n action: `session.control.${input.action}`,\n targetType: \"session\",\n targetId: input.sessionId,\n metadata: {\n operationId: reserved.receipt.id,\n revision,\n interruptionCount,\n ...(input.actor.type === \"agent_attempt\"\n ? {\n callerSessionId: input.actor.sessionId,\n callerTurnId: input.actor.turnId,\n callerAttemptId: input.actor.attemptId,\n callerExecutionGeneration: input.actor.executionGeneration,\n }\n : {}),\n },\n },\n \"metadata\",\n \"metadataCodecVersion\",\n ),\n );\n const cancellation =\n input.action === \"cancel\"\n ? await cancelSessionSubtreeInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n rootSessionId: input.sessionId,\n sessionIds: cancellationSessionIds,\n lockedSessions: locks.sessions,\n candidateTurnIds: cancellationTurnIds,\n lockedTurns: locks.turns,\n actor,\n reason: input.reason ?? null,\n operationId: reserved.receipt.id,\n rootControlEventId: controlEvent.id,\n })\n : {\n cancelledSessionCount: 0,\n cancelledTurnCount: 0,\n affectedSessionEvents: [{ sessionId: input.sessionId, eventIds: [controlEvent.id] }],\n };\n if (input.action === \"pause\" && pauseParentSessionId !== null) {\n // Direct Pause only (a recursive ancestor pause never reaches this command\n // for the child), and never when the parent's own live attempt issued it:\n // that parent already knows. Human/API pauses are action-required for the\n // parent; an agent pause is informational.\n const pausedSession = locks.sessions.find((session) => session.id === input.sessionId);\n const parentSession = locks.sessions.find((session) => session.id === pauseParentSessionId);\n const issuedByParentAttempt =\n input.actor.type === \"agent_attempt\" && input.actor.sessionId === pauseParentSessionId;\n if (pausedSession && parentSession && !issuedByParentAttempt) {\n await enqueueChildPausedOutboxInTransaction(db, {\n workspaceId: input.workspaceId,\n childSession: pausedSession,\n parentSession,\n operationId: reserved.receipt.id,\n actorKind:\n input.actor.type === \"agent_attempt\"\n ? \"agent\"\n : input.actor.type === \"service\"\n ? \"api\"\n : \"human\",\n reason: input.reason ?? null,\n });\n }\n }\n const receipt = await updateSessionCommandReceiptResult(db, reserved.receipt.id, {\n controlRevision: revision,\n result: {\n outcome: \"changed\",\n interruptionCount,\n backgroundCommandCount,\n wakeCount,\n eventId: controlEvent.id,\n workspaceControlEventId,\n cancelledSessionCount: cancellation.cancelledSessionCount,\n cancelledTurnCount: cancellation.cancelledTurnCount,\n affectedSessionEvents: cancellation.affectedSessionEvents,\n },\n });\n const control = await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n lock: \"share\",\n });\n return {\n receipt,\n control,\n sessionControlEventId: controlEvent.id,\n workspaceControlEventId,\n interruptionCount,\n backgroundCommandCount,\n wakeCount,\n cancelledSessionCount: cancellation.cancelledSessionCount,\n cancelledTurnCount: cancellation.cancelledTurnCount,\n affectedSessionEvents: cancellation.affectedSessionEvents,\n workflowWake: await pendingSessionControlWorkflowWake(\n db,\n input.workspaceId,\n input.sessionId,\n wakeCount,\n ),\n outcome: \"changed\",\n replay: false,\n };\n}\n\nexport async function autoResumeSessionBranchInTransaction(\n db: SessionActivityDatabase,\n input: {\n workspaceId: string;\n sessionId: string;\n actor: string;\n reason: \"human_steer\" | \"service_steer\" | \"agent_steer\";\n observedControlEtag?: string | null;\n /**\n * The admission prefix the caller already holds. A `share` admission\n * proves the branch was active under a lock that excludes every control\n * mutation, so it never needs to resume; only an `update` admission may\n * advance the workspace revision here.\n */\n admission?: WorkspaceControlAdmissionLock;\n },\n): Promise<{\n revision: number;\n control: EffectiveSessionControl;\n changed: boolean;\n workspaceControlEventId: string | null;\n}> {\n const workspace =\n input.admission?.control ??\n (await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\"));\n await assertSessionBranchIsNotCancelled(db, input.workspaceId, input.sessionId);\n const before = await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n workspaceControl: workspace,\n });\n if (input.observedControlEtag && input.observedControlEtag !== before.controlEtag) {\n throw new SessionControlConflictError();\n }\n if (before.state === \"active\") {\n return {\n revision: asSafeRevision(workspace.revision, \"workspace control revision\")!,\n control: before,\n changed: false,\n workspaceControlEventId: null,\n };\n }\n if (input.admission?.mode === \"share\") {\n // Impossible by construction: the shared prefix observed an active branch\n // and excludes every control mutation until this transaction ends.\n throw new SessionControlInvariantError(\n `Session ${input.sessionId} became paused under a shared workspace control lock`,\n );\n }\n const revision = nextRevision(workspace);\n await advanceWorkspaceRevision(db, input.workspaceId, revision);\n await db\n .update(schema.sessions)\n .set({\n directControlState: \"active\",\n directPauseRevision: null,\n subtreeRunOverrideRevision: revision,\n controlVersion: revision,\n directControlReason: input.reason,\n directControlChangedBy: input.actor,\n directControlChangedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.sessions.workspaceId, input.workspaceId),\n eq(schema.sessions.id, input.sessionId),\n ),\n );\n const workspaceControlEventId = await insertWorkspaceControlEventInTransaction(db, {\n accountId: workspace.accountId,\n workspaceId: input.workspaceId,\n revision,\n scope: \"session\",\n rootSessionId: input.sessionId,\n action: \"resume\",\n automatic: true,\n reason: input.reason,\n actor: input.actor,\n });\n return {\n revision,\n control: await evaluateSessionControl(db, input.workspaceId, input.sessionId, {\n lock: \"share\",\n }),\n changed: true,\n workspaceControlEventId,\n };\n}\n\nexport type WorkspaceControlMutationResult = {\n receipt: SessionCommandReceiptRow;\n revision: number;\n workspaceControlEventId: string | null;\n workspaceState: EffectiveControlState;\n interruptionCount: number;\n backgroundCommandCount: number;\n wakeCount: number;\n outcome: \"changed\" | \"unchanged\" | \"replayed\";\n replay: boolean;\n};\n\nexport async function mutateWorkspaceControlInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n actor: SessionCommandActor;\n operationKey: string;\n action: \"pause\" | \"resume\";\n reason?: string | null;\n /** Internal timer executor retains/replaces its own timer atomically. */\n timerExecution?: boolean;\n expectedRevision?: number | null;\n /** Request-scoped callers bound the control prefix wait; lifecycle callers omit it. */\n controlLockTimeoutMs?: number;\n },\n): Promise<WorkspaceControlMutationResult> {\n const workspace = await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\", {\n ...(input.controlLockTimeoutMs !== undefined\n ? { lockTimeoutMs: input.controlLockTimeoutMs }\n : {}),\n });\n const currentRevision = asSafeRevision(workspace.revision, \"workspace control revision\")!;\n const hash = canonicalSessionCommandHash({\n action: input.action,\n reason: input.reason ?? null,\n expectedRevision: input.expectedRevision ?? null,\n });\n const reserved = await reserveSessionCommandReceipt(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actor: input.actor,\n action: `workspace.${input.action}`,\n targetSessionId: null,\n targetTurnId: null,\n operationKey: input.operationKey,\n canonicalRequestHash: hash,\n });\n if (reserved.replay) {\n const storedOutcome = reserved.receipt.result.outcome;\n const unchanged =\n storedOutcome === \"unchanged\" && reserved.receipt.appliedControlRevision === null;\n if (!unchanged && reserved.receipt.appliedControlRevision === null) {\n throw new SessionControlInvariantError(\n \"Replayed workspace control receipt has no applied control revision\",\n );\n }\n const workspaceControlEventId = unchanged\n ? null\n : String(reserved.receipt.result.workspaceControlEventId ?? \"\");\n if (!unchanged && !workspaceControlEventId) {\n throw new SessionControlInvariantError(\"Replayed workspace control receipt has no event\");\n }\n return {\n receipt: reserved.receipt,\n revision:\n reserved.receipt.appliedControlRevision === null\n ? currentRevision\n : Number(reserved.receipt.appliedControlRevision),\n workspaceControlEventId: workspaceControlEventId || null,\n workspaceState: workspace.workspaceState === \"paused\" ? \"paused\" : \"active\",\n interruptionCount: Number(reserved.receipt.result.interruptionCount ?? 0),\n backgroundCommandCount: Number(reserved.receipt.result.backgroundCommandCount ?? 0),\n wakeCount: Number(reserved.receipt.result.wakeCount ?? 0),\n outcome: \"replayed\",\n replay: true,\n };\n }\n if (input.expectedRevision !== null && input.expectedRevision !== undefined) {\n if (input.expectedRevision !== currentRevision) throw new SessionControlConflictError();\n }\n\n const workspacePauseRevision = asSafeRevision(\n workspace.workspacePauseRevision,\n \"workspace pause revision\",\n );\n const changed =\n (!input.timerExecution && workspace.timerId != null) ||\n (input.action === \"pause\"\n ? workspace.workspaceState !== \"paused\" ||\n workspacePauseRevision === null ||\n (await workspacePauseEffectsNeeded(db, {\n workspaceId: input.workspaceId,\n workspacePauseRevision,\n }))\n : workspace.workspaceState !== \"active\" ||\n (await continuableWakeRepairNeeded(db, {\n workspaceId: input.workspaceId,\n rootSessionId: null,\n })));\n if (!changed) {\n const receipt = await updateSessionCommandReceiptResult(db, reserved.receipt.id, {\n result: {\n outcome: \"unchanged\",\n interruptionCount: 0,\n backgroundCommandCount: 0,\n wakeCount: 0,\n },\n });\n return {\n receipt,\n revision: currentRevision,\n workspaceControlEventId: null,\n workspaceState: workspace.workspaceState === \"paused\" ? \"paused\" : \"active\",\n interruptionCount: 0,\n backgroundCommandCount: 0,\n wakeCount: 0,\n outcome: \"unchanged\",\n replay: false,\n };\n }\n\n const revision = nextRevision(workspace);\n const actor =\n input.actor.type === \"agent_attempt\"\n ? `attempt:${input.actor.attemptId}`\n : input.actor.subjectId;\n const backgroundCommandCount =\n input.action === \"pause\"\n ? await requestWorkspaceBackgroundCommandCancellationsInTransaction(db, {\n workspaceId: input.workspaceId,\n subjectId: actor,\n })\n : 0;\n const [updated] = await db\n .update(schema.workspaceInferenceControls)\n .set({\n ...(!input.timerExecution ? clearWorkspaceTimerFields : {}),\n revision,\n workspaceState: input.action === \"pause\" ? \"paused\" : \"active\",\n workspacePauseRevision: input.action === \"pause\" ? revision : null,\n reason: input.reason ?? null,\n changedBy: actor,\n changedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.workspaceInferenceControls.workspaceId, input.workspaceId),\n eq(schema.workspaceInferenceControls.revision, currentRevision),\n ),\n )\n .returning({ workspaceId: schema.workspaceInferenceControls.workspaceId });\n if (!updated) {\n throw new SessionControlInvariantError(\"Workspace control did not mutate exactly once\");\n }\n const workspaceControlEventId = await insertWorkspaceControlEventInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n revision,\n scope: \"workspace\",\n rootSessionId: null,\n action: input.action,\n automatic: input.timerExecution === true,\n reason: input.reason ?? null,\n actor,\n });\n const interruptionCount =\n input.action === \"pause\"\n ? await interruptWorkspaceAttempts(db, {\n workspaceId: input.workspaceId,\n operationId: reserved.receipt.id,\n controlRevision: revision,\n })\n : 0;\n const wakeCount =\n input.action === \"pause\"\n ? await registerInterruptionWakes(db, {\n operationId: reserved.receipt.id,\n reason: \"workspace_pause_interruption\",\n })\n : await registerWorkspaceWakes(db, {\n workspaceId: input.workspaceId,\n reason: \"workspace_resume\",\n });\n const receipt = await updateSessionCommandReceiptResult(db, reserved.receipt.id, {\n controlRevision: revision,\n result: {\n outcome: \"changed\",\n interruptionCount,\n backgroundCommandCount,\n wakeCount,\n workspaceControlEventId,\n },\n });\n return {\n receipt,\n revision,\n workspaceControlEventId,\n workspaceState: input.action === \"pause\" ? \"paused\" : \"active\",\n interruptionCount,\n backgroundCommandCount,\n wakeCount,\n outcome: \"changed\",\n replay: false,\n };\n}\n\nasync function insertWorkspaceControlEventInTransaction(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n revision: number;\n scope: \"workspace\" | \"session\";\n rootSessionId: string | null;\n action: \"pause\" | \"resume\" | \"timer_set\" | \"timer_cancelled\";\n automatic: boolean;\n reason: string | null;\n actor: string;\n },\n): Promise<string> {\n const projected = boundWorkspaceControlEvent(\n {\n id: crypto.randomUUID(),\n workspaceId: input.workspaceId,\n sequence: input.revision,\n revision: input.revision,\n type: \"workspace.control.changed\",\n scope: input.scope,\n rootSessionId: input.rootSessionId,\n action: input.action,\n automatic: input.automatic,\n reason: input.reason,\n actor: input.actor,\n occurredAt: new Date(0).toISOString(),\n },\n { surface: \"durable_control\" },\n );\n const field = (name: \"reason\" | \"actor\") =>\n projected.truncation?.fields.find((candidate) => candidate.field === name);\n const [event] = await db\n .insert(schema.workspaceControlEvents)\n .values({\n ...input,\n reason: projected.reason,\n reasonOriginalBytes:\n input.reason === null\n ? null\n : (field(\"reason\")?.originalBytes ?? workspaceControlUtf8Bytes(projected.reason!)),\n actor: projected.actor,\n actorOriginalBytes:\n field(\"actor\")?.originalBytes ?? workspaceControlUtf8Bytes(projected.actor),\n })\n .returning({ id: schema.workspaceControlEvents.id });\n if (!event) {\n throw new SessionControlInvariantError(\"Workspace control event was not inserted\");\n }\n return event.id;\n}\n\nexport class WorkspacePauseTimerInputError extends Error {}\n\nconst clearWorkspaceTimerFields = {\n timerId: null,\n timerAction: null,\n timerDueAt: null,\n timerPauseForSeconds: null,\n timerPauseRevision: null,\n};\n\n/** Called under workspace RLS. The same control fence serializes timers and human actions. */\nexport async function setWorkspacePauseTimerInTransaction(\n db: Database,\n input: WorkspacePauseTimerRequest & { accountId: string; workspaceId: string; subjectId: string },\n): Promise<{ workspaceControlEventId: string | null }> {\n let workspace = await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\", {\n lockTimeoutMs: workspaceControlRequestLockTimeoutMs(),\n });\n const reserved = await reserveSessionCommandReceipt(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actor: { type: \"human\", subjectId: input.subjectId },\n action: `workspace.timer.${input.action}`,\n targetSessionId: null,\n targetTurnId: null,\n operationKey: input.clientEventId,\n canonicalRequestHash: canonicalSessionCommandHash({\n action: input.action,\n pauseInSeconds: input.pauseInSeconds ?? 0,\n pauseForSeconds: input.pauseForSeconds ?? null,\n expectedRevision: input.expectedRevision,\n }),\n });\n if (reserved.replay)\n return {\n workspaceControlEventId:\n (reserved.receipt.result.workspaceControlEventId as string | null) ?? null,\n };\n if (Number(workspace.revision) !== input.expectedRevision)\n throw new SessionControlConflictError();\n let action: \"pause\" | \"resume\" = \"pause\";\n let delay = input.pauseInSeconds ?? 0;\n let pauseRevision: number | null = null;\n if (input.action === \"set\") {\n if (workspace.workspaceState === \"paused\") {\n if (delay !== 0 || input.pauseForSeconds == null) {\n throw new WorkspacePauseTimerInputError(\"A paused workspace requires a resume duration\");\n }\n action = \"resume\";\n delay = input.pauseForSeconds;\n pauseRevision = Number(workspace.workspacePauseRevision);\n } else if (delay === 0) {\n await mutateWorkspaceControlInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actor: { type: \"human\", subjectId: input.subjectId },\n operationKey: `timer-pause:${reserved.receipt.id}`,\n action: \"pause\",\n });\n workspace = await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\");\n action = \"resume\";\n delay = input.pauseForSeconds ?? 0;\n pauseRevision = Number(workspace.workspacePauseRevision);\n }\n }\n const hasTimer = input.action === \"set\" && delay > 0;\n const [clock] = await db.execute<{ now: Date }>(sql`select clock_timestamp() as now`);\n const revision = nextRevision(workspace);\n await db\n .update(schema.workspaceInferenceControls)\n .set({\n ...clearWorkspaceTimerFields,\n ...(hasTimer\n ? {\n timerId: reserved.receipt.id,\n timerAction: action,\n timerDueAt: new Date(new Date(clock!.now).getTime() + delay * 1000),\n timerPauseForSeconds: action === \"pause\" ? (input.pauseForSeconds ?? null) : null,\n timerPauseRevision: pauseRevision,\n }\n : {}),\n revision,\n updatedAt: new Date(clock!.now),\n })\n .where(eq(schema.workspaceInferenceControls.workspaceId, input.workspaceId));\n const workspaceControlEventId = await insertWorkspaceControlEventInTransaction(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n revision,\n scope: \"workspace\",\n rootSessionId: null,\n action: hasTimer ? \"timer_set\" : \"timer_cancelled\",\n automatic: false,\n reason: null,\n actor: input.subjectId,\n });\n await updateSessionCommandReceiptResult(db, reserved.receipt.id, {\n controlRevision: revision,\n result: { workspaceControlEventId },\n });\n return { workspaceControlEventId };\n}\n\n/** Discovery is a hint. Identity, deadline and pause ownership are rechecked under the fence. */\nexport async function fireWorkspacePauseTimerInTransaction(\n db: Database,\n input: { workspaceId: string; timerId: string },\n): Promise<{ workspaceControlEventId: string | null; wakeCount: number } | null> {\n const workspace = await lockWorkspaceInferenceControl(db, input.workspaceId, \"update\", {\n lockTimeoutMs: 1000,\n });\n const [clock] = await db.execute<{ now: Date }>(sql`select clock_timestamp() as now`);\n if (\n workspace.timerId !== input.timerId ||\n !workspace.timerDueAt ||\n new Date(workspace.timerDueAt).getTime() > new Date(clock!.now).getTime()\n )\n return null;\n const action = workspace.timerAction as \"pause\" | \"resume\";\n // A superseding pause must never be undone by an old timer, even across rolling upgrades.\n if (\n action === \"resume\" &&\n (workspace.workspaceState !== \"paused\" ||\n Number(workspace.workspacePauseRevision) !== Number(workspace.timerPauseRevision))\n ) {\n await db\n .update(schema.workspaceInferenceControls)\n .set(clearWorkspaceTimerFields)\n .where(eq(schema.workspaceInferenceControls.workspaceId, input.workspaceId));\n return null;\n }\n const result = await mutateWorkspaceControlInTransaction(db, {\n accountId: workspace.accountId,\n workspaceId: input.workspaceId,\n actor: { type: \"service\", subjectId: \"service:workspace-pause-timer\" },\n operationKey: `timer:${input.timerId}:${action}`,\n action,\n timerExecution: true,\n });\n // Use application time only for display elsewhere; deadlines are database-clock based.\n const [applied] = await db.execute<{ now: Date }>(sql`select clock_timestamp() as now`);\n await db\n .update(schema.workspaceInferenceControls)\n .set({\n ...clearWorkspaceTimerFields,\n ...(action === \"pause\" && workspace.timerPauseForSeconds !== null\n ? {\n timerId: input.timerId,\n timerAction: \"resume\",\n timerDueAt: new Date(\n new Date(applied!.now).getTime() + workspace.timerPauseForSeconds * 1000,\n ),\n timerPauseRevision: result.revision,\n }\n : {}),\n })\n .where(eq(schema.workspaceInferenceControls.workspaceId, input.workspaceId));\n return result;\n}\n","import { sql } from \"drizzle-orm\";\nimport { stableJson, type ScheduledTask } from \"@opengeni/contracts\";\nimport { ExternalLinkWorkSnapshot } from \"@opengeni/contracts/external-identities\";\nimport { rawRows, withWorkspaceRls, withWorkspaceSubjectRls, type Database } from \"./database\";\nimport { ensureExternalIdentity } from \"./external-identities\";\nimport { resolveExternalIdentityLink } from \"./external-identity-links\";\nimport { nestedPostgresSqlState } from \"./persistence-errors\";\n\ntype Scope = { accountId: string; workspaceId: string };\ntype Source =\n | { kind: \"direct\" }\n | { kind: \"causal\" | \"child\"; turnId: string }\n | { kind: \"scheduled\"; taskId: string; taskRevision: number };\n\n/** Does not consult or resurrect the key used at creation. Its immutable\n * permission ceiling is already captured; membership/link revocation is live. */\nexport async function externalLinkWorkSnapshotIsLive(db: Database, raw: unknown): Promise<boolean> {\n const snapshot = ExternalLinkWorkSnapshot.parse(raw);\n try {\n const identity = await ensureExternalIdentity(db, {\n accountId: snapshot.actor.accountId,\n ...snapshot.identity,\n });\n if (\n identity.id !== snapshot.actor.externalIdentityId ||\n identity.subjectId !== snapshot.actor.externalSubjectId ||\n identity.authorizationRevision !== snapshot.actor.externalAuthorizationRevision\n )\n return false;\n const resolved = await resolveExternalIdentityLink(db, {\n identity,\n linkId: snapshot.actor.linkId!,\n expectedRevision: snapshot.actor.linkRevision!,\n });\n return (\n resolved !== null &&\n resolved.link.nativeSubjectId === snapshot.actor.effectiveSubjectId &&\n snapshot.permissions.every(\n (permission) =>\n resolved.link.permissions.includes(permission) ||\n (permission !== \"secrets:read\" && resolved.link.permissions.includes(\"workspace:admin\")),\n )\n );\n } catch (error) {\n if (nestedPostgresSqlState(error) === \"42501\") return false;\n throw error;\n }\n}\n\nexport async function getExternalLinkTurnSnapshot(\n db: Database,\n scope: Scope,\n turnId: string,\n): Promise<ExternalLinkWorkSnapshot | null> {\n return withWorkspaceRls(db, scope.workspaceId, async (tx) => {\n const [row] = await rawRows<{ canonical_snapshot: unknown }>(\n tx,\n sql`select canonical_snapshot\n from external_link_turn_authorities where account_id = ${scope.accountId}::uuid\n and workspace_id = ${scope.workspaceId}::uuid and turn_id = ${turnId}::uuid`,\n );\n return row ? ExternalLinkWorkSnapshot.parse(row.canonical_snapshot) : null;\n });\n}\n\n/** null is an ordinary native/external turn; a revoked linked turn is false,\n * never null. Callers must not fall back to unlinked authority after denial. */\nexport async function getExternalLinkTurnAuthorization(db: Database, scope: Scope, turnId: string) {\n const snapshot = await getExternalLinkTurnSnapshot(db, scope, turnId);\n if (!snapshot) return null;\n return {\n authorized: await externalLinkWorkSnapshotIsLive(db, snapshot),\n permissions: snapshot.permissions,\n };\n}\n\nexport async function captureExternalLinkTurnAuthority(\n db: Database,\n input: Scope & {\n sessionId: string;\n turnId: string;\n snapshot: ExternalLinkWorkSnapshot;\n source?: Source;\n },\n): Promise<void> {\n const snapshot = ExternalLinkWorkSnapshot.parse(input.snapshot);\n const source = input.source ?? { kind: \"direct\" };\n if (snapshot.actor.accountId !== input.accountId)\n throw new Error(\"Linked turn organization mismatch\");\n if (source.kind === \"direct\" && !(await externalLinkWorkSnapshotIsLive(db, snapshot)))\n throw new Error(\"Linked turn authority revoked\");\n await withWorkspaceSubjectRls(\n db,\n input.workspaceId,\n snapshot.actor.effectiveSubjectId,\n async (tx) => {\n const existing = await getExternalLinkTurnSnapshot(tx, input, input.turnId);\n if (existing) {\n if (stableJson(existing) !== stableJson(snapshot))\n throw new Error(\"Linked turn replay changed authority\");\n return;\n }\n await tx.execute(sql`insert into external_link_turn_authorities\n (turn_id, account_id, workspace_id, session_id, link_id, link_revision, canonical_snapshot,\n source_kind, source_turn_id, source_task_id, source_task_revision)\n values (${input.turnId}::uuid, ${input.accountId}::uuid, ${input.workspaceId}::uuid, ${input.sessionId}::uuid,\n ${snapshot.actor.linkId}::uuid, ${snapshot.actor.linkRevision}, ${JSON.stringify(snapshot)}::jsonb, ${source.kind},\n ${source.kind === \"causal\" || source.kind === \"child\" ? source.turnId : null}::uuid,\n ${source.kind === \"scheduled\" ? source.taskId : null}::uuid,\n ${source.kind === \"scheduled\" ? source.taskRevision : null})`);\n },\n );\n}\n\nexport async function inheritExternalLinkTurnAuthority(\n db: Database,\n input: Scope & {\n sessionId: string;\n turnId: string;\n sourceTurnId: string;\n kind: \"causal\" | \"child\";\n },\n): Promise<void> {\n const snapshot = await getExternalLinkTurnSnapshot(db, input, input.sourceTurnId);\n if (!snapshot) return;\n // Copy even after revocation. The worker denies the copied lane; dropping it\n // would let an old linked continuation execute as an unrestricted native user.\n await captureExternalLinkTurnAuthority(db, {\n ...input,\n snapshot,\n source: { kind: input.kind, turnId: input.sourceTurnId },\n });\n}\n\nexport async function getExternalLinkTaskSnapshot(\n db: Database,\n input: Scope & {\n taskId: string;\n taskRevision: number;\n },\n): Promise<ExternalLinkWorkSnapshot | null> {\n return withWorkspaceRls(db, input.workspaceId, async (tx) => {\n const [row] = await rawRows<{ canonical_snapshot: unknown }>(\n tx,\n sql`select canonical_snapshot\n from external_link_task_authorities where account_id = ${input.accountId}::uuid\n and workspace_id = ${input.workspaceId}::uuid and task_id = ${input.taskId}::uuid and task_revision = ${input.taskRevision}`,\n );\n return row ? ExternalLinkWorkSnapshot.parse(row.canonical_snapshot) : null;\n });\n}\n\nexport async function captureExternalLinkTaskAuthority(\n db: Database,\n task: ScheduledTask,\n raw: ExternalLinkWorkSnapshot,\n): Promise<void> {\n const snapshot = ExternalLinkWorkSnapshot.parse(raw);\n if (task.accountId !== snapshot.actor.accountId)\n throw new Error(\"Linked task organization mismatch\");\n await withWorkspaceSubjectRls(\n db,\n task.workspaceId,\n snapshot.actor.effectiveSubjectId,\n async (tx) => {\n const existing = await getExternalLinkTaskSnapshot(tx, {\n ...task,\n taskId: task.id,\n taskRevision: task.authorityRevision,\n });\n if (existing) {\n if (stableJson(existing) !== stableJson(snapshot))\n throw new Error(\"Linked task replay changed authority\");\n return;\n }\n await tx.execute(sql`insert into external_link_task_authorities\n (task_id, task_revision, account_id, workspace_id, link_id, link_revision, canonical_snapshot)\n values (${task.id}::uuid, ${task.authorityRevision}, ${task.accountId}::uuid, ${task.workspaceId}::uuid,\n ${snapshot.actor.linkId}::uuid, ${snapshot.actor.linkRevision}, ${JSON.stringify(snapshot)}::jsonb)`);\n },\n );\n}\n\nexport async function cloneExternalLinkTaskAuthority(\n db: Database,\n task: ScheduledTask,\n sourceRevision: number,\n): Promise<void> {\n if (task.authorityRevision === sourceRevision) return;\n const snapshot = await getExternalLinkTaskSnapshot(db, {\n ...task,\n taskId: task.id,\n taskRevision: sourceRevision,\n });\n if (snapshot) await captureExternalLinkTaskAuthority(db, task, snapshot);\n}\n\nexport async function captureScheduledExternalLinkTurnAuthority(\n db: Database,\n input: Scope & {\n sessionId: string;\n turnId: string;\n runId: string;\n },\n): Promise<void> {\n const run = await withWorkspaceRls(db, input.workspaceId, async (tx) => {\n const [row] = await rawRows<{ task_id: string; task_authority_revision: number | string }>(\n tx,\n sql`select task_id, task_authority_revision from scheduled_task_runs\n where account_id = ${input.accountId}::uuid and workspace_id = ${input.workspaceId}::uuid\n and session_id = ${input.sessionId}::uuid and id = ${input.runId}::uuid`,\n );\n return row;\n });\n if (!run) throw new Error(\"Linked schedule run unavailable\");\n const taskRevision = Number(run.task_authority_revision);\n const snapshot = await getExternalLinkTaskSnapshot(db, {\n ...input,\n taskId: run.task_id,\n taskRevision,\n });\n if (snapshot)\n await captureExternalLinkTurnAuthority(db, {\n ...input,\n snapshot,\n source: { kind: \"scheduled\", taskId: run.task_id, taskRevision },\n });\n}\n","import { sql } from \"drizzle-orm\";\nimport { Permission } from \"@opengeni/contracts\";\nimport {\n ExternalIdentity,\n ExternalIdentityReference,\n} from \"@opengeni/contracts/external-identities\";\nimport { rawRows, withAccountRls, type Database } from \"./database\";\n\n/** Pass an open transaction to retain the key lock through the protected write. */\nexport async function lockActiveExternalOrganizationKey(\n tx: Database,\n accountId: string,\n keyId: string,\n): Promise<Permission[] | null> {\n return withAccountRls(tx, accountId, async (scoped) => {\n const [row] = await rawRows<{ permissions: unknown }>(\n scoped,\n sql`select permissions from api_keys\n where account_id = ${accountId}::uuid and id = ${keyId}::uuid\n and workspace_id is null and credential_kind = 'organization'\n and revoked_at is null and (expires_at is null or expires_at > clock_timestamp()) for share`,\n );\n return row ? Permission.array().parse(row.permissions) : null;\n });\n}\n\n/** Transaction-local fence shared with organization member lifecycle writers.\n * Caller must pass an open transaction, not a pool-level database handle. */\nexport async function lockExternalWorkspaceMembershipLifecycle(\n tx: Database,\n accountId: string,\n): Promise<void> {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtextextended(${`organization-membership:${accountId}`}, 0))`,\n );\n}\n\n/** Internal lifecycle seam. Caller must authenticate an organization key and\n * establish its exact account before invoking; this does not admit HTTP users.\n * It never creates shared-workspace membership or reactivates removed users. */\nexport async function ensureExternalIdentity(\n db: Database,\n input: {\n accountId: string;\n externalId: string;\n source?: string;\n },\n): Promise<ExternalIdentity> {\n const accountId = input.accountId;\n const reference = ExternalIdentityReference.parse({\n externalId: input.externalId,\n source: input.source,\n });\n return withAccountRls(db, accountId, async (tx) => {\n const [row] = await rawRows<{ result: unknown }>(\n tx,\n sql`select ensure_external_identity(\n ${accountId}::uuid, ${reference.source}, ${reference.externalId}) as result`,\n );\n const result = ExternalIdentity.parse(row?.result);\n if (\n result.accountId !== accountId ||\n result.source !== reference.source ||\n result.externalId !== reference.externalId\n ) {\n throw new Error(\"External identity scope mismatch\");\n }\n return result;\n });\n}\n","import { createHash, randomBytes, randomUUID } from \"node:crypto\";\nimport { sql } from \"drizzle-orm\";\nimport {\n BeginExternalIdentityLinkRequest,\n BeginExternalIdentityLinkResponse,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLink,\n ExternalIdentityLinkPage,\n ExternalIdentityReference,\n type ExternalIdentity,\n} from \"@opengeni/contracts/external-identities\";\nimport { rawRows, withAccountRls, setSubjectRlsContext, type Database } from \"./database\";\nimport { lockExternalWorkspaceMembershipLifecycle } from \"./external-identities\";\n\ntype LinkRow = {\n id: string;\n account_id: string;\n external_identity_id: string;\n external_subject_id: string;\n external_authorization_revision: number | string;\n native_subject_id: string | null;\n native_membership_id: string | null;\n native_authorization_revision: number | string | null;\n status: \"pending\" | \"active\" | \"revoked\";\n revision: number | string;\n permissions: string[];\n challenge_digest: string;\n confirm_before: Date | string;\n expires_at: Date | string | null;\n};\nexport class ExternalIdentityLinkConflictError extends Error {\n readonly name = \"ExternalIdentityLinkConflictError\";\n constructor() {\n super(\"Identity link changed or is unavailable\");\n }\n}\nconst digest = (value: string) => createHash(\"sha256\").update(value).digest(\"hex\");\nconst iso = (value: Date | string) => new Date(value).toISOString();\nfunction project(row: LinkRow): ExternalIdentityLink {\n const expiry = row.status === \"pending\" ? row.confirm_before : row.expires_at;\n return ExternalIdentityLink.parse({\n id: row.id,\n accountId: row.account_id,\n externalIdentityId: row.external_identity_id,\n nativeSubjectId: row.native_subject_id,\n status:\n row.status !== \"revoked\" && expiry !== null && new Date(expiry).getTime() <= Date.now()\n ? \"expired\"\n : row.status,\n revision: Number(row.revision),\n permissions: row.permissions,\n expiresAt: row.expires_at === null ? null : iso(row.expires_at),\n });\n}\nasync function activeMembership(tx: Database, accountId: string, subjectId: string) {\n const [prior] = await rawRows<{ subject: string }>(\n tx,\n sql`select coalesce(current_setting('opengeni.subject_id', true), '') as subject`,\n );\n // These subjects come from verified admission or the immutable stored link,\n // not caller-selected impersonation. Restore the GUC after each named probe.\n let succeeded = false;\n let row:\n | { membership: { id: string; authorizationRevision: number; personalWorkspaceId: string } }\n | undefined;\n try {\n await setSubjectRlsContext(tx, subjectId);\n [row] = await rawRows<{\n membership: { id: string; authorizationRevision: number; personalWorkspaceId: string };\n }>(\n tx,\n sql`select value as membership from jsonb_array_elements(list_self_organization_memberships(${subjectId}))\n where value ->> 'organizationId' = ${accountId} and value ->> 'status' = 'active'`,\n );\n succeeded = true;\n } finally {\n const restore = tx.execute(\n sql`select set_config('opengeni.subject_id', ${prior?.subject ?? \"\"}, true)`,\n );\n if (succeeded) await restore;\n else await restore.catch(() => undefined);\n }\n if (!row) throw new ExternalIdentityLinkConflictError();\n return row.membership;\n}\n\n/** Internal persistence seam. The API must prove a host external actor and\n * freeze its key permission ceiling before calling. No login is provisioned. */\nexport async function beginExternalIdentityLink(\n db: Database,\n identity: ExternalIdentity,\n raw: unknown,\n) {\n const input = BeginExternalIdentityLinkRequest.parse(raw);\n return withAccountRls(db, identity.accountId, async (tx) => {\n await lockExternalWorkspaceMembershipLifecycle(tx, identity.accountId);\n const membership = await activeMembership(tx, identity.accountId, identity.subjectId);\n if (\n membership.id !== identity.organizationMembershipId ||\n Number(membership.authorizationRevision) !== identity.authorizationRevision ||\n identity.status !== \"active\"\n )\n throw new ExternalIdentityLinkConflictError();\n const [quota] = await rawRows<{ count: number | string }>(\n tx,\n sql`select count(*) as count\n from external_identity_links where account_id = ${identity.accountId}::uuid\n and external_identity_id = ${identity.id}::uuid and status = 'pending'\n and confirm_before > clock_timestamp()`,\n );\n if (Number(quota?.count ?? 0) >= 32) throw new ExternalIdentityLinkConflictError();\n const challenge = randomBytes(32).toString(\"base64url\");\n const permissions = [...new Set(input.permissions)].sort();\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`insert into external_identity_links\n (id, account_id, external_identity_id, external_subject_id, external_authorization_revision,\n permissions, challenge_digest, confirm_before, expires_at)\n values (${randomUUID()}::uuid, ${identity.accountId}::uuid, ${identity.id}::uuid,\n ${identity.subjectId}, ${identity.authorizationRevision}, ${JSON.stringify(permissions)}::jsonb,\n ${digest(challenge)}, clock_timestamp() + interval '10 minutes', ${input.expiresAt}::timestamptz)\n returning *`,\n );\n if (!row) throw new Error(\"Identity link insert returned no row\");\n return BeginExternalIdentityLinkResponse.parse({\n link: project(row),\n challenge,\n confirmBefore: iso(row.confirm_before),\n });\n });\n}\n\n/** Caller proves either exact host identity or native login, never a caller's\n * claimed subject. The challenge is intentionally absent from every read. */\nexport async function getExternalIdentityLink(\n db: Database,\n input: {\n accountId: string;\n linkId: string;\n subjectId: string;\n },\n): Promise<ExternalIdentityLink | null> {\n return withAccountRls(db, input.accountId, async (tx) => {\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`select * from external_identity_links\n where account_id = ${input.accountId}::uuid and id = ${input.linkId}::uuid\n and (external_subject_id = ${input.subjectId} or native_subject_id = ${input.subjectId})`,\n );\n return row ? project(row) : null;\n });\n}\n\n/** Bounded inventory of the verified participant's links. Neither account-wide\n * access nor a supplied cursor reveals another participant's pending requests. */\nexport async function listExternalIdentityLinks(\n db: Database,\n input: { accountId: string; subjectId: string; cursor?: string },\n): Promise<ExternalIdentityLinkPage> {\n return withAccountRls(db, input.accountId, async (tx) => {\n const rows = await rawRows<LinkRow>(\n tx,\n sql`\n select * from external_identity_links\n where account_id = ${input.accountId}::uuid\n and (external_subject_id = ${input.subjectId} or native_subject_id = ${input.subjectId})\n ${input.cursor ? sql`and id > ${input.cursor}::uuid` : sql``}\n order by id limit 51`,\n );\n const links = rows.slice(0, 50).map(project);\n await setSubjectRlsContext(tx, input.subjectId);\n const [labels] = links.length\n ? await rawRows<{ references: Record<string, unknown> }>(\n tx,\n sql`select get_external_identity_link_inventory_references(${input.accountId}::uuid, ARRAY[${sql.join(\n links.map((link) => sql`${link.id}::uuid`),\n sql`, `,\n )}]) as references`,\n )\n : [];\n return ExternalIdentityLinkPage.parse({\n links: links.map((link) => ({\n ...link,\n ...(labels?.references[link.id]\n ? { externalIdentity: ExternalIdentityReference.parse(labels.references[link.id]) }\n : {}),\n })),\n nextCursor: rows.length > 50 ? links.at(-1)!.id : null,\n });\n });\n}\n\n/** Consent-screen projection, only after canonical native login admission.\n * The short-lived challenge proves which host request the human is approving. */\nexport async function previewExternalIdentityLink(\n db: Database,\n input: {\n accountId: string;\n linkId: string;\n challenge: string;\n },\n): Promise<{ link: ExternalIdentityLink; externalIdentity: ExternalIdentityReference } | null> {\n return withAccountRls(db, input.accountId, async (tx) => {\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`select * from external_identity_links\n where account_id = ${input.accountId}::uuid and id = ${input.linkId}::uuid\n and challenge_digest = ${digest(input.challenge)} and status = 'pending'\n and confirm_before > clock_timestamp()\n and (expires_at is null or expires_at > clock_timestamp())`,\n );\n if (!row) return null;\n const [identity] = await rawRows<{ reference: unknown }>(\n tx,\n sql`select get_external_identity_link_reference(${input.accountId}::uuid, ${input.linkId}::uuid, ${digest(input.challenge)}) as reference`,\n );\n return identity?.reference\n ? {\n link: project(row),\n externalIdentity: ExternalIdentityReference.parse(identity.reference),\n }\n : null;\n });\n}\n\n/** Must only receive the canonical native-session subject after explicit UI\n * consent. Possession of the challenge alone is not native authentication. */\nexport async function confirmExternalIdentityLink(\n db: Database,\n input: {\n accountId: string;\n linkId: string;\n nativeSubjectId: string;\n request: ConfirmExternalIdentityLinkRequest;\n },\n): Promise<ExternalIdentityLink> {\n const request = ConfirmExternalIdentityLinkRequest.parse(input.request);\n if (!/^user:[^\\r\\n]+$/.test(input.nativeSubjectId)) throw new ExternalIdentityLinkConflictError();\n return withAccountRls(db, input.accountId, async (tx) => {\n await lockExternalWorkspaceMembershipLifecycle(tx, input.accountId);\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`select * from external_identity_links\n where account_id = ${input.accountId}::uuid and id = ${input.linkId}::uuid\n and challenge_digest = ${digest(request.challenge)} for update`,\n );\n if (!row) throw new ExternalIdentityLinkConflictError();\n const external = await activeMembership(tx, input.accountId, row.external_subject_id);\n const native = await activeMembership(tx, input.accountId, input.nativeSubjectId);\n if (Number(external.authorizationRevision) !== Number(row.external_authorization_revision))\n throw new ExternalIdentityLinkConflictError();\n const permissions = [...new Set(request.permissions)].sort();\n if (\n row.status === \"active\" &&\n Number(row.revision) === request.expectedRevision + 1 &&\n row.native_subject_id === input.nativeSubjectId &&\n row.native_membership_id === native.id &&\n Number(row.native_authorization_revision) === Number(native.authorizationRevision) &&\n JSON.stringify(row.permissions) === JSON.stringify(permissions) &&\n project(row).status === \"active\"\n )\n return project(row);\n if (\n row.status !== \"pending\" ||\n Number(row.revision) !== request.expectedRevision ||\n project(row).status !== \"pending\" ||\n permissions.some((permission) => !row.permissions.includes(permission))\n )\n throw new ExternalIdentityLinkConflictError();\n const [confirmed] = await rawRows<LinkRow>(\n tx,\n sql`update external_identity_links set\n status = 'active', revision = revision + 1, native_subject_id = ${input.nativeSubjectId},\n native_membership_id = ${native.id}::uuid, native_authorization_revision = ${Number(native.authorizationRevision)},\n permissions = ${JSON.stringify(permissions)}::jsonb, confirmed_at = clock_timestamp()\n where id = ${row.id}::uuid returning *`,\n );\n if (!confirmed) throw new ExternalIdentityLinkConflictError();\n return project(confirmed);\n });\n}\n\nexport async function revokeExternalIdentityLink(\n db: Database,\n input: {\n accountId: string;\n linkId: string;\n subjectId: string;\n expectedRevision: number;\n },\n): Promise<ExternalIdentityLink> {\n return withAccountRls(db, input.accountId, async (tx) => {\n await lockExternalWorkspaceMembershipLifecycle(tx, input.accountId);\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`select * from external_identity_links\n where account_id = ${input.accountId}::uuid and id = ${input.linkId}::uuid\n and (external_subject_id = ${input.subjectId} or native_subject_id = ${input.subjectId}) for update`,\n );\n if (!row) throw new ExternalIdentityLinkConflictError();\n if (row.status === \"revoked\" && Number(row.revision) === input.expectedRevision + 1)\n return project(row);\n if (row.status === \"revoked\" || Number(row.revision) !== input.expectedRevision)\n throw new ExternalIdentityLinkConflictError();\n const [revoked] = await rawRows<LinkRow>(\n tx,\n sql`update external_identity_links\n set status = 'revoked', revision = revision + 1, revoked_at = clock_timestamp()\n where id = ${row.id}::uuid returning *`,\n );\n if (!revoked) throw new ExternalIdentityLinkConflictError();\n return project(revoked);\n });\n}\n\n/** Live linked admission primitive. It retains membership/link locks when\n * called in an open transaction. Never uses old creator audit as authority. */\nexport async function resolveExternalIdentityLink(\n db: Database,\n input: {\n identity: ExternalIdentity;\n linkId: string;\n expectedRevision: number;\n },\n): Promise<{ link: ExternalIdentityLink; personalWorkspaceId: string } | null> {\n return withAccountRls(db, input.identity.accountId, async (tx) => {\n await lockExternalWorkspaceMembershipLifecycle(tx, input.identity.accountId);\n const [row] = await rawRows<LinkRow>(\n tx,\n sql`select * from external_identity_links\n where id = ${input.linkId}::uuid and account_id = ${input.identity.accountId}::uuid\n and external_identity_id = ${input.identity.id}::uuid for share`,\n );\n if (\n !row ||\n row.status !== \"active\" ||\n !row.native_subject_id ||\n Number(row.revision) !== input.expectedRevision ||\n Number(row.external_authorization_revision) !== input.identity.authorizationRevision ||\n input.identity.status !== \"active\" ||\n project(row).status !== \"active\"\n )\n return null;\n try {\n const external = await activeMembership(\n tx,\n input.identity.accountId,\n input.identity.subjectId,\n );\n const native = await activeMembership(tx, input.identity.accountId, row.native_subject_id);\n if (\n external.id !== input.identity.organizationMembershipId ||\n Number(external.authorizationRevision) !== input.identity.authorizationRevision ||\n native.id !== row.native_membership_id ||\n Number(native.authorizationRevision) !== Number(row.native_authorization_revision)\n )\n return null;\n return { link: project(row), personalWorkspaceId: native.personalWorkspaceId };\n } catch (error) {\n if (error instanceof ExternalIdentityLinkConflictError) return null;\n throw error;\n }\n });\n}\n","import {\n CHILD_PAUSED_REASON_MAX_BYTES,\n CHILD_PROGRESS_NOTE_MAX_BYTES,\n CHILD_REQUIRES_ACTION_MAX_REQUESTS,\n CHILD_REQUIRES_ACTION_PAYLOAD_MAX_BYTES,\n CHILD_REQUIRES_ACTION_QUESTION_PREVIEW_MAX_BYTES,\n approvalIdentifier,\n type ChildPausedPayload,\n type ChildProgressPayload,\n type ChildRequiresActionPayload,\n type ChildRequiresActionRequest,\n type ChildRequiresActionResolvedPayload,\n type ChildWaitingCapacityPayload,\n type HumanInputQuestion,\n} from \"@opengeni/contracts\";\n\n/**\n * Child lifecycle notices (`child_requires_action`,\n * `child_requires_action_resolved`, `child_paused`, `child_waiting_capacity`,\n * `child_progress`) are produced only while this process-global flag is on.\n * The deployment value is `OPENGENI_CHILD_LIFECYCLE_NOTICES_ENABLED`, parsed\n * once at boot by `@opengeni/config` (`settings.childLifecycleNoticesEnabled`)\n * and installed here by the API app and both worker roles. Rolling hazard: a\n * worker from before these kinds existed throws in `mapSessionSystemUpdate`\n * on an unknown kind, so the flag stays off until the whole fleet runs a new\n * image. Delivery and consumption of an already committed notice never read\n * the flag; only production does.\n */\nlet childLifecycleNoticesEnabledFlag = false;\n\nexport function configureChildLifecycleNotices(input: { enabled: boolean }): void {\n childLifecycleNoticesEnabledFlag = input.enabled === true;\n}\n\nexport function childLifecycleNoticesEnabled(): boolean {\n return childLifecycleNoticesEnabledFlag;\n}\n\n/** Bounded UTF-8 prefix with an explicit marker; never splits a code point. */\nexport function boundedChildNoticeText(\n value: string,\n maxBytes: number,\n): { text: string; truncated: boolean } {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(value);\n if (bytes.byteLength <= maxBytes) return { text: value, truncated: false };\n const marker = \"…\";\n const budget = Math.max(0, maxBytes - encoder.encode(marker).byteLength);\n let end = Math.min(budget, bytes.byteLength);\n while (end > 0 && end < bytes.byteLength && (bytes[end]! & 0xc0) === 0x80) end -= 1;\n return { text: `${new TextDecoder().decode(bytes.subarray(0, end))}${marker}`, truncated: true };\n}\n\nexport const CHILD_LIFECYCLE_DEDUPE_PREFIX = {\n requiresAction: \"child-requires-action\",\n requiresActionResolved: \"child-requires-action-resolved\",\n paused: \"child-paused\",\n waitingCapacity: \"child-waiting-capacity\",\n progress: \"child-progress\",\n} as const;\n\nexport function childRequiresActionDedupeKey(input: {\n childSessionId: string;\n turnId: string;\n turnGeneration: number;\n}): string {\n return `${CHILD_LIFECYCLE_DEDUPE_PREFIX.requiresAction}:${input.childSessionId}:${input.turnId}:${input.turnGeneration}`;\n}\n\nexport function childRequiresActionResolvedDedupeKey(input: {\n childSessionId: string;\n turnId: string;\n turnGeneration: number;\n requestId: string | null;\n approvalId: string | null;\n}): string {\n return `${CHILD_LIFECYCLE_DEDUPE_PREFIX.requiresActionResolved}:${input.childSessionId}:${input.turnId}:${input.turnGeneration}:${input.requestId ?? input.approvalId ?? \"unknown\"}`;\n}\n\nexport function childPausedDedupeKey(input: { childSessionId: string; receiptId: string }): string {\n return `${CHILD_LIFECYCLE_DEDUPE_PREFIX.paused}:${input.childSessionId}:${input.receiptId}`;\n}\n\nexport function childWaitingCapacityDedupeKey(input: {\n childSessionId: string;\n waiterId: string;\n}): string {\n return `${CHILD_LIFECYCLE_DEDUPE_PREFIX.waitingCapacity}:${input.childSessionId}:${input.waiterId}`;\n}\n\nexport function childProgressDedupeKey(input: {\n childSessionId: string;\n receiptId: string;\n}): string {\n return `${CHILD_LIFECYCLE_DEDUPE_PREFIX.progress}:${input.childSessionId}:${input.receiptId}`;\n}\n\n/** Bounded, secret-free tool name of a serialized SDK approval interruption. */\nfunction approvalToolName(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const approval = value as Record<string, unknown>;\n const rawItem =\n approval.rawItem && typeof approval.rawItem === \"object\"\n ? (approval.rawItem as Record<string, unknown>)\n : null;\n const candidate = rawItem?.name ?? approval.name;\n return typeof candidate === \"string\" && candidate.length > 0\n ? boundedChildNoticeText(candidate, 128).text\n : null;\n}\n\n/**\n * Build the bounded child_requires_action payload from the child's frozen\n * human-input requests and pending approvals. Only typed, content-free facts\n * plus one bounded first-question preview per request cross to the parent:\n * never subject ids, credentials, or raw tool arguments. The whole payload\n * stays within CHILD_REQUIRES_ACTION_PAYLOAD_MAX_BYTES by dropping trailing\n * requests and recording `truncated`.\n */\nexport function buildChildRequiresActionPayload(input: {\n childSessionId: string;\n childTurnId: string;\n childTurnGeneration: number;\n humanInputRequests: ReadonlyArray<{\n id: string;\n questions: readonly HumanInputQuestion[];\n allowSkip: boolean;\n expiresAt?: Date | null;\n }>;\n pendingApprovals: readonly unknown[];\n}): ChildRequiresActionPayload {\n const requests: ChildRequiresActionRequest[] = [];\n for (const request of input.humanInputRequests) {\n const first = request.questions[0];\n requests.push({\n kind: \"human_input\",\n requestId: request.id,\n questionCount: request.questions.length,\n firstQuestion: boundedChildNoticeText(\n typeof first?.prompt === \"string\" ? first.prompt : \"\",\n CHILD_REQUIRES_ACTION_QUESTION_PREVIEW_MAX_BYTES,\n ).text,\n allowSkip: request.allowSkip,\n expiresAt: request.expiresAt ? request.expiresAt.toISOString() : null,\n });\n }\n const seenApprovals = new Set<string>();\n for (const pending of input.pendingApprovals) {\n const approvalId = approvalIdentifier(pending);\n if (!approvalId || seenApprovals.has(approvalId)) continue;\n seenApprovals.add(approvalId);\n requests.push({\n kind: \"approval\",\n approvalId: boundedChildNoticeText(approvalId, 256).text,\n toolName: approvalToolName(pending),\n });\n }\n let truncated = requests.length > CHILD_REQUIRES_ACTION_MAX_REQUESTS;\n let bounded = requests.slice(0, CHILD_REQUIRES_ACTION_MAX_REQUESTS);\n const build = (): ChildRequiresActionPayload => ({\n type: \"child_requires_action\",\n childSessionId: input.childSessionId,\n childTurnId: input.childTurnId,\n childTurnGeneration: input.childTurnGeneration,\n requests: bounded,\n truncated,\n });\n let payload = build();\n while (\n bounded.length > 0 &&\n Buffer.byteLength(JSON.stringify(payload)) > CHILD_REQUIRES_ACTION_PAYLOAD_MAX_BYTES\n ) {\n bounded = bounded.slice(0, -1);\n truncated = true;\n payload = build();\n }\n return payload;\n}\n\nexport function childRequiresActionSummary(\n childSessionId: string,\n payload: ChildRequiresActionPayload,\n): string {\n const humanInputs = payload.requests.filter((request) => request.kind === \"human_input\");\n const approvals = payload.requests.filter((request) => request.kind === \"approval\");\n const first = humanInputs[0];\n const lines = [\n `Worker ${childSessionId} is blocked and needs input (turn ${payload.childTurnId}).`,\n ];\n if (first && first.kind === \"human_input\") {\n lines.push(\n `It asked: ${first.firstQuestion}${first.questionCount > 1 ? ` (+${first.questionCount - 1} more question${first.questionCount > 2 ? \"s\" : \"\"})` : \"\"}${humanInputs.length > 1 ? ` [${humanInputs.length} open requests]` : \"\"}.`,\n );\n }\n if (approvals.length > 0) {\n const names = approvals\n .map((request) => (request.kind === \"approval\" ? request.toolName : null))\n .filter((name): name is string => name !== null);\n lines.push(\n `${approvals.length} tool approval${approvals.length > 1 ? \"s are\" : \" is\"} waiting for a human${names.length > 0 ? ` (${names.join(\", \")})` : \"\"}.`,\n );\n }\n if (payload.truncated) lines.push(\"The request list was truncated.\");\n return lines.join(\" \");\n}\n\nexport function childRequiresActionResolvedSummary(\n childSessionId: string,\n payload: ChildRequiresActionResolvedPayload,\n): string {\n const subject = payload.requestId ? \"input request\" : \"approval\";\n return `Worker ${childSessionId}: its ${subject} was ${payload.outcome} (by ${payload.respondedByKind.replace(\"_\", \" \")}); the worker is no longer blocked on it.`;\n}\n\nexport function childPausedSummary(childSessionId: string, payload: ChildPausedPayload): string {\n const base = `Worker ${childSessionId} was paused by ${payload.actorKind === \"agent\" ? \"an agent\" : payload.actorKind === \"api\" ? \"the API\" : \"a human\"}.`;\n return payload.reason ? `${base} Reason: ${payload.reason}` : base;\n}\n\nexport function childWaitingCapacitySummary(\n childSessionId: string,\n payload: ChildWaitingCapacityPayload,\n): string {\n return `Worker ${childSessionId} is waiting for ${payload.provider === \"codex\" ? \"Codex\" : \"xAI\"} provider capacity${payload.nextCheckAt ? ` (next check ${payload.nextCheckAt})` : \"\"}; its turn resumes automatically.`;\n}\n\nexport function childProgressSummary(\n childSessionId: string,\n payload: ChildProgressPayload,\n): string {\n return `Worker ${childSessionId} progress: ${payload.progressNote}`;\n}\n\nexport function boundedChildPausedReason(reason: string | null | undefined): string | null {\n if (reason === null || reason === undefined || reason.length === 0) return null;\n return boundedChildNoticeText(reason, CHILD_PAUSED_REASON_MAX_BYTES).text;\n}\n\nexport function boundedChildProgressNote(note: string): string {\n return boundedChildNoticeText(note, CHILD_PROGRESS_NOTE_MAX_BYTES).text;\n}\n","import type { SessionEvent } from \"@opengeni/contracts\";\nimport { canonicalizePersistedHistoryItem, omitOutputOnlyHistoryItemFields } from \"@opengeni/codex\";\nimport { and, asc, eq, inArray, sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { fromPostgresLosslessJson, LOSSLESS_CONTENT_CODEC_VERSION } from \"./lossless-json\";\nimport * as schema from \"./schema\";\nimport { cancelUnacceptedVideoGenerationsForToolCallsInTransaction } from \"./video-generation\";\n\nexport const TOOL_RESULT_TYPE_BY_CALL_TYPE: Readonly<Record<string, string>> = {\n function_call: \"function_call_result\",\n computer_call: \"computer_call_result\",\n shell_call: \"shell_call_output\",\n apply_patch_call: \"apply_patch_call_output\",\n tool_search_call: \"tool_search_output\",\n};\n\nexport function historyCallId(item: Record<string, unknown>): string | null {\n const providerData =\n item.providerData && typeof item.providerData === \"object\" && !Array.isArray(item.providerData)\n ? (item.providerData as Record<string, unknown>)\n : null;\n // Native tool-search `id` is the provider item id, not the call correlation\n // id. Validate direct and provider identities before the item-id fallback.\n const value = [\n item.callId,\n item.call_id,\n providerData?.callId,\n providerData?.call_id,\n item.id,\n ].find((candidate): candidate is string => typeof candidate === \"string\" && candidate.length > 0);\n return value ?? null;\n}\n\nexport function historyItemType(item: Record<string, unknown>): string | null {\n return typeof item.type === \"string\" ? item.type : null;\n}\n\n/** Provider-valid result for a started call whose durable outcome is unknown. */\nexport function interruptedToolCallResult(input: {\n callType: string;\n callId: string;\n callItem: Record<string, unknown>;\n reason: string;\n}): Record<string, unknown> | null {\n const message =\n `Tool execution was interrupted by ${input.reason} before its result was durably recorded. ` +\n \"The side-effect outcome is unknown; inspect actual state before repeating the call.\";\n if (input.callType === \"function_call\") {\n const name = typeof input.callItem.name === \"string\" ? input.callItem.name : \"tool\";\n return {\n type: \"function_call_result\",\n name,\n ...(typeof input.callItem.namespace === \"string\"\n ? { namespace: input.callItem.namespace }\n : {}),\n callId: input.callId,\n status: \"incomplete\",\n output: { type: \"text\", text: message },\n };\n }\n if (input.callType === \"shell_call\") {\n return {\n type: \"shell_call_output\",\n callId: input.callId,\n output: [{ stdout: \"\", stderr: message, outcome: { type: \"exit\", exitCode: null } }],\n };\n }\n if (input.callType === \"apply_patch_call\") {\n return {\n type: \"apply_patch_call_output\",\n callId: input.callId,\n status: \"failed\",\n output: message,\n };\n }\n if (input.callType === \"computer_call\") return null;\n if (input.callType === \"tool_search_call\") {\n const providerData =\n input.callItem.providerData &&\n typeof input.callItem.providerData === \"object\" &&\n !Array.isArray(input.callItem.providerData)\n ? (input.callItem.providerData as Record<string, unknown>)\n : null;\n const execution =\n input.callItem.execution === \"client\" || input.callItem.execution === \"server\"\n ? input.callItem.execution\n : providerData?.execution === \"client\" || providerData?.execution === \"server\"\n ? providerData.execution\n : null;\n const providerIdentity =\n typeof providerData?.call_id === \"string\" || typeof providerData?.callId === \"string\";\n const snakeId = typeof input.callItem.call_id === \"string\";\n return {\n type: \"tool_search_output\",\n ...(providerIdentity\n ? {\n providerData: {\n call_id: input.callId,\n ...(execution ? { execution } : {}),\n },\n }\n : snakeId\n ? { call_id: input.callId, ...(execution ? { execution } : {}) }\n : { callId: input.callId, ...(execution ? { execution } : {}) }),\n status: \"incomplete\",\n tools: [],\n };\n }\n return null;\n}\n\nexport type ClosePendingSessionToolCallsInput = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n reason: string;\n sequence: number;\n now: Date;\n turnAssociation?: \"current\" | null;\n preserveInterruptionRows?: boolean;\n};\n\nfunction mapEvent(row: typeof schema.sessionEvents.$inferSelect): SessionEvent {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n sessionId: row.sessionId,\n sequence: row.sequence,\n type: row.type as SessionEvent[\"type\"],\n payload: fromPostgresLosslessJson(row.payload, row.payloadCodecVersion),\n occurredAt: row.occurredAt.toISOString(),\n clientEventId: row.clientEventId,\n turnId: row.turnId,\n turnGeneration: row.turnGeneration,\n turnAttemptId: row.turnAttemptId,\n turnAssociation: row.turnAssociation as SessionEvent[\"turnAssociation\"],\n duplicateOfEventId: row.duplicateOfEventId,\n duplicateReason: row.duplicateReason,\n };\n}\n\n/**\n * Close raw tool calls for a logical turn while its owning session/turn locks\n * are held. Recoverable transitions preserve interruption rows because those\n * rows are the exact open-suffix resume authority for a replacement attempt;\n * ordinary in-flight rows still receive durable outcome-unknown settlement.\n * Terminal and superseding transitions close every row. Durable results win;\n * repeated settlement is an exact no-op after the selected ledger rows are\n * deleted.\n */\nexport async function closePendingSessionToolCallsInTransaction(\n tx: Database,\n input: ClosePendingSessionToolCallsInput,\n): Promise<{ sequence: number; events: SessionEvent[]; closed: number }> {\n const pendingRows = await tx\n .select()\n .from(schema.sessionPendingToolCalls)\n .where(\n and(\n eq(schema.sessionPendingToolCalls.workspaceId, input.workspaceId),\n eq(schema.sessionPendingToolCalls.sessionId, input.sessionId),\n eq(schema.sessionPendingToolCalls.turnId, input.turnId),\n ),\n )\n .orderBy(asc(schema.sessionPendingToolCalls.createdAt), asc(schema.sessionPendingToolCalls.id))\n .for(\"update\");\n const pending = pendingRows\n .filter((row) => !(input.preserveInterruptionRows && row.interruptionKind !== null))\n .map((row) => ({\n ...row,\n callItem: fromPostgresLosslessJson(row.callItem, row.callItemCodecVersion),\n resultItem:\n row.resultItem === null\n ? null\n : fromPostgresLosslessJson(row.resultItem, row.resultItemCodecVersion),\n eventOutput:\n row.eventOutput === null\n ? null\n : fromPostgresLosslessJson(row.eventOutput, row.eventOutputCodecVersion),\n }));\n if (pending.length === 0) return { sequence: input.sequence, events: [], closed: 0 };\n\n const history = await tx\n .select({\n position: schema.sessionHistoryItems.position,\n item: schema.sessionHistoryItems.item,\n itemCodecVersion: schema.sessionHistoryItems.itemCodecVersion,\n active: schema.sessionHistoryItems.active,\n })\n .from(schema.sessionHistoryItems)\n .where(\n and(\n eq(schema.sessionHistoryItems.workspaceId, input.workspaceId),\n eq(schema.sessionHistoryItems.sessionId, input.sessionId),\n eq(schema.sessionHistoryItems.turnId, input.turnId),\n ),\n )\n .orderBy(asc(schema.sessionHistoryItems.position));\n const decodedHistory = history.map((row) => ({\n ...row,\n item: fromPostgresLosslessJson(row.item, row.itemCodecVersion),\n }));\n const [{ maxPosition } = { maxPosition: -1 }] = await tx\n .select({ maxPosition: sql<number>`coalesce(max(${schema.sessionHistoryItems.position}), -1)` })\n .from(schema.sessionHistoryItems)\n .where(\n and(\n eq(schema.sessionHistoryItems.workspaceId, input.workspaceId),\n eq(schema.sessionHistoryItems.sessionId, input.sessionId),\n ),\n );\n const existingOutputEvents = await tx\n .select({ callId: sql<string | null>`${schema.sessionEvents.payload} ->> 'id'` })\n .from(schema.sessionEvents)\n .where(\n and(\n eq(schema.sessionEvents.workspaceId, input.workspaceId),\n eq(schema.sessionEvents.sessionId, input.sessionId),\n eq(schema.sessionEvents.turnId, input.turnId),\n eq(schema.sessionEvents.type, \"agent.toolCall.output\"),\n ),\n );\n const projectedCallIds = new Set(\n existingOutputEvents.flatMap(({ callId }) => (callId ? [callId] : [])),\n );\n let nextPosition = Math.floor(Number(maxPosition)) + 1;\n let sequence = input.sequence;\n const historyValues: Array<typeof schema.sessionHistoryItems.$inferInsert> = [];\n const eventValues: Array<typeof schema.sessionEvents.$inferInsert> = [];\n const resolutions = pending.map((call) => {\n const resultType = TOOL_RESULT_TYPE_BY_CALL_TYPE[call.callType];\n const existingCall = decodedHistory.find(\n ({ item }) => historyItemType(item) === call.callType && historyCallId(item) === call.callId,\n );\n const existingResult = resultType\n ? decodedHistory.find(\n ({ item, position }) =>\n position > (existingCall?.position ?? Number.MAX_SAFE_INTEGER) &&\n historyItemType(item) === resultType &&\n historyCallId(item) === call.callId,\n )\n : undefined;\n const activeCall = decodedHistory.find(\n ({ item, active }) =>\n active && historyItemType(item) === call.callType && historyCallId(item) === call.callId,\n );\n const activeResult = resultType\n ? decodedHistory.find(\n ({ item, active, position }) =>\n active &&\n position > (activeCall?.position ?? Number.MAX_SAFE_INTEGER) &&\n historyItemType(item) === resultType &&\n historyCallId(item) === call.callId,\n )\n : undefined;\n const interruptedResult = interruptedToolCallResult({\n callType: call.callType,\n callId: call.callId,\n callItem: call.callItem,\n reason: input.reason,\n });\n return {\n call,\n existingCall,\n existingResult,\n activeCall,\n activeResult,\n completeDurablePair: Boolean(existingCall && existingResult),\n supersededDurablePair: Boolean(\n existingCall && existingResult && (!existingCall.active || !existingResult.active),\n ),\n rawCallIsValid: historyItemType(call.callItem) === call.callType,\n result: existingResult?.item ?? call.resultItem ?? interruptedResult,\n interrupted: !existingResult && !call.resultItem,\n };\n });\n\n for (const resolution of resolutions) {\n if (\n !resolution.completeDurablePair &&\n !resolution.activeCall &&\n resolution.result &&\n resolution.rawCallIsValid\n ) {\n historyValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n turnId: input.turnId,\n position: nextPosition++,\n item: omitOutputOnlyHistoryItemFields(resolution.call.callItem),\n itemCodecVersion: LOSSLESS_CONTENT_CODEC_VERSION,\n active: true,\n });\n }\n }\n const orderedResults = [...resolutions].sort(\n (left, right) =>\n (left.call.resultRecordedAt?.getTime() ?? Number.MAX_SAFE_INTEGER) -\n (right.call.resultRecordedAt?.getTime() ?? Number.MAX_SAFE_INTEGER),\n );\n for (const resolution of orderedResults) {\n if (\n !resolution.completeDurablePair &&\n !resolution.activeResult &&\n resolution.result &&\n resolution.rawCallIsValid\n ) {\n historyValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n turnId: input.turnId,\n position: nextPosition++,\n item: canonicalizePersistedHistoryItem(\n resolution.result,\n resolution.call.modelToolOutputTruncationTokens ?? undefined,\n ),\n itemCodecVersion: LOSSLESS_CONTENT_CODEC_VERSION,\n active: true,\n });\n }\n // A pair superseded by compaction was already projected during its live\n // response. Reactivating or re-emitting it would undo the checkpoint and\n // duplicate the UI output. An active complete pair is different: it can be\n // the crash point after model-memory persistence but before event publish,\n // so it keeps the existing durable recovery projection below.\n if (resolution.supersededDurablePair || projectedCallIds.has(resolution.call.callId)) continue;\n eventValues.push({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n sequence: ++sequence,\n type: \"agent.toolCall.output\",\n turnId: input.turnId,\n turnGeneration: resolution.call.executionGeneration,\n turnAttemptId: resolution.call.attemptId,\n turnAssociation: input.turnAssociation === undefined ? \"current\" : input.turnAssociation,\n payload: {\n id: resolution.call.callId,\n output: resolution.interrupted\n ? {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Tool execution was interrupted by ${input.reason}; its side-effect outcome is unknown.`,\n },\n ],\n }\n : resolution.call.eventOutput !== null\n ? resolution.call.eventOutput.value\n : ((resolution.existingResult?.item ?? resolution.call.resultItem)?.output ??\n resolution.existingResult?.item ??\n resolution.call.resultItem),\n recovery: {\n interrupted: resolution.interrupted,\n outcome: resolution.interrupted ? \"unknown\" : \"durable_result_found\",\n reason: input.reason,\n unsupportedCallShape:\n resolution.interrupted && (!resolution.result || !resolution.rawCallIsValid),\n },\n },\n payloadCodecVersion: LOSSLESS_CONTENT_CODEC_VERSION,\n occurredAt: input.now,\n });\n }\n\n if (historyValues.length > 0) await tx.insert(schema.sessionHistoryItems).values(historyValues);\n const inserted =\n eventValues.length > 0\n ? await tx.insert(schema.sessionEvents).values(eventValues).returning()\n : [];\n await cancelUnacceptedVideoGenerationsForToolCallsInTransaction(tx, {\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n turnId: input.turnId,\n toolCallIds: pending.map((call) => call.callId),\n reason: input.reason,\n now: input.now,\n });\n await tx.delete(schema.sessionPendingToolCalls).where(\n and(\n eq(schema.sessionPendingToolCalls.workspaceId, input.workspaceId),\n eq(schema.sessionPendingToolCalls.sessionId, input.sessionId),\n eq(schema.sessionPendingToolCalls.turnId, input.turnId),\n inArray(\n schema.sessionPendingToolCalls.id,\n pending.map((call) => call.id),\n ),\n ),\n );\n return { sequence, events: inserted.map(mapEvent), closed: pending.length };\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { HumanInputQuestion, HumanInputResponse } from \"@opengeni/contracts\";\nimport { and, desc, eq, gt, sql } from \"drizzle-orm\";\n\nimport type { Database } from \"./database\";\nimport { LOSSLESS_CONTENT_CODEC_VERSION } from \"./lossless-json\";\nimport * as schema from \"./schema\";\n\nconst SESSION_REALTIME_MIRROR_MAX_TEXT_BYTES = 131_072;\nconst SESSION_REALTIME_MIRROR_MAX_PAYLOAD_BYTES = 131_072;\nconst TRUNCATION_MARKER = \"\\n…realtime context truncated…\";\n\nexport type SessionRealtimeMirrorChannel = \"speakable\" | \"commentary\" | null;\n\nexport type MirrorSessionRealtimeContextInput = {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n sourceKind:\n | \"human_input\"\n | \"human_input_request\"\n | \"human_input_response\"\n | \"assistant_progress\"\n | \"assistant_terminal\";\n sourceId: string;\n text: string;\n channel: SessionRealtimeMirrorChannel;\n turnId?: string | null;\n payload?: Record<string, unknown> | undefined;\n now?: Date | undefined;\n};\n\nexport type MirrorSessionRealtimeContextResult = {\n entry: typeof schema.sessionRealtimeEntries.$inferSelect;\n replay: boolean;\n} | null;\n\nfunction deterministicUuid(seed: string): string {\n const bytes = createHash(\"sha256\").update(seed, \"utf8\").digest().subarray(0, 16);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x50;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nfunction takeUtf8Head(value: string, maximumBytes: number): string {\n const bytes = Buffer.from(value, \"utf8\");\n if (bytes.length <= maximumBytes) return value;\n let end = maximumBytes;\n while (end > 0 && (bytes[end]! & 0xc0) === 0x80) end -= 1;\n return bytes.subarray(0, end).toString(\"utf8\");\n}\n\nfunction boundedText(value: string): string {\n if (Buffer.byteLength(value, \"utf8\") <= SESSION_REALTIME_MIRROR_MAX_TEXT_BYTES) return value;\n const markerBytes = Buffer.byteLength(TRUNCATION_MARKER, \"utf8\");\n return `${takeUtf8Head(value, SESSION_REALTIME_MIRROR_MAX_TEXT_BYTES - markerBytes)}${TRUNCATION_MARKER}`;\n}\n\nfunction boundedPayload(value: Record<string, unknown>): Record<string, unknown> {\n const payload = value;\n if (\n Buffer.byteLength(JSON.stringify(payload), \"utf8\") > SESSION_REALTIME_MIRROR_MAX_PAYLOAD_BYTES\n ) {\n throw new Error(\"Realtime mirror payload exceeds the durable ledger limit\");\n }\n return payload;\n}\n\n/**\n * Append one canonical same-session fact to the active realtime conversation.\n * The caller already owns the session event-write lock. Locking the active mode\n * serializes sequence allocation with lifecycle end and browser ledger sync.\n */\nexport async function mirrorSessionRealtimeContextInTransaction(\n db: Database,\n input: MirrorSessionRealtimeContextInput,\n): Promise<MirrorSessionRealtimeContextResult> {\n const now = input.now ?? new Date();\n const modes = await db\n .select()\n .from(schema.sessionRealtimeModes)\n .where(\n and(\n eq(schema.sessionRealtimeModes.accountId, input.accountId),\n eq(schema.sessionRealtimeModes.workspaceId, input.workspaceId),\n eq(schema.sessionRealtimeModes.sessionId, input.sessionId),\n eq(schema.sessionRealtimeModes.state, \"active\"),\n gt(schema.sessionRealtimeModes.leaseExpiresAt, now),\n ),\n )\n .orderBy(desc(schema.sessionRealtimeModes.startedAt))\n .for(\"update\")\n .limit(2);\n if (modes.length === 0) return null;\n if (modes.length !== 1) {\n throw new Error(`Session ${input.sessionId} has multiple active realtime modes`);\n }\n const mode = modes[0]!;\n const operationId = deterministicUuid(\n `opengeni:session-realtime-mirror:${mode.id}:${input.sourceKind}:${input.sourceId}`,\n );\n const [existing] = await db\n .select()\n .from(schema.sessionRealtimeEntries)\n .where(\n and(\n eq(schema.sessionRealtimeEntries.realtimeId, mode.id),\n eq(schema.sessionRealtimeEntries.operationId, operationId),\n ),\n )\n .limit(1);\n if (existing) return { entry: existing, replay: true };\n\n const [sequenceRow] = await db\n .select({ next: sql<number>`coalesce(max(${schema.sessionRealtimeEntries.sequence}), 0) + 1` })\n .from(schema.sessionRealtimeEntries)\n .where(eq(schema.sessionRealtimeEntries.realtimeId, mode.id));\n const payload = boundedPayload({\n ...(input.payload ?? {}),\n source: input.sourceKind,\n sourceId: input.sourceId,\n channel: input.channel,\n ...(input.turnId ? { sourceTurnId: input.turnId } : {}),\n });\n const [entry] = await db\n .insert(schema.sessionRealtimeEntries)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n realtimeId: mode.id,\n operationId,\n connectionEpoch: mode.connectionEpoch,\n sequence: Number(sequenceRow?.next ?? 1),\n direction: \"provider_out\",\n kind: \"session_update\",\n text: boundedText(input.text),\n textCodecVersion: LOSSLESS_CONTENT_CODEC_VERSION,\n payload,\n payloadCodecVersion: LOSSLESS_CONTENT_CODEC_VERSION,\n createdAt: now,\n updatedAt: now,\n })\n .returning();\n if (!entry) throw new Error(\"Failed to append realtime session context\");\n return { entry, replay: false };\n}\n\nexport function renderRealtimeHumanInputContext(input: {\n delivery: \"send\" | \"steer\";\n routing: \"accepted_for_execution\" | \"queued_for_execution\" | \"accepted_for_steering\";\n text: string;\n}): string {\n return [\n \"<session_user_message>\",\n ` <status>${input.routing}</status>`,\n ` <delivery>${input.delivery}</delivery>`,\n ` <text>${escapeXmlText(input.text)}</text>`,\n \" <instruction>Already routed by OpenGeni; do not delegate this message again.</instruction>\",\n \"</session_user_message>\",\n ].join(\"\\n\");\n}\n\nexport type RealtimeHumanInputRequestContext = {\n id: string;\n questions: HumanInputQuestion[];\n allowSkip: boolean;\n expiresAt?: Date | string | null;\n};\n\n/**\n * Render the exact durable question contract for the conversational surface.\n * The structured form remains authoritative, while a conversational answer is\n * ordinary new user input that the realtime model delegates once with enough\n * question context for the next underlying turn.\n */\nexport function renderRealtimeHumanInputRequestContext(input: {\n requests: RealtimeHumanInputRequestContext[];\n}): string {\n const lines = [\"<session_human_input_request>\", \" <status>waiting_for_user</status>\"];\n for (const request of input.requests) {\n lines.push(\n \" <request>\",\n ` <id>${escapeXmlText(request.id)}</id>`,\n ` <allow_skip>${String(request.allowSkip)}</allow_skip>`,\n ` <expires_at>${escapeXmlText(renderExpiry(request.expiresAt))}</expires_at>`,\n );\n for (const question of request.questions) {\n lines.push(\n \" <question>\",\n ` <id>${escapeXmlText(question.id)}</id>`,\n ` <kind>${escapeXmlText(question.kind)}</kind>`,\n ` <required>${String(question.required)}</required>`,\n );\n if (question.label) lines.push(` <label>${escapeXmlText(question.label)}</label>`);\n lines.push(` <prompt>${escapeXmlText(question.prompt)}</prompt>`);\n if (question.helpText) {\n lines.push(` <help_text>${escapeXmlText(question.helpText)}</help_text>`);\n }\n if (question.options.length > 0) {\n lines.push(\" <options>\");\n for (const option of question.options) {\n lines.push(\n \" <option>\",\n ` <id>${escapeXmlText(option.id)}</id>`,\n ` <label>${escapeXmlText(option.label)}</label>`,\n );\n if (option.description) {\n lines.push(` <description>${escapeXmlText(option.description)}</description>`);\n }\n lines.push(\" </option>\");\n }\n lines.push(\" </options>\");\n }\n lines.push(\n ` <allow_other>${String(question.kind !== \"text\")}</allow_other>`,\n \" </question>\",\n );\n }\n lines.push(\" </request>\");\n }\n lines.push(\n \" <instruction>The current work is waiting for the user's input. Ask the questions naturally, one at a time when useful, without changing their meaning or answering for the user. The user may answer in the visible form or answer conversationally here. If the user answers here, delegate exactly once with a complete message containing the relevant question and the user's answer. If the user changes direction instead, delegate that new direction normally. Do not claim the work resumed until a later session update confirms it.</instruction>\",\n \"</session_human_input_request>\",\n );\n return lines.join(\"\\n\");\n}\n\nexport function renderRealtimeHumanInputResponseContext(input: {\n requestId: string;\n questions: HumanInputQuestion[];\n response: HumanInputResponse;\n}): string {\n const lines = [\n \"<session_human_input_response>\",\n ` <request_id>${escapeXmlText(input.requestId)}</request_id>`,\n ` <outcome>${escapeXmlText(input.response.outcome)}</outcome>`,\n ];\n if (input.response.outcome === \"answered\") {\n const questions = new Map(input.questions.map((question) => [question.id, question]));\n lines.push(\" <answers>\");\n for (const answer of input.response.answers) {\n const question = questions.get(answer.questionId);\n const optionLabels = new Map(\n question?.options.map((option) => [option.id, option.label]) ?? [],\n );\n lines.push(\n \" <answer>\",\n ` <question_id>${escapeXmlText(answer.questionId)}</question_id>`,\n );\n if (question) lines.push(` <question>${escapeXmlText(question.prompt)}</question>`);\n for (const value of answer.values) {\n lines.push(` <value>${escapeXmlText(optionLabels.get(value) ?? value)}</value>`);\n }\n if (answer.other) lines.push(` <other>${escapeXmlText(answer.other)}</other>`);\n lines.push(\" </answer>\");\n }\n lines.push(\" </answers>\");\n }\n lines.push(\n input.response.outcome === \"answered\" || input.response.outcome === \"skipped\"\n ? \" <instruction>This structured response was accepted through the session UI and the same work can resume. Treat it as authoritative user context, do not delegate it again, and acknowledge briefly only if useful.</instruction>\"\n : \" <instruction>This pending question is no longer active. Do not ask it again unless the user raises it.</instruction>\",\n \"</session_human_input_response>\",\n );\n return lines.join(\"\\n\");\n}\n\nfunction renderExpiry(value: Date | string | null | undefined): string {\n if (value === null || value === undefined) return \"none\";\n return value instanceof Date ? value.toISOString() : value;\n}\n\nfunction escapeXmlText(value: string): string {\n return value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n"],"mappings":"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","names":["and","asc","desc","eq","inArray","sql","createHash","and","eq","inArray","sql","sql","sql","ExternalIdentityReference","sql","ExternalIdentityReference","sql","sql","sql","createHash","and","eq","sql","createHash","and","eq","sql","sql","createHash","eq","sessions","and","inArray","ancestry","workspaceControlEventId","wakeCount","targetSession","receipt","sql","and","eq","inArray","desc","asc"]}
|