@bratsos/workflow-engine 0.4.0 → 0.5.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 (36) hide show
  1. package/dist/{chunk-WZ533CPU.js → chunk-3NEGRI4M.js} +177 -72
  2. package/dist/chunk-3NEGRI4M.js.map +1 -0
  3. package/dist/{chunk-NYKMT46J.js → chunk-PHLNTR5Z.js} +19 -3
  4. package/dist/chunk-PHLNTR5Z.js.map +1 -0
  5. package/dist/{chunk-SPXBCZLB.js → chunk-RZY5YRGL.js} +2 -2
  6. package/dist/{chunk-SPXBCZLB.js.map → chunk-RZY5YRGL.js.map} +1 -1
  7. package/dist/{chunk-XS3ZX4KW.js → chunk-ZYMT2PAO.js} +6 -5
  8. package/dist/chunk-ZYMT2PAO.js.map +1 -0
  9. package/dist/{client-DxNS_NoL.d.ts → client-oLD5ilXp.d.ts} +3 -1
  10. package/dist/client.d.ts +2 -2
  11. package/dist/client.js +1 -1
  12. package/dist/{index-DAzCfO1R.d.ts → index-CVkkGnxx.d.ts} +2 -1
  13. package/dist/index.d.ts +6 -6
  14. package/dist/index.js +5 -5
  15. package/dist/{interface-MMqhfQQK.d.ts → interface-TsryH4d7.d.ts} +1 -0
  16. package/dist/kernel/index.d.ts +4 -4
  17. package/dist/kernel/index.js +1 -1
  18. package/dist/kernel/testing/index.d.ts +2 -2
  19. package/dist/persistence/index.d.ts +2 -2
  20. package/dist/persistence/index.js +2 -2
  21. package/dist/persistence/prisma/index.d.ts +2 -2
  22. package/dist/persistence/prisma/index.js +2 -2
  23. package/dist/{plugins-CPC-X0rR.d.ts → plugins-DW266bhT.d.ts} +13 -3
  24. package/dist/{ports-tU3rzPXJ.d.ts → ports-855bktyD.d.ts} +2 -1
  25. package/dist/testing/index.d.ts +2 -1
  26. package/dist/testing/index.js +19 -1
  27. package/dist/testing/index.js.map +1 -1
  28. package/package.json +1 -1
  29. package/skills/workflow-engine/SKILL.md +11 -3
  30. package/skills/workflow-engine/references/03-runtime-setup.md +3 -1
  31. package/skills/workflow-engine/references/04-ai-integration.md +30 -3
  32. package/skills/workflow-engine/references/08-common-patterns.md +29 -0
  33. package/skills/workflow-engine/references/09-troubleshooting.md +93 -0
  34. package/dist/chunk-NYKMT46J.js.map +0 -1
  35. package/dist/chunk-WZ533CPU.js.map +0 -1
  36. package/dist/chunk-XS3ZX4KW.js.map +0 -1
@@ -283,9 +283,36 @@ console.log(result.embeddings); // number[][] (3 embeddings)
283
283
  console.log(result.embedding); // First embedding (convenience)
284
284
  ```
285
285
 
286
- > **Note:** `taskType` and `outputDimensionality` options only apply to Google embedding models.
287
- > OpenRouter embedding models work without provider-specific options. The provider is determined
288
- > by the `provider` field in the model's `ModelConfig`.
286
+ ### Provider Options Passthrough
287
+
288
+ Pass provider-specific options directly to the AI SDK's `embed()` call using `providerOptions`. These are merged after any auto-mapped options (e.g., Google's `outputDimensionality`), so they can override defaults.
289
+
290
+ ```typescript
291
+ // Voyage-specific options
292
+ const result = await ai.embed("voyage-4-large", ["text"], {
293
+ providerOptions: {
294
+ voyage: { outputDimension: 512, inputType: "document" },
295
+ },
296
+ });
297
+
298
+ // Cohere-specific options
299
+ const result = await ai.embed("cohere-embed-v4", ["text"], {
300
+ providerOptions: {
301
+ cohere: { inputType: "search_document", truncate: "END" },
302
+ },
303
+ });
304
+
305
+ // Override Google's auto-mapped options
306
+ const result = await ai.embed("text-embedding-004", "query text", {
307
+ providerOptions: {
308
+ google: { outputDimensionality: 256, taskType: "RETRIEVAL_QUERY" },
309
+ },
310
+ });
311
+ ```
312
+
313
+ > **Note:** `taskType` and `outputDimensionality` are auto-mapped for Google models.
314
+ > For all other providers, use `providerOptions` to pass provider-specific settings.
315
+ > The provider is determined by the `provider` field in the model's `ModelConfig`.
289
316
 
290
317
  ### Custom Embedding Providers
291
318
 
@@ -183,6 +183,35 @@ async execute(ctx) {
183
183
 
184
184
  Failed stages trigger the `stage:failed` event. The host's maintenance tick detects failure through `run.transition`, which marks the workflow as FAILED.
185
185
 
186
+ ## Reliability & Self-Healing
187
+
188
+ The engine has several built-in reliability mechanisms:
189
+
190
+ ### Idempotent Stage Creation
191
+
192
+ Both `run.claimPending` and `run.transition` use `upsertStage` instead of `createStage` when creating stage records. This means:
193
+ - If orphaned stages exist from a previous failed attempt, they're harmlessly overwritten
194
+ - Only stages with status `PENDING` get jobs enqueued (stages already `RUNNING`/`COMPLETED`/`SUSPENDED` are skipped)
195
+ - Prevents P2002 unique constraint violations that could otherwise cause infinite retry loops
196
+
197
+ ### Per-Run Error Isolation
198
+
199
+ If claiming a specific run fails (e.g., workflow not found, database error), that run is marked `FAILED` with error code `CLAIM_FAILED` and processing continues to the next run. One bad run never blocks the entire claim batch.
200
+
201
+ ### Ghost Job Guard
202
+
203
+ `job.execute` verifies the run is in `RUNNING` status before executing. Jobs for `PENDING`, `FAILED`, `CANCELLED`, or `COMPLETED` runs are discarded with `outcome: "failed"` (no retry). This prevents ghost jobs from rolled-back transactions from resurrecting invalid state.
204
+
205
+ ### Orchestration Tick Isolation
206
+
207
+ Each step of the orchestration tick (claim pending, poll suspended, reap stale, flush outbox, reap stuck) runs in its own error boundary. If one step fails, the others still execute. This prevents a single error from starving unrelated maintenance work.
208
+
209
+ ### Stuck Run Detection
210
+
211
+ The `run.reapStuck` command finds RUNNING runs with no recent activity (no updates to run or stage records within the threshold). These runs are marked `FAILED` with error code `STUCK_RUN_REAPED`. The threshold defaults to `max(3 * staleLeaseThresholdMs, 5 minutes)`.
212
+
213
+ See [09-troubleshooting.md](09-troubleshooting.md) for debugging these scenarios.
214
+
186
215
  ## Progress Reporting
187
216
 
188
217
  ```typescript
