@kb-labs/workflow-engine 2.118.1 → 2.119.0-canary.85d060ea6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/workflow-loader.ts","../src/state-store.ts","../src/run-coordinator.ts","../src/concurrency-manager.ts","../src/scheduler.ts","../src/secrets.ts","../src/event-bus.ts","../src/retry.ts","../src/run-snapshot.ts","../src/engine.ts","../src/artifact-merger.ts","../src/manifest-converter.ts","../src/manifest-scanner.ts","../src/workflow-repository.ts","../src/workflow-service.ts","../src/workflow-registry.ts","../src/job-manager.ts"],"names":["parseYaml","job","WORKFLOW_REDIS_CHANNEL","run","randomUUID","resolve","WorkflowSpecSchema","join","stringifyYaml","readFile","readdir"],"mappings":"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","file":"index.js","sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport type { ZodIssue } from 'zod'\nimport {\n type WorkflowSpec,\n WorkflowSpecSchema,\n} from '@kb-labs/workflow-contracts'\nimport type { EngineLogger, WorkflowLoaderResult } from './types'\n\nexport interface WorkflowLoaderOptions {\n cwd?: string\n}\n\nexport class WorkflowLoader {\n constructor(private readonly logger: EngineLogger) {}\n\n async fromFile(\n filePath: string,\n options: WorkflowLoaderOptions = {},\n ): Promise<WorkflowLoaderResult> {\n const cwd = options.cwd ?? process.cwd()\n const absolutePath = resolve(cwd, filePath)\n\n this.logger.debug(`Loading workflow spec from file`, {\n path: absolutePath,\n })\n\n const raw = await readFile(absolutePath, 'utf8')\n const parsed = this.parse(raw, absolutePath)\n return this.validate(parsed, absolutePath)\n }\n\n fromInline(\n spec: unknown,\n source = 'inline',\n ): WorkflowLoaderResult {\n let candidate: unknown = spec\n if (typeof spec === 'string') {\n candidate = this.parse(spec, source)\n }\n return this.validate(candidate, source)\n }\n\n private parse(raw: string, source: string): unknown {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error(`Workflow spec ${source} is empty`)\n }\n\n if (source.endsWith('.json') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse JSON workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec JSON: ${message}`)\n }\n }\n\n try {\n return parseYaml(trimmed)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse YAML workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec YAML: ${message}`)\n }\n }\n\n private validate(candidate: unknown, source: string): WorkflowLoaderResult {\n const parsed = WorkflowSpecSchema.safeParse(candidate)\n\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map(\n (issue: ZodIssue) =>\n `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n .join('\\n')\n this.logger.warn(`Workflow spec validation failed`, { source, issues })\n throw new Error(`Workflow spec validation failed:\\n${issues}`)\n }\n\n const spec = parsed.data as WorkflowSpec\n return { spec, source }\n }\n}\n\n\n","import type { JobRun, StepRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\n/**\n * Run records must outlive individual workflow steps. Some steps (e.g. release\n * checks packing + clean-installing every package) run for tens of minutes\n * with no intermediate persistence call. Cache backends default `set()` TTL\n * to a few minutes (e.g. InMemoryStateBroker: 300_000ms) for ordinary ephemeral\n * caching — without an explicit override here, a long-running step's record\n * silently expires mid-flight, `getRun`/`updateRun` start returning null, and\n * the step's real result is never persisted (surfaces as a bogus \"Daemon\n * restarted — run was abandoned\" once something else touches the run).\n */\nconst RUN_TTL_MS = 24 * 60 * 60 * 1000 // 24h\n\nexport class StateStore {\n private readonly cache: ICache\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n ) {\n this.cache = cache\n }\n\n async saveRun(run: WorkflowRun): Promise<void> {\n const key = `kb:run:${run.id}`\n this.logger.debug('Persisting workflow run', { runId: run.id, key })\n\n // Save run data\n await this.cache.set(key, JSON.stringify(run), RUN_TTL_MS)\n\n // Add to sorted set index (score = createdAt timestamp for time-based ordering)\n const timestamp = new Date(run.createdAt).getTime()\n await this.cache.zadd('workflow:runs:index', timestamp, run.id)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const key = `kb:run:${runId}`\n const payload = await this.cache.get<string>(key)\n if (!payload) {\n return null\n }\n try {\n return JSON.parse(payload) as WorkflowRun\n } catch (error) {\n this.logger.error('Failed to parse stored workflow run', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteRun(runId: string): Promise<void> {\n const key = `kb:run:${runId}`\n\n // Remove from cache\n await this.cache.delete(key)\n\n // Remove from sorted set index\n await this.cache.zrem('workflow:runs:index', runId)\n }\n\n async getAllRunIds(): Promise<string[]> {\n // Get all run IDs from sorted set index (ordered by creation time)\n // Score range: -inf to +inf (all runs)\n const runIds = await this.cache.zrangebyscore('workflow:runs:index', -Infinity, Infinity)\n return runIds ?? []\n }\n\n async updateRun(\n runId: string,\n mutator: (draft: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const run = await this.getRun(runId)\n if (!run) {\n return null\n }\n\n const draft = clone(run)\n const result = mutator(draft)\n const next = (result ?? draft) as WorkflowRun\n await this.saveRun(next)\n return next\n }\n\n async updateJob(\n runId: string,\n jobId: string,\n mutator: (job: JobRun) => JobRun | void,\n ): Promise<JobRun | null> {\n let updatedJob: JobRun | null = null\n\n await this.updateRun(runId, (run) => {\n const index = run.jobs.findIndex((job: JobRun) => job.id === jobId)\n if (index === -1) {\n return\n }\n const existingJob = run.jobs[index]\n if (!existingJob) {\n return\n }\n const jobDraft = clone(existingJob)\n const result = mutator(jobDraft)\n const nextJob = (result ?? jobDraft) as JobRun\n run.jobs[index] = nextJob\n updatedJob = nextJob\n })\n\n return updatedJob\n }\n\n async updateStep(\n runId: string,\n jobId: string,\n stepId: string,\n mutator: (step: StepRun) => StepRun | void,\n ): Promise<StepRun | null> {\n let updatedStep: StepRun | null = null\n\n await this.updateRun(runId, (run) => {\n const jobIndex = run.jobs.findIndex((job) => job.id === jobId)\n if (jobIndex === -1) {\n return\n }\n const job = run.jobs[jobIndex]\n if (!job) {\n return\n }\n const stepIndex = job.steps.findIndex(\n (step: StepRun) => step.id === stepId,\n )\n if (stepIndex === -1) {\n return\n }\n const existingStep = job.steps[stepIndex]\n if (!existingStep) {\n return\n }\n const draft = clone(existingStep)\n const result = mutator(draft)\n const nextStep = (result ?? draft) as StepRun\n job.steps[stepIndex] = nextStep\n updatedStep = nextStep\n })\n\n return updatedStep\n }\n\n async releaseBlockedJobs(\n runId: string,\n completedJobName: string,\n ): Promise<JobRun[]> {\n const released: JobRun[] = []\n\n await this.updateRun(runId, (run) => {\n for (const job of run.jobs) {\n if (job.status !== 'queued' || !job.blocked) {\n continue\n }\n if (!job.pendingDependencies || job.pendingDependencies.length === 0) {\n continue\n }\n if (!job.needs?.includes(completedJobName)) {\n continue\n }\n\n const remaining = job.pendingDependencies.filter(\n (dependency) => dependency !== completedJobName,\n )\n\n if (remaining.length === job.pendingDependencies.length) {\n continue\n }\n\n job.pendingDependencies = remaining\n\n if (remaining.length === 0) {\n job.blocked = false\n released.push(clone(job))\n }\n }\n })\n\n return released\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n\n\n\n","import { randomUUID } from 'node:crypto'\nimport { IDEMPOTENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type {\n JobRun,\n JobSpec,\n StepRun,\n WorkflowRun,\n} from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { StateStore } from './state-store'\nimport type { ConcurrencyManager } from './concurrency-manager'\nimport type { EngineLogger, CreateRunInput } from './types'\n\nconst DEFAULT_IDEMPOTENCY_TTL_MS = 1000 * 60 * 60 * 24 // 24h\n\nfunction resolveIdempotencyTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[IDEMPOTENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_IDEMPOTENCY_TTL_MS\n}\n\nexport interface RunCoordinatorOptions {\n idempotencyTtlMs?: number\n}\n\nexport class RunCoordinator {\n private readonly cache: ICache\n private readonly idempotencyTtlMs: number\n\n constructor(\n cache: ICache,\n private readonly stateStore: StateStore,\n private readonly concurrencyManager: ConcurrencyManager,\n private readonly logger: EngineLogger,\n options: RunCoordinatorOptions = {},\n ) {\n this.cache = cache\n this.idempotencyTtlMs = resolveIdempotencyTtlMs(options.idempotencyTtlMs)\n }\n\n async ensureRun(input: CreateRunInput): Promise<WorkflowRun> {\n if (input.idempotencyKey) {\n const existing = await this.loadByIdempotencyKey(input.idempotencyKey)\n if (existing) {\n this.logger.info('Idempotent workflow run reused', {\n runId: existing.id,\n idempotencyKey: input.idempotencyKey,\n })\n return existing\n }\n }\n\n const runId = randomUUID()\n const now = new Date().toISOString()\n\n if (input.concurrencyGroup) {\n const acquired = await this.concurrencyManager.acquire(\n input.concurrencyGroup,\n runId,\n )\n\n if (!acquired) {\n const active = await this.concurrencyManager.getActiveRun(\n input.concurrencyGroup,\n )\n const message = active\n ? `Concurrency group ${input.concurrencyGroup} already locked by run ${active}`\n : `Failed to acquire concurrency lock for ${input.concurrencyGroup}`\n this.logger.warn(message, {\n concurrencyGroup: input.concurrencyGroup,\n activeRunId: active,\n })\n throw new Error(message)\n }\n }\n\n const run = this.buildInitialRun(input, runId, now)\n await this.stateStore.saveRun(run)\n\n if (input.idempotencyKey) {\n await this.registerIdempotencyKey(input.idempotencyKey, run.id)\n }\n\n this.logger.info('Workflow run created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n })\n\n return run\n }\n\n private buildInitialRun(\n input: CreateRunInput,\n runId: string,\n timestamp: string,\n ): WorkflowRun {\n const jobs: JobRun[] = []\n\n for (const [jobName, jobSpec] of Object.entries(\n input.spec.jobs,\n ) as Array<[string, JobSpec]>) {\n const jobId = `${runId}:${jobName}`\n const needs = Array.isArray(jobSpec.needs) ? [...jobSpec.needs] : []\n const priority = jobSpec.priority ?? 'normal'\n const effectiveTarget = jobSpec.target ?? input.spec.target\n const effectiveIsolation = jobSpec.isolation ?? input.spec.isolation\n const stepRuns: StepRun[] = jobSpec.steps.map((step, index) => ({\n id: `${jobId}:${index}`,\n runId,\n jobId,\n name: step.name,\n index,\n status: 'queued',\n queuedAt: timestamp,\n attempt: 0,\n timeoutMs: step.timeoutMs,\n continueOnError: step.continueOnError,\n spec: step,\n }))\n\n jobs.push({\n id: jobId,\n runId,\n jobName,\n status: 'queued',\n runsOn: jobSpec.runsOn,\n queuedAt: timestamp,\n attempt: 0,\n steps: stepRuns,\n concurrency: jobSpec.concurrency,\n retries: jobSpec.retries,\n timeoutMs: jobSpec.timeoutMs,\n target: effectiveTarget,\n isolation: effectiveIsolation,\n artifacts: jobSpec.artifacts,\n env: jobSpec.env,\n secrets: jobSpec.secrets,\n needs,\n pendingDependencies: [...needs],\n blocked: needs.length > 0,\n priority,\n if: jobSpec.if,\n })\n }\n\n const workflowRun: WorkflowRun = {\n id: runId,\n name: input.spec.name,\n version: input.spec.version,\n status: 'queued',\n createdAt: timestamp,\n queuedAt: timestamp,\n trigger: input.trigger,\n env: input.env ?? input.spec.env,\n inputs: input.inputs,\n secrets: input.spec.secrets,\n jobs,\n metadata: {\n idempotencyKey: input.idempotencyKey,\n concurrencyGroup: input.concurrencyGroup,\n target: input.spec.target,\n isolation: input.spec.isolation,\n outputDeclarations: input.spec.outputs,\n ...input.metadata,\n },\n artifacts: [],\n }\n\n return workflowRun\n }\n\n private async registerIdempotencyKey(\n key: string,\n runId: string,\n ): Promise<void> {\n const cacheKey = `kb:idempotency:${key}`\n const registered = await this.cache.setIfNotExists(\n cacheKey,\n runId,\n this.idempotencyTtlMs,\n )\n\n if (!registered) {\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (existingRunId) {\n const existing = await this.stateStore.getRun(existingRunId)\n if (existing) {\n throw new Error(\n `Idempotency key ${key} already associated with run ${existingRunId}`,\n )\n }\n }\n throw new Error(`Failed to register idempotency key ${key}`)\n }\n }\n\n private async loadByIdempotencyKey(\n key: string,\n ): Promise<WorkflowRun | null> {\n const cacheKey = `kb:idempotency:${key}`\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (!existingRunId) {\n return null\n }\n return this.stateStore.getRun(existingRunId)\n }\n\n async releaseConcurrency(run: WorkflowRun): Promise<void> {\n const group = run.metadata?.concurrencyGroup\n if (!group) {\n return\n }\n await this.concurrencyManager.release(group, run.id)\n this.logger.debug('Released concurrency group', {\n runId: run.id,\n group,\n })\n }\n}\n","import { CONCURRENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type { ConcurrencyGroup } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nconst DEFAULT_TTL_MS = 1000 * 60 * 30 // 30 minutes\n\nfunction resolveTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[CONCURRENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_TTL_MS\n}\n\nexport interface AcquireOptions {\n ttlMs?: number\n}\n\nexport class ConcurrencyManager {\n private readonly cache: ICache\n private readonly ttlMs: number\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: AcquireOptions = {},\n ) {\n this.cache = cache\n this.ttlMs = resolveTtlMs(options.ttlMs)\n }\n\n async acquire(\n group: ConcurrencyGroup,\n runId: string,\n options: AcquireOptions = {},\n ): Promise<boolean> {\n const ttl = resolveTtlMs(options.ttlMs ?? this.ttlMs)\n const key = `kb:concurrency:${group}`\n const acquired = await this.cache.setIfNotExists(key, runId, ttl)\n\n this.logger.debug('Concurrency acquire attempt', {\n group,\n runId,\n acquired,\n })\n return acquired\n }\n\n async release(group: ConcurrencyGroup, runId: string): Promise<void> {\n const key = `kb:concurrency:${group}`\n const current = await this.cache.get<string>(key)\n if (current === runId) {\n await this.cache.delete(key)\n this.logger.debug('Concurrency lock released', { group, runId })\n }\n }\n\n async getActiveRun(group: ConcurrencyGroup): Promise<string | null> {\n const key = `kb:concurrency:${group}`\n return this.cache.get<string>(key)\n }\n}\n\n\n","import type { JobRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { JobPriority } from '@kb-labs/workflow-constants'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface JobQueueEntry {\n id: string\n runId: string\n jobId: string\n priority: JobPriority\n enqueuedAt: string\n availableAt: number\n jobName: string\n}\n\nexport interface SchedulerOptions {\n defaultPriority?: JobPriority\n lookAheadMs?: number\n}\n\nexport class Scheduler {\n private readonly cache: ICache\n private readonly defaultPriority: JobPriority\n private readonly lookAheadMs: number\n private readonly priorityOrder: JobPriority[] = ['high', 'normal', 'low']\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: SchedulerOptions = {},\n ) {\n this.cache = cache\n this.defaultPriority = options.defaultPriority ?? 'normal'\n this.lookAheadMs = options.lookAheadMs ?? 1000\n }\n\n async scheduleRun(run: WorkflowRun): Promise<void> {\n // Enqueue ready jobs in parallel\n const readyJobs = run.jobs.filter(job => {\n if (job.blocked) {\n this.logger.debug('Job blocked by dependencies; deferring enqueue', {\n runId: run.id,\n jobId: job.id,\n needs: job.needs,\n })\n return false\n }\n return true\n })\n\n await Promise.all(\n readyJobs.map(job => {\n const priority = job.priority ?? this.defaultPriority\n return this.enqueueJob(run.id, job, priority)\n }),\n )\n }\n\n async enqueueJob(\n runId: string,\n job: JobRun,\n priority: JobPriority = this.defaultPriority,\n ): Promise<void> {\n if (job.blocked) {\n this.logger.debug('Skipping enqueue for blocked job', {\n runId,\n jobId: job.id,\n needs: job.pendingDependencies,\n })\n return\n }\n const now = Date.now()\n const entryId = `${runId}:${job.id}:${now}:${Math.random().toString(36).slice(2, 10)}`\n const entry: JobQueueEntry = {\n id: entryId,\n runId,\n jobId: job.id,\n jobName: job.jobName,\n priority,\n enqueuedAt: new Date().toISOString(),\n availableAt: now,\n }\n await this.cache.zadd(\n `kb:jobqueue:${priority}`,\n entry.availableAt,\n JSON.stringify(entry),\n )\n this.logger.debug('Job enqueued', { runId, jobId: job.id, priority })\n }\n\n async dequeueJob(): Promise<JobQueueEntry | null> {\n // Sequential check by priority order - must return first match respecting priority\n for (const priority of this.priorityOrder) {\n const entry = await this.dequeueFromPriority(priority) // eslint-disable-line no-await-in-loop\n if (entry) {\n return entry\n }\n }\n return null\n }\n\n async reschedule(entry: JobQueueEntry, delayMs: number): Promise<void> {\n const availableAt = Date.now() + delayMs\n const next: JobQueueEntry = {\n ...entry,\n availableAt,\n enqueuedAt: new Date().toISOString(),\n }\n await this.cache.zadd(\n `kb:jobqueue:${entry.priority}`,\n availableAt,\n JSON.stringify(next),\n )\n this.logger.debug('Job rescheduled', {\n runId: entry.runId,\n jobId: entry.jobId,\n delayMs,\n priority: entry.priority,\n })\n }\n\n private async dequeueFromPriority(priority: JobPriority): Promise<JobQueueEntry | null> {\n const now = Date.now()\n const key = `kb:jobqueue:${priority}`\n const results = await this.cache.zrangebyscore(\n key,\n 0,\n now + this.lookAheadMs,\n )\n\n // Handle LIMIT manually - take only first result\n if (results.length === 0) {\n return null\n }\n\n const raw = results[0]\n if (typeof raw !== 'string') {\n return null\n }\n try {\n const entry = JSON.parse(raw) as JobQueueEntry\n await this.cache.zrem(key, raw)\n return entry\n } catch (error) {\n this.logger.error('Failed to parse job queue entry', error instanceof Error ? error : undefined)\n return null\n }\n }\n\n getDefaultPriority(): JobPriority {\n return this.defaultPriority\n }\n}\n\n\n","export interface SecretProvider {\n resolve(names: string[]): Promise<Record<string, string>>\n}\n\nexport interface EnvSecretProviderOptions {\n /**\n * Prefix applied when looking up secrets in environment variables.\n * Defaults to `KB_SECRET_`.\n */\n prefix?: string\n /**\n * When true (default), check both plain and prefixed environment variable names.\n */\n allowPlain?: boolean\n}\n\nexport class EnvSecretProvider implements SecretProvider {\n private readonly prefix: string\n private readonly allowPlain: boolean\n\n constructor(options: EnvSecretProviderOptions = {}) {\n this.prefix = options.prefix ?? 'KB_SECRET_'\n this.allowPlain = options.allowPlain ?? true\n }\n\n async resolve(names: string[]): Promise<Record<string, string>> {\n const resolved: Record<string, string> = {}\n for (const name of names) {\n if (!name) {\n continue\n }\n const prefixed = `${this.prefix}${name}`\n const candidates = this.allowPlain\n ? [process.env[name], process.env[prefixed]]\n : [process.env[prefixed]]\n\n const value = candidates.find((candidate) => typeof candidate === 'string')\n if (typeof value === 'string') {\n resolved[name] = value\n }\n }\n return resolved\n }\n}\n\nexport function createDefaultSecretProvider(): SecretProvider {\n return new EnvSecretProvider()\n}\n\n","import {\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { IEventBus } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface WorkflowEvent<TPayload = Record<string, unknown>> {\n type: WorkflowEventName\n runId: string\n jobId?: string\n stepId?: string\n payload?: TPayload\n timestamp?: string\n}\n\nexport class EventBusBridge {\n private readonly events: IEventBus\n private readonly channel = WORKFLOW_REDIS_CHANNEL\n\n constructor(\n events: IEventBus,\n private readonly logger: EngineLogger,\n ) {\n this.events = events\n }\n\n async publish<TPayload = Record<string, unknown>>(\n event: WorkflowEvent<TPayload>,\n ): Promise<void> {\n const payload = {\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n }\n await this.events.publish(this.channel, payload)\n this.logger.debug('Workflow event published', {\n channel: this.channel,\n type: event.type,\n runId: event.runId,\n })\n }\n}\n\n\n","import type { RetryPolicy } from '@kb-labs/workflow-contracts'\n\nconst DEFAULT_INITIAL_INTERVAL_MS = 1000\n\nexport interface RetryDecision {\n shouldRetry: boolean\n nextDelayMs?: number\n}\n\nexport function calculateBackoff(\n attempt: number,\n policy?: RetryPolicy,\n): number {\n if (!policy) {\n return 0\n }\n\n const base = policy.initialIntervalMs ?? DEFAULT_INITIAL_INTERVAL_MS\n const backoff =\n policy.backoff === 'lin'\n ? base * (attempt + 1)\n : base * Math.pow(2, attempt)\n\n if (policy.maxIntervalMs) {\n return Math.min(backoff, policy.maxIntervalMs)\n }\n return backoff\n}\n\nexport function shouldRetry(\n attempt: number,\n policy?: RetryPolicy,\n): RetryDecision {\n if (!policy) {\n return { shouldRetry: false }\n }\n if (attempt >= policy.max) {\n return { shouldRetry: false }\n }\n\n return {\n shouldRetry: true,\n nextDelayMs: calculateBackoff(attempt, policy),\n }\n}\n\n\n\n\n\n","import type { WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface RunSnapshot {\n runId: string\n run: WorkflowRun\n stepOutputs: Record<string, Record<string, unknown>>\n env: Record<string, string>\n refs?: {\n workspaceSnapshotId?: string\n environmentSnapshotId?: string\n }\n createdAt: string\n version: string\n}\n\nconst SNAPSHOT_VERSION = '1.0.0'\n\nexport class RunSnapshotStorage {\n constructor(\n private readonly cache: ICache,\n private readonly logger: EngineLogger,\n ) {}\n\n private getSnapshotKey(runId: string): string {\n return `workflow:snapshot:${runId}`\n }\n\n async createSnapshot(\n run: WorkflowRun,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot> {\n const snapshot: RunSnapshot = {\n runId: run.id,\n run,\n stepOutputs,\n env,\n refs,\n createdAt: new Date().toISOString(),\n version: SNAPSHOT_VERSION,\n }\n\n const key = this.getSnapshotKey(run.id)\n // Store snapshot with 7 days TTL (in milliseconds)\n await this.cache.set(\n key,\n JSON.stringify(snapshot),\n 7 * 24 * 60 * 60 * 1000, // 7 days in ms\n )\n\n this.logger.info('Snapshot created', { runId: run.id })\n return snapshot\n }\n\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n const key = this.getSnapshotKey(runId)\n const stored = await this.cache.get<string>(key)\n if (!stored) {\n return null\n }\n\n try {\n const snapshot = JSON.parse(stored) as RunSnapshot\n // Validate version\n if (snapshot.version !== SNAPSHOT_VERSION) {\n this.logger.warn('Snapshot version mismatch', {\n runId,\n expected: SNAPSHOT_VERSION,\n actual: snapshot.version,\n })\n // Try to load anyway, but log warning\n }\n return snapshot\n } catch (error) {\n this.logger.error('Failed to parse snapshot', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteSnapshot(runId: string): Promise<void> {\n const key = this.getSnapshotKey(runId)\n await this.cache.delete(key)\n this.logger.debug('Snapshot deleted', { runId })\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport type {\n WorkflowRun,\n WorkflowSpec,\n JobRun,\n ExpressionContext,\n} from '@kb-labs/workflow-contracts'\nimport { evaluateExpression, resolveExpression } from '@kb-labs/workflow-contracts'\nimport {\n EVENT_NAMES,\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { ICache, IEventBus, ILogger, IAnalytics, ISnapshotManager, Unsubscribe } from '@kb-labs/core-platform'\nimport type { ClassifiedFailure, RetryPolicyConfig } from '@kb-labs/core-contracts'\nimport { classifyFailure, decideRetry } from '@kb-labs/core-retry'\nimport { StateStore } from './state-store'\nimport { ConcurrencyManager, type AcquireOptions } from './concurrency-manager'\nimport {\n RunCoordinator,\n type RunCoordinatorOptions,\n} from './run-coordinator'\nimport {\n Scheduler,\n type SchedulerOptions,\n type JobQueueEntry,\n} from './scheduler'\nimport { EventBusBridge, type WorkflowEvent } from './event-bus'\nimport { WorkflowLoader } from './workflow-loader'\nimport type { CreateRunInput, EngineLogger, RunContext } from './types'\nimport { RunSnapshotStorage, type RunSnapshot } from './run-snapshot'\n\nexport interface WorkflowEngineOptions {\n scheduler?: SchedulerOptions\n concurrency?: AcquireOptions\n runCoordinator?: RunCoordinatorOptions\n maxWorkflowDepth?: number\n /** Platform cache adapter (REQUIRED) */\n cache: ICache\n /** Platform event bus adapter (REQUIRED) */\n events: IEventBus\n /** Platform logger (REQUIRED) */\n logger: ILogger\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics\n /** Platform snapshot manager (OPTIONAL - for infra snapshot restore in replay) */\n snapshotManager?: ISnapshotManager\n /** Workspace root (monorepo root) - used for plugin execution context */\n workspaceRoot?: string\n}\n\nexport class WorkflowEngine {\n readonly loader: WorkflowLoader\n readonly maxWorkflowDepth: number\n\n private readonly logger: EngineLogger\n private readonly analytics?: IAnalytics\n private readonly stateStore: StateStore\n private readonly concurrency: ConcurrencyManager\n private readonly runCoordinator: RunCoordinator\n private readonly scheduler: Scheduler\n private readonly events: EventBusBridge\n private readonly snapshotStorage: RunSnapshotStorage\n\n constructor(private readonly options: WorkflowEngineOptions) {\n this.logger = options.logger\n this.analytics = options.analytics\n\n this.stateStore = new StateStore(options.cache, this.logger)\n this.concurrency = new ConcurrencyManager(\n options.cache,\n this.logger,\n options.concurrency,\n )\n this.runCoordinator = new RunCoordinator(\n options.cache,\n this.stateStore,\n this.concurrency,\n this.logger,\n options.runCoordinator,\n )\n\n this.scheduler = new Scheduler(options.cache, this.logger, options.scheduler)\n this.events = new EventBusBridge(options.events, this.logger)\n this.loader = new WorkflowLoader(this.logger)\n this.maxWorkflowDepth = options.maxWorkflowDepth ?? 2\n this.snapshotStorage = new RunSnapshotStorage(options.cache, this.logger)\n }\n\n async dispose(): Promise<void> {\n // Cleanup if needed\n }\n\n /**\n * Subscribe to real-time events for a specific workflow run.\n * Events are filtered by runId from the shared event bus channel.\n */\n subscribeToRunEvents(\n runId: string,\n handler: (event: WorkflowEvent) => void,\n ): Unsubscribe {\n return this.options.events.subscribe(WORKFLOW_REDIS_CHANNEL, async (raw: unknown) => {\n const event = raw as WorkflowEvent\n if (event.runId === runId) {handler(event)}\n })\n }\n\n async createRun(input: CreateRunInput): Promise<WorkflowRun> {\n const run = await this.runCoordinator.ensureRun(input)\n\n // Track workflow run creation\n this.analytics?.track('workflow.run.created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n jobCount: run.jobs.length,\n trigger: input.trigger?.type,\n }).catch(() => {}) // Silent fail for analytics\n\n await this.events.publish({\n type: EVENT_NAMES.run.created,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n await this.scheduler.scheduleRun(run)\n\n return run\n }\n\n async runFromSpec(\n spec: WorkflowSpec,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n return this.createRun({\n ...input,\n spec,\n })\n }\n\n async runFromFile(\n filePath: string,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = await this.loader.fromFile(filePath)\n return this.runFromSpec(result.spec, input)\n }\n\n async runFromInline(\n spec: unknown,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = this.loader.fromInline(spec)\n return this.runFromSpec(result.spec, input)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return this.stateStore.getRun(runId)\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n\n if (!run || ['success', 'failed', 'cancelled', 'skipped', 'dlq'].includes(run.status)) {\n return\n }\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'cancelled'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n\n // Track workflow cancellation\n this.analytics?.track('workflow.run.cancelled', {\n runId,\n name: run?.name,\n reason: 'cancelled by parent workflow',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.cancelled,\n runId,\n payload: { reason: 'cancelled by parent workflow' },\n })\n\n // Invocation links are persisted on child trigger metadata, so cancellation\n // survives worker/daemon restarts and naturally cascades through descendants.\n const descendants = await this.findChildRuns(runId)\n await Promise.all(descendants.map((child) => this.cancelRun(child.id)))\n await this.reconcileChildInvocation(runId)\n }\n\n /**\n * Reconcile all persisted parent/child links. This is deliberately engine-side\n * instead of a worker-local polling task: it is safe to call after a daemon\n * restart and is idempotent when several reconciliations race.\n */\n async reconcileChildInvocations(): Promise<number> {\n const runs = await this.listStoredRuns()\n let reconciled = 0\n\n for (const parent of runs) {\n for (const job of parent.jobs) {\n for (const step of job.steps) {\n if (step.status !== 'waiting_child') {continue}\n const childRunId = step.metadata?.['childRunId']\n if (typeof childRunId !== 'string') {continue}\n\n const child = await this.getRun(childRunId)\n if (parent.status === 'cancelled') {\n if (child) {await this.cancelRun(child.id)}\n continue\n }\n if (!child) {\n await this.failChildInvocation(parent.id, job.id, step.id, childRunId, 'not found')\n reconciled++\n continue\n }\n if (!['success', 'failed', 'cancelled', 'skipped', 'dlq'].includes(child.status)) {\n continue\n }\n if (child.status === 'success') {\n const outputs = this.childResultEnvelope(child)\n await this.markStepCompleted(parent.id, job.id, step.id, outputs)\n await this.resumeJob(parent.id, job.id)\n } else {\n await this.failChildInvocation(parent.id, job.id, step.id, child.id, child.status)\n }\n reconciled++\n }\n }\n }\n return reconciled\n }\n\n /** Run reconciliation on terminal-child events; startup calls it once too. */\n async reconcileChildInvocation(childRunId: string): Promise<number> {\n const parents = (await this.listStoredRuns()).filter((run) =>\n run.jobs.some((job) => job.steps.some((step) =>\n step.status === 'waiting_child' && step.metadata?.['childRunId'] === childRunId,\n )),\n )\n if (parents.length === 0) {return 0}\n return this.reconcileChildInvocations()\n }\n\n private childResultEnvelope(child: WorkflowRun): Record<string, unknown> {\n const stepOutputs: Record<string, Record<string, unknown>> = {}\n for (const job of child.jobs) {\n for (const step of job.steps) {\n if (step.status === 'success' && step.spec.id && step.outputs) {\n stepOutputs[step.spec.id] = step.outputs\n }\n }\n }\n return {\n runId: child.id,\n status: child.status,\n outputs: Object.keys(child.result?.outputs ?? {}).length > 0\n ? child.result?.outputs\n : stepOutputs,\n artifacts: child.artifacts ?? [],\n }\n }\n\n private resolveDeclaredOutputs(run: WorkflowRun): Record<string, unknown> {\n const declarations = run.metadata?.outputDeclarations\n if (!declarations) {return {}}\n const context = this.buildExpressionContext(run)\n return Object.fromEntries(Object.entries(declarations).map(([name, declaration]) => {\n const source = declaration && typeof declaration === 'object'\n ? (declaration as { source?: unknown }).source\n : undefined\n return [name, typeof source === 'string' ? resolveExpression(source, context) : undefined]\n }))\n }\n\n private async failChildInvocation(\n parentRunId: string,\n parentJobId: string,\n parentStepId: string,\n childRunId: string,\n childStatus: string,\n ): Promise<void> {\n const error = new Error(`Child workflow ${childStatus} (run ${childRunId})`)\n await this.markStepFailed(parentRunId, parentJobId, parentStepId, error, {\n runId: childRunId,\n status: childStatus,\n })\n await this.markJobFailed(parentRunId, parentJobId, error, undefined, false)\n }\n\n private async listStoredRuns(): Promise<WorkflowRun[]> {\n const runIds = await this.stateStore.getAllRunIds()\n // Cache sorted-set adapters are permitted to retain duplicate members on\n // repeated saveRun calls. Reconciliation must be exactly-once per durable\n // run record even when event/index delivery is at-least-once.\n const runs = await Promise.all([...new Set(runIds)].map((id) => this.getRun(id)))\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n private async findChildRuns(parentRunId: string): Promise<WorkflowRun[]> {\n return (await this.listStoredRuns()).filter((run) =>\n run.trigger.parentRunId === parentRunId || run.metadata?.parentRunId === parentRunId,\n )\n }\n\n /**\n * Mark job as failed and optionally schedule retry.\n * Implements exponential/linear backoff retry logic.\n */\n async markJobFailed(\n runId: string,\n jobId: string,\n error: Error,\n failure?: ClassifiedFailure,\n policyOverride?: false | { max: number; backoff?: 'exp' | 'lin'; initialIntervalMs?: number; maxIntervalMs?: number; on?: string[] }\n ): Promise<void> {\n const run = await this.stateStore.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot mark job as failed: run not found', { runId, jobId })\n return\n }\n\n const job = run.jobs.find((j) => j.id === jobId)\n if (!job) {\n this.logger.warn('Cannot mark job as failed: job not found', { runId, jobId })\n return\n }\n\n // Update job status to failed\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'failed'\n draft.error = {\n message: error.message,\n stack: error.stack,\n timestamp: new Date().toISOString(),\n }\n draft.finishedAt = new Date().toISOString()\n draft.attempt = (draft.attempt || 0) + 1\n })\n\n this.logger.error('Job failed', error, {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n })\n\n const classified = failure ?? classifyFailure(error, { source: 'execution', phase: 'response' })\n const retryConfig: RetryPolicyConfig | undefined = policyOverride !== undefined && typeof policyOverride !== 'boolean'\n ? {\n maxAttempts: policyOverride.max + 1,\n retryOn: (policyOverride.on ?? ['command', 'network', 'timeout', 'rate_limit', 'server', 'infrastructure']) as RetryPolicyConfig['retryOn'],\n initialDelayMs: policyOverride.initialIntervalMs ?? 1000,\n backoff: policyOverride.backoff === 'lin' ? 'linear' : 'exponential',\n maxDelayMs: policyOverride.maxIntervalMs ?? 30_000,\n respectRetryAfter: true,\n requireIdempotencyForUnsafeFailures: true,\n }\n : undefined\n const retryDecision = policyOverride === false\n ? { retry: false, reason: 'policy_denied' as const, delayMs: 0 }\n : retryConfig\n ? decideRetry({ failure: classified, attempt: job.attempt || 0, policy: retryConfig })\n : decideRetry({ failure: classified, attempt: job.attempt || 0 })\n\n // Track job failure\n this.analytics?.track('workflow.job.failed', {\n runId,\n jobId,\n jobName: job.jobName,\n attempt: (job.attempt || 0) + 1,\n errorMessage: error.message,\n willRetry: retryDecision.retry,\n failureKind: classified.kind,\n failureCode: classified.code,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.failed,\n runId,\n jobId,\n payload: { jobName: job.jobName, error: error.message, attempt: (job.attempt || 0) + 1 },\n })\n\n // Check if should retry\n if (retryDecision.retry) {\n const backoffMs = retryDecision.delayMs\n\n this.logger.info('Scheduling job retry', {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n backoffMs,\n })\n\n // Re-queue job after backoff\n setTimeout(async () => {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'queued'\n draft.error = undefined\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const updatedRun = await this.stateStore.getRun(runId)\n const updatedJob = updatedRun?.jobs.find((j) => j.id === jobId)\n if (updatedJob) {\n await this.scheduler.enqueueJob(runId, updatedJob, updatedJob.priority ?? 'normal')\n }\n\n this.logger.info('Job re-queued for retry', { runId, jobId })\n }, backoffMs)\n } else {\n // Terminal failure: no retries left.\n // 1. Dead-letter the job for observability (cache record, no status change).\n // 2. Cancel downstream jobs that depend on this one so they don't hang in\n // 'queued' forever (B-030).\n // 3. Let checkRunCompletion finalize the run as 'failed' — 'dlq' is reserved\n // for infrastructure failures and must not leak as a user-step outcome (B-029).\n await this.deadLetterJob(runId, jobId, error)\n await this.cancelDownstreamJobs(runId, job.jobName, `upstream job \"${job.jobName}\" failed`)\n await this.checkRunCompletion(runId)\n }\n }\n\n /**\n * Recursively cancel jobs blocked on a failed/cancelled upstream job, so the\n * DAG does not leave dependents stuck in 'queued'. Cancellation cascades:\n * a cancelled job also cancels its own dependents.\n */\n private async cancelDownstreamJobs(\n runId: string,\n failedJobName: string,\n reason: string,\n ): Promise<void> {\n const released = await this.stateStore.releaseBlockedJobs(runId, failedJobName)\n for (const downstreamJob of released) {\n const now = new Date().toISOString()\n await this.stateStore.updateJob(runId, downstreamJob.id, (draft) => {\n draft.status = 'cancelled'\n draft.blocked = false\n draft.finishedAt = now\n draft.error = { message: reason, timestamp: now }\n })\n await this.events.publish({\n type: EVENT_NAMES.job.cancelled,\n runId,\n jobId: downstreamJob.id,\n payload: { jobName: downstreamJob.jobName, reason },\n })\n this.logger.info('Cancelled dependent job after upstream failure', {\n runId,\n jobId: downstreamJob.id,\n unlockedBy: failedJobName,\n })\n // Cascade: this job's own dependents must also be cancelled.\n await this.cancelDownstreamJobs(runId, downstreamJob.jobName, reason)\n }\n }\n\n /**\n * Mark job as interrupted (e.g., during graceful shutdown).\n * Interrupted jobs will be retried on next daemon startup.\n */\n async markJobInterrupted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'interrupted'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.warn('Job interrupted', { runId, jobId })\n }\n\n /**\n * Mark job as started (running).\n */\n async markJobStarted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n // Promote run status to 'running' when first job starts\n await this.stateStore.updateRun(runId, (draft) => {\n if (draft.status === 'queued') {\n draft.status = 'running'\n if (!draft.startedAt) {\n draft.startedAt = new Date().toISOString()\n }\n }\n })\n\n this.logger.info('Job started', { runId, jobId })\n\n // Track job start\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n this.analytics?.track('workflow.job.started', {\n runId,\n jobId,\n jobName: job?.jobName,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.started,\n runId,\n jobId,\n payload: { jobName: job?.jobName },\n })\n }\n\n /**\n * Mark job as completed successfully.\n */\n async markJobCompleted(runId: string, jobId: string): Promise<void> {\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n const startTime = job?.startedAt ? new Date(job.startedAt).getTime() : Date.now()\n const duration = Date.now() - startTime\n\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.info('Job completed successfully', { runId, jobId })\n\n // Track job completion\n this.analytics?.track('workflow.job.completed', {\n runId,\n jobId,\n jobName: job?.jobName,\n durationMs: duration,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.succeeded,\n runId,\n jobId,\n payload: { jobName: job?.jobName, durationMs: duration },\n })\n\n // Release jobs that were blocked waiting for this job to complete.\n if (job?.jobName) {\n const run = await this.stateStore.getRun(runId)\n const exprCtx = this.buildExpressionContext(run)\n const released = await this.stateStore.releaseBlockedJobs(runId, job.jobName)\n for (const releasedJob of released) {\n if (releasedJob.if && !this.evaluateJobIf(releasedJob.if, exprCtx)) {\n await this.skipJob(runId, releasedJob)\n } else {\n await this.scheduler.enqueueJob(runId, releasedJob, releasedJob.priority ?? 'normal')\n this.logger.info('Unblocked dependent job', { runId, jobId: releasedJob.id, unlockedBy: job.jobName })\n }\n }\n }\n\n // Check if all jobs in run are completed - update run status\n await this.checkRunCompletion(runId)\n }\n\n /** Build a minimal ExpressionContext from run state (for job-level if evaluation). */\n private buildExpressionContext(run: WorkflowRun | undefined | null): ExpressionContext {\n const ctx: ExpressionContext = {\n env: run?.env ?? {},\n trigger: run?.trigger ?? { type: 'manual' },\n inputs: run?.inputs ?? {},\n steps: {},\n }\n if (run) {\n for (const j of run.jobs) {\n for (const s of j.steps) {\n if (s.status === 'success' && s.spec.id) {\n ctx.steps[s.spec.id] = { outputs: (s.outputs ?? {}) as Record<string, unknown> }\n }\n }\n }\n }\n return ctx\n }\n\n /** Evaluate a job-level `if:` expression. Strips ${{ }} wrapper if present. */\n private evaluateJobIf(condition: string, ctx: ExpressionContext): boolean {\n const raw = condition.trim().replace(/^\\$\\{\\{\\s*/, '').replace(/\\s*\\}\\}$/, '')\n return evaluateExpression(raw, ctx)\n }\n\n /** Mark a job as skipped (success) and release any jobs blocked on it. */\n private async skipJob(runId: string, job: JobRun): Promise<void> {\n const now = new Date().toISOString()\n await this.stateStore.updateJob(runId, job.id, (draft) => {\n draft.status = 'success'\n draft.startedAt = now\n draft.finishedAt = now\n })\n this.logger.info('Job skipped: if condition false', { runId, jobId: job.id, condition: job.if })\n // Release dependents of the skipped job (treat skip as success for DAG purposes)\n const downstream = await this.stateStore.releaseBlockedJobs(runId, job.jobName)\n const run = await this.stateStore.getRun(runId)\n const exprCtx = this.buildExpressionContext(run)\n for (const downstreamJob of downstream) {\n if (downstreamJob.if && !this.evaluateJobIf(downstreamJob.if, exprCtx)) {\n await this.skipJob(runId, downstreamJob)\n } else {\n await this.scheduler.enqueueJob(runId, downstreamJob, downstreamJob.priority ?? 'normal')\n this.logger.info('Unblocked dependent job', { runId, jobId: downstreamJob.id, unlockedBy: job.jobName })\n }\n }\n }\n\n /**\n * Check if all jobs in a run are completed and update run status accordingly.\n */\n private async checkRunCompletion(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n if (!run) {\n return\n }\n\n // Check status of all jobs\n const allSuccess = run.jobs.every((j) => j.status === 'success')\n const anyFailed = run.jobs.some((j) => j.status === 'failed')\n const anyRunning = run.jobs.some((j) => j.status === 'running' || j.status === 'queued')\n\n // If any job is still running/queued, run is not complete\n if (anyRunning) {\n return\n }\n\n // Update run status based on job outcomes\n if (allSuccess) {\n const updated = await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n draft.result = {\n ...(draft.result ?? { status: 'success' }),\n status: 'success',\n outputs: this.resolveDeclaredOutputs(draft),\n }\n return draft\n })\n this.logger.info('Workflow run completed successfully', { runId })\n\n // Track workflow completion\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'success',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.finished,\n runId,\n payload: { status: 'success', name: run.name },\n })\n\n if (updated) {\n await this.snapshotTerminalRun(updated)\n }\n await this.reconcileChildInvocation(runId)\n } else if (anyFailed) {\n // Surface the failing job's error at the run level so consumers (REST\n // /runs/:id, Studio, e2e) can show *why* the run failed without digging\n // into per-job records.\n const failedJob = run.jobs.find((j) => j.status === 'failed')\n const updated = await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n if (failedJob?.error) {\n draft.result = {\n status: 'failed',\n summary: `Job ${failedJob.jobName} failed`,\n error: {\n message: failedJob.error.message,\n details: failedJob.error.stack ? { stack: failedJob.error.stack } : undefined,\n },\n }\n }\n return draft\n })\n this.logger.info('Workflow run failed', { runId })\n\n // Track workflow failure\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'failed',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.failed,\n runId,\n payload: { status: 'failed', name: run.name },\n })\n\n if (updated) {\n await this.snapshotTerminalRun(updated)\n }\n await this.reconcileChildInvocation(runId)\n }\n }\n\n /**\n * Mark step as started (running).\n */\n async markStepStarted(runId: string, jobId: string, stepId: string): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Step started', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.started,\n runId,\n jobId,\n stepId,\n })\n }\n\n /**\n * Mark step as completed successfully with output.\n */\n async markStepCompleted(\n runId: string,\n jobId: string,\n stepId: string,\n output?: unknown,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n if (output !== undefined) {\n draft.outputs = output as Record<string, unknown>\n }\n })\n\n this.logger.debug('Step completed', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.succeeded,\n runId,\n jobId,\n stepId,\n payload: output !== undefined ? { outputs: output } : undefined,\n })\n }\n\n /**\n * Mark step as failed with error.\n */\n async markStepFailed(\n runId: string,\n jobId: string,\n stepId: string,\n error: Error,\n outputs?: Record<string, unknown>,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: error.message,\n stack: error.stack,\n }\n if (outputs) {draft.outputs = outputs}\n })\n\n this.logger.debug('Step failed', { runId, jobId, stepId, error: error.message })\n\n await this.events.publish({\n type: EVENT_NAMES.step.failed,\n runId,\n jobId,\n stepId,\n payload: { error: error.message },\n })\n }\n\n /**\n * Mark step as waiting for human approval.\n */\n async markStepWaitingApproval(\n runId: string,\n jobId: string,\n stepId: string,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'waiting_approval'\n draft.startedAt = draft.startedAt ?? new Date().toISOString()\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingApproval,\n runId,\n payload: { jobId, stepId },\n })\n\n this.logger.info('Step waiting for approval', { runId, jobId, stepId })\n }\n\n /**\n * Park a step while its child workflow runs. The worker returns after this\n * transition, so parent workflows never consume the pool needed by children.\n */\n async markStepWaitingChild(\n runId: string,\n jobId: string,\n stepId: string,\n childRunId: string,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'waiting_child'\n draft.startedAt ??= new Date().toISOString()\n draft.metadata = { ...(draft.metadata ?? {}), childRunId }\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingChild,\n runId,\n jobId,\n stepId,\n payload: { childRunId },\n })\n }\n\n /** Re-queue a parked parent job after its child workflow reaches a terminal state. */\n async resumeJob(runId: string, jobId: string): Promise<void> {\n const job = await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'queued'\n draft.finishedAt = undefined\n })\n if (job) {\n await this.scheduler.enqueueJob(runId, job, job.priority ?? 'normal')\n }\n }\n\n /**\n * Resolve a pending approval — approve or reject.\n * On approve: marks step as success with approval outputs.\n * On reject: marks step as failed with rejection error.\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n data?: Record<string, unknown>,\n comment?: string,\n ): Promise<void> {\n if (action === 'approve') {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n draft.outputs = {\n approved: true,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval granted', { runId, jobId, stepId, comment })\n } else {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: comment || 'Approval rejected',\n code: 'APPROVAL_REJECTED',\n }\n draft.outputs = {\n approved: false,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval rejected', { runId, jobId, stepId, comment })\n }\n\n await this.events.publish({\n type: EVENT_NAMES.step.updated,\n runId,\n payload: { jobId, stepId, action },\n })\n }\n\n /**\n * Get the state store for direct access (used by worker for gate restart-from).\n */\n getStateStore(): StateStore {\n return this.stateStore\n }\n\n /**\n * Get the scheduler for direct access (used by worker for gate re-enqueue).\n */\n getScheduler(): Scheduler {\n return this.scheduler\n }\n\n /**\n * Mark stale running/queued runs as failed on daemon startup.\n * Runs that were in-flight when the daemon crashed are unrecoverable —\n * their executor process is gone, so we mark them failed immediately.\n */\n async cleanupStaleRuns(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n const now = new Date().toISOString()\n let count = 0\n const runs = await this.listStoredRuns()\n const protectedChildRunIds = new Set(\n runs.flatMap((run) => run.jobs.flatMap((job) => job.steps\n .filter((step) => step.status === 'waiting_child')\n .map((step) => step.metadata?.['childRunId'])\n .filter((id): id is string => typeof id === 'string'))),\n )\n\n await Promise.all(\n runIds.map(async (runId) => {\n const run = await this.stateStore.getRun(runId)\n if (!run) { return }\n if (run.status !== 'running' && run.status !== 'queued') { return }\n // A parked parent and its child are durable orchestration state, not a\n // lost executor. Keep queued children intact; running children are\n // turned into resumable interruptions below.\n if (run.jobs.some((job) => job.steps.some((step) => step.status === 'waiting_child'))) {\n return\n }\n if (protectedChildRunIds.has(run.id)) {\n const hasRunningJob = run.jobs.some((job) => job.status === 'running')\n if (hasRunningJob) {\n await this.stateStore.updateRun(runId, (draft) => {\n for (const job of draft.jobs) {\n if (job.status === 'running') {\n job.status = 'interrupted'\n job.finishedAt = now\n for (const step of job.steps) {\n if (step.status === 'running') {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n }\n })\n }\n return\n }\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = now\n if (draft.startedAt) {\n draft.durationMs = new Date(now).getTime() - new Date(draft.startedAt).getTime()\n }\n // Mark any still-active jobs as failed too\n for (const job of draft.jobs) {\n if (job.status === 'running' || job.status === 'queued') {\n job.status = 'failed'\n job.error = { message: 'Daemon restarted — run was abandoned' }\n job.finishedAt = now\n }\n }\n return draft\n })\n count++\n }),\n )\n\n if (count > 0) {\n this.logger.warn('Cleaned up stale runs from previous daemon process', { count })\n }\n }\n\n /**\n * Resume interrupted jobs on daemon startup.\n * Re-queues jobs that were interrupted during previous shutdown.\n */\n async resumeInterruptedJobs(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n\n // Process all runs in parallel\n const results = await Promise.all(\n runIds.map(async runId => {\n const run = await this.stateStore.getRun(runId)\n if (!run) {return 0}\n\n const interruptedJobs = run.jobs.filter(job => job.status === 'interrupted')\n\n // Process all interrupted jobs in this run in parallel\n await Promise.all(\n interruptedJobs.map(async job => {\n this.logger.info('Resuming interrupted job', { runId, jobId: job.id })\n\n await this.stateStore.updateJob(runId, job.id, (draft) => {\n draft.status = 'queued'\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const queuedJob = { ...job, status: 'queued' as const }\n await this.scheduler.enqueueJob(runId, queuedJob, queuedJob.priority ?? 'normal')\n }),\n )\n\n return interruptedJobs.length\n }),\n )\n\n const resumedCount = results.reduce((sum, count) => sum + count, 0)\n\n if (resumedCount > 0) {\n this.logger.info('Resumed interrupted jobs', { count: resumedCount })\n }\n }\n\n /**\n * Move permanently failed job to Dead Letter Queue.\n */\n /**\n * Record a dead-letter entry for a job that exhausted its retries. This is an\n * observability artifact only — it does NOT change the run status. The run\n * outcome is decided by checkRunCompletion (→ 'failed'). 'dlq' as a run status\n * is reserved for infrastructure failures and is no longer set here (B-029).\n */\n private async deadLetterJob(runId: string, jobId: string, error: Error): Promise<void> {\n this.logger.warn('Job dead-lettered after max retries', { runId, jobId })\n\n const dlqKey = `workflow:dlq:${runId}:${jobId}`\n const run = await this.stateStore.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n\n await this.options.cache!.set(\n dlqKey,\n JSON.stringify({\n runId,\n jobId,\n jobName: job?.jobName,\n error: {\n message: error.message,\n stack: error.stack,\n },\n timestamp: new Date().toISOString(),\n attempts: job?.attempt || 0,\n }),\n 7 * 24 * 60 * 60 * 1000 // TTL 7 days\n )\n }\n\n async updateRun(\n runId: string,\n mutator: (run: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, mutator)\n if (updated) {\n await this.publishRunEvent(EVENT_NAMES.run.updated, updated)\n }\n return updated\n }\n\n async finalizeRun(\n runId: string,\n status: WorkflowRun['status'],\n context: Partial<RunContext> = {},\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, (run) => {\n const now = new Date().toISOString()\n run.status = status\n run.finishedAt = now\n run.durationMs = computeDurationMs(run.startedAt ?? run.queuedAt, now)\n if (context.jobs) {\n run.jobs = context.jobs\n }\n if (context.steps) {\n // optional override steps already included in jobs\n }\n return run\n })\n\n if (updated) {\n await this.runCoordinator.releaseConcurrency(updated)\n await this.publishRunEvent(\n status === 'failed'\n ? EVENT_NAMES.run.failed\n : status === 'cancelled'\n ? EVENT_NAMES.run.cancelled\n : EVENT_NAMES.run.finished,\n updated,\n )\n\n await this.snapshotTerminalRun(updated)\n }\n\n return updated\n }\n\n /**\n * Persist a snapshot for a run that just reached a terminal state, so it\n * can be replayed from any step later (`replayRun`, used by both\n * `workflow runs restart --from-step` and `rerun --failed-only`). Only\n * 'success'/'failed' carry meaningful step output data worth snapshotting.\n *\n * Shared by finalizeRun() and checkRunCompletion() — checkRunCompletion is\n * the run-completion path actually driven by the worker in production, so\n * without this call here, no snapshot is ever created outside of tests\n * that call finalizeRun() directly (issue #263).\n */\n private async snapshotTerminalRun(run: WorkflowRun): Promise<void> {\n if (run.status !== 'success' && run.status !== 'failed') {\n return\n }\n\n const stepOutputs: Record<string, Record<string, unknown>> = {}\n for (const job of run.jobs) {\n for (const step of job.steps) {\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n stepOutputs[step.id] = step.outputs\n }\n }\n }\n\n // Logged at error (not warn) because this silently disables\n // `workflow runs restart --from-step` and `rerun --failed-only` for\n // this run — replayRun() will report a generic \"no snapshot\" with no\n // other trace of why.\n await this.snapshotStorage.createSnapshot(run, stepOutputs, run.env ?? {}).catch((err) => {\n this.logger.error(\n 'Failed to create run snapshot — restart --from-step and rerun --failed-only will not work for this run',\n err instanceof Error ? err : new Error(String(err)),\n { runId: run.id, status: run.status },\n )\n })\n }\n\n async nextJob(): Promise<JobQueueEntry | null> {\n return this.scheduler.dequeueJob()\n }\n\n async rescheduleJob(entry: JobQueueEntry, delayMs: number): Promise<void> {\n await this.scheduler.reschedule(entry, delayMs)\n }\n\n async publishRunEvent(\n type: WorkflowEventName,\n run: WorkflowRun,\n ): Promise<void> {\n await this.events.publish({\n type,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n }\n\n /**\n * Publish a log entry for real-time streaming to Studio UI.\n */\n async publishLog(\n runId: string,\n jobId: string,\n stepId: string,\n entry: { level: string; message: string; stream: string; lineNo: number; timestamp: string; meta?: Record<string, unknown> },\n stepName?: string,\n ): Promise<void> {\n await this.events.publish({\n type: EVENT_NAMES.log.appended,\n runId,\n jobId,\n stepId,\n payload: stepName ? { ...entry, stepName } : entry,\n })\n }\n\n /**\n * Create a snapshot of the current run state\n */\n async createSnapshot(\n runId: string,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot | null> {\n const run = await this.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot create snapshot: run not found', { runId })\n return null\n }\n\n return this.snapshotStorage.createSnapshot(run, stepOutputs, env, refs)\n }\n\n /**\n * Get a snapshot for a run\n */\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n return this.snapshotStorage.getSnapshot(runId)\n }\n\n /**\n * Replay a run from a snapshot, optionally starting from a specific step\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Replay orchestration: handles snapshot loading, step state transitions (before/at/after fromStep), env merging, job traversal, and conditional status reset logic\n async replayRun(\n runId: string,\n options: {\n fromStepId?: string\n stepOutputs?: Record<string, Record<string, unknown>>\n env?: Record<string, string>\n } = {},\n ): Promise<WorkflowRun | null> {\n // Load snapshot\n const snapshot = await this.snapshotStorage.getSnapshot(runId)\n if (!snapshot) {\n this.logger.warn('Cannot replay: snapshot not found', { runId })\n return null\n }\n\n if (snapshot.refs?.workspaceSnapshotId || snapshot.refs?.environmentSnapshotId) {\n if (!this.options.snapshotManager) {\n throw new Error('SnapshotManager is required for replay with infra snapshot references')\n }\n\n if (snapshot.refs.workspaceSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.workspaceSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n\n if (snapshot.refs.environmentSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.environmentSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n }\n\n // Restore run state\n const restoredRun = snapshot.run\n\n // Restore env if provided\n if (options.env) {\n restoredRun.env = { ...snapshot.env, ...options.env }\n } else {\n restoredRun.env = snapshot.env\n }\n\n // Validate fromStepId before any state mutation — a non-existent ID must be\n // a hard error (404), not a silent success that saves a broken run state.\n if (options.fromStepId) {\n const stepExists = restoredRun.jobs.some(job =>\n job.steps.some(s => s.id === options.fromStepId),\n )\n if (!stepExists) {\n throw new Error(`Step not found: ${options.fromStepId}`)\n }\n }\n\n // If fromStepId is specified, mark all steps before it as completed.\n // foundStep is declared outside the job loop so jobs after the job\n // containing fromStepId have all their steps correctly reset to queued.\n if (options.fromStepId) {\n let foundStep = false\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n if (step.id === options.fromStepId) {\n foundStep = true\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n continue\n }\n if (!foundStep) {\n // Mark previous steps as completed\n if (step.status === 'running' || step.status === 'queued') {\n step.status = 'success'\n step.finishedAt = step.finishedAt ?? new Date().toISOString()\n }\n } else {\n // Reset steps after the target step\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n } else {\n // Reset all steps to queued\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n\n // Reconstruct job.blocked and job.pendingDependencies based on the reset\n // step state. In a completed run all jobs have blocked=false, so without\n // this step scheduleRun would enqueue all jobs simultaneously, ignoring\n // declared dependency ordering (needs: [...]).\n const isJobComplete = (job: JobRun): boolean =>\n job.steps.every(s => s.status === 'success' || s.status === 'skipped')\n\n for (const job of restoredRun.jobs) {\n if (!job.needs || job.needs.length === 0) {\n job.blocked = false\n job.pendingDependencies = []\n continue\n }\n const pendingDeps = job.needs.filter(depName => {\n const depJob = restoredRun.jobs.find(j => j.jobName === depName)\n return depJob !== undefined && !isJobComplete(depJob)\n })\n job.pendingDependencies = pendingDeps\n job.blocked = pendingDeps.length > 0\n }\n\n // Create a new run ID so the original run's history is preserved.\n // Overwriting the same ID would destroy history and corrupt state if the\n // original run's worker is still live (race condition).\n const newRunId = randomUUID()\n const newNow = new Date().toISOString()\n const newRun: WorkflowRun = {\n ...restoredRun,\n id: newRunId,\n status: 'queued',\n createdAt: newNow,\n queuedAt: newNow,\n startedAt: undefined,\n finishedAt: undefined,\n durationMs: undefined,\n result: undefined,\n }\n\n // Save the new run (original run at its own ID is untouched)\n await this.stateStore.saveRun(newRun)\n\n // Schedule the new run\n await this.scheduler.scheduleRun(newRun)\n\n this.logger.info('Run replayed as new run from snapshot', {\n originalRunId: runId,\n newRunId,\n fromStepId: options.fromStepId,\n })\n\n return newRun\n }\n\n /**\n * Delete a snapshot\n */\n async deleteSnapshot(runId: string): Promise<void> {\n await this.snapshotStorage.deleteSnapshot(runId)\n }\n\n /**\n * Get all active workflow executions (running or queued).\n * Returns array of WorkflowRun objects with status 'running' or 'queued'.\n */\n async getActiveExecutions(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter for active ones\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter(\n (run): run is WorkflowRun =>\n run !== null && (run.status === 'running' || run.status === 'queued'),\n )\n }\n\n /**\n * Get all workflow runs (all statuses).\n * Returns array of all WorkflowRun objects ordered by creation time.\n */\n async getAllRuns(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter out nulls\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n /**\n * List all workflow runs.\n * Returns array of all runs in the system.\n * Alias for getAllRuns() - maintained for backward compatibility.\n */\n async listRuns(): Promise<WorkflowRun[]> {\n return this.getAllRuns()\n }\n\n /**\n * Get workflow engine metrics.\n * Returns statistics about runs, jobs, and system health.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Metrics aggregation: iterates all runs and jobs, counts by status (6 run statuses + 4 job statuses), handles nulls\n async getMetrics(): Promise<{\n runs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n cancelled: number\n dlq: number\n }\n jobs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n }\n }> {\n // Get all run IDs\n const runIds = await this.stateStore.getAllRunIds()\n\n const metrics = {\n runs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n dlq: 0,\n },\n jobs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n },\n }\n\n // Fetch all runs in parallel\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n // Aggregate metrics from all runs\n for (const run of runs) {\n if (!run) {continue}\n\n metrics.runs.total++\n\n // Count run status\n if (run.status === 'queued') {metrics.runs.queued++}\n else if (run.status === 'running') {metrics.runs.running++}\n else if (run.status === 'success') {metrics.runs.completed++}\n else if (run.status === 'failed') {metrics.runs.failed++}\n else if (run.status === 'cancelled') {metrics.runs.cancelled++}\n else if (run.status === 'dlq') {metrics.runs.dlq++}\n\n // Count job statuses\n for (const job of run.jobs) {\n metrics.jobs.total++\n if (job.status === 'queued') {metrics.jobs.queued++}\n else if (job.status === 'running') {metrics.jobs.running++}\n else if (job.status === 'success') {metrics.jobs.completed++}\n else if (job.status === 'failed') {metrics.jobs.failed++}\n }\n }\n\n return metrics\n }\n}\n\nfunction computeDurationMs(\n startedAt: string | undefined,\n finishedAt: string,\n): number | undefined {\n if (!startedAt) {\n return undefined\n }\n const start = Date.parse(startedAt)\n const end = Date.parse(finishedAt)\n if (Number.isNaN(start) || Number.isNaN(end)) {\n return undefined\n }\n return Math.max(0, end - start)\n}\n","import { join } from 'node:path'\nimport type { ArtifactMergeConfig, ArtifactMergeStrategy } from '@kb-labs/workflow-contracts'\nimport {\n createFileSystemArtifactClient,\n type ArtifactClient,\n} from '@kb-labs/workflow-artifacts'\nimport type { StateStore } from './state-store'\nimport type { EngineLogger } from './types'\n\nexport interface ArtifactMergerOptions {\n stateStore: StateStore\n logger: EngineLogger\n artifactsRoot: string\n}\n\nexport class ArtifactMerger {\n constructor(private readonly options: ArtifactMergerOptions) {}\n\n async mergeArtifacts(\n config: ArtifactMergeConfig,\n targetArtifacts: ArtifactClient,\n currentRunId: string,\n ): Promise<void> {\n const { strategy, from } = config\n\n this.options.logger.debug('Starting artifact merge', {\n strategy,\n sources: from.length,\n currentRunId,\n })\n\n // Load artifacts from all sources (parallel execution)\n const results = await Promise.allSettled(\n from.map(source =>\n this.loadArtifactsFromRun(source.runId, source.jobId).then(\n artifacts => ({ source, artifacts, success: true as const }),\n error => ({ source, error, success: false as const }),\n ),\n ),\n )\n\n const sourceArtifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n sourceArtifacts.push(...result.value.artifacts)\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifacts from source', {\n runId: result.value.source.runId,\n jobId: result.value.source.jobId,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n if (sourceArtifacts.length === 0) {\n this.options.logger.warn('No artifacts found to merge', {\n sources: from.length,\n })\n return\n }\n\n // Apply merge strategy\n await this.applyMergeStrategy(strategy, sourceArtifacts, targetArtifacts)\n\n this.options.logger.info('Artifact merge completed', {\n strategy,\n mergedCount: sourceArtifacts.length,\n })\n }\n\n private async loadArtifactsFromRun(\n runId: string,\n jobId?: string,\n ): Promise<Array<{ path: string; content: unknown }>> {\n // Load run from state store\n const run = await this.options.stateStore.getRun(runId)\n if (!run) {\n throw new Error(`Run ${runId} not found`)\n }\n\n // Find the job\n const job = jobId\n ? run.jobs.find((j) => j.id === jobId)\n : run.jobs[0] // Use first job if not specified\n\n if (!job) {\n throw new Error(`Job ${jobId ?? 'first'} not found in run ${runId}`)\n }\n\n // Get artifact paths from job\n const artifactPaths = job.artifacts?.produce ?? []\n if (artifactPaths.length === 0) {\n return []\n }\n\n // Load artifacts from filesystem (parallel execution)\n const sourceArtifacts = createFileSystemArtifactClient(join(\n this.options.artifactsRoot,\n runId,\n job.jobName,\n ))\n\n const results = await Promise.allSettled(\n artifactPaths.map(artifactPath => {\n return this.loadArtifactContent(sourceArtifacts, artifactPath).then(\n content => ({ artifactPath, content, success: true as const }),\n error => ({ artifactPath, error, success: false as const }),\n )\n }),\n )\n\n const artifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n artifacts.push({ path: result.value.artifactPath, content: result.value.content })\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifact', {\n runId,\n jobId: job.id,\n artifactPath: result.value.artifactPath,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n return artifacts\n }\n\n private async loadArtifactContent(\n artifacts: ArtifactClient,\n artifactPath: string,\n ): Promise<unknown> {\n try {\n const content = (await artifacts.consume(artifactPath)).toString('utf8')\n // Try to parse as JSON, fallback to string\n try {\n return JSON.parse(content)\n } catch {\n return content\n }\n } catch (error) {\n throw new Error(\n `Failed to read artifact '${artifactPath}': ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n private async applyMergeStrategy(\n strategy: ArtifactMergeStrategy,\n sourceArtifacts: Array<{ path: string; content: unknown }>,\n targetArtifacts: ArtifactClient,\n ): Promise<void> {\n // Group artifacts by path\n const artifactsByPath = new Map<string, unknown[]>()\n\n for (const artifact of sourceArtifacts) {\n if (!artifactsByPath.has(artifact.path)) {\n artifactsByPath.set(artifact.path, [])\n }\n artifactsByPath.get(artifact.path)!.push(artifact.content)\n }\n\n // Apply strategy and save for each path in parallel\n await Promise.all(\n Array.from(artifactsByPath.entries()).map(async ([path, contents]) => {\n let merged: unknown\n\n switch (strategy) {\n case 'append': {\n // Append: combine arrays or concatenate strings\n merged = this.mergeAppend(contents)\n break\n }\n case 'overwrite': {\n // Overwrite: use last value\n merged = contents[contents.length - 1]\n break\n }\n case 'json-merge': {\n // JSON merge: deep merge objects\n merged = this.mergeJson(contents)\n break\n }\n default: {\n this.options.logger.warn('Unknown merge strategy, using overwrite', {\n strategy,\n path,\n })\n merged = contents[contents.length - 1]\n }\n }\n\n // Save merged artifact\n await this.saveMergedArtifact(targetArtifacts, path, merged)\n }),\n )\n }\n\n private mergeAppend(contents: unknown[]): unknown {\n // If all are arrays, concatenate\n if (contents.every((c) => Array.isArray(c))) {\n return (contents as unknown[][]).flat()\n }\n\n // If all are strings, concatenate with newline\n if (contents.every((c) => typeof c === 'string')) {\n return (contents as string[]).join('\\n')\n }\n\n // Otherwise, wrap in array\n return contents\n }\n\n private mergeJson(contents: unknown[]): unknown {\n // Start with empty object\n let merged: Record<string, unknown> = {}\n\n for (const content of contents) {\n if (typeof content === 'object' && content !== null && !Array.isArray(content)) {\n merged = this.deepMerge(merged, content as Record<string, unknown>)\n } else {\n // If not an object, use last value\n merged = content as Record<string, unknown>\n }\n }\n\n return merged\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): Record<string, unknown> {\n const result = { ...target }\n\n for (const [key, value] of Object.entries(source)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Recursive merge for nested objects\n result[key] = this.deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n )\n } else {\n // Overwrite for primitives, arrays, or different types\n result[key] = value\n }\n }\n\n return result\n }\n\n private async saveMergedArtifact(\n artifacts: ArtifactClient,\n path: string,\n content: unknown,\n ): Promise<void> {\n // Convert content to string\n const contentString =\n typeof content === 'string'\n ? content\n : JSON.stringify(content, null, 2)\n\n await artifacts.produce(path, contentString)\n\n this.options.logger.debug('Saved merged artifact', { path })\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-converter\n *\n * Pure conversion utilities for plugin manifest declarations → WorkflowRuntime.\n * No I/O, no caching, no platform dependency — testable in isolation.\n *\n * Used by ManifestScanner which handles fetch + cache responsibilities.\n */\n\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n} from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowSchedule,\n} from './manifest-scanner.js';\n\nexport class ManifestConverter {\n convertWorkflowHandler(\n pluginId: string,\n handler: WorkflowHandlerDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}/${handler.id}`;\n\n return {\n kind: 'workflow',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', pluginId],\n triggers: [{ type: 'manual' }],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n convertJobHandler(\n pluginId: string,\n handler: JobHandlerDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}:job:${handler.id}`;\n\n return {\n kind: 'job',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', 'job', pluginId],\n triggers: [{ type: 'manual' }],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n convertCronSchedule(\n pluginId: string,\n cronDecl: CronDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}:cron:${cronDecl.id}`;\n\n const schedule: WorkflowSchedule = {\n cron: cronDecl.schedule,\n enabled: cronDecl.enabled ?? true,\n };\n\n return {\n kind: 'cron',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: cronDecl.describe ?? cronDecl.id,\n description: cronDecl.describe,\n tags: ['plugin', 'cron', pluginId],\n triggers: [\n {\n type: 'schedule',\n config: { cron: cronDecl.schedule, timezone: cronDecl.timezone },\n },\n ],\n handler: undefined,\n schedule,\n status: (cronDecl.enabled ?? true) ? 'active' : 'disabled',\n permissions: cronDecl.permissions,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-scanner\n *\n * Scans plugin manifests for workflows and jobs, converting them to unified WorkflowRuntime format.\n *\n * ## Features\n * - Discovers workflows from `manifest.workflows.handlers`\n * - Discovers jobs from `manifest.jobs`\n * - Converts to unified WorkflowRuntime representation\n * - Caches results via Platform state for performance\n *\n * ## Usage\n * ```typescript\n * const scanner = new ManifestScanner({ cliApi, platform });\n * const workflows = await scanner.scanPlugins();\n * ```\n */\n\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n PlatformServices,\n ManifestV3,\n} from '@kb-labs/plugin-contracts';\nimport { ManifestConverter } from './manifest-converter.js';\n\n// 'v1' guard: increment when WorkflowRuntime format changes to prevent stale cache reads\nconst CACHE_KEY_WORKFLOWS = 'manifest-scanner:v1:workflows' as const;\n\n/**\n * Workflow trigger type\n */\nexport type WorkflowTriggerType = 'manual' | 'webhook' | 'push' | 'schedule' | 'event';\n\n/**\n * Workflow trigger configuration\n */\nexport interface WorkflowTrigger {\n type: WorkflowTriggerType;\n config?: Record<string, unknown>;\n}\n\n/**\n * Schedule configuration for workflows\n */\nexport interface WorkflowSchedule {\n /** Cron expression (e.g., \"0 2 * * *\") */\n cron: string;\n /** Whether schedule is enabled */\n enabled: boolean;\n /** Next run time (calculated) */\n nextRun?: Date;\n /** Last run time */\n lastRun?: Date;\n}\n\n/**\n * Workflow runtime statistics\n */\nexport interface WorkflowStats {\n totalRuns: number;\n successRuns: number;\n failedRuns: number;\n lastRunStatus?: 'success' | 'failed' | 'cancelled';\n lastRunAt?: Date;\n avgDurationMs?: number;\n}\n\n/**\n * Unified workflow runtime representation.\n *\n * Used for both manifest-based and standalone workflows.\n */\nexport interface WorkflowRuntime {\n // Identification\n id: string;\n /** Discriminator for workflow kind. Enables type-safe routing in consumers. */\n kind?: 'workflow' | 'job' | 'cron';\n source: 'manifest' | 'standalone' | 'plugin';\n\n // Manifest-based fields\n pluginId?: string;\n manifestPath?: string;\n\n // Common metadata\n name: string;\n description?: string;\n tags?: string[];\n\n // Execution configuration\n triggers: WorkflowTrigger[];\n handler?: string; // For manifest-based workflows\n\n // Schedule (if applicable)\n schedule?: WorkflowSchedule;\n\n // Status\n status: 'active' | 'paused' | 'disabled';\n\n // Statistics (optional, populated from runtime)\n stats?: WorkflowStats;\n\n // Permissions\n permissions?: unknown; // From manifest\n\n // Full spec stored for execution (standalone workflows)\n input?: unknown;\n output?: unknown;\n // Declared input parameter schema exposed via REST API\n inputSchema?: Record<string, { type: 'string' | 'number' | 'boolean'; description?: string; required?: boolean; default?: unknown }>;\n\n /** Semantic version from workflow spec (e.g. \"6.6.0\") */\n version?: string;\n /** ISO timestamp of last modification */\n updatedAt?: string;\n}\n\n/**\n * Options for ManifestScanner\n */\nexport interface ManifestScannerOptions {\n /** CLI API instance */\n cliApi: IEntityRegistry;\n\n /** Platform services (for state, logger, etc.) */\n platform: PlatformServices;\n\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n}\n\n/**\n * Manifest Scanner Service\n *\n * Discovers workflows and jobs from installed plugin manifests.\n */\nexport class ManifestScanner {\n private readonly cliApi: IEntityRegistry;\n private readonly platform: PlatformServices;\n private readonly cacheTtlMs: number;\n private readonly converter = new ManifestConverter();\n\n constructor(options: ManifestScannerOptions) {\n this.cliApi = options.cliApi;\n this.platform = options.platform;\n this.cacheTtlMs = options.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Scan all installed plugins for workflows and jobs.\n * Purpose: listing — populates the REST API GET /api/v1/workflows catalog.\n * (CronDiscovery in daemon handles scheduling — different output, different consumer.)\n *\n * Returns unified WorkflowRuntime representations.\n */\n async scanPlugins(): Promise<WorkflowRuntime[]> {\n // Check cache first (via platform cache)\n if (this.platform.cache) {\n const cached = await this.platform.cache.get<WorkflowRuntime[]>(CACHE_KEY_WORKFLOWS);\n if (cached) {\n this.platform.logger?.debug('ManifestScanner: Using cached workflows', { count: cached.length });\n return cached;\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Querying entity registry');\n const workflows: WorkflowRuntime[] = [];\n\n // Query workflow, job, and cron entities from registry (extracted from ManifestV3 by catalog)\n const workflowEntities = this.cliApi.queryEntities({ kind: 'workflow' });\n const jobEntities = this.cliApi.queryEntities({ kind: 'job' });\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n // Get plugin roots for handler path resolution\n const pluginRoots = new Map<string, string>();\n for (const plugin of this.cliApi.listPlugins()) {\n pluginRoots.set(plugin.id, plugin.source.path);\n }\n\n const allEntities = [\n ...workflowEntities.map(e => ({ entity: e, converter: 'workflow' as const })),\n ...jobEntities.map(e => ({ entity: e, converter: 'job' as const })),\n ...cronEntities.map(e => ({ entity: e, converter: 'cron' as const })),\n ];\n\n for (const { entity, converter } of allEntities) {\n const root = pluginRoots.get(entity.ref.pluginId);\n if (!root) {\n this.platform.logger?.warn('ManifestScanner: Plugin root not found, skipping entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n });\n continue;\n }\n\n try {\n // entity.declaration is typed as unknown in the registry — cast to concrete decl type\n if (converter === 'workflow') {\n workflows.push(this.converter.convertWorkflowHandler(entity.ref.pluginId, entity.declaration as unknown as WorkflowHandlerDecl, root));\n } else if (converter === 'job') {\n workflows.push(this.converter.convertJobHandler(entity.ref.pluginId, entity.declaration as unknown as JobHandlerDecl, root));\n } else {\n workflows.push(this.converter.convertCronSchedule(entity.ref.pluginId, entity.declaration as unknown as CronDecl, root));\n }\n } catch (err) {\n this.platform.logger?.warn('ManifestScanner: Failed to convert entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Scan workflow templates (static YAML files declared in manifest.workflows.templates)\n const snapshot = this.cliApi.snapshot();\n let templatesCount = 0;\n for (const entry of snapshot.manifests ?? []) {\n // ManifestV3 has workflows?: { templates?: WorkflowTemplateDecl[] } — no cast needed\n const manifest = entry.manifest as ManifestV3;\n const templates = manifest.workflows?.templates ?? [];\n for (const templateDecl of templates) {\n const id = `plugin:${entry.pluginId}/${templateDecl.id}`;\n workflows.push({\n id,\n source: 'plugin',\n pluginId: entry.pluginId,\n name: templateDecl.describe ?? templateDecl.id,\n description: templateDecl.describe,\n tags: templateDecl.tags,\n triggers: [{ type: 'manual' }],\n status: 'active',\n });\n templatesCount++;\n }\n }\n\n this.platform.logger?.info('ManifestScanner: Discovered workflows via registry', {\n count: workflows.length,\n workflows: workflowEntities.length,\n jobs: jobEntities.length,\n crons: cronEntities.length,\n templates: templatesCount,\n });\n\n // Cache results (via platform cache)\n if (this.platform.cache) {\n await this.platform.cache.set(CACHE_KEY_WORKFLOWS, workflows, this.cacheTtlMs);\n }\n\n return workflows;\n }\n\n /**\n * Scan all installed plugins for job handlers only.\n *\n * Returns information needed to register handlers in JobManager.\n */\n async scanJobHandlers(): Promise<Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }>> {\n const snapshot = this.cliApi.snapshot();\n const jobHandlers: Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }> = [];\n\n for (const entry of snapshot.manifests ?? []) {\n const handlers = entry.manifest.jobs?.handlers ?? [];\n for (const handler of handlers) {\n jobHandlers.push({\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler,\n });\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Discovered job handlers', {\n count: jobHandlers.length,\n });\n\n return jobHandlers;\n }\n\n /**\n * Clear cache (useful for testing or force refresh).\n */\n async clearCache(): Promise<void> {\n if (this.platform.cache) {\n await this.platform.cache.delete(CACHE_KEY_WORKFLOWS);\n this.platform.logger?.debug('ManifestScanner: Cache cleared');\n }\n }\n\n /**\n * Watch for plugin changes and invalidate cache.\n *\n * @param callback Optional callback when workflows change\n * @returns Unsubscribe function\n */\n watchPlugins(callback?: (workflows: WorkflowRuntime[]) => void): () => void {\n return this.cliApi.onChange(async () => {\n // Invalidate cache on plugin changes\n await this.clearCache();\n\n // Notify callback\n if (callback) {\n const workflows = await this.scanPlugins();\n callback(workflows);\n }\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-repository\n *\n * Repository for standalone workflow definitions.\n *\n * ## Features\n * - CRUD operations for user-created workflows\n * - File-based storage via platform.storage (`.kb/workflows/*.yaml`)\n * - Validation using WorkflowSpecSchema\n * - Conversion to unified WorkflowRuntime format\n *\n * ## Usage\n * ```typescript\n * const repo = new WorkflowRepository({ platform });\n * const workflow = await repo.create(spec);\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, readdir, mkdir, access } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowTrigger,\n WorkflowSchedule,\n WorkflowStats,\n} from './manifest-scanner';\n\n/**\n * Stored workflow metadata (what we persist to disk)\n */\ninterface StoredWorkflow {\n id: string;\n spec: WorkflowSpec;\n createdAt: string;\n updatedAt: string;\n status: 'active' | 'paused' | 'disabled';\n stats?: WorkflowStats;\n}\n\n/**\n * List options for filtering workflows\n */\nexport interface WorkflowListOptions {\n status?: 'active' | 'paused' | 'disabled';\n tags?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Options for WorkflowRepository\n */\nexport interface WorkflowRepositoryOptions {\n /** Platform services (for storage, logger, etc.) */\n platform: PlatformServices;\n\n /** Storage directory for workflows (default: '.kb/workflows') */\n storageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Workflow Repository\n *\n * Manages standalone workflow definitions (user-created via UI/API).\n * Uses platform.storage for persistence.\n */\nexport class WorkflowRepository {\n private readonly platform: PlatformServices;\n private readonly storageDir: string;\n private readonly workspaceRoot: string;\n private readonly absoluteStorageDir: string;\n\n constructor(options: WorkflowRepositoryOptions) {\n this.platform = options.platform;\n this.storageDir = options.storageDir ?? '.kb/workflows';\n this.workspaceRoot = options.workspaceRoot ?? process.cwd();\n this.absoluteStorageDir = resolve(this.workspaceRoot, this.storageDir);\n }\n\n /**\n * Create a new standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n // Validate spec\n const validated = WorkflowSpecSchema.parse(spec);\n\n // Generate ID\n const id = `wf-${randomUUID().slice(0, 8)}`;\n\n const stored: StoredWorkflow = {\n id,\n spec: validated,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n // Save to storage\n await this.saveWorkflow(id, stored);\n\n this.platform.logger?.info('WorkflowRepository: Created workflow', {\n id,\n name: spec.name,\n });\n\n return this.toRuntime(stored);\n }\n\n /**\n * Get workflow by ID.\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }\n\n /**\n * List all workflows with optional filtering.\n */\n async list(options?: WorkflowListOptions): Promise<WorkflowRuntime[]> {\n const allFiles = await this.listWorkflowFiles();\n\n // Load all workflows in parallel\n const allWorkflows = await Promise.all(\n allFiles.map(async filename => {\n const id = filename.replace(/\\.(yaml|yml)$/, '');\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }),\n );\n\n // Filter out nulls and apply status filter\n const workflows = allWorkflows.filter((workflow): workflow is WorkflowRuntime => {\n if (!workflow) {return false;}\n if (options?.status && workflow.status !== options.status) {return false;}\n return true;\n });\n\n // Apply pagination\n if (options?.offset !== undefined || options?.limit !== undefined) {\n const start = options.offset ?? 0;\n const end = options.limit ? start + options.limit : undefined;\n return workflows.slice(start, end);\n }\n\n return workflows;\n }\n\n /**\n * Update existing workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n // Merge with existing spec\n const updatedSpec = { ...stored.spec, ...spec };\n\n // Validate merged spec\n const validated = WorkflowSpecSchema.parse(updatedSpec);\n\n const updated: StoredWorkflow = {\n ...stored,\n spec: validated,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n\n this.platform.logger?.info('WorkflowRepository: Updated workflow', {\n id,\n name: validated.name,\n });\n\n return this.toRuntime(updated);\n }\n\n /**\n * Delete workflow.\n */\n async delete(id: string): Promise<void> {\n const path = await this.getWorkflowPath(id);\n if (!path) { throw new Error(`Invalid workflow ID for deletion: ${id}`); }\n\n try {\n await this.platform.storage.delete(path);\n this.platform.logger?.info('WorkflowRepository: Deleted workflow', { id });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Delete failed',\n error instanceof Error ? error : undefined,\n { id }\n );\n throw error;\n }\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n await this.updateStatus(id, 'disabled');\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n await this.updateStatus(id, 'paused');\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Update workflow statistics.\n */\n async updateStats(id: string, stats: Partial<WorkflowStats>): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n stats: { ...stored.stats, ...stats } as WorkflowStats,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async updateStatus(\n id: string,\n status: 'active' | 'paused' | 'disabled'\n ): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n status,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n this.platform.logger?.info('WorkflowRepository: Updated workflow status', {\n id,\n status,\n });\n }\n\n private async getWorkflowPath(id: string): Promise<string | null> {\n // Block path traversal: IDs with directory separators or dot-sequences can't be file-based\n if (id.includes('/') || id.includes('\\\\') || id.includes('..') || id.startsWith('.')) {\n return null;\n }\n const ymlPath = join(this.absoluteStorageDir, `${id}.yml`);\n const yamlPath = join(this.absoluteStorageDir, `${id}.yaml`);\n return access(ymlPath).then(() => ymlPath).catch(() => yamlPath);\n }\n\n private async saveWorkflow(id: string, workflow: StoredWorkflow): Promise<void> {\n const path = await this.getWorkflowPath(id);\n if (!path) { throw new Error(`Invalid workflow ID for storage: ${id}`); }\n const yaml = stringifyYaml(workflow, { indent: 2 });\n\n try {\n await mkdir(this.absoluteStorageDir, { recursive: true });\n await writeFile(path, yaml, 'utf-8');\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Save failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n throw error;\n }\n }\n\n private async loadWorkflow(id: string): Promise<StoredWorkflow | null> {\n const path = await this.getWorkflowPath(id);\n if (!path) { return null; }\n\n try {\n const content = await readFile(path, 'utf-8');\n const parsed = parseYaml(content) as Record<string, unknown>;\n\n // Check if it's already in StoredWorkflow format\n if (parsed.id && parsed.spec && parsed.createdAt) {\n // Force id to the filename so list()/get() stay consistent even if the\n // file was renamed after creation (B-016).\n return { ...(parsed as unknown as StoredWorkflow), id };\n }\n\n // Otherwise, it's a simple workflow YAML - convert to StoredWorkflow\n const candidateSpec = {\n name: parsed.name as string,\n version: (parsed.version as string) || '1.0.0',\n description: parsed.description as string | undefined,\n on: (parsed.on as WorkflowSpec['on']) || { manual: true },\n isolation: parsed.isolation as WorkflowSpec['isolation'],\n inputs: parsed.inputs as WorkflowSpec['inputs'],\n jobs: parsed.jobs as WorkflowSpec['jobs'],\n env: parsed.env as Record<string, string> | undefined,\n secrets: parsed.secrets as string[] | undefined,\n };\n\n // Validate against the schema so a structurally-invalid file (e.g. no\n // jobs, missing name) is NOT presented as a valid, runnable workflow.\n // Surfacing it as 'active' silently masked broken definitions (B-015).\n const validation = WorkflowSpecSchema.safeParse(candidateSpec);\n if (!validation.success) {\n this.platform.logger?.warn(\n `WorkflowRepository: skipping invalid workflow \"${id}\" — ${validation.error.issues\n .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('; ')}`,\n { id, path },\n );\n return null;\n }\n const spec: WorkflowSpec = validation.data;\n\n const stored: StoredWorkflow = {\n // The filename is the canonical id for file-based workflows. Using the\n // inner `id:` here made list() report an id that get()/getWorkflowPath()\n // (which resolve by filename) could not find → POST /runs 404 (B-016).\n id,\n spec,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n return stored;\n } catch (error) {\n // File not found is expected, other errors should be logged\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: Load failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n return null;\n }\n }\n\n private async listWorkflowFiles(): Promise<string[]> {\n try {\n const files = await readdir(this.absoluteStorageDir);\n return files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return [];\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: List failed',\n error instanceof Error ? error : undefined\n );\n return [];\n }\n }\n\n /**\n * Convert stored workflow to WorkflowRuntime format.\n */\n private toRuntime(stored: StoredWorkflow): WorkflowRuntime {\n const { id, spec, status, stats } = stored;\n\n // Convert triggers from spec.on to WorkflowTrigger[]\n const triggers: WorkflowTrigger[] = [];\n if (spec.on.manual) {\n triggers.push({ type: 'manual' });\n }\n if (spec.on.push) {\n triggers.push({ type: 'push' });\n }\n if (spec.on.webhook) {\n triggers.push({\n type: 'webhook',\n config: typeof spec.on.webhook === 'object' ? spec.on.webhook : undefined,\n });\n }\n\n // Extract schedule if present\n let schedule: WorkflowSchedule | undefined;\n if (spec.on.schedule) {\n triggers.push({\n type: 'schedule',\n config: spec.on.schedule,\n });\n\n schedule = {\n cron: spec.on.schedule.cron,\n enabled: status === 'active',\n };\n }\n\n // Extract tags from spec (we can use env vars or description as source)\n const tags: string[] = ['standalone'];\n if (spec.description) {\n // Extract hashtags from description\n const hashtagMatches = spec.description.match(/#\\w+/g);\n if (hashtagMatches) {\n tags.push(...hashtagMatches.map((t) => t.slice(1)));\n }\n }\n\n return {\n id,\n source: 'standalone',\n name: spec.name,\n description: spec.description,\n tags,\n triggers,\n schedule,\n status,\n stats,\n // Store full spec for execution\n input: spec,\n // Expose declared input schema for REST API / Studio UI\n inputSchema: spec.inputs,\n version: spec.version,\n updatedAt: stored.updatedAt,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-service\n *\n * Unified service for managing all workflows (manifest-based + standalone).\n *\n * ## Features\n * - Combines ManifestScanner and WorkflowRepository\n * - Unified interface for listing/getting workflows from both sources\n * - Provides available handlers for UI autocomplete\n * - Validates workflow specs\n *\n * ## Usage\n * ```typescript\n * const service = new WorkflowService({ cliApi, platform });\n * const allWorkflows = await service.listAll();\n * const workflow = await service.get('release-manager/create-release');\n * ```\n */\n\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { ManifestScanner, type WorkflowRuntime } from './manifest-scanner';\nimport { WorkflowRepository, type WorkflowListOptions } from './workflow-repository';\n\n/**\n * Handler information for UI autocomplete\n */\nexport interface WorkflowHandlerInfo {\n /** Handler ID (e.g., \"release-manager/create-release\") */\n id: string;\n /** Plugin ID */\n pluginId: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Input schema */\n inputSchema?: unknown;\n /** Output schema */\n outputSchema?: unknown;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * List options for workflows\n */\nexport interface WorkflowServiceListOptions extends WorkflowListOptions {\n /** Filter by source type */\n source?: 'manifest' | 'standalone';\n}\n\n/**\n * Options for WorkflowService\n */\nexport interface WorkflowServiceOptions {\n /** CLI API for plugin manifest scanning */\n cliApi: IEntityRegistry;\n\n /** Platform services */\n platform: PlatformServices;\n\n /** Cache TTL for manifest scanner (ms) */\n manifestCacheTtlMs?: number;\n\n /** Storage directory for standalone workflows */\n workflowStorageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Unified Workflow Service\n *\n * Combines manifest-based and standalone workflows into a single interface.\n */\nexport class WorkflowService {\n private readonly scanner: ManifestScanner;\n private readonly repository: WorkflowRepository;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowServiceOptions) {\n this.platform = options.platform;\n\n this.scanner = new ManifestScanner({\n cliApi: options.cliApi,\n platform: options.platform,\n cacheTtlMs: options.manifestCacheTtlMs,\n });\n\n this.repository = new WorkflowRepository({\n platform: options.platform,\n storageDir: options.workflowStorageDir,\n workspaceRoot: options.workspaceRoot,\n });\n }\n\n /**\n * List all workflows (manifest + standalone).\n */\n async listAll(options?: WorkflowServiceListOptions): Promise<WorkflowRuntime[]> {\n const workflows: WorkflowRuntime[] = [];\n\n // Get manifest-based workflows\n if (!options?.source || options.source === 'manifest') {\n const manifestWorkflows = await this.scanner.scanPlugins();\n workflows.push(...manifestWorkflows);\n }\n\n // Get standalone workflows\n if (!options?.source || options.source === 'standalone') {\n const standaloneWorkflows = await this.repository.list(options);\n workflows.push(...standaloneWorkflows);\n }\n\n // Apply filters\n let filtered = workflows;\n\n if (options?.status) {\n filtered = filtered.filter((w) => w.status === options.status);\n }\n\n if (options?.tags && options.tags.length > 0) {\n filtered = filtered.filter((w) =>\n options.tags!.some((tag) => w.tags?.includes(tag))\n );\n }\n\n // Sort by name\n filtered.sort((a, b) => a.name.localeCompare(b.name));\n\n this.platform.logger?.debug('WorkflowService: Listed workflows', {\n total: filtered.length,\n manifest: filtered.filter((w) => w.source === 'manifest').length,\n standalone: filtered.filter((w) => w.source === 'standalone').length,\n });\n\n return filtered;\n }\n\n /**\n * Get workflow by ID (from either source).\n *\n * Lookup order:\n * 1. Standalone by filename-derived id (canonical, fast path)\n * 2. Standalone by `name:` field — allows `--workflow-id=dev-cycle` even\n * when the file is named `03-dev-cycle.yml` (F8 ergonomics fix)\n * 3. Manifest-based by id\n * 4. Manifest-based by name field\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n // 1. Standalone by canonical filename-derived id (fast path, B-016)\n const standalone = await this.repository.get(id);\n if (standalone) {\n return standalone;\n }\n\n // 2. Standalone by name field — name-based alias (F8)\n const allStandalone = await this.repository.list();\n const byName = allStandalone.find((w) => w.name === id);\n if (byName) {\n return byName;\n }\n\n // 3. Manifest-based by id\n const manifestWorkflows = await this.scanner.scanPlugins();\n const manifest = manifestWorkflows.find((w) => w.id === id);\n if (manifest) {\n return manifest;\n }\n\n // 4. Manifest-based by name field\n return manifestWorkflows.find((w) => w.name === id) ?? null;\n }\n\n /**\n * Create standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n this.platform.logger?.info('WorkflowService: Creating workflow', {\n name: spec.name,\n });\n\n return this.repository.create(spec);\n }\n\n /**\n * Update standalone workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot update manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Updating workflow', { id });\n\n return this.repository.update(id, spec);\n }\n\n /**\n * Delete standalone workflow.\n */\n async delete(id: string): Promise<void> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot delete manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Deleting workflow', { id });\n\n await this.repository.delete(id);\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot enable manifest-based workflow: ${id}`);\n }\n\n await this.repository.enable(id);\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot disable manifest-based workflow: ${id}`);\n }\n\n await this.repository.disable(id);\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot pause manifest-based workflow: ${id}`);\n }\n\n await this.repository.pause(id);\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot resume manifest-based workflow: ${id}`);\n }\n\n await this.repository.resume(id);\n }\n\n /**\n * Get available workflow handlers (for UI autocomplete).\n *\n * Returns manifest-based handlers that can be used in standalone workflows\n * (via `uses: \"plugin:id/handler\"`).\n */\n async getAvailableHandlers(): Promise<WorkflowHandlerInfo[]> {\n const manifestWorkflows = await this.scanner.scanPlugins();\n\n const handlers = manifestWorkflows\n .filter((w) => w.source === 'manifest' && w.handler)\n .map((w) => ({\n id: w.id,\n pluginId: w.pluginId!,\n name: w.name,\n description: w.description,\n inputSchema: w.input,\n outputSchema: w.output,\n }));\n\n this.platform.logger?.debug('WorkflowService: Listed handlers', {\n count: handlers.length,\n });\n\n return handlers;\n }\n\n /**\n * Validate workflow spec.\n */\n validate(spec: WorkflowSpec): ValidationResult {\n try {\n WorkflowSpecSchema.parse(spec);\n return { valid: true };\n } catch (error) {\n if (error && typeof error === 'object' && 'errors' in error) {\n const zodError = error as { errors: Array<{ path: (string | number)[]; message: string }> };\n return {\n valid: false,\n errors: zodError.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n };\n }\n\n return {\n valid: false,\n errors: [{ path: '', message: 'Validation failed' }],\n };\n }\n }\n\n /**\n * Refresh manifest scanner cache (force re-scan).\n */\n async refreshManifests(): Promise<void> {\n await this.scanner.clearCache();\n this.platform.logger?.info('WorkflowService: Manifest cache cleared');\n }\n}\n","import { readFile, readdir } from 'node:fs/promises'\nimport { resolve, join, basename } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport type { ILogger } from '@kb-labs/core-platform'\nimport { WorkflowLoader } from './workflow-loader'\n\nexport interface WorkflowRegistryEntry {\n id: string\n name: string\n description?: string\n filePath: string\n spec: WorkflowSpec\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowRegistryOptions {\n scanDirs: string[]\n cwd?: string\n logger: ILogger\n}\n\n/**\n * WorkflowRegistry - Auto-discovery and indexing of workflow definitions\n *\n * Scans directories for .yml workflow files and indexes them by ID.\n * Provides clean API for finding and running workflows.\n */\nexport class WorkflowRegistry {\n private entries = new Map<string, WorkflowRegistryEntry>()\n private loader: WorkflowLoader\n\n constructor(private readonly options: WorkflowRegistryOptions) {\n this.loader = new WorkflowLoader(options.logger)\n }\n\n /**\n * Scan configured directories and index all workflow files\n */\n async scan(): Promise<void> {\n this.entries.clear()\n\n const cwd = this.options.cwd ?? process.cwd()\n this.options.logger.info('Starting workflow discovery', {\n scanDirs: this.options.scanDirs,\n cwd,\n })\n\n // Sequential directory scanning - each directory is independent but readdir is async\n for (const dir of this.options.scanDirs) {\n const absoluteDir = resolve(cwd, dir)\n\n if (!existsSync(absoluteDir)) {\n this.options.logger.debug(`Directory not found, skipping`, { dir: absoluteDir })\n continue\n }\n\n try {\n const files = await readdir(absoluteDir) // eslint-disable-line no-await-in-loop\n const yamlFiles = files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))\n\n this.options.logger.debug(`Found workflow files`, {\n dir: absoluteDir,\n count: yamlFiles.length,\n })\n\n // Index all files in parallel\n await Promise.all( // eslint-disable-line no-await-in-loop\n yamlFiles.map(file => {\n const filePath = join(absoluteDir, file)\n return this.indexFile(filePath)\n }),\n )\n } catch (error) {\n this.options.logger.warn(`Failed to scan directory`, {\n dir: absoluteDir,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n this.options.logger.info('Workflow discovery complete', {\n totalWorkflows: this.entries.size,\n ids: Array.from(this.entries.keys()),\n })\n }\n\n /**\n * Index a single workflow file\n */\n private async indexFile(filePath: string): Promise<void> {\n try {\n const raw = await readFile(filePath, 'utf8')\n const parsed = this.parseWorkflowFile(raw)\n\n // Extract ID from parsed file or use filename as fallback\n const id = (parsed.id as string | undefined) || basename(filePath, '.yml').replace('.yaml', '')\n\n // Convert to WorkflowSpec format\n const spec: WorkflowSpec = {\n name: parsed.name as string,\n version: '1.0.0',\n description: parsed.description as string | undefined,\n on: (parsed.on as WorkflowSpec['on']) || { manual: true },\n isolation: parsed.isolation as WorkflowSpec['isolation'],\n jobs: parsed.jobs as WorkflowSpec['jobs'],\n env: parsed.env as Record<string, string> | undefined,\n secrets: parsed.secrets as string[] | undefined,\n }\n\n const entry: WorkflowRegistryEntry = {\n id: id as string,\n name: parsed.name as string,\n description: parsed.description as string | undefined,\n filePath,\n spec,\n metadata: parsed.metadata as Record<string, unknown> | undefined,\n }\n\n this.entries.set(id, entry)\n\n this.options.logger.debug(`Indexed workflow`, {\n id,\n name: parsed.name,\n filePath,\n })\n } catch (error) {\n this.options.logger.warn(`Failed to index workflow file`, {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Parse workflow file (YAML format with additional fields)\n */\n private parseWorkflowFile(raw: string): Record<string, unknown> {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error('Workflow file is empty')\n }\n\n // Use WorkflowLoader's parse logic but return raw parsed object\n // We need the extra fields (id, schedule, etc) that aren't in WorkflowSpec\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { parse } = require('yaml')\n return parse(trimmed)\n }\n\n /**\n * Get workflow by ID\n */\n get(id: string): WorkflowRegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /**\n * List all registered workflows\n */\n list(): WorkflowRegistryEntry[] {\n return Array.from(this.entries.values())\n }\n\n /**\n * Check if workflow exists\n */\n has(id: string): boolean {\n return this.entries.has(id)\n }\n\n /**\n * Get workflow spec by ID\n */\n getSpec(id: string): WorkflowSpec | undefined {\n const entry = this.entries.get(id)\n return entry?.spec\n }\n\n /**\n * Clear all indexed workflows\n */\n clear(): void {\n this.entries.clear()\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/job-manager\n * Job manager for background task execution with sandboxed handlers.\n */\n\nimport type {\n IJobScheduler,\n JobDefinition,\n JobHandle,\n JobStatus,\n JobFilter,\n CronExpression,\n ICache,\n ILogger,\n IEventBus,\n} from '@kb-labs/core-platform';\nimport type { JobHandlerDecl, PluginContextDescriptor } from '@kb-labs/plugin-contracts';\nimport type { IExecutionBackend, ExecutionRequest } from '@kb-labs/core-contracts';\nimport { nanoid } from 'nanoid';\n\n/**\n * Job handler registry entry.\n */\ninterface JobHandlerRegistry {\n pluginId: string;\n jobId: string;\n handlerPath: string;\n config: JobHandlerDecl;\n pluginRoot: string;\n pluginVersion: string;\n}\n\n/**\n * Internal job record stored in cache.\n */\ninterface JobRecord {\n id: string;\n type: string;\n payload: unknown;\n tenantId: string;\n status: JobStatus;\n priority: number;\n maxRetries: number;\n timeout: number;\n attempt: number;\n progress: number;\n result?: unknown;\n error?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n runAt?: string;\n idempotencyKey?: string;\n}\n\n/**\n * Job queue entry for scheduling.\n */\ninterface JobQueueEntry {\n jobId: string;\n priority: number;\n availableAt: number;\n}\n\nexport interface JobManagerConfig {\n /** Execution backend for sandboxed handler execution */\n executionBackend?: IExecutionBackend<PluginContextDescriptor>;\n /** Default job timeout in ms (default: 300000 = 5 min) */\n defaultTimeout?: number;\n /** Default max retries (default: 3) */\n defaultMaxRetries?: number;\n /** Default priority (default: 50) */\n defaultPriority?: number;\n /** Workspace root (monorepo root) for plugin execution context */\n workspaceRoot?: string;\n}\n\n/**\n * Job manager - handles background job execution with sandboxed handlers.\n *\n * Features:\n * - Declarative job handlers from plugin manifests\n * - Priority-based queue (0-100, higher = more important)\n * - Retry with exponential/linear backoff\n * - Sandboxed subprocess execution via ExecutionBackend\n * - Progress tracking and status updates\n * - Idempotency support\n *\n * Architecture:\n * 1. Plugin declares job handlers in manifest.json\n * 2. Plugin runtime registers handlers via registerJobHandler()\n * 3. Plugin submits jobs via ctx.api.jobs.submit()\n * 4. JobManager enqueues job in priority queue (platform.cache sorted sets)\n * 5. Worker dequeues job and executes via ExecutionBackend.execute()\n * 6. Handler runs in subprocess with JobContext\n * 7. Results stored in cache, events emitted\n */\nexport class JobManager implements IJobScheduler {\n private handlerRegistry = new Map<string, JobHandlerRegistry>();\n private readonly defaultTimeout: number;\n private readonly defaultMaxRetries: number;\n private readonly defaultPriority: number;\n private readonly workspaceRoot: string;\n\n constructor(\n private readonly cache: ICache,\n private readonly events: IEventBus,\n private readonly logger: ILogger,\n private readonly config: JobManagerConfig = {}\n ) {\n this.defaultTimeout = config.defaultTimeout ?? 300000; // 5 min\n this.defaultMaxRetries = config.defaultMaxRetries ?? 3;\n this.defaultPriority = config.defaultPriority ?? 50;\n this.workspaceRoot = config.workspaceRoot ?? process.cwd(); // Fallback to process.cwd()\n }\n\n /**\n * Register job handler from plugin manifest.\n *\n * Called by plugin-runtime during plugin initialization.\n *\n * @param pluginId - Plugin identifier\n * @param pluginVersion - Plugin version\n * @param pluginRoot - Plugin root directory\n * @param handlerDecl - Job handler declaration from manifest\n */\n registerJobHandler(\n pluginId: string,\n pluginVersion: string,\n pluginRoot: string,\n handlerDecl: JobHandlerDecl\n ): void {\n const jobType = `${pluginId}:${handlerDecl.id}`;\n\n if (this.handlerRegistry.has(jobType)) {\n this.logger.warn('Job handler already registered, overwriting', {\n jobType,\n pluginId,\n jobId: handlerDecl.id,\n });\n }\n\n this.handlerRegistry.set(jobType, {\n pluginId,\n jobId: handlerDecl.id,\n handlerPath: handlerDecl.handler,\n config: handlerDecl,\n pluginRoot,\n pluginVersion,\n });\n\n this.logger.info('Registered job handler', {\n jobType,\n handler: handlerDecl.handler,\n });\n }\n\n /**\n * Submit a job for immediate execution.\n */\n async submit(job: JobDefinition): Promise<JobHandle> {\n // Validate handler exists\n const handlerEntry = this.handlerRegistry.get(job.type);\n if (!handlerEntry) {\n throw new Error(`Job handler not found: ${job.type}`);\n }\n\n // Check idempotency\n if (job.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(job.idempotencyKey);\n if (existing) {\n this.logger.info('Job already submitted (idempotent)', {\n idempotencyKey: job.idempotencyKey,\n existingJobId: existing.id,\n });\n return this.jobRecordToHandle(existing);\n }\n }\n\n // Create job record\n const jobId = nanoid();\n const now = new Date();\n const record: JobRecord = {\n id: jobId,\n type: job.type,\n payload: job.payload,\n tenantId: job.tenantId ?? 'default',\n status: 'pending',\n priority: job.priority ?? this.defaultPriority,\n maxRetries: job.maxRetries ?? handlerEntry.config.maxRetries ?? this.defaultMaxRetries,\n timeout: job.timeout ?? handlerEntry.config.timeout ?? this.defaultTimeout,\n attempt: 0,\n progress: 0,\n createdAt: now.toISOString(),\n runAt: job.runAt?.toISOString(),\n idempotencyKey: job.idempotencyKey,\n };\n\n // Store job record\n await this.saveJobRecord(record);\n\n // Enqueue for execution\n const availableAt = job.runAt ? job.runAt.getTime() : Date.now();\n await this.enqueueJob(jobId, record.priority, availableAt);\n\n this.logger.info('Job submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n priority: record.priority,\n });\n\n // Emit event\n await this.events.publish('job.submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n });\n\n return this.jobRecordToHandle(record);\n }\n\n /**\n * Schedule a job for future/recurring execution.\n */\n async schedule(job: JobDefinition, schedule: CronExpression | Date): Promise<JobHandle> {\n if (schedule instanceof Date) {\n // One-time scheduled job\n return this.submit({ ...job, runAt: schedule });\n }\n\n // TODO: Cron scheduling - integrate with CronManager\n throw new Error('Cron scheduling not yet implemented');\n }\n\n /**\n * Cancel a pending/running job.\n */\n async cancel(jobId: string): Promise<boolean> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return false;\n }\n\n if (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled') {\n this.logger.warn('Cannot cancel job in terminal state', {\n jobId,\n status: record.status,\n });\n return false;\n }\n\n // Update status\n record.status = 'cancelled';\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Remove from queue\n await this.removeFromQueue(jobId);\n\n this.logger.info('Job cancelled', { jobId });\n\n // Emit event\n await this.events.publish('job.cancelled', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n });\n\n return true;\n }\n\n /**\n * Get job status.\n */\n async getStatus(jobId: string): Promise<JobHandle | null> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return null;\n }\n return this.jobRecordToHandle(record);\n }\n\n /**\n * List jobs.\n */\n async list(filter: JobFilter = {}): Promise<JobHandle[]> {\n // TODO: Implement efficient filtering\n // For now, simple scan approach\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all job records in parallel\n const allRecords = await Promise.all(keys.map(key => this.cache.get<JobRecord>(key)));\n\n // Filter out nulls and apply filters\n const records = allRecords.filter((data): data is JobRecord => {\n if (!data) {return false;}\n\n // Apply filters\n if (filter.type && data.type !== filter.type) {return false;}\n if (filter.tenantId && data.tenantId !== filter.tenantId) {return false;}\n if (filter.status && data.status !== filter.status) {return false;}\n\n return true;\n });\n\n // Sort by creation time (newest first)\n records.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Pagination\n const offset = filter.offset ?? 0;\n const limit = filter.limit ?? 100;\n const page = records.slice(offset, offset + limit);\n\n return page.map(r => this.jobRecordToHandle(r));\n }\n\n /**\n * Execute a job (called by worker).\n *\n * @internal\n */\n async executeJob(jobId: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.error('Job not found for execution', undefined, { jobId });\n return;\n }\n\n const handlerEntry = this.handlerRegistry.get(record.type);\n if (!handlerEntry) {\n this.logger.error('Job handler not found', undefined, { jobId, type: record.type });\n await this.markJobFailed(record, 'Handler not found');\n return;\n }\n\n // Check if execution backend is available\n if (!this.config.executionBackend) {\n this.logger.error('ExecutionBackend not configured', undefined, { jobId });\n await this.markJobFailed(record, 'ExecutionBackend not configured');\n return;\n }\n\n // Update status to running\n record.status = 'running';\n record.attempt += 1;\n record.startedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Emit event\n await this.events.publish('job.started', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n });\n\n try {\n // Build execution request\n const executionId = `job-${jobId}-${record.attempt}`;\n const traceId = executionId;\n const spanId = executionId;\n const invocationId = executionId;\n\n // Create minimal descriptor for job context\n const descriptor: PluginContextDescriptor = {\n hostType: 'cron',\n hostContext: {\n host: 'cron',\n cronId: record.type,\n schedule: '', // Not available in job context\n scheduledAt: new Date().toISOString(),\n },\n permissions: handlerEntry.config.permissions ?? {},\n pluginId: handlerEntry.pluginId,\n pluginVersion: '0.0.0', // TODO: Get from manifest\n requestId: executionId,\n tenantId: record.tenantId,\n };\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n });\n\n const request: ExecutionRequest<PluginContextDescriptor> = {\n executionId,\n descriptor,\n pluginRoot: handlerEntry.pluginRoot,\n handlerRef: handlerEntry.handlerPath,\n input: {\n jobId,\n type: record.type,\n input: record.payload,\n tenantId: record.tenantId,\n attempt: record.attempt,\n },\n timeoutMs: record.timeout,\n };\n\n this.logger.debug('Executing job handler', {\n jobId,\n handler: handlerEntry.handlerPath,\n attempt: record.attempt,\n });\n\n // Execute in subprocess\n const result = await this.config.executionBackend.execute(request, {\n signal: undefined, // TODO: Support cancellation\n });\n\n if (result.ok) {\n // Job succeeded\n record.status = 'completed';\n record.result = result.data;\n record.progress = 100;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.info('Job completed', {\n jobId,\n type: record.type,\n duration: result.executionTimeMs,\n });\n\n await this.events.publish('job.completed', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n result: result.data,\n });\n } else {\n // Job failed\n const errorMsg = result.error?.message ?? 'Unknown error';\n await this.handleJobFailure(record, errorMsg);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error('Job execution failed', undefined, { jobId, error: errorMsg });\n await this.handleJobFailure(record, errorMsg);\n }\n }\n\n /**\n * Update job progress.\n *\n * Called by job handler via ctx.updateProgress()\n */\n async updateProgress(jobId: string, percent: number, message?: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.warn('Cannot update progress: job not found', { jobId });\n return;\n }\n\n record.progress = Math.max(0, Math.min(100, percent));\n await this.saveJobRecord(record);\n\n await this.events.publish('job.progress', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n progress: record.progress,\n message,\n });\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async handleJobFailure(record: JobRecord, errorMsg: string): Promise<void> {\n if (record.attempt < record.maxRetries) {\n // Retry with backoff\n const backoffMs = this.calculateBackoff(record.attempt, record.type);\n const availableAt = Date.now() + backoffMs;\n\n record.status = 'pending';\n await this.saveJobRecord(record);\n await this.enqueueJob(record.id, record.priority, availableAt);\n\n this.logger.info('Job retry scheduled', {\n jobId: record.id,\n attempt: record.attempt,\n maxRetries: record.maxRetries,\n backoffMs,\n });\n\n await this.events.publish('job.retry', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n backoffMs,\n });\n } else {\n // Max retries exceeded\n await this.markJobFailed(record, errorMsg);\n }\n }\n\n private async markJobFailed(record: JobRecord, errorMsg: string): Promise<void> {\n record.status = 'failed';\n record.error = errorMsg;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.error('Job failed', undefined, {\n jobId: record.id,\n type: record.type,\n error: errorMsg,\n attempt: record.attempt,\n });\n\n await this.events.publish('job.failed', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n error: errorMsg,\n });\n }\n\n private calculateBackoff(attempt: number, jobType: string): number {\n const handlerEntry = this.handlerRegistry.get(jobType);\n const strategy = handlerEntry?.config.retryBackoff ?? 'exp';\n\n if (strategy === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, ...\n return Math.min(1000 * Math.pow(2, attempt), 60000);\n } else {\n // Linear: 5s, 10s, 15s, 20s, ...\n return Math.min(5000 * (attempt + 1), 60000);\n }\n }\n\n private async saveJobRecord(record: JobRecord): Promise<void> {\n const key = `kb:job:${record.id}`;\n await this.cache.set(key, record, 7 * 24 * 60 * 60 * 1000); // 7 days TTL\n }\n\n private async getJobRecord(jobId: string): Promise<JobRecord | null> {\n const key = `kb:job:${jobId}`;\n return this.cache.get<JobRecord>(key);\n }\n\n private async enqueueJob(jobId: string, priority: number, availableAt: number): Promise<void> {\n const entry: JobQueueEntry = {\n jobId,\n priority,\n availableAt,\n };\n await this.cache.zadd('kb:jobqueue', availableAt, JSON.stringify(entry));\n }\n\n private async removeFromQueue(jobId: string): Promise<void> {\n // Scan queue and remove matching entry\n const results = await this.cache.zrangebyscore('kb:jobqueue', 0, Date.now() + 1000000);\n // Sequential search - must break on first match to avoid unnecessary zrem calls\n for (const raw of results) {\n try {\n const entry = JSON.parse(raw) as JobQueueEntry;\n if (entry.jobId === jobId) {\n await this.cache.zrem('kb:jobqueue', raw); // eslint-disable-line no-await-in-loop\n break;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n\n private async findByIdempotencyKey(key: string): Promise<JobRecord | null> {\n // TODO: Implement efficient lookup (maybe secondary index)\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all records in parallel and find match\n const records = await Promise.all(keys.map(k => this.cache.get<JobRecord>(k)));\n\n return records.find(record => record?.idempotencyKey === key) ?? null;\n }\n\n private async getAllJobKeys(_pattern: string): Promise<string[]> {\n // TODO: Implement efficient key scanning\n // For now, this is a placeholder - real implementation would use cache.scan()\n // or maintain a separate index\n return [];\n }\n\n private jobRecordToHandle(record: JobRecord): JobHandle {\n return {\n id: record.id,\n type: record.type,\n tenantId: record.tenantId,\n status: record.status,\n progress: record.progress,\n result: record.result,\n error: record.error,\n createdAt: new Date(record.createdAt),\n startedAt: record.startedAt ? new Date(record.startedAt) : undefined,\n completedAt: record.completedAt ? new Date(record.completedAt) : undefined,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/workflow-loader.ts","../src/lock.ts","../src/state-store.ts","../src/run-coordinator.ts","../src/concurrency-manager.ts","../src/scheduler.ts","../src/secrets.ts","../src/event-bus.ts","../src/retry.ts","../src/run-snapshot.ts","../src/engine.ts","../src/artifact-merger.ts","../src/manifest-converter.ts","../src/manifest-scanner.ts","../src/workflow-repository.ts","../src/workflow-service.ts","../src/workflow-registry.ts","../src/job-manager.ts"],"names":["parseYaml","resolve","job","randomUUID","WORKFLOW_REDIS_CHANNEL","run","assertTransition","WorkflowSpecSchema","join","stringifyYaml","readFile","readdir"],"mappings":"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","file":"index.js","sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport type { ZodIssue } from 'zod'\nimport {\n type WorkflowSpec,\n WorkflowSpecSchema,\n} from '@kb-labs/workflow-contracts'\nimport type { EngineLogger, WorkflowLoaderResult } from './types'\n\nexport interface WorkflowLoaderOptions {\n cwd?: string\n}\n\nexport class WorkflowLoader {\n constructor(private readonly logger: EngineLogger) {}\n\n async fromFile(\n filePath: string,\n options: WorkflowLoaderOptions = {},\n ): Promise<WorkflowLoaderResult> {\n const cwd = options.cwd ?? process.cwd()\n const absolutePath = resolve(cwd, filePath)\n\n this.logger.debug(`Loading workflow spec from file`, {\n path: absolutePath,\n })\n\n const raw = await readFile(absolutePath, 'utf8')\n const parsed = this.parse(raw, absolutePath)\n return this.validate(parsed, absolutePath)\n }\n\n fromInline(\n spec: unknown,\n source = 'inline',\n ): WorkflowLoaderResult {\n let candidate: unknown = spec\n if (typeof spec === 'string') {\n candidate = this.parse(spec, source)\n }\n return this.validate(candidate, source)\n }\n\n private parse(raw: string, source: string): unknown {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error(`Workflow spec ${source} is empty`)\n }\n\n if (source.endsWith('.json') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse JSON workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec JSON: ${message}`)\n }\n }\n\n try {\n return parseYaml(trimmed)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse YAML workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec YAML: ${message}`)\n }\n }\n\n private validate(candidate: unknown, source: string): WorkflowLoaderResult {\n const parsed = WorkflowSpecSchema.safeParse(candidate)\n\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map(\n (issue: ZodIssue) =>\n `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n .join('\\n')\n this.logger.warn(`Workflow spec validation failed`, { source, issues })\n throw new Error(`Workflow spec validation failed:\\n${issues}`)\n }\n\n const spec = parsed.data as WorkflowSpec\n return { spec, source }\n }\n}\n\n\n","import { randomUUID } from 'node:crypto'\nimport type { ICache } from '@kb-labs/core-platform'\n\n/**\n * How long a short-lived write lock is held before it auto-expires. Callers\n * use this to guard a single read-modify-write cycle (a few milliseconds in\n * the normal case), not a whole run's execution — contrast with\n * `ConcurrencyManager`'s 30-minute run-scoped lock. Generous on purpose: a\n * slow cache backend or a GC pause mid-write should not cause a spurious\n * \"lost my own lock\" release race (see `withLock`'s docblock).\n */\nconst LOCK_TTL_MS = 5_000\n\n/** Give up acquiring a lock after this long and surface a clear error rather\n * than hang the caller forever — a lock stuck this long past its own TTL\n * means something is already broken (e.g. every holder in this window\n * crashed without letting the TTL expire naturally, which shouldn't happen\n * since expiry doesn't require cooperation from the crashed holder). */\nconst LOCK_ACQUIRE_TIMEOUT_MS = 15_000\nconst LOCK_RETRY_BASE_MS = 20\nconst LOCK_RETRY_MAX_MS = 250\n\nexport class LockAcquireTimeoutError extends Error {\n constructor(public readonly lockKey: string) {\n super(`Timed out waiting for lock: ${lockKey}`)\n this.name = 'LockAcquireTimeoutError'\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\n/**\n * Same lock idiom as `ConcurrencyManager.acquire/release` (`setIfNotExists`\n * as a TTL-bounded mutex, a random token as the value so release only ever\n * removes a lock this call actually holds) — reused here at a much shorter\n * TTL for a much shorter critical section. Retries acquisition with\n * jittered backoff instead of ConcurrencyManager's single attempt, since\n * callers here need \"wait your turn\", not \"fail fast if busy\".\n *\n * The release step (`get` then conditional `delete`) is not itself atomic:\n * in principle another holder could acquire between our `get` and our\n * `delete` if our own lock had already expired. That requires our own\n * critical section to have overrun `LOCK_TTL_MS` (a few milliseconds of\n * budget) *and* a third party to land in that exact gap — a compound,\n * low-probability race, categorically narrower than the unguarded\n * read-modify-write this replaces (which lost updates on every ordinary\n * concurrent write, deterministically). Accepted rather than solved with a\n * heavier primitive; revisit only if it's ever observed in practice.\n */\nexport async function withLock<T>(cache: ICache, lockKey: string, fn: () => Promise<T>): Promise<T> {\n const token = randomUUID()\n const deadline = Date.now() + LOCK_ACQUIRE_TIMEOUT_MS\n let delay = LOCK_RETRY_BASE_MS\n for (;;) {\n const acquired = await cache.setIfNotExists(lockKey, token, LOCK_TTL_MS)\n if (acquired) {\n break\n }\n if (Date.now() >= deadline) {\n throw new LockAcquireTimeoutError(lockKey)\n }\n await sleep(delay + Math.random() * delay)\n delay = Math.min(delay * 2, LOCK_RETRY_MAX_MS)\n }\n\n try {\n return await fn()\n } finally {\n const current = await cache.get<string>(lockKey)\n if (current === token) {\n await cache.delete(lockKey)\n }\n }\n}\n","import type { JobRun, StepRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport {\n assertTransition,\n type AssertTransitionOptions,\n} from '@kb-labs/workflow-constants'\nimport type { EngineLogger } from './types'\nimport { withLock } from './lock'\n\n/**\n * Run records must outlive individual workflow steps. Some steps (e.g. release\n * checks packing + clean-installing every package) run for tens of minutes\n * with no intermediate persistence call. Cache backends default `set()` TTL\n * to a few minutes (e.g. InMemoryStateBroker: 300_000ms) for ordinary ephemeral\n * caching — without an explicit override here, a long-running step's record\n * silently expires mid-flight, `getRun`/`updateRun` start returning null, and\n * the step's real result is never persisted (surfaces as a bogus \"Daemon\n * restarted — run was abandoned\" once something else touches the run).\n */\nconst RUN_TTL_MS = 24 * 60 * 60 * 1000 // 24h\n\nexport class StateStore {\n private readonly cache: ICache\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n ) {\n this.cache = cache\n }\n\n async saveRun(run: WorkflowRun): Promise<void> {\n const key = `kb:run:${run.id}`\n this.logger.debug('Persisting workflow run', { runId: run.id, key })\n\n // Save run data\n await this.cache.set(key, JSON.stringify(run), RUN_TTL_MS)\n\n // Add to sorted set index (score = createdAt timestamp for time-based ordering)\n const timestamp = new Date(run.createdAt).getTime()\n await this.cache.zadd('workflow:runs:index', timestamp, run.id)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const key = `kb:run:${runId}`\n const payload = await this.cache.get<string>(key)\n if (!payload) {\n return null\n }\n try {\n return JSON.parse(payload) as WorkflowRun\n } catch (error) {\n this.logger.error('Failed to parse stored workflow run', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteRun(runId: string): Promise<void> {\n const key = `kb:run:${runId}`\n\n // Remove from cache\n await this.cache.delete(key)\n\n // Remove from sorted set index\n await this.cache.zrem('workflow:runs:index', runId)\n }\n\n async getAllRunIds(): Promise<string[]> {\n // Get all run IDs from sorted set index (ordered by creation time)\n // Score range: -inf to +inf (all runs)\n const runIds = await this.cache.zrangebyscore('workflow:runs:index', -Infinity, Infinity)\n return runIds ?? []\n }\n\n /**\n * Holds an exclusive per-run lock (see `withLock`) for the whole\n * read-modify-write, so `mutator` runs exactly once per call — no other\n * writer can observe or clobber the run in between. This is what actually\n * fixes the original bug class (a job marked `failed` while its step was\n * mid-write to `waiting_approval`): the two writes can no longer interleave.\n *\n * `mutator` must still not `await` — it runs synchronously against a\n * single in-memory draft while the lock is held; async work belongs after\n * `updateRun` resolves (and holding the lock across an `await` would just\n * make every other writer to this run block on it needlessly).\n */\n async updateRun(\n runId: string,\n mutator: (draft: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n return withLock(this.cache, `kb:lock:run:${runId}`, async () => {\n const run = await this.getRun(runId)\n if (!run) {\n return null\n }\n\n const draft = clone(run)\n const result = mutator(draft)\n const next = (result ?? draft) as WorkflowRun\n await this.saveRun(next)\n return next\n })\n }\n\n async updateJob(\n runId: string,\n jobId: string,\n mutator: (job: JobRun) => JobRun | void,\n ): Promise<JobRun | null> {\n let updatedJob: JobRun | null = null\n\n await this.updateRun(runId, (run) => {\n const index = run.jobs.findIndex((job: JobRun) => job.id === jobId)\n if (index === -1) {\n return\n }\n const existingJob = run.jobs[index]\n if (!existingJob) {\n return\n }\n const jobDraft = clone(existingJob)\n const result = mutator(jobDraft)\n const nextJob = (result ?? jobDraft) as JobRun\n run.jobs[index] = nextJob\n updatedJob = nextJob\n })\n\n return updatedJob\n }\n\n async updateStep(\n runId: string,\n jobId: string,\n stepId: string,\n mutator: (step: StepRun) => StepRun | void,\n ): Promise<StepRun | null> {\n let updatedStep: StepRun | null = null\n\n await this.updateRun(runId, (run) => {\n const jobIndex = run.jobs.findIndex((job) => job.id === jobId)\n if (jobIndex === -1) {\n return\n }\n const job = run.jobs[jobIndex]\n if (!job) {\n return\n }\n const stepIndex = job.steps.findIndex(\n (step: StepRun) => step.id === stepId,\n )\n if (stepIndex === -1) {\n return\n }\n const existingStep = job.steps[stepIndex]\n if (!existingStep) {\n return\n }\n const draft = clone(existingStep)\n const result = mutator(draft)\n const nextStep = (result ?? draft) as StepRun\n job.steps[stepIndex] = nextStep\n updatedStep = nextStep\n })\n\n return updatedStep\n }\n\n /**\n * Like `updateRun`, but validates the status transition against the\n * workflow state machine before applying it — throws\n * `IllegalStateTransitionError` (from `@kb-labs/workflow-constants`) if\n * `to` is not reachable from the run's current status. `mutate` sets any\n * *other* fields; it must not itself assign `.status` (this method owns\n * that assignment, after the check).\n */\n async transitionRun(\n runId: string,\n to: WorkflowRun['status'],\n mutate: (draft: WorkflowRun) => void = () => {},\n options?: AssertTransitionOptions,\n ): Promise<WorkflowRun | null> {\n return this.updateRun(runId, (draft) => {\n assertTransition('run', draft.status, to, options)\n draft.status = to\n mutate(draft)\n })\n }\n\n /** Job-level counterpart of `transitionRun` — see its docblock. */\n async transitionJob(\n runId: string,\n jobId: string,\n to: JobRun['status'],\n mutate: (draft: JobRun) => void = () => {},\n options?: AssertTransitionOptions,\n ): Promise<JobRun | null> {\n return this.updateJob(runId, jobId, (draft) => {\n assertTransition('job', draft.status, to, options)\n draft.status = to\n mutate(draft)\n })\n }\n\n /** Step-level counterpart of `transitionRun` — see its docblock. */\n async transitionStep(\n runId: string,\n jobId: string,\n stepId: string,\n to: StepRun['status'],\n mutate: (draft: StepRun) => void = () => {},\n options?: AssertTransitionOptions,\n ): Promise<StepRun | null> {\n return this.updateStep(runId, jobId, stepId, (draft) => {\n assertTransition('step', draft.status, to, options)\n draft.status = to\n mutate(draft)\n })\n }\n\n async releaseBlockedJobs(\n runId: string,\n completedJobName: string,\n ): Promise<JobRun[]> {\n // `released` is reset at the top of the mutator rather than declared\n // once outside it. `updateRun` now holds an exclusive lock for the whole\n // call, so in the current design this mutator only ever runs once per\n // call — but keeping the reset here is cheap, correct defense-in-depth\n // against ever accumulating into a variable captured from an outer\n // scope, which is exactly what caused a real bug when `updateRun`'s\n // internals worked differently (a retry-on-conflict scheme, prior to the\n // locking approach): a re-run mutator pushed into the same array again,\n // so callers double-processed the same released job.\n let released: JobRun[] = []\n\n await this.updateRun(runId, (run) => {\n released = []\n for (const job of run.jobs) {\n if (job.status !== 'queued' || !job.blocked) {\n continue\n }\n if (!job.pendingDependencies || job.pendingDependencies.length === 0) {\n continue\n }\n if (!job.needs?.includes(completedJobName)) {\n continue\n }\n\n const remaining = job.pendingDependencies.filter(\n (dependency) => dependency !== completedJobName,\n )\n\n if (remaining.length === job.pendingDependencies.length) {\n continue\n }\n\n job.pendingDependencies = remaining\n\n if (remaining.length === 0) {\n job.blocked = false\n released.push(clone(job))\n }\n }\n })\n\n return released\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n\n\n\n","import { randomUUID } from 'node:crypto'\nimport { IDEMPOTENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type {\n JobRun,\n JobSpec,\n StepRun,\n WorkflowRun,\n} from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { StateStore } from './state-store'\nimport type { ConcurrencyManager } from './concurrency-manager'\nimport type { EngineLogger, CreateRunInput } from './types'\n\nconst DEFAULT_IDEMPOTENCY_TTL_MS = 1000 * 60 * 60 * 24 // 24h\n\nfunction resolveIdempotencyTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[IDEMPOTENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_IDEMPOTENCY_TTL_MS\n}\n\nexport interface RunCoordinatorOptions {\n idempotencyTtlMs?: number\n}\n\nexport class RunCoordinator {\n private readonly cache: ICache\n private readonly idempotencyTtlMs: number\n\n constructor(\n cache: ICache,\n private readonly stateStore: StateStore,\n private readonly concurrencyManager: ConcurrencyManager,\n private readonly logger: EngineLogger,\n options: RunCoordinatorOptions = {},\n ) {\n this.cache = cache\n this.idempotencyTtlMs = resolveIdempotencyTtlMs(options.idempotencyTtlMs)\n }\n\n async ensureRun(input: CreateRunInput): Promise<WorkflowRun> {\n if (input.idempotencyKey) {\n const existing = await this.loadByIdempotencyKey(input.idempotencyKey)\n if (existing) {\n this.logger.info('Idempotent workflow run reused', {\n runId: existing.id,\n idempotencyKey: input.idempotencyKey,\n })\n return existing\n }\n }\n\n const runId = randomUUID()\n const now = new Date().toISOString()\n\n if (input.concurrencyGroup) {\n const acquired = await this.concurrencyManager.acquire(\n input.concurrencyGroup,\n runId,\n )\n\n if (!acquired) {\n const active = await this.concurrencyManager.getActiveRun(\n input.concurrencyGroup,\n )\n const message = active\n ? `Concurrency group ${input.concurrencyGroup} already locked by run ${active}`\n : `Failed to acquire concurrency lock for ${input.concurrencyGroup}`\n this.logger.warn(message, {\n concurrencyGroup: input.concurrencyGroup,\n activeRunId: active,\n })\n throw new Error(message)\n }\n }\n\n const run = this.buildInitialRun(input, runId, now)\n await this.stateStore.saveRun(run)\n\n if (input.idempotencyKey) {\n await this.registerIdempotencyKey(input.idempotencyKey, run.id)\n }\n\n this.logger.info('Workflow run created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n })\n\n return run\n }\n\n private buildInitialRun(\n input: CreateRunInput,\n runId: string,\n timestamp: string,\n ): WorkflowRun {\n const jobs: JobRun[] = []\n\n for (const [jobName, jobSpec] of Object.entries(\n input.spec.jobs,\n ) as Array<[string, JobSpec]>) {\n const jobId = `${runId}:${jobName}`\n const needs = Array.isArray(jobSpec.needs) ? [...jobSpec.needs] : []\n const priority = jobSpec.priority ?? 'normal'\n const effectiveTarget = jobSpec.target ?? input.spec.target\n const effectiveIsolation = jobSpec.isolation ?? input.spec.isolation\n const stepRuns: StepRun[] = jobSpec.steps.map((step, index) => ({\n id: `${jobId}:${index}`,\n runId,\n jobId,\n name: step.name,\n index,\n status: 'queued',\n queuedAt: timestamp,\n attempt: 0,\n timeoutMs: step.timeoutMs,\n continueOnError: step.continueOnError,\n spec: step,\n }))\n\n jobs.push({\n id: jobId,\n runId,\n jobName,\n status: 'queued',\n runsOn: jobSpec.runsOn,\n queuedAt: timestamp,\n attempt: 0,\n steps: stepRuns,\n concurrency: jobSpec.concurrency,\n retries: jobSpec.retries,\n timeoutMs: jobSpec.timeoutMs,\n target: effectiveTarget,\n isolation: effectiveIsolation,\n artifacts: jobSpec.artifacts,\n env: jobSpec.env,\n secrets: jobSpec.secrets,\n needs,\n pendingDependencies: [...needs],\n blocked: needs.length > 0,\n priority,\n if: jobSpec.if,\n })\n }\n\n const workflowRun: WorkflowRun = {\n id: runId,\n name: input.spec.name,\n version: input.spec.version,\n status: 'queued',\n createdAt: timestamp,\n queuedAt: timestamp,\n trigger: input.trigger,\n env: input.env ?? input.spec.env,\n inputs: input.inputs,\n secrets: input.spec.secrets,\n jobs,\n metadata: {\n idempotencyKey: input.idempotencyKey,\n concurrencyGroup: input.concurrencyGroup,\n target: input.spec.target,\n isolation: input.spec.isolation,\n outputDeclarations: input.spec.outputs,\n ...input.metadata,\n },\n artifacts: [],\n }\n\n return workflowRun\n }\n\n private async registerIdempotencyKey(\n key: string,\n runId: string,\n ): Promise<void> {\n const cacheKey = `kb:idempotency:${key}`\n const registered = await this.cache.setIfNotExists(\n cacheKey,\n runId,\n this.idempotencyTtlMs,\n )\n\n if (!registered) {\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (existingRunId) {\n const existing = await this.stateStore.getRun(existingRunId)\n if (existing) {\n throw new Error(\n `Idempotency key ${key} already associated with run ${existingRunId}`,\n )\n }\n }\n throw new Error(`Failed to register idempotency key ${key}`)\n }\n }\n\n private async loadByIdempotencyKey(\n key: string,\n ): Promise<WorkflowRun | null> {\n const cacheKey = `kb:idempotency:${key}`\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (!existingRunId) {\n return null\n }\n return this.stateStore.getRun(existingRunId)\n }\n\n async releaseConcurrency(run: WorkflowRun): Promise<void> {\n const group = run.metadata?.concurrencyGroup\n if (!group) {\n return\n }\n await this.concurrencyManager.release(group, run.id)\n this.logger.debug('Released concurrency group', {\n runId: run.id,\n group,\n })\n }\n}\n","import { CONCURRENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type { ConcurrencyGroup } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nconst DEFAULT_TTL_MS = 1000 * 60 * 30 // 30 minutes\n\nfunction resolveTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[CONCURRENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_TTL_MS\n}\n\nexport interface AcquireOptions {\n ttlMs?: number\n}\n\nexport class ConcurrencyManager {\n private readonly cache: ICache\n private readonly ttlMs: number\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: AcquireOptions = {},\n ) {\n this.cache = cache\n this.ttlMs = resolveTtlMs(options.ttlMs)\n }\n\n async acquire(\n group: ConcurrencyGroup,\n runId: string,\n options: AcquireOptions = {},\n ): Promise<boolean> {\n const ttl = resolveTtlMs(options.ttlMs ?? this.ttlMs)\n const key = `kb:concurrency:${group}`\n const acquired = await this.cache.setIfNotExists(key, runId, ttl)\n\n this.logger.debug('Concurrency acquire attempt', {\n group,\n runId,\n acquired,\n })\n return acquired\n }\n\n async release(group: ConcurrencyGroup, runId: string): Promise<void> {\n const key = `kb:concurrency:${group}`\n const current = await this.cache.get<string>(key)\n if (current === runId) {\n await this.cache.delete(key)\n this.logger.debug('Concurrency lock released', { group, runId })\n }\n }\n\n async getActiveRun(group: ConcurrencyGroup): Promise<string | null> {\n const key = `kb:concurrency:${group}`\n return this.cache.get<string>(key)\n }\n}\n\n\n","import type { JobRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { JobPriority } from '@kb-labs/workflow-constants'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\nimport { withLock } from './lock'\n\nexport interface JobQueueEntry {\n id: string\n runId: string\n jobId: string\n priority: JobPriority\n enqueuedAt: string\n availableAt: number\n jobName: string\n}\n\nexport interface SchedulerOptions {\n defaultPriority?: JobPriority\n lookAheadMs?: number\n}\n\nexport class Scheduler {\n private readonly cache: ICache\n private readonly defaultPriority: JobPriority\n private readonly lookAheadMs: number\n private readonly priorityOrder: JobPriority[] = ['high', 'normal', 'low']\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: SchedulerOptions = {},\n ) {\n this.cache = cache\n this.defaultPriority = options.defaultPriority ?? 'normal'\n this.lookAheadMs = options.lookAheadMs ?? 1000\n }\n\n async scheduleRun(run: WorkflowRun): Promise<void> {\n // Enqueue ready jobs in parallel\n const readyJobs = run.jobs.filter(job => {\n if (job.blocked) {\n this.logger.debug('Job blocked by dependencies; deferring enqueue', {\n runId: run.id,\n jobId: job.id,\n needs: job.needs,\n })\n return false\n }\n return true\n })\n\n await Promise.all(\n readyJobs.map(job => {\n const priority = job.priority ?? this.defaultPriority\n return this.enqueueJob(run.id, job, priority)\n }),\n )\n }\n\n async enqueueJob(\n runId: string,\n job: JobRun,\n priority: JobPriority = this.defaultPriority,\n ): Promise<void> {\n if (job.blocked) {\n this.logger.debug('Skipping enqueue for blocked job', {\n runId,\n jobId: job.id,\n needs: job.pendingDependencies,\n })\n return\n }\n const now = Date.now()\n const entryId = `${runId}:${job.id}:${now}:${Math.random().toString(36).slice(2, 10)}`\n const entry: JobQueueEntry = {\n id: entryId,\n runId,\n jobId: job.id,\n jobName: job.jobName,\n priority,\n enqueuedAt: new Date().toISOString(),\n availableAt: now,\n }\n await this.cache.zadd(\n `kb:jobqueue:${priority}`,\n entry.availableAt,\n JSON.stringify(entry),\n )\n this.logger.debug('Job enqueued', { runId, jobId: job.id, priority })\n }\n\n async dequeueJob(): Promise<JobQueueEntry | null> {\n // Sequential check by priority order - must return first match respecting priority\n for (const priority of this.priorityOrder) {\n const entry = await this.dequeueFromPriority(priority) // eslint-disable-line no-await-in-loop\n if (entry) {\n return entry\n }\n }\n return null\n }\n\n async reschedule(entry: JobQueueEntry, delayMs: number): Promise<void> {\n const availableAt = Date.now() + delayMs\n const next: JobQueueEntry = {\n ...entry,\n availableAt,\n enqueuedAt: new Date().toISOString(),\n }\n await this.cache.zadd(\n `kb:jobqueue:${entry.priority}`,\n availableAt,\n JSON.stringify(next),\n )\n this.logger.debug('Job rescheduled', {\n runId: entry.runId,\n jobId: entry.jobId,\n delayMs,\n priority: entry.priority,\n })\n }\n\n /**\n * The read (`zrangebyscore`) and the remove (`zrem`) below are two\n * separate cache round-trips, not one atomic op — without the lock, two\n * daemon instances racing this method could both read the same top entry\n * before either removes it, and both would go on to execute the same job\n * (the daemon runs multiple instances in production, so this is a live\n * bug, not a theoretical one). `withLock` serializes dequeues against this\n * one priority queue across every process sharing the same cache backend,\n * the same way `StateStore.updateRun` serializes writes to one run.\n */\n private async dequeueFromPriority(priority: JobPriority): Promise<JobQueueEntry | null> {\n const key = `kb:jobqueue:${priority}`\n return withLock(this.cache, `kb:lock:queue:${priority}`, async () => {\n const now = Date.now()\n const results = await this.cache.zrangebyscore(\n key,\n 0,\n now + this.lookAheadMs,\n )\n\n // Handle LIMIT manually - take only first result\n if (results.length === 0) {\n return null\n }\n\n const raw = results[0]\n if (typeof raw !== 'string') {\n return null\n }\n try {\n const entry = JSON.parse(raw) as JobQueueEntry\n await this.cache.zrem(key, raw)\n return entry\n } catch (error) {\n this.logger.error('Failed to parse job queue entry', error instanceof Error ? error : undefined)\n return null\n }\n })\n }\n\n getDefaultPriority(): JobPriority {\n return this.defaultPriority\n }\n}\n\n\n","export interface SecretProvider {\n resolve(names: string[]): Promise<Record<string, string>>\n}\n\nexport interface EnvSecretProviderOptions {\n /**\n * Prefix applied when looking up secrets in environment variables.\n * Defaults to `KB_SECRET_`.\n */\n prefix?: string\n /**\n * When true (default), check both plain and prefixed environment variable names.\n */\n allowPlain?: boolean\n}\n\nexport class EnvSecretProvider implements SecretProvider {\n private readonly prefix: string\n private readonly allowPlain: boolean\n\n constructor(options: EnvSecretProviderOptions = {}) {\n this.prefix = options.prefix ?? 'KB_SECRET_'\n this.allowPlain = options.allowPlain ?? true\n }\n\n async resolve(names: string[]): Promise<Record<string, string>> {\n const resolved: Record<string, string> = {}\n for (const name of names) {\n if (!name) {\n continue\n }\n const prefixed = `${this.prefix}${name}`\n const candidates = this.allowPlain\n ? [process.env[name], process.env[prefixed]]\n : [process.env[prefixed]]\n\n const value = candidates.find((candidate) => typeof candidate === 'string')\n if (typeof value === 'string') {\n resolved[name] = value\n }\n }\n return resolved\n }\n}\n\nexport function createDefaultSecretProvider(): SecretProvider {\n return new EnvSecretProvider()\n}\n\n","import {\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { IEventBus } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface WorkflowEvent<TPayload = Record<string, unknown>> {\n type: WorkflowEventName\n runId: string\n jobId?: string\n stepId?: string\n payload?: TPayload\n timestamp?: string\n}\n\nexport class EventBusBridge {\n private readonly events: IEventBus\n private readonly channel = WORKFLOW_REDIS_CHANNEL\n\n constructor(\n events: IEventBus,\n private readonly logger: EngineLogger,\n ) {\n this.events = events\n }\n\n async publish<TPayload = Record<string, unknown>>(\n event: WorkflowEvent<TPayload>,\n ): Promise<void> {\n const payload = {\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n }\n await this.events.publish(this.channel, payload)\n this.logger.debug('Workflow event published', {\n channel: this.channel,\n type: event.type,\n runId: event.runId,\n })\n }\n}\n\n\n","import type { RetryPolicy } from '@kb-labs/workflow-contracts'\n\nconst DEFAULT_INITIAL_INTERVAL_MS = 1000\n\nexport interface RetryDecision {\n shouldRetry: boolean\n nextDelayMs?: number\n}\n\nexport function calculateBackoff(\n attempt: number,\n policy?: RetryPolicy,\n): number {\n if (!policy) {\n return 0\n }\n\n const base = policy.initialIntervalMs ?? DEFAULT_INITIAL_INTERVAL_MS\n const backoff =\n policy.backoff === 'lin'\n ? base * (attempt + 1)\n : base * Math.pow(2, attempt)\n\n if (policy.maxIntervalMs) {\n return Math.min(backoff, policy.maxIntervalMs)\n }\n return backoff\n}\n\nexport function shouldRetry(\n attempt: number,\n policy?: RetryPolicy,\n): RetryDecision {\n if (!policy) {\n return { shouldRetry: false }\n }\n if (attempt >= policy.max) {\n return { shouldRetry: false }\n }\n\n return {\n shouldRetry: true,\n nextDelayMs: calculateBackoff(attempt, policy),\n }\n}\n\n\n\n\n\n","import type { WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface RunSnapshot {\n runId: string\n run: WorkflowRun\n stepOutputs: Record<string, Record<string, unknown>>\n env: Record<string, string>\n refs?: {\n workspaceSnapshotId?: string\n environmentSnapshotId?: string\n }\n createdAt: string\n version: string\n}\n\nconst SNAPSHOT_VERSION = '1.0.0'\n\nexport class RunSnapshotStorage {\n constructor(\n private readonly cache: ICache,\n private readonly logger: EngineLogger,\n ) {}\n\n private getSnapshotKey(runId: string): string {\n return `workflow:snapshot:${runId}`\n }\n\n async createSnapshot(\n run: WorkflowRun,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot> {\n const snapshot: RunSnapshot = {\n runId: run.id,\n run,\n stepOutputs,\n env,\n refs,\n createdAt: new Date().toISOString(),\n version: SNAPSHOT_VERSION,\n }\n\n const key = this.getSnapshotKey(run.id)\n // Store snapshot with 7 days TTL (in milliseconds)\n await this.cache.set(\n key,\n JSON.stringify(snapshot),\n 7 * 24 * 60 * 60 * 1000, // 7 days in ms\n )\n\n this.logger.info('Snapshot created', { runId: run.id })\n return snapshot\n }\n\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n const key = this.getSnapshotKey(runId)\n const stored = await this.cache.get<string>(key)\n if (!stored) {\n return null\n }\n\n try {\n const snapshot = JSON.parse(stored) as RunSnapshot\n // Validate version\n if (snapshot.version !== SNAPSHOT_VERSION) {\n this.logger.warn('Snapshot version mismatch', {\n runId,\n expected: SNAPSHOT_VERSION,\n actual: snapshot.version,\n })\n // Try to load anyway, but log warning\n }\n return snapshot\n } catch (error) {\n this.logger.error('Failed to parse snapshot', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteSnapshot(runId: string): Promise<void> {\n const key = this.getSnapshotKey(runId)\n await this.cache.delete(key)\n this.logger.debug('Snapshot deleted', { runId })\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport type {\n WorkflowRun,\n WorkflowSpec,\n JobRun,\n StepRun,\n ExpressionContext,\n} from '@kb-labs/workflow-contracts'\nimport { evaluateExpression, resolveExpression } from '@kb-labs/workflow-contracts'\nimport {\n EVENT_NAMES,\n WORKFLOW_REDIS_CHANNEL,\n IllegalStateTransitionError,\n isTerminal,\n assertTransition,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { ICache, IEventBus, ILogger, IAnalytics, ISnapshotManager, Unsubscribe } from '@kb-labs/core-platform'\nimport type { ClassifiedFailure, RetryPolicyConfig } from '@kb-labs/core-contracts'\nimport { classifyFailure, decideRetry } from '@kb-labs/core-retry'\nimport { StateStore } from './state-store'\nimport { ConcurrencyManager, type AcquireOptions } from './concurrency-manager'\nimport {\n RunCoordinator,\n type RunCoordinatorOptions,\n} from './run-coordinator'\nimport {\n Scheduler,\n type SchedulerOptions,\n type JobQueueEntry,\n} from './scheduler'\nimport { EventBusBridge, type WorkflowEvent } from './event-bus'\nimport { WorkflowLoader } from './workflow-loader'\nimport type { CreateRunInput, EngineLogger, RunContext } from './types'\nimport { RunSnapshotStorage, type RunSnapshot } from './run-snapshot'\n\nexport interface WorkflowEngineOptions {\n scheduler?: SchedulerOptions\n concurrency?: AcquireOptions\n runCoordinator?: RunCoordinatorOptions\n maxWorkflowDepth?: number\n /** Platform cache adapter (REQUIRED) */\n cache: ICache\n /** Platform event bus adapter (REQUIRED) */\n events: IEventBus\n /** Platform logger (REQUIRED) */\n logger: ILogger\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics\n /** Platform snapshot manager (OPTIONAL - for infra snapshot restore in replay) */\n snapshotManager?: ISnapshotManager\n /** Workspace root (monorepo root) - used for plugin execution context */\n workspaceRoot?: string\n}\n\nexport class WorkflowEngine {\n readonly loader: WorkflowLoader\n readonly maxWorkflowDepth: number\n\n private readonly logger: EngineLogger\n private readonly analytics?: IAnalytics\n private readonly stateStore: StateStore\n private readonly concurrency: ConcurrencyManager\n private readonly runCoordinator: RunCoordinator\n private readonly scheduler: Scheduler\n private readonly events: EventBusBridge\n private readonly snapshotStorage: RunSnapshotStorage\n\n constructor(private readonly options: WorkflowEngineOptions) {\n this.logger = options.logger\n this.analytics = options.analytics\n\n this.stateStore = new StateStore(options.cache, this.logger)\n this.concurrency = new ConcurrencyManager(\n options.cache,\n this.logger,\n options.concurrency,\n )\n this.runCoordinator = new RunCoordinator(\n options.cache,\n this.stateStore,\n this.concurrency,\n this.logger,\n options.runCoordinator,\n )\n\n this.scheduler = new Scheduler(options.cache, this.logger, options.scheduler)\n this.events = new EventBusBridge(options.events, this.logger)\n this.loader = new WorkflowLoader(this.logger)\n this.maxWorkflowDepth = options.maxWorkflowDepth ?? 2\n this.snapshotStorage = new RunSnapshotStorage(options.cache, this.logger)\n }\n\n async dispose(): Promise<void> {\n // Cleanup if needed\n }\n\n /**\n * Subscribe to real-time events for a specific workflow run.\n * Events are filtered by runId from the shared event bus channel.\n */\n subscribeToRunEvents(\n runId: string,\n handler: (event: WorkflowEvent) => void,\n ): Unsubscribe {\n return this.options.events.subscribe(WORKFLOW_REDIS_CHANNEL, async (raw: unknown) => {\n const event = raw as WorkflowEvent\n if (event.runId === runId) {handler(event)}\n })\n }\n\n async createRun(input: CreateRunInput): Promise<WorkflowRun> {\n const run = await this.runCoordinator.ensureRun(input)\n\n // Track workflow run creation\n this.analytics?.track('workflow.run.created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n jobCount: run.jobs.length,\n trigger: input.trigger?.type,\n }).catch(() => {}) // Silent fail for analytics\n\n await this.events.publish({\n type: EVENT_NAMES.run.created,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n await this.scheduler.scheduleRun(run)\n\n return run\n }\n\n async runFromSpec(\n spec: WorkflowSpec,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n return this.createRun({\n ...input,\n spec,\n })\n }\n\n async runFromFile(\n filePath: string,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = await this.loader.fromFile(filePath)\n return this.runFromSpec(result.spec, input)\n }\n\n async runFromInline(\n spec: unknown,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = this.loader.fromInline(spec)\n return this.runFromSpec(result.spec, input)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return this.stateStore.getRun(runId)\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n if (!run) {\n return\n }\n\n try {\n await this.stateStore.transitionRun(runId, 'cancelled', (draft) => {\n draft.finishedAt = new Date().toISOString()\n })\n } catch (error) {\n // Already terminal (or otherwise unreachable from its current status)\n // — a no-op, same as the old up-front status check, except the check\n // now happens inside the lock against the live record instead of\n // racing a stale read taken before it.\n if (error instanceof IllegalStateTransitionError) {\n return\n }\n throw error\n }\n\n // Track workflow cancellation\n this.analytics?.track('workflow.run.cancelled', {\n runId,\n name: run?.name,\n reason: 'cancelled by parent workflow',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.cancelled,\n runId,\n payload: { reason: 'cancelled by parent workflow' },\n })\n\n // Invocation links are persisted on child trigger metadata, so cancellation\n // survives worker/daemon restarts and naturally cascades through descendants.\n const descendants = await this.findChildRuns(runId)\n await Promise.all(descendants.map((child) => this.cancelRun(child.id)))\n await this.reconcileChildInvocation(runId)\n }\n\n /**\n * Reconcile all persisted parent/child links. This is deliberately engine-side\n * instead of a worker-local polling task: it is safe to call after a daemon\n * restart and is idempotent when several reconciliations race.\n */\n async reconcileChildInvocations(): Promise<number> {\n const runs = await this.listStoredRuns()\n let reconciled = 0\n\n for (const parent of runs) {\n for (const job of parent.jobs) {\n for (const step of job.steps) {\n if (step.status !== 'waiting_child') {continue}\n const childRunId = step.metadata?.['childRunId']\n if (typeof childRunId !== 'string') {continue}\n\n const child = await this.getRun(childRunId)\n if (parent.status === 'cancelled') {\n if (child) {await this.cancelRun(child.id)}\n continue\n }\n if (!child) {\n await this.failChildInvocation(parent.id, job.id, step.id, childRunId, 'not found')\n reconciled++\n continue\n }\n if (!['success', 'failed', 'cancelled', 'skipped', 'dlq'].includes(child.status)) {\n continue\n }\n if (child.status === 'success') {\n const outputs = this.childResultEnvelope(child)\n await this.markStepCompleted(parent.id, job.id, step.id, outputs)\n await this.resumeJob(parent.id, job.id)\n } else {\n await this.failChildInvocation(parent.id, job.id, step.id, child.id, child.status)\n }\n reconciled++\n }\n }\n }\n return reconciled\n }\n\n /** Run reconciliation on terminal-child events; startup calls it once too. */\n async reconcileChildInvocation(childRunId: string): Promise<number> {\n const parents = (await this.listStoredRuns()).filter((run) =>\n run.jobs.some((job) => job.steps.some((step) =>\n step.status === 'waiting_child' && step.metadata?.['childRunId'] === childRunId,\n )),\n )\n if (parents.length === 0) {return 0}\n return this.reconcileChildInvocations()\n }\n\n private childResultEnvelope(child: WorkflowRun): Record<string, unknown> {\n const stepOutputs: Record<string, Record<string, unknown>> = {}\n for (const job of child.jobs) {\n for (const step of job.steps) {\n if (step.status === 'success' && step.spec.id && step.outputs) {\n stepOutputs[step.spec.id] = step.outputs\n }\n }\n }\n return {\n runId: child.id,\n status: child.status,\n outputs: Object.keys(child.result?.outputs ?? {}).length > 0\n ? child.result?.outputs\n : stepOutputs,\n artifacts: child.artifacts ?? [],\n }\n }\n\n private resolveDeclaredOutputs(run: WorkflowRun): Record<string, unknown> {\n const declarations = run.metadata?.outputDeclarations\n if (!declarations) {return {}}\n const context = this.buildExpressionContext(run)\n return Object.fromEntries(Object.entries(declarations).map(([name, declaration]) => {\n const source = declaration && typeof declaration === 'object'\n ? (declaration as { source?: unknown }).source\n : undefined\n return [name, typeof source === 'string' ? resolveExpression(source, context) : undefined]\n }))\n }\n\n private async failChildInvocation(\n parentRunId: string,\n parentJobId: string,\n parentStepId: string,\n childRunId: string,\n childStatus: string,\n ): Promise<void> {\n const error = new Error(`Child workflow ${childStatus} (run ${childRunId})`)\n await this.markStepFailed(parentRunId, parentJobId, parentStepId, error, {\n runId: childRunId,\n status: childStatus,\n })\n await this.markJobFailed(parentRunId, parentJobId, error, undefined, false)\n }\n\n private async listStoredRuns(): Promise<WorkflowRun[]> {\n const runIds = await this.stateStore.getAllRunIds()\n // Cache sorted-set adapters are permitted to retain duplicate members on\n // repeated saveRun calls. Reconciliation must be exactly-once per durable\n // run record even when event/index delivery is at-least-once.\n const runs = await Promise.all([...new Set(runIds)].map((id) => this.getRun(id)))\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n private async findChildRuns(parentRunId: string): Promise<WorkflowRun[]> {\n return (await this.listStoredRuns()).filter((run) =>\n run.trigger.parentRunId === parentRunId || run.metadata?.parentRunId === parentRunId,\n )\n }\n\n /**\n * Mark job as failed and optionally schedule retry.\n * Implements exponential/linear backoff retry logic.\n */\n async markJobFailed(\n runId: string,\n jobId: string,\n error: Error,\n failure?: ClassifiedFailure,\n policyOverride?: false | { max: number; backoff?: 'exp' | 'lin'; initialIntervalMs?: number; maxIntervalMs?: number; on?: string[] }\n ): Promise<void> {\n const run = await this.stateStore.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot mark job as failed: run not found', { runId, jobId })\n return\n }\n\n const job = run.jobs.find((j) => j.id === jobId)\n if (!job) {\n this.logger.warn('Cannot mark job as failed: job not found', { runId, jobId })\n return\n }\n\n // Update job status to failed\n await this.stateStore.transitionJob(runId, jobId, 'failed', (draft) => {\n draft.error = {\n message: error.message,\n stack: error.stack,\n timestamp: new Date().toISOString(),\n }\n draft.finishedAt = new Date().toISOString()\n draft.attempt = (draft.attempt || 0) + 1\n })\n\n this.logger.error('Job failed', error, {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n })\n\n const classified = failure ?? classifyFailure(error, { source: 'execution', phase: 'response' })\n const retryConfig: RetryPolicyConfig | undefined = policyOverride !== undefined && typeof policyOverride !== 'boolean'\n ? {\n maxAttempts: policyOverride.max + 1,\n retryOn: (policyOverride.on ?? ['command', 'network', 'timeout', 'rate_limit', 'server', 'infrastructure']) as RetryPolicyConfig['retryOn'],\n initialDelayMs: policyOverride.initialIntervalMs ?? 1000,\n backoff: policyOverride.backoff === 'lin' ? 'linear' : 'exponential',\n maxDelayMs: policyOverride.maxIntervalMs ?? 30_000,\n respectRetryAfter: true,\n requireIdempotencyForUnsafeFailures: true,\n }\n : undefined\n const retryDecision = policyOverride === false\n ? { retry: false, reason: 'policy_denied' as const, delayMs: 0 }\n : retryConfig\n ? decideRetry({ failure: classified, attempt: job.attempt || 0, policy: retryConfig })\n : decideRetry({ failure: classified, attempt: job.attempt || 0 })\n\n // Track job failure\n this.analytics?.track('workflow.job.failed', {\n runId,\n jobId,\n jobName: job.jobName,\n attempt: (job.attempt || 0) + 1,\n errorMessage: error.message,\n willRetry: retryDecision.retry,\n failureKind: classified.kind,\n failureCode: classified.code,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.failed,\n runId,\n jobId,\n payload: { jobName: job.jobName, error: error.message, attempt: (job.attempt || 0) + 1 },\n })\n\n // Check if should retry\n if (retryDecision.retry) {\n const backoffMs = retryDecision.delayMs\n\n this.logger.info('Scheduling job retry', {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n backoffMs,\n })\n\n // Re-queue job after backoff\n setTimeout(async () => {\n try {\n await this.stateStore.transitionJob(runId, jobId, 'queued', (draft) => {\n draft.error = undefined\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n } catch (transitionError) {\n // The job moved on from 'failed' during the backoff wait (e.g. its\n // run was cancelled) — the retry is stale, drop it instead of\n // crashing this detached timer callback with an unhandled rejection.\n if (transitionError instanceof IllegalStateTransitionError) {\n this.logger.info('Dropping stale job retry: job is no longer failed', { runId, jobId })\n return\n }\n throw transitionError\n }\n\n // Re-enqueue in scheduler\n const updatedRun = await this.stateStore.getRun(runId)\n const updatedJob = updatedRun?.jobs.find((j) => j.id === jobId)\n if (updatedJob) {\n await this.scheduler.enqueueJob(runId, updatedJob, updatedJob.priority ?? 'normal')\n }\n\n this.logger.info('Job re-queued for retry', { runId, jobId })\n }, backoffMs)\n } else {\n // Terminal failure: no retries left.\n // 1. Dead-letter the job for observability (cache record, no status change).\n // 2. Cancel downstream jobs that depend on this one so they don't hang in\n // 'queued' forever (B-030).\n // 3. Let checkRunCompletion finalize the run as 'failed' — 'dlq' is reserved\n // for infrastructure failures and must not leak as a user-step outcome (B-029).\n await this.deadLetterJob(runId, jobId, error)\n await this.cancelDownstreamJobs(runId, job.jobName, `upstream job \"${job.jobName}\" failed`)\n await this.checkRunCompletion(runId)\n }\n }\n\n /**\n * Recursively cancel jobs blocked on a failed/cancelled upstream job, so the\n * DAG does not leave dependents stuck in 'queued'. Cancellation cascades:\n * a cancelled job also cancels its own dependents.\n */\n private async cancelDownstreamJobs(\n runId: string,\n failedJobName: string,\n reason: string,\n ): Promise<void> {\n const released = await this.stateStore.releaseBlockedJobs(runId, failedJobName)\n for (const downstreamJob of released) {\n const now = new Date().toISOString()\n await this.stateStore.transitionJob(runId, downstreamJob.id, 'cancelled', (draft) => {\n draft.blocked = false\n draft.finishedAt = now\n draft.error = { message: reason, timestamp: now }\n })\n await this.events.publish({\n type: EVENT_NAMES.job.cancelled,\n runId,\n jobId: downstreamJob.id,\n payload: { jobName: downstreamJob.jobName, reason },\n })\n this.logger.info('Cancelled dependent job after upstream failure', {\n runId,\n jobId: downstreamJob.id,\n unlockedBy: failedJobName,\n })\n // Cascade: this job's own dependents must also be cancelled.\n await this.cancelDownstreamJobs(runId, downstreamJob.jobName, reason)\n }\n }\n\n /**\n * Mark job as interrupted (e.g., during graceful shutdown).\n * Interrupted jobs will be retried on next daemon startup.\n */\n async markJobInterrupted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.transitionJob(runId, jobId, 'interrupted', (draft) => {\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.warn('Job interrupted', { runId, jobId })\n }\n\n /**\n * Mark job as started (running).\n */\n async markJobStarted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.transitionJob(runId, jobId, 'running', (draft) => {\n draft.startedAt = new Date().toISOString()\n })\n\n // Promote run status to 'running' when first job starts. Deliberately\n // NOT `transitionRun` here: this is an opportunistic \"if still queued,\n // promote\" check, not an assertion that the run must currently be\n // 'queued' — the run may already be 'running' (a later job in the same\n // run starting) or, more rarely, something else entirely, and both\n // should stay a silent no-op rather than throw.\n await this.stateStore.updateRun(runId, (draft) => {\n if (draft.status === 'queued') {\n draft.status = 'running'\n if (!draft.startedAt) {\n draft.startedAt = new Date().toISOString()\n }\n }\n })\n\n this.logger.info('Job started', { runId, jobId })\n\n // Track job start\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n this.analytics?.track('workflow.job.started', {\n runId,\n jobId,\n jobName: job?.jobName,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.started,\n runId,\n jobId,\n payload: { jobName: job?.jobName },\n })\n }\n\n /**\n * Mark job as completed successfully.\n */\n async markJobCompleted(runId: string, jobId: string): Promise<void> {\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n const startTime = job?.startedAt ? new Date(job.startedAt).getTime() : Date.now()\n const duration = Date.now() - startTime\n\n await this.stateStore.transitionJob(runId, jobId, 'success', (draft) => {\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.info('Job completed successfully', { runId, jobId })\n\n // Track job completion\n this.analytics?.track('workflow.job.completed', {\n runId,\n jobId,\n jobName: job?.jobName,\n durationMs: duration,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.succeeded,\n runId,\n jobId,\n payload: { jobName: job?.jobName, durationMs: duration },\n })\n\n // Release jobs that were blocked waiting for this job to complete.\n if (job?.jobName) {\n const run = await this.stateStore.getRun(runId)\n const exprCtx = this.buildExpressionContext(run)\n const released = await this.stateStore.releaseBlockedJobs(runId, job.jobName)\n for (const releasedJob of released) {\n if (releasedJob.if && !this.evaluateJobIf(releasedJob.if, exprCtx)) {\n await this.skipJob(runId, releasedJob)\n } else {\n await this.scheduler.enqueueJob(runId, releasedJob, releasedJob.priority ?? 'normal')\n this.logger.info('Unblocked dependent job', { runId, jobId: releasedJob.id, unlockedBy: job.jobName })\n }\n }\n }\n\n // Check if all jobs in run are completed - update run status\n await this.checkRunCompletion(runId)\n }\n\n /** Build a minimal ExpressionContext from run state (for job-level if evaluation). */\n private buildExpressionContext(run: WorkflowRun | undefined | null): ExpressionContext {\n const ctx: ExpressionContext = {\n env: run?.env ?? {},\n trigger: run?.trigger ?? { type: 'manual' },\n inputs: run?.inputs ?? {},\n steps: {},\n }\n if (run) {\n for (const j of run.jobs) {\n for (const s of j.steps) {\n if (s.status === 'success' && s.spec.id) {\n ctx.steps[s.spec.id] = { outputs: (s.outputs ?? {}) as Record<string, unknown> }\n }\n }\n }\n }\n return ctx\n }\n\n /** Evaluate a job-level `if:` expression. Strips ${{ }} wrapper if present. */\n private evaluateJobIf(condition: string, ctx: ExpressionContext): boolean {\n const raw = condition.trim().replace(/^\\$\\{\\{\\s*/, '').replace(/\\s*\\}\\}$/, '')\n return evaluateExpression(raw, ctx)\n }\n\n /** Mark a job as skipped (success) and release any jobs blocked on it. */\n private async skipJob(runId: string, job: JobRun): Promise<void> {\n const now = new Date().toISOString()\n await this.stateStore.transitionJob(runId, job.id, 'success', (draft) => {\n draft.startedAt = now\n draft.finishedAt = now\n })\n this.logger.info('Job skipped: if condition false', { runId, jobId: job.id, condition: job.if })\n // Release dependents of the skipped job (treat skip as success for DAG purposes)\n const downstream = await this.stateStore.releaseBlockedJobs(runId, job.jobName)\n const run = await this.stateStore.getRun(runId)\n const exprCtx = this.buildExpressionContext(run)\n for (const downstreamJob of downstream) {\n if (downstreamJob.if && !this.evaluateJobIf(downstreamJob.if, exprCtx)) {\n await this.skipJob(runId, downstreamJob)\n } else {\n await this.scheduler.enqueueJob(runId, downstreamJob, downstreamJob.priority ?? 'normal')\n this.logger.info('Unblocked dependent job', { runId, jobId: downstreamJob.id, unlockedBy: job.jobName })\n }\n }\n }\n\n /**\n * Check if all jobs in a run are completed and update run status accordingly.\n */\n private async checkRunCompletion(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n if (!run) {\n return\n }\n\n // Check status of all jobs\n const allSuccess = run.jobs.every((j) => j.status === 'success')\n const anyFailed = run.jobs.some((j) => j.status === 'failed')\n // A job that isn't terminal yet still needs an executor to finish it —\n // including 'interrupted'/'waiting_approval'/'waiting_child' jobs, which\n // are legitimately parked and NOT the same as \"done\". The previous check\n // here only looked at 'running'/'queued', so a run with one job parked\n // (e.g. waiting on human approval) and another job that just failed\n // would be finalized as 'failed' out from under the parked job — the\n // exact bug class this rework closes at the run level.\n const anyNonTerminal = run.jobs.some((j) => !isTerminal(j.status, 'job'))\n\n if (anyNonTerminal) {\n return\n }\n\n // Update run status based on job outcomes\n if (allSuccess) {\n const updated = await this.stateStore.transitionRun(runId, 'success', (draft) => {\n draft.finishedAt = new Date().toISOString()\n draft.result = {\n ...(draft.result ?? { status: 'success' }),\n status: 'success',\n outputs: this.resolveDeclaredOutputs(draft),\n }\n return draft\n })\n this.logger.info('Workflow run completed successfully', { runId })\n\n // Track workflow completion\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'success',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.finished,\n runId,\n payload: { status: 'success', name: run.name },\n })\n\n if (updated) {\n await this.snapshotTerminalRun(updated)\n }\n await this.reconcileChildInvocation(runId)\n } else if (anyFailed) {\n // Surface the failing job's error at the run level so consumers (REST\n // /runs/:id, Studio, e2e) can show *why* the run failed without digging\n // into per-job records.\n const failedJob = run.jobs.find((j) => j.status === 'failed')\n const updated = await this.stateStore.transitionRun(runId, 'failed', (draft) => {\n draft.finishedAt = new Date().toISOString()\n if (failedJob?.error) {\n draft.result = {\n status: 'failed',\n summary: `Job ${failedJob.jobName} failed`,\n error: {\n message: failedJob.error.message,\n details: failedJob.error.stack ? { stack: failedJob.error.stack } : undefined,\n },\n }\n }\n return draft\n })\n this.logger.info('Workflow run failed', { runId })\n\n // Track workflow failure\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'failed',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.failed,\n runId,\n payload: { status: 'failed', name: run.name },\n })\n\n if (updated) {\n await this.snapshotTerminalRun(updated)\n }\n await this.reconcileChildInvocation(runId)\n }\n }\n\n /**\n * Mark step as started (running).\n */\n async markStepStarted(runId: string, jobId: string, stepId: string): Promise<void> {\n await this.stateStore.transitionStep(runId, jobId, stepId, 'running', (draft) => {\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Step started', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.started,\n runId,\n jobId,\n stepId,\n })\n }\n\n /**\n * Mark step as completed successfully with output.\n */\n async markStepCompleted(\n runId: string,\n jobId: string,\n stepId: string,\n output?: unknown,\n ): Promise<void> {\n await this.stateStore.transitionStep(runId, jobId, stepId, 'success', (draft) => {\n draft.finishedAt = new Date().toISOString()\n if (output !== undefined) {\n draft.outputs = output as Record<string, unknown>\n }\n })\n\n this.logger.debug('Step completed', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.succeeded,\n runId,\n jobId,\n stepId,\n payload: output !== undefined ? { outputs: output } : undefined,\n })\n }\n\n /**\n * Mark step as failed with error.\n */\n async markStepFailed(\n runId: string,\n jobId: string,\n stepId: string,\n error: Error,\n outputs?: Record<string, unknown>,\n ): Promise<void> {\n await this.stateStore.transitionStep(runId, jobId, stepId, 'failed', (draft) => {\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: error.message,\n stack: error.stack,\n }\n if (outputs) {draft.outputs = outputs}\n })\n\n this.logger.debug('Step failed', { runId, jobId, stepId, error: error.message })\n\n await this.events.publish({\n type: EVENT_NAMES.step.failed,\n runId,\n jobId,\n stepId,\n payload: { error: error.message },\n })\n }\n\n /**\n * Mark step as waiting for human approval.\n */\n /**\n * Park a step waiting for human approval — and park its parent job with\n * it, in the SAME atomic write (one `transitionJob` call touching both the\n * job's own status and its nested step). Two separate writes (step then\n * job) would leave a window where a reader could observe step=waiting but\n * job=running; going through one call closes that window entirely, not\n * just narrows it.\n *\n * The job-level `waiting_approval` status is what makes the daemon-restart\n * exemption in `cleanupStaleRuns` structural: that force-fail loop only\n * ever touches `running`/`queued` jobs, so a parked job is never in its\n * blast radius — no bespoke \"is this job actually abandoned or just\n * waiting on a human\" check needed there.\n */\n async markStepWaitingApproval(\n runId: string,\n jobId: string,\n stepId: string,\n ): Promise<void> {\n await this.stateStore.transitionJob(runId, jobId, 'waiting_approval', (jobDraft) => {\n const step = jobDraft.steps.find((s) => s.id === stepId)\n if (!step) {\n return\n }\n assertTransition('step', step.status, 'waiting_approval')\n step.status = 'waiting_approval'\n step.startedAt = step.startedAt ?? new Date().toISOString()\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingApproval,\n runId,\n payload: { jobId, stepId },\n })\n\n this.logger.info('Step waiting for approval', { runId, jobId, stepId })\n }\n\n /**\n * Park a step (and its parent job — see `markStepWaitingApproval`'s\n * docblock for why job+step move together in one write) while its child\n * workflow runs. The worker returns after this transition, so parent\n * workflows never consume the pool needed by children.\n */\n async markStepWaitingChild(\n runId: string,\n jobId: string,\n stepId: string,\n childRunId: string,\n ): Promise<void> {\n await this.stateStore.transitionJob(runId, jobId, 'waiting_child', (jobDraft) => {\n const step = jobDraft.steps.find((s) => s.id === stepId)\n if (!step) {\n return\n }\n assertTransition('step', step.status, 'waiting_child')\n step.status = 'waiting_child'\n step.startedAt ??= new Date().toISOString()\n step.metadata = { ...(step.metadata ?? {}), childRunId }\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingChild,\n runId,\n jobId,\n stepId,\n payload: { childRunId },\n })\n }\n\n /** Re-queue a parked parent job after its child workflow reaches a terminal state. */\n async resumeJob(runId: string, jobId: string): Promise<void> {\n const job = await this.stateStore.transitionJob(runId, jobId, 'queued', (draft) => {\n draft.finishedAt = undefined\n })\n if (job) {\n await this.scheduler.enqueueJob(runId, job, job.priority ?? 'normal')\n }\n }\n\n /**\n * Resolve a pending approval — approve or reject.\n * On approve: marks step as success with approval outputs.\n * On reject: marks step as failed with rejection error.\n *\n * Resolves the step AND un-parks the job (`waiting_approval` → `queued`)\n * in one atomic write — same reasoning as `markStepWaitingApproval` — then\n * re-enqueues the job. This re-enqueue is what actually resumes execution:\n * with approval no longer polled in-process (the worker parks and returns\n * instead of waiting), nothing else will ever pick this job back up.\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n data?: Record<string, unknown>,\n comment?: string,\n ): Promise<void> {\n // Guard against a stale approval: after markStepWaitingApproval parks the\n // job, `cleanupStaleRuns` never force-fails it (that's the whole point of\n // this rework) — but the run can still legitimately go terminal out from\n // under a pending approval via a plain `cancelRun` (which doesn't cascade\n // into cancelling this run's own in-flight jobs/steps). Without this\n // check, a human clicking an approval link open in a stale tab could\n // resolve a step whose run was already cancelled — resurrecting a dead\n // run's job into 'queued' and re-enqueuing it. `transitionJob` below\n // would also reject an already-terminal *job* on its own (its transition\n // table has no outgoing edges from a terminal state), but it has no way\n // to see the *run's* status — only this pre-check does.\n const run = await this.stateStore.getRun(runId)\n const existingJob = run?.jobs.find((j) => j.id === jobId)\n if (!run || !existingJob) {\n throw new Error(`Cannot resolve approval: run or job not found (runId=${runId}, jobId=${jobId})`)\n }\n if (isTerminal(run.status, 'run') || isTerminal(existingJob.status, 'job')) {\n throw new IllegalStateTransitionError('job', existingJob.status, 'queued', {\n reason: `run.status=${run.status}`,\n })\n }\n\n const stepStatus: StepRun['status'] = action === 'approve' ? 'success' : 'failed'\n const outputs = {\n approved: action === 'approve',\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n\n const job = await this.stateStore.transitionJob(runId, jobId, 'queued', (jobDraft) => {\n const step = jobDraft.steps.find((s) => s.id === stepId)\n if (!step) {\n return\n }\n assertTransition('step', step.status, stepStatus)\n step.status = stepStatus\n step.finishedAt = new Date().toISOString()\n step.outputs = outputs\n if (action === 'reject') {\n step.error = { message: comment || 'Approval rejected', code: 'APPROVAL_REJECTED' }\n }\n jobDraft.finishedAt = undefined\n })\n\n this.logger.info(action === 'approve' ? 'Approval granted' : 'Approval rejected', { runId, jobId, stepId, comment })\n\n await this.events.publish({\n type: EVENT_NAMES.step.updated,\n runId,\n payload: { jobId, stepId, action },\n })\n\n if (job) {\n await this.scheduler.enqueueJob(runId, job, job.priority ?? 'normal')\n }\n }\n\n /**\n * Get the state store for direct access (used by worker for gate restart-from).\n */\n getStateStore(): StateStore {\n return this.stateStore\n }\n\n /**\n * Get the scheduler for direct access (used by worker for gate re-enqueue).\n */\n getScheduler(): Scheduler {\n return this.scheduler\n }\n\n /**\n * Mark stale running/queued jobs as failed on daemon startup — their\n * executor process is gone, so they're unrecoverable. The run itself is\n * only finalized as 'failed' if nothing else could still complete it;\n * a run with one abandoned job and one job legitimately parked on a human\n * approval or a child workflow stays 'running' (only the abandoned job is\n * failed) until the parked one resolves.\n */\n async cleanupStaleRuns(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n const now = new Date().toISOString()\n let count = 0\n const runs = await this.listStoredRuns()\n const protectedChildRunIds = new Set(\n runs.flatMap((run) => run.jobs.flatMap((job) => job.steps\n .filter((step) => step.status === 'waiting_child')\n .map((step) => step.metadata?.['childRunId'])\n .filter((id): id is string => typeof id === 'string'))),\n )\n\n await Promise.all(\n runIds.map(async (runId) => {\n const run = await this.stateStore.getRun(runId)\n if (!run) { return }\n if (run.status !== 'running' && run.status !== 'queued') { return }\n // NOTE on what changed here vs. what stayed: the old code had a\n // bespoke early-return scanning this run's OWN steps for\n // `waiting_child` before ever looking at job statuses. That's gone —\n // a job whose step is waiting_approval/waiting_child now carries\n // that status itself (see markStepWaitingApproval/markStepWaitingChild),\n // so the force-fail loop below already skips it structurally, just by\n // virtue of not being 'running'/'queued'. No special-cased `if` needed.\n //\n // `protectedChildRunIds` below is a DIFFERENT, still-needed concern:\n // it protects a CHILD run's OWN in-flight jobs (not the parent's\n // parked step) — if this run IS someone's child and its jobs were\n // running when the daemon died, they're durable orchestration state\n // too and get a resumable 'interrupted' instead of a hard 'failed'.\n if (protectedChildRunIds.has(run.id)) {\n const hasRunningJob = run.jobs.some((job) => job.status === 'running')\n if (hasRunningJob) {\n await this.stateStore.updateRun(runId, (draft) => {\n for (const job of draft.jobs) {\n if (job.status === 'running') {\n job.status = 'interrupted'\n job.finishedAt = now\n for (const step of job.steps) {\n if (step.status === 'running') {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n }\n })\n }\n return\n }\n\n // A job legitimately parked (waiting_approval/waiting_child) keeps\n // the run alive even if some OTHER job in the same run really was\n // abandoned by the crashed daemon — finalizing the whole run here\n // would recreate this rework's original bug shape (run=failed while\n // a step is still waiting_approval), just one level up. Only the\n // genuinely abandoned jobs get failed; the run itself is only\n // finalized if nothing is left that could still bring it home.\n const hasParkedJob = run.jobs.some((job) => job.status === 'waiting_approval' || job.status === 'waiting_child')\n const abandonedJobIds = run.jobs\n .filter((job) => job.status === 'running' || job.status === 'queued')\n .map((job) => job.id)\n\n if (abandonedJobIds.length === 0) {\n return\n }\n\n if (hasParkedJob) {\n await this.stateStore.updateRun(runId, (draft) => {\n for (const job of draft.jobs) {\n if (abandonedJobIds.includes(job.id)) {\n job.status = 'failed'\n job.error = { message: 'Daemon restarted — run was abandoned' }\n job.finishedAt = now\n }\n }\n })\n count++\n return\n }\n\n await this.stateStore.transitionRun(runId, 'failed', (draft) => {\n draft.finishedAt = now\n if (draft.startedAt) {\n draft.durationMs = new Date(now).getTime() - new Date(draft.startedAt).getTime()\n }\n for (const job of draft.jobs) {\n if (abandonedJobIds.includes(job.id)) {\n job.status = 'failed'\n job.error = { message: 'Daemon restarted — run was abandoned' }\n job.finishedAt = now\n }\n }\n return draft\n })\n count++\n }),\n )\n\n if (count > 0) {\n this.logger.warn('Cleaned up stale runs from previous daemon process', { count })\n }\n }\n\n /**\n * Resume interrupted jobs on daemon startup.\n * Re-queues jobs that were interrupted during previous shutdown.\n */\n async resumeInterruptedJobs(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n\n // Process all runs in parallel\n const results = await Promise.all(\n runIds.map(async runId => {\n const run = await this.stateStore.getRun(runId)\n if (!run) {return 0}\n\n const interruptedJobs = run.jobs.filter(job => job.status === 'interrupted')\n\n // Process all interrupted jobs in this run in parallel\n await Promise.all(\n interruptedJobs.map(async job => {\n this.logger.info('Resuming interrupted job', { runId, jobId: job.id })\n\n await this.stateStore.transitionJob(runId, job.id, 'queued', (draft) => {\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const queuedJob = { ...job, status: 'queued' as const }\n await this.scheduler.enqueueJob(runId, queuedJob, queuedJob.priority ?? 'normal')\n }),\n )\n\n return interruptedJobs.length\n }),\n )\n\n const resumedCount = results.reduce((sum, count) => sum + count, 0)\n\n if (resumedCount > 0) {\n this.logger.info('Resumed interrupted jobs', { count: resumedCount })\n }\n }\n\n /**\n * Move permanently failed job to Dead Letter Queue.\n */\n /**\n * Record a dead-letter entry for a job that exhausted its retries. This is an\n * observability artifact only — it does NOT change the run status. The run\n * outcome is decided by checkRunCompletion (→ 'failed'). 'dlq' as a run status\n * is reserved for infrastructure failures and is no longer set here (B-029).\n */\n private async deadLetterJob(runId: string, jobId: string, error: Error): Promise<void> {\n this.logger.warn('Job dead-lettered after max retries', { runId, jobId })\n\n const dlqKey = `workflow:dlq:${runId}:${jobId}`\n const run = await this.stateStore.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n\n await this.options.cache!.set(\n dlqKey,\n JSON.stringify({\n runId,\n jobId,\n jobName: job?.jobName,\n error: {\n message: error.message,\n stack: error.stack,\n },\n timestamp: new Date().toISOString(),\n attempts: job?.attempt || 0,\n }),\n 7 * 24 * 60 * 60 * 1000 // TTL 7 days\n )\n }\n\n async updateRun(\n runId: string,\n mutator: (run: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, mutator)\n if (updated) {\n await this.publishRunEvent(EVENT_NAMES.run.updated, updated)\n }\n return updated\n }\n\n async finalizeRun(\n runId: string,\n status: WorkflowRun['status'],\n context: Partial<RunContext> = {},\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.transitionRun(runId, status, (run) => {\n const now = new Date().toISOString()\n run.finishedAt = now\n run.durationMs = computeDurationMs(run.startedAt ?? run.queuedAt, now)\n if (context.jobs) {\n run.jobs = context.jobs\n }\n if (context.steps) {\n // optional override steps already included in jobs\n }\n return run\n })\n\n if (updated) {\n await this.runCoordinator.releaseConcurrency(updated)\n await this.publishRunEvent(\n status === 'failed'\n ? EVENT_NAMES.run.failed\n : status === 'cancelled'\n ? EVENT_NAMES.run.cancelled\n : EVENT_NAMES.run.finished,\n updated,\n )\n\n await this.snapshotTerminalRun(updated)\n }\n\n return updated\n }\n\n /**\n * Persist a snapshot for a run that just reached a terminal state, so it\n * can be replayed from any step later (`replayRun`, used by both\n * `workflow runs restart --from-step` and `rerun --failed-only`). Only\n * 'success'/'failed' carry meaningful step output data worth snapshotting.\n *\n * Shared by finalizeRun() and checkRunCompletion() — checkRunCompletion is\n * the run-completion path actually driven by the worker in production, so\n * without this call here, no snapshot is ever created outside of tests\n * that call finalizeRun() directly (issue #263).\n */\n private async snapshotTerminalRun(run: WorkflowRun): Promise<void> {\n if (run.status !== 'success' && run.status !== 'failed') {\n return\n }\n\n const stepOutputs: Record<string, Record<string, unknown>> = {}\n for (const job of run.jobs) {\n for (const step of job.steps) {\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n stepOutputs[step.id] = step.outputs\n }\n }\n }\n\n // Logged at error (not warn) because this silently disables\n // `workflow runs restart --from-step` and `rerun --failed-only` for\n // this run — replayRun() will report a generic \"no snapshot\" with no\n // other trace of why.\n await this.snapshotStorage.createSnapshot(run, stepOutputs, run.env ?? {}).catch((err) => {\n this.logger.error(\n 'Failed to create run snapshot — restart --from-step and rerun --failed-only will not work for this run',\n err instanceof Error ? err : new Error(String(err)),\n { runId: run.id, status: run.status },\n )\n })\n }\n\n async nextJob(): Promise<JobQueueEntry | null> {\n return this.scheduler.dequeueJob()\n }\n\n async rescheduleJob(entry: JobQueueEntry, delayMs: number): Promise<void> {\n await this.scheduler.reschedule(entry, delayMs)\n }\n\n async publishRunEvent(\n type: WorkflowEventName,\n run: WorkflowRun,\n ): Promise<void> {\n await this.events.publish({\n type,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n }\n\n /**\n * Publish a log entry for real-time streaming to Studio UI.\n */\n async publishLog(\n runId: string,\n jobId: string,\n stepId: string,\n entry: { level: string; message: string; stream: string; lineNo: number; timestamp: string; meta?: Record<string, unknown> },\n stepName?: string,\n ): Promise<void> {\n await this.events.publish({\n type: EVENT_NAMES.log.appended,\n runId,\n jobId,\n stepId,\n payload: stepName ? { ...entry, stepName } : entry,\n })\n }\n\n /**\n * Create a snapshot of the current run state\n */\n async createSnapshot(\n runId: string,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot | null> {\n const run = await this.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot create snapshot: run not found', { runId })\n return null\n }\n\n return this.snapshotStorage.createSnapshot(run, stepOutputs, env, refs)\n }\n\n /**\n * Get a snapshot for a run\n */\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n return this.snapshotStorage.getSnapshot(runId)\n }\n\n /**\n * Replay a run from a snapshot, optionally starting from a specific step\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Replay orchestration: handles snapshot loading, step state transitions (before/at/after fromStep), env merging, job traversal, and conditional status reset logic\n async replayRun(\n runId: string,\n options: {\n fromStepId?: string\n stepOutputs?: Record<string, Record<string, unknown>>\n env?: Record<string, string>\n } = {},\n ): Promise<WorkflowRun | null> {\n // Load snapshot\n const snapshot = await this.snapshotStorage.getSnapshot(runId)\n if (!snapshot) {\n this.logger.warn('Cannot replay: snapshot not found', { runId })\n return null\n }\n\n if (snapshot.refs?.workspaceSnapshotId || snapshot.refs?.environmentSnapshotId) {\n if (!this.options.snapshotManager) {\n throw new Error('SnapshotManager is required for replay with infra snapshot references')\n }\n\n if (snapshot.refs.workspaceSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.workspaceSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n\n if (snapshot.refs.environmentSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.environmentSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n }\n\n // Restore run state\n const restoredRun = snapshot.run\n\n // Restore env if provided\n if (options.env) {\n restoredRun.env = { ...snapshot.env, ...options.env }\n } else {\n restoredRun.env = snapshot.env\n }\n\n // Validate fromStepId before any state mutation — a non-existent ID must be\n // a hard error (404), not a silent success that saves a broken run state.\n if (options.fromStepId) {\n const stepExists = restoredRun.jobs.some(job =>\n job.steps.some(s => s.id === options.fromStepId),\n )\n if (!stepExists) {\n throw new Error(`Step not found: ${options.fromStepId}`)\n }\n }\n\n // If fromStepId is specified, mark all steps before it as completed.\n // foundStep is declared outside the job loop so jobs after the job\n // containing fromStepId have all their steps correctly reset to queued.\n if (options.fromStepId) {\n let foundStep = false\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n if (step.id === options.fromStepId) {\n foundStep = true\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n continue\n }\n if (!foundStep) {\n // Mark previous steps as completed\n if (step.status === 'running' || step.status === 'queued') {\n step.status = 'success'\n step.finishedAt = step.finishedAt ?? new Date().toISOString()\n }\n } else {\n // Reset steps after the target step\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n } else {\n // Reset all steps to queued\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n\n // Reconstruct job.blocked and job.pendingDependencies based on the reset\n // step state. In a completed run all jobs have blocked=false, so without\n // this step scheduleRun would enqueue all jobs simultaneously, ignoring\n // declared dependency ordering (needs: [...]).\n const isJobComplete = (job: JobRun): boolean =>\n job.steps.every(s => s.status === 'success' || s.status === 'skipped')\n\n for (const job of restoredRun.jobs) {\n if (!job.needs || job.needs.length === 0) {\n job.blocked = false\n job.pendingDependencies = []\n continue\n }\n const pendingDeps = job.needs.filter(depName => {\n const depJob = restoredRun.jobs.find(j => j.jobName === depName)\n return depJob !== undefined && !isJobComplete(depJob)\n })\n job.pendingDependencies = pendingDeps\n job.blocked = pendingDeps.length > 0\n }\n\n // Create a new run ID so the original run's history is preserved.\n // Overwriting the same ID would destroy history and corrupt state if the\n // original run's worker is still live (race condition).\n const newRunId = randomUUID()\n const newNow = new Date().toISOString()\n const newRun: WorkflowRun = {\n ...restoredRun,\n id: newRunId,\n status: 'queued',\n createdAt: newNow,\n queuedAt: newNow,\n startedAt: undefined,\n finishedAt: undefined,\n durationMs: undefined,\n result: undefined,\n }\n\n // Save the new run (original run at its own ID is untouched)\n await this.stateStore.saveRun(newRun)\n\n // Schedule the new run\n await this.scheduler.scheduleRun(newRun)\n\n this.logger.info('Run replayed as new run from snapshot', {\n originalRunId: runId,\n newRunId,\n fromStepId: options.fromStepId,\n })\n\n return newRun\n }\n\n /**\n * Delete a snapshot\n */\n async deleteSnapshot(runId: string): Promise<void> {\n await this.snapshotStorage.deleteSnapshot(runId)\n }\n\n /**\n * Get all active workflow executions (running or queued).\n * Returns array of WorkflowRun objects with status 'running' or 'queued'.\n */\n async getActiveExecutions(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter for active ones\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter(\n (run): run is WorkflowRun =>\n run !== null && (run.status === 'running' || run.status === 'queued'),\n )\n }\n\n /**\n * Get all workflow runs (all statuses).\n * Returns array of all WorkflowRun objects ordered by creation time.\n */\n async getAllRuns(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter out nulls\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n /**\n * List all workflow runs.\n * Returns array of all runs in the system.\n * Alias for getAllRuns() - maintained for backward compatibility.\n */\n async listRuns(): Promise<WorkflowRun[]> {\n return this.getAllRuns()\n }\n\n /**\n * Get workflow engine metrics.\n * Returns statistics about runs, jobs, and system health.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Metrics aggregation: iterates all runs and jobs, counts by status (6 run statuses + 4 job statuses), handles nulls\n async getMetrics(): Promise<{\n runs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n cancelled: number\n dlq: number\n }\n jobs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n }\n }> {\n // Get all run IDs\n const runIds = await this.stateStore.getAllRunIds()\n\n const metrics = {\n runs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n dlq: 0,\n },\n jobs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n },\n }\n\n // Fetch all runs in parallel\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n // Aggregate metrics from all runs\n for (const run of runs) {\n if (!run) {continue}\n\n metrics.runs.total++\n\n // Count run status\n if (run.status === 'queued') {metrics.runs.queued++}\n else if (run.status === 'running') {metrics.runs.running++}\n else if (run.status === 'success') {metrics.runs.completed++}\n else if (run.status === 'failed') {metrics.runs.failed++}\n else if (run.status === 'cancelled') {metrics.runs.cancelled++}\n else if (run.status === 'dlq') {metrics.runs.dlq++}\n\n // Count job statuses\n for (const job of run.jobs) {\n metrics.jobs.total++\n if (job.status === 'queued') {metrics.jobs.queued++}\n else if (job.status === 'running') {metrics.jobs.running++}\n else if (job.status === 'success') {metrics.jobs.completed++}\n else if (job.status === 'failed') {metrics.jobs.failed++}\n }\n }\n\n return metrics\n }\n}\n\nfunction computeDurationMs(\n startedAt: string | undefined,\n finishedAt: string,\n): number | undefined {\n if (!startedAt) {\n return undefined\n }\n const start = Date.parse(startedAt)\n const end = Date.parse(finishedAt)\n if (Number.isNaN(start) || Number.isNaN(end)) {\n return undefined\n }\n return Math.max(0, end - start)\n}\n","import { join } from 'node:path'\nimport type { ArtifactMergeConfig, ArtifactMergeStrategy } from '@kb-labs/workflow-contracts'\nimport {\n createFileSystemArtifactClient,\n type ArtifactClient,\n} from '@kb-labs/workflow-artifacts'\nimport type { StateStore } from './state-store'\nimport type { EngineLogger } from './types'\n\nexport interface ArtifactMergerOptions {\n stateStore: StateStore\n logger: EngineLogger\n artifactsRoot: string\n}\n\nexport class ArtifactMerger {\n constructor(private readonly options: ArtifactMergerOptions) {}\n\n async mergeArtifacts(\n config: ArtifactMergeConfig,\n targetArtifacts: ArtifactClient,\n currentRunId: string,\n ): Promise<void> {\n const { strategy, from } = config\n\n this.options.logger.debug('Starting artifact merge', {\n strategy,\n sources: from.length,\n currentRunId,\n })\n\n // Load artifacts from all sources (parallel execution)\n const results = await Promise.allSettled(\n from.map(source =>\n this.loadArtifactsFromRun(source.runId, source.jobId).then(\n artifacts => ({ source, artifacts, success: true as const }),\n error => ({ source, error, success: false as const }),\n ),\n ),\n )\n\n const sourceArtifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n sourceArtifacts.push(...result.value.artifacts)\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifacts from source', {\n runId: result.value.source.runId,\n jobId: result.value.source.jobId,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n if (sourceArtifacts.length === 0) {\n this.options.logger.warn('No artifacts found to merge', {\n sources: from.length,\n })\n return\n }\n\n // Apply merge strategy\n await this.applyMergeStrategy(strategy, sourceArtifacts, targetArtifacts)\n\n this.options.logger.info('Artifact merge completed', {\n strategy,\n mergedCount: sourceArtifacts.length,\n })\n }\n\n private async loadArtifactsFromRun(\n runId: string,\n jobId?: string,\n ): Promise<Array<{ path: string; content: unknown }>> {\n // Load run from state store\n const run = await this.options.stateStore.getRun(runId)\n if (!run) {\n throw new Error(`Run ${runId} not found`)\n }\n\n // Find the job\n const job = jobId\n ? run.jobs.find((j) => j.id === jobId)\n : run.jobs[0] // Use first job if not specified\n\n if (!job) {\n throw new Error(`Job ${jobId ?? 'first'} not found in run ${runId}`)\n }\n\n // Get artifact paths from job\n const artifactPaths = job.artifacts?.produce ?? []\n if (artifactPaths.length === 0) {\n return []\n }\n\n // Load artifacts from filesystem (parallel execution)\n const sourceArtifacts = createFileSystemArtifactClient(join(\n this.options.artifactsRoot,\n runId,\n job.jobName,\n ))\n\n const results = await Promise.allSettled(\n artifactPaths.map(artifactPath => {\n return this.loadArtifactContent(sourceArtifacts, artifactPath).then(\n content => ({ artifactPath, content, success: true as const }),\n error => ({ artifactPath, error, success: false as const }),\n )\n }),\n )\n\n const artifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n artifacts.push({ path: result.value.artifactPath, content: result.value.content })\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifact', {\n runId,\n jobId: job.id,\n artifactPath: result.value.artifactPath,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n return artifacts\n }\n\n private async loadArtifactContent(\n artifacts: ArtifactClient,\n artifactPath: string,\n ): Promise<unknown> {\n try {\n const content = (await artifacts.consume(artifactPath)).toString('utf8')\n // Try to parse as JSON, fallback to string\n try {\n return JSON.parse(content)\n } catch {\n return content\n }\n } catch (error) {\n throw new Error(\n `Failed to read artifact '${artifactPath}': ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n private async applyMergeStrategy(\n strategy: ArtifactMergeStrategy,\n sourceArtifacts: Array<{ path: string; content: unknown }>,\n targetArtifacts: ArtifactClient,\n ): Promise<void> {\n // Group artifacts by path\n const artifactsByPath = new Map<string, unknown[]>()\n\n for (const artifact of sourceArtifacts) {\n if (!artifactsByPath.has(artifact.path)) {\n artifactsByPath.set(artifact.path, [])\n }\n artifactsByPath.get(artifact.path)!.push(artifact.content)\n }\n\n // Apply strategy and save for each path in parallel\n await Promise.all(\n Array.from(artifactsByPath.entries()).map(async ([path, contents]) => {\n let merged: unknown\n\n switch (strategy) {\n case 'append': {\n // Append: combine arrays or concatenate strings\n merged = this.mergeAppend(contents)\n break\n }\n case 'overwrite': {\n // Overwrite: use last value\n merged = contents[contents.length - 1]\n break\n }\n case 'json-merge': {\n // JSON merge: deep merge objects\n merged = this.mergeJson(contents)\n break\n }\n default: {\n this.options.logger.warn('Unknown merge strategy, using overwrite', {\n strategy,\n path,\n })\n merged = contents[contents.length - 1]\n }\n }\n\n // Save merged artifact\n await this.saveMergedArtifact(targetArtifacts, path, merged)\n }),\n )\n }\n\n private mergeAppend(contents: unknown[]): unknown {\n // If all are arrays, concatenate\n if (contents.every((c) => Array.isArray(c))) {\n return (contents as unknown[][]).flat()\n }\n\n // If all are strings, concatenate with newline\n if (contents.every((c) => typeof c === 'string')) {\n return (contents as string[]).join('\\n')\n }\n\n // Otherwise, wrap in array\n return contents\n }\n\n private mergeJson(contents: unknown[]): unknown {\n // Start with empty object\n let merged: Record<string, unknown> = {}\n\n for (const content of contents) {\n if (typeof content === 'object' && content !== null && !Array.isArray(content)) {\n merged = this.deepMerge(merged, content as Record<string, unknown>)\n } else {\n // If not an object, use last value\n merged = content as Record<string, unknown>\n }\n }\n\n return merged\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): Record<string, unknown> {\n const result = { ...target }\n\n for (const [key, value] of Object.entries(source)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Recursive merge for nested objects\n result[key] = this.deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n )\n } else {\n // Overwrite for primitives, arrays, or different types\n result[key] = value\n }\n }\n\n return result\n }\n\n private async saveMergedArtifact(\n artifacts: ArtifactClient,\n path: string,\n content: unknown,\n ): Promise<void> {\n // Convert content to string\n const contentString =\n typeof content === 'string'\n ? content\n : JSON.stringify(content, null, 2)\n\n await artifacts.produce(path, contentString)\n\n this.options.logger.debug('Saved merged artifact', { path })\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-converter\n *\n * Pure conversion utilities for plugin manifest declarations → WorkflowRuntime.\n * No I/O, no caching, no platform dependency — testable in isolation.\n *\n * Used by ManifestScanner which handles fetch + cache responsibilities.\n */\n\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n} from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowSchedule,\n} from './manifest-scanner.js';\n\nexport class ManifestConverter {\n convertWorkflowHandler(\n pluginId: string,\n handler: WorkflowHandlerDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}/${handler.id}`;\n\n return {\n kind: 'workflow',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', pluginId],\n triggers: [{ type: 'manual' }],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n convertJobHandler(\n pluginId: string,\n handler: JobHandlerDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}:job:${handler.id}`;\n\n return {\n kind: 'job',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', 'job', pluginId],\n triggers: [{ type: 'manual' }],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n convertCronSchedule(\n pluginId: string,\n cronDecl: CronDecl,\n pluginRoot: string,\n ): WorkflowRuntime {\n const id = `${pluginId}:cron:${cronDecl.id}`;\n\n const schedule: WorkflowSchedule = {\n cron: cronDecl.schedule,\n enabled: cronDecl.enabled ?? true,\n };\n\n return {\n kind: 'cron',\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: cronDecl.describe ?? cronDecl.id,\n description: cronDecl.describe,\n tags: ['plugin', 'cron', pluginId],\n triggers: [\n {\n type: 'schedule',\n config: { cron: cronDecl.schedule, timezone: cronDecl.timezone },\n },\n ],\n handler: undefined,\n schedule,\n status: (cronDecl.enabled ?? true) ? 'active' : 'disabled',\n permissions: cronDecl.permissions,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-scanner\n *\n * Scans plugin manifests for workflows and jobs, converting them to unified WorkflowRuntime format.\n *\n * ## Features\n * - Discovers workflows from `manifest.workflows.handlers`\n * - Discovers jobs from `manifest.jobs`\n * - Converts to unified WorkflowRuntime representation\n * - Caches results via Platform state for performance\n *\n * ## Usage\n * ```typescript\n * const scanner = new ManifestScanner({ cliApi, platform });\n * const workflows = await scanner.scanPlugins();\n * ```\n */\n\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n PlatformServices,\n ManifestV3,\n} from '@kb-labs/plugin-contracts';\nimport { ManifestConverter } from './manifest-converter.js';\n\n// 'v1' guard: increment when WorkflowRuntime format changes to prevent stale cache reads\nconst CACHE_KEY_WORKFLOWS = 'manifest-scanner:v1:workflows' as const;\n\n/**\n * Workflow trigger type\n */\nexport type WorkflowTriggerType = 'manual' | 'webhook' | 'push' | 'schedule' | 'event';\n\n/**\n * Workflow trigger configuration\n */\nexport interface WorkflowTrigger {\n type: WorkflowTriggerType;\n config?: Record<string, unknown>;\n}\n\n/**\n * Schedule configuration for workflows\n */\nexport interface WorkflowSchedule {\n /** Cron expression (e.g., \"0 2 * * *\") */\n cron: string;\n /** Whether schedule is enabled */\n enabled: boolean;\n /** Next run time (calculated) */\n nextRun?: Date;\n /** Last run time */\n lastRun?: Date;\n}\n\n/**\n * Workflow runtime statistics\n */\nexport interface WorkflowStats {\n totalRuns: number;\n successRuns: number;\n failedRuns: number;\n lastRunStatus?: 'success' | 'failed' | 'cancelled';\n lastRunAt?: Date;\n avgDurationMs?: number;\n}\n\n/**\n * Unified workflow runtime representation.\n *\n * Used for both manifest-based and standalone workflows.\n */\nexport interface WorkflowRuntime {\n // Identification\n id: string;\n /** Discriminator for workflow kind. Enables type-safe routing in consumers. */\n kind?: 'workflow' | 'job' | 'cron';\n source: 'manifest' | 'standalone' | 'plugin';\n\n // Manifest-based fields\n pluginId?: string;\n manifestPath?: string;\n\n // Common metadata\n name: string;\n description?: string;\n tags?: string[];\n\n // Execution configuration\n triggers: WorkflowTrigger[];\n handler?: string; // For manifest-based workflows\n\n // Schedule (if applicable)\n schedule?: WorkflowSchedule;\n\n // Status\n status: 'active' | 'paused' | 'disabled';\n\n // Statistics (optional, populated from runtime)\n stats?: WorkflowStats;\n\n // Permissions\n permissions?: unknown; // From manifest\n\n // Full spec stored for execution (standalone workflows)\n input?: unknown;\n output?: unknown;\n // Declared input parameter schema exposed via REST API\n inputSchema?: Record<string, { type: 'string' | 'number' | 'boolean'; description?: string; required?: boolean; default?: unknown }>;\n\n /** Semantic version from workflow spec (e.g. \"6.6.0\") */\n version?: string;\n /** ISO timestamp of last modification */\n updatedAt?: string;\n}\n\n/**\n * Options for ManifestScanner\n */\nexport interface ManifestScannerOptions {\n /** CLI API instance */\n cliApi: IEntityRegistry;\n\n /** Platform services (for state, logger, etc.) */\n platform: PlatformServices;\n\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n}\n\n/**\n * Manifest Scanner Service\n *\n * Discovers workflows and jobs from installed plugin manifests.\n */\nexport class ManifestScanner {\n private readonly cliApi: IEntityRegistry;\n private readonly platform: PlatformServices;\n private readonly cacheTtlMs: number;\n private readonly converter = new ManifestConverter();\n\n constructor(options: ManifestScannerOptions) {\n this.cliApi = options.cliApi;\n this.platform = options.platform;\n this.cacheTtlMs = options.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Scan all installed plugins for workflows and jobs.\n * Purpose: listing — populates the REST API GET /api/v1/workflows catalog.\n * (CronDiscovery in daemon handles scheduling — different output, different consumer.)\n *\n * Returns unified WorkflowRuntime representations.\n */\n async scanPlugins(): Promise<WorkflowRuntime[]> {\n // Check cache first (via platform cache)\n if (this.platform.cache) {\n const cached = await this.platform.cache.get<WorkflowRuntime[]>(CACHE_KEY_WORKFLOWS);\n if (cached) {\n this.platform.logger?.debug('ManifestScanner: Using cached workflows', { count: cached.length });\n return cached;\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Querying entity registry');\n const workflows: WorkflowRuntime[] = [];\n\n // Query workflow, job, and cron entities from registry (extracted from ManifestV3 by catalog)\n const workflowEntities = this.cliApi.queryEntities({ kind: 'workflow' });\n const jobEntities = this.cliApi.queryEntities({ kind: 'job' });\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n // Get plugin roots for handler path resolution\n const pluginRoots = new Map<string, string>();\n for (const plugin of this.cliApi.listPlugins()) {\n pluginRoots.set(plugin.id, plugin.source.path);\n }\n\n const allEntities = [\n ...workflowEntities.map(e => ({ entity: e, converter: 'workflow' as const })),\n ...jobEntities.map(e => ({ entity: e, converter: 'job' as const })),\n ...cronEntities.map(e => ({ entity: e, converter: 'cron' as const })),\n ];\n\n for (const { entity, converter } of allEntities) {\n const root = pluginRoots.get(entity.ref.pluginId);\n if (!root) {\n this.platform.logger?.warn('ManifestScanner: Plugin root not found, skipping entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n });\n continue;\n }\n\n try {\n // entity.declaration is typed as unknown in the registry — cast to concrete decl type\n if (converter === 'workflow') {\n workflows.push(this.converter.convertWorkflowHandler(entity.ref.pluginId, entity.declaration as unknown as WorkflowHandlerDecl, root));\n } else if (converter === 'job') {\n workflows.push(this.converter.convertJobHandler(entity.ref.pluginId, entity.declaration as unknown as JobHandlerDecl, root));\n } else {\n workflows.push(this.converter.convertCronSchedule(entity.ref.pluginId, entity.declaration as unknown as CronDecl, root));\n }\n } catch (err) {\n this.platform.logger?.warn('ManifestScanner: Failed to convert entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Scan workflow templates (static YAML files declared in manifest.workflows.templates)\n const snapshot = this.cliApi.snapshot();\n let templatesCount = 0;\n for (const entry of snapshot.manifests ?? []) {\n // ManifestV3 has workflows?: { templates?: WorkflowTemplateDecl[] } — no cast needed\n const manifest = entry.manifest as ManifestV3;\n const templates = manifest.workflows?.templates ?? [];\n for (const templateDecl of templates) {\n const id = `plugin:${entry.pluginId}/${templateDecl.id}`;\n workflows.push({\n id,\n source: 'plugin',\n pluginId: entry.pluginId,\n name: templateDecl.describe ?? templateDecl.id,\n description: templateDecl.describe,\n tags: templateDecl.tags,\n triggers: [{ type: 'manual' }],\n status: 'active',\n });\n templatesCount++;\n }\n }\n\n this.platform.logger?.info('ManifestScanner: Discovered workflows via registry', {\n count: workflows.length,\n workflows: workflowEntities.length,\n jobs: jobEntities.length,\n crons: cronEntities.length,\n templates: templatesCount,\n });\n\n // Cache results (via platform cache)\n if (this.platform.cache) {\n await this.platform.cache.set(CACHE_KEY_WORKFLOWS, workflows, this.cacheTtlMs);\n }\n\n return workflows;\n }\n\n /**\n * Scan all installed plugins for job handlers only.\n *\n * Returns information needed to register handlers in JobManager.\n */\n async scanJobHandlers(): Promise<Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }>> {\n const snapshot = this.cliApi.snapshot();\n const jobHandlers: Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }> = [];\n\n for (const entry of snapshot.manifests ?? []) {\n const handlers = entry.manifest.jobs?.handlers ?? [];\n for (const handler of handlers) {\n jobHandlers.push({\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler,\n });\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Discovered job handlers', {\n count: jobHandlers.length,\n });\n\n return jobHandlers;\n }\n\n /**\n * Clear cache (useful for testing or force refresh).\n */\n async clearCache(): Promise<void> {\n if (this.platform.cache) {\n await this.platform.cache.delete(CACHE_KEY_WORKFLOWS);\n this.platform.logger?.debug('ManifestScanner: Cache cleared');\n }\n }\n\n /**\n * Watch for plugin changes and invalidate cache.\n *\n * @param callback Optional callback when workflows change\n * @returns Unsubscribe function\n */\n watchPlugins(callback?: (workflows: WorkflowRuntime[]) => void): () => void {\n return this.cliApi.onChange(async () => {\n // Invalidate cache on plugin changes\n await this.clearCache();\n\n // Notify callback\n if (callback) {\n const workflows = await this.scanPlugins();\n callback(workflows);\n }\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-repository\n *\n * Repository for standalone workflow definitions.\n *\n * ## Features\n * - CRUD operations for user-created workflows\n * - File-based storage via platform.storage (`.kb/workflows/*.yaml`)\n * - Validation using WorkflowSpecSchema\n * - Conversion to unified WorkflowRuntime format\n *\n * ## Usage\n * ```typescript\n * const repo = new WorkflowRepository({ platform });\n * const workflow = await repo.create(spec);\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, readdir, mkdir, access } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowTrigger,\n WorkflowSchedule,\n WorkflowStats,\n} from './manifest-scanner';\n\n/**\n * Stored workflow metadata (what we persist to disk)\n */\ninterface StoredWorkflow {\n id: string;\n spec: WorkflowSpec;\n createdAt: string;\n updatedAt: string;\n status: 'active' | 'paused' | 'disabled';\n stats?: WorkflowStats;\n}\n\n/**\n * List options for filtering workflows\n */\nexport interface WorkflowListOptions {\n status?: 'active' | 'paused' | 'disabled';\n tags?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Options for WorkflowRepository\n */\nexport interface WorkflowRepositoryOptions {\n /** Platform services (for storage, logger, etc.) */\n platform: PlatformServices;\n\n /** Storage directory for workflows (default: '.kb/workflows') */\n storageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Workflow Repository\n *\n * Manages standalone workflow definitions (user-created via UI/API).\n * Uses platform.storage for persistence.\n */\nexport class WorkflowRepository {\n private readonly platform: PlatformServices;\n private readonly storageDir: string;\n private readonly workspaceRoot: string;\n private readonly absoluteStorageDir: string;\n\n constructor(options: WorkflowRepositoryOptions) {\n this.platform = options.platform;\n this.storageDir = options.storageDir ?? '.kb/workflows';\n this.workspaceRoot = options.workspaceRoot ?? process.cwd();\n this.absoluteStorageDir = resolve(this.workspaceRoot, this.storageDir);\n }\n\n /**\n * Create a new standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n // Validate spec\n const validated = WorkflowSpecSchema.parse(spec);\n\n // Generate ID\n const id = `wf-${randomUUID().slice(0, 8)}`;\n\n const stored: StoredWorkflow = {\n id,\n spec: validated,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n // Save to storage\n await this.saveWorkflow(id, stored);\n\n this.platform.logger?.info('WorkflowRepository: Created workflow', {\n id,\n name: spec.name,\n });\n\n return this.toRuntime(stored);\n }\n\n /**\n * Get workflow by ID.\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }\n\n /**\n * List all workflows with optional filtering.\n */\n async list(options?: WorkflowListOptions): Promise<WorkflowRuntime[]> {\n const allFiles = await this.listWorkflowFiles();\n\n // Load all workflows in parallel\n const allWorkflows = await Promise.all(\n allFiles.map(async filename => {\n const id = filename.replace(/\\.(yaml|yml)$/, '');\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }),\n );\n\n // Filter out nulls and apply status filter\n const workflows = allWorkflows.filter((workflow): workflow is WorkflowRuntime => {\n if (!workflow) {return false;}\n if (options?.status && workflow.status !== options.status) {return false;}\n return true;\n });\n\n // Apply pagination\n if (options?.offset !== undefined || options?.limit !== undefined) {\n const start = options.offset ?? 0;\n const end = options.limit ? start + options.limit : undefined;\n return workflows.slice(start, end);\n }\n\n return workflows;\n }\n\n /**\n * Update existing workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n // Merge with existing spec\n const updatedSpec = { ...stored.spec, ...spec };\n\n // Validate merged spec\n const validated = WorkflowSpecSchema.parse(updatedSpec);\n\n const updated: StoredWorkflow = {\n ...stored,\n spec: validated,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n\n this.platform.logger?.info('WorkflowRepository: Updated workflow', {\n id,\n name: validated.name,\n });\n\n return this.toRuntime(updated);\n }\n\n /**\n * Delete workflow.\n */\n async delete(id: string): Promise<void> {\n const path = await this.getWorkflowPath(id);\n if (!path) { throw new Error(`Invalid workflow ID for deletion: ${id}`); }\n\n try {\n await this.platform.storage.delete(path);\n this.platform.logger?.info('WorkflowRepository: Deleted workflow', { id });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Delete failed',\n error instanceof Error ? error : undefined,\n { id }\n );\n throw error;\n }\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n await this.updateStatus(id, 'disabled');\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n await this.updateStatus(id, 'paused');\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Update workflow statistics.\n */\n async updateStats(id: string, stats: Partial<WorkflowStats>): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n stats: { ...stored.stats, ...stats } as WorkflowStats,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async updateStatus(\n id: string,\n status: 'active' | 'paused' | 'disabled'\n ): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n status,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n this.platform.logger?.info('WorkflowRepository: Updated workflow status', {\n id,\n status,\n });\n }\n\n private async getWorkflowPath(id: string): Promise<string | null> {\n // Block path traversal: IDs with directory separators or dot-sequences can't be file-based\n if (id.includes('/') || id.includes('\\\\') || id.includes('..') || id.startsWith('.')) {\n return null;\n }\n const ymlPath = join(this.absoluteStorageDir, `${id}.yml`);\n const yamlPath = join(this.absoluteStorageDir, `${id}.yaml`);\n return access(ymlPath).then(() => ymlPath).catch(() => yamlPath);\n }\n\n private async saveWorkflow(id: string, workflow: StoredWorkflow): Promise<void> {\n const path = await this.getWorkflowPath(id);\n if (!path) { throw new Error(`Invalid workflow ID for storage: ${id}`); }\n const yaml = stringifyYaml(workflow, { indent: 2 });\n\n try {\n await mkdir(this.absoluteStorageDir, { recursive: true });\n await writeFile(path, yaml, 'utf-8');\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Save failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n throw error;\n }\n }\n\n private async loadWorkflow(id: string): Promise<StoredWorkflow | null> {\n const path = await this.getWorkflowPath(id);\n if (!path) { return null; }\n\n try {\n const content = await readFile(path, 'utf-8');\n const parsed = parseYaml(content) as Record<string, unknown>;\n\n // Check if it's already in StoredWorkflow format\n if (parsed.id && parsed.spec && parsed.createdAt) {\n // Force id to the filename so list()/get() stay consistent even if the\n // file was renamed after creation (B-016).\n return { ...(parsed as unknown as StoredWorkflow), id };\n }\n\n // Otherwise, it's a simple workflow YAML - convert to StoredWorkflow\n const candidateSpec = {\n name: parsed.name as string,\n version: (parsed.version as string) || '1.0.0',\n description: parsed.description as string | undefined,\n on: (parsed.on as WorkflowSpec['on']) || { manual: true },\n isolation: parsed.isolation as WorkflowSpec['isolation'],\n inputs: parsed.inputs as WorkflowSpec['inputs'],\n jobs: parsed.jobs as WorkflowSpec['jobs'],\n env: parsed.env as Record<string, string> | undefined,\n secrets: parsed.secrets as string[] | undefined,\n };\n\n // Validate against the schema so a structurally-invalid file (e.g. no\n // jobs, missing name) is NOT presented as a valid, runnable workflow.\n // Surfacing it as 'active' silently masked broken definitions (B-015).\n const validation = WorkflowSpecSchema.safeParse(candidateSpec);\n if (!validation.success) {\n this.platform.logger?.warn(\n `WorkflowRepository: skipping invalid workflow \"${id}\" — ${validation.error.issues\n .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('; ')}`,\n { id, path },\n );\n return null;\n }\n const spec: WorkflowSpec = validation.data;\n\n const stored: StoredWorkflow = {\n // The filename is the canonical id for file-based workflows. Using the\n // inner `id:` here made list() report an id that get()/getWorkflowPath()\n // (which resolve by filename) could not find → POST /runs 404 (B-016).\n id,\n spec,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n return stored;\n } catch (error) {\n // File not found is expected, other errors should be logged\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: Load failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n return null;\n }\n }\n\n private async listWorkflowFiles(): Promise<string[]> {\n try {\n const files = await readdir(this.absoluteStorageDir);\n return files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return [];\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: List failed',\n error instanceof Error ? error : undefined\n );\n return [];\n }\n }\n\n /**\n * Convert stored workflow to WorkflowRuntime format.\n */\n private toRuntime(stored: StoredWorkflow): WorkflowRuntime {\n const { id, spec, status, stats } = stored;\n\n // Convert triggers from spec.on to WorkflowTrigger[]\n const triggers: WorkflowTrigger[] = [];\n if (spec.on.manual) {\n triggers.push({ type: 'manual' });\n }\n if (spec.on.push) {\n triggers.push({ type: 'push' });\n }\n if (spec.on.webhook) {\n triggers.push({\n type: 'webhook',\n config: typeof spec.on.webhook === 'object' ? spec.on.webhook : undefined,\n });\n }\n\n // Extract schedule if present\n let schedule: WorkflowSchedule | undefined;\n if (spec.on.schedule) {\n triggers.push({\n type: 'schedule',\n config: spec.on.schedule,\n });\n\n schedule = {\n cron: spec.on.schedule.cron,\n enabled: status === 'active',\n };\n }\n\n // Extract tags from spec (we can use env vars or description as source)\n const tags: string[] = ['standalone'];\n if (spec.description) {\n // Extract hashtags from description\n const hashtagMatches = spec.description.match(/#\\w+/g);\n if (hashtagMatches) {\n tags.push(...hashtagMatches.map((t) => t.slice(1)));\n }\n }\n\n return {\n id,\n source: 'standalone',\n name: spec.name,\n description: spec.description,\n tags,\n triggers,\n schedule,\n status,\n stats,\n // Store full spec for execution\n input: spec,\n // Expose declared input schema for REST API / Studio UI\n inputSchema: spec.inputs,\n version: spec.version,\n updatedAt: stored.updatedAt,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-service\n *\n * Unified service for managing all workflows (manifest-based + standalone).\n *\n * ## Features\n * - Combines ManifestScanner and WorkflowRepository\n * - Unified interface for listing/getting workflows from both sources\n * - Provides available handlers for UI autocomplete\n * - Validates workflow specs\n *\n * ## Usage\n * ```typescript\n * const service = new WorkflowService({ cliApi, platform });\n * const allWorkflows = await service.listAll();\n * const workflow = await service.get('release-manager/create-release');\n * ```\n */\n\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { ManifestScanner, type WorkflowRuntime } from './manifest-scanner';\nimport { WorkflowRepository, type WorkflowListOptions } from './workflow-repository';\n\n/**\n * Handler information for UI autocomplete\n */\nexport interface WorkflowHandlerInfo {\n /** Handler ID (e.g., \"release-manager/create-release\") */\n id: string;\n /** Plugin ID */\n pluginId: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Input schema */\n inputSchema?: unknown;\n /** Output schema */\n outputSchema?: unknown;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * List options for workflows\n */\nexport interface WorkflowServiceListOptions extends WorkflowListOptions {\n /** Filter by source type */\n source?: 'manifest' | 'standalone';\n}\n\n/**\n * Options for WorkflowService\n */\nexport interface WorkflowServiceOptions {\n /** CLI API for plugin manifest scanning */\n cliApi: IEntityRegistry;\n\n /** Platform services */\n platform: PlatformServices;\n\n /** Cache TTL for manifest scanner (ms) */\n manifestCacheTtlMs?: number;\n\n /** Storage directory for standalone workflows */\n workflowStorageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Unified Workflow Service\n *\n * Combines manifest-based and standalone workflows into a single interface.\n */\nexport class WorkflowService {\n private readonly scanner: ManifestScanner;\n private readonly repository: WorkflowRepository;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowServiceOptions) {\n this.platform = options.platform;\n\n this.scanner = new ManifestScanner({\n cliApi: options.cliApi,\n platform: options.platform,\n cacheTtlMs: options.manifestCacheTtlMs,\n });\n\n this.repository = new WorkflowRepository({\n platform: options.platform,\n storageDir: options.workflowStorageDir,\n workspaceRoot: options.workspaceRoot,\n });\n }\n\n /**\n * List all workflows (manifest + standalone).\n */\n async listAll(options?: WorkflowServiceListOptions): Promise<WorkflowRuntime[]> {\n const workflows: WorkflowRuntime[] = [];\n\n // Get manifest-based workflows\n if (!options?.source || options.source === 'manifest') {\n const manifestWorkflows = await this.scanner.scanPlugins();\n workflows.push(...manifestWorkflows);\n }\n\n // Get standalone workflows\n if (!options?.source || options.source === 'standalone') {\n const standaloneWorkflows = await this.repository.list(options);\n workflows.push(...standaloneWorkflows);\n }\n\n // Apply filters\n let filtered = workflows;\n\n if (options?.status) {\n filtered = filtered.filter((w) => w.status === options.status);\n }\n\n if (options?.tags && options.tags.length > 0) {\n filtered = filtered.filter((w) =>\n options.tags!.some((tag) => w.tags?.includes(tag))\n );\n }\n\n // Sort by name\n filtered.sort((a, b) => a.name.localeCompare(b.name));\n\n this.platform.logger?.debug('WorkflowService: Listed workflows', {\n total: filtered.length,\n manifest: filtered.filter((w) => w.source === 'manifest').length,\n standalone: filtered.filter((w) => w.source === 'standalone').length,\n });\n\n return filtered;\n }\n\n /**\n * Get workflow by ID (from either source).\n *\n * Lookup order:\n * 1. Standalone by filename-derived id (canonical, fast path)\n * 2. Standalone by `name:` field — allows `--workflow-id=dev-cycle` even\n * when the file is named `03-dev-cycle.yml` (F8 ergonomics fix)\n * 3. Manifest-based by id\n * 4. Manifest-based by name field\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n // 1. Standalone by canonical filename-derived id (fast path, B-016)\n const standalone = await this.repository.get(id);\n if (standalone) {\n return standalone;\n }\n\n // 2. Standalone by name field — name-based alias (F8)\n const allStandalone = await this.repository.list();\n const byName = allStandalone.find((w) => w.name === id);\n if (byName) {\n return byName;\n }\n\n // 3. Manifest-based by id\n const manifestWorkflows = await this.scanner.scanPlugins();\n const manifest = manifestWorkflows.find((w) => w.id === id);\n if (manifest) {\n return manifest;\n }\n\n // 4. Manifest-based by name field\n return manifestWorkflows.find((w) => w.name === id) ?? null;\n }\n\n /**\n * Create standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n this.platform.logger?.info('WorkflowService: Creating workflow', {\n name: spec.name,\n });\n\n return this.repository.create(spec);\n }\n\n /**\n * Update standalone workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot update manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Updating workflow', { id });\n\n return this.repository.update(id, spec);\n }\n\n /**\n * Delete standalone workflow.\n */\n async delete(id: string): Promise<void> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot delete manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Deleting workflow', { id });\n\n await this.repository.delete(id);\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot enable manifest-based workflow: ${id}`);\n }\n\n await this.repository.enable(id);\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot disable manifest-based workflow: ${id}`);\n }\n\n await this.repository.disable(id);\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot pause manifest-based workflow: ${id}`);\n }\n\n await this.repository.pause(id);\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot resume manifest-based workflow: ${id}`);\n }\n\n await this.repository.resume(id);\n }\n\n /**\n * Get available workflow handlers (for UI autocomplete).\n *\n * Returns manifest-based handlers that can be used in standalone workflows\n * (via `uses: \"plugin:id/handler\"`).\n */\n async getAvailableHandlers(): Promise<WorkflowHandlerInfo[]> {\n const manifestWorkflows = await this.scanner.scanPlugins();\n\n const handlers = manifestWorkflows\n .filter((w) => w.source === 'manifest' && w.handler)\n .map((w) => ({\n id: w.id,\n pluginId: w.pluginId!,\n name: w.name,\n description: w.description,\n inputSchema: w.input,\n outputSchema: w.output,\n }));\n\n this.platform.logger?.debug('WorkflowService: Listed handlers', {\n count: handlers.length,\n });\n\n return handlers;\n }\n\n /**\n * Validate workflow spec.\n */\n validate(spec: WorkflowSpec): ValidationResult {\n try {\n WorkflowSpecSchema.parse(spec);\n return { valid: true };\n } catch (error) {\n if (error && typeof error === 'object' && 'errors' in error) {\n const zodError = error as { errors: Array<{ path: (string | number)[]; message: string }> };\n return {\n valid: false,\n errors: zodError.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n };\n }\n\n return {\n valid: false,\n errors: [{ path: '', message: 'Validation failed' }],\n };\n }\n }\n\n /**\n * Refresh manifest scanner cache (force re-scan).\n */\n async refreshManifests(): Promise<void> {\n await this.scanner.clearCache();\n this.platform.logger?.info('WorkflowService: Manifest cache cleared');\n }\n}\n","import { readFile, readdir } from 'node:fs/promises'\nimport { resolve, join, basename } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport type { ILogger } from '@kb-labs/core-platform'\nimport { WorkflowLoader } from './workflow-loader'\n\nexport interface WorkflowRegistryEntry {\n id: string\n name: string\n description?: string\n filePath: string\n spec: WorkflowSpec\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowRegistryOptions {\n scanDirs: string[]\n cwd?: string\n logger: ILogger\n}\n\n/**\n * WorkflowRegistry - Auto-discovery and indexing of workflow definitions\n *\n * Scans directories for .yml workflow files and indexes them by ID.\n * Provides clean API for finding and running workflows.\n */\nexport class WorkflowRegistry {\n private entries = new Map<string, WorkflowRegistryEntry>()\n private loader: WorkflowLoader\n\n constructor(private readonly options: WorkflowRegistryOptions) {\n this.loader = new WorkflowLoader(options.logger)\n }\n\n /**\n * Scan configured directories and index all workflow files\n */\n async scan(): Promise<void> {\n this.entries.clear()\n\n const cwd = this.options.cwd ?? process.cwd()\n this.options.logger.info('Starting workflow discovery', {\n scanDirs: this.options.scanDirs,\n cwd,\n })\n\n // Sequential directory scanning - each directory is independent but readdir is async\n for (const dir of this.options.scanDirs) {\n const absoluteDir = resolve(cwd, dir)\n\n if (!existsSync(absoluteDir)) {\n this.options.logger.debug(`Directory not found, skipping`, { dir: absoluteDir })\n continue\n }\n\n try {\n const files = await readdir(absoluteDir) // eslint-disable-line no-await-in-loop\n const yamlFiles = files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))\n\n this.options.logger.debug(`Found workflow files`, {\n dir: absoluteDir,\n count: yamlFiles.length,\n })\n\n // Index all files in parallel\n await Promise.all( // eslint-disable-line no-await-in-loop\n yamlFiles.map(file => {\n const filePath = join(absoluteDir, file)\n return this.indexFile(filePath)\n }),\n )\n } catch (error) {\n this.options.logger.warn(`Failed to scan directory`, {\n dir: absoluteDir,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n this.options.logger.info('Workflow discovery complete', {\n totalWorkflows: this.entries.size,\n ids: Array.from(this.entries.keys()),\n })\n }\n\n /**\n * Index a single workflow file\n */\n private async indexFile(filePath: string): Promise<void> {\n try {\n const raw = await readFile(filePath, 'utf8')\n const parsed = this.parseWorkflowFile(raw)\n\n // Extract ID from parsed file or use filename as fallback\n const id = (parsed.id as string | undefined) || basename(filePath, '.yml').replace('.yaml', '')\n\n // Convert to WorkflowSpec format\n const spec: WorkflowSpec = {\n name: parsed.name as string,\n version: '1.0.0',\n description: parsed.description as string | undefined,\n on: (parsed.on as WorkflowSpec['on']) || { manual: true },\n isolation: parsed.isolation as WorkflowSpec['isolation'],\n jobs: parsed.jobs as WorkflowSpec['jobs'],\n env: parsed.env as Record<string, string> | undefined,\n secrets: parsed.secrets as string[] | undefined,\n }\n\n const entry: WorkflowRegistryEntry = {\n id: id as string,\n name: parsed.name as string,\n description: parsed.description as string | undefined,\n filePath,\n spec,\n metadata: parsed.metadata as Record<string, unknown> | undefined,\n }\n\n this.entries.set(id, entry)\n\n this.options.logger.debug(`Indexed workflow`, {\n id,\n name: parsed.name,\n filePath,\n })\n } catch (error) {\n this.options.logger.warn(`Failed to index workflow file`, {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Parse workflow file (YAML format with additional fields)\n */\n private parseWorkflowFile(raw: string): Record<string, unknown> {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error('Workflow file is empty')\n }\n\n // Use WorkflowLoader's parse logic but return raw parsed object\n // We need the extra fields (id, schedule, etc) that aren't in WorkflowSpec\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { parse } = require('yaml')\n return parse(trimmed)\n }\n\n /**\n * Get workflow by ID\n */\n get(id: string): WorkflowRegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /**\n * List all registered workflows\n */\n list(): WorkflowRegistryEntry[] {\n return Array.from(this.entries.values())\n }\n\n /**\n * Check if workflow exists\n */\n has(id: string): boolean {\n return this.entries.has(id)\n }\n\n /**\n * Get workflow spec by ID\n */\n getSpec(id: string): WorkflowSpec | undefined {\n const entry = this.entries.get(id)\n return entry?.spec\n }\n\n /**\n * Clear all indexed workflows\n */\n clear(): void {\n this.entries.clear()\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/job-manager\n * Job manager for background task execution with sandboxed handlers.\n */\n\nimport type {\n IJobScheduler,\n JobDefinition,\n JobHandle,\n JobStatus,\n JobFilter,\n CronExpression,\n ICache,\n ILogger,\n IEventBus,\n} from '@kb-labs/core-platform';\nimport type { JobHandlerDecl, PluginContextDescriptor } from '@kb-labs/plugin-contracts';\nimport type { IExecutionBackend, ExecutionRequest } from '@kb-labs/core-contracts';\nimport { nanoid } from 'nanoid';\n\n/**\n * Job handler registry entry.\n */\ninterface JobHandlerRegistry {\n pluginId: string;\n jobId: string;\n handlerPath: string;\n config: JobHandlerDecl;\n pluginRoot: string;\n pluginVersion: string;\n}\n\n/**\n * Internal job record stored in cache.\n */\ninterface JobRecord {\n id: string;\n type: string;\n payload: unknown;\n tenantId: string;\n status: JobStatus;\n priority: number;\n maxRetries: number;\n timeout: number;\n attempt: number;\n progress: number;\n result?: unknown;\n error?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n runAt?: string;\n idempotencyKey?: string;\n}\n\n/**\n * Job queue entry for scheduling.\n */\ninterface JobQueueEntry {\n jobId: string;\n priority: number;\n availableAt: number;\n}\n\nexport interface JobManagerConfig {\n /** Execution backend for sandboxed handler execution */\n executionBackend?: IExecutionBackend<PluginContextDescriptor>;\n /** Default job timeout in ms (default: 300000 = 5 min) */\n defaultTimeout?: number;\n /** Default max retries (default: 3) */\n defaultMaxRetries?: number;\n /** Default priority (default: 50) */\n defaultPriority?: number;\n /** Workspace root (monorepo root) for plugin execution context */\n workspaceRoot?: string;\n}\n\n/**\n * Job manager - handles background job execution with sandboxed handlers.\n *\n * Features:\n * - Declarative job handlers from plugin manifests\n * - Priority-based queue (0-100, higher = more important)\n * - Retry with exponential/linear backoff\n * - Sandboxed subprocess execution via ExecutionBackend\n * - Progress tracking and status updates\n * - Idempotency support\n *\n * Architecture:\n * 1. Plugin declares job handlers in manifest.json\n * 2. Plugin runtime registers handlers via registerJobHandler()\n * 3. Plugin submits jobs via ctx.api.jobs.submit()\n * 4. JobManager enqueues job in priority queue (platform.cache sorted sets)\n * 5. Worker dequeues job and executes via ExecutionBackend.execute()\n * 6. Handler runs in subprocess with JobContext\n * 7. Results stored in cache, events emitted\n */\nexport class JobManager implements IJobScheduler {\n private handlerRegistry = new Map<string, JobHandlerRegistry>();\n private readonly defaultTimeout: number;\n private readonly defaultMaxRetries: number;\n private readonly defaultPriority: number;\n private readonly workspaceRoot: string;\n\n constructor(\n private readonly cache: ICache,\n private readonly events: IEventBus,\n private readonly logger: ILogger,\n private readonly config: JobManagerConfig = {}\n ) {\n this.defaultTimeout = config.defaultTimeout ?? 300000; // 5 min\n this.defaultMaxRetries = config.defaultMaxRetries ?? 3;\n this.defaultPriority = config.defaultPriority ?? 50;\n this.workspaceRoot = config.workspaceRoot ?? process.cwd(); // Fallback to process.cwd()\n }\n\n /**\n * Register job handler from plugin manifest.\n *\n * Called by plugin-runtime during plugin initialization.\n *\n * @param pluginId - Plugin identifier\n * @param pluginVersion - Plugin version\n * @param pluginRoot - Plugin root directory\n * @param handlerDecl - Job handler declaration from manifest\n */\n registerJobHandler(\n pluginId: string,\n pluginVersion: string,\n pluginRoot: string,\n handlerDecl: JobHandlerDecl\n ): void {\n const jobType = `${pluginId}:${handlerDecl.id}`;\n\n if (this.handlerRegistry.has(jobType)) {\n this.logger.warn('Job handler already registered, overwriting', {\n jobType,\n pluginId,\n jobId: handlerDecl.id,\n });\n }\n\n this.handlerRegistry.set(jobType, {\n pluginId,\n jobId: handlerDecl.id,\n handlerPath: handlerDecl.handler,\n config: handlerDecl,\n pluginRoot,\n pluginVersion,\n });\n\n this.logger.info('Registered job handler', {\n jobType,\n handler: handlerDecl.handler,\n });\n }\n\n /**\n * Submit a job for immediate execution.\n */\n async submit(job: JobDefinition): Promise<JobHandle> {\n // Validate handler exists\n const handlerEntry = this.handlerRegistry.get(job.type);\n if (!handlerEntry) {\n throw new Error(`Job handler not found: ${job.type}`);\n }\n\n // Check idempotency\n if (job.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(job.idempotencyKey);\n if (existing) {\n this.logger.info('Job already submitted (idempotent)', {\n idempotencyKey: job.idempotencyKey,\n existingJobId: existing.id,\n });\n return this.jobRecordToHandle(existing);\n }\n }\n\n // Create job record\n const jobId = nanoid();\n const now = new Date();\n const record: JobRecord = {\n id: jobId,\n type: job.type,\n payload: job.payload,\n tenantId: job.tenantId ?? 'default',\n status: 'pending',\n priority: job.priority ?? this.defaultPriority,\n maxRetries: job.maxRetries ?? handlerEntry.config.maxRetries ?? this.defaultMaxRetries,\n timeout: job.timeout ?? handlerEntry.config.timeout ?? this.defaultTimeout,\n attempt: 0,\n progress: 0,\n createdAt: now.toISOString(),\n runAt: job.runAt?.toISOString(),\n idempotencyKey: job.idempotencyKey,\n };\n\n // Store job record\n await this.saveJobRecord(record);\n\n // Enqueue for execution\n const availableAt = job.runAt ? job.runAt.getTime() : Date.now();\n await this.enqueueJob(jobId, record.priority, availableAt);\n\n this.logger.info('Job submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n priority: record.priority,\n });\n\n // Emit event\n await this.events.publish('job.submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n });\n\n return this.jobRecordToHandle(record);\n }\n\n /**\n * Schedule a job for future/recurring execution.\n */\n async schedule(job: JobDefinition, schedule: CronExpression | Date): Promise<JobHandle> {\n if (schedule instanceof Date) {\n // One-time scheduled job\n return this.submit({ ...job, runAt: schedule });\n }\n\n // TODO: Cron scheduling - integrate with CronManager\n throw new Error('Cron scheduling not yet implemented');\n }\n\n /**\n * Cancel a pending/running job.\n */\n async cancel(jobId: string): Promise<boolean> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return false;\n }\n\n if (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled') {\n this.logger.warn('Cannot cancel job in terminal state', {\n jobId,\n status: record.status,\n });\n return false;\n }\n\n // Update status\n record.status = 'cancelled';\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Remove from queue\n await this.removeFromQueue(jobId);\n\n this.logger.info('Job cancelled', { jobId });\n\n // Emit event\n await this.events.publish('job.cancelled', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n });\n\n return true;\n }\n\n /**\n * Get job status.\n */\n async getStatus(jobId: string): Promise<JobHandle | null> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return null;\n }\n return this.jobRecordToHandle(record);\n }\n\n /**\n * List jobs.\n */\n async list(filter: JobFilter = {}): Promise<JobHandle[]> {\n // TODO: Implement efficient filtering\n // For now, simple scan approach\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all job records in parallel\n const allRecords = await Promise.all(keys.map(key => this.cache.get<JobRecord>(key)));\n\n // Filter out nulls and apply filters\n const records = allRecords.filter((data): data is JobRecord => {\n if (!data) {return false;}\n\n // Apply filters\n if (filter.type && data.type !== filter.type) {return false;}\n if (filter.tenantId && data.tenantId !== filter.tenantId) {return false;}\n if (filter.status && data.status !== filter.status) {return false;}\n\n return true;\n });\n\n // Sort by creation time (newest first)\n records.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Pagination\n const offset = filter.offset ?? 0;\n const limit = filter.limit ?? 100;\n const page = records.slice(offset, offset + limit);\n\n return page.map(r => this.jobRecordToHandle(r));\n }\n\n /**\n * Execute a job (called by worker).\n *\n * @internal\n */\n async executeJob(jobId: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.error('Job not found for execution', undefined, { jobId });\n return;\n }\n\n const handlerEntry = this.handlerRegistry.get(record.type);\n if (!handlerEntry) {\n this.logger.error('Job handler not found', undefined, { jobId, type: record.type });\n await this.markJobFailed(record, 'Handler not found');\n return;\n }\n\n // Check if execution backend is available\n if (!this.config.executionBackend) {\n this.logger.error('ExecutionBackend not configured', undefined, { jobId });\n await this.markJobFailed(record, 'ExecutionBackend not configured');\n return;\n }\n\n // Update status to running\n record.status = 'running';\n record.attempt += 1;\n record.startedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Emit event\n await this.events.publish('job.started', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n });\n\n try {\n // Build execution request\n const executionId = `job-${jobId}-${record.attempt}`;\n const traceId = executionId;\n const spanId = executionId;\n const invocationId = executionId;\n\n // Create minimal descriptor for job context\n const descriptor: PluginContextDescriptor = {\n hostType: 'cron',\n hostContext: {\n host: 'cron',\n cronId: record.type,\n schedule: '', // Not available in job context\n scheduledAt: new Date().toISOString(),\n },\n permissions: handlerEntry.config.permissions ?? {},\n pluginId: handlerEntry.pluginId,\n pluginVersion: '0.0.0', // TODO: Get from manifest\n requestId: executionId,\n tenantId: record.tenantId,\n };\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n });\n\n const request: ExecutionRequest<PluginContextDescriptor> = {\n executionId,\n descriptor,\n pluginRoot: handlerEntry.pluginRoot,\n handlerRef: handlerEntry.handlerPath,\n input: {\n jobId,\n type: record.type,\n input: record.payload,\n tenantId: record.tenantId,\n attempt: record.attempt,\n },\n timeoutMs: record.timeout,\n };\n\n this.logger.debug('Executing job handler', {\n jobId,\n handler: handlerEntry.handlerPath,\n attempt: record.attempt,\n });\n\n // Execute in subprocess\n const result = await this.config.executionBackend.execute(request, {\n signal: undefined, // TODO: Support cancellation\n });\n\n if (result.ok) {\n // Job succeeded\n record.status = 'completed';\n record.result = result.data;\n record.progress = 100;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.info('Job completed', {\n jobId,\n type: record.type,\n duration: result.executionTimeMs,\n });\n\n await this.events.publish('job.completed', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n result: result.data,\n });\n } else {\n // Job failed\n const errorMsg = result.error?.message ?? 'Unknown error';\n await this.handleJobFailure(record, errorMsg);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error('Job execution failed', undefined, { jobId, error: errorMsg });\n await this.handleJobFailure(record, errorMsg);\n }\n }\n\n /**\n * Update job progress.\n *\n * Called by job handler via ctx.updateProgress()\n */\n async updateProgress(jobId: string, percent: number, message?: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.warn('Cannot update progress: job not found', { jobId });\n return;\n }\n\n record.progress = Math.max(0, Math.min(100, percent));\n await this.saveJobRecord(record);\n\n await this.events.publish('job.progress', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n progress: record.progress,\n message,\n });\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async handleJobFailure(record: JobRecord, errorMsg: string): Promise<void> {\n if (record.attempt < record.maxRetries) {\n // Retry with backoff\n const backoffMs = this.calculateBackoff(record.attempt, record.type);\n const availableAt = Date.now() + backoffMs;\n\n record.status = 'pending';\n await this.saveJobRecord(record);\n await this.enqueueJob(record.id, record.priority, availableAt);\n\n this.logger.info('Job retry scheduled', {\n jobId: record.id,\n attempt: record.attempt,\n maxRetries: record.maxRetries,\n backoffMs,\n });\n\n await this.events.publish('job.retry', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n backoffMs,\n });\n } else {\n // Max retries exceeded\n await this.markJobFailed(record, errorMsg);\n }\n }\n\n private async markJobFailed(record: JobRecord, errorMsg: string): Promise<void> {\n record.status = 'failed';\n record.error = errorMsg;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.error('Job failed', undefined, {\n jobId: record.id,\n type: record.type,\n error: errorMsg,\n attempt: record.attempt,\n });\n\n await this.events.publish('job.failed', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n error: errorMsg,\n });\n }\n\n private calculateBackoff(attempt: number, jobType: string): number {\n const handlerEntry = this.handlerRegistry.get(jobType);\n const strategy = handlerEntry?.config.retryBackoff ?? 'exp';\n\n if (strategy === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, ...\n return Math.min(1000 * Math.pow(2, attempt), 60000);\n } else {\n // Linear: 5s, 10s, 15s, 20s, ...\n return Math.min(5000 * (attempt + 1), 60000);\n }\n }\n\n private async saveJobRecord(record: JobRecord): Promise<void> {\n const key = `kb:job:${record.id}`;\n await this.cache.set(key, record, 7 * 24 * 60 * 60 * 1000); // 7 days TTL\n }\n\n private async getJobRecord(jobId: string): Promise<JobRecord | null> {\n const key = `kb:job:${jobId}`;\n return this.cache.get<JobRecord>(key);\n }\n\n private async enqueueJob(jobId: string, priority: number, availableAt: number): Promise<void> {\n const entry: JobQueueEntry = {\n jobId,\n priority,\n availableAt,\n };\n await this.cache.zadd('kb:jobqueue', availableAt, JSON.stringify(entry));\n }\n\n private async removeFromQueue(jobId: string): Promise<void> {\n // Scan queue and remove matching entry\n const results = await this.cache.zrangebyscore('kb:jobqueue', 0, Date.now() + 1000000);\n // Sequential search - must break on first match to avoid unnecessary zrem calls\n for (const raw of results) {\n try {\n const entry = JSON.parse(raw) as JobQueueEntry;\n if (entry.jobId === jobId) {\n await this.cache.zrem('kb:jobqueue', raw); // eslint-disable-line no-await-in-loop\n break;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n\n private async findByIdempotencyKey(key: string): Promise<JobRecord | null> {\n // TODO: Implement efficient lookup (maybe secondary index)\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all records in parallel and find match\n const records = await Promise.all(keys.map(k => this.cache.get<JobRecord>(k)));\n\n return records.find(record => record?.idempotencyKey === key) ?? null;\n }\n\n private async getAllJobKeys(_pattern: string): Promise<string[]> {\n // TODO: Implement efficient key scanning\n // For now, this is a placeholder - real implementation would use cache.scan()\n // or maintain a separate index\n return [];\n }\n\n private jobRecordToHandle(record: JobRecord): JobHandle {\n return {\n id: record.id,\n type: record.type,\n tenantId: record.tenantId,\n status: record.status,\n progress: record.progress,\n result: record.result,\n error: record.error,\n createdAt: new Date(record.createdAt),\n startedAt: record.startedAt ? new Date(record.startedAt) : undefined,\n completedAt: record.completedAt ? new Date(record.completedAt) : undefined,\n };\n }\n}\n"]}