@bratsos/workflow-engine 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -13
- package/dist/{chunk-RZY5YRGL.js → chunk-2MWO6UVR.js} +2 -2
- package/dist/chunk-2MWO6UVR.js.map +1 -0
- package/dist/{chunk-PHLNTR5Z.js → chunk-DIADEUGZ.js} +21 -3
- package/dist/chunk-DIADEUGZ.js.map +1 -0
- package/dist/{chunk-ZYMT2PAO.js → chunk-HKGZ2WHJ.js} +2 -30
- package/dist/chunk-HKGZ2WHJ.js.map +1 -0
- package/dist/{chunk-3NEGRI4M.js → chunk-HOGDFLCG.js} +342 -114
- package/dist/chunk-HOGDFLCG.js.map +1 -0
- package/dist/{client-oLD5ilXp.d.ts → client-llB6XpHS.d.ts} +10 -81
- package/dist/client.d.ts +4 -3
- package/dist/client.js +1 -1
- package/dist/events-D_P24UaY.d.ts +105 -0
- package/dist/{index-CVkkGnxx.d.ts → index-sGgV8JNu.d.ts} +5 -1
- package/dist/index.d.ts +184 -32
- package/dist/index.js +41 -9
- package/dist/index.js.map +1 -1
- package/dist/{interface-TsryH4d7.d.ts → interface-DCdddCe0.d.ts} +7 -2
- package/dist/kernel/index.d.ts +6 -5
- package/dist/kernel/index.js +2 -1
- package/dist/kernel/testing/index.d.ts +3 -2
- package/dist/persistence/index.d.ts +2 -2
- package/dist/persistence/index.js +2 -2
- package/dist/persistence/prisma/index.d.ts +2 -2
- package/dist/persistence/prisma/index.js +2 -2
- package/dist/{plugins-DW266bhT.d.ts → plugins-Oyo_iu0l.d.ts} +16 -10
- package/dist/{ports-855bktyD.d.ts → ports-ChGnJcn2.d.ts} +5 -106
- package/dist/{stage-BPw7m9Wx.d.ts → stage-_7BKqqUG.d.ts} +2 -2
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.js +23 -5
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/workflow-engine/SKILL.md +31 -12
- package/skills/workflow-engine/references/02-workflow-builder.md +2 -0
- package/skills/workflow-engine/references/03-runtime-setup.md +1 -1
- package/skills/workflow-engine/references/08-common-patterns.md +17 -3
- package/skills/workflow-engine/references/09-troubleshooting.md +12 -3
- package/dist/chunk-3NEGRI4M.js.map +0 -1
- package/dist/chunk-PHLNTR5Z.js.map +0 -1
- package/dist/chunk-RZY5YRGL.js.map +0 -1
- package/dist/chunk-ZYMT2PAO.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
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/helpers/resolve-execution-group-output.ts","../src/kernel/helpers/save-stage-artifacts.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-reap-stuck.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","toOutboxEvents"],"mappings":"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","file":"chunk-HOGDFLCG.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 * Resolve the output of an execution group from the workflow context.\n *\n * - Single-stage group → returns that stage's output directly.\n * - Multi-stage (parallel) group → returns an object keyed by stage ID.\n */\n\nimport type { Workflow } from \"../../core/workflow.js\";\n\nexport function resolveExecutionGroupOutput(\n workflow: Workflow<any, any>,\n groupIndex: number,\n workflowContext: Record<string, unknown>,\n): unknown {\n const stages = workflow.getStagesInExecutionGroup(groupIndex);\n\n if (stages.length === 0) return undefined;\n\n if (stages.length === 1) {\n return workflowContext[stages[0].id];\n }\n\n // Parallel group → merge outputs keyed by stage ID\n const merged: Record<string, unknown> = {};\n for (const stage of stages) {\n if (workflowContext[stage.id] !== undefined) {\n merged[stage.id] = workflowContext[stage.id];\n }\n }\n return merged;\n}\n","/**\n * Save stage artifacts to BlobStore using deterministic per-stage keys.\n */\n\nimport type { KernelDeps } from \"../kernel.js\";\n\nexport async function saveStageArtifacts(\n runId: string,\n workflowType: string,\n stageId: string,\n artifacts: Record<string, unknown>,\n deps: KernelDeps,\n): Promise<Record<string, string>> {\n const artifactKeys: Record<string, string> = {};\n\n for (const [artifactName, artifact] of Object.entries(artifacts)) {\n const encodedName = encodeURIComponent(artifactName);\n const key = `workflow-v2/${workflowType}/${runId}/${stageId}/artifacts/${encodedName}.json`;\n await deps.blobStore.put(key, artifact);\n artifactKeys[artifactName] = key;\n }\n\n return artifactKeys;\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 resolveExecutionGroupOutput,\n saveStageArtifacts,\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 // First execution group always uses workflow input\n if (groupIndex <= 1) return workflowRun.input;\n\n // Resolve the previous execution group's output.\n // For single-stage groups this returns that stage's output directly.\n // For parallel groups this returns an object keyed by stage ID.\n const prevOutput = resolveExecutionGroupOutput(\n workflow,\n groupIndex - 1,\n workflowContext,\n );\n\n return prevOutput ?? 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 // Guard against ghost jobs — only execute if run is actively RUNNING\n if (workflowRun.status !== \"RUNNING\") {\n return {\n outcome: \"failed\" as const,\n ghost: true,\n error: `Run ${workflowRunId} is ${workflowRun.status}, expected RUNNING — ghost job discarded`,\n _events: [],\n };\n }\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 // Re-check run status — the run may have been cancelled during execution\n const currentRunStatus = await deps.persistence.getRunStatus(workflowRunId);\n if (currentRunStatus !== \"RUNNING\") {\n return {\n outcome: \"failed\" as const,\n ghost: true,\n error: `Run ${workflowRunId} was ${currentRunStatus} after stage execution — result discarded`,\n _events: [],\n };\n }\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 const artifactKeys =\n result.artifacts && Object.keys(result.artifacts).length > 0\n ? await saveStageArtifacts(\n workflowRunId,\n workflowRun.workflowType,\n stageId,\n result.artifacts,\n deps,\n )\n : undefined;\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: {\n _artifactKey: outputKey,\n ...(artifactKeys ? { _artifactKeys: artifactKeys } : {}),\n } 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 authoritatively:\n * 1. Marks the run as CANCELLED\n * 2. Marks all non-terminal stages as CANCELLED\n * 3. Cancels queued/suspended jobs via job transport\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 // 1. Mark run as CANCELLED\n await deps.persistence.updateRun(command.workflowRunId, {\n status: \"CANCELLED\",\n completedAt: deps.clock.now(),\n });\n\n // 2. Mark all non-terminal stages as CANCELLED\n const stages = await deps.persistence.getStagesByRun(command.workflowRunId);\n for (const stage of stages) {\n if (!TERMINAL_STATUSES.has(stage.status)) {\n await deps.persistence.updateStage(stage.id, {\n status: \"CANCELLED\",\n completedAt: deps.clock.now(),\n nextPollAt: null,\n });\n }\n }\n\n // 3. Cancel queued/suspended jobs\n await deps.jobTransport.cancelByRun(command.workflowRunId);\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 try {\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 // Upsert stage records (idempotent — handles orphaned stages from previous failed claims)\n const stagesToEnqueue: typeof stages = [];\n for (const stage of stages) {\n const record = await deps.persistence.upsertStage({\n workflowRunId: run.id,\n stageId: stage.id,\n create: {\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 update: {},\n });\n if (record.status === \"PENDING\") {\n stagesToEnqueue.push(stage);\n }\n }\n\n // Enqueue jobs only for stages that are PENDING (skip RUNNING/COMPLETED/SUSPENDED)\n const jobIds =\n stagesToEnqueue.length > 0\n ? await deps.jobTransport.enqueueParallel(\n stagesToEnqueue.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 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 } catch (err) {\n const error =\n err instanceof Error ? err.message : \"Unknown error during claim\";\n const failedAt = deps.clock.now();\n await deps.persistence\n .updateRun(run.id, {\n status: \"FAILED\",\n completedAt: failedAt,\n output: {\n error: {\n code: \"CLAIM_FAILED\",\n message: error,\n workerId: command.workerId,\n },\n },\n })\n .catch(() => {});\n await deps.persistence\n .createLog({\n workflowRunId: run.id,\n level: \"ERROR\",\n message: error,\n metadata: {\n workerId: command.workerId,\n code: \"CLAIM_FAILED\",\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\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","import type { RunReapStuckCommand, RunReapStuckResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport type { HandlerResult, KernelDeps } from \"../kernel\";\n\nexport async function handleRunReapStuck(\n command: RunReapStuckCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<RunReapStuckResult>> {\n const events: KernelEvent[] = [];\n const stuckSince = new Date(\n deps.clock.now().getTime() - command.stuckThresholdMs,\n );\n\n const stuckRuns = await deps.persistence.getStuckRuns(stuckSince);\n let failed = 0;\n\n for (const run of stuckRuns) {\n const stages = await deps.persistence.getStagesByRun(run.id);\n\n // Status guard: only update if run is still RUNNING to avoid\n // overwriting a run that recovered between query and update.\n const currentStatus = await deps.persistence.getRunStatus(run.id);\n if (currentStatus !== \"RUNNING\") {\n continue;\n }\n\n await deps.persistence.updateRun(run.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n output: {\n error: {\n code: \"STUCK_RUN_REAPED\",\n message: `Run stuck for >${command.stuckThresholdMs}ms with no activity`,\n stageStatuses: stages.map((s) => ({\n stageId: s.stageId,\n status: s.status,\n })),\n },\n },\n });\n\n events.push({\n type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: run.id,\n error: `Stuck run reaped after ${command.stuckThresholdMs}ms inactivity`,\n });\n\n failed++;\n }\n\n return { transitioned: 0, failed, _events: events };\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 (full prefix cleanup)\n for (const stage of stagesToDelete) {\n const prefix = `workflow-v2/${run.workflowType}/${workflowRunId}/${stage.stageId}/`;\n const keys = await deps.blobStore.list(prefix).catch(() => [] as string[]);\n for (const key of keys) {\n await deps.blobStore.delete(key).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 startedAt: deps.clock.now(),\n completedAt: null,\n duration: null,\n output: null,\n totalCost: 0,\n totalTokens: 0,\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 { StaleVersionError } from \"../../persistence/interface.js\";\nimport type { RunTransitionCommand, RunTransitionResult } from \"../commands\";\nimport type { KernelEvent } from \"../events\";\nimport {\n loadWorkflowContext,\n resolveExecutionGroupOutput,\n} from \"../helpers/index.js\";\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 claimRunTransition(\n run: WorkflowRunRecord,\n deps: KernelDeps,\n): Promise<boolean> {\n try {\n await deps.persistence.updateRun(run.id, {\n expectedVersion: run.version,\n });\n return true;\n } catch (error) {\n if (error instanceof StaleVersionError) {\n return false;\n }\n throw error;\n }\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 const stagesToEnqueue: typeof stages = [];\n for (const stage of stages) {\n const record = await deps.persistence.upsertStage({\n workflowRunId: run.id,\n stageId: stage.id,\n create: {\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 update: {},\n });\n if (record.status === \"PENDING\") {\n stagesToEnqueue.push(stage);\n }\n }\n\n if (stagesToEnqueue.length === 0) return [];\n\n return deps.jobTransport.enqueueParallel(\n stagesToEnqueue.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 if (!(await claimRunTransition(run, deps))) {\n return { action: \"noop\" as const, _events: [] };\n }\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 if (!(await claimRunTransition(run, deps))) {\n return { action: \"noop\" as const, _events: [] };\n }\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 if (!(await claimRunTransition(run, deps))) {\n return { action: \"noop\" as const, _events: [] };\n }\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 // Resolve the final execution group's output for persistence\n const workflowContext = await loadWorkflowContext(\n command.workflowRunId,\n deps,\n );\n const output = resolveExecutionGroupOutput(\n workflow,\n maxGroup,\n workflowContext,\n );\n\n if (!(await claimRunTransition(run, deps))) {\n return { action: \"noop\" as const, _events: [] };\n }\n\n await deps.persistence.updateRun(command.workflowRunId, {\n status: \"COMPLETED\",\n completedAt: deps.clock.now(),\n duration,\n output,\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 output,\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 * Uses a multi-phase pattern per stage so that checkCompletion() — which\n * typically makes external HTTP calls to batch providers — runs outside\n * any database transaction:\n *\n * Phase 1 (no transaction): Call checkCompletion() — external I/O\n * Phase 2 (transaction): Persist results + append outbox events\n *\n * This avoids Prisma P2028 interactive-transaction timeout errors when\n * batch provider APIs are slow to respond.\n */\n\nimport {\n type CreateOutboxEventInput,\n StaleVersionError,\n} from \"../../persistence/interface\";\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// Helper: build outbox event inputs from kernel events\n// ---------------------------------------------------------------------------\n\nfunction toOutboxEvents(\n workflowRunId: string,\n events: KernelEvent[],\n): CreateOutboxEventInput[] {\n const causationId = crypto.randomUUID();\n return events.map((event) => ({\n workflowRunId,\n eventType: event.type,\n payload: event,\n causationId,\n occurredAt: event.timestamp,\n }));\n}\n\nasync function markStageCancelled(\n stageId: string,\n deps: KernelDeps,\n): Promise<void> {\n await deps.persistence.updateStage(stageId, {\n status: \"CANCELLED\",\n completedAt: deps.clock.now(),\n nextPollAt: null,\n });\n}\n\nasync function withClaimedRun<T>(\n workflowRunId: string,\n expectedVersion: number,\n deps: KernelDeps,\n fn: (tx: KernelDeps[\"persistence\"]) => Promise<T>,\n): Promise<{ status: \"claimed\"; value: T } | { status: \"stale\" }> {\n try {\n const value = await deps.persistence.withTransaction(async (tx) => {\n await tx.updateRun(workflowRunId, {\n expectedVersion,\n });\n return fn(tx);\n });\n return { status: \"claimed\", value };\n } catch (error) {\n if (error instanceof StaleVersionError) {\n return { status: \"stale\" };\n }\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Handler\n// ---------------------------------------------------------------------------\n\nexport async function handleStagePollSuspended(\n command: StagePollSuspendedCommand,\n deps: KernelDeps,\n): Promise<HandlerResult<StagePollSuspendedResult>> {\n const maxChecks = command.maxChecks ?? 50;\n\n // 1. Get suspended stages that are ready to be polled (no transaction)\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 (no transaction — read-only lookup)\n const run = await deps.persistence.getRun(stageRecord.workflowRunId);\n if (!run) continue;\n\n // 3a.1 Skip cancelled runs — mark the suspended stage as cancelled\n if (run.status === \"CANCELLED\") {\n await markStageCancelled(stageRecord.id, deps);\n continue;\n }\n\n // 3b. Get workflow from registry\n const workflow = deps.registry.getWorkflow(run.workflowId);\n if (!workflow) {\n await deps.persistence.withTransaction(async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: `Workflow ${run.workflowId} not found in registry`,\n });\n await tx.appendOutboxEvents(\n toOutboxEvents(stageRecord.workflowRunId, [\n {\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 ]),\n );\n });\n failed++;\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.withTransaction(async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: errorMsg,\n });\n await tx.appendOutboxEvents(\n toOutboxEvents(stageRecord.workflowRunId, [\n {\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 ]),\n );\n });\n failed++;\n continue;\n }\n\n // 3d. Create storage shim and log function (uses non-transactional deps)\n const storage = createStorageShim(\n stageRecord.workflowRunId,\n run.workflowType,\n deps,\n );\n\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 // 3e. 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 // ── Phase 1: checkCompletion (no transaction) ──────────────────\n // External HTTP calls happen here — no DB connection held open.\n const checkResult = await stageDef.checkCompletion(\n stageRecord.suspendedState as any,\n checkContext,\n );\n\n // ── Phase 2: persist results (transaction) ─────────────────────\n if (checkResult.error) {\n const claimResult = await withClaimedRun(\n stageRecord.workflowRunId,\n run.version,\n deps,\n async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage: checkResult.error,\n nextPollAt: null,\n });\n\n await tx.updateRun(stageRecord.workflowRunId, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n });\n\n await tx.appendOutboxEvents(\n toOutboxEvents(stageRecord.workflowRunId, [\n {\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 type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n error: checkResult.error!,\n },\n ]),\n );\n },\n );\n\n if (claimResult.status === \"stale\") {\n const latestStatus = await deps.persistence.getRunStatus(\n stageRecord.workflowRunId,\n );\n if (latestStatus === \"CANCELLED\") {\n await markStageCancelled(stageRecord.id, deps);\n }\n continue;\n }\n\n failed++;\n } else if (checkResult.ready) {\n // Save output to blob store (not a DB operation)\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 const claimResult = await withClaimedRun(\n stageRecord.workflowRunId,\n run.version,\n deps,\n async (tx) => {\n await tx.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 await tx.appendOutboxEvents(\n toOutboxEvents(stageRecord.workflowRunId, [\n {\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 ]),\n );\n },\n );\n\n if (claimResult.status === \"stale\") {\n const latestStatus = await deps.persistence.getRunStatus(\n stageRecord.workflowRunId,\n );\n if (latestStatus === \"CANCELLED\") {\n await markStageCancelled(stageRecord.id, deps);\n }\n continue;\n }\n\n resumed++;\n resumedWorkflowRunIds.add(stageRecord.workflowRunId);\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 const claimResult = await withClaimedRun(\n stageRecord.workflowRunId,\n run.version,\n deps,\n async (tx) => {\n await tx.updateStage(stageRecord.id, {\n nextPollAt,\n });\n },\n );\n\n if (claimResult.status === \"stale\") {\n const latestStatus = await deps.persistence.getRunStatus(\n stageRecord.workflowRunId,\n );\n if (latestStatus === \"CANCELLED\") {\n await markStageCancelled(stageRecord.id, deps);\n }\n continue;\n }\n }\n } catch (error) {\n // Unexpected error during checkCompletion\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n const claimResult = await withClaimedRun(\n stageRecord.workflowRunId,\n run.version,\n deps,\n async (tx) => {\n await tx.updateStage(stageRecord.id, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n errorMessage,\n nextPollAt: null,\n });\n\n await tx.updateRun(stageRecord.workflowRunId, {\n status: \"FAILED\",\n completedAt: deps.clock.now(),\n });\n\n await tx.appendOutboxEvents(\n toOutboxEvents(stageRecord.workflowRunId, [\n {\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 type: \"workflow:failed\",\n timestamp: deps.clock.now(),\n workflowRunId: stageRecord.workflowRunId,\n error: errorMessage,\n },\n ]),\n );\n },\n );\n\n if (claimResult.status === \"stale\") {\n const latestStatus = await deps.persistence.getRunStatus(\n stageRecord.workflowRunId,\n );\n if (latestStatus === \"CANCELLED\") {\n await markStageCancelled(stageRecord.id, deps);\n }\n continue;\n }\n\n failed++;\n }\n }\n\n // Events are written directly to outbox per-stage above, so _events is empty\n return {\n checked,\n resumed,\n failed,\n resumedWorkflowRunIds: [...resumedWorkflowRunIds],\n _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). Two exceptions manage their own\n * transactions to avoid holding connections during external I/O:\n *\n * - `job.execute` — multi-phase pattern (see `handlers/job-execute.ts`)\n * - `stage.pollSuspended` — per-stage transactions so that\n * checkCompletion() HTTP calls run outside any transaction\n * (see `handlers/stage-poll-suspended.ts`)\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 RunReapStuckCommand,\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 { handleRunReapStuck } from \"./handlers/run-reap-stuck\";\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 // stage.pollSuspended manages its own per-stage transactions so\n // that checkCompletion() (which makes external HTTP calls) does\n // not hold a database transaction open.\n // -----------------------------------------------------------------\n if (command.type === \"stage.pollSuspended\") {\n const result = await handleStagePollSuspended(\n command as StagePollSuspendedCommand,\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 \"lease.reapStale\":\n result = await handleLeaseReapStale(\n command as LeaseReapStaleCommand,\n txDeps,\n );\n break;\n case \"run.reapStuck\":\n result = await handleRunReapStuck(\n command as RunReapStuckCommand,\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"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { EmbeddingModelV3 } from '@ai-sdk/provider';
|
|
2
2
|
import { ToolSet, generateText, StepResult, streamText } from 'ai';
|
|
3
3
|
import z$1, { z } from 'zod';
|
|
4
|
-
import { A as AICallLogger } from './interface-
|
|
5
|
-
import { b as StageContext, c as SuspendedStateSchema, C as CheckCompletionContext, d as CompletionCheckResult, S as Stage } from './stage-
|
|
4
|
+
import { A as AICallLogger } from './interface-DCdddCe0.js';
|
|
5
|
+
import { b as StageContext, c as SuspendedStateSchema, C as CheckCompletionContext, d as CompletionCheckResult, S as Stage } from './stage-_7BKqqUG.js';
|
|
6
|
+
import './events-D_P24UaY.js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Schema Helpers and Utilities
|
|
@@ -152,9 +153,9 @@ interface SimpleSuspendedResult {
|
|
|
152
153
|
/**
|
|
153
154
|
* Sync stage definition
|
|
154
155
|
*/
|
|
155
|
-
interface SyncStageDefinition<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown
|
|
156
|
+
interface SyncStageDefinition<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>, TId extends string = string> {
|
|
156
157
|
/** Unique stage identifier */
|
|
157
|
-
id:
|
|
158
|
+
id: TId;
|
|
158
159
|
/** Human-readable name */
|
|
159
160
|
name: string;
|
|
160
161
|
/** Optional description */
|
|
@@ -183,7 +184,7 @@ interface SyncStageDefinition<TInput extends z.ZodTypeAny | "none", TOutput exte
|
|
|
183
184
|
/**
|
|
184
185
|
* Async-batch stage definition (for long-running batch jobs)
|
|
185
186
|
*/
|
|
186
|
-
interface AsyncBatchStageDefinition<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown
|
|
187
|
+
interface AsyncBatchStageDefinition<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>, TId extends string = string> extends Omit<SyncStageDefinition<TInput, TOutput, TConfig, TContext, TId>, "execute"> {
|
|
187
188
|
/** Mark as async-batch mode */
|
|
188
189
|
mode: "async-batch";
|
|
189
190
|
/**
|
|
@@ -207,18 +208,18 @@ interface AsyncBatchStageDefinition<TInput extends z.ZodTypeAny | "none", TOutpu
|
|
|
207
208
|
/**
|
|
208
209
|
* Define a sync stage with simplified API
|
|
209
210
|
*/
|
|
210
|
-
declare function defineStage<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: SyncStageDefinition<TInput, TOutput, TConfig, TContext>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext>;
|
|
211
|
+
declare function defineStage<TId extends string, TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: SyncStageDefinition<TInput, TOutput, TConfig, TContext, TId>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext, TId>;
|
|
211
212
|
/**
|
|
212
213
|
* Define an async-batch stage with simplified API
|
|
213
214
|
*/
|
|
214
|
-
declare function defineStage<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: AsyncBatchStageDefinition<TInput, TOutput, TConfig, TContext>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext>;
|
|
215
|
+
declare function defineStage<TId extends string, TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: AsyncBatchStageDefinition<TInput, TOutput, TConfig, TContext, TId>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext, TId>;
|
|
215
216
|
/**
|
|
216
217
|
* Define an async-batch stage with proper type inference for checkCompletion
|
|
217
218
|
*
|
|
218
219
|
* This is a dedicated function (not an alias) to ensure TypeScript properly
|
|
219
220
|
* infers callback parameter types without overload resolution ambiguity.
|
|
220
221
|
*/
|
|
221
|
-
declare function defineAsyncBatchStage<TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: AsyncBatchStageDefinition<TInput, TOutput, TConfig, TContext>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext>;
|
|
222
|
+
declare function defineAsyncBatchStage<TId extends string, TInput extends z.ZodTypeAny | "none", TOutput extends z.ZodTypeAny, TConfig extends z.ZodTypeAny, TContext extends Record<string, unknown> = Record<string, unknown>>(definition: AsyncBatchStageDefinition<TInput, TOutput, TConfig, TContext, TId>): Stage<TInput extends "none" ? typeof NoInputSchema : TInput, TOutput, TConfig, TContext, TId>;
|
|
222
223
|
|
|
223
224
|
/**
|
|
224
225
|
* Model Helper - Centralized model selection and cost tracking for AI scripts
|
|
@@ -389,21 +390,6 @@ declare class ModelStatsTracker {
|
|
|
389
390
|
* Perfect for parallel execution where different calls use different models
|
|
390
391
|
*/
|
|
391
392
|
static createAggregating(): ModelStatsTracker;
|
|
392
|
-
/**
|
|
393
|
-
* Get the model ID for use with AI SDK
|
|
394
|
-
* @deprecated Use getModelById(modelKey).id instead for parallel execution
|
|
395
|
-
*/
|
|
396
|
-
getModelId(): string;
|
|
397
|
-
/**
|
|
398
|
-
* Get the model configuration
|
|
399
|
-
* @deprecated Use getModelById(modelKey) instead for parallel execution
|
|
400
|
-
*/
|
|
401
|
-
getModelConfig(): ModelConfig;
|
|
402
|
-
/**
|
|
403
|
-
* Switch model (useful for sequential model switching)
|
|
404
|
-
* @deprecated For parallel execution, pass model key to recordCall() instead
|
|
405
|
-
*/
|
|
406
|
-
switchModel(modelKey: ModelKey): void;
|
|
407
393
|
/**
|
|
408
394
|
* Get a model helper with bound recordCall for parallel execution
|
|
409
395
|
* Perfect for running multiple AI calls in parallel with different models
|
|
@@ -757,61 +743,4 @@ interface AIHelper {
|
|
|
757
743
|
*/
|
|
758
744
|
declare function createAIHelper(topic: string, logger: AICallLogger, logContext?: LogContext): AIHelper;
|
|
759
745
|
|
|
760
|
-
|
|
761
|
-
* Workflow Event Types for SSE Streaming
|
|
762
|
-
*
|
|
763
|
-
* This file contains ONLY types and interfaces for workflow events.
|
|
764
|
-
* It is safe to use in both client and server environments.
|
|
765
|
-
*/
|
|
766
|
-
interface WorkflowSSEEvent {
|
|
767
|
-
type: WorkflowEventType;
|
|
768
|
-
workflowRunId: string;
|
|
769
|
-
timestamp: Date;
|
|
770
|
-
data: Record<string, unknown>;
|
|
771
|
-
}
|
|
772
|
-
type WorkflowEventType = "connected" | "workflow:started" | "workflow:completed" | "workflow:suspended" | "workflow:cancelled" | "workflow:failed" | "stage:started" | "stage:progress" | "stage:completed" | "stage:suspended" | "stage:failed" | "log";
|
|
773
|
-
interface WorkflowStartedPayload {
|
|
774
|
-
workflowRunId: string;
|
|
775
|
-
workflowName: string;
|
|
776
|
-
}
|
|
777
|
-
interface WorkflowCompletedPayload {
|
|
778
|
-
workflowRunId: string;
|
|
779
|
-
output: unknown;
|
|
780
|
-
duration?: number;
|
|
781
|
-
totalCost?: number;
|
|
782
|
-
totalTokens?: number;
|
|
783
|
-
}
|
|
784
|
-
interface WorkflowSuspendedPayload {
|
|
785
|
-
workflowRunId: string;
|
|
786
|
-
stageId: string;
|
|
787
|
-
}
|
|
788
|
-
interface WorkflowFailedPayload {
|
|
789
|
-
workflowRunId: string;
|
|
790
|
-
error: string;
|
|
791
|
-
}
|
|
792
|
-
interface StageStartedPayload {
|
|
793
|
-
stageId: string;
|
|
794
|
-
stageName: string;
|
|
795
|
-
stageNumber: number;
|
|
796
|
-
}
|
|
797
|
-
interface StageCompletedPayload {
|
|
798
|
-
stageId: string;
|
|
799
|
-
stageName: string;
|
|
800
|
-
duration: number;
|
|
801
|
-
cost?: number;
|
|
802
|
-
inputTokens?: number;
|
|
803
|
-
outputTokens?: number;
|
|
804
|
-
outputCount?: number;
|
|
805
|
-
}
|
|
806
|
-
interface StageFailedPayload {
|
|
807
|
-
stageId: string;
|
|
808
|
-
stageName: string;
|
|
809
|
-
error: string;
|
|
810
|
-
}
|
|
811
|
-
interface LogPayload {
|
|
812
|
-
level: string;
|
|
813
|
-
message: string;
|
|
814
|
-
meta?: Record<string, unknown>;
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
export { type StageStartedPayload as $, type AIBatch as A, type BatchLogFn as B, getModel as C, DEFAULT_MODEL_KEY as D, type EmbedOptions as E, getModelById as F, getRegisteredModel as G, listModels as H, type InferInput as I, listRegisteredModels as J, modelSupportsBatch as K, type LogContext as L, ModelKey as M, NoInputSchema as N, type ObjectOptions as O, printAvailableModels as P, registerEmbeddingProvider as Q, type RecordCallParams as R, type SimpleStageResult as S, type TextOptions as T, registerModels as U, requireStageOutput as V, type WorkflowEventType as W, type LogPayload as X, type ModelFilter as Y, type StageCompletedPayload as Z, type StageFailedPayload as _, type AIBatchHandle as a, type WorkflowCompletedPayload as a0, type WorkflowFailedPayload as a1, type WorkflowStartedPayload as a2, type WorkflowSuspendedPayload as a3, type AIBatchProvider as b, type AIBatchRequest as c, type AIBatchResult as d, type AICallType as e, type AIEmbedResult as f, type AIHelper as g, type AIObjectResult as h, type AIStreamResult as i, type AITextResult as j, AVAILABLE_MODELS as k, type AsyncBatchStageDefinition as l, type EnhancedStageContext as m, type ModelConfig as n, type ModelRegistry as o, type ModelStats as p, ModelStatsTracker as q, type ModelSyncConfig as r, type StreamOptions as s, type SyncStageDefinition as t, type WorkflowSSEEvent as u, calculateCost as v, createAIHelper as w, defineAsyncBatchStage as x, defineStage as y, getDefaultModel as z };
|
|
746
|
+
export { type AIBatch as A, type BatchLogFn as B, getModelById as C, DEFAULT_MODEL_KEY as D, type EmbedOptions as E, getRegisteredModel as F, listModels as G, listRegisteredModels as H, type InferInput as I, modelSupportsBatch as J, printAvailableModels as K, type LogContext as L, ModelKey as M, NoInputSchema as N, type ObjectOptions as O, registerEmbeddingProvider as P, registerModels as Q, type RecordCallParams as R, type SimpleStageResult as S, type TextOptions as T, requireStageOutput as U, type ModelFilter as V, type AIBatchHandle as a, type AIBatchProvider as b, type AIBatchRequest as c, type AIBatchResult as d, type AICallType as e, type AIEmbedResult as f, type AIHelper as g, type AIObjectResult as h, type AIStreamResult as i, type AITextResult as j, AVAILABLE_MODELS as k, type AsyncBatchStageDefinition as l, type EnhancedStageContext as m, type ModelConfig as n, type ModelRegistry as o, type ModelStats as p, ModelStatsTracker as q, type ModelSyncConfig as r, type StreamOptions as s, type SyncStageDefinition as t, calculateCost as u, createAIHelper as v, defineAsyncBatchStage as w, defineStage as x, getDefaultModel as y, getModel as z };
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { g as AIHelper, k as AVAILABLE_MODELS, l as AsyncBatchStageDefinition, D as DEFAULT_MODEL_KEY, m as EnhancedStageContext, I as InferInput,
|
|
1
|
+
export { g as AIHelper, k as AVAILABLE_MODELS, l as AsyncBatchStageDefinition, D as DEFAULT_MODEL_KEY, m as EnhancedStageContext, I as InferInput, n as ModelConfig, V as ModelFilter, M as ModelKey, o as ModelRegistry, N as NoInputSchema, S as SimpleStageResult, t as SyncStageDefinition, u as calculateCost, w as defineAsyncBatchStage, x as defineStage, G as listModels, J as modelSupportsBatch, Q as registerModels } from './client-llB6XpHS.js';
|
|
2
|
+
export { K as KernelEvent, a as KernelEventType, S as StageCompletedEvent, b as StageFailedEvent, c as StageProgressEvent, d as StageStartedEvent, e as StageSuspendedEvent, W as WorkflowCancelledEvent, f as WorkflowCompletedEvent, g as WorkflowCreatedEvent, h as WorkflowFailedEvent, i as WorkflowStartedEvent, j as WorkflowSuspendedEvent } from './events-D_P24UaY.js';
|
|
2
3
|
import '@ai-sdk/provider';
|
|
3
4
|
import 'ai';
|
|
4
5
|
import 'zod';
|
|
5
|
-
import './interface-
|
|
6
|
-
import './stage-
|
|
6
|
+
import './interface-DCdddCe0.js';
|
|
7
|
+
import './stage-_7BKqqUG.js';
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AVAILABLE_MODELS, DEFAULT_MODEL_KEY, ModelKey, NoInputSchema, calculateCost, defineAsyncBatchStage, defineStage, listModels, modelSupportsBatch, registerModels } from './chunk-
|
|
1
|
+
export { AVAILABLE_MODELS, DEFAULT_MODEL_KEY, ModelKey, NoInputSchema, calculateCost, defineAsyncBatchStage, defineStage, listModels, modelSupportsBatch, registerModels } from './chunk-HKGZ2WHJ.js';
|
|
2
2
|
import './chunk-MUWP5SF2.js';
|
|
3
3
|
//# sourceMappingURL=client.js.map
|
|
4
4
|
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kernel Event Types
|
|
3
|
+
*
|
|
4
|
+
* Discriminated union of all events emitted by the workflow kernel.
|
|
5
|
+
* Each event carries a string literal `type` discriminant, a `timestamp`,
|
|
6
|
+
* and a `workflowRunId` that scopes the event to a specific run.
|
|
7
|
+
*
|
|
8
|
+
* This file contains ONLY types -- no runtime code.
|
|
9
|
+
*/
|
|
10
|
+
/** Emitted when a new workflow run record is created. */
|
|
11
|
+
interface WorkflowCreatedEvent {
|
|
12
|
+
readonly type: "workflow:created";
|
|
13
|
+
readonly timestamp: Date;
|
|
14
|
+
readonly workflowRunId: string;
|
|
15
|
+
readonly workflowId: string;
|
|
16
|
+
}
|
|
17
|
+
/** Emitted when a workflow run begins execution. */
|
|
18
|
+
interface WorkflowStartedEvent {
|
|
19
|
+
readonly type: "workflow:started";
|
|
20
|
+
readonly timestamp: Date;
|
|
21
|
+
readonly workflowRunId: string;
|
|
22
|
+
}
|
|
23
|
+
/** Emitted when a workflow run finishes successfully. */
|
|
24
|
+
interface WorkflowCompletedEvent {
|
|
25
|
+
readonly type: "workflow:completed";
|
|
26
|
+
readonly timestamp: Date;
|
|
27
|
+
readonly workflowRunId: string;
|
|
28
|
+
readonly duration?: number;
|
|
29
|
+
readonly totalCost?: number;
|
|
30
|
+
readonly totalTokens?: number;
|
|
31
|
+
readonly output?: unknown;
|
|
32
|
+
}
|
|
33
|
+
/** Emitted when a workflow run terminates due to an unrecoverable error. */
|
|
34
|
+
interface WorkflowFailedEvent {
|
|
35
|
+
readonly type: "workflow:failed";
|
|
36
|
+
readonly timestamp: Date;
|
|
37
|
+
readonly workflowRunId: string;
|
|
38
|
+
readonly error: string;
|
|
39
|
+
}
|
|
40
|
+
/** Emitted when a workflow run is cancelled by an external request. */
|
|
41
|
+
interface WorkflowCancelledEvent {
|
|
42
|
+
readonly type: "workflow:cancelled";
|
|
43
|
+
readonly timestamp: Date;
|
|
44
|
+
readonly workflowRunId: string;
|
|
45
|
+
readonly reason?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Emitted when a workflow run suspends, waiting on an external signal. */
|
|
48
|
+
interface WorkflowSuspendedEvent {
|
|
49
|
+
readonly type: "workflow:suspended";
|
|
50
|
+
readonly timestamp: Date;
|
|
51
|
+
readonly workflowRunId: string;
|
|
52
|
+
readonly stageId: string;
|
|
53
|
+
}
|
|
54
|
+
/** Emitted when a stage begins execution. */
|
|
55
|
+
interface StageStartedEvent {
|
|
56
|
+
readonly type: "stage:started";
|
|
57
|
+
readonly timestamp: Date;
|
|
58
|
+
readonly workflowRunId: string;
|
|
59
|
+
readonly stageId: string;
|
|
60
|
+
readonly stageName: string;
|
|
61
|
+
readonly stageNumber: number;
|
|
62
|
+
}
|
|
63
|
+
/** Emitted when a stage completes successfully. */
|
|
64
|
+
interface StageCompletedEvent {
|
|
65
|
+
readonly type: "stage:completed";
|
|
66
|
+
readonly timestamp: Date;
|
|
67
|
+
readonly workflowRunId: string;
|
|
68
|
+
readonly stageId: string;
|
|
69
|
+
readonly stageName: string;
|
|
70
|
+
readonly duration: number;
|
|
71
|
+
}
|
|
72
|
+
/** Emitted when a stage suspends, awaiting a future poll. */
|
|
73
|
+
interface StageSuspendedEvent {
|
|
74
|
+
readonly type: "stage:suspended";
|
|
75
|
+
readonly timestamp: Date;
|
|
76
|
+
readonly workflowRunId: string;
|
|
77
|
+
readonly stageId: string;
|
|
78
|
+
readonly stageName: string;
|
|
79
|
+
readonly nextPollAt: Date;
|
|
80
|
+
}
|
|
81
|
+
/** Emitted when a stage fails with an error. */
|
|
82
|
+
interface StageFailedEvent {
|
|
83
|
+
readonly type: "stage:failed";
|
|
84
|
+
readonly timestamp: Date;
|
|
85
|
+
readonly workflowRunId: string;
|
|
86
|
+
readonly stageId: string;
|
|
87
|
+
readonly stageName: string;
|
|
88
|
+
readonly error: string;
|
|
89
|
+
}
|
|
90
|
+
/** Emitted to report incremental progress within a stage. */
|
|
91
|
+
interface StageProgressEvent {
|
|
92
|
+
readonly type: "stage:progress";
|
|
93
|
+
readonly timestamp: Date;
|
|
94
|
+
readonly workflowRunId: string;
|
|
95
|
+
readonly stageId: string;
|
|
96
|
+
readonly progress: number;
|
|
97
|
+
readonly message: string;
|
|
98
|
+
readonly details?: Record<string, unknown>;
|
|
99
|
+
}
|
|
100
|
+
/** Discriminated union of every kernel event. */
|
|
101
|
+
type KernelEvent = WorkflowCreatedEvent | WorkflowStartedEvent | WorkflowCompletedEvent | WorkflowFailedEvent | WorkflowCancelledEvent | WorkflowSuspendedEvent | StageStartedEvent | StageCompletedEvent | StageSuspendedEvent | StageFailedEvent | StageProgressEvent;
|
|
102
|
+
/** String literal union of all kernel event type discriminants. */
|
|
103
|
+
type KernelEventType = KernelEvent["type"];
|
|
104
|
+
|
|
105
|
+
export type { KernelEvent as K, StageCompletedEvent as S, WorkflowCancelledEvent as W, KernelEventType as a, StageFailedEvent as b, StageProgressEvent as c, StageStartedEvent as d, StageSuspendedEvent as e, WorkflowCompletedEvent as f, WorkflowCreatedEvent as g, WorkflowFailedEvent as h, WorkflowStartedEvent as i, WorkflowSuspendedEvent as j };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as AICallLogger, g as CreateAICallInput, h as AIHelperStats, l as WorkflowPersistence,
|
|
1
|
+
import { A as AICallLogger, g as CreateAICallInput, h as AIHelperStats, l as WorkflowPersistence, C as CreateRunInput, W as WorkflowRunRecord, U as UpdateRunInput, m as WorkflowStatus, a as CreateStageInput, b as WorkflowStageRecord, c as UpsertStageInput, d as UpdateStageInput, n as WorkflowStageStatus, e as CreateLogInput, o as SaveArtifactInput, p as WorkflowArtifactRecord, f as CreateOutboxEventInput, O as OutboxRecord, J as JobQueue, E as EnqueueJobInput, D as DequeueResult } from './interface-DCdddCe0.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* PrismaAICallLogger - Prisma implementation of AICallLogger
|
|
@@ -202,6 +202,10 @@ declare class PrismaJobQueue implements JobQueue {
|
|
|
202
202
|
stageId: string;
|
|
203
203
|
workflowRunId: string;
|
|
204
204
|
}>>;
|
|
205
|
+
/**
|
|
206
|
+
* Cancel all pending/suspended jobs for a workflow run.
|
|
207
|
+
*/
|
|
208
|
+
cancelByRun(workflowRunId: string): Promise<number>;
|
|
205
209
|
/**
|
|
206
210
|
* Release stale locks (for crashed workers)
|
|
207
211
|
*/
|