@@ -0,0 +1,93 @@
1
+ # Troubleshooting
2
+
3
+ Common issues, how the engine handles them, and how to debug.
4
+
5
+ ## Runs Stuck in PENDING
6
+
7
+ **Symptom:** Runs stay in `PENDING` status and never start.
8
+
9
+ **Cause:** The orchestration tick isn't running, or `run.claimPending` is failing silently.
10
+
11
+ **Check:**
12
+ 1. Is the host running? Check `host.getStats()` — `orchestrationTicks` should be incrementing.
13
+ 2. Is the workflow registered? `run.claimPending` marks runs `FAILED` with `WORKFLOW_NOT_FOUND` if the workflow ID isn't in the registry.
14
+ 3. Check logs for `run.claimPending error:` — each orchestration step logs errors independently.
15
+
16
+ **Fix:** Ensure the host is started and all workflows are registered before runs are created.
17
+
18
+ ## Runs Stuck in RUNNING
19
+
20
+ **Symptom:** Runs are `RUNNING` but no progress is being made. Stages may be `PENDING`, `RUNNING`, or `COMPLETED` with no forward movement.
21
+
22
+ **Possible causes:**
23
+ - `run.transition` was never called after a stage completed (e.g., host crashed between job completion and transition)
24
+ - A stage is stuck `RUNNING` with no active job (worker crashed during execution)
25
+ - All stages in a group completed but the next group was never enqueued
26
+
27
+ **Self-healing:** The `run.reapStuck` command runs on every orchestration tick. It finds `RUNNING` runs with no recent activity (no updates to run or any stage record within the threshold) and marks them `FAILED` with error code `STUCK_RUN_REAPED`. The output includes `stageStatuses` showing each stage's status at reap time. A status guard re-checks `status === "RUNNING"` before updating, preventing race conditions where a run recovers between the query and the update.
28
+
29
+ **Manual investigation:**
30
+ ```typescript
31
+ const run = await persistence.getRun(runId);
32
+ const stages = await persistence.getStagesByRun(runId);
33
+ console.log(run.status, stages.map(s => ({ id: s.stageId, status: s.status, updatedAt: s.updatedAt })));
34
+ ```
35
+
36
+ If all stages in a group are `COMPLETED` but no next group was created, dispatch `run.transition` manually:
37
+ ```typescript
38
+ await kernel.dispatch({ type: "run.transition", workflowRunId: runId });
39
+ ```
40
+
41
+ ## P2002 Unique Constraint Errors
42
+
43
+ **Symptom:** Logs show `P2002` errors from stage creation, or `run.claimPending skipped (P2002)` warnings.
44
+
45
+ **What it was:** Stage records have a unique constraint on `(workflowRunId, stageId)`. If orphaned stage records existed from a previous partial operation, `createStage` would throw. The transaction would roll back, the run would stay `PENDING`, and the next tick would hit the same error — forever.
46
+
47
+ **How it's fixed:** Both `run.claimPending` and `run.transition` now use `upsertStage` instead of `createStage`. Existing records are preserved (not overwritten), and only `PENDING` stages get jobs enqueued. This makes the operation fully idempotent.
48
+
49
+ **If you still see P2002 errors:** They should only come from other parts of the system (e.g., idempotency key conflicts, which are expected and handled). Check the error's `meta.target` field to see which constraint was violated.
50
+
51
+ ## Ghost Jobs
52
+
53
+ **Symptom:** Jobs execute against runs that aren't `RUNNING`, or stages get upserted to `RUNNING` for runs that should be `FAILED`/`CANCELLED`.
54
+
55
+ **What it was:** If the kernel transaction rolled back after `jobTransport.enqueueParallel` committed (separate transaction), ghost jobs would exist in the queue pointing to runs/stages that were rolled back.
56
+
57
+ **How it's fixed (two layers):**
58
+ 1. **Kernel guard:** `job.execute` checks `workflowRun.status === "RUNNING"` before proceeding. Ghost jobs for non-RUNNING runs are discarded with `outcome: "failed"` and error message containing `"ghost job discarded"`.
59
+ 2. **Host no-retry:** Both Node and Serverless hosts detect ghost job failures (error contains `"ghost job discarded"`) and set `canRetry = false`, preventing infinite retry loops.
60
+
61
+ ## One Bad Run Blocks Everything
62
+
63
+ **Symptom (old):** A single run with corrupt state would cause `run.claimPending` to throw, which blocked the entire orchestration tick — including outbox flush, stale lease reaping, and suspended stage polling.
64
+
65
+ **How it's fixed (two layers):**
66
+ 1. **Per-run isolation:** The claim loop catches errors per-run and marks that run `FAILED` with code `CLAIM_FAILED`. Processing continues to the next run.
67
+ 2. **Per-step isolation:** Each orchestration step (claim, poll, reap, flush, reap stuck) runs in its own try/catch. If claiming fails entirely, the outbox still flushes.
68
+
69
+ ## Orchestration Tick Steps
70
+
71
+ The orchestration tick runs these steps in order, each independently:
72
+
73
+ | Step | Command | Purpose |
74
+ |------|---------|---------|
75
+ | 1 | `run.claimPending` | Find PENDING runs, create stages, enqueue jobs |
76
+ | 2 | `stage.pollSuspended` | Check suspended stages for readiness, trigger transitions |
77
+ | 3 | `lease.reapStale` | Release job leases from crashed workers |
78
+ | 4 | `outbox.flush` | Publish pending events through EventSink |
79
+ | 5 | `run.reapStuck` | Fail RUNNING runs with no recent activity |
80
+
81
+ **Node host:** Runs automatically on `orchestrationIntervalMs` (default: 10s).
82
+ **Serverless host:** Must be triggered externally via `host.runMaintenanceTick()`.
83
+
84
+ ## Error Codes Reference
85
+
86
+ | Code | Where | Meaning |
87
+ |------|-------|---------|
88
+ | `WORKFLOW_NOT_FOUND` | `run.claimPending` | Workflow ID not in registry when run was claimed |
89
+ | `EMPTY_STAGE_GRAPH` | `run.claimPending` | Workflow has no stages in execution group 1 |
90
+ | `CLAIM_FAILED` | `run.claimPending` | Unexpected error during claim (DB error, etc.) |
91
+ | `STUCK_RUN_REAPED` | `run.reapStuck` | Run had no activity past the stuck threshold |
92
+
93
+ All error codes appear in `run.output.error.code` on failed runs.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/persistence/prisma/ai-logger.ts","../src/persistence/prisma/enum-compat.ts","../src/persistence/prisma/job-queue.ts","../src/persistence/prisma/persistence.ts"],"names":["logger"],"mappings":"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","file":"chunk-NYKMT46J.js","sourcesContent":["/**\n * PrismaAICallLogger - Prisma implementation of AICallLogger\n *\n * Handles AI call logging to the database. Uses fire-and-forget pattern\n * for non-blocking logging during AI operations.\n */\n\nimport { createLogger } from \"../../utils/logger\";\nimport type {\n AICallLogger,\n AIHelperStats,\n CreateAICallInput,\n} from \"../interface\";\n\nconst logger = createLogger(\"AICallLogger\");\n\n// Type for prisma client - using any for flexibility\ntype PrismaClient = any;\n\nexport class PrismaAICallLogger implements AICallLogger {\n constructor(private readonly prisma: PrismaClient) {}\n\n /**\n * Log a single AI call (fire and forget)\n * Does not await - logs asynchronously to avoid blocking AI operations\n */\n logCall(call: CreateAICallInput): void {\n this.prisma.aICall\n .create({\n data: {\n topic: call.topic,\n callType: call.callType,\n modelKey: call.modelKey,\n modelId: call.modelId,\n prompt: call.prompt,\n response: call.response,\n inputTokens: call.inputTokens,\n outputTokens: call.outputTokens,\n cost: call.cost,\n metadata: call.metadata as unknown,\n },\n })\n .catch((error: unknown) =>\n logger.error(\"Failed to persist AI call:\", error),\n );\n }\n\n /**\n * Log batch results (for recording batch API results)\n */\n async logBatchResults(\n batchId: string,\n results: CreateAICallInput[],\n ): Promise<void> {\n await this.prisma.aICall.createMany({\n data: results.map((call) => ({\n topic: call.topic,\n callType: call.callType,\n modelKey: call.modelKey,\n modelId: call.modelId,\n prompt: call.prompt,\n response: call.response,\n inputTokens: call.inputTokens,\n outputTokens: call.outputTokens,\n cost: call.cost,\n metadata: {\n ...(call.metadata as object),\n batchId,\n } as unknown,\n })),\n });\n }\n\n /**\n * Get aggregated stats for a topic prefix\n */\n async getStats(topicPrefix: string): Promise<AIHelperStats> {\n const calls = await this.prisma.aICall.findMany({\n where: {\n topic: { startsWith: topicPrefix },\n },\n select: {\n modelKey: true,\n inputTokens: true,\n outputTokens: true,\n cost: true,\n },\n });\n\n const perModel: AIHelperStats[\"perModel\"] = {};\n\n for (const call of calls) {\n if (!perModel[call.modelKey]) {\n perModel[call.modelKey] = {\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n };\n }\n perModel[call.modelKey].calls++;\n perModel[call.modelKey].inputTokens += call.inputTokens;\n perModel[call.modelKey].outputTokens += call.outputTokens;\n perModel[call.modelKey].cost += call.cost;\n }\n\n return {\n totalCalls: calls.length,\n totalInputTokens: calls.reduce(\n (sum: number, c: { inputTokens: number }) => sum + c.inputTokens,\n 0,\n ),\n totalOutputTokens: calls.reduce(\n (sum: number, c: { outputTokens: number }) => sum + c.outputTokens,\n 0,\n ),\n totalCost: calls.reduce(\n (sum: number, c: { cost: number }) => sum + c.cost,\n 0,\n ),\n perModel,\n };\n }\n\n /**\n * Check if batch results are already recorded\n */\n async isRecorded(batchId: string): Promise<boolean> {\n const existing = await this.prisma.aICall.findFirst({\n where: {\n metadata: {\n path: [\"batchId\"],\n equals: batchId,\n },\n },\n select: { id: true },\n });\n return existing !== null;\n }\n}\n\n// Factory function to create PrismaAICallLogger with prisma client\nexport function createPrismaAICallLogger(prisma: PrismaClient): AICallLogger {\n return new PrismaAICallLogger(prisma);\n}\n","/**\n * Prisma Enum Compatibility Layer\n *\n * Provides compatibility between Prisma 6.x (string enums) and Prisma 7.x (typed enums).\n * Prisma 7.x introduced runtime enum validation, requiring actual enum values instead of strings.\n *\n * This utility resolves enum values from the Prisma client's $Enums property when available,\n * falling back to string values for older Prisma versions.\n *\n * @example\n * ```typescript\n * const helper = createEnumHelper(prisma);\n *\n * // Instead of: status: \"PENDING\"\n * // Use: status: helper.status(\"PENDING\")\n * ```\n */\n\ntype PrismaClient = any;\n\nexport interface PrismaEnumHelper {\n /** Resolve Status enum value (unified enum for workflows, stages, and jobs) */\n status(value: string): unknown;\n /** Resolve ArtifactType enum value */\n artifactType(value: string): unknown;\n /** Resolve LogLevel enum value */\n logLevel(value: string): unknown;\n}\n\n/**\n * Creates an enum helper that resolves enum values from the Prisma client.\n *\n * Supports both Prisma 6.x (returns string) and Prisma 7.x (returns typed enum).\n */\nexport function createEnumHelper(prisma: PrismaClient): PrismaEnumHelper {\n const resolveEnum = (enumName: string, value: string): unknown => {\n try {\n // Prisma 7.x exposes enums via $Enums\n const enumObj = prisma.$Enums?.[enumName];\n if (enumObj && value in enumObj) {\n return enumObj[value];\n }\n } catch {\n // Ignore - fall through to string\n }\n // Fallback for Prisma 6.x or if enum not found\n return value;\n };\n\n return {\n status: (value: string) => resolveEnum(\"Status\", value),\n artifactType: (value: string) => resolveEnum(\"ArtifactType\", value),\n logLevel: (value: string) => resolveEnum(\"LogLevel\", value),\n };\n}\n","/**\n * PrismaJobQueue - Prisma implementation of JobQueue\n *\n * Provides atomic job queue operations using PostgreSQL\n * with FOR UPDATE SKIP LOCKED for safe concurrent access.\n *\n * This is migrated from the original services/job-queue.server.ts\n */\n\nimport { createLogger } from \"../../utils/logger\";\nimport type { DequeueResult, EnqueueJobInput, JobQueue } from \"../interface\";\nimport { createEnumHelper, type PrismaEnumHelper } from \"./enum-compat\";\nimport type { DatabaseType } from \"./persistence\";\n\nconst logger = createLogger(\"JobQueue\");\n\n// Type for prisma client - using any for flexibility\ntype PrismaClient = any;\n\nexport interface PrismaJobQueueOptions {\n /**\n * Unique worker identifier. Defaults to auto-generated ID.\n */\n workerId?: string;\n /**\n * Database type. Defaults to \"postgresql\".\n * Set to \"sqlite\" when using SQLite (uses optimistic locking instead of FOR UPDATE SKIP LOCKED).\n */\n databaseType?: DatabaseType;\n}\n\nexport class PrismaJobQueue implements JobQueue {\n private workerId: string;\n private prisma: PrismaClient;\n private enums: PrismaEnumHelper;\n private databaseType: DatabaseType;\n\n constructor(prisma: PrismaClient, options: PrismaJobQueueOptions = {}) {\n this.prisma = prisma;\n this.workerId = options.workerId || `worker-${process.pid}-${Date.now()}`;\n this.enums = createEnumHelper(prisma);\n this.databaseType = options.databaseType ?? \"postgresql\";\n }\n\n /**\n * Add a new job to the queue\n */\n async enqueue(options: EnqueueJobInput): Promise<string> {\n const job = await this.prisma.jobQueue.create({\n data: {\n workflowRunId: options.workflowRunId,\n stageId: options.stageId,\n priority: options.priority ?? 5,\n payload: {\n ...options.payload,\n _workflowId: options.workflowId,\n } as unknown,\n status: this.enums.status(\"PENDING\"),\n nextPollAt: options.scheduledFor,\n },\n });\n\n logger.debug(\n `Enqueued job ${job.id} for stage ${options.stageId} (run: ${options.workflowRunId})`,\n );\n return job.id;\n }\n\n /**\n * Enqueue multiple stages in parallel (same execution group)\n */\n async enqueueParallel(jobs: EnqueueJobInput[]): Promise<string[]> {\n if (jobs.length === 0) return [];\n\n const results = await this.prisma.$transaction(\n jobs.map((job) =>\n this.prisma.jobQueue.create({\n data: {\n workflowRunId: job.workflowRunId,\n stageId: job.stageId,\n priority: job.priority ?? 5,\n payload: { ...job.payload, _workflowId: job.workflowId } as unknown,\n status: this.enums.status(\"PENDING\"),\n },\n }),\n ),\n );\n\n return results.map((r: { id: string }) => r.id);\n }\n\n /**\n * Atomically dequeue the next available job\n * Uses FOR UPDATE SKIP LOCKED (PostgreSQL) or optimistic locking (SQLite)\n */\n async dequeue(): Promise<DequeueResult | null> {\n if (this.databaseType === \"sqlite\") {\n return this.dequeueSqlite();\n }\n return this.dequeuePostgres();\n }\n\n /**\n * PostgreSQL implementation using FOR UPDATE SKIP LOCKED for safe concurrency\n */\n private async dequeuePostgres(): Promise<DequeueResult | null> {\n try {\n const result = await this.prisma.$queryRaw<\n Array<{\n id: string;\n workflowRunId: string;\n stageId: string;\n priority: number;\n attempt: number;\n maxAttempts: number;\n payload: unknown;\n }>\n >`\n UPDATE \"job_queue\"\n SET\n status = 'RUNNING',\n \"workerId\" = ${this.workerId},\n \"lockedAt\" = NOW(),\n \"startedAt\" = NOW(),\n attempt = attempt + 1\n WHERE id = (\n SELECT id FROM \"job_queue\"\n WHERE status = 'PENDING'\n AND (\"nextPollAt\" IS NULL OR \"nextPollAt\" <= NOW())\n ORDER BY priority DESC, \"createdAt\" ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED\n )\n RETURNING id, \"workflowRunId\", \"stageId\", priority, attempt, \"maxAttempts\", payload\n `;\n\n if (result.length === 0) {\n return null;\n }\n\n const job = result[0];\n logger.debug(\n `Dequeued job ${job.id} (stage: ${job.stageId}, attempt: ${job.attempt})`,\n );\n\n const payload = job.payload as Record<string, unknown>;\n const { _workflowId, ...rest } = payload;\n return {\n jobId: job.id,\n workflowRunId: job.workflowRunId,\n workflowId: (_workflowId as string) ?? \"\",\n stageId: job.stageId,\n priority: job.priority,\n attempt: job.attempt,\n maxAttempts: job.maxAttempts,\n payload: rest,\n };\n } catch (error) {\n logger.error(\"Error dequeuing job:\", error);\n return null;\n }\n }\n\n /**\n * SQLite implementation using optimistic locking.\n * SQLite doesn't support FOR UPDATE SKIP LOCKED, so we use a two-step approach:\n * 1. Find a PENDING job\n * 2. Atomically update it (only succeeds if still PENDING)\n * 3. If another worker claimed it, retry\n */\n private async dequeueSqlite(): Promise<DequeueResult | null> {\n try {\n const now = new Date();\n\n // Step 1: Find the next PENDING job\n const job = await this.prisma.jobQueue.findFirst({\n where: {\n status: this.enums.status(\"PENDING\"),\n OR: [{ nextPollAt: null }, { nextPollAt: { lte: now } }],\n },\n orderBy: [{ priority: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n if (!job) {\n return null;\n }\n\n // Step 2: Atomically claim it (only succeeds if still PENDING)\n const result = await this.prisma.jobQueue.updateMany({\n where: {\n id: job.id,\n status: this.enums.status(\"PENDING\"), // Optimistic lock\n },\n data: {\n status: this.enums.status(\"RUNNING\"),\n workerId: this.workerId,\n lockedAt: now,\n startedAt: now,\n attempt: { increment: 1 },\n },\n });\n\n if (result.count === 0) {\n // Another worker claimed it, retry\n return this.dequeueSqlite();\n }\n\n // Fetch the updated job to get the new attempt count\n const claimedJob = await this.prisma.jobQueue.findUnique({\n where: { id: job.id },\n });\n\n if (!claimedJob) {\n return null;\n }\n\n logger.debug(\n `Dequeued job ${claimedJob.id} (stage: ${claimedJob.stageId}, attempt: ${claimedJob.attempt})`,\n );\n\n const claimedPayload = claimedJob.payload as Record<string, unknown>;\n const { _workflowId: claimedWfId, ...claimedRest } = claimedPayload;\n return {\n jobId: claimedJob.id,\n workflowRunId: claimedJob.workflowRunId,\n workflowId: (claimedWfId as string) ?? \"\",\n stageId: claimedJob.stageId,\n priority: claimedJob.priority,\n attempt: claimedJob.attempt,\n maxAttempts: claimedJob.maxAttempts,\n payload: claimedRest,\n };\n } catch (error) {\n logger.error(\"Error dequeuing job:\", error);\n return null;\n }\n }\n\n /**\n * Mark job as completed\n */\n async complete(jobId: string): Promise<void> {\n await this.prisma.jobQueue.update({\n where: { id: jobId },\n data: {\n status: this.enums.status(\"COMPLETED\"),\n completedAt: new Date(),\n },\n });\n logger.debug(`Job ${jobId} completed`);\n }\n\n /**\n * Mark job as suspended (for async-batch)\n */\n async suspend(jobId: string, nextPollAt: Date): Promise<void> {\n await this.prisma.jobQueue.update({\n where: { id: jobId },\n data: {\n status: this.enums.status(\"SUSPENDED\"),\n nextPollAt,\n workerId: null,\n lockedAt: null,\n },\n });\n logger.debug(`Job ${jobId} suspended until ${nextPollAt.toISOString()}`);\n }\n\n /**\n * Mark job as failed\n */\n async fail(\n jobId: string,\n error: string,\n shouldRetry: boolean = false,\n ): Promise<void> {\n const job = await this.prisma.jobQueue.findUnique({\n where: { id: jobId },\n select: { attempt: true, maxAttempts: true },\n });\n\n if (shouldRetry && job && job.attempt < job.maxAttempts) {\n // Re-queue for retry with exponential backoff\n const backoffMs = 2 ** job.attempt * 1000; // 2s, 4s, 8s...\n const nextPollAt = new Date(Date.now() + backoffMs);\n\n await this.prisma.jobQueue.update({\n where: { id: jobId },\n data: {\n status: this.enums.status(\"PENDING\"),\n lastError: error,\n workerId: null,\n lockedAt: null,\n nextPollAt: nextPollAt,\n },\n });\n logger.debug(`Job ${jobId} failed, will retry in ${backoffMs}ms`);\n } else {\n await this.prisma.jobQueue.update({\n where: { id: jobId },\n data: {\n status: this.enums.status(\"FAILED\"),\n completedAt: new Date(),\n lastError: error,\n },\n });\n logger.debug(`Job ${jobId} failed permanently: ${error}`);\n }\n }\n\n /**\n * Get suspended jobs that are ready to be checked\n */\n async getSuspendedJobsReadyToPoll(): Promise<\n Array<{ jobId: string; stageId: string; workflowRunId: string }>\n > {\n const jobs = await this.prisma.jobQueue.findMany({\n where: {\n status: this.enums.status(\"SUSPENDED\"),\n nextPollAt: { lte: new Date() },\n },\n select: {\n id: true,\n workflowRunId: true,\n stageId: true,\n },\n });\n\n return jobs.map(\n (j: { id: string; workflowRunId: string; stageId: string }) => ({\n jobId: j.id,\n workflowRunId: j.workflowRunId,\n stageId: j.stageId,\n }),\n );\n }\n\n /**\n * Release stale locks (for crashed workers)\n */\n async releaseStaleJobs(staleThresholdMs: number = 300000): Promise<number> {\n const thresholdDate = new Date(Date.now() - staleThresholdMs);\n\n const result = await this.prisma.jobQueue.updateMany({\n where: {\n status: this.enums.status(\"RUNNING\"),\n lockedAt: { lt: thresholdDate },\n },\n data: {\n status: this.enums.status(\"PENDING\"),\n workerId: null,\n lockedAt: null,\n },\n });\n\n if (result.count > 0) {\n logger.debug(\n `Released ${result.count} stale jobs (locked before ${thresholdDate.toISOString()})`,\n );\n }\n\n return result.count;\n }\n}\n\n/**\n * Factory function to create PrismaJobQueue with prisma client\n *\n * @param prisma - Prisma client instance\n * @param optionsOrWorkerId - Options object or workerId string (for backwards compatibility)\n */\nexport function createPrismaJobQueue(\n prisma: PrismaClient,\n optionsOrWorkerId?: PrismaJobQueueOptions | string,\n): JobQueue {\n // Handle backwards compatibility: if string is passed, treat as workerId\n const options: PrismaJobQueueOptions =\n typeof optionsOrWorkerId === \"string\"\n ? { workerId: optionsOrWorkerId }\n : (optionsOrWorkerId ?? {});\n\n return new PrismaJobQueue(prisma, options);\n}\n","/**\n * PrismaWorkflowPersistence - Prisma implementation of WorkflowPersistence\n *\n * This is the default persistence implementation used by the workflow engine.\n * It wraps Prisma client operations to match the WorkflowPersistence interface.\n */\n\nimport type {\n CreateLogInput,\n CreateOutboxEventInput,\n CreateRunInput,\n CreateStageInput,\n OutboxRecord,\n SaveArtifactInput,\n UpdateRunInput,\n UpdateStageInput,\n UpsertStageInput,\n WorkflowArtifactRecord,\n WorkflowPersistence,\n WorkflowRunRecord,\n WorkflowStageRecord,\n WorkflowStageStatus,\n WorkflowStatus,\n} from \"../interface\";\nimport { StaleVersionError } from \"../interface\";\nimport { createEnumHelper, type PrismaEnumHelper } from \"./enum-compat\";\n\n// Type for prisma client - using any to avoid dependency on specific prisma client\ntype PrismaClient = any;\n\nexport type DatabaseType = \"postgresql\" | \"sqlite\";\n\nexport interface PrismaWorkflowPersistenceOptions {\n /**\n * Database type. Defaults to \"postgresql\".\n * Set to \"sqlite\" when using SQLite (uses optimistic locking instead of FOR UPDATE SKIP LOCKED).\n */\n databaseType?: DatabaseType;\n}\n\nconst IDEMPOTENCY_IN_PROGRESS_MARKER = {\n __workflowEngineState: \"in_progress\",\n};\n\nfunction isInProgressResult(result: unknown): boolean {\n if (!result || typeof result !== \"object\") return false;\n return (\n (result as Record<string, unknown>).__workflowEngineState === \"in_progress\"\n );\n}\n\nexport class PrismaWorkflowPersistence implements WorkflowPersistence {\n private enums: PrismaEnumHelper;\n private databaseType: DatabaseType;\n\n constructor(\n private readonly prisma: PrismaClient,\n options: PrismaWorkflowPersistenceOptions = {},\n ) {\n this.enums = createEnumHelper(prisma);\n this.databaseType = options.databaseType ?? \"postgresql\";\n }\n\n async withTransaction<T>(\n fn: (tx: WorkflowPersistence) => Promise<T>,\n ): Promise<T> {\n if (typeof this.prisma.$transaction !== \"function\") {\n return fn(this);\n }\n return this.prisma.$transaction(async (tx: PrismaClient) => {\n const txPersistence = new PrismaWorkflowPersistence(tx, {\n databaseType: this.databaseType,\n });\n return fn(txPersistence);\n });\n }\n\n // ============================================================================\n // WorkflowRun Operations\n // ============================================================================\n\n async createRun(data: CreateRunInput): Promise<WorkflowRunRecord> {\n const run = await this.prisma.workflowRun.create({\n data: {\n id: data.id,\n workflowId: data.workflowId,\n workflowName: data.workflowName,\n workflowType: data.workflowType,\n input: data.input as unknown,\n config: (data.config ?? {}) as unknown,\n priority: data.priority ?? 5,\n // Spread metadata for domain-specific fields (certificateId, etc.)\n ...(data.metadata ?? {}),\n },\n });\n return this.mapWorkflowRun(run);\n }\n\n async updateRun(id: string, data: UpdateRunInput): Promise<void> {\n const updateData = this.buildRunUpdateData(data);\n\n if (data.expectedVersion === undefined) {\n await this.prisma.workflowRun.update({\n where: { id },\n data: updateData,\n });\n return;\n }\n\n const result = await this.prisma.workflowRun.updateMany({\n where: { id, version: data.expectedVersion },\n data: {\n ...updateData,\n version: { increment: 1 },\n },\n });\n\n if (result.count === 0) {\n const current = await this.prisma.workflowRun.findUnique({\n where: { id },\n select: { version: true },\n });\n throw new StaleVersionError(\n \"WorkflowRun\",\n id,\n data.expectedVersion,\n current?.version ?? -1,\n );\n }\n }\n\n async getRun(id: string): Promise<WorkflowRunRecord | null> {\n const run = await this.prisma.workflowRun.findUnique({ where: { id } });\n return run ? this.mapWorkflowRun(run) : null;\n }\n\n async getRunStatus(id: string): Promise<WorkflowStatus | null> {\n const run = await this.prisma.workflowRun.findUnique({\n where: { id },\n select: { status: true },\n });\n return run?.status ?? null;\n }\n\n async getRunsByStatus(status: WorkflowStatus): Promise<WorkflowRunRecord[]> {\n const runs = await this.prisma.workflowRun.findMany({\n where: { status: this.enums.status(status) },\n orderBy: { createdAt: \"asc\" },\n });\n return runs.map((run: any) => this.mapWorkflowRun(run));\n }\n\n async claimPendingRun(id: string): Promise<boolean> {\n // Atomic update: only succeeds if status is still PENDING\n // This prevents race conditions when multiple workers try to claim the same run\n const result = await this.prisma.workflowRun.updateMany({\n where: {\n id,\n status: this.enums.status(\"PENDING\"),\n },\n data: {\n status: this.enums.status(\"RUNNING\"),\n startedAt: new Date(),\n },\n });\n\n // updateMany returns { count: N } - if count is 0, another worker already claimed it\n return result.count > 0;\n }\n\n async claimNextPendingRun(): Promise<WorkflowRunRecord | null> {\n if (this.databaseType === \"sqlite\") {\n return this.claimNextPendingRunSqlite();\n }\n return this.claimNextPendingRunPostgres();\n }\n\n /**\n * PostgreSQL implementation using FOR UPDATE SKIP LOCKED for zero-contention claiming.\n * This atomically:\n * 1. Finds the highest priority PENDING run (FIFO within same priority)\n * 2. Locks it exclusively (other workers skip locked rows)\n * 3. Updates it to RUNNING\n * 4. Returns the claimed run\n */\n private async claimNextPendingRunPostgres(): Promise<WorkflowRunRecord | null> {\n // Note: Table name is \"workflow_runs\" (snake_case per Prisma @@map convention)\n // Column names are camelCase (e.g., \"createdAt\", \"startedAt\")\n const results = await this.prisma.$queryRaw<any[]>`\n WITH claimed AS (\n SELECT id\n FROM \"workflow_runs\"\n WHERE status = ${this.enums.status(\"PENDING\")}\n ORDER BY priority DESC, \"createdAt\" ASC\n LIMIT 1\n FOR UPDATE SKIP LOCKED\n )\n UPDATE \"workflow_runs\"\n SET status = ${this.enums.status(\"RUNNING\")},\n \"startedAt\" = NOW(),\n \"updatedAt\" = NOW()\n FROM claimed\n WHERE \"workflow_runs\".id = claimed.id\n RETURNING \"workflow_runs\".*\n `;\n\n if (results.length === 0) {\n return null;\n }\n\n return this.mapWorkflowRun(results[0]);\n }\n\n /**\n * SQLite implementation using optimistic locking.\n * SQLite doesn't support FOR UPDATE SKIP LOCKED, so we use a two-step approach:\n * 1. Find a PENDING run\n * 2. Atomically update it (only succeeds if still PENDING)\n * 3. If another worker claimed it, retry\n */\n private async claimNextPendingRunSqlite(): Promise<WorkflowRunRecord | null> {\n // Step 1: Find the next PENDING run\n const run = await this.prisma.workflowRun.findFirst({\n where: { status: this.enums.status(\"PENDING\") },\n orderBy: [{ priority: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n if (!run) {\n return null;\n }\n\n // Step 2: Atomically claim it (only succeeds if still PENDING)\n const result = await this.prisma.workflowRun.updateMany({\n where: {\n id: run.id,\n status: this.enums.status(\"PENDING\"), // Optimistic lock\n },\n data: {\n status: this.enums.status(\"RUNNING\"),\n startedAt: new Date(),\n updatedAt: new Date(),\n },\n });\n\n if (result.count === 0) {\n // Another worker claimed it, retry\n return this.claimNextPendingRunSqlite();\n }\n\n // Fetch the updated record\n const claimedRun = await this.prisma.workflowRun.findUnique({\n where: { id: run.id },\n });\n\n return claimedRun ? this.mapWorkflowRun(claimedRun) : null;\n }\n\n // ============================================================================\n // WorkflowStage Operations\n // ============================================================================\n\n async createStage(data: CreateStageInput): Promise<WorkflowStageRecord> {\n const stage = await this.prisma.workflowStage.create({\n data: {\n workflowRunId: data.workflowRunId,\n stageId: data.stageId,\n stageName: data.stageName,\n stageNumber: data.stageNumber,\n executionGroup: data.executionGroup,\n status: data.status\n ? this.enums.status(data.status)\n : this.enums.status(\"PENDING\"),\n startedAt: data.startedAt,\n config: data.config as unknown,\n inputData: data.inputData as unknown,\n },\n });\n return this.mapWorkflowStage(stage);\n }\n\n async upsertStage(data: UpsertStageInput): Promise<WorkflowStageRecord> {\n const stage = await this.prisma.workflowStage.upsert({\n where: {\n workflowRunId_stageId: {\n workflowRunId: data.workflowRunId,\n stageId: data.stageId,\n },\n },\n create: {\n workflowRunId: data.create.workflowRunId,\n stageId: data.create.stageId,\n stageName: data.create.stageName,\n stageNumber: data.create.stageNumber,\n executionGroup: data.create.executionGroup,\n status: data.create.status\n ? this.enums.status(data.create.status)\n : this.enums.status(\"RUNNING\"),\n startedAt: data.create.startedAt ?? new Date(),\n config: data.create.config as unknown,\n inputData: data.create.inputData as unknown,\n },\n update: {\n status: data.update.status\n ? this.enums.status(data.update.status)\n : undefined,\n startedAt: data.update.startedAt,\n },\n });\n return this.mapWorkflowStage(stage);\n }\n\n async updateStage(id: string, data: UpdateStageInput): Promise<void> {\n const updateData = this.buildStageUpdateData(data);\n\n if (data.expectedVersion === undefined) {\n await this.prisma.workflowStage.update({\n where: { id },\n data: updateData,\n });\n return;\n }\n\n const result = await this.prisma.workflowStage.updateMany({\n where: { id, version: data.expectedVersion },\n data: {\n ...updateData,\n version: { increment: 1 },\n },\n });\n\n if (result.count === 0) {\n const current = await this.prisma.workflowStage.findUnique({\n where: { id },\n select: { version: true },\n });\n throw new StaleVersionError(\n \"WorkflowStage\",\n id,\n data.expectedVersion,\n current?.version ?? -1,\n );\n }\n }\n\n async updateStageByRunAndStageId(\n workflowRunId: string,\n stageId: string,\n data: UpdateStageInput,\n ): Promise<void> {\n const updateData = this.buildStageUpdateData(data);\n\n if (data.expectedVersion === undefined) {\n await this.prisma.workflowStage.update({\n where: {\n workflowRunId_stageId: { workflowRunId, stageId },\n },\n data: updateData,\n });\n return;\n }\n\n const result = await this.prisma.workflowStage.updateMany({\n where: {\n workflowRunId,\n stageId,\n version: data.expectedVersion,\n },\n data: {\n ...updateData,\n version: { increment: 1 },\n },\n });\n\n if (result.count === 0) {\n const current = await this.prisma.workflowStage.findFirst({\n where: { workflowRunId, stageId },\n select: { id: true, version: true },\n });\n throw new StaleVersionError(\n \"WorkflowStage\",\n current?.id ?? `${workflowRunId}/${stageId}`,\n data.expectedVersion,\n current?.version ?? -1,\n );\n }\n }\n\n private buildRunUpdateData(data: UpdateRunInput): Record<string, unknown> {\n return {\n status: data.status ? this.enums.status(data.status) : undefined,\n startedAt: data.startedAt,\n completedAt: data.completedAt,\n duration: data.duration,\n output: data.output as unknown,\n totalCost: data.totalCost,\n totalTokens: data.totalTokens,\n };\n }\n\n private buildStageUpdateData(\n data: UpdateStageInput,\n ): Record<string, unknown> {\n return {\n status: data.status ? this.enums.status(data.status) : undefined,\n startedAt: data.startedAt,\n completedAt: data.completedAt,\n duration: data.duration,\n outputData: data.outputData as unknown,\n config: data.config as unknown,\n suspendedState: data.suspendedState as unknown,\n resumeData: data.resumeData as unknown,\n nextPollAt: data.nextPollAt,\n pollInterval: data.pollInterval,\n maxWaitUntil: data.maxWaitUntil,\n metrics: data.metrics as unknown,\n embeddingInfo: data.embeddingInfo as unknown,\n errorMessage: data.errorMessage,\n };\n }\n\n async getStage(\n runId: string,\n stageId: string,\n ): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findUnique({\n where: {\n workflowRunId_stageId: { workflowRunId: runId, stageId },\n },\n });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async getStageById(id: string): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findUnique({ where: { id } });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async getStagesByRun(\n runId: string,\n options?: { status?: WorkflowStageStatus; orderBy?: \"asc\" | \"desc\" },\n ): Promise<WorkflowStageRecord[]> {\n const stages = await this.prisma.workflowStage.findMany({\n where: {\n workflowRunId: runId,\n ...(options?.status && { status: this.enums.status(options.status) }),\n },\n orderBy: { executionGroup: options?.orderBy ?? \"asc\" },\n });\n return stages.map((s: Record<string, unknown>) => this.mapWorkflowStage(s));\n }\n\n async getSuspendedStages(beforeDate: Date): Promise<WorkflowStageRecord[]> {\n const stages = await this.prisma.workflowStage.findMany({\n where: {\n status: this.enums.status(\"SUSPENDED\"),\n nextPollAt: { lte: beforeDate },\n },\n include: {\n workflowRun: { select: { workflowType: true } },\n },\n });\n return stages.map((s: Record<string, unknown>) => this.mapWorkflowStage(s));\n }\n\n async getFirstSuspendedStageReadyToResume(\n runId: string,\n ): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findFirst({\n where: {\n workflowRunId: runId,\n status: this.enums.status(\"SUSPENDED\"),\n nextPollAt: null, // Ready to resume (poll cleared by orchestrator)\n },\n orderBy: { executionGroup: \"asc\" },\n });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async getFirstFailedStage(\n runId: string,\n ): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findFirst({\n where: {\n workflowRunId: runId,\n status: this.enums.status(\"FAILED\"),\n },\n orderBy: { executionGroup: \"desc\" },\n });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async getLastCompletedStage(\n runId: string,\n ): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findFirst({\n where: {\n workflowRunId: runId,\n status: this.enums.status(\"COMPLETED\"),\n },\n orderBy: { executionGroup: \"desc\" },\n });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async getLastCompletedStageBefore(\n runId: string,\n executionGroup: number,\n ): Promise<WorkflowStageRecord | null> {\n const stage = await this.prisma.workflowStage.findFirst({\n where: {\n workflowRunId: runId,\n status: this.enums.status(\"COMPLETED\"),\n executionGroup: { lt: executionGroup },\n },\n orderBy: { executionGroup: \"desc\" },\n });\n return stage ? this.mapWorkflowStage(stage) : null;\n }\n\n async deleteStage(id: string): Promise<void> {\n await this.prisma.workflowStage.delete({ where: { id } });\n }\n\n // ============================================================================\n // WorkflowLog Operations\n // ============================================================================\n\n async createLog(data: CreateLogInput): Promise<void> {\n await this.prisma.workflowLog.create({\n data: {\n workflowRunId: data.workflowRunId,\n workflowStageId: data.workflowStageId,\n level: this.enums.logLevel(data.level),\n message: data.message,\n metadata: data.metadata as unknown,\n },\n });\n }\n\n // ============================================================================\n // WorkflowArtifact Operations\n // ============================================================================\n\n async saveArtifact(data: SaveArtifactInput): Promise<void> {\n await this.prisma.workflowArtifact.upsert({\n where: {\n workflowRunId_key: {\n workflowRunId: data.workflowRunId,\n key: data.key,\n },\n },\n create: {\n workflowRunId: data.workflowRunId,\n workflowStageId: data.workflowStageId,\n key: data.key,\n type: this.enums.artifactType(data.type),\n data: data.data as unknown,\n size: data.size,\n metadata: data.metadata as unknown,\n },\n update: {\n data: data.data as unknown,\n size: data.size,\n metadata: data.metadata as unknown,\n },\n });\n }\n\n async loadArtifact(runId: string, key: string): Promise<unknown> {\n const artifact = await this.prisma.workflowArtifact.findUnique({\n where: {\n workflowRunId_key: { workflowRunId: runId, key },\n },\n });\n return artifact?.data;\n }\n\n async hasArtifact(runId: string, key: string): Promise<boolean> {\n const artifact = await this.prisma.workflowArtifact.findUnique({\n where: {\n workflowRunId_key: { workflowRunId: runId, key },\n },\n select: { id: true },\n });\n return artifact !== null;\n }\n\n async deleteArtifact(runId: string, key: string): Promise<void> {\n await this.prisma.workflowArtifact.delete({\n where: {\n workflowRunId_key: { workflowRunId: runId, key },\n },\n });\n }\n\n async listArtifacts(runId: string): Promise<WorkflowArtifactRecord[]> {\n const artifacts = await this.prisma.workflowArtifact.findMany({\n where: { workflowRunId: runId },\n });\n return artifacts.map((a: Record<string, unknown>) =>\n this.mapWorkflowArtifact(a),\n );\n }\n\n async getStageIdForArtifact(\n runId: string,\n stageId: string,\n ): Promise<string | null> {\n const stage = await this.prisma.workflowStage.findUnique({\n where: {\n workflowRunId_stageId: { workflowRunId: runId, stageId },\n },\n select: { id: true },\n });\n return stage?.id ?? null;\n }\n\n // ============================================================================\n // Stage Output Convenience Methods\n // ============================================================================\n\n async saveStageOutput(\n runId: string,\n workflowType: string,\n stageId: string,\n output: unknown,\n ): Promise<string> {\n // Generate key with consistent pattern: workflow-v2/{type}/{runId}/{stageId}/output.json\n const key = `workflow-v2/${workflowType}/${runId}/${stageId}/output.json`;\n\n const json = JSON.stringify(output);\n const size = Buffer.byteLength(json, \"utf8\");\n\n // Get the workflowStage record ID for linking\n const workflowStageId = await this.getStageIdForArtifact(runId, stageId);\n\n await this.prisma.workflowArtifact.upsert({\n where: {\n workflowRunId_key: { workflowRunId: runId, key },\n },\n update: {\n data: output as unknown,\n size,\n workflowStageId,\n },\n create: {\n workflowRunId: runId,\n workflowStageId,\n key,\n type: this.enums.artifactType(\"STAGE_OUTPUT\"),\n data: output as unknown,\n size,\n },\n });\n\n return key;\n }\n\n // ============================================================================\n // Outbox Operations\n // ============================================================================\n\n async appendOutboxEvents(events: CreateOutboxEventInput[]): Promise<void> {\n if (events.length === 0) return;\n\n // Group by workflowRunId to assign sequences per-run\n const byRun = new Map<string, CreateOutboxEventInput[]>();\n for (const event of events) {\n const list = byRun.get(event.workflowRunId) ?? [];\n list.push(event);\n byRun.set(event.workflowRunId, list);\n }\n\n const rows: Array<{\n workflowRunId: string;\n sequence: number;\n eventType: string;\n payload: unknown;\n causationId: string;\n occurredAt: Date;\n }> = [];\n\n for (const [workflowRunId, runEvents] of byRun) {\n if (\n this.databaseType === \"postgresql\" &&\n typeof this.prisma.$executeRaw === \"function\"\n ) {\n // Serialize per-run sequence assignment inside the transaction.\n await this.prisma.$executeRaw`\n SELECT pg_advisory_xact_lock(hashtext(${workflowRunId}))\n `;\n }\n\n // Get the current max sequence for this run\n const maxResult = await this.prisma.outboxEvent.aggregate({\n where: { workflowRunId },\n _max: { sequence: true },\n });\n let seq = maxResult._max.sequence ?? 0;\n\n for (const event of runEvents) {\n seq++;\n rows.push({\n workflowRunId: event.workflowRunId,\n sequence: seq,\n eventType: event.eventType,\n payload: event.payload as any,\n causationId: event.causationId,\n occurredAt: event.occurredAt,\n });\n }\n }\n\n await this.prisma.outboxEvent.createMany({ data: rows });\n }\n\n async getUnpublishedOutboxEvents(limit?: number): Promise<OutboxRecord[]> {\n const effectiveLimit = limit ?? 100;\n const records = await this.prisma.outboxEvent.findMany({\n where: { publishedAt: null, dlqAt: null },\n orderBy: [{ workflowRunId: \"asc\" }, { sequence: \"asc\" }],\n take: effectiveLimit,\n });\n return records.map((r: any) => this.mapOutboxEvent(r));\n }\n\n async markOutboxEventsPublished(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n await this.prisma.outboxEvent.updateMany({\n where: { id: { in: ids } },\n data: { publishedAt: new Date() },\n });\n }\n\n // ============================================================================\n // Outbox DLQ Operations\n // ============================================================================\n\n async incrementOutboxRetryCount(id: string): Promise<number> {\n const record = await this.prisma.outboxEvent.update({\n where: { id },\n data: { retryCount: { increment: 1 } },\n select: { retryCount: true },\n });\n return record.retryCount;\n }\n\n async moveOutboxEventToDLQ(id: string): Promise<void> {\n await this.prisma.outboxEvent.update({\n where: { id },\n data: { dlqAt: new Date() },\n });\n }\n\n async replayDLQEvents(maxEvents: number): Promise<number> {\n const dlqEvents = await this.prisma.outboxEvent.findMany({\n where: { dlqAt: { not: null } },\n take: maxEvents,\n select: { id: true },\n });\n\n if (dlqEvents.length === 0) return 0;\n\n const result = await this.prisma.outboxEvent.updateMany({\n where: { id: { in: dlqEvents.map((e: any) => e.id) } },\n data: { dlqAt: null, retryCount: 0 },\n });\n return result.count;\n }\n\n // ============================================================================\n // Idempotency Operations\n // ============================================================================\n\n async acquireIdempotencyKey(\n key: string,\n commandType: string,\n ): Promise<\n | { status: \"acquired\" }\n | { status: \"replay\"; result: unknown }\n | { status: \"in_progress\" }\n > {\n try {\n await this.prisma.idempotencyKey.create({\n data: {\n key,\n commandType,\n result: IDEMPOTENCY_IN_PROGRESS_MARKER as any,\n },\n });\n return { status: \"acquired\" };\n } catch (error: any) {\n if (error?.code !== \"P2002\") {\n throw error;\n }\n }\n\n const existing = await this.prisma.idempotencyKey.findUnique({\n where: { key_commandType: { key, commandType } },\n select: { result: true },\n });\n\n if (!existing || isInProgressResult(existing.result)) {\n return { status: \"in_progress\" };\n }\n\n return { status: \"replay\", result: existing.result };\n }\n\n async completeIdempotencyKey(\n key: string,\n commandType: string,\n result: unknown,\n ): Promise<void> {\n await this.prisma.idempotencyKey.update({\n where: { key_commandType: { key, commandType } },\n data: { result: result as any },\n });\n }\n\n async releaseIdempotencyKey(key: string, commandType: string): Promise<void> {\n await this.prisma.idempotencyKey.deleteMany({\n where: { key, commandType },\n });\n }\n\n // ============================================================================\n // Type Mappers\n // ============================================================================\n\n private mapWorkflowRun(run: any): WorkflowRunRecord {\n return {\n id: run.id,\n createdAt: run.createdAt,\n updatedAt: run.updatedAt,\n workflowId: run.workflowId,\n workflowName: run.workflowName,\n workflowType: run.workflowType,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n duration: run.duration,\n input: run.input,\n output: run.output,\n config: run.config,\n totalCost: run.totalCost,\n totalTokens: run.totalTokens,\n priority: run.priority,\n version: run.version ?? 0,\n };\n }\n\n private mapWorkflowStage(stage: any): WorkflowStageRecord {\n return {\n id: stage.id,\n createdAt: stage.createdAt,\n updatedAt: stage.updatedAt,\n workflowRunId: stage.workflowRunId,\n stageId: stage.stageId,\n stageName: stage.stageName,\n stageNumber: stage.stageNumber,\n executionGroup: stage.executionGroup,\n status: stage.status,\n startedAt: stage.startedAt,\n completedAt: stage.completedAt,\n duration: stage.duration,\n inputData: stage.inputData,\n outputData: stage.outputData,\n config: stage.config,\n suspendedState: stage.suspendedState,\n resumeData: stage.resumeData,\n nextPollAt: stage.nextPollAt,\n pollInterval: stage.pollInterval,\n maxWaitUntil: stage.maxWaitUntil,\n metrics: stage.metrics,\n embeddingInfo: stage.embeddingInfo,\n errorMessage: stage.errorMessage,\n version: stage.version ?? 0,\n };\n }\n\n private mapOutboxEvent(record: any): OutboxRecord {\n return {\n id: record.id,\n workflowRunId: record.workflowRunId,\n sequence: record.sequence,\n eventType: record.eventType,\n payload: record.payload,\n causationId: record.causationId,\n occurredAt: record.occurredAt,\n publishedAt: record.publishedAt,\n retryCount: record.retryCount,\n dlqAt: record.dlqAt,\n };\n }\n\n private mapWorkflowArtifact(artifact: any): WorkflowArtifactRecord {\n return {\n id: artifact.id,\n createdAt: artifact.createdAt,\n updatedAt: artifact.updatedAt,\n workflowRunId: artifact.workflowRunId,\n workflowStageId: artifact.workflowStageId,\n key: artifact.key,\n type: artifact.type,\n data: artifact.data,\n size: artifact.size,\n metadata: artifact.metadata,\n };\n }\n}\n\n/**\n * Factory function to create PrismaWorkflowPersistence\n */\nexport function createPrismaWorkflowPersistence(\n prisma: PrismaClient,\n options?: PrismaWorkflowPersistenceOptions,\n): PrismaWorkflowPersistence {\n return new PrismaWorkflowPersistence(prisma, options);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/kernel/errors.ts","../src/kernel/helpers/load-workflow-context.ts","../src/kernel/helpers/save-stage-output.ts","../src/kernel/helpers/create-storage-shim.ts","../src/kernel/handlers/job-execute.ts","../src/kernel/handlers/lease-reap-stale.ts","../src/kernel/handlers/outbox-flush.ts","../src/kernel/handlers/plugin-replay-dlq.ts","../src/kernel/handlers/run-cancel.ts","../src/kernel/handlers/run-claim-pending.ts","../src/kernel/handlers/run-create.ts","../src/kernel/handlers/run-rerun-from.ts","../src/kernel/handlers/run-transition.ts","../src/kernel/handlers/stage-poll-suspended.ts","../src/kernel/kernel.ts","../src/kernel/plugins.ts"],"names":["TERMINAL_STATUSES"],"mappings":"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","file":"chunk-WZ533CPU.js","sourcesContent":["/**\n * Core type definitions for Workflow System v2\n *\n * See WORKFLOW_SYSTEM_PROPOSAL.md for full architectural details\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// Progress & Metrics\n// ============================================================================\n\nexport interface ProgressUpdate {\n stageId: string;\n stageName: string;\n progress: number; // 0-100\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface StageMetrics {\n startTime: number;\n endTime: number;\n duration: number;\n itemsProcessed?: number;\n itemsProduced?: number;\n aiCalls?: number;\n totalTokens?: number;\n totalCost?: number;\n}\n\n// ============================================================================\n// Embedding Support\n// ============================================================================\n\nexport interface EmbeddingResult {\n id: string;\n content: string;\n embedding: number[];\n similarity?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EmbeddingInfo {\n model: string;\n dimensions: number;\n results: EmbeddingResult[];\n totalProcessed?: number;\n averageSimilarity?: number;\n}\n\n// ============================================================================\n// Stage Results\n// ============================================================================\n\nexport interface StageResult<TOutput> {\n output: TOutput;\n metrics: StageMetrics;\n artifacts?: Record<string, unknown>;\n embeddings?: EmbeddingInfo;\n}\n\n// ============================================================================\n// Suspended State (for async-batch operations)\n// ============================================================================\n\nexport const SuspendedStateSchema = z.object({\n batchId: z.string(),\n statusUrl: z.string().optional(),\n apiKey: z.string().optional(),\n submittedAt: z.string(), // ISO date string\n pollInterval: z.number(), // milliseconds\n maxWaitTime: z.number(), // milliseconds\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport interface SuspendedResult {\n suspended: true;\n state: z.infer<typeof SuspendedStateSchema>;\n pollConfig: {\n pollInterval: number;\n maxWaitTime: number;\n nextPollAt: Date;\n };\n metrics: StageMetrics;\n}\n\n// ============================================================================\n// Completion Check Result (for orchestrator polling)\n// ============================================================================\n\nexport interface CompletionCheckResult<TOutput> {\n ready: boolean;\n output?: TOutput;\n error?: string;\n nextCheckIn?: number; // Optional: override next poll interval\n metrics?: StageMetrics;\n embeddings?: EmbeddingInfo;\n}\n\n// ============================================================================\n// Log Levels\n// ============================================================================\n\nexport type LogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n\n// ============================================================================\n// Stage Mode\n// ============================================================================\n\nexport type StageMode =\n | \"sync\" // Execute and return immediately\n | \"async-batch\"; // Start batch job, return suspended state (separate poller handles completion)\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSuspendedResult<T>(\n result: StageResult<T> | SuspendedResult,\n): result is SuspendedResult {\n return \"suspended\" in result && result.suspended === true;\n}\n\nexport function isStageResult<T>(\n result: StageResult<T> | SuspendedResult,\n): result is StageResult<T> {\n return !isSuspendedResult(result);\n}\n","export class IdempotencyInProgressError extends Error {\n constructor(\n public readonly key: string,\n public readonly commandType: string,\n ) {\n super(\n `Command \"${commandType}\" with idempotency key \"${key}\" is already in progress`,\n );\n this.name = \"IdempotencyInProgressError\";\n }\n}\n","/**\n * Load workflow context from completed stages.\n *\n * For each completed stage, loads the output from BlobStore using\n * the _artifactKey stored in stage.outputData.\n */\n\nimport type { KernelDeps } from \"../kernel.js\";\n\nexport async function loadWorkflowContext(\n workflowRunId: string,\n deps: KernelDeps,\n): Promise<Record<string, unknown>> {\n const completedStages = await deps.persistence.getStagesByRun(workflowRunId, {\n status: \"COMPLETED\",\n orderBy: \"asc\",\n });\n\n const context: Record<string, unknown> = {};\n\n for (const stage of completedStages) {\n const outputData = stage.outputData as any;\n if (outputData?._artifactKey) {\n context[stage.stageId] = await deps.blobStore.get(\n outputData._artifactKey,\n );\n } else if (outputData && typeof outputData === \"object\") {\n context[stage.stageId] = outputData;\n }\n }\n\n return context;\n}\n","/**\n * Save stage output to BlobStore and return the blob key.\n *\n * The key is stored in stage.outputData._artifactKey so that\n * loadWorkflowContext() can retrieve it later.\n */\n\nimport type { KernelDeps } from \"../kernel.js\";\n\nexport async function saveStageOutput(\n runId: string,\n workflowType: string,\n stageId: string,\n output: unknown,\n deps: KernelDeps,\n): Promise<string> {\n const key = `workflow-v2/${workflowType}/${runId}/${stageId}/output.json`;\n await deps.blobStore.put(key, output);\n return key;\n}\n","/**\n * Shared StageStorage implementation backed by BlobStore.\n *\n * Used by both job-execute and stage-poll-suspended handlers.\n */\n\nimport type { StageStorage } from \"../../core/stage.js\";\nimport type { KernelDeps } from \"../kernel.js\";\n\nexport function createStorageShim(\n workflowRunId: string,\n workflowType: string,\n deps: KernelDeps,\n): StageStorage {\n return {\n async save<T>(key: string, data: T): Promise<void> {\n await deps.blobStore.put(key, data);\n },\n\n async load<T>(key: string): Promise<T> {\n return deps.blobStore.get(key) as Promise<T>;\n },\n\n async exists(key: string): Promise<boolean> {\n return deps.blobStore.has(key);\n },\n\n async delete(key: string): Promise<void> {\n return deps.blobStore.delete(key);\n },\n\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${workflowType}/${workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n },\n };\n}\n","/**\n * Handler: job.execute\n *\n * Executes a single stage within a workflow run using a multi-phase\n * transaction pattern:\n *\n * Phase 1 (Start): upsert stage to RUNNING + write stage:started\n * outbox event in one transaction. Commits\n * immediately so RUNNING is visible.\n *\n * Phase 2 (Execute): run stageDef.execute() outside any database\n * transaction. Progress events are collected\n * in memory.\n *\n * Phase 3 (Complete): update stage to COMPLETED/SUSPENDED/FAILED +\n * write completion outbox event (and progress\n * events) in one transaction.\n *\n * This avoids holding a database transaction open for the duration of\n * potentially long-running stage execution (AI calls, HTTP requests,\n * etc.). If the process crashes between Phase 1 and Phase 3, the\n * stage stays RUNNING and lease.reapStale will retry the job.\n */\n\nimport type { StageContext } from \"../../core/stage\";\nimport type { ProgressUpdate } from \"../../core/types\";\nimport { isSuspendedResult } from \"../../core/types\";\nimport type { Workflow } from \"../../core/workflow\";\nimport type { CreateOutboxEventInput } from \"../../persistence/interface\";\nimport type { JobExecuteCommand, JobExecuteResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport {\n createStorageShim,\n loadWorkflowContext,\n saveStageOutput,\n} from \"../helpers/index.js\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\n// ---------------------------------------------------------------------------\n// Helper: resolve stage input\n// ---------------------------------------------------------------------------\n\nfunction resolveStageInput(\n workflow: Workflow<any, any>,\n stageId: string,\n workflowRun: { input: any },\n workflowContext: Record<string, unknown>,\n): unknown {\n const groupIndex = workflow.getExecutionGroupIndex(stageId);\n\n if (groupIndex === 0) return workflowRun.input;\n\n const prevStageId = workflow.getPreviousStageId(stageId);\n if (prevStageId && workflowContext[prevStageId] !== undefined) {\n return workflowContext[prevStageId];\n }\n\n return workflowRun.input;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: build outbox event inputs from kernel events\n// ---------------------------------------------------------------------------\n\nfunction toOutboxEvents(\n workflowRunId: string,\n causationId: string,\n events: KernelEvent[],\n): CreateOutboxEventInput[] {\n return events.map((event) => ({\n workflowRunId,\n eventType: event.type,\n payload: event,\n causationId,\n occurredAt: event.timestamp,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleJobExecute(\n command: JobExecuteCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<JobExecuteResult>> {\n const { workflowRunId, workflowId, stageId, config } = command;\n const startTime = deps.clock.now().getTime();\n const causationId = command.idempotencyKey ?? crypto.randomUUID();\n\n // ── Pre-flight (no transaction) ──────────────────────────────────\n // Read-only lookups: workflow def, stage def, run record, context.\n\n const workflow = deps.registry.getWorkflow(workflowId);\n if (!workflow)\n throw new Error(`Workflow ${workflowId} not found in registry`);\n\n const stageDef = workflow.getStage(stageId);\n if (!stageDef)\n throw new Error(`Stage ${stageId} not found in workflow ${workflowId}`);\n\n const workflowRun = await deps.persistence.getRun(workflowRunId);\n if (!workflowRun) throw new Error(`WorkflowRun ${workflowRunId} not found`);\n\n const workflowContext = await loadWorkflowContext(workflowRunId, deps);\n\n // ── Phase 1: Start transaction ───────────────────────────────────\n // Upsert stage to RUNNING and write stage:started outbox event.\n // Commits immediately so RUNNING status is visible to observers.\n\n const stageRecord = await deps.persistence.withTransaction(async (tx) => {\n const record = await tx.upsertStage({\n workflowRunId,\n stageId,\n create: {\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n stageNumber: workflow.getStageIndex(stageId) + 1,\n executionGroup: workflow.getExecutionGroupIndex(stageId),\n status: \"RUNNING\",\n startedAt: deps.clock.now(),\n config: config as any,\n },\n update: {\n status: \"RUNNING\",\n startedAt: deps.clock.now(),\n },\n });\n\n await tx.appendOutboxEvents(\n toOutboxEvents(workflowRunId, causationId, [\n {\n type: \"stage:started\",\n timestamp: deps.clock.now(),\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n stageNumber: record.stageNumber,\n },\n ]),\n );\n\n return record;\n });\n\n // ── Phase 2: Execute (no transaction) ────────────────────────────\n // The stage's execute() function runs outside any database\n // transaction. Progress events are collected in memory and\n // written to the outbox in Phase 3.\n\n const progressEvents: KernelEvent[] = [];\n\n try {\n // Resolve and validate input\n const rawInput = resolveStageInput(\n workflow,\n stageId,\n workflowRun,\n workflowContext,\n );\n const validatedInput = stageDef.inputSchema.parse(rawInput);\n\n // Parse config\n let stageConfig = (config as any)[stageId] || {};\n try {\n if (stageDef.configSchema) {\n stageConfig = stageDef.configSchema.parse(stageConfig);\n }\n } catch {\n // Fall back to raw config on parse failure\n }\n\n // Build log function (fire-and-forget, no transaction needed)\n const logFn = async (\n level: any,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n await deps.persistence\n .createLog({\n workflowRunId,\n workflowStageId: stageRecord.id,\n level: level as any,\n message,\n metadata: meta,\n })\n .catch(() => {});\n };\n\n // Build context\n const context: StageContext<any, any, any> = {\n workflowRunId,\n stageId,\n stageNumber: stageRecord.stageNumber,\n stageName: stageDef.name,\n stageRecordId: stageRecord.id,\n input: validatedInput,\n config: stageConfig,\n resumeState: stageRecord.suspendedState as any,\n onProgress: (update: ProgressUpdate) => {\n progressEvents.push({\n type: \"stage:progress\",\n timestamp: deps.clock.now(),\n workflowRunId,\n stageId,\n progress: update.progress,\n message: update.message,\n details: update.details,\n });\n },\n onLog: logFn,\n log: logFn,\n storage: createStorageShim(workflowRunId, workflowRun.workflowType, deps),\n workflowContext,\n };\n\n // Execute the stage — this is the potentially long-running part\n const result = await stageDef.execute(context);\n\n // ── Phase 3a: Complete transaction (success) ─────────────────\n if (isSuspendedResult(result)) {\n const { state, pollConfig, metrics } = result;\n const nextPollAt = new Date(\n pollConfig.nextPollAt?.getTime() ??\n deps.clock.now().getTime() + (pollConfig.pollInterval || 60000),\n );\n\n await deps.persistence.withTransaction(async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"SUSPENDED\",\n suspendedState: state as any,\n nextPollAt,\n pollInterval: pollConfig.pollInterval,\n maxWaitUntil: pollConfig.maxWaitTime\n ? new Date(deps.clock.now().getTime() + pollConfig.maxWaitTime)\n : undefined,\n metrics: metrics as any,\n });\n\n const suspendedEvent: KernelEvent = {\n type: \"stage:suspended\",\n timestamp: deps.clock.now(),\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n nextPollAt,\n };\n\n await tx.appendOutboxEvents(\n toOutboxEvents(workflowRunId, causationId, [\n ...progressEvents,\n suspendedEvent,\n ]),\n );\n });\n\n return { outcome: \"suspended\" as const, nextPollAt, _events: [] };\n } else {\n const duration = deps.clock.now().getTime() - startTime;\n\n // Save output to blob store (not a DB operation)\n const outputKey = await saveStageOutput(\n workflowRunId,\n workflowRun.workflowType,\n stageId,\n result.output,\n deps,\n );\n\n await deps.persistence.withTransaction(async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"COMPLETED\",\n completedAt: deps.clock.now(),\n duration,\n outputData: { _artifactKey: outputKey } as any,\n metrics: result.metrics as any,\n embeddingInfo: result.embeddings as any,\n });\n\n const completedEvent: KernelEvent = {\n type: \"stage:completed\",\n timestamp: deps.clock.now(),\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n duration,\n };\n\n await tx.appendOutboxEvents(\n toOutboxEvents(workflowRunId, causationId, [\n ...progressEvents,\n completedEvent,\n ]),\n );\n });\n\n return {\n outcome: \"completed\" as const,\n output: result.output,\n _events: [],\n };\n }\n } catch (error) {\n // ── Phase 3b: Complete transaction (failure) ─────────────────\n // The stage's execute() threw. Write FAILED status + outbox\n // event. If Phase 3 itself fails, re-throw the original error\n // so the idempotency key is released and the job can be retried.\n const errorMessage = error instanceof Error ? error.message : String(error);\n const duration = deps.clock.now().getTime() - startTime;\n\n try {\n await deps.persistence.withTransaction(async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n duration,\n errorMessage,\n });\n\n const failedEvent: KernelEvent = {\n type: \"stage:failed\",\n timestamp: deps.clock.now(),\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n error: errorMessage,\n };\n\n await tx.appendOutboxEvents(\n toOutboxEvents(workflowRunId, causationId, [\n ...progressEvents,\n failedEvent,\n ]),\n );\n });\n } catch {\n // Phase 3 itself failed. Stage stays RUNNING.\n // Re-throw the original error so the idempotency key is\n // released and lease.reapStale can retry the job.\n throw error;\n }\n\n await deps.persistence\n .createLog({\n workflowRunId,\n workflowStageId: stageRecord.id,\n level: \"ERROR\",\n message: errorMessage,\n })\n .catch(() => {});\n\n return { outcome: \"failed\" as const, error: errorMessage, _events: [] };\n }\n}\n","/**\n * Handler: lease.reapStale\n *\n * Releases stale job leases that have exceeded the threshold.\n */\n\nimport type { LeaseReapStaleCommand, LeaseReapStaleResult } from \"../commands\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handleLeaseReapStale(\n command: LeaseReapStaleCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<LeaseReapStaleResult>> {\n const released = await deps.jobTransport.releaseStaleJobs(\n command.staleThresholdMs,\n );\n\n return { released, _events: [] };\n}\n","/**\n * Handler: outbox.flush\n *\n * Reads unpublished outbox events and publishes them through EventSink.\n * Events are emitted in order (workflowRunId, sequence) and marked as\n * published after successful emission.\n *\n * On handler failure:\n * - Increments retryCount on the outbox event\n * - If retryCount >= maxRetries, moves event to DLQ\n * - Event is NOT marked as published (will retry on next flush)\n *\n * This handler returns _events: [] — it does NOT produce new outbox events.\n */\n\nimport type { OutboxFlushCommand, OutboxFlushResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\nimport type { PluginRunner } from \"../plugins\";\n\nexport async function handleOutboxFlush(\n command: OutboxFlushCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<OutboxFlushResult>> {\n const limit = command.maxEvents ?? 100;\n const events = await deps.persistence.getUnpublishedOutboxEvents(limit);\n\n // Determine maxRetries from EventSink (if it's a PluginRunner)\n const maxRetries = (deps.eventSink as Partial<PluginRunner>).maxRetries ?? 3;\n\n const publishedIds: string[] = [];\n\n for (const outboxEvent of events) {\n try {\n await deps.eventSink.emit(outboxEvent.payload as KernelEvent);\n publishedIds.push(outboxEvent.id);\n } catch {\n const newCount = await deps.persistence.incrementOutboxRetryCount(\n outboxEvent.id,\n );\n if (newCount >= maxRetries) {\n await deps.persistence.moveOutboxEventToDLQ(outboxEvent.id);\n }\n // Event stays unpublished — will retry on next flush (unless DLQ'd)\n }\n }\n\n if (publishedIds.length > 0) {\n await deps.persistence.markOutboxEventsPublished(publishedIds);\n }\n\n return { published: publishedIds.length, _events: [] };\n}\n","/**\n * Handler: plugin.replayDLQ\n *\n * Resets DLQ outbox events (dlqAt and retryCount) so they are\n * picked up by the next outbox.flush invocation.\n *\n * This handler returns _events: [] — it does NOT produce new outbox events.\n */\n\nimport type {\n PluginReplayDLQCommand,\n PluginReplayDLQResult,\n} from \"../commands\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handlePluginReplayDLQ(\n command: PluginReplayDLQCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<PluginReplayDLQResult>> {\n const maxEvents = command.maxEvents ?? 100;\n const replayed = await deps.persistence.replayDLQEvents(maxEvents);\n return { replayed, _events: [] };\n}\n","/**\n * Handler: run.cancel\n *\n * Cancels a running workflow if it is not already in a terminal state.\n */\n\nimport type { RunCancelCommand, RunCancelResult } from \"../commands\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nconst TERMINAL_STATUSES = new Set([\"COMPLETED\", \"FAILED\", \"CANCELLED\"]);\n\nexport async function handleRunCancel(\n command: RunCancelCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunCancelResult>> {\n const run = await deps.persistence.getRun(command.workflowRunId);\n\n if (!run || TERMINAL_STATUSES.has(run.status)) {\n return { cancelled: false, _events: [] };\n }\n\n await deps.persistence.updateRun(command.workflowRunId, {\n status: \"CANCELLED\",\n completedAt: deps.clock.now(),\n });\n\n return {\n cancelled: true,\n _events: [\n {\n type: \"workflow:cancelled\",\n timestamp: deps.clock.now(),\n workflowRunId: command.workflowRunId,\n reason: command.reason,\n },\n ],\n };\n}\n","/**\n * Handler: run.claimPending\n *\n * Claims pending workflow runs, creates first-stage records, and enqueues\n * their jobs for processing.\n */\n\nimport type {\n RunClaimPendingCommand,\n RunClaimPendingResult,\n} from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handleRunClaimPending(\n command: RunClaimPendingCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunClaimPendingResult>> {\n const maxClaims = command.maxClaims ?? 10;\n const claimed: Array<{\n workflowRunId: string;\n workflowId: string;\n jobIds: string[];\n }> = [];\n const events: KernelEvent[] = [];\n\n for (let i = 0; i < maxClaims; i++) {\n const run = await deps.persistence.claimNextPendingRun();\n if (!run) break;\n\n const workflow = deps.registry.getWorkflow(run.workflowId);\n if (!workflow) {\n const error = `Workflow ${run.workflowId} not found in registry`;\n const failedAt = deps.clock.now();\n await deps.persistence.updateRun(run.id, {\n status: \"FAILED\",\n completedAt: failedAt,\n output: {\n error: {\n code: \"WORKFLOW_NOT_FOUND\",\n message: error,\n workerId: command.workerId,\n },\n },\n });\n await deps.persistence\n .createLog({\n workflowRunId: run.id,\n level: \"ERROR\",\n message: error,\n metadata: {\n workerId: command.workerId,\n code: \"WORKFLOW_NOT_FOUND\",\n },\n })\n .catch(() => {});\n events.push({\n type: \"workflow:failed\",\n timestamp: failedAt,\n workflowRunId: run.id,\n error,\n });\n continue;\n }\n\n const stages = workflow.getStagesInExecutionGroup(1);\n if (stages.length === 0) {\n const error = `Workflow ${run.workflowId} has no stages in execution group 1`;\n const failedAt = deps.clock.now();\n await deps.persistence.updateRun(run.id, {\n status: \"FAILED\",\n completedAt: failedAt,\n output: {\n error: {\n code: \"EMPTY_STAGE_GRAPH\",\n message: error,\n workerId: command.workerId,\n },\n },\n });\n await deps.persistence\n .createLog({\n workflowRunId: run.id,\n level: \"ERROR\",\n message: error,\n metadata: {\n workerId: command.workerId,\n code: \"EMPTY_STAGE_GRAPH\",\n },\n })\n .catch(() => {});\n events.push({\n type: \"workflow:failed\",\n timestamp: failedAt,\n workflowRunId: run.id,\n error,\n });\n continue;\n }\n\n // Create stage records\n for (const stage of stages) {\n await deps.persistence.createStage({\n workflowRunId: run.id,\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: workflow.getStageIndex(stage.id) + 1,\n executionGroup: 1,\n status: \"PENDING\",\n config: (run.config as any)?.[stage.id] || {},\n });\n }\n\n // Enqueue jobs\n const jobIds = await deps.jobTransport.enqueueParallel(\n stages.map((stage) => ({\n workflowRunId: run.id,\n workflowId: run.workflowId,\n stageId: stage.id,\n priority: run.priority,\n payload: { config: run.config || {} },\n })),\n );\n\n events.push({\n type: \"workflow:started\",\n timestamp: deps.clock.now(),\n workflowRunId: run.id,\n });\n\n claimed.push({\n workflowRunId: run.id,\n workflowId: run.workflowId,\n jobIds,\n });\n }\n\n return { claimed, _events: events };\n}\n","/**\n * Handler: run.create\n *\n * Creates a new workflow run record after validating input and config.\n */\n\nimport type { RunCreateCommand, RunCreateResult } from \"../commands\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handleRunCreate(\n command: RunCreateCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunCreateResult>> {\n // 1. Get workflow from registry\n const workflow = deps.registry.getWorkflow(command.workflowId);\n if (!workflow) {\n throw new Error(`Workflow ${command.workflowId} not found in registry`);\n }\n\n // 2. Validate input against workflow's input schema\n try {\n workflow.inputSchema.parse(command.input);\n } catch (error) {\n throw new Error(`Invalid workflow input: ${error}`);\n }\n\n // 3. Get default config and merge with provided config\n const defaultConfig = workflow.getDefaultConfig?.() ?? {};\n const mergedConfig = { ...defaultConfig, ...command.config };\n\n // 4. Validate merged config\n const configValidation = workflow.validateConfig(mergedConfig);\n if (!configValidation.valid) {\n const errors = configValidation.errors\n .map((e) => `${e.stageId}: ${e.error}`)\n .join(\", \");\n throw new Error(`Invalid workflow config: ${errors}`);\n }\n\n // 5. Calculate priority\n const priority = command.priority ?? 5;\n\n // 6. Create the run record\n const run = await deps.persistence.createRun({\n workflowId: command.workflowId,\n workflowName: workflow.name,\n workflowType: command.workflowId,\n input: command.input,\n config: mergedConfig,\n priority,\n metadata: command.metadata,\n });\n\n return {\n workflowRunId: run.id,\n status: \"PENDING\" as const,\n _events: [\n {\n type: \"workflow:created\",\n timestamp: deps.clock.now(),\n workflowRunId: run.id,\n workflowId: command.workflowId,\n },\n ],\n };\n}\n","/**\n * Handler: run.rerunFrom\n *\n * Reruns a workflow from a specific stage. Deletes stage records and\n * blob artifacts at/after the target execution group, resets the run\n * to RUNNING, creates new stage records, and enqueues jobs.\n *\n * Works for both COMPLETED runs (rerun from any stage) and FAILED runs\n * (retry from the failed stage).\n */\n\nimport type { RunRerunFromCommand, RunRerunFromResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handleRunRerunFrom(\n command: RunRerunFromCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunRerunFromResult>> {\n const { workflowRunId, fromStageId } = command;\n const events: KernelEvent[] = [];\n\n // 1. Load run\n const run = await deps.persistence.getRun(workflowRunId);\n if (!run) throw new Error(`WorkflowRun ${workflowRunId} not found`);\n\n // 2. Validate run is in a rerunnable state\n if (run.status !== \"COMPLETED\" && run.status !== \"FAILED\") {\n throw new Error(\n `Cannot rerun workflow in ${run.status} state. Must be COMPLETED or FAILED.`,\n );\n }\n\n // 3. Load workflow definition\n const workflow = deps.registry.getWorkflow(run.workflowId);\n if (!workflow)\n throw new Error(`Workflow ${run.workflowId} not found in registry`);\n\n // 4. Validate stage exists in workflow\n const stageDef = workflow.getStage(fromStageId);\n if (!stageDef) {\n throw new Error(\n `Stage ${fromStageId} not found in workflow ${run.workflowId}`,\n );\n }\n\n // 5. Get the execution group of the target stage\n const targetGroup = workflow.getExecutionGroupIndex(fromStageId);\n\n // 6. Get all existing stage records\n const existingStages = await deps.persistence.getStagesByRun(workflowRunId);\n\n // 7. Validate: stages before the target group must have been executed\n if (targetGroup > 1) {\n const priorStages = existingStages.filter(\n (s) => s.executionGroup < targetGroup,\n );\n if (priorStages.length === 0) {\n throw new Error(\n `Cannot rerun from stage ${fromStageId}: previous stages have not been executed`,\n );\n }\n }\n\n // 8. Find stages to delete (at or after the target group)\n const stagesToDelete = existingStages.filter(\n (s) => s.executionGroup >= targetGroup,\n );\n const deletedStageIds = stagesToDelete.map((s) => s.stageId);\n\n // 9. Delete blob artifacts for stages being removed\n for (const stage of stagesToDelete) {\n const outputRef = stage.outputData as { _artifactKey?: string } | null;\n if (outputRef?._artifactKey) {\n await deps.blobStore.delete(outputRef._artifactKey).catch(() => {});\n }\n }\n\n // 10. Delete stage records\n for (const stage of stagesToDelete) {\n await deps.persistence.deleteStage(stage.id);\n }\n\n // 11. Reset run to RUNNING\n await deps.persistence.updateRun(workflowRunId, {\n status: \"RUNNING\",\n completedAt: null,\n });\n\n // 12. Create new stage records for the target execution group\n const targetStages = workflow.getStagesInExecutionGroup(targetGroup);\n for (const stage of targetStages) {\n await deps.persistence.createStage({\n workflowRunId,\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: workflow.getStageIndex(stage.id) + 1,\n executionGroup: targetGroup,\n status: \"PENDING\",\n config: (run.config as any)?.[stage.id] || {},\n });\n }\n\n // 13. Enqueue jobs\n await deps.jobTransport.enqueueParallel(\n targetStages.map((stage) => ({\n workflowRunId,\n workflowId: run.workflowId,\n stageId: stage.id,\n priority: run.priority,\n payload: { config: run.config || {} },\n })),\n );\n\n // 14. Emit workflow:started event (restarted)\n events.push({\n type: \"workflow:started\",\n timestamp: deps.clock.now(),\n workflowRunId,\n });\n\n return {\n workflowRunId,\n fromStageId,\n deletedStages: deletedStageIds,\n _events: events,\n };\n}\n","/**\n * Handler: run.transition\n *\n * Advances a workflow run to its next execution group, or marks it as\n * completed/failed depending on the current state of its stages.\n *\n * Extracted from WorkflowRuntime.transitionWorkflow() and completeWorkflow().\n */\n\nimport type { Workflow } from \"../../core/workflow\";\nimport type { RunTransitionCommand, RunTransitionResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\nimport type { WorkflowRunRecord } from \"../ports\";\n\n// ---------------------------------------------------------------------------\n// Terminal statuses -- a run in one of these states cannot be transitioned.\n// ---------------------------------------------------------------------------\n\nconst TERMINAL_STATUSES = new Set([\"COMPLETED\", \"FAILED\", \"CANCELLED\"]);\n\n// ---------------------------------------------------------------------------\n// Active statuses -- if any stage is in one of these states the run is still\n// in-flight and should not be transitioned yet.\n// ---------------------------------------------------------------------------\n\nconst ACTIVE_STATUSES = new Set([\"RUNNING\", \"PENDING\", \"SUSPENDED\"]);\n\n// ---------------------------------------------------------------------------\n// Helper: enqueue an execution group\n// ---------------------------------------------------------------------------\n\nasync function enqueueExecutionGroup(\n run: WorkflowRunRecord,\n workflow: Workflow<any, any>,\n groupIndex: number,\n deps: KernelDeps,\n): Promise<string[]> {\n const stages = workflow.getStagesInExecutionGroup(groupIndex);\n\n for (const stage of stages) {\n await deps.persistence.createStage({\n workflowRunId: run.id,\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: workflow.getStageIndex(stage.id) + 1,\n executionGroup: groupIndex,\n status: \"PENDING\",\n config: (run.config as any)?.[stage.id] || {},\n });\n }\n\n return deps.jobTransport.enqueueParallel(\n stages.map((stage) => ({\n workflowRunId: run.id,\n workflowId: run.workflowId,\n stageId: stage.id,\n priority: run.priority,\n payload: { config: run.config || {} },\n })),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleRunTransition(\n command: RunTransitionCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunTransitionResult>> {\n const events: KernelEvent[] = [];\n\n // 1. Get run from persistence\n const run = await deps.persistence.getRun(command.workflowRunId);\n if (!run) {\n return { action: \"noop\" as const, _events: [] };\n }\n\n // 2. If run is already in a terminal state, nothing to do\n if (TERMINAL_STATUSES.has(run.status)) {\n return { action: \"noop\" as const, _events: [] };\n }\n\n // 3. Get workflow definition from registry\n const workflow = deps.registry.getWorkflow(run.workflowId);\n if (!workflow) {\n return { action: \"noop\" as const, _events: [] };\n }\n\n // 4. Get all stages for this run\n const stages = await deps.persistence.getStagesByRun(command.workflowRunId);\n\n // 5. If no stages exist, this is the first transition -- enqueue group 1\n if (stages.length === 0) {\n await enqueueExecutionGroup(run, workflow, 1, deps);\n\n events.push({\n type: \"workflow:started\",\n timestamp: deps.clock.now(),\n workflowRunId: run.id,\n });\n\n return { action: \"advanced\" as const, nextGroup: 1, _events: events };\n }\n\n // 6. If any stage is still active, the run is in-flight -- noop\n const hasActive = stages.some((s) => ACTIVE_STATUSES.has(s.status));\n if (hasActive) {\n return { action: \"noop\" as const, _events: [] };\n }\n\n // 7. If any stage has failed, mark the entire run as failed\n const failedStage = stages.find((s) => s.status === \"FAILED\");\n if (failedStage) {\n await deps.persistence.updateRun(command.workflowRunId, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n });\n\n events.push({\n type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: command.workflowRunId,\n error: failedStage.errorMessage || \"Stage failed\",\n });\n\n return { action: \"failed\" as const, _events: events };\n }\n\n // 8. Find the maximum execution group among completed stages\n const maxGroup = stages.reduce(\n (max, s) => (s.executionGroup > max ? s.executionGroup : max),\n 0,\n );\n\n // 9. Get stages in the next execution group\n const nextGroupStages = workflow.getStagesInExecutionGroup(maxGroup + 1);\n\n // 10. If there are stages in the next group, enqueue them\n if (nextGroupStages.length > 0) {\n await enqueueExecutionGroup(run, workflow, maxGroup + 1, deps);\n return {\n action: \"advanced\" as const,\n nextGroup: maxGroup + 1,\n _events: events,\n };\n }\n\n // 11. No next group -- the workflow is complete\n let totalCost = 0;\n let totalTokens = 0;\n\n for (const stage of stages) {\n const metrics = stage.metrics as any;\n if (metrics) {\n totalCost += metrics.totalCost ?? 0;\n totalTokens += metrics.totalTokens ?? 0;\n }\n }\n\n const duration = deps.clock.now().getTime() - run.createdAt.getTime();\n\n await deps.persistence.updateRun(command.workflowRunId, {\n status: \"COMPLETED\",\n completedAt: deps.clock.now(),\n duration,\n totalCost,\n totalTokens,\n });\n\n events.push({\n type: \"workflow:completed\",\n timestamp: deps.clock.now(),\n workflowRunId: command.workflowRunId,\n duration,\n totalCost,\n totalTokens,\n });\n\n return { action: \"completed\" as const, _events: events };\n}\n","/**\n * Handler: stage.pollSuspended\n *\n * Polls suspended stages whose nextPollAt has passed, calls each stage's\n * checkCompletion() method, and either resumes (completes) or re-schedules\n * them for a future poll.\n *\n * Extracted from WorkflowRuntime.pollSuspendedStages() + checkAndResume().\n */\n\nimport type {\n StagePollSuspendedCommand,\n StagePollSuspendedResult,\n} from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport { createStorageShim, saveStageOutput } from \"../helpers/index.js\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleStagePollSuspended(\n command: StagePollSuspendedCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<StagePollSuspendedResult>> {\n const events: KernelEvent[] = [];\n const maxChecks = command.maxChecks ?? 50;\n\n // 1. Get suspended stages that are ready to be polled\n const suspendedStages = await deps.persistence.getSuspendedStages(\n deps.clock.now(),\n );\n\n // 2. Limit to maxChecks\n const stagesToCheck = suspendedStages.slice(0, maxChecks);\n\n let checked = 0;\n let resumed = 0;\n let failed = 0;\n const resumedWorkflowRunIds = new Set<string>();\n\n // 3. Process each suspended stage\n for (const stageRecord of stagesToCheck) {\n checked++;\n\n // 3a. Get workflow run\n const run = await deps.persistence.getRun(stageRecord.workflowRunId);\n if (!run) continue;\n\n // 3b. Get workflow from registry\n const workflow = deps.registry.getWorkflow(run.workflowId);\n if (!workflow) {\n await deps.persistence.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: `Workflow ${run.workflowId} not found in registry`,\n });\n failed++;\n\n events.push({\n type: \"stage:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n stageId: stageRecord.stageId,\n stageName: stageRecord.stageName,\n error: `Workflow ${run.workflowId} not found in registry`,\n });\n continue;\n }\n\n // 3c. Get stage definition\n const stageDef = workflow.getStage(stageRecord.stageId);\n if (!stageDef || !stageDef.checkCompletion) {\n const errorMsg = !stageDef\n ? `Stage ${stageRecord.stageId} not found in workflow ${run.workflowId}`\n : `Stage ${stageRecord.stageId} does not support checkCompletion`;\n\n await deps.persistence.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: errorMsg,\n });\n failed++;\n\n events.push({\n type: \"stage:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n stageId: stageRecord.stageId,\n stageName: stageRecord.stageName,\n error: errorMsg,\n });\n continue;\n }\n\n // 3d. Create storage shim\n const storage = createStorageShim(\n stageRecord.workflowRunId,\n run.workflowType,\n deps,\n );\n\n // 3e. Create log function\n const logFn = async (\n level: any,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n await deps.persistence\n .createLog({\n workflowRunId: stageRecord.workflowRunId,\n workflowStageId: stageRecord.id,\n level: level as any,\n message,\n metadata: meta,\n })\n .catch(() => {});\n };\n\n // 3f. Build check context\n const checkContext = {\n workflowRunId: run.id,\n stageId: stageRecord.stageId,\n stageRecordId: stageRecord.id,\n config: stageRecord.config || {},\n log: logFn,\n onLog: logFn,\n storage,\n };\n\n try {\n // 3g. Call checkCompletion\n const checkResult = await stageDef.checkCompletion(\n stageRecord.suspendedState as any,\n checkContext,\n );\n\n if (checkResult.error) {\n // Error during check -- fail the stage and the run\n await deps.persistence.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: checkResult.error,\n nextPollAt: null,\n });\n\n await deps.persistence.updateRun(stageRecord.workflowRunId, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n });\n\n failed++;\n\n events.push({\n type: \"stage:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n stageId: stageRecord.stageId,\n stageName: stageRecord.stageName,\n error: checkResult.error,\n });\n\n events.push({\n type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n error: checkResult.error,\n });\n } else if (checkResult.ready) {\n // Ready -- complete the stage (output is optional)\n let outputRef: { _artifactKey: string } | undefined;\n if (checkResult.output !== undefined) {\n let validatedOutput = checkResult.output;\n try {\n validatedOutput = stageDef.outputSchema.parse(checkResult.output);\n } catch {\n // Fall back to raw output on validation failure\n }\n\n const outputKey = await saveStageOutput(\n stageRecord.workflowRunId,\n run.workflowType,\n stageRecord.stageId,\n validatedOutput,\n deps,\n );\n outputRef = { _artifactKey: outputKey };\n }\n\n const duration =\n deps.clock.now().getTime() -\n (stageRecord.startedAt?.getTime() ?? deps.clock.now().getTime());\n\n await deps.persistence.updateStage(stageRecord.id, {\n status: \"COMPLETED\",\n completedAt: deps.clock.now(),\n duration,\n outputData: outputRef as any,\n nextPollAt: null,\n metrics: checkResult.metrics as any,\n embeddingInfo: checkResult.embeddings as any,\n });\n\n resumed++;\n resumedWorkflowRunIds.add(stageRecord.workflowRunId);\n\n events.push({\n type: \"stage:completed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n stageId: stageRecord.stageId,\n stageName: stageRecord.stageName,\n duration,\n });\n } else {\n // Not ready -- update nextPollAt for next check\n const pollInterval =\n checkResult.nextCheckIn ?? stageRecord.pollInterval ?? 60000;\n\n const nextPollAt = new Date(deps.clock.now().getTime() + pollInterval);\n\n await deps.persistence.updateStage(stageRecord.id, {\n nextPollAt,\n });\n }\n } catch (error) {\n // Unexpected error during checkCompletion\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n await deps.persistence.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage,\n nextPollAt: null,\n });\n\n await deps.persistence.updateRun(stageRecord.workflowRunId, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n });\n\n failed++;\n\n events.push({\n type: \"stage:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n stageId: stageRecord.stageId,\n stageName: stageRecord.stageName,\n error: errorMessage,\n });\n\n events.push({\n type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n error: errorMessage,\n });\n }\n }\n\n return {\n checked,\n resumed,\n failed,\n resumedWorkflowRunIds: [...resumedWorkflowRunIds],\n _events: events,\n };\n}\n","/**\n * Kernel Factory\n *\n * Creates a Kernel instance with a typed `dispatch` method that routes\n * commands to their corresponding handlers. Events are written to a\n * transactional outbox (not emitted directly). Use the `outbox.flush`\n * command to publish pending outbox events through EventSink.\n *\n * Most commands execute inside a single database transaction (handler\n * logic + outbox event writes). `job.execute` is the exception — it\n * uses a multi-phase transaction pattern so that long-running stage\n * execution does not hold a database connection open. See the handler\n * in `handlers/job-execute.ts` for details.\n *\n * Commands with idempotency keys are deduplicated: a replay returns the\n * cached result without re-executing the handler.\n */\n\nimport type { Workflow } from \"../core/workflow\";\nimport type { CreateOutboxEventInput } from \"../persistence/interface\";\nimport type {\n CommandResult,\n JobExecuteCommand,\n KernelCommand,\n LeaseReapStaleCommand,\n OutboxFlushCommand,\n PluginReplayDLQCommand,\n RunCancelCommand,\n RunClaimPendingCommand,\n RunCreateCommand,\n RunRerunFromCommand,\n RunTransitionCommand,\n StagePollSuspendedCommand,\n} from \"./commands\";\nimport { IdempotencyInProgressError } from \"./errors\";\nimport type { KernelEvent } from \"./events\";\nimport { handleJobExecute } from \"./handlers/job-execute\";\nimport { handleLeaseReapStale } from \"./handlers/lease-reap-stale\";\nimport { handleOutboxFlush } from \"./handlers/outbox-flush\";\nimport { handlePluginReplayDLQ } from \"./handlers/plugin-replay-dlq\";\nimport { handleRunCancel } from \"./handlers/run-cancel\";\nimport { handleRunClaimPending } from \"./handlers/run-claim-pending\";\nimport { handleRunCreate } from \"./handlers/run-create\";\nimport { handleRunRerunFrom } from \"./handlers/run-rerun-from\";\nimport { handleRunTransition } from \"./handlers/run-transition\";\nimport { handleStagePollSuspended } from \"./handlers/stage-poll-suspended\";\nimport type {\n BlobStore,\n Clock,\n EventSink,\n JobTransport,\n Persistence,\n Scheduler,\n} from \"./ports\";\n\n// ============================================================================\n// Public interfaces\n// ============================================================================\n\nexport interface WorkflowRegistry {\n getWorkflow(id: string): Workflow<any, any> | undefined;\n}\n\nexport interface KernelConfig {\n persistence: Persistence;\n blobStore: BlobStore;\n jobTransport: JobTransport;\n eventSink: EventSink;\n scheduler: Scheduler;\n clock: Clock;\n registry: WorkflowRegistry;\n}\n\nexport interface Kernel {\n dispatch<T extends KernelCommand>(command: T): Promise<CommandResult<T>>;\n}\n\n// ============================================================================\n// Shared dependency bundle passed to every handler\n// ============================================================================\n\nexport interface KernelDeps {\n persistence: Persistence;\n blobStore: BlobStore;\n jobTransport: JobTransport;\n eventSink: EventSink;\n scheduler: Scheduler;\n clock: Clock;\n registry: WorkflowRegistry;\n}\n\n// ============================================================================\n// Internal handler result type (includes _events for central emission)\n// ============================================================================\n\nexport type HandlerResult<T> = T & { _events: KernelEvent[] };\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Extract idempotency key from commands that carry one. */\nfunction getIdempotencyKey(command: KernelCommand): string | undefined {\n if (command.type === \"run.create\") return command.idempotencyKey;\n if (command.type === \"job.execute\") return command.idempotencyKey;\n return undefined;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createKernel(config: KernelConfig): Kernel {\n const {\n persistence,\n blobStore,\n jobTransport,\n eventSink,\n scheduler,\n clock,\n registry,\n } = config;\n\n const deps: KernelDeps = {\n persistence,\n blobStore,\n jobTransport,\n eventSink,\n scheduler,\n clock,\n registry,\n };\n\n async function dispatch<T extends KernelCommand>(\n command: T,\n ): Promise<CommandResult<T>> {\n // -----------------------------------------------------------------\n // outbox.flush routes directly — no outbox write, no idempotency\n // -----------------------------------------------------------------\n if (command.type === \"outbox.flush\") {\n const result = await handleOutboxFlush(\n command as OutboxFlushCommand,\n deps,\n );\n const { _events: _, ...publicResult } = result;\n return publicResult as CommandResult<T>;\n }\n\n // -----------------------------------------------------------------\n // plugin.replayDLQ routes directly — no outbox write, no idempotency\n // -----------------------------------------------------------------\n if (command.type === \"plugin.replayDLQ\") {\n const result = await handlePluginReplayDLQ(\n command as PluginReplayDLQCommand,\n deps,\n );\n const { _events: _, ...publicResult } = result;\n return publicResult as CommandResult<T>;\n }\n\n // -----------------------------------------------------------------\n // job.execute manages its own multi-phase transactions so that\n // RUNNING status is visible immediately and long-running stage\n // execution does not hold a database transaction open.\n // -----------------------------------------------------------------\n if (command.type === \"job.execute\") {\n const jobCommand = command as JobExecuteCommand;\n const jobIdempotencyKey = jobCommand.idempotencyKey;\n let jobIdempotencyAcquired = false;\n\n if (jobIdempotencyKey) {\n const acquired = await persistence.acquireIdempotencyKey(\n jobIdempotencyKey,\n command.type,\n );\n if (acquired.status === \"replay\") {\n return acquired.result as CommandResult<T>;\n }\n if (acquired.status === \"in_progress\") {\n throw new IdempotencyInProgressError(jobIdempotencyKey, command.type);\n }\n jobIdempotencyAcquired = true;\n }\n\n try {\n const result = await handleJobExecute(jobCommand, deps);\n const { _events: _, ...publicResult } = result;\n\n if (jobIdempotencyKey && jobIdempotencyAcquired) {\n await persistence.completeIdempotencyKey(\n jobIdempotencyKey,\n command.type,\n publicResult,\n );\n }\n\n return publicResult as CommandResult<T>;\n } catch (error) {\n if (jobIdempotencyKey && jobIdempotencyAcquired) {\n await persistence\n .releaseIdempotencyKey(jobIdempotencyKey, command.type)\n .catch(() => {});\n }\n throw error;\n }\n }\n\n // -----------------------------------------------------------------\n // Idempotency acquisition\n // -----------------------------------------------------------------\n const idempotencyKey = getIdempotencyKey(command);\n let idempotencyAcquired = false;\n\n if (idempotencyKey) {\n const acquired = await persistence.acquireIdempotencyKey(\n idempotencyKey,\n command.type,\n );\n\n if (acquired.status === \"replay\") {\n return acquired.result as CommandResult<T>;\n }\n if (acquired.status === \"in_progress\") {\n throw new IdempotencyInProgressError(idempotencyKey, command.type);\n }\n idempotencyAcquired = true;\n }\n\n try {\n // ---------------------------------------------------------------\n // Route to handler + append outbox events in one transaction\n // ---------------------------------------------------------------\n const publicResult = await persistence.withTransaction(async (tx) => {\n const txDeps: KernelDeps = { ...deps, persistence: tx };\n let result: HandlerResult<any>;\n\n switch (command.type) {\n case \"run.create\":\n result = await handleRunCreate(command as RunCreateCommand, txDeps);\n break;\n case \"run.claimPending\":\n result = await handleRunClaimPending(\n command as RunClaimPendingCommand,\n txDeps,\n );\n break;\n case \"run.transition\":\n result = await handleRunTransition(\n command as RunTransitionCommand,\n txDeps,\n );\n break;\n case \"run.cancel\":\n result = await handleRunCancel(command as RunCancelCommand, txDeps);\n break;\n case \"run.rerunFrom\":\n result = await handleRunRerunFrom(\n command as RunRerunFromCommand,\n txDeps,\n );\n break;\n case \"stage.pollSuspended\":\n result = await handleStagePollSuspended(\n command as StagePollSuspendedCommand,\n txDeps,\n );\n break;\n case \"lease.reapStale\":\n result = await handleLeaseReapStale(\n command as LeaseReapStaleCommand,\n txDeps,\n );\n break;\n default: {\n const _exhaustive: never = command;\n throw new Error(\n `Unknown command type: ${(_exhaustive as KernelCommand).type}`,\n );\n }\n }\n\n const events = result._events as KernelEvent[];\n if (events.length > 0) {\n const causationId = idempotencyKey ?? crypto.randomUUID();\n const outboxEvents: CreateOutboxEventInput[] = events.map(\n (event) => ({\n workflowRunId: event.workflowRunId,\n eventType: event.type,\n payload: event,\n causationId,\n occurredAt: event.timestamp,\n }),\n );\n await tx.appendOutboxEvents(outboxEvents);\n }\n\n const { _events: _, ...stripped } = result;\n return stripped as CommandResult<T>;\n });\n\n if (idempotencyKey && idempotencyAcquired) {\n await persistence.completeIdempotencyKey(\n idempotencyKey,\n command.type,\n publicResult,\n );\n }\n\n return publicResult;\n } catch (error) {\n if (idempotencyKey && idempotencyAcquired) {\n await persistence\n .releaseIdempotencyKey(idempotencyKey, command.type)\n .catch(() => {});\n }\n throw error;\n }\n }\n\n return { dispatch };\n}\n","/**\n * Plugin Runner\n *\n * A concrete EventSink implementation that routes kernel events\n * to registered plugin handlers. Used as the eventSink when the\n * consumer wants domain side-effects on workflow events.\n */\n\nimport type { KernelEvent, KernelEventType } from \"./events.js\";\nimport type { EventSink } from \"./ports.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PluginDefinition<T extends KernelEventType = KernelEventType> {\n readonly id: string;\n readonly name: string;\n readonly on: readonly T[];\n handle(event: Extract<KernelEvent, { type: T }>): Promise<void>;\n}\n\nexport interface PluginRunnerConfig {\n plugins: PluginDefinition[];\n /** Max retries before an event moves to DLQ (default: 3). */\n maxRetries?: number;\n}\n\nexport interface PluginRunner extends EventSink {\n /** Max retries before DLQ. Exposed so outbox.flush can read it. */\n readonly maxRetries: number;\n}\n\n// ============================================================================\n// definePlugin\n// ============================================================================\n\nexport function definePlugin<T extends KernelEventType>(\n definition: PluginDefinition<T>,\n): PluginDefinition<T> {\n return definition;\n}\n\n// ============================================================================\n// createPluginRunner\n// ============================================================================\n\nexport function createPluginRunner(config: PluginRunnerConfig): PluginRunner {\n const { plugins, maxRetries = 3 } = config;\n\n // Pre-index plugins by event type for O(1) lookup\n const handlersByType = new Map<string, PluginDefinition[]>();\n for (const plugin of plugins) {\n for (const eventType of plugin.on) {\n const existing = handlersByType.get(eventType) ?? [];\n existing.push(plugin as PluginDefinition);\n handlersByType.set(eventType, existing);\n }\n }\n\n return {\n maxRetries,\n\n async emit(event: KernelEvent): Promise<void> {\n const matching = handlersByType.get(event.type);\n if (!matching || matching.length === 0) return;\n\n for (const plugin of matching) {\n await plugin.handle(event as any);\n }\n },\n };\n}\n"]}