@opengeni/worker-bundle 3.3.0 → 3.4.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.
Files changed (35) hide show
  1. package/dist/{activities-control-G2W4FEFP.js → activities-control-EWP3UDZP.js} +5 -5
  2. package/dist/{activities-turn-CE2VIWIS.js → activities-turn-COUX2R3A.js} +16 -4
  3. package/dist/activities-turn-COUX2R3A.js.map +1 -0
  4. package/dist/artifact-materializer-entry.js +1 -0
  5. package/dist/artifact-materializer-entry.js.map +1 -1
  6. package/dist/artifact-outbox-entry.js +3 -1
  7. package/dist/artifact-outbox-entry.js.map +1 -1
  8. package/dist/{chunk-5NNS4327.js → chunk-BX3KRGDM.js} +10 -4
  9. package/dist/{chunk-5NNS4327.js.map → chunk-BX3KRGDM.js.map} +1 -1
  10. package/dist/{chunk-5DF4V5RD.js → chunk-PFCSGZGA.js} +7 -4
  11. package/dist/{chunk-5DF4V5RD.js.map → chunk-PFCSGZGA.js.map} +1 -1
  12. package/dist/{chunk-RSI63RZG.js → chunk-PG66GHGH.js} +3 -3
  13. package/dist/{chunk-R5BHILMQ.js → chunk-XUIWRRTY.js} +5 -4
  14. package/dist/chunk-XUIWRRTY.js.map +1 -0
  15. package/dist/editable-artifact-outbox-dispatcher.d.ts +2 -0
  16. package/dist/index.js +30 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/internal-maintenance.d.ts +3 -1
  19. package/dist/observability-metrics.d.ts +14 -0
  20. package/dist/{sandbox-lease-2IV3DNXR.js → sandbox-lease-XBZWILZ3.js} +4 -4
  21. package/package.json +26 -26
  22. package/src/activities/agent-turn/run.ts +15 -0
  23. package/src/activity-services.ts +3 -0
  24. package/src/editable-artifact-materializer-service.ts +3 -0
  25. package/src/editable-artifact-outbox-dispatcher.ts +5 -0
  26. package/src/editable-artifact-outbox-service.ts +3 -0
  27. package/src/index.ts +6 -0
  28. package/src/internal-maintenance.ts +24 -0
  29. package/src/observability-metrics.ts +20 -3
  30. package/src/sandbox-routing.ts +3 -0
  31. package/dist/activities-turn-CE2VIWIS.js.map +0 -1
  32. package/dist/chunk-R5BHILMQ.js.map +0 -1
  33. /package/dist/{activities-control-G2W4FEFP.js.map → activities-control-EWP3UDZP.js.map} +0 -0
  34. /package/dist/{chunk-RSI63RZG.js.map → chunk-PG66GHGH.js.map} +0 -0
  35. /package/dist/{sandbox-lease-2IV3DNXR.js.map → sandbox-lease-XBZWILZ3.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/workflows/activities.ts","../src/knowledge-source-sync-activity-policy.ts","../src/turn-task-queue-reader.ts","../src/temporal-runtime-logger.ts","../src/turn-worker-activity-telemetry.ts","../src/http.ts","../src/internal-maintenance.ts","../src/maintenance-cadence.ts","../src/browser-deadline-checkpoint-contract.ts","../src/worker-service-lifecycle.ts","../src/memory-pressure-guard.ts","../src/unhandled-rejection-boundary.ts"],"sourcesContent":["import {\n dbSearchPath,\n getSettings,\n resolveNatsControlPlaneAuth,\n retryStartupDependency,\n startupRetryOptions,\n temporalConnectionOptions,\n type Settings,\n} from \"@opengeni/config\";\nimport {\n assertRuntimeDatabasePosture,\n isRetryableRuntimeDatabaseStartupError,\n createDb,\n getContextCompactionPendingSummary,\n markSessionWorkflowWakeDelivered,\n summarizeSessionRecoveryBacklog,\n type Database,\n type RuntimeDatabasePostureOptions,\n} from \"@opengeni/db\";\nimport {\n createNatsEventBus,\n requireSessionEventDurableFanoutCapability,\n type EventBus,\n} from \"@opengeni/events\";\nimport {\n createObservability,\n logStartupDependencyRetry,\n type Observability,\n} from \"@opengeni/observability\";\nimport {\n Connection,\n isGrpcServiceError,\n ScheduleAlreadyRunning,\n ScheduleOverlapPolicy,\n Client as TemporalClient,\n WorkflowExecutionAlreadyStartedError,\n} from \"@temporalio/client\";\nimport { NativeConnection, Worker, type WorkflowBundleOption } from \"@temporalio/worker\";\nimport { existsSync } from \"node:fs\";\nimport { prepareObjectStorageProvider } from \"@opengeni/storage\";\nimport { fileURLToPath } from \"node:url\";\nimport type { createControlActivities } from \"./activities-control\";\nimport type { createTurnActivities } from \"./activities-turn\";\nimport type { ActivityDependencies } from \"./activities/types\";\nimport { closeNativeExternalVaultProviders } from \"./external-vault-providers\";\nimport type {\n InspectSessionAttemptActivity,\n SignalCodexCapacityWorkflow,\n SignalSessionAttemptQuiesced,\n StartSandboxReaperWorkflow,\n StartVideoGenerationWorkflow,\n WakeSessionWorkflowSignal,\n} from \"./activities/types\";\nimport { turnTaskQueue } from \"./workflows/activities\";\nimport { createTurnTaskQueueStatsClient } from \"./turn-task-queue-reader\";\nimport { installTemporalRuntimeLogging } from \"./temporal-runtime-logger\";\nimport {\n closeWorkerHttpAfterActivityExecution,\n withTurnWorkerActivityTelemetry,\n type TurnWorkerActivityTelemetry,\n} from \"./turn-worker-activity-telemetry\";\nimport {\n dbReadyCheck,\n natsReadyCheck,\n startWorkerHttpServer,\n temporalReadyCheck,\n type WorkerLifecycleState,\n} from \"./http\";\nimport {\n initializeContextCompactionMetrics,\n initializeWorkerOutcomeMetrics,\n observabilityEventBusOptions,\n startContextCompactionPendingMonitor,\n startSessionRecoveryMonitor,\n startTurnCapacityMonitor,\n type TurnTaskQueueStats,\n type TurnTaskQueueReadOptions,\n type TurnTaskQueueIdentity,\n} from \"./observability-metrics\";\nimport {\n resolveCatalogSettings,\n TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n} from \"@opengeni/core\";\nimport { startInternalMaintenanceCadences } from \"./internal-maintenance\";\nimport {\n CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n createTurnWorkerConcurrencyPlan,\n turnWorkerConcurrencyLogFields,\n} from \"./concurrency\";\nimport {\n combineWorkerRunTargets,\n constructWithOwnedConnection,\n createWorkerServiceLifecycle,\n createWorkerCleanupContainment,\n type WorkerServiceLifecycle,\n type WorkerRunTarget,\n} from \"./worker-service-lifecycle\";\nimport {\n createTurnWorkerMemoryPressureGuard,\n turnWorkerMemoryPressureGuardEnabled,\n type TurnWorkerMemoryPressureGuard,\n} from \"./memory-pressure-guard\";\nimport { assertSandboxReaperActivityTimeout } from \"./sandbox-reaper-timeout\";\nimport { installWorkerUnhandledRejectionBoundary } from \"./unhandled-rejection-boundary\";\nimport {\n SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n SANDBOX_REAPER_V2_WORKFLOW_ID,\n sandboxLifecycleTaskQueue,\n} from \"./sandbox-reaper-contract\";\nimport {\n BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n browserDeadlineCheckpointTaskQueue,\n} from \"./browser-deadline-checkpoint-contract\";\n\nexport {\n createHostExportPump,\n type HostExportDrainResult,\n type HostExportPump,\n type HostExportPumpOptions,\n type HostEventExport,\n type HostEventExportBatch,\n type HostEventSink,\n type HostLifecycleFactExport,\n type HostLifecycleFactExportBatch,\n type HostLifecycleFactSink,\n type HostUsageExport,\n type HostUsageExportBatch,\n type HostUsageSink,\n} from \"./host-export\";\nexport {\n INTERNAL_MAINTENANCE_JOBS,\n KNOWLEDGE_INDEXING_PERIOD_MS,\n KNOWLEDGE_INDEXING_SCHEDULE_ID,\n SITE_AUTH_MAINTENANCE_PERIOD_MS,\n SITE_AUTH_MAINTENANCE_SCHEDULE_ID,\n startInternalMaintenanceCadences,\n type InternalMaintenanceJob,\n} from \"./internal-maintenance\";\n\nexport const FILE_UPLOAD_REAPER_SCHEDULE_ID = \"opengeni-file-upload-reaper\";\nexport const FILE_UPLOAD_REAPER_PERIOD_MS = 15 * 60 * 1_000;\nexport const SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID = \"opengeni-session-storage-maintenance\";\nexport const SESSION_STORAGE_MAINTENANCE_PERIOD_MS = 5 * 60 * 1_000;\nexport type OpenGeniWorkerRole = \"control\" | \"turn\";\n\nexport type WorkerOptions = {\n role: OpenGeniWorkerRole;\n settings?: Settings;\n activities?: ReturnType<typeof createControlActivities> | ReturnType<typeof createTurnActivities>;\n activityDependencies?: ActivityDependencies;\n /** Override the release-coherent workflow artifact. Most hosts should omit this. */\n workflowBundle?: WorkflowBundleOption;\n};\n\ntype TemporalActivityLease = {\n lastHeartbeatTime?: { seconds?: unknown; nanos?: number | null } | null;\n lastStartedTime?: { seconds?: unknown; nanos?: number | null } | null;\n activityOptions?: {\n heartbeatTimeout?: { seconds?: unknown; nanos?: number | null } | null;\n } | null;\n};\n\nfunction temporalTimeMs(\n value: { seconds?: unknown; nanos?: number | null } | null | undefined,\n): number | null {\n if (value?.seconds === undefined || value.seconds === null) return null;\n return Number(String(value.seconds)) * 1_000 + Math.floor((value.nanos ?? 0) / 1_000_000);\n}\n\nexport function temporalActivityLeaseSettled(\n pending: TemporalActivityLease | null | undefined,\n nowMs = Date.now(),\n): boolean {\n if (!pending) return true;\n const heartbeatAt =\n temporalTimeMs(pending.lastHeartbeatTime) ?? temporalTimeMs(pending.lastStartedTime);\n const heartbeatTimeoutMs = temporalTimeMs(pending.activityOptions?.heartbeatTimeout);\n return (\n heartbeatAt !== null && heartbeatTimeoutMs !== null && nowMs >= heartbeatAt + heartbeatTimeoutMs\n );\n}\n\n/** The exact Temporal workflow run is absent, so it cannot retain an activity. */\nexport function temporalWorkflowExecutionNotFound(error: unknown): boolean {\n // gRPC status code 5 is NOT_FOUND. The typed guard prevents unrelated\n // provider/HTTP errors carrying a numeric code from proving quiescence.\n return isGrpcServiceError(error) && error.code === 5;\n}\n\n/** Load exactly one role's activity graph. Exported for embedded hosts and the\n * process-RSS conformance benchmark; construction remains side-effect free\n * until an activity first resolves its injected services. */\nexport async function createDefaultWorkerActivities(\n role: OpenGeniWorkerRole,\n dependencies: ActivityDependencies = {},\n) {\n if (dependencies.objectStorage == null) {\n prepareObjectStorageProvider(dependencies.settings ?? getSettings());\n }\n return role === \"control\"\n ? (await import(\"./activities-control\")).createControlActivities(dependencies)\n : (await import(\"./activities-turn\")).createTurnActivities(dependencies);\n}\n\ntype WorkerWorkflowDefinition =\n | { workflowBundle: WorkflowBundleOption }\n | { workflowsPath: string };\n\n/**\n * Resolve the deterministic workflow graph without asking installed hosts to\n * transpile or relocate package TypeScript. Monorepo source execution retains\n * the source path for the local development loop; published dist execution\n * fails closed unless the build-generated sibling artifact is present.\n */\nexport function resolveOpenGeniWorkflowDefinition(\n moduleUrl: string = import.meta.url,\n): WorkerWorkflowDefinition {\n const modulePath = fileURLToPath(moduleUrl).replaceAll(\"\\\\\", \"/\");\n if (modulePath.endsWith(\"/src/index.ts\")) {\n return { workflowsPath: fileURLToPath(new URL(\"./workflows.ts\", moduleUrl)) };\n }\n const codePath = fileURLToPath(new URL(\"./workflow-bundle.js\", moduleUrl));\n if (!existsSync(codePath)) {\n throw new Error(\n `Opengeni workflow bundle is missing at ${codePath}; rebuild or reinstall @opengeni/worker-bundle`,\n );\n }\n return { workflowBundle: { codePath } };\n}\n\nexport function turnCancellationHeartbeatThrottleOptions() {\n return {\n maxHeartbeatThrottleInterval: TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n defaultHeartbeatThrottleInterval: TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n } as const;\n}\n\nexport async function createOpenGeniWorker(options: WorkerOptions): Promise<{\n worker: WorkerRunTarget;\n connection: NativeConnection;\n activityTelemetry?: TurnWorkerActivityTelemetry;\n turnQueueIdentity?: TurnTaskQueueIdentity;\n}> {\n const settings = options.settings ?? getSettings();\n if (options.role === \"control\") {\n // The exported lower-level factory is itself poll-capable. Validate here so\n // embedded hosts cannot bypass the reaper budget contract by omitting the\n // higher-level service and its Schedule-registration lifecycle.\n assertSandboxReaperActivityTimeout(settings);\n }\n const observability =\n options.activityDependencies?.observability ??\n createObservability(settings, { component: `worker-${options.role}` });\n initializeWorkerOutcomeMetrics(observability);\n if (options.role === \"turn\") {\n initializeContextCompactionMetrics(observability);\n }\n if (options.role === \"turn\" && options.workflowBundle) {\n throw new Error(\"workflowBundle is valid only for the control worker role\");\n }\n // Pre-resolve a PRIVATE-registry sandbox image before any turn creates a box.\n // A provider-native OPENGENI_MODAL_IMAGE_ID intentionally bypasses this\n // registry path and is resolved by ModalImageSelector.fromId at create time.\n // Otherwise this is a no-op unless the registry secret + logical ref are both\n // set. Memoized in the provider, so it runs once per process.\n if (options.role === \"turn\") {\n const { ensureModalRegistryImage } = await import(\"@opengeni/runtime/sandbox\");\n await retryStartupDependency(\n \"Modal private-registry image\",\n () => ensureModalRegistryImage(settings),\n {\n ...startupRetryOptions(settings),\n onRetry: (event) => logStartupDependencyRetry(observability, event),\n },\n );\n }\n return constructWithOwnedConnection(\n () =>\n retryStartupDependency(\n \"Temporal\",\n () => NativeConnection.connect(temporalConnectionOptions(settings)),\n {\n ...startupRetryOptions(settings),\n onRetry: (event) => logStartupDependencyRetry(observability, event),\n },\n ),\n async (connection) => {\n let turnWorker: Worker | undefined;\n let cleanupDrainRequested = false;\n const activityDependencies = {\n ...options.activityDependencies,\n settings,\n observability,\n requestWorkerDrain:\n options.activityDependencies?.requestWorkerDrain ??\n (() => {\n if (cleanupDrainRequested) return;\n if (!turnWorker) throw new Error(\"turn worker lifecycle is not initialized\");\n turnWorker.shutdown();\n cleanupDrainRequested = true;\n }),\n };\n const activities =\n options.activities ??\n (await createDefaultWorkerActivities(options.role, activityDependencies));\n const turnConcurrency =\n options.role === \"turn\"\n ? createTurnWorkerConcurrencyPlan(settings, { observability })\n : null;\n const workflowDefinition =\n options.role === \"control\"\n ? options.workflowBundle\n ? { workflowBundle: options.workflowBundle }\n : resolveOpenGeniWorkflowDefinition()\n : {};\n const sharedWorkerOptions = {\n connection,\n namespace: settings.temporalNamespace,\n activities,\n // Cancellation is delivered through an activity heartbeat. Keep the SDK\n // throttle aligned with runAgentTurn's local heartbeat cadence so the\n // four-second control contract still has time for physical writer drain\n // and exact receipt-gated replacement admission.\n ...turnCancellationHeartbeatThrottleOptions(),\n // GRACEFUL DEPLOY SHUTDOWN (with the SIGTERM handler in startWorker):\n // after shutdown() stops polling, in-flight activities get this long to\n // finish naturally; the rest are then CANCELLED with WORKER_SHUTDOWN.\n shutdownGraceTime: \"5s\",\n // Hard ceiling inside the pod's termination grace period.\n shutdownForceTime: \"100s\",\n } as const;\n const worker = await Worker.create({\n ...sharedWorkerOptions,\n taskQueue:\n options.role === \"control\"\n ? settings.temporalTaskQueue\n : turnTaskQueue(settings.temporalTaskQueue),\n ...(options.role === \"control\"\n ? {\n ...workflowDefinition,\n reuseV8Context: true,\n workflowThreadPoolSize: 1,\n maxCachedWorkflows: CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n maxConcurrentWorkflowTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n maxConcurrentActivityTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n }\n : turnConcurrency!.options),\n });\n if (options.role !== \"control\") {\n turnWorker = worker;\n turnConcurrency?.admission?.finalizeStartupBaseline();\n const turnQueueIdentity = {\n temporalNamespace: worker.options.namespace,\n taskQueue: worker.options.taskQueue,\n };\n return {\n ...withTurnWorkerActivityTelemetry(worker, {\n observability,\n identity: turnQueueIdentity,\n // No invented identity when running outside Kubernetes. Scaler\n // consumers must reject empty/missing UID coverage.\n podUid: process.env.OPENGENI_POD_UID ?? \"\",\n }),\n connection,\n turnQueueIdentity,\n };\n }\n\n const ownedWorkers = [worker];\n try {\n // The new activity type has its own queue. Retain the V1 poller so old\n // drain histories finish; old binaries never receive checkpoint work.\n for (const taskQueue of [\n sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n browserDeadlineCheckpointTaskQueue(settings.temporalTaskQueue),\n ]) {\n const lifecycleWorker = await Worker.create({\n ...sharedWorkerOptions,\n ...workflowDefinition,\n taskQueue,\n reuseV8Context: true,\n workflowThreadPoolSize: 1,\n maxCachedWorkflows: CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n maxConcurrentWorkflowTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n maxConcurrentActivityTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n });\n ownedWorkers.push(lifecycleWorker);\n }\n return {\n worker: combineWorkerRunTargets(ownedWorkers),\n connection,\n };\n } catch (error) {\n for (const ownedWorker of ownedWorkers) {\n try {\n ownedWorker.shutdown();\n } catch {\n // Preserve the lifecycle worker construction failure. The base poller\n // still received its shutdown request; a secondary synchronous\n // shutdown error must not replace the startup root cause.\n }\n }\n throw error;\n }\n },\n (connection) => connection.close(),\n );\n}\n\n// A signalWithStart capability so a worker activity can wake a PARENT\n// session's workflow when a spawned worker completes (the parent may have\n// idled and let its run finish, so a plain signal would not start one).\n// Separate from the worker's NativeConnection: the @temporalio/client\n// Connection is what exposes workflow.signalWithStart.\nexport async function createWorkerWorkflowSignaler(\n settings: Settings,\n db: Database,\n): Promise<{\n wakeSessionWorkflow: WakeSessionWorkflowSignal;\n signalSessionAttemptQuiesced: SignalSessionAttemptQuiesced;\n inspectSessionAttemptActivity: InspectSessionAttemptActivity;\n signalCodexCapacityWorkflow: SignalCodexCapacityWorkflow;\n getTurnTaskQueueStats: (\n options?: TurnTaskQueueReadOptions,\n identity?: TurnTaskQueueIdentity,\n ) => Promise<TurnTaskQueueStats>;\n startSandboxReaperWorkflow: StartSandboxReaperWorkflow;\n startVideoGenerationWorkflow: StartVideoGenerationWorkflow;\n check: () => Promise<void>;\n close: () => Promise<void>;\n}> {\n const connectionOptions = temporalConnectionOptions(settings);\n const connection = await Connection.connect(connectionOptions);\n const statsClient = createTurnTaskQueueStatsClient(connectionOptions);\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n return {\n wakeSessionWorkflow: async ({\n accountId,\n workspaceId,\n sessionId,\n workflowId,\n wakeRevision,\n interruptionRequested,\n onSignalAccepted,\n }) => {\n if (interruptionRequested) {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"sessionControl\",\n signalArgs: [],\n });\n } else {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"queueChanged\",\n });\n }\n onSignalAccepted?.();\n return await markSessionWorkflowWakeDelivered(db, {\n accountId,\n workspaceId,\n sessionId,\n temporalWorkflowId: workflowId,\n wakeRevision,\n });\n },\n signalSessionAttemptQuiesced: async (proof) => {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId: proof.workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [\n {\n accountId: proof.accountId,\n workspaceId: proof.workspaceId,\n sessionId: proof.sessionId,\n },\n ],\n signal: \"sessionAttemptQuiesced\",\n signalArgs: [proof],\n });\n // No wake-outbox row exists yet: the direct receipt transaction failed.\n // The signalled workflow's DB-only control activity owns committing the\n // receipt and its exact wake revision atomically.\n },\n inspectSessionAttemptActivity: async ({ workflowId, workflowRunId, activityId }) => {\n let description;\n try {\n description = await connection.workflowService.describeWorkflowExecution({\n namespace: settings.temporalNamespace,\n execution: { workflowId, runId: workflowRunId },\n });\n } catch (error) {\n if (temporalWorkflowExecutionNotFound(error)) return \"settled\";\n throw error;\n }\n const pending = description.pendingActivities?.find(\n (activity) => activity.activityId === activityId,\n );\n return temporalActivityLeaseSettled(pending) ? \"settled\" : \"pending\";\n },\n signalCodexCapacityWorkflow: async ({\n accountId,\n workspaceId,\n sessionId,\n workflowId,\n wakeRevision,\n }) => {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"codexCapacityChanged\",\n signalArgs: [wakeRevision],\n });\n // A typed capacity signal cannot acknowledge the generic outbox row:\n // another producer may have advanced it with a Pause/Steer that requires\n // sessionControl. The global dispatcher owns that acknowledgement.\n },\n getTurnTaskQueueStats: (\n readOptions = { signal: new AbortController().signal, deadline: Date.now() + 5_000 },\n identity = {\n temporalNamespace: settings.temporalNamespace,\n taskQueue: turnTaskQueue(settings.temporalTaskQueue),\n },\n ) => statsClient.read(readOptions, identity),\n startSandboxReaperWorkflow: async () => {\n // Same backend tick, no additional schedule. A bounded independent\n // inventory cannot prevent the existing per-box drain from starting.\n const starts = await Promise.allSettled([\n temporal.workflow.start(\"sandboxReaperWorkflowV2\", {\n taskQueue: sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n workflowId: SANDBOX_REAPER_V2_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n temporal.workflow.start(\"browserDeadlineCheckpointSweepWorkflow\", {\n taskQueue: browserDeadlineCheckpointTaskQueue(settings.temporalTaskQueue),\n workflowId: BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n // Its own workflow type, so the drain workflow's history is unchanged.\n temporal.workflow.start(\"sandboxIdleCheckpointSweepWorkflow\", {\n taskQueue: sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n workflowId: SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n ]);\n for (const start of starts) {\n if (\n start.status === \"rejected\" &&\n !(start.reason instanceof WorkflowExecutionAlreadyStartedError)\n ) {\n // The other start already settled. Retry the router without losing\n // ordinary draining or silently omitting the checkpoint sweep.\n throw start.reason;\n }\n }\n return starts[0].status === \"fulfilled\" ? \"started\" : \"already_running\";\n },\n startVideoGenerationWorkflow: async ({ accountId, workspaceId, operationId }) => {\n try {\n await temporal.workflow.start(\"videoGenerationWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId: `video-generation:${operationId}`,\n // Reject a concurrent or already-completed run, but allow the repair\n // sweep to restart this exact operation if the workflow itself failed.\n // Every provider/storage transition remains CAS/idempotency fenced in\n // Postgres, so recovery never creates a second logical operation.\n workflowIdReusePolicy: \"ALLOW_DUPLICATE_FAILED_ONLY\",\n args: [\n {\n accountId,\n workspaceId,\n operationId,\n baseTaskQueue: settings.temporalTaskQueue,\n },\n ],\n });\n return \"started\";\n } catch (error) {\n if (error instanceof WorkflowExecutionAlreadyStartedError) {\n return \"already_running\";\n }\n throw error;\n }\n },\n check: async () => {\n await connection.workflowService.getSystemInfo({});\n },\n close: async () => {\n await Promise.all([statsClient.close(), connection.close()]);\n },\n };\n}\n\n/**\n * Register the one provider-neutral expired direct-upload cleanup Schedule.\n * Unlike sandbox GC this is always registered: file uploads can be enabled in\n * deployments where sandbox ownership is disabled. The activity is a cheap\n * no-op when object storage is not configured.\n */\nexport async function registerFileUploadReaperSchedule(\n settings: Settings,\n observability: Observability,\n): Promise<{ registered: boolean; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(settings));\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n try {\n await temporal.schedule.create({\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n spec: { intervals: [{ every: FILE_UPLOAD_REAPER_PERIOD_MS }] },\n action: {\n type: \"startWorkflow\",\n workflowType: \"fileUploadReaperWorkflow\",\n taskQueue: settings.temporalTaskQueue,\n args: [],\n },\n policies: {\n overlap: ScheduleOverlapPolicy.SKIP,\n catchupWindow: \"1m\",\n pauseOnFailure: false,\n },\n });\n observability.info(\"Registered the global file-upload reaper Schedule\", {\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n reaperPeriodMs: FILE_UPLOAD_REAPER_PERIOD_MS,\n });\n return { registered: true, close: async () => connection.close() };\n } catch (error) {\n if (error instanceof ScheduleAlreadyRunning) {\n observability.info(\"Global file-upload reaper Schedule already registered\", {\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n });\n return { registered: false, close: async () => connection.close() };\n }\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n\n/**\n * Register the deployment-wide session storage maintenance Schedule. Always\n * registered: legacy content compaction is lossless. Overlap is skipped so one\n * pass never races another.\n */\nexport async function registerSessionStorageMaintenanceSchedule(\n settings: Settings,\n observability: Observability,\n): Promise<{ registered: boolean; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(settings));\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n try {\n await temporal.schedule.create({\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n spec: { intervals: [{ every: SESSION_STORAGE_MAINTENANCE_PERIOD_MS }] },\n action: {\n type: \"startWorkflow\",\n workflowType: \"sessionStorageMaintenanceWorkflow\",\n taskQueue: settings.temporalTaskQueue,\n args: [],\n },\n policies: {\n overlap: ScheduleOverlapPolicy.SKIP,\n catchupWindow: \"1m\",\n pauseOnFailure: false,\n },\n });\n observability.info(\"Registered the session storage maintenance Schedule\", {\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n periodMs: SESSION_STORAGE_MAINTENANCE_PERIOD_MS,\n });\n return { registered: true, close: async () => connection.close() };\n } catch (error) {\n if (error instanceof ScheduleAlreadyRunning) {\n observability.info(\"Session storage maintenance Schedule already registered\", {\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n });\n return { registered: false, close: async () => connection.close() };\n }\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n\nexport type OpenGeniWorkerServiceOptions = Omit<WorkerOptions, \"activityDependencies\"> & {\n activityDependencies: ActivityDependencies & { db: Database; bus: EventBus };\n /** Host-owned final containment after a stalled cleanup has drained peers.\n * The standalone process exits; embedded hosts own their termination policy. */\n terminateWorker?: () => void;\n /**\n * Exact catalog posture required by the standalone runtime. Embedded hosts\n * may omit this when they own an equivalent database isolation contract.\n */\n databasePosture?: RuntimeDatabasePostureOptions;\n /**\n * `role-default` registers Opengeni's internal maintenance schedules on a\n * control worker only. These are engine maintenance schedules, not a host's\n * product-level scheduled-agent jobs. Use `none` when another control worker\n * in the same deployment owns them.\n */\n internalSchedules?: \"role-default\" | \"none\";\n /**\n * Set false only when the host exposes equivalent lifecycle endpoints itself.\n * A dedicated readiness database prevents ordinary activity-pool saturation\n * from making an otherwise healthy Temporal worker fail Kubernetes readiness.\n * The embedding host retains ownership of this handle.\n */\n http?: false | { readinessTimeoutMs?: number; readinessDb?: Database };\n};\n\nexport type OpenGeniWorkerService = {\n readonly role: OpenGeniWorkerRole;\n readonly worker: WorkerRunTarget;\n readonly connection: NativeConnection;\n state(): WorkerLifecycleState;\n run(): Promise<void>;\n drain(reason?: string): void;\n close(): Promise<void>;\n};\n\nexport function workerOwnsInternalSchedules(\n role: OpenGeniWorkerRole,\n policy: OpenGeniWorkerServiceOptions[\"internalSchedules\"] = \"role-default\",\n): boolean {\n return role === \"control\" && policy !== \"none\";\n}\n\n/**\n * Construct one role-specific worker process around the lower-level Temporal\n * worker factory. The service owns every Temporal client and HTTP listener it\n * creates. The embedding host retains ownership of its injected DB and EventBus\n * handles and closes those only after this service has drained.\n */\nexport async function createOpenGeniWorkerService(\n options: OpenGeniWorkerServiceOptions,\n): Promise<OpenGeniWorkerService> {\n requireSessionEventDurableFanoutCapability(options.activityDependencies.bus);\n const settings = options.settings ?? getSettings();\n const observability =\n options.activityDependencies.observability ??\n createObservability(settings, { component: `worker-${options.role}` });\n const retryOptions = startupRetryOptions(settings);\n const onRetry = (event: Parameters<typeof logStartupDependencyRetry>[1]) =>\n logStartupDependencyRetry(observability, event);\n let lifecycle: WorkerServiceLifecycle | undefined;\n let cleanupContainment: ReturnType<typeof createWorkerCleanupContainment> | undefined;\n let signaler: Awaited<ReturnType<typeof createWorkerWorkflowSignaler>> | undefined;\n let workerBundle: Awaited<ReturnType<typeof createOpenGeniWorker>> | undefined;\n let turnCapacityMonitor: ReturnType<typeof startTurnCapacityMonitor> | undefined;\n let sessionRecoveryMonitor: ReturnType<typeof startSessionRecoveryMonitor> | undefined;\n let contextCompactionPendingMonitor:\n | ReturnType<typeof startContextCompactionPendingMonitor>\n | undefined;\n const schedules: Array<{ close: () => Promise<void> }> = [];\n let httpServer: ReturnType<typeof startWorkerHttpServer> | undefined;\n let memoryPressureGuard: TurnWorkerMemoryPressureGuard | undefined;\n\n try {\n const resolvedCatalog = await retryStartupDependency(\n \"model catalog\",\n () => resolveCatalogSettings(options.activityDependencies.db, settings),\n { ...retryOptions, onRetry },\n );\n observability.info(\"Opengeni model catalog resolved\", {\n role: options.role,\n catalogSource: resolvedCatalog.source,\n catalogVersion: resolvedCatalog.version,\n });\n const needsSignaler =\n options.role === \"turn\" ||\n !options.activityDependencies.wakeSessionWorkflow ||\n !options.activityDependencies.signalSessionAttemptQuiesced ||\n !options.activityDependencies.inspectSessionAttemptActivity ||\n !options.activityDependencies.signalCodexCapacityWorkflow ||\n !options.activityDependencies.startSandboxReaperWorkflow ||\n !options.activityDependencies.startVideoGenerationWorkflow;\n if (needsSignaler) {\n signaler = await retryStartupDependency(\n \"Temporal client\",\n () => createWorkerWorkflowSignaler(settings, options.activityDependencies.db),\n { ...retryOptions, onRetry },\n );\n }\n const wakeSessionWorkflow =\n options.activityDependencies.wakeSessionWorkflow ?? signaler?.wakeSessionWorkflow;\n const signalSessionAttemptQuiesced =\n options.activityDependencies.signalSessionAttemptQuiesced ??\n signaler?.signalSessionAttemptQuiesced;\n const inspectSessionAttemptActivity =\n options.activityDependencies.inspectSessionAttemptActivity ??\n signaler?.inspectSessionAttemptActivity;\n const signalCodexCapacityWorkflow =\n options.activityDependencies.signalCodexCapacityWorkflow ??\n signaler?.signalCodexCapacityWorkflow;\n const startSandboxReaperWorkflow =\n options.activityDependencies.startSandboxReaperWorkflow ??\n signaler?.startSandboxReaperWorkflow;\n const startVideoGenerationWorkflow =\n options.activityDependencies.startVideoGenerationWorkflow ??\n signaler?.startVideoGenerationWorkflow;\n if (\n !wakeSessionWorkflow ||\n !signalSessionAttemptQuiesced ||\n !inspectSessionAttemptActivity ||\n !signalCodexCapacityWorkflow ||\n !startSandboxReaperWorkflow ||\n !startVideoGenerationWorkflow\n ) {\n throw new Error(\"Opengeni worker lifecycle could not resolve its workflow signalers\");\n }\n workerBundle = await createOpenGeniWorker({\n role: options.role,\n settings,\n ...(options.activities ? { activities: options.activities } : {}),\n ...(options.workflowBundle ? { workflowBundle: options.workflowBundle } : {}),\n activityDependencies: {\n ...options.activityDependencies,\n settings,\n observability,\n wakeSessionWorkflow,\n signalSessionAttemptQuiesced,\n inspectSessionAttemptActivity,\n signalCodexCapacityWorkflow,\n startSandboxReaperWorkflow,\n startVideoGenerationWorkflow,\n requestWorkerDrain: () => {\n if (!cleanupContainment) throw new Error(\"worker cleanup containment is not initialized\");\n cleanupContainment.request();\n },\n },\n });\n\n if (options.role === \"turn\") {\n if (!signaler) {\n throw new Error(\"Turn worker capacity monitor could not resolve its Temporal stats client\");\n }\n const statsClient = signaler;\n const identity = workerBundle.turnQueueIdentity;\n if (!identity)\n throw new Error(\"Turn worker did not expose its actual Temporal queue identity\");\n turnCapacityMonitor = startTurnCapacityMonitor({\n observability,\n read: (readOptions) => statsClient.getTurnTaskQueueStats(readOptions, identity),\n identity,\n });\n } else {\n sessionRecoveryMonitor = startSessionRecoveryMonitor({\n observability,\n read: async () => await summarizeSessionRecoveryBacklog(options.activityDependencies.db),\n });\n contextCompactionPendingMonitor = startContextCompactionPendingMonitor({\n observability,\n read: async () => await getContextCompactionPendingSummary(options.activityDependencies.db),\n });\n }\n\n if (workerOwnsInternalSchedules(options.role, options.internalSchedules)) {\n schedules.push(\n await retryStartupDependency(\n \"Temporal schedule (file upload reaper)\",\n () => registerFileUploadReaperSchedule(settings, observability),\n { ...retryOptions, onRetry },\n ),\n );\n schedules.push(\n await retryStartupDependency(\n \"Temporal schedule (session storage maintenance)\",\n () => registerSessionStorageMaintenanceSchedule(settings, observability),\n { ...retryOptions, onRetry },\n ),\n );\n schedules.push(\n await retryStartupDependency(\n \"work-checked maintenance cadences\",\n () =>\n startInternalMaintenanceCadences({\n settings,\n observability,\n db: options.activityDependencies.db,\n ...(options.activityDependencies.documentServices\n ? { documentServices: options.activityDependencies.documentServices }\n : {}),\n }),\n { ...retryOptions, onRetry },\n ),\n );\n }\n\n if (options.http !== false) {\n const readinessDb = options.http?.readinessDb ?? options.activityDependencies.db;\n const databaseReady = dbReadyCheck(readinessDb, options.databasePosture, async () => {\n await resolveCatalogSettings(readinessDb, settings);\n });\n httpServer = startWorkerHttpServer({\n settings,\n observability,\n checks: {\n db: databaseReady,\n nats: natsReadyCheck(options.activityDependencies.bus),\n temporal: temporalReadyCheck(workerBundle.connection),\n },\n ...(options.http?.readinessTimeoutMs ? { timeoutMs: options.http.readinessTimeoutMs } : {}),\n lifecycle: { role: options.role, state: () => lifecycle?.state() ?? \"starting\" },\n });\n }\n } catch (error) {\n workerBundle?.activityTelemetry?.closeIfNeverRun();\n httpServer?.stop(true);\n await Promise.allSettled([\n turnCapacityMonitor?.close(),\n sessionRecoveryMonitor?.close(),\n contextCompactionPendingMonitor?.close(),\n workerBundle?.connection.close(),\n signaler?.close(),\n ...schedules.map((schedule) => schedule.close()),\n ]);\n throw error;\n }\n\n const activeWorkerBundle = workerBundle;\n const activeSignaler = signaler;\n if (!activeWorkerBundle) {\n throw new Error(\"Opengeni worker service initialization did not complete\");\n }\n\n cleanupContainment = createWorkerCleanupContainment({\n drain: () => lifecycle?.drain(\"stalled turn finalization\") ?? false,\n ...(options.terminateWorker ? { terminate: options.terminateWorker } : {}),\n observability,\n });\n const activeCleanupContainment = cleanupContainment;\n lifecycle = createWorkerServiceLifecycle({\n role: options.role,\n worker: {\n shutdown: () => activeWorkerBundle.worker.shutdown(),\n run: async () => {\n await activeWorkerBundle.worker.run();\n activeCleanupContainment.finished();\n },\n },\n observability,\n closeOwnedResources: async () => {\n memoryPressureGuard?.close();\n closeWorkerHttpAfterActivityExecution(activeWorkerBundle.activityTelemetry, () =>\n httpServer?.stop(true),\n );\n await Promise.allSettled([\n turnCapacityMonitor?.close(),\n sessionRecoveryMonitor?.close(),\n contextCompactionPendingMonitor?.close(),\n activeWorkerBundle.connection.close(),\n activeSignaler?.close(),\n ...schedules.map((schedule) => schedule.close()),\n ]);\n },\n onReady: () => {\n observability.info(\"Opengeni worker listening\", {\n role: options.role,\n temporalTaskQueue:\n options.role === \"control\"\n ? settings.temporalTaskQueue\n : turnTaskQueue(settings.temporalTaskQueue),\n ...(options.role === \"turn\"\n ? turnWorkerConcurrencyLogFields(settings)\n : {\n concurrencyMode: \"fixed\",\n maxConcurrentTurns: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n targetCpuUsage: null,\n targetMemoryUsage: null,\n }),\n maxConcurrentWorkflowTaskExecutions:\n options.role === \"control\" ? CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS : 0,\n maxCachedWorkflows: options.role === \"control\" ? CONTROL_WORKER_MAX_CACHED_WORKFLOWS : 0,\n httpPort: options.http === false ? null : settings.workerHttpPort,\n });\n },\n });\n const activeLifecycle = lifecycle;\n\n if (turnWorkerMemoryPressureGuardEnabled(options.role, settings)) {\n try {\n memoryPressureGuard = createTurnWorkerMemoryPressureGuard({\n settings,\n observability,\n drain: () => {\n if (!activeLifecycle.drain(\"memory pressure guard\")) {\n throw new Error(\"worker shutdown request failed\");\n }\n },\n });\n } catch (error) {\n await activeLifecycle.close();\n throw error;\n }\n }\n\n return {\n role: options.role,\n worker: activeWorkerBundle.worker,\n connection: activeWorkerBundle.connection,\n state: activeLifecycle.state,\n run: activeLifecycle.run,\n drain: (reason) => {\n activeLifecycle.drain(reason);\n },\n close: activeLifecycle.close,\n };\n}\n\nexport type RunOpenGeniWorkerOptions = OpenGeniWorkerServiceOptions & {\n /** Defaults to SIGTERM and SIGINT. Pass false when the host owns process signals. */\n shutdownSignals?: false | ReadonlyArray<\"SIGTERM\" | \"SIGINT\">;\n};\n\n/** Start, drain, and close one embedded worker process. */\nexport async function runOpenGeniWorker(options: RunOpenGeniWorkerOptions): Promise<void> {\n const service = await createOpenGeniWorkerService(options);\n // Reclaim multi-gigabyte workspace archive spools left by a previous worker\n // process that stopped mid-capture/upload. Only provably dead owners' spools\n // are removed, so peers sharing this TMPDIR are unaffected.\n void import(\"@opengeni/runtime/sandbox\")\n .then(({ sweepOrphanedHostArchiveTemporaryDirectoriesOnce }) =>\n sweepOrphanedHostArchiveTemporaryDirectoriesOnce(),\n )\n .then((removed) => {\n if (removed.length > 0) {\n options.activityDependencies.observability?.info(\n \"worker removed orphaned workspace archive spools\",\n { count: removed.length },\n );\n }\n })\n .catch(() => undefined);\n const signals =\n options.shutdownSignals === false ? [] : (options.shutdownSignals ?? [\"SIGTERM\", \"SIGINT\"]);\n const handlers = signals.map((signal) => {\n const handler = () => service.drain(signal);\n process.on(signal, handler);\n return { signal, handler };\n });\n try {\n await service.run();\n } finally {\n for (const { signal, handler } of handlers) {\n process.off(signal, handler);\n }\n await service.close();\n }\n}\n\nexport async function startWorker() {\n const role = process.env.OPENGENI_WORKER_ROLE;\n if (role !== \"control\" && role !== \"turn\") {\n throw new Error(\"OPENGENI_WORKER_ROLE must be explicitly set to 'control' or 'turn'\");\n }\n const settings = getSettings();\n const observability = createObservability(settings, { component: `worker-${role}` });\n // Before any NativeConnection: SDK and core logs become structured lines.\n installTemporalRuntimeLogging(observability);\n // The Agents SDK also listens for unhandled rejections and exits the process.\n // Keep detached SDK/transport promises observational here: durable turn\n // activity boundaries own failures, while process exit causes cross-session\n // lease loss for every turn assigned to this shared worker pod.\n const disposeUnhandledRejectionBoundary = installWorkerUnhandledRejectionBoundary();\n const retryOptions = startupRetryOptions(settings);\n const onRetry = (event: Parameters<typeof logStartupDependencyRetry>[1]) =>\n logStartupDependencyRetry(observability, event);\n const searchPath = dbSearchPath(settings);\n const dbClient = createDb(settings.databaseUrl, {\n ...(searchPath ? { searchPath } : {}),\n rlsStrategy: settings.rlsStrategy,\n });\n // Readiness must prove PostgreSQL independently of activity demand. Sharing\n // the default application pool makes the probe wait behind live turns when\n // all ten slots are occupied, even while PostgreSQL itself is healthy. Since\n // Kubernetes readiness cannot stop Temporal polling, that false negative\n // only wedges rollouts and service health; reserve one probe connection.\n const readinessDbClient = createDb(settings.databaseUrl, {\n ...(searchPath ? { searchPath } : {}),\n rlsStrategy: settings.rlsStrategy,\n max: 1,\n });\n const databasePosture = {\n rlsStrategy: settings.rlsStrategy,\n expectedRole: settings.runtimeDatabaseRole,\n targetSchema: settings.dbSchema.trim() || \"public\",\n } as const;\n const controlPlaneAuth = resolveNatsControlPlaneAuth(settings);\n let bus: Awaited<ReturnType<typeof createNatsEventBus>> | undefined;\n try {\n await retryStartupDependency(\n \"PostgreSQL runtime posture\",\n () => assertRuntimeDatabasePosture(dbClient.db, databasePosture),\n { ...retryOptions, onRetry, shouldRetry: isRetryableRuntimeDatabaseStartupError },\n );\n bus = await retryStartupDependency(\n \"NATS\",\n () =>\n createNatsEventBus(\n settings.natsUrl,\n controlPlaneAuth\n ? { user: controlPlaneAuth.user, pass: controlPlaneAuth.password }\n : undefined,\n observabilityEventBusOptions(observability),\n ),\n { ...retryOptions, onRetry },\n );\n await runOpenGeniWorker({\n role,\n terminateWorker: () => process.exit(1),\n settings,\n databasePosture,\n http: { readinessDb: readinessDbClient.db },\n activityDependencies: {\n observability,\n db: dbClient.db,\n bus,\n },\n });\n } finally {\n await Promise.allSettled([\n closeNativeExternalVaultProviders(),\n bus?.close(),\n readinessDbClient.close(),\n dbClient.close(),\n ]);\n disposeUnhandledRejectionBoundary();\n }\n}\n\nif (import.meta.main) {\n // `bun --watch` keeps its supervisor alive after the application consumes\n // SIGINT. Once the worker, NATS, DB, and Temporal resources have all closed,\n // explicitly terminate that supervisor too; otherwise a later file edit can\n // resurrect this stopped process as a duplicate worker with stale env/code.\n let interrupted = false;\n const markInterrupted = () => {\n interrupted = true;\n };\n process.once(\"SIGINT\", markInterrupted);\n try {\n await startWorker();\n } finally {\n process.off(\"SIGINT\", markInterrupted);\n if (interrupted) process.exit(0);\n }\n}\n","import {\n ActivityCancellationType,\n ActivityFailure,\n ApplicationFailure,\n proxyActivities,\n} from \"@temporalio/workflow\";\nimport type * as activities from \"../activities\";\nimport {\n KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS,\n KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS,\n} from \"../knowledge-source-sync-activity-policy\";\n\ntype WorkflowControlActivities = Pick<\n typeof activities,\n | \"enqueueGoalRetryWake\"\n | \"expireSessionHumanInput\"\n | \"expireSessionInteractionIntervention\"\n | \"expireScheduledRunHumanWait\"\n | \"failSessionAttempt\"\n | \"getCodexCapacityWait\"\n | \"markSessionIdle\"\n | \"peekSessionWork\"\n | \"persistSessionAttemptQuiescence\"\n | \"reconcileSessionAttemptQuiescence\"\n | \"reconcileSettledSessionAttempt\"\n | \"reconcileCodexCapacityWait\"\n | \"recoverDispatch\"\n | \"recoverEscapedMcpTimeout\"\n | \"settleSessionInterruptions\"\n | \"settleSessionInputWait\"\n>;\n\n/**\n * Session/schedule workflow control activities are bounded, idempotent database\n * and provider-metadata operations. They must not inherit the agent turn's\n * 30-day attempt: Temporal cannot otherwise detect that the pod which accepted\n * a non-heartbeating control activity disappeared, leaving the workflow pinned\n * to a dead worker for the full 30 days. A bounded attempt plus an unbounded\n * Temporal retry keeps the durable workflow alive across rollout, node loss, or\n * transient database/network failure; retries re-run on a healthy control pod.\n */\nexport const activity = proxyActivities<WorkflowControlActivities>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n },\n});\n\n/** One schedule occurrence is bounded. Transient control-plane failures get a\n * short retry window, but a revoked binding or other permanent task error must\n * not leave a Temporal activity retrying forever; the next scheduled occurrence\n * is an independent workflow and will re-evaluate current state. */\nexport const scheduledTaskActivity = proxyActivities<\n Pick<typeof activities, \"dispatchScheduledTaskRun\">\n>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 5,\n },\n});\n\nexport const automationActivity = proxyActivities<Pick<typeof activities, \"dispatchAutomationRun\">>(\n {\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 5,\n },\n },\n);\n\n/** Dispatch has a bounded retry window, but an accepted automation event must\n * not remain durably `dispatching` after that window closes. This compensating\n * database write is idempotent and retries without a cap until the run reaches\n * a terminal state (or is observed as already dispatched). */\nexport const automationFailureActivity = proxyActivities<\n Pick<typeof activities, \"settleAutomationRunFailure\">\n>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n },\n});\n\n/** Goal continuation evaluates a durable Postgres obligation at an idle\n * boundary. A transient failure gets a short retry window, then records an\n * explicit delayed outbox wake instead of relying on an unrelated mutation or\n * keeping workflow history alive with polling. */\nexport const goalActivity = proxyActivities<Pick<typeof activities, \"maybeContinueGoal\">>({\n startToCloseTimeout: \"30 seconds\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"5 seconds\",\n maximumAttempts: 3,\n },\n});\n\nexport function turnTaskQueue(baseTaskQueue: string): string {\n return `${baseTaskQueue}-turns`;\n}\n\nexport function turnActivityForTaskQueue(baseTaskQueue: string, receiptGatedCancellation = true) {\n return proxyActivities<Pick<typeof activities, \"runAgentTurn\">>({\n taskQueue: turnTaskQueue(baseTaskQueue),\n // Agent segments legitimately run for days. A started turn heartbeats;\n // queued activities remain queued truthfully until a capped turn worker\n // accepts them and performs the atomic claim.\n startToCloseTimeout: \"30 days\",\n heartbeatTimeout: \"2 minutes\",\n // Pause/Steer first closes the exact attempt in Postgres, then asks\n // Temporal to deliver cancellation. The workflow must not wait for the\n // Temporal activity promise: a provider cleanup promise can outlive the\n // fenced activity body, and Temporal terminalization is not proof that\n // sandbox tools or processes are physically quiescent. The activity owns\n // that proof and writes an exact receipt after its hard tool fence; the\n // receipt transaction wakes the workflow to admit a replacement.\n cancellationType: receiptGatedCancellation\n ? ActivityCancellationType.TRY_CANCEL\n : ActivityCancellationType.WAIT_CANCELLATION_COMPLETED,\n retry: { maximumAttempts: 1 },\n });\n}\n\nexport function videoGenerationActivityForTaskQueue(baseTaskQueue: string) {\n return proxyActivities<Pick<typeof activities, \"reconcileVideoGenerationOperation\">>({\n taskQueue: turnTaskQueue(baseTaskQueue),\n startToCloseTimeout: \"20 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 3,\n },\n });\n}\n\nexport const documentActivity = proxyActivities<Pick<typeof activities, \"indexDocument\">>({\n startToCloseTimeout: \"30 minutes\",\n retry: { maximumAttempts: 1 },\n});\n\n/** Connector inventory/download/index batches are provider-I/O activities. The\n * implementation heartbeats between bounded items and owns its resumable\n * checkpoint; Temporal retries therefore repeat only idempotent source/object\n * operations and never invoke the agent runtime. */\nexport const knowledgeSourceSyncActivity = proxyActivities<\n Pick<typeof activities, \"runKnowledgeSourceSyncBatch\">\n>({\n startToCloseTimeout: \"1 hour\",\n heartbeatTimeout: KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS,\n retry: {\n initialInterval: \"2 seconds\",\n backoffCoefficient: 2,\n maximumInterval: \"1 minute\",\n maximumAttempts: KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS,\n },\n});\n\nexport function workflowFailureMessage(error: unknown): string {\n if (\n error instanceof ActivityFailure &&\n error.activityType === \"runAgentTurn\" &&\n error.cause instanceof ApplicationFailure &&\n error.cause.type === \"TurnExecutionPolicyDefinitionMismatchError\"\n ) {\n return error.cause.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","export const KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS = 120_000;\nexport const KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS = 1;\n","import { Connection, type ConnectionOptions } from \"@temporalio/client\";\nimport {\n normalizeTurnTaskQueueStats,\n type TurnTaskQueueIdentity,\n type TurnTaskQueueReadOptions,\n type TurnTaskQueueStats,\n} from \"./observability-metrics\";\nimport {\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\n\n/** Own diagnostic traffic separately from admission/signaling. SDK1.22's retry\n * interceptor does not cancel backoff or replacement calls, so each diagnostic\n * RPC is one native attempt; the monitor schedules any later observation.\n * Lazy construction avoids another startup/connect retry or an unbounded probe. */\nexport function createTurnTaskQueueStatsClient(\n connectionOptions: ConnectionOptions,\n input: { scheduler?: TelemetryScheduler; closeTimeoutMs?: number } = {},\n): {\n read(\n options: TurnTaskQueueReadOptions,\n identity: TurnTaskQueueIdentity,\n ): Promise<TurnTaskQueueStats>;\n close(): Promise<void>;\n} {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const closeTimeoutMs = telemetryInterval(\n input.closeTimeoutMs ?? 1_000,\n \"queue client closeTimeoutMs\",\n );\n let connection: Connection | undefined;\n let closed = false;\n let closing: Promise<void> | undefined;\n const active = new Set<AbortController>();\n return {\n read: async ({ signal, deadline }, identity) => {\n signal.throwIfAborted();\n if (closed) throw new Error(\"turn task-queue diagnostic client is closed\");\n const controller = new AbortController();\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n active.add(controller);\n try {\n connection ??= Connection.lazy({ ...connectionOptions, interceptors: [] });\n const stats = await createTurnTaskQueueStatsReader(\n connection,\n identity,\n )({\n signal: controller.signal,\n deadline,\n });\n controller.signal.throwIfAborted(); // Close/abort cannot resurrect a late result.\n return stats;\n } finally {\n active.delete(controller);\n signal.removeEventListener(\"abort\", abort);\n }\n },\n close: () => {\n if (closing) return closing;\n closed = true;\n for (const controller of active) controller.abort();\n const owned = connection;\n if (!owned) return (closing = Promise.resolve());\n closing = new Promise<void>((resolve) => {\n const cancelTimeout = scheduler.timeout(resolve, closeTimeoutMs);\n const settled = () => {\n cancelTimeout();\n resolve();\n };\n try {\n void owned.close().then(settled, settled);\n } catch {\n settled(); // Diagnostic close failure must not break worker cleanup.\n }\n });\n return closing;\n },\n };\n}\n\n/** Scope only this diagnostic RPC, never signal/start/admission traffic. Both\n * call-context APIs are public in the pinned Temporal TS SDK 1.22. The caller\n * must supply a retry-disabled connection (the owned client above does so). */\nexport function createTurnTaskQueueStatsReader(\n connection: Pick<Connection, \"workflowService\" | \"withDeadline\" | \"withAbortSignal\">,\n identity: TurnTaskQueueIdentity,\n): (options: TurnTaskQueueReadOptions) => Promise<TurnTaskQueueStats> {\n return async ({ signal, deadline }) => {\n // SDK1.22 installs its cancel listener when creating the gRPC call; do not\n // launch a call with an already-aborted signal whose event has passed.\n signal.throwIfAborted();\n return connection.withAbortSignal(signal, () =>\n connection.withDeadline(deadline, async () => {\n signal.throwIfAborted();\n const response = await connection.workflowService.describeTaskQueue({\n namespace: identity.temporalNamespace,\n taskQueue: { name: identity.taskQueue },\n // TASK_QUEUE_TYPE_ACTIVITY, supported DEFAULT mode. This is the shared\n // turn-worker activity queue (also video/retries), not a turn count.\n taskQueueType: 2,\n reportStats: true,\n });\n return normalizeTurnTaskQueueStats(response.stats);\n }),\n );\n };\n}\n","import { createTemporalSdkLogger, type Observability } from \"@opengeni/observability\";\nimport { makeTelemetryFilterString, Runtime, type RuntimeOptions } from \"@temporalio/worker\";\n\n/**\n * Runtime options that send every Temporal SDK log record, including records\n * forwarded from the Rust core, through the structured Opengeni logger.\n * Without this the SDK's DefaultLogger prints multi-line objects (with task\n * tokens, raw errors and stacks) and core prints plain text, both outside the\n * public log projection and the one-JSON-object-per-line contract.\n */\nexport function temporalRuntimeLoggingOptions(\n observability: Pick<Observability, \"log\">,\n): RuntimeOptions {\n return {\n logger: createTemporalSdkLogger(observability),\n telemetryOptions: {\n logging: {\n // The SDK's default core filter, now forwarded instead of printed.\n filter: makeTelemetryFilterString({ core: \"WARN\", other: \"ERROR\" }),\n forward: {},\n },\n },\n };\n}\n\ntype RuntimeInstaller = {\n readonly _instance?: unknown;\n install(options: RuntimeOptions): unknown;\n};\n\n/**\n * Install the process-wide Temporal Runtime with the structured logger. Must\n * run before the first NativeConnection or Worker is created. Returns false\n * when an embedding host already installed its own Runtime, which is left\n * untouched.\n */\nexport function installTemporalRuntimeLogging(\n observability: Pick<Observability, \"log\">,\n runtime: RuntimeInstaller = Runtime,\n): boolean {\n if (runtime._instance !== undefined) return false;\n runtime.install(temporalRuntimeLoggingOptions(observability));\n return true;\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport type { Worker, WorkerStatus } from \"@temporalio/worker\";\nimport { turnTaskQueueMetricLabels, type TurnTaskQueueIdentity } from \"./observability-metrics\";\nimport {\n createTelemetryClock,\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\nimport type { WorkerRunTarget } from \"./worker-service-lifecycle\";\n\nexport const TURN_WORKER_ACTIVITY_METRICS = {\n inflight: \"opengeni_turn_worker_activities_inflight\",\n timestamp: \"opengeni_turn_worker_activities_last_observed_timestamp_seconds\",\n valid: \"opengeni_turn_worker_activities_last_read_success\",\n} as const;\n\nexport type TurnWorkerActivityTelemetry = {\n /** Settles only when Worker.run AND all SDK activity execution have settled. */\n settled: Promise<void>;\n isSettled(): boolean;\n closeIfNeverRun(): void;\n};\n\n/** Preserve scraping after an SDK force-failure without blocking resource close\n * or extending the host shutdown/containment budgets. */\nexport function closeWorkerHttpAfterActivityExecution(\n telemetry: TurnWorkerActivityTelemetry | undefined,\n close: () => void | Promise<void>,\n): void {\n telemetry?.closeIfNeverRun();\n if (!telemetry || telemetry.isSettled()) {\n try {\n void Promise.resolve(close()).catch(() => undefined);\n } catch {\n /* Preserve other resource cleanup. */\n }\n } else {\n void telemetry.settled.then(close).catch(() => undefined);\n }\n}\n\ntype SdkActivityWorker = Pick<Worker, \"run\" | \"shutdown\"> & {\n getStatus(): Pick<\n WorkerStatus,\n \"numInFlightNonLocalActivities\" | \"numInFlightLocalActivities\" | \"numInFlightActivities\"\n >;\n numInFlightActivities$: {\n subscribe(observer: { next(value: number): void; error(error: unknown): void }): {\n unsubscribe(): void;\n };\n };\n};\n\n/** Only public SDK1.22 hooks. Never count agent claims/slots, poll reservations,\n * heartbeat activity counts, or cancellation intent as executing occupancy.\n * Requires a fresh metric registry/schema and one SDK turn-worker owner per\n * registry + namespace + queue + physical UID. This bridge does not aggregate\n * multiple workers or migrate legacy pre-registered unlabelled gauges. */\nexport function withTurnWorkerActivityTelemetry(\n sdkWorker: SdkActivityWorker,\n input: {\n observability: Observability;\n identity: TurnTaskQueueIdentity;\n podUid: string;\n intervalMs?: number;\n now?: () => number;\n scheduler?: TelemetryScheduler;\n },\n): { worker: WorkerRunTarget; activityTelemetry: TurnWorkerActivityTelemetry } {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const intervalMs = telemetryInterval(input.intervalMs ?? 15_000, \"activity telemetry intervalMs\");\n const clock = createTelemetryClock(input.now ?? Date.now);\n const labels = { ...turnTaskQueueMetricLabels(input.identity), worker_pod_uid: input.podUid };\n let runStarted = false;\n let runSettled = false;\n let runPromise: Promise<void> | undefined;\n let disposed = false;\n let queued = false;\n let subscription: { unsubscribe(): void } | undefined;\n let stopTimer: (() => void) | undefined;\n let resolveSettled!: () => void;\n const settled = new Promise<void>((resolve) => {\n resolveSettled = resolve;\n });\n const set = (name: string, help: string, value: number) =>\n input.observability.setGauge({ name, help, labels, value });\n const invalidate = () => {\n if (disposed) return;\n try {\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 0,\n );\n } catch {\n /* Metrics cannot fail an activity or the worker. Age also fences failed exporters. */\n }\n };\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n stopTimer?.();\n try {\n subscription?.unsubscribe();\n } catch {\n /* Host lifecycle remains unchanged. */\n }\n resolveSettled();\n };\n const sample = () => {\n if (disposed) return;\n let idle = false;\n try {\n const status = sdkWorker.getStatus();\n const count = status.numInFlightNonLocalActivities;\n const local = status.numInFlightLocalActivities;\n const total = status.numInFlightActivities;\n if (\n ![count, local, total].every((value) => Number.isSafeInteger(value) && value >= 0) ||\n count + local !== total\n ) {\n throw new Error(\"invalid SDK executing activity state\");\n }\n idle = total === 0;\n const observedAt = clock.read();\n if (observedAt === null) throw new Error(\"invalid activity observation clock\");\n // Publish validity last; a partial or failed metric update cannot license\n // combining a new timestamp with old occupancy. Never invent idle zero.\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 0,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.inflight,\n \"SDK executing non-local activities on this turn worker, including preclaim, video and cancellation-unresolved execution.\",\n count,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.timestamp,\n \"Unix timestamp of the latest successful SDK activity occupancy observation.\",\n observedAt / 1_000,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 1,\n );\n } catch {\n invalidate();\n }\n // SDK force-shutdown rejection alone is not activity quiescence. Counters remain\n // live until the underlying JS promises settle, including after run rejects.\n if (runSettled && idle) dispose();\n };\n const scheduleSample = () => {\n if (disposed || queued) return;\n queued = true;\n // SDK increments its aggregate observable BEFORE its local/nonlocal\n // breakdown. Read after that synchronous transition, not inside it.\n scheduler.defer(() => {\n queued = false;\n sample();\n });\n };\n try {\n subscription = sdkWorker.numInFlightActivities$.subscribe({\n next: scheduleSample,\n error: invalidate,\n });\n } catch {\n invalidate();\n }\n stopTimer = scheduler.interval(sample, intervalMs);\n sample(); // INITIALIZED workers expose true idle zero before the first poll.\n const activityTelemetry: TurnWorkerActivityTelemetry = {\n settled,\n isSettled: () => disposed,\n closeIfNeverRun: () => {\n if (!runStarted) {\n runSettled = true;\n sample();\n }\n },\n };\n return {\n activityTelemetry,\n worker: {\n shutdown: () => sdkWorker.shutdown(), // Drain never unregisters observation.\n run: () => {\n if (!runPromise && runSettled)\n return Promise.reject(new Error(\"cannot run a closed turn worker\"));\n // A second SDK run rejects immediately while the first may still poll.\n // Keep one execution owner so that rejection cannot detach telemetry.\n runPromise ??= (async () => {\n runStarted = true;\n try {\n await sdkWorker.run();\n } finally {\n runSettled = true;\n sample();\n }\n })();\n return runPromise;\n },\n },\n };\n}\n","import type { Settings } from \"@opengeni/config\";\nimport {\n assertRuntimeDatabasePosture,\n dbSql,\n type Database,\n type RuntimeDatabasePostureOptions,\n} from \"@opengeni/db\";\nimport { requireSessionEventDurableFanoutCapability, type EventBus } from \"@opengeni/events\";\nimport { githubAppBotIdentityWarnings } from \"@opengeni/github\";\nimport type { Observability } from \"@opengeni/observability\";\n\nexport type ReadinessCheckName = \"db\" | \"nats\" | \"temporal\";\nexport type ReadinessChecks = Record<ReadinessCheckName, () => Promise<void> | void>;\n\nexport type ReadinessResult = {\n ok: boolean;\n state?: WorkerLifecycleState;\n checks: Record<ReadinessCheckName, { ok: boolean; error?: string }>;\n};\n\nexport type WorkerLifecycleState = \"starting\" | \"ready\" | \"draining\" | \"stopped\" | \"failed\";\n\nexport type WorkerHttpLifecycle = {\n role: \"control\" | \"turn\";\n state: () => WorkerLifecycleState;\n};\n\nexport type WorkerHttpServerInput = {\n settings: Settings;\n observability: Observability;\n checks: ReadinessChecks;\n timeoutMs?: number;\n lifecycle?: WorkerHttpLifecycle;\n};\n\nexport function createWorkerHttpHandler(\n input: WorkerHttpServerInput,\n): (request: Request) => Promise<Response> {\n const { settings, observability, checks, lifecycle } = input;\n const timeoutMs = input.timeoutMs ?? 2_000;\n return async (request) => {\n const url = new URL(request.url);\n if (request.method !== \"GET\") {\n return Response.json({ error: \"method_not_allowed\" }, { status: 405 });\n }\n if (url.pathname === \"/healthz\") {\n const state = lifecycle?.state();\n const ok = state !== \"failed\" && state !== \"stopped\";\n const warnings = githubAppBotIdentityWarnings(settings);\n return Response.json(\n {\n service: settings.serviceName,\n environment: settings.environment,\n deploymentRevision: settings.deploymentRevision,\n ...(lifecycle ? { role: lifecycle.role, state } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n ok,\n },\n { status: ok ? 200 : 503 },\n );\n }\n if (url.pathname === \"/metrics\") {\n return new Response(await observability.prometheusMetrics(), {\n status: 200,\n headers: { \"content-type\": \"text/plain; version=0.0.4; charset=utf-8\" },\n });\n }\n if (url.pathname === \"/readyz\") {\n const state = lifecycle?.state();\n const result =\n state && state !== \"ready\"\n ? {\n ok: false,\n state,\n checks: Object.fromEntries(\n (Object.keys(checks) as ReadinessCheckName[]).map((name) => [\n name,\n { ok: false, error: \"worker_not_ready\" },\n ]),\n ) as ReadinessResult[\"checks\"],\n }\n : { ...(await runReadinessChecks(checks, timeoutMs)), ...(state ? { state } : {}) };\n return Response.json(result, { status: result.ok ? 200 : 503 });\n }\n return Response.json({ error: \"not_found\" }, { status: 404 });\n };\n}\n\nexport function startWorkerHttpServer(input: WorkerHttpServerInput): ReturnType<typeof Bun.serve> {\n return Bun.serve({\n hostname: \"0.0.0.0\",\n port: input.settings.workerHttpPort,\n fetch: createWorkerHttpHandler(input),\n });\n}\n\nexport async function runReadinessChecks(\n checks: ReadinessChecks,\n timeoutMs = 2_000,\n): Promise<ReadinessResult> {\n const entries = await Promise.all(\n (Object.entries(checks) as Array<[ReadinessCheckName, () => Promise<void> | void]>).map(\n async ([name, check]) => {\n try {\n await withTimeout(Promise.resolve().then(check), timeoutMs);\n return [name, { ok: true }] as const;\n } catch {\n return [name, { ok: false, error: \"dependency_unavailable\" }] as const;\n }\n },\n ),\n );\n const result = Object.fromEntries(entries) as ReadinessResult[\"checks\"];\n return {\n ok: Object.values(result).every((check) => check.ok),\n checks: result,\n };\n}\n\nexport function dbReadyCheck(\n db: Database,\n posture?: RuntimeDatabasePostureOptions,\n afterDatabaseReady?: () => Promise<void>,\n): () => Promise<void> {\n let inFlight: Promise<void> | undefined;\n return () => {\n // The HTTP timeout cannot cancel a driver query. Reuse an outstanding\n // attempt so repeated kubelet probes cannot queue an unbounded tail behind\n // one slow or disconnected database connection.\n if (inFlight) return inFlight;\n inFlight = (async () => {\n if (posture) {\n await assertRuntimeDatabasePosture(db, posture);\n } else {\n await db.execute(dbSql`select 1`);\n }\n await afterDatabaseReady?.();\n })().finally(() => {\n inFlight = undefined;\n });\n return inFlight;\n };\n}\n\nexport function natsReadyCheck(bus: EventBus): () => void {\n return () => {\n requireSessionEventDurableFanoutCapability(bus);\n if (bus.isConnected && !bus.isConnected()) {\n throw new Error(\"NATS is not connected\");\n }\n };\n}\n\nexport function temporalReadyCheck(\n connection: Pick<\n import(\"@temporalio/worker\").NativeConnection,\n \"workflowService\" | \"withDeadline\"\n >,\n): () => Promise<void> {\n return async () => {\n await connection.withDeadline(Date.now() + 2_000, () =>\n connection.workflowService.getSystemInfo({}),\n );\n };\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`readiness check timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n","import { temporalConnectionOptions, type Settings } from \"@opengeni/config\";\nimport {\n SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,\n SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS,\n SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID,\n SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,\n SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE,\n} from \"@opengeni/core\";\nimport {\n automaticSessionTitleFanoutDue,\n browserDeadlineCheckpointDue,\n knowledgeIndexDue,\n sandboxIdleCheckpointDue,\n sandboxLeaseReaperDue,\n sandboxMaintenanceDue,\n sessionWorkflowWakesDue,\n siteAuthMaintenanceDue,\n workspacePauseTimerDue,\n type Database,\n} from \"@opengeni/db\";\nimport type { DocumentServices } from \"@opengeni/documents\";\nimport type { Observability } from \"@opengeni/observability\";\nimport {\n Connection,\n ScheduleNotFoundError,\n Client as TemporalClient,\n WorkflowExecutionAlreadyStartedError,\n} from \"@temporalio/client\";\nimport {\n startMaintenanceCadences,\n type MaintenanceCadence,\n type MaintenanceCadences,\n type MaintenanceStartResult,\n} from \"./maintenance-cadence\";\nimport {\n BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n browserDeadlineCheckpointTaskQueue,\n} from \"./browser-deadline-checkpoint-contract\";\nimport {\n SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n SANDBOX_REAPER_V2_WORKFLOW_ID,\n sandboxLifecycleTaskQueue,\n} from \"./sandbox-reaper-contract\";\nimport { assertSandboxReaperActivityTimeout } from \"./sandbox-reaper-timeout\";\nimport type { TelemetryScheduler } from \"./telemetry-scheduler\";\n\nexport const KNOWLEDGE_INDEXING_SCHEDULE_ID = \"opengeni-knowledge-indexing\";\nexport const KNOWLEDGE_INDEXING_WORKFLOW_ID = \"opengeni-knowledge-indexing\";\nexport const KNOWLEDGE_INDEXING_PERIOD_MS = 15_000;\nexport const SITE_AUTH_MAINTENANCE_SCHEDULE_ID = \"opengeni-site-auth-maintenance\";\nexport const SITE_AUTH_MAINTENANCE_WORKFLOW_ID = \"opengeni-site-auth-maintenance\";\n/** Matches the minimum public site-auth health policy interval. */\nexport const SITE_AUTH_MAINTENANCE_PERIOD_MS = 60 * 1_000;\n/** The Schedule earlier releases used to drive the sandbox lease reaper. */\nexport const SANDBOX_REAPER_SCHEDULE_ID = \"opengeni-sandbox-lease-reaper\";\n\nexport const INTERNAL_MAINTENANCE_JOBS = [\n \"session-workflow-wake-dispatcher\",\n \"knowledge-indexing\",\n \"site-auth-maintenance\",\n \"sandbox-lease-reaper\",\n \"sandbox-idle-checkpoint\",\n \"browser-deadline-checkpoint\",\n] as const;\nexport type InternalMaintenanceJob = (typeof INTERNAL_MAINTENANCE_JOBS)[number];\n\n/** Schedules that earlier releases created for these jobs. A paused Schedule\n * still runs its scheduler workflow on every tick, so they are deleted. */\nconst LEGACY_SCHEDULE_IDS: Partial<Record<InternalMaintenanceJob, string>> = {\n \"session-workflow-wake-dispatcher\": SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID,\n \"knowledge-indexing\": KNOWLEDGE_INDEXING_SCHEDULE_ID,\n \"site-auth-maintenance\": SITE_AUTH_MAINTENANCE_SCHEDULE_ID,\n // The old reaper Schedule fired a router workflow that started the drain\n // inventory, both checkpoint sweeps and the maintenance child on every tick.\n \"sandbox-lease-reaper\": SANDBOX_REAPER_SCHEDULE_ID,\n};\n\ntype WorkflowStarter = Pick<TemporalClient[\"workflow\"], \"start\" | \"signalWithStart\">;\ntype ScheduleDeleter = { getHandle(id: string): { delete(): Promise<void> } };\n\n/** Start a fixed-id maintenance workflow unless one is already running; the\n * running sweep's own claims cover whatever this tick saw. */\nexport async function startMaintenanceWorkflowOnce(\n workflow: WorkflowStarter,\n input: { workflowType: string; workflowId: string; taskQueue: string },\n): Promise<MaintenanceStartResult> {\n try {\n await workflow.start(input.workflowType, {\n taskQueue: input.taskQueue,\n workflowId: input.workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n });\n return \"started\";\n } catch (error) {\n if (error instanceof WorkflowExecutionAlreadyStartedError) return \"already_running\";\n throw error;\n }\n}\n\n/** Remove the per-tick Schedules this release replaces. Absent is success. */\nexport async function deleteLegacyMaintenanceSchedules(\n schedule: ScheduleDeleter,\n jobs: readonly InternalMaintenanceJob[],\n observability: Observability,\n): Promise<void> {\n for (const job of jobs) {\n const scheduleId = LEGACY_SCHEDULE_IDS[job];\n if (!scheduleId) continue;\n try {\n await schedule.getHandle(scheduleId).delete();\n observability.info(\n \"Deleted a per-tick maintenance Schedule replaced by a work-checked cadence\",\n {\n job,\n scheduleId,\n },\n );\n } catch (error) {\n if (!(error instanceof ScheduleNotFoundError)) throw error;\n }\n }\n}\n\n/**\n * Build the work-checked cadences for the deployment-wide dispatchers. Each\n * tick runs one cheap read-only check and touches Temporal only when the check\n * may find work, so an idle deployment writes no workflow history at all.\n */\nexport async function internalMaintenanceCadences(input: {\n settings: Settings;\n observability: Observability;\n db: Database;\n workflow: WorkflowStarter;\n documentServices?: DocumentServices;\n jobs?: readonly InternalMaintenanceJob[];\n}): Promise<MaintenanceCadence[]> {\n const { settings, observability, db, workflow } = input;\n const jobs = new Set(input.jobs ?? INTERNAL_MAINTENANCE_JOBS);\n const taskQueue = settings.temporalTaskQueue;\n const cadences: MaintenanceCadence[] = [];\n if (jobs.has(\"session-workflow-wake-dispatcher\")) {\n const { repairMissedSessionWorkflowWakes } = await import(\"./activities/parent-wake\");\n cadences.push({\n job: \"session-workflow-wake-dispatcher\",\n periodMs: SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS,\n hasWork: async () => {\n // Registration is the dispatcher's own idempotent repair: it writes\n // only when a producer committed work but never recorded its wake.\n await repairMissedSessionWorkflowWakes({ db, observability });\n return (\n (await sessionWorkflowWakesDue(db)) ||\n (await workspacePauseTimerDue(db)) ||\n (await automaticSessionTitleFanoutDue(db))\n );\n },\n start: async () => {\n await workflow.signalWithStart(SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, {\n taskQueue,\n workflowId: SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n signal: SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,\n });\n return \"started\";\n },\n });\n }\n if (jobs.has(\"knowledge-indexing\")) {\n let embedding: Promise<{ model: string; dimensions: number; available: boolean }> | undefined;\n let unavailableReported = false;\n const resolveEmbedding = async () => {\n const services =\n input.documentServices ??\n (await import(\"@opengeni/documents\")).createDocumentServices(settings);\n return {\n model: services.embedder.model,\n dimensions: services.embedder.dimensions,\n available: services.embedder.available !== false,\n };\n };\n cadences.push({\n job: \"knowledge-indexing\",\n periodMs: KNOWLEDGE_INDEXING_PERIOD_MS,\n hasWork: async () => {\n embedding ??= resolveEmbedding().catch((error) => {\n embedding = undefined;\n throw error;\n });\n const current = await embedding;\n // Without an embedding credential every batch fails before reaching the\n // provider, so queued jobs are not work this process can do. They stay\n // queued and index once the deployment configures a credential.\n if (!current.available) {\n if (!unavailableReported) {\n unavailableReported = true;\n observability.warn(\n \"Knowledge indexing is idle: no document embedding credential is configured\",\n { job: \"knowledge-indexing\", model: current.model },\n );\n }\n return false;\n }\n return await knowledgeIndexDue(db, current);\n },\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"knowledgeIndexingWorkflow\",\n workflowId: KNOWLEDGE_INDEXING_WORKFLOW_ID,\n taskQueue,\n }),\n });\n }\n if (jobs.has(\"site-auth-maintenance\")) {\n const { SITE_AUTH_MAINTENANCE_CLAIM_TIMEOUT_MS } =\n await import(\"./activities/site-auth-maintenance\");\n cadences.push({\n job: \"site-auth-maintenance\",\n periodMs: SITE_AUTH_MAINTENANCE_PERIOD_MS,\n hasWork: async () =>\n await siteAuthMaintenanceDue(db, {\n claimTimeoutMs: SITE_AUTH_MAINTENANCE_CLAIM_TIMEOUT_MS,\n }),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"siteAuthMaintenanceWorkflow\",\n workflowId: SITE_AUTH_MAINTENANCE_WORKFLOW_ID,\n taskQueue,\n }),\n });\n }\n const sandboxJobs = (\n [\"sandbox-lease-reaper\", \"sandbox-idle-checkpoint\", \"browser-deadline-checkpoint\"] as const\n ).filter((job) => jobs.has(job));\n if (sandboxJobs.length > 0) {\n // The same period the old reaper Schedule used, so the boot invariants\n // (reaper period below the viewer holder TTL, and with the idle grace\n // below the provider lifetime) hold for every sandbox cadence.\n assertSandboxReaperActivityTimeout(settings);\n const periodMs = settings.sandboxLeaseReaperPeriodMs;\n const lifecycleQueue = sandboxLifecycleTaskQueue(taskQueue);\n const sandbox = await import(\"./activities/sandbox-lease\");\n if (jobs.has(\"sandbox-lease-reaper\")) {\n const { SANDBOX_CHECKPOINT_GC_CLAIM_TTL_MS } = sandbox;\n cadences.push({\n job: \"sandbox-lease-reaper\",\n periodMs,\n // The drain inventory and its maintenance pass act only on warm or held\n // leases, due reconciliation rows, or (with Modal) boxes still running in\n // the provider app. With none of those, the tick only refreshes the\n // pass's read-only gauges in this process.\n hasWork: async () => {\n if (\n (await sandboxLeaseReaperDue(db)) ||\n (await sandboxMaintenanceDue(db, {\n checkpointArtifactClaimTtlMs: SANDBOX_CHECKPOINT_GC_CLAIM_TTL_MS,\n })) ||\n (await sandbox.modalOrphanSweepMayHaveWork({ settings, observability }))\n ) {\n return true;\n }\n await sandbox.refreshIdleSandboxReaperProjections({ db, settings, observability });\n return false;\n },\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"sandboxReaperWorkflowV2\",\n workflowId: SANDBOX_REAPER_V2_WORKFLOW_ID,\n taskQueue: lifecycleQueue,\n }),\n });\n }\n if (jobs.has(\"sandbox-idle-checkpoint\")) {\n cadences.push({\n job: \"sandbox-idle-checkpoint\",\n periodMs,\n // The sweep's inventory is empty when ownership or snapshots are off.\n hasWork: async () =>\n settings.sandboxOwnershipEnabled &&\n settings.sandboxSnapshotIntervalMs > 0 &&\n (await sandboxIdleCheckpointDue(db, { intervalMs: settings.sandboxSnapshotIntervalMs })),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"sandboxIdleCheckpointSweepWorkflow\",\n workflowId: SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n taskQueue: lifecycleQueue,\n }),\n });\n }\n if (jobs.has(\"browser-deadline-checkpoint\")) {\n cadences.push({\n job: \"browser-deadline-checkpoint\",\n periodMs,\n hasWork: async () => await browserDeadlineCheckpointDue(db),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"browserDeadlineCheckpointSweepWorkflow\",\n workflowId: BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n taskQueue: browserDeadlineCheckpointTaskQueue(taskQueue),\n }),\n });\n }\n }\n return cadences;\n}\n\n/**\n * Run the deployment-wide maintenance dispatchers from this control worker.\n * Several control replicas may each run the cadence: an idle tick is only a\n * read, and a busy one converges on the same fixed workflow id.\n */\nexport async function startInternalMaintenanceCadences(input: {\n settings: Settings;\n observability: Observability;\n db: Database;\n documentServices?: DocumentServices;\n jobs?: readonly InternalMaintenanceJob[];\n scheduler?: TelemetryScheduler;\n}): Promise<{ cadences: MaintenanceCadences; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(input.settings));\n try {\n const temporal = new TemporalClient({\n connection,\n namespace: input.settings.temporalNamespace,\n });\n const jobs = input.jobs ?? INTERNAL_MAINTENANCE_JOBS;\n await deleteLegacyMaintenanceSchedules(temporal.schedule, jobs, input.observability);\n const cadences = startMaintenanceCadences({\n cadences: await internalMaintenanceCadences({ ...input, jobs, workflow: temporal.workflow }),\n observability: input.observability,\n ...(input.scheduler ? { scheduler: input.scheduler } : {}),\n });\n input.observability.info(\"Started work-checked maintenance cadences\", {\n jobs: jobs.join(\",\"),\n });\n return {\n cadences,\n close: async () => {\n await cadences.close();\n await connection.close();\n },\n };\n } catch (error) {\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport {\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\n\nexport type MaintenanceStartResult = \"started\" | \"already_running\";\n\nexport type MaintenanceTickOutcome =\n /** The work check proved there is nothing to do; no workflow was touched. */\n | \"idle\"\n | \"started\"\n | \"already_running\"\n /** The check failed; the workflow was started anyway (fail open). */\n | \"probe_failed\"\n | \"start_failed\"\n /** This process's previous tick for the job has not finished. */\n | \"busy\";\n\nconst TICK_OUTCOMES: readonly MaintenanceTickOutcome[] = [\n \"idle\",\n \"started\",\n \"already_running\",\n \"probe_failed\",\n \"start_failed\",\n \"busy\",\n];\n\n/**\n * One deployment-wide maintenance job driven by a worker-process cadence\n * instead of a Temporal Schedule. A Schedule starts a workflow execution on\n * every tick, so an idle deployment pays a history and visibility write per\n * tick for no work. A cadence instead asks a cheap read-only question first and\n * starts the job's workflow only when the answer may be yes.\n */\nexport type MaintenanceCadence = {\n /** Stable, low-cardinality metric label. */\n job: string;\n periodMs: number;\n /**\n * A superset of the job's claim predicate: `false` must prove that a run\n * would find nothing. It may perform the job's own idempotent repair\n * registration, but never claims or delivers work.\n */\n hasWork: () => Promise<boolean>;\n /** Start or nudge the job's single dispatcher workflow. */\n start: () => Promise<MaintenanceStartResult>;\n};\n\nexport type MaintenanceCadences = {\n /** Run one tick for a job now; used by tests and by the cadence itself. */\n tick: (job: string) => Promise<MaintenanceTickOutcome>;\n close: () => Promise<void>;\n};\n\nexport function startMaintenanceCadences(input: {\n cadences: readonly MaintenanceCadence[];\n observability: Observability;\n scheduler?: TelemetryScheduler;\n now?: () => number;\n /** Tests drive ticks explicitly. */\n autoStart?: boolean;\n}): MaintenanceCadences {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const now = input.now ?? Date.now;\n const jobs = new Map<string, MaintenanceCadence>();\n for (const cadence of input.cadences) {\n if (jobs.has(cadence.job)) throw new Error(`duplicate maintenance cadence ${cadence.job}`);\n telemetryInterval(cadence.periodMs, `${cadence.job} maintenance period`);\n jobs.set(cadence.job, cadence);\n for (const outcome of TICK_OUTCOMES) {\n input.observability.incrementCounter({\n name: \"opengeni_maintenance_cadence_ticks_total\",\n help: \"Maintenance cadence ticks by job and outcome; idle ticks start no workflow.\",\n labels: { job: cadence.job, outcome },\n amount: 0,\n });\n }\n }\n const inFlight = new Map<string, Promise<MaintenanceTickOutcome>>();\n const cancels: Array<() => void> = [];\n let stopped = false;\n\n const record = (job: string, outcome: MaintenanceTickOutcome) => {\n input.observability.incrementCounter({\n name: \"opengeni_maintenance_cadence_ticks_total\",\n help: \"Maintenance cadence ticks by job and outcome; idle ticks start no workflow.\",\n labels: { job, outcome },\n });\n if (outcome !== \"busy\" && outcome !== \"start_failed\") {\n input.observability.setGauge({\n name: \"opengeni_maintenance_cadence_last_success_timestamp_seconds\",\n help: \"Unix time of the latest maintenance cadence tick that checked for work and, when needed, started its workflow.\",\n labels: { job },\n value: now() / 1_000,\n });\n }\n return outcome;\n };\n\n const run = async (cadence: MaintenanceCadence): Promise<MaintenanceTickOutcome> => {\n let probeFailed = false;\n try {\n if (!(await cadence.hasWork())) return record(cadence.job, \"idle\");\n } catch (error) {\n // Fail open: a broken check must never silently stop maintenance. The\n // workflow's own claim remains the authority on what work exists.\n probeFailed = true;\n input.observability.warn(\"maintenance cadence work check failed; starting the job anyway\", {\n job: cadence.job,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const started = await cadence.start();\n return record(cadence.job, probeFailed ? \"probe_failed\" : started);\n } catch (error) {\n input.observability.warn(\"maintenance cadence could not start its workflow\", {\n job: cadence.job,\n error: error instanceof Error ? error.message : String(error),\n });\n return record(cadence.job, \"start_failed\");\n }\n };\n\n const tick = async (job: string): Promise<MaintenanceTickOutcome> => {\n const cadence = jobs.get(job);\n if (!cadence) throw new Error(`unknown maintenance cadence ${job}`);\n if (stopped) return \"busy\";\n if (inFlight.has(job)) return record(job, \"busy\");\n const running = run(cadence).finally(() => inFlight.delete(job));\n inFlight.set(job, running);\n return await running;\n };\n\n if (input.autoStart !== false) {\n for (const cadence of jobs.values()) {\n const fire = () => {\n void tick(cadence.job);\n };\n // Start immediately so a restart never delays due work by a full period.\n scheduler.defer(fire);\n cancels.push(scheduler.interval(fire, cadence.periodMs));\n }\n }\n\n return {\n tick,\n close: async () => {\n stopped = true;\n for (const cancel of cancels.splice(0)) cancel();\n await Promise.allSettled([...inFlight.values()]);\n },\n };\n}\n","export const BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID = \"opengeni-browser-deadline-checkpoints-v1\";\nconst QUEUE_SUFFIX = \"-browser-checkpoint-v1\";\nexport function browserDeadlineCheckpointTaskQueue(base: string): string {\n return base.endsWith(QUEUE_SUFFIX) ? base : `${base}${QUEUE_SUFFIX}`;\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport type { WorkerLifecycleState } from \"./http\";\n\nexport async function constructWithOwnedConnection<Connection, Result>(\n connect: () => Promise<Connection>,\n construct: (connection: Connection) => Promise<Result>,\n close: (connection: Connection) => Promise<void>,\n): Promise<Result> {\n const connection = await connect();\n try {\n return await construct(connection);\n } catch (error) {\n await close(connection).catch(() => undefined);\n throw error;\n }\n}\n\nexport type WorkerRunTarget = {\n run(): Promise<void>;\n shutdown(): void;\n};\n\n/** One process may poll several disjoint Temporal queues, but it still has one\n * host lifecycle. Start and stop every poller as a unit; a failed poller drains\n * its siblings and preserves the original failure. */\nexport function combineWorkerRunTargets(targets: readonly WorkerRunTarget[]): WorkerRunTarget {\n if (targets.length === 0) {\n throw new Error(\"a worker service requires at least one Temporal poller\");\n }\n let runPromise: Promise<void> | undefined;\n const shutdown = (): void => {\n let firstError: unknown;\n for (const target of targets) {\n try {\n target.shutdown();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError !== undefined) throw firstError;\n };\n return {\n run: () => {\n runPromise ??= (async () => {\n const runs = targets.map((target) => {\n try {\n return target.run();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n try {\n await Promise.all(runs);\n } catch (error) {\n try {\n shutdown();\n } catch {\n // Preserve the poller failure. Every sibling still received its\n // shutdown request even when one request itself failed.\n }\n await Promise.allSettled(runs);\n throw error;\n }\n })();\n return runPromise;\n },\n shutdown,\n };\n}\n\nexport type WorkerServiceLifecycle = {\n state(): WorkerLifecycleState;\n run(): Promise<void>;\n drain(reason?: string): boolean;\n close(): Promise<void>;\n};\n\nexport function createWorkerServiceLifecycle(input: {\n role: \"control\" | \"turn\";\n worker: WorkerRunTarget;\n observability: Observability;\n closeOwnedResources: () => Promise<void>;\n onReady?: () => void;\n}): WorkerServiceLifecycle {\n let state: WorkerLifecycleState = \"starting\";\n let runPromise: Promise<void> | undefined;\n let resourcesClosed: Promise<void> | undefined;\n const closeOwnedResources = () => {\n resourcesClosed ??= input.closeOwnedResources();\n return resourcesClosed;\n };\n\n const lifecycle: WorkerServiceLifecycle = {\n state: () => state,\n run: () => {\n if (!runPromise && state === \"draining\") {\n runPromise = (async () => {\n state = \"stopped\";\n await closeOwnedResources();\n })();\n return runPromise;\n }\n if (!runPromise && (state === \"stopped\" || state === \"failed\")) {\n return Promise.reject(new Error(`cannot run a worker service that is ${state}`));\n }\n runPromise ??= (async () => {\n if (state === \"starting\") {\n state = \"ready\";\n }\n input.onReady?.();\n try {\n await input.worker.run();\n state = \"stopped\";\n } catch (error) {\n state = \"failed\";\n throw error;\n } finally {\n await closeOwnedResources();\n }\n })();\n return runPromise;\n },\n drain: (_reason = \"host request\") => {\n if (state === \"draining\" || state === \"stopped\" || state === \"failed\") {\n return true;\n }\n const previousState = state;\n safeLifecycleLog(() =>\n input.observability.info(\"Opengeni worker draining (graceful shutdown)\", {\n role: input.role,\n errorClass: \"WorkerLifecycleOperation\",\n errorCode: \"worker_draining\",\n origin: \"worker-lifecycle\",\n }),\n );\n state = \"draining\";\n try {\n input.worker.shutdown();\n return true;\n } catch {\n state = previousState;\n safeLifecycleLog(() =>\n input.observability.warn(\"worker shutdown request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n }),\n );\n return false;\n }\n },\n close: async () => {\n if (!lifecycle.drain(\"service close\")) {\n throw new Error(\"worker shutdown request failed\");\n }\n if (runPromise) {\n await runPromise.catch(() => undefined);\n } else {\n state = \"stopped\";\n await closeOwnedResources();\n }\n },\n };\n\n return lifecycle;\n}\n\nfunction safeLifecycleLog(log: () => void): void {\n try {\n log();\n } catch {\n // Telemetry cannot change worker lifecycle state or shutdown delivery.\n }\n}\n\n/** A cleanup stall first drains peers through WORKER_SHUTDOWN. The standalone\n * process owns the final exit, because Temporal cannot kill JavaScript writers.\n * Embedded hosts may supply their own termination policy at this same edge. */\nexport function createWorkerCleanupContainment(input: {\n drain: () => boolean;\n terminate?: () => void;\n observability: Observability;\n timeoutMs?: number;\n}) {\n let requested = false;\n let finished = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n return {\n request() {\n if (requested || finished) return;\n requested = true;\n if (input.terminate) {\n timer = setTimeout(() => {\n safeLifecycleLog(() =>\n input.observability.error(\"worker cleanup drain exhausted; terminating host\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_cleanup_drain_exhausted\",\n origin: \"worker-lifecycle\",\n }),\n );\n input.terminate?.();\n }, input.timeoutMs ?? 100_000);\n timer.unref?.();\n }\n let accepted = false;\n try {\n accepted = input.drain();\n } catch {\n /* The host backstop remains armed. */\n }\n if (!accepted)\n safeLifecycleLog(() =>\n input.observability.error(\"worker cleanup drain request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n }),\n );\n },\n finished() {\n // Call only after Worker.run resolves. ForceShutdownError does not prove\n // its activity promises stopped, so rejection must retain the backstop.\n finished = true;\n clearTimeout(timer);\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { freemem, totalmem } from \"node:os\";\nimport { posix } from \"node:path\";\nimport type { Settings } from \"@opengeni/config\";\nimport type { Observability } from \"@opengeni/observability\";\n\nexport type TurnWorkerMemoryScope = \"host\" | \"cgroup\";\n\nexport type TurnWorkerMemoryScopeSnapshot = {\n scope: TurnWorkerMemoryScope;\n usedBytes: number;\n limitBytes: number;\n};\n\nexport type TurnWorkerMemoryPressureSnapshot = {\n processRssBytes: number;\n processHeapUsedBytes: number;\n processExternalBytes: number;\n processArrayBuffersBytes: number;\n scopes: TurnWorkerMemoryScopeSnapshot[];\n};\n\nexport type TurnWorkerMemoryPressureGuard = {\n sampleNow(): void;\n close(): void;\n};\n\ntype GuardSettings = Pick<\n Settings,\n | \"turnWorkerConcurrencyMode\"\n | \"turnWorkerTargetMemoryUsage\"\n | \"turnWorkerEmergencyMemoryUsage\"\n | \"turnWorkerMemoryGuardIntervalMs\"\n | \"turnWorkerMemoryGuardSustainMs\"\n>;\n\ntype GuardDependencies = {\n now?: () => number;\n sample?: () => TurnWorkerMemoryPressureSnapshot;\n setInterval?: typeof setInterval;\n clearInterval?: typeof clearInterval;\n gc?: () => void;\n};\n\ntype SnapshotDependencies = {\n readText?: (path: string) => string | null;\n hostTotalBytes?: () => number;\n hostAvailableBytes?: () => number;\n processMemoryUsage?: () => Pick<\n NodeJS.MemoryUsage,\n \"rss\" | \"heapUsed\" | \"external\" | \"arrayBuffers\"\n >;\n};\n\nexport type ProcessCgroupMembership = {\n v2Path: string | null;\n v1MemoryPath: string | null;\n};\n\nexport type CgroupMemoryFilePair = {\n currentPath: string;\n maxPath: string;\n};\n\nconst CGROUP_V2_MOUNT = \"/sys/fs/cgroup\";\nconst CGROUP_V1_MEMORY_MOUNT = \"/sys/fs/cgroup/memory\";\n\nexport function parseLinuxMeminfo(\n value: string,\n): { totalBytes: number; availableBytes: number } | null {\n const fields = new Map<string, number>();\n for (const line of value.split(\"\\n\")) {\n const match = /^([A-Za-z_()]+):\\s+(\\d+)\\s+kB$/.exec(line.trim());\n if (!match) continue;\n fields.set(match[1] as string, Number(match[2]) * 1024);\n }\n const totalBytes = fields.get(\"MemTotal\");\n const availableBytes = fields.get(\"MemAvailable\");\n if (\n totalBytes === undefined ||\n availableBytes === undefined ||\n !Number.isFinite(totalBytes) ||\n !Number.isFinite(availableBytes) ||\n totalBytes <= 0 ||\n availableBytes < 0\n ) {\n return null;\n }\n return { totalBytes, availableBytes: Math.min(totalBytes, availableBytes) };\n}\n\nexport function parseFiniteCgroupMemoryLimit(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"max\") return null;\n const parsed = Number(trimmed);\n // cgroup v1 represents \"unlimited\" with a near-int64 sentinel. Treat only\n // realistic finite limits as authority; host headroom remains the fallback.\n if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed >= 2 ** 60) return null;\n return parsed;\n}\n\nexport function parseProcessCgroupMembership(value: string): ProcessCgroupMembership {\n let v2Path: string | null = null;\n let v1MemoryPath: string | null = null;\n for (const line of value.split(\"\\n\")) {\n const firstSeparator = line.indexOf(\":\");\n const secondSeparator = line.indexOf(\":\", firstSeparator + 1);\n if (firstSeparator <= 0 || secondSeparator < 0) continue;\n const hierarchyId = line.slice(0, firstSeparator);\n const controllers = line.slice(firstSeparator + 1, secondSeparator);\n const path = normalizeCgroupPath(line.slice(secondSeparator + 1));\n if (!path) continue;\n if (hierarchyId === \"0\" && controllers === \"\") {\n v2Path = path;\n }\n if (controllers.split(\",\").includes(\"memory\")) {\n v1MemoryPath = path;\n }\n }\n return { v2Path, v1MemoryPath };\n}\n\nexport function cgroupMemoryFilePairs(membership: ProcessCgroupMembership): CgroupMemoryFilePair[] {\n const pairs: CgroupMemoryFilePair[] = [];\n const seen = new Set<string>();\n const appendHierarchy = (\n mount: string,\n path: string | null,\n currentFilename: string,\n maxFilename: string,\n ) => {\n for (const candidate of cgroupAncestorPaths(path ?? \"/\")) {\n const relative = candidate === \"/\" ? \"\" : candidate.slice(1);\n const currentPath = posix.join(mount, relative, currentFilename);\n const maxPath = posix.join(mount, relative, maxFilename);\n const key = `${currentPath}\\0${maxPath}`;\n if (seen.has(key)) continue;\n seen.add(key);\n pairs.push({ currentPath, maxPath });\n }\n };\n\n appendHierarchy(CGROUP_V2_MOUNT, membership.v2Path, \"memory.current\", \"memory.max\");\n appendHierarchy(\n CGROUP_V1_MEMORY_MOUNT,\n membership.v1MemoryPath,\n \"memory.usage_in_bytes\",\n \"memory.limit_in_bytes\",\n );\n return pairs;\n}\n\nexport function readTurnWorkerMemoryPressureSnapshot(\n dependencies: SnapshotDependencies = {},\n): TurnWorkerMemoryPressureSnapshot {\n const readText = dependencies.readText ?? readTextOrNull;\n const linux = parseLinuxMeminfo(readText(\"/proc/meminfo\") ?? \"\");\n const hostTotalBytes = linux?.totalBytes ?? (dependencies.hostTotalBytes ?? totalmem)();\n const hostAvailableBytes =\n linux?.availableBytes ?? (dependencies.hostAvailableBytes ?? freemem)();\n const host = {\n scope: \"host\" as const,\n usedBytes: Math.max(0, hostTotalBytes - Math.min(hostTotalBytes, hostAvailableBytes)),\n limitBytes: hostTotalBytes,\n };\n const cgroup = readCgroupMemoryScope(readText);\n // A finite process cgroup is the pod's actual admission boundary. Host\n // pressure includes unrelated workloads and must not make every replica\n // drain simultaneously; use it only when no finite cgroup authority exists.\n const processMemory = (dependencies.processMemoryUsage ?? process.memoryUsage)();\n\n return {\n processRssBytes: processMemory.rss,\n processHeapUsedBytes: processMemory.heapUsed,\n processExternalBytes: processMemory.external,\n processArrayBuffersBytes: processMemory.arrayBuffers,\n scopes: [cgroup ?? host],\n };\n}\n\nexport function turnWorkerMemoryPressureGuardEnabled(\n role: \"control\" | \"turn\",\n settings: Pick<Settings, \"turnWorkerConcurrencyMode\">,\n): boolean {\n return role === \"turn\" && settings.turnWorkerConcurrencyMode === \"resource-based\";\n}\n\nexport function createTurnWorkerMemoryPressureGuard(input: {\n settings: GuardSettings;\n observability: Observability;\n drain: () => void;\n dependencies?: GuardDependencies;\n}): TurnWorkerMemoryPressureGuard {\n const now = input.dependencies?.now ?? Date.now;\n const sample = input.dependencies?.sample ?? readTurnWorkerMemoryPressureSnapshot;\n const schedule = input.dependencies?.setInterval ?? setInterval;\n const cancel = input.dependencies?.clearInterval ?? clearInterval;\n const collectGarbage = input.dependencies?.gc ?? (() => Bun.gc(false));\n const breachStartedAt = new Map<TurnWorkerMemoryScope, number>();\n let lastGcAt = Number.NEGATIVE_INFINITY;\n let drainRequested = false;\n let closed = false;\n\n const sampleNow = () => {\n if (closed) return;\n const observedAt = now();\n let snapshot: TurnWorkerMemoryPressureSnapshot;\n try {\n snapshot = sample();\n } catch {\n breachStartedAt.clear();\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_sample_failures_total\",\n help: \"Turn-worker memory pressure guard samples that could not be read.\",\n });\n return;\n }\n\n const validScopes = snapshot.scopes.filter(\n ({ usedBytes, limitBytes }) =>\n Number.isFinite(usedBytes) &&\n Number.isFinite(limitBytes) &&\n usedBytes >= 0 &&\n limitBytes > 0,\n );\n if (validScopes.length === 0) {\n breachStartedAt.clear();\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_sample_failures_total\",\n help: \"Turn-worker memory pressure guard samples that could not be read.\",\n });\n return;\n }\n\n const sustainedBreaches: Array<{\n scope: TurnWorkerMemoryScope;\n utilizationRatio: number;\n breachSeconds: number;\n }> = [];\n for (const [kind, value] of [\n [\"rss\", snapshot.processRssBytes],\n [\"heap_used\", snapshot.processHeapUsedBytes],\n [\"external\", snapshot.processExternalBytes],\n [\"array_buffers\", snapshot.processArrayBuffersBytes],\n ] as const) {\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_process_memory_bytes\",\n help: \"Turn-worker process memory by runtime-reported category.\",\n labels: { kind },\n value: Number.isFinite(value) && value >= 0 ? value : 0,\n });\n }\n let shouldCollectGarbage = false;\n for (const scope of validScopes) {\n const utilizationRatio = scope.usedBytes / scope.limitBytes;\n const processRssRatio = snapshot.processRssBytes / scope.limitBytes;\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_utilization_ratio\",\n help: \"Observed memory utilization ratio used by the turn-worker pressure guard.\",\n labels: { scope: scope.scope },\n value: utilizationRatio,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_target_ratio\",\n help: \"Memory admission target enforced by the Temporal resource tuner.\",\n labels: { scope: scope.scope },\n value: input.settings.turnWorkerTargetMemoryUsage,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_emergency_ratio\",\n help: \"Emergency memory threshold enforced by the turn-worker pressure guard.\",\n labels: { scope: scope.scope },\n value: input.settings.turnWorkerEmergencyMemoryUsage,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_available_bytes\",\n help: \"Memory headroom remaining in the turn-worker pressure guard scope.\",\n labels: { scope: scope.scope },\n value: Math.max(0, scope.limitBytes - scope.usedBytes),\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_process_rss_ratio\",\n help: \"Turn-worker RSS as a ratio of the observed host or finite cgroup memory scope.\",\n labels: { scope: scope.scope },\n value: processRssRatio,\n });\n shouldCollectGarbage ||= processRssRatio >= input.settings.turnWorkerTargetMemoryUsage;\n\n if (utilizationRatio < input.settings.turnWorkerEmergencyMemoryUsage) {\n breachStartedAt.delete(scope.scope);\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_breach_seconds\",\n help: \"Seconds the turn-worker emergency threshold has remained continuously breached.\",\n labels: { scope: scope.scope },\n value: 0,\n });\n continue;\n }\n\n const startedAt = breachStartedAt.get(scope.scope) ?? observedAt;\n breachStartedAt.set(scope.scope, startedAt);\n const breachMs = Math.max(0, observedAt - startedAt);\n const breachSeconds = breachMs / 1_000;\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_breach_seconds\",\n help: \"Seconds the turn-worker emergency threshold has remained continuously breached.\",\n labels: { scope: scope.scope },\n value: breachSeconds,\n });\n if (breachMs >= input.settings.turnWorkerMemoryGuardSustainMs) {\n sustainedBreaches.push({ scope: scope.scope, utilizationRatio, breachSeconds });\n }\n }\n\n // Large request buffers can become unreachable well before JSC's ordinary\n // heap trigger notices native/external pressure. Nudge an asynchronous GC\n // at most once per sustain window before escalating to a worker drain.\n const sustainedBreachesHadGcOpportunity =\n sustainedBreaches.length > 0 &&\n sustainedBreaches.every(({ scope }) => {\n const breachStarted = breachStartedAt.get(scope);\n return breachStarted !== undefined && lastGcAt >= breachStarted && lastGcAt < observedAt;\n });\n let collectedGarbageThisSample = false;\n if (\n shouldCollectGarbage &&\n observedAt - lastGcAt >= input.settings.turnWorkerMemoryGuardSustainMs &&\n (sustainedBreaches.length === 0 || !sustainedBreachesHadGcOpportunity)\n ) {\n lastGcAt = observedAt;\n try {\n collectGarbage();\n collectedGarbageThisSample = true;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_gc_total\",\n help: \"Proactive garbage-collection nudges under process memory pressure.\",\n });\n } catch {\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_gc_failures_total\",\n help: \"Proactive memory-pressure garbage-collection nudges that failed.\",\n });\n }\n }\n\n // The nudge is asynchronous. Give it one sampling interval to make the\n // reclaimed RSS visible before deciding that process recycling is needed.\n if (\n (collectedGarbageThisSample && !sustainedBreachesHadGcOpportunity) ||\n drainRequested ||\n sustainedBreaches.length === 0\n ) {\n return;\n }\n\n const primaryBreach = sustainedBreaches.sort(\n (left, right) => right.utilizationRatio - left.utilizationRatio,\n )[0];\n if (!primaryBreach) return;\n\n drainRequested = true;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_drains_total\",\n help: \"Graceful turn-worker drains requested after sustained memory pressure.\",\n labels: { scope: primaryBreach.scope },\n });\n safeWarn(input.observability, \"turn worker memory guard requested graceful drain\", {\n errorClass: \"WorkerLifecycleOperation\",\n errorCode: \"worker_draining\",\n origin: \"worker-lifecycle\",\n reason: `memory pressure (${primaryBreach.scope}, ${boundedRatio(primaryBreach.utilizationRatio)} >= ${input.settings.turnWorkerEmergencyMemoryUsage}, ${primaryBreach.breachSeconds}s)`,\n });\n try {\n input.drain();\n } catch {\n drainRequested = false;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_drain_failures_total\",\n help: \"Turn-worker memory pressure guard drain requests that failed synchronously.\",\n labels: { scope: primaryBreach.scope },\n });\n safeWarn(input.observability, \"turn worker memory guard drain request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n });\n }\n };\n\n const timer = schedule(sampleNow, input.settings.turnWorkerMemoryGuardIntervalMs);\n timer.unref?.();\n sampleNow();\n\n return {\n sampleNow,\n close: () => {\n if (closed) return;\n closed = true;\n cancel(timer);\n },\n };\n}\n\nfunction readCgroupMemoryScope(\n readText: (path: string) => string | null,\n): TurnWorkerMemoryScopeSnapshot | null {\n const membership = parseProcessCgroupMembership(readText(\"/proc/self/cgroup\") ?? \"\");\n let mostPressured: TurnWorkerMemoryScopeSnapshot | null = null;\n for (const { currentPath, maxPath } of cgroupMemoryFilePairs(membership)) {\n const currentRaw = readText(currentPath);\n const maxRaw = readText(maxPath);\n if (currentRaw === null || maxRaw === null) continue;\n const current = Number(currentRaw.trim());\n const limit = parseFiniteCgroupMemoryLimit(maxRaw);\n if (!Number.isFinite(current) || current < 0 || limit === null) continue;\n const candidate = { scope: \"cgroup\" as const, usedBytes: current, limitBytes: limit };\n if (\n !mostPressured ||\n candidate.usedBytes / candidate.limitBytes >\n mostPressured.usedBytes / mostPressured.limitBytes\n ) {\n mostPressured = candidate;\n }\n }\n return mostPressured;\n}\n\nfunction readTextOrNull(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction boundedRatio(value: number): number {\n return Math.round(Math.max(0, Math.min(value, 10)) * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeCgroupPath(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"/\") || trimmed.includes(\"\\0\")) return null;\n if (trimmed.split(\"/\").includes(\"..\")) return null;\n return posix.normalize(trimmed);\n}\n\nfunction cgroupAncestorPaths(path: string): string[] {\n const ancestors: string[] = [];\n let current = path;\n while (true) {\n ancestors.push(current);\n if (current === \"/\") return ancestors;\n current = posix.dirname(current);\n }\n}\n\nfunction safeSetGauge(\n observability: Observability,\n input: Parameters<Observability[\"setGauge\"]>[0],\n): void {\n try {\n observability.setGauge(input);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n\nfunction safeIncrementCounter(\n observability: Observability,\n input: Parameters<Observability[\"incrementCounter\"]>[0],\n): void {\n try {\n observability.incrementCounter(input);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n\nfunction safeWarn(\n observability: Observability,\n message: string,\n attributes: Parameters<Observability[\"warn\"]>[1],\n): void {\n try {\n observability.warn(message, attributes);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n","export type WorkerUnhandledRejectionProcess = {\n on: (event: \"unhandledRejection\", listener: (reason: unknown) => void) => void;\n off: (event: \"unhandledRejection\", listener: (reason: unknown) => void) => void;\n};\n\nexport type WorkerUnhandledRejectionClassification =\n | \"detached_runtime_mcp_lifecycle\"\n | \"detached_unknown\";\n\ntype RuntimeMcpLifecycleError = {\n name: \"McpLifecycleError\";\n code: \"mcp_connect_failed\" | \"mcp_close_failed\";\n origin: \"runtime\";\n serverId: string;\n};\n\n/**\n * The Agents SDK owns MCP connect promises and also installs a process-global\n * unhandled-rejection listener. A best-effort lifecycle rejection can surface\n * twice under concurrent teardown: once through the awaited MCP result and once\n * through the SDK's detached worker promise. The first path already records and\n * degrades the server; the second must not terminate the whole turn-worker pod.\n */\nexport function isDetachedRuntimeMcpLifecycleRejection(\n reason: unknown,\n): reason is RuntimeMcpLifecycleError {\n try {\n if (!reason || typeof reason !== \"object\") return false;\n const candidate = reason as Partial<RuntimeMcpLifecycleError>;\n return (\n candidate.name === \"McpLifecycleError\" &&\n (candidate.code === \"mcp_connect_failed\" || candidate.code === \"mcp_close_failed\") &&\n candidate.origin === \"runtime\" &&\n typeof candidate.serverId === \"string\" &&\n candidate.serverId.length > 0\n );\n } catch {\n return false;\n }\n}\n\nfunction reportIsolatedUnhandledRejection(\n classification: WorkerUnhandledRejectionClassification,\n): void {\n // Never render the rejection itself: provider and transport errors can carry\n // request bodies or credentials. The durable activity path owns exact errors.\n console.error(\"[worker] isolated detached unhandled rejection\", { classification });\n}\n\n/**\n * Keep process-global promise rejection handling observational. Turn activities\n * have their own durable failure/lease boundary; killing the shared worker here\n * converts one detached SDK/transport promise into unrelated lease losses across\n * every session assigned to the pod. The Agents SDK also checks for a consumer\n * listener before applying its own process.exit(1), so this boundary must never\n * reintroduce that fail-fast behavior for an unknown rejection shape.\n */\nexport function installWorkerUnhandledRejectionBoundary(\n runtimeProcess: WorkerUnhandledRejectionProcess = process,\n report: (\n classification: WorkerUnhandledRejectionClassification,\n ) => void = reportIsolatedUnhandledRejection,\n): () => void {\n const onUnhandledRejection = (reason: unknown): void => {\n report(\n isDetachedRuntimeMcpLifecycleRejection(reason)\n ? \"detached_runtime_mcp_lifecycle\"\n : \"detached_unknown\",\n );\n };\n runtimeProcess.on(\"unhandledRejection\", onUnhandledRejection);\n return () => runtimeProcess.off(\"unhandledRejection\", onUnhandledRejection);\n}\n"],"mappings":"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","names":["temporalConnectionOptions","assertRuntimeDatabasePosture","requireSessionEventDurableFanoutCapability","Connection","TemporalClient","WorkflowExecutionAlreadyStartedError","Connection","Connection","temporalConnectionOptions","Connection","TemporalClient","activity","WorkflowExecutionAlreadyStartedError","requireSessionEventDurableFanoutCapability","assertRuntimeDatabasePosture"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/workflows/activities.ts","../src/knowledge-source-sync-activity-policy.ts","../src/turn-task-queue-reader.ts","../src/temporal-runtime-logger.ts","../src/turn-worker-activity-telemetry.ts","../src/http.ts","../src/internal-maintenance.ts","../src/maintenance-cadence.ts","../src/browser-deadline-checkpoint-contract.ts","../src/worker-service-lifecycle.ts","../src/memory-pressure-guard.ts","../src/unhandled-rejection-boundary.ts"],"sourcesContent":["import {\n dbSearchPath,\n getSettings,\n resolveNatsControlPlaneAuth,\n retryStartupDependency,\n startupRetryOptions,\n temporalConnectionOptions,\n type Settings,\n} from \"@opengeni/config\";\nimport {\n assertRuntimeDatabasePosture,\n isRetryableRuntimeDatabaseStartupError,\n createDb,\n getContextCompactionPendingSummary,\n markSessionWorkflowWakeDelivered,\n summarizeSessionRecoveryBacklog,\n type Database,\n type RuntimeDatabasePostureOptions,\n} from \"@opengeni/db\";\nimport {\n createNatsEventBus,\n requireSessionEventDurableFanoutCapability,\n type EventBus,\n} from \"@opengeni/events\";\nimport {\n createObservability,\n logStartupDependencyRetry,\n type Observability,\n} from \"@opengeni/observability\";\nimport {\n Connection,\n isGrpcServiceError,\n ScheduleAlreadyRunning,\n ScheduleOverlapPolicy,\n Client as TemporalClient,\n WorkflowExecutionAlreadyStartedError,\n} from \"@temporalio/client\";\nimport { NativeConnection, Worker, type WorkflowBundleOption } from \"@temporalio/worker\";\nimport { existsSync } from \"node:fs\";\nimport { prepareObjectStorageProvider } from \"@opengeni/storage\";\nimport { fileURLToPath } from \"node:url\";\nimport type { createControlActivities } from \"./activities-control\";\nimport type { createTurnActivities } from \"./activities-turn\";\nimport type { ActivityDependencies } from \"./activities/types\";\nimport { closeNativeExternalVaultProviders } from \"./external-vault-providers\";\nimport type {\n InspectSessionAttemptActivity,\n SignalCodexCapacityWorkflow,\n SignalSessionAttemptQuiesced,\n StartSandboxReaperWorkflow,\n StartVideoGenerationWorkflow,\n WakeSessionWorkflowSignal,\n} from \"./activities/types\";\nimport { turnTaskQueue } from \"./workflows/activities\";\nimport { createTurnTaskQueueStatsClient } from \"./turn-task-queue-reader\";\nimport { installTemporalRuntimeLogging } from \"./temporal-runtime-logger\";\nimport {\n closeWorkerHttpAfterActivityExecution,\n withTurnWorkerActivityTelemetry,\n type TurnWorkerActivityTelemetry,\n} from \"./turn-worker-activity-telemetry\";\nimport {\n dbReadyCheck,\n natsReadyCheck,\n startWorkerHttpServer,\n temporalReadyCheck,\n type WorkerLifecycleState,\n} from \"./http\";\nimport {\n initializeContextCompactionMetrics,\n initializeWorkerOutcomeMetrics,\n observabilityEventBusOptions,\n startContextCompactionPendingMonitor,\n startSessionRecoveryMonitor,\n startTurnCapacityMonitor,\n type TurnTaskQueueStats,\n type TurnTaskQueueReadOptions,\n type TurnTaskQueueIdentity,\n} from \"./observability-metrics\";\nimport {\n resolveCatalogSettings,\n TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n} from \"@opengeni/core\";\nimport { startInternalMaintenanceCadences } from \"./internal-maintenance\";\nimport {\n CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n createTurnWorkerConcurrencyPlan,\n turnWorkerConcurrencyLogFields,\n} from \"./concurrency\";\nimport {\n combineWorkerRunTargets,\n constructWithOwnedConnection,\n createWorkerServiceLifecycle,\n createWorkerCleanupContainment,\n type WorkerServiceLifecycle,\n type WorkerRunTarget,\n} from \"./worker-service-lifecycle\";\nimport {\n createTurnWorkerMemoryPressureGuard,\n turnWorkerMemoryPressureGuardEnabled,\n type TurnWorkerMemoryPressureGuard,\n} from \"./memory-pressure-guard\";\nimport { assertSandboxReaperActivityTimeout } from \"./sandbox-reaper-timeout\";\nimport { installWorkerUnhandledRejectionBoundary } from \"./unhandled-rejection-boundary\";\nimport {\n SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n SANDBOX_REAPER_V2_WORKFLOW_ID,\n sandboxLifecycleTaskQueue,\n} from \"./sandbox-reaper-contract\";\nimport {\n BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n browserDeadlineCheckpointTaskQueue,\n} from \"./browser-deadline-checkpoint-contract\";\n\nexport {\n createHostExportPump,\n type HostExportDrainResult,\n type HostExportPump,\n type HostExportPumpOptions,\n type HostEventExport,\n type HostEventExportBatch,\n type HostEventSink,\n type HostLifecycleFactExport,\n type HostLifecycleFactExportBatch,\n type HostLifecycleFactSink,\n type HostUsageExport,\n type HostUsageExportBatch,\n type HostUsageSink,\n} from \"./host-export\";\nexport {\n INTERNAL_MAINTENANCE_JOBS,\n KNOWLEDGE_INDEXING_PERIOD_MS,\n KNOWLEDGE_INDEXING_SCHEDULE_ID,\n SITE_AUTH_MAINTENANCE_PERIOD_MS,\n SITE_AUTH_MAINTENANCE_SCHEDULE_ID,\n startInternalMaintenanceCadences,\n type InternalMaintenanceJob,\n} from \"./internal-maintenance\";\n\nexport const FILE_UPLOAD_REAPER_SCHEDULE_ID = \"opengeni-file-upload-reaper\";\nexport const FILE_UPLOAD_REAPER_PERIOD_MS = 15 * 60 * 1_000;\nexport const SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID = \"opengeni-session-storage-maintenance\";\nexport const SESSION_STORAGE_MAINTENANCE_PERIOD_MS = 5 * 60 * 1_000;\nexport type OpenGeniWorkerRole = \"control\" | \"turn\";\n\nexport type WorkerOptions = {\n role: OpenGeniWorkerRole;\n settings?: Settings;\n activities?: ReturnType<typeof createControlActivities> | ReturnType<typeof createTurnActivities>;\n activityDependencies?: ActivityDependencies;\n /** Override the release-coherent workflow artifact. Most hosts should omit this. */\n workflowBundle?: WorkflowBundleOption;\n};\n\ntype TemporalActivityLease = {\n lastHeartbeatTime?: { seconds?: unknown; nanos?: number | null } | null;\n lastStartedTime?: { seconds?: unknown; nanos?: number | null } | null;\n activityOptions?: {\n heartbeatTimeout?: { seconds?: unknown; nanos?: number | null } | null;\n } | null;\n};\n\nfunction temporalTimeMs(\n value: { seconds?: unknown; nanos?: number | null } | null | undefined,\n): number | null {\n if (value?.seconds === undefined || value.seconds === null) return null;\n return Number(String(value.seconds)) * 1_000 + Math.floor((value.nanos ?? 0) / 1_000_000);\n}\n\nexport function temporalActivityLeaseSettled(\n pending: TemporalActivityLease | null | undefined,\n nowMs = Date.now(),\n): boolean {\n if (!pending) return true;\n const heartbeatAt =\n temporalTimeMs(pending.lastHeartbeatTime) ?? temporalTimeMs(pending.lastStartedTime);\n const heartbeatTimeoutMs = temporalTimeMs(pending.activityOptions?.heartbeatTimeout);\n return (\n heartbeatAt !== null && heartbeatTimeoutMs !== null && nowMs >= heartbeatAt + heartbeatTimeoutMs\n );\n}\n\n/** The exact Temporal workflow run is absent, so it cannot retain an activity. */\nexport function temporalWorkflowExecutionNotFound(error: unknown): boolean {\n // gRPC status code 5 is NOT_FOUND. The typed guard prevents unrelated\n // provider/HTTP errors carrying a numeric code from proving quiescence.\n return isGrpcServiceError(error) && error.code === 5;\n}\n\n/** Load exactly one role's activity graph. Exported for embedded hosts and the\n * process-RSS conformance benchmark; construction remains side-effect free\n * until an activity first resolves its injected services. */\nexport async function createDefaultWorkerActivities(\n role: OpenGeniWorkerRole,\n dependencies: ActivityDependencies = {},\n) {\n if (dependencies.objectStorage == null) {\n prepareObjectStorageProvider(dependencies.settings ?? getSettings());\n }\n return role === \"control\"\n ? (await import(\"./activities-control\")).createControlActivities(dependencies)\n : (await import(\"./activities-turn\")).createTurnActivities(dependencies);\n}\n\ntype WorkerWorkflowDefinition =\n | { workflowBundle: WorkflowBundleOption }\n | { workflowsPath: string };\n\n/**\n * Resolve the deterministic workflow graph without asking installed hosts to\n * transpile or relocate package TypeScript. Monorepo source execution retains\n * the source path for the local development loop; published dist execution\n * fails closed unless the build-generated sibling artifact is present.\n */\nexport function resolveOpenGeniWorkflowDefinition(\n moduleUrl: string = import.meta.url,\n): WorkerWorkflowDefinition {\n const modulePath = fileURLToPath(moduleUrl).replaceAll(\"\\\\\", \"/\");\n if (modulePath.endsWith(\"/src/index.ts\")) {\n return { workflowsPath: fileURLToPath(new URL(\"./workflows.ts\", moduleUrl)) };\n }\n const codePath = fileURLToPath(new URL(\"./workflow-bundle.js\", moduleUrl));\n if (!existsSync(codePath)) {\n throw new Error(\n `Opengeni workflow bundle is missing at ${codePath}; rebuild or reinstall @opengeni/worker-bundle`,\n );\n }\n return { workflowBundle: { codePath } };\n}\n\nexport function turnCancellationHeartbeatThrottleOptions() {\n return {\n maxHeartbeatThrottleInterval: TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n defaultHeartbeatThrottleInterval: TURN_ACTIVITY_CANCELLATION_HEARTBEAT_INTERVAL_MS,\n } as const;\n}\n\nexport async function createOpenGeniWorker(options: WorkerOptions): Promise<{\n worker: WorkerRunTarget;\n connection: NativeConnection;\n activityTelemetry?: TurnWorkerActivityTelemetry;\n turnQueueIdentity?: TurnTaskQueueIdentity;\n}> {\n const settings = options.settings ?? getSettings();\n if (options.role === \"control\") {\n // The exported lower-level factory is itself poll-capable. Validate here so\n // embedded hosts cannot bypass the reaper budget contract by omitting the\n // higher-level service and its Schedule-registration lifecycle.\n assertSandboxReaperActivityTimeout(settings);\n }\n const observability =\n options.activityDependencies?.observability ??\n createObservability(settings, { component: `worker-${options.role}` });\n initializeWorkerOutcomeMetrics(observability);\n if (options.role === \"turn\") {\n initializeContextCompactionMetrics(observability);\n }\n if (options.role === \"turn\" && options.workflowBundle) {\n throw new Error(\"workflowBundle is valid only for the control worker role\");\n }\n // Pre-resolve a PRIVATE-registry sandbox image before any turn creates a box.\n // A provider-native OPENGENI_MODAL_IMAGE_ID intentionally bypasses this\n // registry path and is resolved by ModalImageSelector.fromId at create time.\n // Otherwise this is a no-op unless the registry secret + logical ref are both\n // set. Memoized in the provider, so it runs once per process.\n if (options.role === \"turn\") {\n const { ensureModalRegistryImage } = await import(\"@opengeni/runtime/sandbox\");\n await retryStartupDependency(\n \"Modal private-registry image\",\n () => ensureModalRegistryImage(settings),\n {\n ...startupRetryOptions(settings),\n onRetry: (event) => logStartupDependencyRetry(observability, event),\n },\n );\n }\n return constructWithOwnedConnection(\n () =>\n retryStartupDependency(\n \"Temporal\",\n () => NativeConnection.connect(temporalConnectionOptions(settings)),\n {\n ...startupRetryOptions(settings),\n onRetry: (event) => logStartupDependencyRetry(observability, event),\n },\n ),\n async (connection) => {\n let turnWorker: Worker | undefined;\n let cleanupDrainRequested = false;\n const activityDependencies = {\n ...options.activityDependencies,\n settings,\n observability,\n requestWorkerDrain:\n options.activityDependencies?.requestWorkerDrain ??\n (() => {\n if (cleanupDrainRequested) return;\n if (!turnWorker) throw new Error(\"turn worker lifecycle is not initialized\");\n turnWorker.shutdown();\n cleanupDrainRequested = true;\n }),\n };\n const activities =\n options.activities ??\n (await createDefaultWorkerActivities(options.role, activityDependencies));\n const turnConcurrency =\n options.role === \"turn\"\n ? createTurnWorkerConcurrencyPlan(settings, { observability })\n : null;\n const workflowDefinition =\n options.role === \"control\"\n ? options.workflowBundle\n ? { workflowBundle: options.workflowBundle }\n : resolveOpenGeniWorkflowDefinition()\n : {};\n const sharedWorkerOptions = {\n connection,\n namespace: settings.temporalNamespace,\n activities,\n // Cancellation is delivered through an activity heartbeat. Keep the SDK\n // throttle aligned with runAgentTurn's local heartbeat cadence so the\n // four-second control contract still has time for physical writer drain\n // and exact receipt-gated replacement admission.\n ...turnCancellationHeartbeatThrottleOptions(),\n // GRACEFUL DEPLOY SHUTDOWN (with the SIGTERM handler in startWorker):\n // after shutdown() stops polling, in-flight activities get this long to\n // finish naturally; the rest are then CANCELLED with WORKER_SHUTDOWN.\n shutdownGraceTime: \"5s\",\n // Hard ceiling inside the pod's termination grace period.\n shutdownForceTime: \"100s\",\n } as const;\n const worker = await Worker.create({\n ...sharedWorkerOptions,\n taskQueue:\n options.role === \"control\"\n ? settings.temporalTaskQueue\n : turnTaskQueue(settings.temporalTaskQueue),\n ...(options.role === \"control\"\n ? {\n ...workflowDefinition,\n reuseV8Context: true,\n workflowThreadPoolSize: 1,\n maxCachedWorkflows: CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n maxConcurrentWorkflowTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n maxConcurrentActivityTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n }\n : turnConcurrency!.options),\n });\n if (options.role !== \"control\") {\n turnWorker = worker;\n turnConcurrency?.admission?.finalizeStartupBaseline();\n const turnQueueIdentity = {\n temporalNamespace: worker.options.namespace,\n taskQueue: worker.options.taskQueue,\n };\n return {\n ...withTurnWorkerActivityTelemetry(worker, {\n observability,\n identity: turnQueueIdentity,\n // No invented identity when running outside Kubernetes. Scaler\n // consumers must reject empty/missing UID coverage.\n podUid: process.env.OPENGENI_POD_UID ?? \"\",\n }),\n connection,\n turnQueueIdentity,\n };\n }\n\n const ownedWorkers = [worker];\n try {\n // The new activity type has its own queue. Retain the V1 poller so old\n // drain histories finish; old binaries never receive checkpoint work.\n for (const taskQueue of [\n sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n browserDeadlineCheckpointTaskQueue(settings.temporalTaskQueue),\n ]) {\n const lifecycleWorker = await Worker.create({\n ...sharedWorkerOptions,\n ...workflowDefinition,\n taskQueue,\n reuseV8Context: true,\n workflowThreadPoolSize: 1,\n maxCachedWorkflows: CONTROL_WORKER_MAX_CACHED_WORKFLOWS,\n maxConcurrentWorkflowTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS,\n maxConcurrentActivityTaskExecutions: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n });\n ownedWorkers.push(lifecycleWorker);\n }\n return {\n worker: combineWorkerRunTargets(ownedWorkers),\n connection,\n };\n } catch (error) {\n for (const ownedWorker of ownedWorkers) {\n try {\n ownedWorker.shutdown();\n } catch {\n // Preserve the lifecycle worker construction failure. The base poller\n // still received its shutdown request; a secondary synchronous\n // shutdown error must not replace the startup root cause.\n }\n }\n throw error;\n }\n },\n (connection) => connection.close(),\n );\n}\n\n// A signalWithStart capability so a worker activity can wake a PARENT\n// session's workflow when a spawned worker completes (the parent may have\n// idled and let its run finish, so a plain signal would not start one).\n// Separate from the worker's NativeConnection: the @temporalio/client\n// Connection is what exposes workflow.signalWithStart.\nexport async function createWorkerWorkflowSignaler(\n settings: Settings,\n db: Database,\n): Promise<{\n wakeSessionWorkflow: WakeSessionWorkflowSignal;\n signalSessionAttemptQuiesced: SignalSessionAttemptQuiesced;\n inspectSessionAttemptActivity: InspectSessionAttemptActivity;\n signalCodexCapacityWorkflow: SignalCodexCapacityWorkflow;\n getTurnTaskQueueStats: (\n options?: TurnTaskQueueReadOptions,\n identity?: TurnTaskQueueIdentity,\n ) => Promise<TurnTaskQueueStats>;\n startSandboxReaperWorkflow: StartSandboxReaperWorkflow;\n startVideoGenerationWorkflow: StartVideoGenerationWorkflow;\n check: () => Promise<void>;\n close: () => Promise<void>;\n}> {\n const connectionOptions = temporalConnectionOptions(settings);\n const connection = await Connection.connect(connectionOptions);\n const statsClient = createTurnTaskQueueStatsClient(connectionOptions);\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n return {\n wakeSessionWorkflow: async ({\n accountId,\n workspaceId,\n sessionId,\n workflowId,\n wakeRevision,\n interruptionRequested,\n onSignalAccepted,\n }) => {\n if (interruptionRequested) {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"sessionControl\",\n signalArgs: [],\n });\n } else {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"queueChanged\",\n });\n }\n onSignalAccepted?.();\n return await markSessionWorkflowWakeDelivered(db, {\n accountId,\n workspaceId,\n sessionId,\n temporalWorkflowId: workflowId,\n wakeRevision,\n });\n },\n signalSessionAttemptQuiesced: async (proof) => {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId: proof.workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [\n {\n accountId: proof.accountId,\n workspaceId: proof.workspaceId,\n sessionId: proof.sessionId,\n },\n ],\n signal: \"sessionAttemptQuiesced\",\n signalArgs: [proof],\n });\n // No wake-outbox row exists yet: the direct receipt transaction failed.\n // The signalled workflow's DB-only control activity owns committing the\n // receipt and its exact wake revision atomically.\n },\n inspectSessionAttemptActivity: async ({ workflowId, workflowRunId, activityId }) => {\n let description;\n try {\n description = await connection.workflowService.describeWorkflowExecution({\n namespace: settings.temporalNamespace,\n execution: { workflowId, runId: workflowRunId },\n });\n } catch (error) {\n if (temporalWorkflowExecutionNotFound(error)) return \"settled\";\n throw error;\n }\n const pending = description.pendingActivities?.find(\n (activity) => activity.activityId === activityId,\n );\n return temporalActivityLeaseSettled(pending) ? \"settled\" : \"pending\";\n },\n signalCodexCapacityWorkflow: async ({\n accountId,\n workspaceId,\n sessionId,\n workflowId,\n wakeRevision,\n }) => {\n await temporal.workflow.signalWithStart(\"sessionWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [{ accountId, workspaceId, sessionId }],\n signal: \"codexCapacityChanged\",\n signalArgs: [wakeRevision],\n });\n // A typed capacity signal cannot acknowledge the generic outbox row:\n // another producer may have advanced it with a Pause/Steer that requires\n // sessionControl. The global dispatcher owns that acknowledgement.\n },\n getTurnTaskQueueStats: (\n readOptions = { signal: new AbortController().signal, deadline: Date.now() + 5_000 },\n identity = {\n temporalNamespace: settings.temporalNamespace,\n taskQueue: turnTaskQueue(settings.temporalTaskQueue),\n },\n ) => statsClient.read(readOptions, identity),\n startSandboxReaperWorkflow: async () => {\n // Same backend tick, no additional schedule. A bounded independent\n // inventory cannot prevent the existing per-box drain from starting.\n const starts = await Promise.allSettled([\n temporal.workflow.start(\"sandboxReaperWorkflowV2\", {\n taskQueue: sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n workflowId: SANDBOX_REAPER_V2_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n temporal.workflow.start(\"browserDeadlineCheckpointSweepWorkflow\", {\n taskQueue: browserDeadlineCheckpointTaskQueue(settings.temporalTaskQueue),\n workflowId: BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n // Its own workflow type, so the drain workflow's history is unchanged.\n temporal.workflow.start(\"sandboxIdleCheckpointSweepWorkflow\", {\n taskQueue: sandboxLifecycleTaskQueue(settings.temporalTaskQueue),\n workflowId: SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n }),\n ]);\n for (const start of starts) {\n if (\n start.status === \"rejected\" &&\n !(start.reason instanceof WorkflowExecutionAlreadyStartedError)\n ) {\n // The other start already settled. Retry the router without losing\n // ordinary draining or silently omitting the checkpoint sweep.\n throw start.reason;\n }\n }\n return starts[0].status === \"fulfilled\" ? \"started\" : \"already_running\";\n },\n startVideoGenerationWorkflow: async ({ accountId, workspaceId, operationId }) => {\n try {\n await temporal.workflow.start(\"videoGenerationWorkflow\", {\n taskQueue: settings.temporalTaskQueue,\n workflowId: `video-generation:${operationId}`,\n // Reject a concurrent or already-completed run, but allow the repair\n // sweep to restart this exact operation if the workflow itself failed.\n // Every provider/storage transition remains CAS/idempotency fenced in\n // Postgres, so recovery never creates a second logical operation.\n workflowIdReusePolicy: \"ALLOW_DUPLICATE_FAILED_ONLY\",\n args: [\n {\n accountId,\n workspaceId,\n operationId,\n baseTaskQueue: settings.temporalTaskQueue,\n },\n ],\n });\n return \"started\";\n } catch (error) {\n if (error instanceof WorkflowExecutionAlreadyStartedError) {\n return \"already_running\";\n }\n throw error;\n }\n },\n check: async () => {\n await connection.workflowService.getSystemInfo({});\n },\n close: async () => {\n await Promise.all([statsClient.close(), connection.close()]);\n },\n };\n}\n\n/**\n * Register the one provider-neutral expired direct-upload cleanup Schedule.\n * Unlike sandbox GC this is always registered: file uploads can be enabled in\n * deployments where sandbox ownership is disabled. The activity is a cheap\n * no-op when object storage is not configured.\n */\nexport async function registerFileUploadReaperSchedule(\n settings: Settings,\n observability: Observability,\n): Promise<{ registered: boolean; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(settings));\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n try {\n await temporal.schedule.create({\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n spec: { intervals: [{ every: FILE_UPLOAD_REAPER_PERIOD_MS }] },\n action: {\n type: \"startWorkflow\",\n workflowType: \"fileUploadReaperWorkflow\",\n taskQueue: settings.temporalTaskQueue,\n args: [],\n },\n policies: {\n overlap: ScheduleOverlapPolicy.SKIP,\n catchupWindow: \"1m\",\n pauseOnFailure: false,\n },\n });\n observability.info(\"Registered the global file-upload reaper Schedule\", {\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n reaperPeriodMs: FILE_UPLOAD_REAPER_PERIOD_MS,\n });\n return { registered: true, close: async () => connection.close() };\n } catch (error) {\n if (error instanceof ScheduleAlreadyRunning) {\n observability.info(\"Global file-upload reaper Schedule already registered\", {\n scheduleId: FILE_UPLOAD_REAPER_SCHEDULE_ID,\n });\n return { registered: false, close: async () => connection.close() };\n }\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n\n/**\n * Register the deployment-wide session storage maintenance Schedule. Always\n * registered: legacy content compaction is lossless. Overlap is skipped so one\n * pass never races another.\n */\nexport async function registerSessionStorageMaintenanceSchedule(\n settings: Settings,\n observability: Observability,\n): Promise<{ registered: boolean; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(settings));\n const temporal = new TemporalClient({ connection, namespace: settings.temporalNamespace });\n try {\n await temporal.schedule.create({\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n spec: { intervals: [{ every: SESSION_STORAGE_MAINTENANCE_PERIOD_MS }] },\n action: {\n type: \"startWorkflow\",\n workflowType: \"sessionStorageMaintenanceWorkflow\",\n taskQueue: settings.temporalTaskQueue,\n args: [],\n },\n policies: {\n overlap: ScheduleOverlapPolicy.SKIP,\n catchupWindow: \"1m\",\n pauseOnFailure: false,\n },\n });\n observability.info(\"Registered the session storage maintenance Schedule\", {\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n periodMs: SESSION_STORAGE_MAINTENANCE_PERIOD_MS,\n });\n return { registered: true, close: async () => connection.close() };\n } catch (error) {\n if (error instanceof ScheduleAlreadyRunning) {\n observability.info(\"Session storage maintenance Schedule already registered\", {\n scheduleId: SESSION_STORAGE_MAINTENANCE_SCHEDULE_ID,\n });\n return { registered: false, close: async () => connection.close() };\n }\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n\nexport type OpenGeniWorkerServiceOptions = Omit<WorkerOptions, \"activityDependencies\"> & {\n activityDependencies: ActivityDependencies & { db: Database; bus: EventBus };\n /** Host-owned final containment after a stalled cleanup has drained peers.\n * The standalone process exits; embedded hosts own their termination policy. */\n terminateWorker?: () => void;\n /**\n * Exact catalog posture required by the standalone runtime. Embedded hosts\n * may omit this when they own an equivalent database isolation contract.\n */\n databasePosture?: RuntimeDatabasePostureOptions;\n /**\n * `role-default` registers Opengeni's internal maintenance schedules on a\n * control worker only. These are engine maintenance schedules, not a host's\n * product-level scheduled-agent jobs. Use `none` when another control worker\n * in the same deployment owns them.\n */\n internalSchedules?: \"role-default\" | \"none\";\n /**\n * Set false only when the host exposes equivalent lifecycle endpoints itself.\n * A dedicated readiness database prevents ordinary activity-pool saturation\n * from making an otherwise healthy Temporal worker fail Kubernetes readiness.\n * The embedding host retains ownership of this handle.\n */\n http?: false | { readinessTimeoutMs?: number; readinessDb?: Database };\n};\n\nexport type OpenGeniWorkerService = {\n readonly role: OpenGeniWorkerRole;\n readonly worker: WorkerRunTarget;\n readonly connection: NativeConnection;\n state(): WorkerLifecycleState;\n run(): Promise<void>;\n drain(reason?: string): void;\n close(): Promise<void>;\n};\n\nexport function workerOwnsInternalSchedules(\n role: OpenGeniWorkerRole,\n policy: OpenGeniWorkerServiceOptions[\"internalSchedules\"] = \"role-default\",\n): boolean {\n return role === \"control\" && policy !== \"none\";\n}\n\n/**\n * Construct one role-specific worker process around the lower-level Temporal\n * worker factory. The service owns every Temporal client and HTTP listener it\n * creates. The embedding host retains ownership of its injected DB and EventBus\n * handles and closes those only after this service has drained.\n */\nexport async function createOpenGeniWorkerService(\n options: OpenGeniWorkerServiceOptions,\n): Promise<OpenGeniWorkerService> {\n requireSessionEventDurableFanoutCapability(options.activityDependencies.bus);\n const settings = options.settings ?? getSettings();\n const observability =\n options.activityDependencies.observability ??\n createObservability(settings, { component: `worker-${options.role}` });\n const retryOptions = startupRetryOptions(settings);\n const onRetry = (event: Parameters<typeof logStartupDependencyRetry>[1]) =>\n logStartupDependencyRetry(observability, event);\n let lifecycle: WorkerServiceLifecycle | undefined;\n let cleanupContainment: ReturnType<typeof createWorkerCleanupContainment> | undefined;\n let signaler: Awaited<ReturnType<typeof createWorkerWorkflowSignaler>> | undefined;\n let workerBundle: Awaited<ReturnType<typeof createOpenGeniWorker>> | undefined;\n let turnCapacityMonitor: ReturnType<typeof startTurnCapacityMonitor> | undefined;\n let sessionRecoveryMonitor: ReturnType<typeof startSessionRecoveryMonitor> | undefined;\n let contextCompactionPendingMonitor:\n | ReturnType<typeof startContextCompactionPendingMonitor>\n | undefined;\n const schedules: Array<{ close: () => Promise<void> }> = [];\n let httpServer: ReturnType<typeof startWorkerHttpServer> | undefined;\n let memoryPressureGuard: TurnWorkerMemoryPressureGuard | undefined;\n\n try {\n const resolvedCatalog = await retryStartupDependency(\n \"model catalog\",\n () => resolveCatalogSettings(options.activityDependencies.db, settings),\n { ...retryOptions, onRetry },\n );\n observability.info(\"Opengeni model catalog resolved\", {\n role: options.role,\n catalogSource: resolvedCatalog.source,\n catalogVersion: resolvedCatalog.version,\n });\n const needsSignaler =\n options.role === \"turn\" ||\n !options.activityDependencies.wakeSessionWorkflow ||\n !options.activityDependencies.signalSessionAttemptQuiesced ||\n !options.activityDependencies.inspectSessionAttemptActivity ||\n !options.activityDependencies.signalCodexCapacityWorkflow ||\n !options.activityDependencies.startSandboxReaperWorkflow ||\n !options.activityDependencies.startVideoGenerationWorkflow;\n if (needsSignaler) {\n signaler = await retryStartupDependency(\n \"Temporal client\",\n () => createWorkerWorkflowSignaler(settings, options.activityDependencies.db),\n { ...retryOptions, onRetry },\n );\n }\n const wakeSessionWorkflow =\n options.activityDependencies.wakeSessionWorkflow ?? signaler?.wakeSessionWorkflow;\n const signalSessionAttemptQuiesced =\n options.activityDependencies.signalSessionAttemptQuiesced ??\n signaler?.signalSessionAttemptQuiesced;\n const inspectSessionAttemptActivity =\n options.activityDependencies.inspectSessionAttemptActivity ??\n signaler?.inspectSessionAttemptActivity;\n const signalCodexCapacityWorkflow =\n options.activityDependencies.signalCodexCapacityWorkflow ??\n signaler?.signalCodexCapacityWorkflow;\n const startSandboxReaperWorkflow =\n options.activityDependencies.startSandboxReaperWorkflow ??\n signaler?.startSandboxReaperWorkflow;\n const startVideoGenerationWorkflow =\n options.activityDependencies.startVideoGenerationWorkflow ??\n signaler?.startVideoGenerationWorkflow;\n if (\n !wakeSessionWorkflow ||\n !signalSessionAttemptQuiesced ||\n !inspectSessionAttemptActivity ||\n !signalCodexCapacityWorkflow ||\n !startSandboxReaperWorkflow ||\n !startVideoGenerationWorkflow\n ) {\n throw new Error(\"Opengeni worker lifecycle could not resolve its workflow signalers\");\n }\n workerBundle = await createOpenGeniWorker({\n role: options.role,\n settings,\n ...(options.activities ? { activities: options.activities } : {}),\n ...(options.workflowBundle ? { workflowBundle: options.workflowBundle } : {}),\n activityDependencies: {\n ...options.activityDependencies,\n settings,\n observability,\n wakeSessionWorkflow,\n signalSessionAttemptQuiesced,\n inspectSessionAttemptActivity,\n signalCodexCapacityWorkflow,\n startSandboxReaperWorkflow,\n startVideoGenerationWorkflow,\n requestWorkerDrain: () => {\n if (!cleanupContainment) throw new Error(\"worker cleanup containment is not initialized\");\n cleanupContainment.request();\n },\n },\n });\n\n if (options.role === \"turn\") {\n if (!signaler) {\n throw new Error(\"Turn worker capacity monitor could not resolve its Temporal stats client\");\n }\n const statsClient = signaler;\n const identity = workerBundle.turnQueueIdentity;\n if (!identity)\n throw new Error(\"Turn worker did not expose its actual Temporal queue identity\");\n turnCapacityMonitor = startTurnCapacityMonitor({\n observability,\n read: (readOptions) => statsClient.getTurnTaskQueueStats(readOptions, identity),\n identity,\n });\n } else {\n sessionRecoveryMonitor = startSessionRecoveryMonitor({\n observability,\n read: async () => await summarizeSessionRecoveryBacklog(options.activityDependencies.db),\n });\n contextCompactionPendingMonitor = startContextCompactionPendingMonitor({\n observability,\n read: async () => await getContextCompactionPendingSummary(options.activityDependencies.db),\n });\n }\n\n if (workerOwnsInternalSchedules(options.role, options.internalSchedules)) {\n schedules.push(\n await retryStartupDependency(\n \"Temporal schedule (file upload reaper)\",\n () => registerFileUploadReaperSchedule(settings, observability),\n { ...retryOptions, onRetry },\n ),\n );\n schedules.push(\n await retryStartupDependency(\n \"Temporal schedule (session storage maintenance)\",\n () => registerSessionStorageMaintenanceSchedule(settings, observability),\n { ...retryOptions, onRetry },\n ),\n );\n schedules.push(\n await retryStartupDependency(\n \"work-checked maintenance cadences\",\n () =>\n startInternalMaintenanceCadences({\n settings,\n observability,\n db: options.activityDependencies.db,\n ...(options.activityDependencies.documentServices\n ? { documentServices: options.activityDependencies.documentServices }\n : {}),\n }),\n { ...retryOptions, onRetry },\n ),\n );\n }\n\n if (options.http !== false) {\n const readinessDb = options.http?.readinessDb ?? options.activityDependencies.db;\n const databaseReady = dbReadyCheck(readinessDb, options.databasePosture, async () => {\n await resolveCatalogSettings(readinessDb, settings);\n });\n httpServer = startWorkerHttpServer({\n settings,\n observability,\n checks: {\n db: databaseReady,\n nats: natsReadyCheck(options.activityDependencies.bus),\n temporal: temporalReadyCheck(workerBundle.connection),\n },\n ...(options.http?.readinessTimeoutMs ? { timeoutMs: options.http.readinessTimeoutMs } : {}),\n lifecycle: { role: options.role, state: () => lifecycle?.state() ?? \"starting\" },\n });\n }\n } catch (error) {\n workerBundle?.activityTelemetry?.closeIfNeverRun();\n httpServer?.stop(true);\n await Promise.allSettled([\n turnCapacityMonitor?.close(),\n sessionRecoveryMonitor?.close(),\n contextCompactionPendingMonitor?.close(),\n workerBundle?.connection.close(),\n signaler?.close(),\n ...schedules.map((schedule) => schedule.close()),\n ]);\n throw error;\n }\n\n const activeWorkerBundle = workerBundle;\n const activeSignaler = signaler;\n if (!activeWorkerBundle) {\n throw new Error(\"Opengeni worker service initialization did not complete\");\n }\n\n cleanupContainment = createWorkerCleanupContainment({\n drain: () => lifecycle?.drain(\"stalled turn finalization\") ?? false,\n ...(options.terminateWorker ? { terminate: options.terminateWorker } : {}),\n observability,\n });\n const activeCleanupContainment = cleanupContainment;\n lifecycle = createWorkerServiceLifecycle({\n role: options.role,\n worker: {\n shutdown: () => activeWorkerBundle.worker.shutdown(),\n run: async () => {\n await activeWorkerBundle.worker.run();\n activeCleanupContainment.finished();\n },\n },\n observability,\n closeOwnedResources: async () => {\n memoryPressureGuard?.close();\n closeWorkerHttpAfterActivityExecution(activeWorkerBundle.activityTelemetry, () =>\n httpServer?.stop(true),\n );\n await Promise.allSettled([\n turnCapacityMonitor?.close(),\n sessionRecoveryMonitor?.close(),\n contextCompactionPendingMonitor?.close(),\n activeWorkerBundle.connection.close(),\n activeSignaler?.close(),\n ...schedules.map((schedule) => schedule.close()),\n ]);\n },\n onReady: () => {\n observability.info(\"Opengeni worker listening\", {\n role: options.role,\n temporalTaskQueue:\n options.role === \"control\"\n ? settings.temporalTaskQueue\n : turnTaskQueue(settings.temporalTaskQueue),\n ...(options.role === \"turn\"\n ? turnWorkerConcurrencyLogFields(settings)\n : {\n concurrencyMode: \"fixed\",\n maxConcurrentTurns: CONTROL_WORKER_MAX_CONCURRENT_ACTIVITIES,\n targetCpuUsage: null,\n targetMemoryUsage: null,\n }),\n maxConcurrentWorkflowTaskExecutions:\n options.role === \"control\" ? CONTROL_WORKER_MAX_CONCURRENT_WORKFLOW_TASKS : 0,\n maxCachedWorkflows: options.role === \"control\" ? CONTROL_WORKER_MAX_CACHED_WORKFLOWS : 0,\n httpPort: options.http === false ? null : settings.workerHttpPort,\n });\n },\n });\n const activeLifecycle = lifecycle;\n\n if (turnWorkerMemoryPressureGuardEnabled(options.role, settings)) {\n try {\n memoryPressureGuard = createTurnWorkerMemoryPressureGuard({\n settings,\n observability,\n drain: () => {\n if (!activeLifecycle.drain(\"memory pressure guard\")) {\n throw new Error(\"worker shutdown request failed\");\n }\n },\n });\n } catch (error) {\n await activeLifecycle.close();\n throw error;\n }\n }\n\n return {\n role: options.role,\n worker: activeWorkerBundle.worker,\n connection: activeWorkerBundle.connection,\n state: activeLifecycle.state,\n run: activeLifecycle.run,\n drain: (reason) => {\n activeLifecycle.drain(reason);\n },\n close: activeLifecycle.close,\n };\n}\n\nexport type RunOpenGeniWorkerOptions = OpenGeniWorkerServiceOptions & {\n /** Defaults to SIGTERM and SIGINT. Pass false when the host owns process signals. */\n shutdownSignals?: false | ReadonlyArray<\"SIGTERM\" | \"SIGINT\">;\n};\n\n/** Start, drain, and close one embedded worker process. */\nexport async function runOpenGeniWorker(options: RunOpenGeniWorkerOptions): Promise<void> {\n const service = await createOpenGeniWorkerService(options);\n // Reclaim multi-gigabyte workspace archive spools left by a previous worker\n // process that stopped mid-capture/upload. Only provably dead owners' spools\n // are removed, so peers sharing this TMPDIR are unaffected.\n void import(\"@opengeni/runtime/sandbox\")\n .then(({ sweepOrphanedHostArchiveTemporaryDirectoriesOnce }) =>\n sweepOrphanedHostArchiveTemporaryDirectoriesOnce(),\n )\n .then((removed) => {\n if (removed.length > 0) {\n options.activityDependencies.observability?.info(\n \"worker removed orphaned workspace archive spools\",\n { count: removed.length },\n );\n }\n })\n .catch(() => undefined);\n const signals =\n options.shutdownSignals === false ? [] : (options.shutdownSignals ?? [\"SIGTERM\", \"SIGINT\"]);\n const handlers = signals.map((signal) => {\n const handler = () => service.drain(signal);\n process.on(signal, handler);\n return { signal, handler };\n });\n try {\n await service.run();\n } finally {\n for (const { signal, handler } of handlers) {\n process.off(signal, handler);\n }\n await service.close();\n }\n}\n\nexport async function startWorker() {\n const role = process.env.OPENGENI_WORKER_ROLE;\n if (role !== \"control\" && role !== \"turn\") {\n throw new Error(\"OPENGENI_WORKER_ROLE must be explicitly set to 'control' or 'turn'\");\n }\n const settings = getSettings();\n const observability = createObservability(settings, { component: `worker-${role}` });\n // Before any NativeConnection: SDK and core logs become structured lines.\n installTemporalRuntimeLogging(observability);\n // The Agents SDK also listens for unhandled rejections and exits the process.\n // Keep detached SDK/transport promises observational here: durable turn\n // activity boundaries own failures, while process exit causes cross-session\n // lease loss for every turn assigned to this shared worker pod.\n const disposeUnhandledRejectionBoundary = installWorkerUnhandledRejectionBoundary();\n const retryOptions = startupRetryOptions(settings);\n const onRetry = (event: Parameters<typeof logStartupDependencyRetry>[1]) =>\n logStartupDependencyRetry(observability, event);\n const searchPath = dbSearchPath(settings);\n const preparedStatements =\n settings.databasePreparedStatements === undefined\n ? {}\n : { preparedStatements: settings.databasePreparedStatements };\n const dbClient = createDb(settings.databaseUrl, {\n ...(searchPath ? { searchPath } : {}),\n rlsStrategy: settings.rlsStrategy,\n ...preparedStatements,\n });\n // Readiness must prove PostgreSQL independently of activity demand. Sharing\n // the default application pool makes the probe wait behind live turns when\n // all ten slots are occupied, even while PostgreSQL itself is healthy. Since\n // Kubernetes readiness cannot stop Temporal polling, that false negative\n // only wedges rollouts and service health; reserve one probe connection.\n const readinessDbClient = createDb(settings.databaseUrl, {\n ...(searchPath ? { searchPath } : {}),\n rlsStrategy: settings.rlsStrategy,\n ...preparedStatements,\n max: 1,\n });\n const databasePosture = {\n rlsStrategy: settings.rlsStrategy,\n expectedRole: settings.runtimeDatabaseRole,\n targetSchema: settings.dbSchema.trim() || \"public\",\n } as const;\n const controlPlaneAuth = resolveNatsControlPlaneAuth(settings);\n let bus: Awaited<ReturnType<typeof createNatsEventBus>> | undefined;\n try {\n await retryStartupDependency(\n \"PostgreSQL runtime posture\",\n () => assertRuntimeDatabasePosture(dbClient.db, databasePosture),\n { ...retryOptions, onRetry, shouldRetry: isRetryableRuntimeDatabaseStartupError },\n );\n bus = await retryStartupDependency(\n \"NATS\",\n () =>\n createNatsEventBus(\n settings.natsUrl,\n controlPlaneAuth\n ? { user: controlPlaneAuth.user, pass: controlPlaneAuth.password }\n : undefined,\n observabilityEventBusOptions(observability),\n ),\n { ...retryOptions, onRetry },\n );\n await runOpenGeniWorker({\n role,\n terminateWorker: () => process.exit(1),\n settings,\n databasePosture,\n http: { readinessDb: readinessDbClient.db },\n activityDependencies: {\n observability,\n db: dbClient.db,\n bus,\n },\n });\n } finally {\n await Promise.allSettled([\n closeNativeExternalVaultProviders(),\n bus?.close(),\n readinessDbClient.close(),\n dbClient.close(),\n ]);\n disposeUnhandledRejectionBoundary();\n }\n}\n\nif (import.meta.main) {\n // `bun --watch` keeps its supervisor alive after the application consumes\n // SIGINT. Once the worker, NATS, DB, and Temporal resources have all closed,\n // explicitly terminate that supervisor too; otherwise a later file edit can\n // resurrect this stopped process as a duplicate worker with stale env/code.\n let interrupted = false;\n const markInterrupted = () => {\n interrupted = true;\n };\n process.once(\"SIGINT\", markInterrupted);\n try {\n await startWorker();\n } finally {\n process.off(\"SIGINT\", markInterrupted);\n if (interrupted) process.exit(0);\n }\n}\n","import {\n ActivityCancellationType,\n ActivityFailure,\n ApplicationFailure,\n proxyActivities,\n} from \"@temporalio/workflow\";\nimport type * as activities from \"../activities\";\nimport {\n KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS,\n KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS,\n} from \"../knowledge-source-sync-activity-policy\";\n\ntype WorkflowControlActivities = Pick<\n typeof activities,\n | \"enqueueGoalRetryWake\"\n | \"expireSessionHumanInput\"\n | \"expireSessionInteractionIntervention\"\n | \"expireScheduledRunHumanWait\"\n | \"failSessionAttempt\"\n | \"getCodexCapacityWait\"\n | \"markSessionIdle\"\n | \"peekSessionWork\"\n | \"persistSessionAttemptQuiescence\"\n | \"reconcileSessionAttemptQuiescence\"\n | \"reconcileSettledSessionAttempt\"\n | \"reconcileCodexCapacityWait\"\n | \"recoverDispatch\"\n | \"recoverEscapedMcpTimeout\"\n | \"settleSessionInterruptions\"\n | \"settleSessionInputWait\"\n>;\n\n/**\n * Session/schedule workflow control activities are bounded, idempotent database\n * and provider-metadata operations. They must not inherit the agent turn's\n * 30-day attempt: Temporal cannot otherwise detect that the pod which accepted\n * a non-heartbeating control activity disappeared, leaving the workflow pinned\n * to a dead worker for the full 30 days. A bounded attempt plus an unbounded\n * Temporal retry keeps the durable workflow alive across rollout, node loss, or\n * transient database/network failure; retries re-run on a healthy control pod.\n */\nexport const activity = proxyActivities<WorkflowControlActivities>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n },\n});\n\n/** One schedule occurrence is bounded. Transient control-plane failures get a\n * short retry window, but a revoked binding or other permanent task error must\n * not leave a Temporal activity retrying forever; the next scheduled occurrence\n * is an independent workflow and will re-evaluate current state. */\nexport const scheduledTaskActivity = proxyActivities<\n Pick<typeof activities, \"dispatchScheduledTaskRun\">\n>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 5,\n },\n});\n\nexport const automationActivity = proxyActivities<Pick<typeof activities, \"dispatchAutomationRun\">>(\n {\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 5,\n },\n },\n);\n\n/** Dispatch has a bounded retry window, but an accepted automation event must\n * not remain durably `dispatching` after that window closes. This compensating\n * database write is idempotent and retries without a cap until the run reaches\n * a terminal state (or is observed as already dispatched). */\nexport const automationFailureActivity = proxyActivities<\n Pick<typeof activities, \"settleAutomationRunFailure\">\n>({\n startToCloseTimeout: \"2 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n },\n});\n\n/** Goal continuation evaluates a durable Postgres obligation at an idle\n * boundary. A transient failure gets a short retry window, then records an\n * explicit delayed outbox wake instead of relying on an unrelated mutation or\n * keeping workflow history alive with polling. */\nexport const goalActivity = proxyActivities<Pick<typeof activities, \"maybeContinueGoal\">>({\n startToCloseTimeout: \"30 seconds\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"5 seconds\",\n maximumAttempts: 3,\n },\n});\n\nexport function turnTaskQueue(baseTaskQueue: string): string {\n return `${baseTaskQueue}-turns`;\n}\n\nexport function turnActivityForTaskQueue(baseTaskQueue: string, receiptGatedCancellation = true) {\n return proxyActivities<Pick<typeof activities, \"runAgentTurn\">>({\n taskQueue: turnTaskQueue(baseTaskQueue),\n // Agent segments legitimately run for days. A started turn heartbeats;\n // queued activities remain queued truthfully until a capped turn worker\n // accepts them and performs the atomic claim.\n startToCloseTimeout: \"30 days\",\n heartbeatTimeout: \"2 minutes\",\n // Pause/Steer first closes the exact attempt in Postgres, then asks\n // Temporal to deliver cancellation. The workflow must not wait for the\n // Temporal activity promise: a provider cleanup promise can outlive the\n // fenced activity body, and Temporal terminalization is not proof that\n // sandbox tools or processes are physically quiescent. The activity owns\n // that proof and writes an exact receipt after its hard tool fence; the\n // receipt transaction wakes the workflow to admit a replacement.\n cancellationType: receiptGatedCancellation\n ? ActivityCancellationType.TRY_CANCEL\n : ActivityCancellationType.WAIT_CANCELLATION_COMPLETED,\n retry: { maximumAttempts: 1 },\n });\n}\n\nexport function videoGenerationActivityForTaskQueue(baseTaskQueue: string) {\n return proxyActivities<Pick<typeof activities, \"reconcileVideoGenerationOperation\">>({\n taskQueue: turnTaskQueue(baseTaskQueue),\n startToCloseTimeout: \"20 minutes\",\n retry: {\n initialInterval: \"1 second\",\n backoffCoefficient: 2,\n maximumInterval: \"30 seconds\",\n maximumAttempts: 3,\n },\n });\n}\n\nexport const documentActivity = proxyActivities<Pick<typeof activities, \"indexDocument\">>({\n startToCloseTimeout: \"30 minutes\",\n retry: { maximumAttempts: 1 },\n});\n\n/** Connector inventory/download/index batches are provider-I/O activities. The\n * implementation heartbeats between bounded items and owns its resumable\n * checkpoint; Temporal retries therefore repeat only idempotent source/object\n * operations and never invoke the agent runtime. */\nexport const knowledgeSourceSyncActivity = proxyActivities<\n Pick<typeof activities, \"runKnowledgeSourceSyncBatch\">\n>({\n startToCloseTimeout: \"1 hour\",\n heartbeatTimeout: KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS,\n retry: {\n initialInterval: \"2 seconds\",\n backoffCoefficient: 2,\n maximumInterval: \"1 minute\",\n maximumAttempts: KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS,\n },\n});\n\nexport function workflowFailureMessage(error: unknown): string {\n if (\n error instanceof ActivityFailure &&\n error.activityType === \"runAgentTurn\" &&\n error.cause instanceof ApplicationFailure &&\n error.cause.type === \"TurnExecutionPolicyDefinitionMismatchError\"\n ) {\n return error.cause.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","export const KNOWLEDGE_SOURCE_SYNC_ACTIVITY_HEARTBEAT_TIMEOUT_MS = 120_000;\nexport const KNOWLEDGE_SOURCE_SYNC_ACTIVITY_MAXIMUM_ATTEMPTS = 1;\n","import { Connection, type ConnectionOptions } from \"@temporalio/client\";\nimport {\n normalizeTurnTaskQueueStats,\n type TurnTaskQueueIdentity,\n type TurnTaskQueueReadOptions,\n type TurnTaskQueueStats,\n} from \"./observability-metrics\";\nimport {\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\n\n/** Own diagnostic traffic separately from admission/signaling. SDK1.22's retry\n * interceptor does not cancel backoff or replacement calls, so each diagnostic\n * RPC is one native attempt; the monitor schedules any later observation.\n * Lazy construction avoids another startup/connect retry or an unbounded probe. */\nexport function createTurnTaskQueueStatsClient(\n connectionOptions: ConnectionOptions,\n input: { scheduler?: TelemetryScheduler; closeTimeoutMs?: number } = {},\n): {\n read(\n options: TurnTaskQueueReadOptions,\n identity: TurnTaskQueueIdentity,\n ): Promise<TurnTaskQueueStats>;\n close(): Promise<void>;\n} {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const closeTimeoutMs = telemetryInterval(\n input.closeTimeoutMs ?? 1_000,\n \"queue client closeTimeoutMs\",\n );\n let connection: Connection | undefined;\n let closed = false;\n let closing: Promise<void> | undefined;\n const active = new Set<AbortController>();\n return {\n read: async ({ signal, deadline }, identity) => {\n signal.throwIfAborted();\n if (closed) throw new Error(\"turn task-queue diagnostic client is closed\");\n const controller = new AbortController();\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n active.add(controller);\n try {\n connection ??= Connection.lazy({ ...connectionOptions, interceptors: [] });\n const stats = await createTurnTaskQueueStatsReader(\n connection,\n identity,\n )({\n signal: controller.signal,\n deadline,\n });\n controller.signal.throwIfAborted(); // Close/abort cannot resurrect a late result.\n return stats;\n } finally {\n active.delete(controller);\n signal.removeEventListener(\"abort\", abort);\n }\n },\n close: () => {\n if (closing) return closing;\n closed = true;\n for (const controller of active) controller.abort();\n const owned = connection;\n if (!owned) return (closing = Promise.resolve());\n closing = new Promise<void>((resolve) => {\n const cancelTimeout = scheduler.timeout(resolve, closeTimeoutMs);\n const settled = () => {\n cancelTimeout();\n resolve();\n };\n try {\n void owned.close().then(settled, settled);\n } catch {\n settled(); // Diagnostic close failure must not break worker cleanup.\n }\n });\n return closing;\n },\n };\n}\n\n/** Scope only this diagnostic RPC, never signal/start/admission traffic. Both\n * call-context APIs are public in the pinned Temporal TS SDK 1.22. The caller\n * must supply a retry-disabled connection (the owned client above does so). */\nexport function createTurnTaskQueueStatsReader(\n connection: Pick<Connection, \"workflowService\" | \"withDeadline\" | \"withAbortSignal\">,\n identity: TurnTaskQueueIdentity,\n): (options: TurnTaskQueueReadOptions) => Promise<TurnTaskQueueStats> {\n return async ({ signal, deadline }) => {\n // SDK1.22 installs its cancel listener when creating the gRPC call; do not\n // launch a call with an already-aborted signal whose event has passed.\n signal.throwIfAborted();\n return connection.withAbortSignal(signal, () =>\n connection.withDeadline(deadline, async () => {\n signal.throwIfAborted();\n const response = await connection.workflowService.describeTaskQueue({\n namespace: identity.temporalNamespace,\n taskQueue: { name: identity.taskQueue },\n // TASK_QUEUE_TYPE_ACTIVITY, supported DEFAULT mode. This is the shared\n // turn-worker activity queue (also video/retries), not a turn count.\n taskQueueType: 2,\n reportStats: true,\n });\n return normalizeTurnTaskQueueStats(response.stats);\n }),\n );\n };\n}\n","import { createTemporalSdkLogger, type Observability } from \"@opengeni/observability\";\nimport { makeTelemetryFilterString, Runtime, type RuntimeOptions } from \"@temporalio/worker\";\n\n/**\n * Runtime options that send every Temporal SDK log record, including records\n * forwarded from the Rust core, through the structured Opengeni logger.\n * Without this the SDK's DefaultLogger prints multi-line objects (with task\n * tokens, raw errors and stacks) and core prints plain text, both outside the\n * public log projection and the one-JSON-object-per-line contract.\n */\nexport function temporalRuntimeLoggingOptions(\n observability: Pick<Observability, \"log\">,\n): RuntimeOptions {\n return {\n logger: createTemporalSdkLogger(observability),\n telemetryOptions: {\n logging: {\n // The SDK's default core filter, now forwarded instead of printed.\n filter: makeTelemetryFilterString({ core: \"WARN\", other: \"ERROR\" }),\n forward: {},\n },\n },\n };\n}\n\ntype RuntimeInstaller = {\n readonly _instance?: unknown;\n install(options: RuntimeOptions): unknown;\n};\n\n/**\n * Install the process-wide Temporal Runtime with the structured logger. Must\n * run before the first NativeConnection or Worker is created. Returns false\n * when an embedding host already installed its own Runtime, which is left\n * untouched.\n */\nexport function installTemporalRuntimeLogging(\n observability: Pick<Observability, \"log\">,\n runtime: RuntimeInstaller = Runtime,\n): boolean {\n if (runtime._instance !== undefined) return false;\n runtime.install(temporalRuntimeLoggingOptions(observability));\n return true;\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport type { Worker, WorkerStatus } from \"@temporalio/worker\";\nimport { turnTaskQueueMetricLabels, type TurnTaskQueueIdentity } from \"./observability-metrics\";\nimport {\n createTelemetryClock,\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\nimport type { WorkerRunTarget } from \"./worker-service-lifecycle\";\n\nexport const TURN_WORKER_ACTIVITY_METRICS = {\n inflight: \"opengeni_turn_worker_activities_inflight\",\n timestamp: \"opengeni_turn_worker_activities_last_observed_timestamp_seconds\",\n valid: \"opengeni_turn_worker_activities_last_read_success\",\n} as const;\n\nexport type TurnWorkerActivityTelemetry = {\n /** Settles only when Worker.run AND all SDK activity execution have settled. */\n settled: Promise<void>;\n isSettled(): boolean;\n closeIfNeverRun(): void;\n};\n\n/** Preserve scraping after an SDK force-failure without blocking resource close\n * or extending the host shutdown/containment budgets. */\nexport function closeWorkerHttpAfterActivityExecution(\n telemetry: TurnWorkerActivityTelemetry | undefined,\n close: () => void | Promise<void>,\n): void {\n telemetry?.closeIfNeverRun();\n if (!telemetry || telemetry.isSettled()) {\n try {\n void Promise.resolve(close()).catch(() => undefined);\n } catch {\n /* Preserve other resource cleanup. */\n }\n } else {\n void telemetry.settled.then(close).catch(() => undefined);\n }\n}\n\ntype SdkActivityWorker = Pick<Worker, \"run\" | \"shutdown\"> & {\n getStatus(): Pick<\n WorkerStatus,\n \"numInFlightNonLocalActivities\" | \"numInFlightLocalActivities\" | \"numInFlightActivities\"\n >;\n numInFlightActivities$: {\n subscribe(observer: { next(value: number): void; error(error: unknown): void }): {\n unsubscribe(): void;\n };\n };\n};\n\n/** Only public SDK1.22 hooks. Never count agent claims/slots, poll reservations,\n * heartbeat activity counts, or cancellation intent as executing occupancy.\n * Requires a fresh metric registry/schema and one SDK turn-worker owner per\n * registry + namespace + queue + physical UID. This bridge does not aggregate\n * multiple workers or migrate legacy pre-registered unlabelled gauges. */\nexport function withTurnWorkerActivityTelemetry(\n sdkWorker: SdkActivityWorker,\n input: {\n observability: Observability;\n identity: TurnTaskQueueIdentity;\n podUid: string;\n intervalMs?: number;\n now?: () => number;\n scheduler?: TelemetryScheduler;\n },\n): { worker: WorkerRunTarget; activityTelemetry: TurnWorkerActivityTelemetry } {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const intervalMs = telemetryInterval(input.intervalMs ?? 15_000, \"activity telemetry intervalMs\");\n const clock = createTelemetryClock(input.now ?? Date.now);\n const labels = { ...turnTaskQueueMetricLabels(input.identity), worker_pod_uid: input.podUid };\n let runStarted = false;\n let runSettled = false;\n let runPromise: Promise<void> | undefined;\n let disposed = false;\n let queued = false;\n let subscription: { unsubscribe(): void } | undefined;\n let stopTimer: (() => void) | undefined;\n let resolveSettled!: () => void;\n const settled = new Promise<void>((resolve) => {\n resolveSettled = resolve;\n });\n const set = (name: string, help: string, value: number) =>\n input.observability.setGauge({ name, help, labels, value });\n const invalidate = () => {\n if (disposed) return;\n try {\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 0,\n );\n } catch {\n /* Metrics cannot fail an activity or the worker. Age also fences failed exporters. */\n }\n };\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n stopTimer?.();\n try {\n subscription?.unsubscribe();\n } catch {\n /* Host lifecycle remains unchanged. */\n }\n resolveSettled();\n };\n const sample = () => {\n if (disposed) return;\n let idle = false;\n try {\n const status = sdkWorker.getStatus();\n const count = status.numInFlightNonLocalActivities;\n const local = status.numInFlightLocalActivities;\n const total = status.numInFlightActivities;\n if (\n ![count, local, total].every((value) => Number.isSafeInteger(value) && value >= 0) ||\n count + local !== total\n ) {\n throw new Error(\"invalid SDK executing activity state\");\n }\n idle = total === 0;\n const observedAt = clock.read();\n if (observedAt === null) throw new Error(\"invalid activity observation clock\");\n // Publish validity last; a partial or failed metric update cannot license\n // combining a new timestamp with old occupancy. Never invent idle zero.\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 0,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.inflight,\n \"SDK executing non-local activities on this turn worker, including preclaim, video and cancellation-unresolved execution.\",\n count,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.timestamp,\n \"Unix timestamp of the latest successful SDK activity occupancy observation.\",\n observedAt / 1_000,\n );\n set(\n TURN_WORKER_ACTIVITY_METRICS.valid,\n \"Whether the latest SDK activity occupancy observation succeeded.\",\n 1,\n );\n } catch {\n invalidate();\n }\n // SDK force-shutdown rejection alone is not activity quiescence. Counters remain\n // live until the underlying JS promises settle, including after run rejects.\n if (runSettled && idle) dispose();\n };\n const scheduleSample = () => {\n if (disposed || queued) return;\n queued = true;\n // SDK increments its aggregate observable BEFORE its local/nonlocal\n // breakdown. Read after that synchronous transition, not inside it.\n scheduler.defer(() => {\n queued = false;\n sample();\n });\n };\n try {\n subscription = sdkWorker.numInFlightActivities$.subscribe({\n next: scheduleSample,\n error: invalidate,\n });\n } catch {\n invalidate();\n }\n stopTimer = scheduler.interval(sample, intervalMs);\n sample(); // INITIALIZED workers expose true idle zero before the first poll.\n const activityTelemetry: TurnWorkerActivityTelemetry = {\n settled,\n isSettled: () => disposed,\n closeIfNeverRun: () => {\n if (!runStarted) {\n runSettled = true;\n sample();\n }\n },\n };\n return {\n activityTelemetry,\n worker: {\n shutdown: () => sdkWorker.shutdown(), // Drain never unregisters observation.\n run: () => {\n if (!runPromise && runSettled)\n return Promise.reject(new Error(\"cannot run a closed turn worker\"));\n // A second SDK run rejects immediately while the first may still poll.\n // Keep one execution owner so that rejection cannot detach telemetry.\n runPromise ??= (async () => {\n runStarted = true;\n try {\n await sdkWorker.run();\n } finally {\n runSettled = true;\n sample();\n }\n })();\n return runPromise;\n },\n },\n };\n}\n","import type { Settings } from \"@opengeni/config\";\nimport {\n assertRuntimeDatabasePosture,\n dbSql,\n type Database,\n type RuntimeDatabasePostureOptions,\n} from \"@opengeni/db\";\nimport { requireSessionEventDurableFanoutCapability, type EventBus } from \"@opengeni/events\";\nimport { githubAppBotIdentityWarnings } from \"@opengeni/github\";\nimport type { Observability } from \"@opengeni/observability\";\n\nexport type ReadinessCheckName = \"db\" | \"nats\" | \"temporal\";\nexport type ReadinessChecks = Record<ReadinessCheckName, () => Promise<void> | void>;\n\nexport type ReadinessResult = {\n ok: boolean;\n state?: WorkerLifecycleState;\n checks: Record<ReadinessCheckName, { ok: boolean; error?: string }>;\n};\n\nexport type WorkerLifecycleState = \"starting\" | \"ready\" | \"draining\" | \"stopped\" | \"failed\";\n\nexport type WorkerHttpLifecycle = {\n role: \"control\" | \"turn\";\n state: () => WorkerLifecycleState;\n};\n\nexport type WorkerHttpServerInput = {\n settings: Settings;\n observability: Observability;\n checks: ReadinessChecks;\n timeoutMs?: number;\n lifecycle?: WorkerHttpLifecycle;\n};\n\nexport function createWorkerHttpHandler(\n input: WorkerHttpServerInput,\n): (request: Request) => Promise<Response> {\n const { settings, observability, checks, lifecycle } = input;\n const timeoutMs = input.timeoutMs ?? 2_000;\n return async (request) => {\n const url = new URL(request.url);\n if (request.method !== \"GET\") {\n return Response.json({ error: \"method_not_allowed\" }, { status: 405 });\n }\n if (url.pathname === \"/healthz\") {\n const state = lifecycle?.state();\n const ok = state !== \"failed\" && state !== \"stopped\";\n const warnings = githubAppBotIdentityWarnings(settings);\n return Response.json(\n {\n service: settings.serviceName,\n environment: settings.environment,\n deploymentRevision: settings.deploymentRevision,\n ...(lifecycle ? { role: lifecycle.role, state } : {}),\n ...(warnings.length > 0 ? { warnings } : {}),\n ok,\n },\n { status: ok ? 200 : 503 },\n );\n }\n if (url.pathname === \"/metrics\") {\n return new Response(await observability.prometheusMetrics(), {\n status: 200,\n headers: { \"content-type\": \"text/plain; version=0.0.4; charset=utf-8\" },\n });\n }\n if (url.pathname === \"/readyz\") {\n const state = lifecycle?.state();\n const result =\n state && state !== \"ready\"\n ? {\n ok: false,\n state,\n checks: Object.fromEntries(\n (Object.keys(checks) as ReadinessCheckName[]).map((name) => [\n name,\n { ok: false, error: \"worker_not_ready\" },\n ]),\n ) as ReadinessResult[\"checks\"],\n }\n : { ...(await runReadinessChecks(checks, timeoutMs)), ...(state ? { state } : {}) };\n return Response.json(result, { status: result.ok ? 200 : 503 });\n }\n return Response.json({ error: \"not_found\" }, { status: 404 });\n };\n}\n\nexport function startWorkerHttpServer(input: WorkerHttpServerInput): ReturnType<typeof Bun.serve> {\n return Bun.serve({\n hostname: \"0.0.0.0\",\n port: input.settings.workerHttpPort,\n fetch: createWorkerHttpHandler(input),\n });\n}\n\nexport async function runReadinessChecks(\n checks: ReadinessChecks,\n timeoutMs = 2_000,\n): Promise<ReadinessResult> {\n const entries = await Promise.all(\n (Object.entries(checks) as Array<[ReadinessCheckName, () => Promise<void> | void]>).map(\n async ([name, check]) => {\n try {\n await withTimeout(Promise.resolve().then(check), timeoutMs);\n return [name, { ok: true }] as const;\n } catch {\n return [name, { ok: false, error: \"dependency_unavailable\" }] as const;\n }\n },\n ),\n );\n const result = Object.fromEntries(entries) as ReadinessResult[\"checks\"];\n return {\n ok: Object.values(result).every((check) => check.ok),\n checks: result,\n };\n}\n\nexport function dbReadyCheck(\n db: Database,\n posture?: RuntimeDatabasePostureOptions,\n afterDatabaseReady?: () => Promise<void>,\n): () => Promise<void> {\n let inFlight: Promise<void> | undefined;\n return () => {\n // The HTTP timeout cannot cancel a driver query. Reuse an outstanding\n // attempt so repeated kubelet probes cannot queue an unbounded tail behind\n // one slow or disconnected database connection.\n if (inFlight) return inFlight;\n inFlight = (async () => {\n if (posture) {\n await assertRuntimeDatabasePosture(db, posture);\n } else {\n await db.execute(dbSql`select 1`);\n }\n await afterDatabaseReady?.();\n })().finally(() => {\n inFlight = undefined;\n });\n return inFlight;\n };\n}\n\nexport function natsReadyCheck(bus: EventBus): () => void {\n return () => {\n requireSessionEventDurableFanoutCapability(bus);\n if (bus.isConnected && !bus.isConnected()) {\n throw new Error(\"NATS is not connected\");\n }\n };\n}\n\nexport function temporalReadyCheck(\n connection: Pick<\n import(\"@temporalio/worker\").NativeConnection,\n \"workflowService\" | \"withDeadline\"\n >,\n): () => Promise<void> {\n return async () => {\n await connection.withDeadline(Date.now() + 2_000, () =>\n connection.workflowService.getSystemInfo({}),\n );\n };\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`readiness check timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n","import { temporalConnectionOptions, type Settings } from \"@opengeni/config\";\nimport {\n SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,\n SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS,\n SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID,\n SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,\n SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE,\n} from \"@opengeni/core\";\nimport {\n automaticSessionTitleFanoutDue,\n browserDeadlineCheckpointDue,\n knowledgeIndexDue,\n maintainSubscriptionPlans,\n sandboxIdleCheckpointDue,\n sandboxLeaseReaperDue,\n sandboxMaintenanceDue,\n sessionWorkflowWakesDue,\n siteAuthMaintenanceDue,\n subscriptionPlanMaintenanceDue,\n workspacePauseTimerDue,\n type Database,\n} from \"@opengeni/db\";\nimport type { DocumentServices } from \"@opengeni/documents\";\nimport type { Observability } from \"@opengeni/observability\";\nimport {\n Connection,\n ScheduleNotFoundError,\n Client as TemporalClient,\n WorkflowExecutionAlreadyStartedError,\n} from \"@temporalio/client\";\nimport {\n startMaintenanceCadences,\n type MaintenanceCadence,\n type MaintenanceCadences,\n type MaintenanceStartResult,\n} from \"./maintenance-cadence\";\nimport {\n BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n browserDeadlineCheckpointTaskQueue,\n} from \"./browser-deadline-checkpoint-contract\";\nimport {\n SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n SANDBOX_REAPER_V2_WORKFLOW_ID,\n sandboxLifecycleTaskQueue,\n} from \"./sandbox-reaper-contract\";\nimport { assertSandboxReaperActivityTimeout } from \"./sandbox-reaper-timeout\";\nimport type { TelemetryScheduler } from \"./telemetry-scheduler\";\n\nexport const KNOWLEDGE_INDEXING_SCHEDULE_ID = \"opengeni-knowledge-indexing\";\nexport const KNOWLEDGE_INDEXING_WORKFLOW_ID = \"opengeni-knowledge-indexing\";\nexport const KNOWLEDGE_INDEXING_PERIOD_MS = 15_000;\nexport const SITE_AUTH_MAINTENANCE_SCHEDULE_ID = \"opengeni-site-auth-maintenance\";\nexport const SITE_AUTH_MAINTENANCE_WORKFLOW_ID = \"opengeni-site-auth-maintenance\";\n/** Matches the minimum public site-auth health policy interval. */\nexport const SITE_AUTH_MAINTENANCE_PERIOD_MS = 60 * 1_000;\n/** The Schedule earlier releases used to drive the sandbox lease reaper. */\nexport const SANDBOX_REAPER_SCHEDULE_ID = \"opengeni-sandbox-lease-reaper\";\n/** Small bounded DB-only pass; no Temporal execution for plan maintenance. */\nexport const SUBSCRIPTION_PLAN_MAINTENANCE_PERIOD_MS = 60_000;\n\nexport const INTERNAL_MAINTENANCE_JOBS = [\n \"session-workflow-wake-dispatcher\",\n \"knowledge-indexing\",\n \"site-auth-maintenance\",\n \"sandbox-lease-reaper\",\n \"sandbox-idle-checkpoint\",\n \"browser-deadline-checkpoint\",\n \"subscription-plan-maintenance\",\n] as const;\nexport type InternalMaintenanceJob = (typeof INTERNAL_MAINTENANCE_JOBS)[number];\n\n/** Schedules that earlier releases created for these jobs. A paused Schedule\n * still runs its scheduler workflow on every tick, so they are deleted. */\nconst LEGACY_SCHEDULE_IDS: Partial<Record<InternalMaintenanceJob, string>> = {\n \"session-workflow-wake-dispatcher\": SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID,\n \"knowledge-indexing\": KNOWLEDGE_INDEXING_SCHEDULE_ID,\n \"site-auth-maintenance\": SITE_AUTH_MAINTENANCE_SCHEDULE_ID,\n // The old reaper Schedule fired a router workflow that started the drain\n // inventory, both checkpoint sweeps and the maintenance child on every tick.\n \"sandbox-lease-reaper\": SANDBOX_REAPER_SCHEDULE_ID,\n};\n\ntype WorkflowStarter = Pick<TemporalClient[\"workflow\"], \"start\" | \"signalWithStart\">;\ntype ScheduleDeleter = { getHandle(id: string): { delete(): Promise<void> } };\n\n/** Start a fixed-id maintenance workflow unless one is already running; the\n * running sweep's own claims cover whatever this tick saw. */\nexport async function startMaintenanceWorkflowOnce(\n workflow: WorkflowStarter,\n input: { workflowType: string; workflowId: string; taskQueue: string },\n): Promise<MaintenanceStartResult> {\n try {\n await workflow.start(input.workflowType, {\n taskQueue: input.taskQueue,\n workflowId: input.workflowId,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n });\n return \"started\";\n } catch (error) {\n if (error instanceof WorkflowExecutionAlreadyStartedError) return \"already_running\";\n throw error;\n }\n}\n\n/** Remove the per-tick Schedules this release replaces. Absent is success. */\nexport async function deleteLegacyMaintenanceSchedules(\n schedule: ScheduleDeleter,\n jobs: readonly InternalMaintenanceJob[],\n observability: Observability,\n): Promise<void> {\n for (const job of jobs) {\n const scheduleId = LEGACY_SCHEDULE_IDS[job];\n if (!scheduleId) continue;\n try {\n await schedule.getHandle(scheduleId).delete();\n observability.info(\n \"Deleted a per-tick maintenance Schedule replaced by a work-checked cadence\",\n {\n job,\n scheduleId,\n },\n );\n } catch (error) {\n if (!(error instanceof ScheduleNotFoundError)) throw error;\n }\n }\n}\n\n/**\n * Build the work-checked cadences for the deployment-wide dispatchers. Each\n * tick runs one cheap read-only check and touches Temporal only when the check\n * may find work, so an idle deployment writes no workflow history at all.\n */\nexport async function internalMaintenanceCadences(input: {\n settings: Settings;\n observability: Observability;\n db: Database;\n workflow: WorkflowStarter;\n documentServices?: DocumentServices;\n jobs?: readonly InternalMaintenanceJob[];\n}): Promise<MaintenanceCadence[]> {\n const { settings, observability, db, workflow } = input;\n const jobs = new Set(input.jobs ?? INTERNAL_MAINTENANCE_JOBS);\n const taskQueue = settings.temporalTaskQueue;\n const cadences: MaintenanceCadence[] = [];\n if (settings.subscriptionPlansEnabled && jobs.has(\"subscription-plan-maintenance\")) {\n cadences.push({\n job: \"subscription-plan-maintenance\",\n periodMs: SUBSCRIPTION_PLAN_MAINTENANCE_PERIOD_MS,\n hasWork: async () => await subscriptionPlanMaintenanceDue(db),\n start: async () => {\n const result = await maintainSubscriptionPlans(db, {\n onError: (error, accountId) =>\n observability.warn(\"Subscription plan maintenance account failed\", {\n accountId,\n error: error instanceof Error ? error.message : String(error),\n }),\n });\n if (result.failedAccounts > 0)\n throw new Error(`${result.failedAccounts} subscription plan maintenance accounts failed`);\n return \"started\";\n },\n });\n }\n if (jobs.has(\"session-workflow-wake-dispatcher\")) {\n const { repairMissedSessionWorkflowWakes } = await import(\"./activities/parent-wake\");\n cadences.push({\n job: \"session-workflow-wake-dispatcher\",\n periodMs: SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS,\n hasWork: async () => {\n // Registration is the dispatcher's own idempotent repair: it writes\n // only when a producer committed work but never recorded its wake.\n await repairMissedSessionWorkflowWakes({ db, observability });\n return (\n (await sessionWorkflowWakesDue(db)) ||\n (await workspacePauseTimerDue(db)) ||\n (await automaticSessionTitleFanoutDue(db))\n );\n },\n start: async () => {\n await workflow.signalWithStart(SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, {\n taskQueue,\n workflowId: SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,\n workflowIdReusePolicy: \"ALLOW_DUPLICATE\",\n args: [],\n signal: SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,\n });\n return \"started\";\n },\n });\n }\n if (jobs.has(\"knowledge-indexing\")) {\n let embedding: Promise<{ model: string; dimensions: number; available: boolean }> | undefined;\n let unavailableReported = false;\n const resolveEmbedding = async () => {\n const services =\n input.documentServices ??\n (await import(\"@opengeni/documents\")).createDocumentServices(settings);\n return {\n model: services.embedder.model,\n dimensions: services.embedder.dimensions,\n available: services.embedder.available !== false,\n };\n };\n cadences.push({\n job: \"knowledge-indexing\",\n periodMs: KNOWLEDGE_INDEXING_PERIOD_MS,\n hasWork: async () => {\n embedding ??= resolveEmbedding().catch((error) => {\n embedding = undefined;\n throw error;\n });\n const current = await embedding;\n // Without an embedding credential every batch fails before reaching the\n // provider, so queued jobs are not work this process can do. They stay\n // queued and index once the deployment configures a credential.\n if (!current.available) {\n if (!unavailableReported) {\n unavailableReported = true;\n observability.warn(\n \"Knowledge indexing is idle: no document embedding credential is configured\",\n { job: \"knowledge-indexing\", model: current.model },\n );\n }\n return false;\n }\n return await knowledgeIndexDue(db, current);\n },\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"knowledgeIndexingWorkflow\",\n workflowId: KNOWLEDGE_INDEXING_WORKFLOW_ID,\n taskQueue,\n }),\n });\n }\n if (jobs.has(\"site-auth-maintenance\")) {\n const { SITE_AUTH_MAINTENANCE_CLAIM_TIMEOUT_MS } =\n await import(\"./activities/site-auth-maintenance\");\n cadences.push({\n job: \"site-auth-maintenance\",\n periodMs: SITE_AUTH_MAINTENANCE_PERIOD_MS,\n hasWork: async () =>\n await siteAuthMaintenanceDue(db, {\n claimTimeoutMs: SITE_AUTH_MAINTENANCE_CLAIM_TIMEOUT_MS,\n }),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"siteAuthMaintenanceWorkflow\",\n workflowId: SITE_AUTH_MAINTENANCE_WORKFLOW_ID,\n taskQueue,\n }),\n });\n }\n const sandboxJobs = (\n [\"sandbox-lease-reaper\", \"sandbox-idle-checkpoint\", \"browser-deadline-checkpoint\"] as const\n ).filter((job) => jobs.has(job));\n if (sandboxJobs.length > 0) {\n // The same period the old reaper Schedule used, so the boot invariants\n // (reaper period below the viewer holder TTL, and with the idle grace\n // below the provider lifetime) hold for every sandbox cadence.\n assertSandboxReaperActivityTimeout(settings);\n const periodMs = settings.sandboxLeaseReaperPeriodMs;\n const lifecycleQueue = sandboxLifecycleTaskQueue(taskQueue);\n const sandbox = await import(\"./activities/sandbox-lease\");\n if (jobs.has(\"sandbox-lease-reaper\")) {\n const { SANDBOX_CHECKPOINT_GC_CLAIM_TTL_MS } = sandbox;\n cadences.push({\n job: \"sandbox-lease-reaper\",\n periodMs,\n // The drain inventory and its maintenance pass act only on warm or held\n // leases, due reconciliation rows, or (with Modal) boxes still running in\n // the provider app. With none of those, the tick only refreshes the\n // pass's read-only gauges in this process.\n hasWork: async () => {\n if (\n (await sandboxLeaseReaperDue(db)) ||\n (await sandboxMaintenanceDue(db, {\n checkpointArtifactClaimTtlMs: SANDBOX_CHECKPOINT_GC_CLAIM_TTL_MS,\n })) ||\n (await sandbox.modalOrphanSweepMayHaveWork({ settings, observability }))\n ) {\n return true;\n }\n await sandbox.refreshIdleSandboxReaperProjections({ db, settings, observability });\n return false;\n },\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"sandboxReaperWorkflowV2\",\n workflowId: SANDBOX_REAPER_V2_WORKFLOW_ID,\n taskQueue: lifecycleQueue,\n }),\n });\n }\n if (jobs.has(\"sandbox-idle-checkpoint\")) {\n cadences.push({\n job: \"sandbox-idle-checkpoint\",\n periodMs,\n // The sweep's inventory is empty when ownership or snapshots are off.\n hasWork: async () =>\n settings.sandboxOwnershipEnabled &&\n settings.sandboxSnapshotIntervalMs > 0 &&\n (await sandboxIdleCheckpointDue(db, { intervalMs: settings.sandboxSnapshotIntervalMs })),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"sandboxIdleCheckpointSweepWorkflow\",\n workflowId: SANDBOX_IDLE_CHECKPOINT_SWEEP_WORKFLOW_ID,\n taskQueue: lifecycleQueue,\n }),\n });\n }\n if (jobs.has(\"browser-deadline-checkpoint\")) {\n cadences.push({\n job: \"browser-deadline-checkpoint\",\n periodMs,\n hasWork: async () => await browserDeadlineCheckpointDue(db),\n start: async () =>\n await startMaintenanceWorkflowOnce(workflow, {\n workflowType: \"browserDeadlineCheckpointSweepWorkflow\",\n workflowId: BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID,\n taskQueue: browserDeadlineCheckpointTaskQueue(taskQueue),\n }),\n });\n }\n }\n return cadences;\n}\n\n/**\n * Run the deployment-wide maintenance dispatchers from this control worker.\n * Several control replicas may each run the cadence: an idle tick is only a\n * read, and a busy one converges on the same fixed workflow id.\n */\nexport async function startInternalMaintenanceCadences(input: {\n settings: Settings;\n observability: Observability;\n db: Database;\n documentServices?: DocumentServices;\n jobs?: readonly InternalMaintenanceJob[];\n scheduler?: TelemetryScheduler;\n}): Promise<{ cadences: MaintenanceCadences; close: () => Promise<void> }> {\n const connection = await Connection.connect(temporalConnectionOptions(input.settings));\n try {\n const temporal = new TemporalClient({\n connection,\n namespace: input.settings.temporalNamespace,\n });\n const jobs = input.jobs ?? INTERNAL_MAINTENANCE_JOBS;\n await deleteLegacyMaintenanceSchedules(temporal.schedule, jobs, input.observability);\n const cadences = startMaintenanceCadences({\n cadences: await internalMaintenanceCadences({ ...input, jobs, workflow: temporal.workflow }),\n observability: input.observability,\n ...(input.scheduler ? { scheduler: input.scheduler } : {}),\n });\n input.observability.info(\"Started work-checked maintenance cadences\", {\n jobs: jobs.join(\",\"),\n });\n return {\n cadences,\n close: async () => {\n await cadences.close();\n await connection.close();\n },\n };\n } catch (error) {\n await connection.close().catch(() => undefined);\n throw error;\n }\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport {\n telemetryInterval,\n telemetryScheduler,\n type TelemetryScheduler,\n} from \"./telemetry-scheduler\";\n\nexport type MaintenanceStartResult = \"started\" | \"already_running\";\n\nexport type MaintenanceTickOutcome =\n /** The work check proved there is nothing to do; no workflow was touched. */\n | \"idle\"\n | \"started\"\n | \"already_running\"\n /** The check failed; the workflow was started anyway (fail open). */\n | \"probe_failed\"\n | \"start_failed\"\n /** This process's previous tick for the job has not finished. */\n | \"busy\";\n\nconst TICK_OUTCOMES: readonly MaintenanceTickOutcome[] = [\n \"idle\",\n \"started\",\n \"already_running\",\n \"probe_failed\",\n \"start_failed\",\n \"busy\",\n];\n\n/**\n * One deployment-wide maintenance job driven by a worker-process cadence\n * instead of a Temporal Schedule. A Schedule starts a workflow execution on\n * every tick, so an idle deployment pays a history and visibility write per\n * tick for no work. A cadence instead asks a cheap read-only question first and\n * starts the job's workflow only when the answer may be yes.\n */\nexport type MaintenanceCadence = {\n /** Stable, low-cardinality metric label. */\n job: string;\n periodMs: number;\n /**\n * A superset of the job's claim predicate: `false` must prove that a run\n * would find nothing. It may perform the job's own idempotent repair\n * registration, but never claims or delivers work.\n */\n hasWork: () => Promise<boolean>;\n /** Start or nudge the job's single dispatcher workflow. */\n start: () => Promise<MaintenanceStartResult>;\n};\n\nexport type MaintenanceCadences = {\n /** Run one tick for a job now; used by tests and by the cadence itself. */\n tick: (job: string) => Promise<MaintenanceTickOutcome>;\n close: () => Promise<void>;\n};\n\nexport function startMaintenanceCadences(input: {\n cadences: readonly MaintenanceCadence[];\n observability: Observability;\n scheduler?: TelemetryScheduler;\n now?: () => number;\n /** Tests drive ticks explicitly. */\n autoStart?: boolean;\n}): MaintenanceCadences {\n const scheduler = input.scheduler ?? telemetryScheduler;\n const now = input.now ?? Date.now;\n const jobs = new Map<string, MaintenanceCadence>();\n for (const cadence of input.cadences) {\n if (jobs.has(cadence.job)) throw new Error(`duplicate maintenance cadence ${cadence.job}`);\n telemetryInterval(cadence.periodMs, `${cadence.job} maintenance period`);\n jobs.set(cadence.job, cadence);\n for (const outcome of TICK_OUTCOMES) {\n input.observability.incrementCounter({\n name: \"opengeni_maintenance_cadence_ticks_total\",\n help: \"Maintenance cadence ticks by job and outcome; idle ticks start no workflow.\",\n labels: { job: cadence.job, outcome },\n amount: 0,\n });\n }\n }\n const inFlight = new Map<string, Promise<MaintenanceTickOutcome>>();\n const cancels: Array<() => void> = [];\n let stopped = false;\n\n const record = (job: string, outcome: MaintenanceTickOutcome) => {\n input.observability.incrementCounter({\n name: \"opengeni_maintenance_cadence_ticks_total\",\n help: \"Maintenance cadence ticks by job and outcome; idle ticks start no workflow.\",\n labels: { job, outcome },\n });\n if (outcome !== \"busy\" && outcome !== \"start_failed\") {\n input.observability.setGauge({\n name: \"opengeni_maintenance_cadence_last_success_timestamp_seconds\",\n help: \"Unix time of the latest maintenance cadence tick that checked for work and, when needed, started its workflow.\",\n labels: { job },\n value: now() / 1_000,\n });\n }\n return outcome;\n };\n\n const run = async (cadence: MaintenanceCadence): Promise<MaintenanceTickOutcome> => {\n let probeFailed = false;\n try {\n if (!(await cadence.hasWork())) return record(cadence.job, \"idle\");\n } catch (error) {\n // Fail open: a broken check must never silently stop maintenance. The\n // workflow's own claim remains the authority on what work exists.\n probeFailed = true;\n input.observability.warn(\"maintenance cadence work check failed; starting the job anyway\", {\n job: cadence.job,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const started = await cadence.start();\n return record(cadence.job, probeFailed ? \"probe_failed\" : started);\n } catch (error) {\n input.observability.warn(\"maintenance cadence could not start its workflow\", {\n job: cadence.job,\n error: error instanceof Error ? error.message : String(error),\n });\n return record(cadence.job, \"start_failed\");\n }\n };\n\n const tick = async (job: string): Promise<MaintenanceTickOutcome> => {\n const cadence = jobs.get(job);\n if (!cadence) throw new Error(`unknown maintenance cadence ${job}`);\n if (stopped) return \"busy\";\n if (inFlight.has(job)) return record(job, \"busy\");\n const running = run(cadence).finally(() => inFlight.delete(job));\n inFlight.set(job, running);\n return await running;\n };\n\n if (input.autoStart !== false) {\n for (const cadence of jobs.values()) {\n const fire = () => {\n void tick(cadence.job);\n };\n // Start immediately so a restart never delays due work by a full period.\n scheduler.defer(fire);\n cancels.push(scheduler.interval(fire, cadence.periodMs));\n }\n }\n\n return {\n tick,\n close: async () => {\n stopped = true;\n for (const cancel of cancels.splice(0)) cancel();\n await Promise.allSettled([...inFlight.values()]);\n },\n };\n}\n","export const BROWSER_DEADLINE_CHECKPOINT_SWEEP_ID = \"opengeni-browser-deadline-checkpoints-v1\";\nconst QUEUE_SUFFIX = \"-browser-checkpoint-v1\";\nexport function browserDeadlineCheckpointTaskQueue(base: string): string {\n return base.endsWith(QUEUE_SUFFIX) ? base : `${base}${QUEUE_SUFFIX}`;\n}\n","import type { Observability } from \"@opengeni/observability\";\nimport type { WorkerLifecycleState } from \"./http\";\n\nexport async function constructWithOwnedConnection<Connection, Result>(\n connect: () => Promise<Connection>,\n construct: (connection: Connection) => Promise<Result>,\n close: (connection: Connection) => Promise<void>,\n): Promise<Result> {\n const connection = await connect();\n try {\n return await construct(connection);\n } catch (error) {\n await close(connection).catch(() => undefined);\n throw error;\n }\n}\n\nexport type WorkerRunTarget = {\n run(): Promise<void>;\n shutdown(): void;\n};\n\n/** One process may poll several disjoint Temporal queues, but it still has one\n * host lifecycle. Start and stop every poller as a unit; a failed poller drains\n * its siblings and preserves the original failure. */\nexport function combineWorkerRunTargets(targets: readonly WorkerRunTarget[]): WorkerRunTarget {\n if (targets.length === 0) {\n throw new Error(\"a worker service requires at least one Temporal poller\");\n }\n let runPromise: Promise<void> | undefined;\n const shutdown = (): void => {\n let firstError: unknown;\n for (const target of targets) {\n try {\n target.shutdown();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError !== undefined) throw firstError;\n };\n return {\n run: () => {\n runPromise ??= (async () => {\n const runs = targets.map((target) => {\n try {\n return target.run();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n try {\n await Promise.all(runs);\n } catch (error) {\n try {\n shutdown();\n } catch {\n // Preserve the poller failure. Every sibling still received its\n // shutdown request even when one request itself failed.\n }\n await Promise.allSettled(runs);\n throw error;\n }\n })();\n return runPromise;\n },\n shutdown,\n };\n}\n\nexport type WorkerServiceLifecycle = {\n state(): WorkerLifecycleState;\n run(): Promise<void>;\n drain(reason?: string): boolean;\n close(): Promise<void>;\n};\n\nexport function createWorkerServiceLifecycle(input: {\n role: \"control\" | \"turn\";\n worker: WorkerRunTarget;\n observability: Observability;\n closeOwnedResources: () => Promise<void>;\n onReady?: () => void;\n}): WorkerServiceLifecycle {\n let state: WorkerLifecycleState = \"starting\";\n let runPromise: Promise<void> | undefined;\n let resourcesClosed: Promise<void> | undefined;\n const closeOwnedResources = () => {\n resourcesClosed ??= input.closeOwnedResources();\n return resourcesClosed;\n };\n\n const lifecycle: WorkerServiceLifecycle = {\n state: () => state,\n run: () => {\n if (!runPromise && state === \"draining\") {\n runPromise = (async () => {\n state = \"stopped\";\n await closeOwnedResources();\n })();\n return runPromise;\n }\n if (!runPromise && (state === \"stopped\" || state === \"failed\")) {\n return Promise.reject(new Error(`cannot run a worker service that is ${state}`));\n }\n runPromise ??= (async () => {\n if (state === \"starting\") {\n state = \"ready\";\n }\n input.onReady?.();\n try {\n await input.worker.run();\n state = \"stopped\";\n } catch (error) {\n state = \"failed\";\n throw error;\n } finally {\n await closeOwnedResources();\n }\n })();\n return runPromise;\n },\n drain: (_reason = \"host request\") => {\n if (state === \"draining\" || state === \"stopped\" || state === \"failed\") {\n return true;\n }\n const previousState = state;\n safeLifecycleLog(() =>\n input.observability.info(\"Opengeni worker draining (graceful shutdown)\", {\n role: input.role,\n errorClass: \"WorkerLifecycleOperation\",\n errorCode: \"worker_draining\",\n origin: \"worker-lifecycle\",\n }),\n );\n state = \"draining\";\n try {\n input.worker.shutdown();\n return true;\n } catch {\n state = previousState;\n safeLifecycleLog(() =>\n input.observability.warn(\"worker shutdown request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n }),\n );\n return false;\n }\n },\n close: async () => {\n if (!lifecycle.drain(\"service close\")) {\n throw new Error(\"worker shutdown request failed\");\n }\n if (runPromise) {\n await runPromise.catch(() => undefined);\n } else {\n state = \"stopped\";\n await closeOwnedResources();\n }\n },\n };\n\n return lifecycle;\n}\n\nfunction safeLifecycleLog(log: () => void): void {\n try {\n log();\n } catch {\n // Telemetry cannot change worker lifecycle state or shutdown delivery.\n }\n}\n\n/** A cleanup stall first drains peers through WORKER_SHUTDOWN. The standalone\n * process owns the final exit, because Temporal cannot kill JavaScript writers.\n * Embedded hosts may supply their own termination policy at this same edge. */\nexport function createWorkerCleanupContainment(input: {\n drain: () => boolean;\n terminate?: () => void;\n observability: Observability;\n timeoutMs?: number;\n}) {\n let requested = false;\n let finished = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n return {\n request() {\n if (requested || finished) return;\n requested = true;\n if (input.terminate) {\n timer = setTimeout(() => {\n safeLifecycleLog(() =>\n input.observability.error(\"worker cleanup drain exhausted; terminating host\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_cleanup_drain_exhausted\",\n origin: \"worker-lifecycle\",\n }),\n );\n input.terminate?.();\n }, input.timeoutMs ?? 100_000);\n timer.unref?.();\n }\n let accepted = false;\n try {\n accepted = input.drain();\n } catch {\n /* The host backstop remains armed. */\n }\n if (!accepted)\n safeLifecycleLog(() =>\n input.observability.error(\"worker cleanup drain request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n }),\n );\n },\n finished() {\n // Call only after Worker.run resolves. ForceShutdownError does not prove\n // its activity promises stopped, so rejection must retain the backstop.\n finished = true;\n clearTimeout(timer);\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { freemem, totalmem } from \"node:os\";\nimport { posix } from \"node:path\";\nimport type { Settings } from \"@opengeni/config\";\nimport type { Observability } from \"@opengeni/observability\";\n\nexport type TurnWorkerMemoryScope = \"host\" | \"cgroup\";\n\nexport type TurnWorkerMemoryScopeSnapshot = {\n scope: TurnWorkerMemoryScope;\n usedBytes: number;\n limitBytes: number;\n};\n\nexport type TurnWorkerMemoryPressureSnapshot = {\n processRssBytes: number;\n processHeapUsedBytes: number;\n processExternalBytes: number;\n processArrayBuffersBytes: number;\n scopes: TurnWorkerMemoryScopeSnapshot[];\n};\n\nexport type TurnWorkerMemoryPressureGuard = {\n sampleNow(): void;\n close(): void;\n};\n\ntype GuardSettings = Pick<\n Settings,\n | \"turnWorkerConcurrencyMode\"\n | \"turnWorkerTargetMemoryUsage\"\n | \"turnWorkerEmergencyMemoryUsage\"\n | \"turnWorkerMemoryGuardIntervalMs\"\n | \"turnWorkerMemoryGuardSustainMs\"\n>;\n\ntype GuardDependencies = {\n now?: () => number;\n sample?: () => TurnWorkerMemoryPressureSnapshot;\n setInterval?: typeof setInterval;\n clearInterval?: typeof clearInterval;\n gc?: () => void;\n};\n\ntype SnapshotDependencies = {\n readText?: (path: string) => string | null;\n hostTotalBytes?: () => number;\n hostAvailableBytes?: () => number;\n processMemoryUsage?: () => Pick<\n NodeJS.MemoryUsage,\n \"rss\" | \"heapUsed\" | \"external\" | \"arrayBuffers\"\n >;\n};\n\nexport type ProcessCgroupMembership = {\n v2Path: string | null;\n v1MemoryPath: string | null;\n};\n\nexport type CgroupMemoryFilePair = {\n currentPath: string;\n maxPath: string;\n};\n\nconst CGROUP_V2_MOUNT = \"/sys/fs/cgroup\";\nconst CGROUP_V1_MEMORY_MOUNT = \"/sys/fs/cgroup/memory\";\n\nexport function parseLinuxMeminfo(\n value: string,\n): { totalBytes: number; availableBytes: number } | null {\n const fields = new Map<string, number>();\n for (const line of value.split(\"\\n\")) {\n const match = /^([A-Za-z_()]+):\\s+(\\d+)\\s+kB$/.exec(line.trim());\n if (!match) continue;\n fields.set(match[1] as string, Number(match[2]) * 1024);\n }\n const totalBytes = fields.get(\"MemTotal\");\n const availableBytes = fields.get(\"MemAvailable\");\n if (\n totalBytes === undefined ||\n availableBytes === undefined ||\n !Number.isFinite(totalBytes) ||\n !Number.isFinite(availableBytes) ||\n totalBytes <= 0 ||\n availableBytes < 0\n ) {\n return null;\n }\n return { totalBytes, availableBytes: Math.min(totalBytes, availableBytes) };\n}\n\nexport function parseFiniteCgroupMemoryLimit(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"max\") return null;\n const parsed = Number(trimmed);\n // cgroup v1 represents \"unlimited\" with a near-int64 sentinel. Treat only\n // realistic finite limits as authority; host headroom remains the fallback.\n if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed >= 2 ** 60) return null;\n return parsed;\n}\n\nexport function parseProcessCgroupMembership(value: string): ProcessCgroupMembership {\n let v2Path: string | null = null;\n let v1MemoryPath: string | null = null;\n for (const line of value.split(\"\\n\")) {\n const firstSeparator = line.indexOf(\":\");\n const secondSeparator = line.indexOf(\":\", firstSeparator + 1);\n if (firstSeparator <= 0 || secondSeparator < 0) continue;\n const hierarchyId = line.slice(0, firstSeparator);\n const controllers = line.slice(firstSeparator + 1, secondSeparator);\n const path = normalizeCgroupPath(line.slice(secondSeparator + 1));\n if (!path) continue;\n if (hierarchyId === \"0\" && controllers === \"\") {\n v2Path = path;\n }\n if (controllers.split(\",\").includes(\"memory\")) {\n v1MemoryPath = path;\n }\n }\n return { v2Path, v1MemoryPath };\n}\n\nexport function cgroupMemoryFilePairs(membership: ProcessCgroupMembership): CgroupMemoryFilePair[] {\n const pairs: CgroupMemoryFilePair[] = [];\n const seen = new Set<string>();\n const appendHierarchy = (\n mount: string,\n path: string | null,\n currentFilename: string,\n maxFilename: string,\n ) => {\n for (const candidate of cgroupAncestorPaths(path ?? \"/\")) {\n const relative = candidate === \"/\" ? \"\" : candidate.slice(1);\n const currentPath = posix.join(mount, relative, currentFilename);\n const maxPath = posix.join(mount, relative, maxFilename);\n const key = `${currentPath}\\0${maxPath}`;\n if (seen.has(key)) continue;\n seen.add(key);\n pairs.push({ currentPath, maxPath });\n }\n };\n\n appendHierarchy(CGROUP_V2_MOUNT, membership.v2Path, \"memory.current\", \"memory.max\");\n appendHierarchy(\n CGROUP_V1_MEMORY_MOUNT,\n membership.v1MemoryPath,\n \"memory.usage_in_bytes\",\n \"memory.limit_in_bytes\",\n );\n return pairs;\n}\n\nexport function readTurnWorkerMemoryPressureSnapshot(\n dependencies: SnapshotDependencies = {},\n): TurnWorkerMemoryPressureSnapshot {\n const readText = dependencies.readText ?? readTextOrNull;\n const linux = parseLinuxMeminfo(readText(\"/proc/meminfo\") ?? \"\");\n const hostTotalBytes = linux?.totalBytes ?? (dependencies.hostTotalBytes ?? totalmem)();\n const hostAvailableBytes =\n linux?.availableBytes ?? (dependencies.hostAvailableBytes ?? freemem)();\n const host = {\n scope: \"host\" as const,\n usedBytes: Math.max(0, hostTotalBytes - Math.min(hostTotalBytes, hostAvailableBytes)),\n limitBytes: hostTotalBytes,\n };\n const cgroup = readCgroupMemoryScope(readText);\n // A finite process cgroup is the pod's actual admission boundary. Host\n // pressure includes unrelated workloads and must not make every replica\n // drain simultaneously; use it only when no finite cgroup authority exists.\n const processMemory = (dependencies.processMemoryUsage ?? process.memoryUsage)();\n\n return {\n processRssBytes: processMemory.rss,\n processHeapUsedBytes: processMemory.heapUsed,\n processExternalBytes: processMemory.external,\n processArrayBuffersBytes: processMemory.arrayBuffers,\n scopes: [cgroup ?? host],\n };\n}\n\nexport function turnWorkerMemoryPressureGuardEnabled(\n role: \"control\" | \"turn\",\n settings: Pick<Settings, \"turnWorkerConcurrencyMode\">,\n): boolean {\n return role === \"turn\" && settings.turnWorkerConcurrencyMode === \"resource-based\";\n}\n\nexport function createTurnWorkerMemoryPressureGuard(input: {\n settings: GuardSettings;\n observability: Observability;\n drain: () => void;\n dependencies?: GuardDependencies;\n}): TurnWorkerMemoryPressureGuard {\n const now = input.dependencies?.now ?? Date.now;\n const sample = input.dependencies?.sample ?? readTurnWorkerMemoryPressureSnapshot;\n const schedule = input.dependencies?.setInterval ?? setInterval;\n const cancel = input.dependencies?.clearInterval ?? clearInterval;\n const collectGarbage = input.dependencies?.gc ?? (() => Bun.gc(false));\n const breachStartedAt = new Map<TurnWorkerMemoryScope, number>();\n let lastGcAt = Number.NEGATIVE_INFINITY;\n let drainRequested = false;\n let closed = false;\n\n const sampleNow = () => {\n if (closed) return;\n const observedAt = now();\n let snapshot: TurnWorkerMemoryPressureSnapshot;\n try {\n snapshot = sample();\n } catch {\n breachStartedAt.clear();\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_sample_failures_total\",\n help: \"Turn-worker memory pressure guard samples that could not be read.\",\n });\n return;\n }\n\n const validScopes = snapshot.scopes.filter(\n ({ usedBytes, limitBytes }) =>\n Number.isFinite(usedBytes) &&\n Number.isFinite(limitBytes) &&\n usedBytes >= 0 &&\n limitBytes > 0,\n );\n if (validScopes.length === 0) {\n breachStartedAt.clear();\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_sample_failures_total\",\n help: \"Turn-worker memory pressure guard samples that could not be read.\",\n });\n return;\n }\n\n const sustainedBreaches: Array<{\n scope: TurnWorkerMemoryScope;\n utilizationRatio: number;\n breachSeconds: number;\n }> = [];\n for (const [kind, value] of [\n [\"rss\", snapshot.processRssBytes],\n [\"heap_used\", snapshot.processHeapUsedBytes],\n [\"external\", snapshot.processExternalBytes],\n [\"array_buffers\", snapshot.processArrayBuffersBytes],\n ] as const) {\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_process_memory_bytes\",\n help: \"Turn-worker process memory by runtime-reported category.\",\n labels: { kind },\n value: Number.isFinite(value) && value >= 0 ? value : 0,\n });\n }\n let shouldCollectGarbage = false;\n for (const scope of validScopes) {\n const utilizationRatio = scope.usedBytes / scope.limitBytes;\n const processRssRatio = snapshot.processRssBytes / scope.limitBytes;\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_utilization_ratio\",\n help: \"Observed memory utilization ratio used by the turn-worker pressure guard.\",\n labels: { scope: scope.scope },\n value: utilizationRatio,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_target_ratio\",\n help: \"Memory admission target enforced by the Temporal resource tuner.\",\n labels: { scope: scope.scope },\n value: input.settings.turnWorkerTargetMemoryUsage,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_emergency_ratio\",\n help: \"Emergency memory threshold enforced by the turn-worker pressure guard.\",\n labels: { scope: scope.scope },\n value: input.settings.turnWorkerEmergencyMemoryUsage,\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_available_bytes\",\n help: \"Memory headroom remaining in the turn-worker pressure guard scope.\",\n labels: { scope: scope.scope },\n value: Math.max(0, scope.limitBytes - scope.usedBytes),\n });\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_process_rss_ratio\",\n help: \"Turn-worker RSS as a ratio of the observed host or finite cgroup memory scope.\",\n labels: { scope: scope.scope },\n value: processRssRatio,\n });\n shouldCollectGarbage ||= processRssRatio >= input.settings.turnWorkerTargetMemoryUsage;\n\n if (utilizationRatio < input.settings.turnWorkerEmergencyMemoryUsage) {\n breachStartedAt.delete(scope.scope);\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_breach_seconds\",\n help: \"Seconds the turn-worker emergency threshold has remained continuously breached.\",\n labels: { scope: scope.scope },\n value: 0,\n });\n continue;\n }\n\n const startedAt = breachStartedAt.get(scope.scope) ?? observedAt;\n breachStartedAt.set(scope.scope, startedAt);\n const breachMs = Math.max(0, observedAt - startedAt);\n const breachSeconds = breachMs / 1_000;\n safeSetGauge(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_breach_seconds\",\n help: \"Seconds the turn-worker emergency threshold has remained continuously breached.\",\n labels: { scope: scope.scope },\n value: breachSeconds,\n });\n if (breachMs >= input.settings.turnWorkerMemoryGuardSustainMs) {\n sustainedBreaches.push({ scope: scope.scope, utilizationRatio, breachSeconds });\n }\n }\n\n // Large request buffers can become unreachable well before JSC's ordinary\n // heap trigger notices native/external pressure. Nudge an asynchronous GC\n // at most once per sustain window before escalating to a worker drain.\n const sustainedBreachesHadGcOpportunity =\n sustainedBreaches.length > 0 &&\n sustainedBreaches.every(({ scope }) => {\n const breachStarted = breachStartedAt.get(scope);\n return breachStarted !== undefined && lastGcAt >= breachStarted && lastGcAt < observedAt;\n });\n let collectedGarbageThisSample = false;\n if (\n shouldCollectGarbage &&\n observedAt - lastGcAt >= input.settings.turnWorkerMemoryGuardSustainMs &&\n (sustainedBreaches.length === 0 || !sustainedBreachesHadGcOpportunity)\n ) {\n lastGcAt = observedAt;\n try {\n collectGarbage();\n collectedGarbageThisSample = true;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_gc_total\",\n help: \"Proactive garbage-collection nudges under process memory pressure.\",\n });\n } catch {\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_gc_failures_total\",\n help: \"Proactive memory-pressure garbage-collection nudges that failed.\",\n });\n }\n }\n\n // The nudge is asynchronous. Give it one sampling interval to make the\n // reclaimed RSS visible before deciding that process recycling is needed.\n if (\n (collectedGarbageThisSample && !sustainedBreachesHadGcOpportunity) ||\n drainRequested ||\n sustainedBreaches.length === 0\n ) {\n return;\n }\n\n const primaryBreach = sustainedBreaches.sort(\n (left, right) => right.utilizationRatio - left.utilizationRatio,\n )[0];\n if (!primaryBreach) return;\n\n drainRequested = true;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_drains_total\",\n help: \"Graceful turn-worker drains requested after sustained memory pressure.\",\n labels: { scope: primaryBreach.scope },\n });\n safeWarn(input.observability, \"turn worker memory guard requested graceful drain\", {\n errorClass: \"WorkerLifecycleOperation\",\n errorCode: \"worker_draining\",\n origin: \"worker-lifecycle\",\n reason: `memory pressure (${primaryBreach.scope}, ${boundedRatio(primaryBreach.utilizationRatio)} >= ${input.settings.turnWorkerEmergencyMemoryUsage}, ${primaryBreach.breachSeconds}s)`,\n });\n try {\n input.drain();\n } catch {\n drainRequested = false;\n safeIncrementCounter(input.observability, {\n name: \"opengeni_turn_worker_memory_guard_drain_failures_total\",\n help: \"Turn-worker memory pressure guard drain requests that failed synchronously.\",\n labels: { scope: primaryBreach.scope },\n });\n safeWarn(input.observability, \"turn worker memory guard drain request failed\", {\n errorClass: \"WorkerLifecycleOperationError\",\n errorCode: \"worker_shutdown_request_failed\",\n origin: \"worker-lifecycle\",\n });\n }\n };\n\n const timer = schedule(sampleNow, input.settings.turnWorkerMemoryGuardIntervalMs);\n timer.unref?.();\n sampleNow();\n\n return {\n sampleNow,\n close: () => {\n if (closed) return;\n closed = true;\n cancel(timer);\n },\n };\n}\n\nfunction readCgroupMemoryScope(\n readText: (path: string) => string | null,\n): TurnWorkerMemoryScopeSnapshot | null {\n const membership = parseProcessCgroupMembership(readText(\"/proc/self/cgroup\") ?? \"\");\n let mostPressured: TurnWorkerMemoryScopeSnapshot | null = null;\n for (const { currentPath, maxPath } of cgroupMemoryFilePairs(membership)) {\n const currentRaw = readText(currentPath);\n const maxRaw = readText(maxPath);\n if (currentRaw === null || maxRaw === null) continue;\n const current = Number(currentRaw.trim());\n const limit = parseFiniteCgroupMemoryLimit(maxRaw);\n if (!Number.isFinite(current) || current < 0 || limit === null) continue;\n const candidate = { scope: \"cgroup\" as const, usedBytes: current, limitBytes: limit };\n if (\n !mostPressured ||\n candidate.usedBytes / candidate.limitBytes >\n mostPressured.usedBytes / mostPressured.limitBytes\n ) {\n mostPressured = candidate;\n }\n }\n return mostPressured;\n}\n\nfunction readTextOrNull(path: string): string | null {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction boundedRatio(value: number): number {\n return Math.round(Math.max(0, Math.min(value, 10)) * 1_000_000) / 1_000_000;\n}\n\nfunction normalizeCgroupPath(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"/\") || trimmed.includes(\"\\0\")) return null;\n if (trimmed.split(\"/\").includes(\"..\")) return null;\n return posix.normalize(trimmed);\n}\n\nfunction cgroupAncestorPaths(path: string): string[] {\n const ancestors: string[] = [];\n let current = path;\n while (true) {\n ancestors.push(current);\n if (current === \"/\") return ancestors;\n current = posix.dirname(current);\n }\n}\n\nfunction safeSetGauge(\n observability: Observability,\n input: Parameters<Observability[\"setGauge\"]>[0],\n): void {\n try {\n observability.setGauge(input);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n\nfunction safeIncrementCounter(\n observability: Observability,\n input: Parameters<Observability[\"incrementCounter\"]>[0],\n): void {\n try {\n observability.incrementCounter(input);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n\nfunction safeWarn(\n observability: Observability,\n message: string,\n attributes: Parameters<Observability[\"warn\"]>[1],\n): void {\n try {\n observability.warn(message, attributes);\n } catch {\n // Telemetry cannot disable the memory-safety action.\n }\n}\n","export type WorkerUnhandledRejectionProcess = {\n on: (event: \"unhandledRejection\", listener: (reason: unknown) => void) => void;\n off: (event: \"unhandledRejection\", listener: (reason: unknown) => void) => void;\n};\n\nexport type WorkerUnhandledRejectionClassification =\n | \"detached_runtime_mcp_lifecycle\"\n | \"detached_unknown\";\n\ntype RuntimeMcpLifecycleError = {\n name: \"McpLifecycleError\";\n code: \"mcp_connect_failed\" | \"mcp_close_failed\";\n origin: \"runtime\";\n serverId: string;\n};\n\n/**\n * The Agents SDK owns MCP connect promises and also installs a process-global\n * unhandled-rejection listener. A best-effort lifecycle rejection can surface\n * twice under concurrent teardown: once through the awaited MCP result and once\n * through the SDK's detached worker promise. The first path already records and\n * degrades the server; the second must not terminate the whole turn-worker pod.\n */\nexport function isDetachedRuntimeMcpLifecycleRejection(\n reason: unknown,\n): reason is RuntimeMcpLifecycleError {\n try {\n if (!reason || typeof reason !== \"object\") return false;\n const candidate = reason as Partial<RuntimeMcpLifecycleError>;\n return (\n candidate.name === \"McpLifecycleError\" &&\n (candidate.code === \"mcp_connect_failed\" || candidate.code === \"mcp_close_failed\") &&\n candidate.origin === \"runtime\" &&\n typeof candidate.serverId === \"string\" &&\n candidate.serverId.length > 0\n );\n } catch {\n return false;\n }\n}\n\nfunction reportIsolatedUnhandledRejection(\n classification: WorkerUnhandledRejectionClassification,\n): void {\n // Never render the rejection itself: provider and transport errors can carry\n // request bodies or credentials. The durable activity path owns exact errors.\n console.error(\"[worker] isolated detached unhandled rejection\", { classification });\n}\n\n/**\n * Keep process-global promise rejection handling observational. Turn activities\n * have their own durable failure/lease boundary; killing the shared worker here\n * converts one detached SDK/transport promise into unrelated lease losses across\n * every session assigned to the pod. The Agents SDK also checks for a consumer\n * listener before applying its own process.exit(1), so this boundary must never\n * reintroduce that fail-fast behavior for an unknown rejection shape.\n */\nexport function installWorkerUnhandledRejectionBoundary(\n runtimeProcess: WorkerUnhandledRejectionProcess = process,\n report: (\n classification: WorkerUnhandledRejectionClassification,\n ) => void = reportIsolatedUnhandledRejection,\n): () => void {\n const onUnhandledRejection = (reason: unknown): void => {\n report(\n isDetachedRuntimeMcpLifecycleRejection(reason)\n ? \"detached_runtime_mcp_lifecycle\"\n : \"detached_unknown\",\n );\n };\n runtimeProcess.on(\"unhandledRejection\", onUnhandledRejection);\n return () => runtimeProcess.off(\"unhandledRejection\", onUnhandledRejection);\n}\n"],"mappings":"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","names":["temporalConnectionOptions","assertRuntimeDatabasePosture","requireSessionEventDurableFanoutCapability","Connection","TemporalClient","WorkflowExecutionAlreadyStartedError","Connection","Connection","temporalConnectionOptions","Connection","TemporalClient","activity","WorkflowExecutionAlreadyStartedError","requireSessionEventDurableFanoutCapability","assertRuntimeDatabasePosture"]}