@kb-labs/workflow-daemon 2.109.0 → 2.111.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/worker.ts","../src/job-broker.ts","../src/cron-scheduler.ts","../src/cron-discovery.ts","../src/file-watcher.ts","../src/host/workflow-host-service.ts","../src/api/response.ts","../src/api/jobs-api.ts","../src/api/cron-api.ts","../src/api/workflows-api.ts","../src/api/approvals-api.ts","../src/api/stats-api.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["platform","wsProvider","entry","createCorrelatedLogger","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/workflow-daemon/worker\n * WorkflowWorker implementation - processes jobs from WorkflowEngine.\n *\n * The worker orchestrates job/step execution but delegates all code execution\n * to the execution plane (backend.execute). It knows nothing about containers,\n * environments, or workspace provisioning — that's the platform's responsibility.\n */\n\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { logDiagnosticEvent } from '@kb-labs/core-platform';\nimport type { ILogger, IAnalytics, IWorkspaceProvider } from '@kb-labs/core-platform';\nimport type { IExecutionBackend } from '@kb-labs/core-contracts';\nimport type { ExecutionTarget, ExpressionContext, StepSpec, WorkflowRun, JobRun, StepRun } from '@kb-labs/workflow-contracts';\nimport type { ExecutionBackend } from '@kb-labs/plugin-execution';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport {\n buildShellSafeCommand,\n interpolateObject,\n interpolateString,\n evaluateExpression,\n coerceToString,\n} from '@kb-labs/workflow-contracts';\nimport type { GateInput } from '@kb-labs/workflow-steps';\nimport { GateHandler, type GateDecision } from '@kb-labs/workflow-steps';\nimport { SandboxRunner } from '@kb-labs/workflow-runtime';\n\ninterface StepSpecRaw {\n run?: string;\n uses?: string;\n summary?: string;\n with?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface Platform {\n readonly executionBackend: IExecutionBackend;\n readonly hasExecutionBackend: boolean;\n getAdapter<T = unknown>(name: string): T | undefined;\n}\n\nexport interface CreateWorkflowWorkerOptions {\n engine: WorkflowEngine;\n cliApi: IEntityRegistry;\n logger: ILogger;\n platform: Platform;\n workspaceRoot: string;\n concurrency?: number;\n /** Default timeout for step execution (ms). Default: 120000 (2 minutes) */\n defaultTimeout?: number;\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics;\n /**\n * Enable verbose debug logging (inputs, expr context, interpolation details).\n * Defaults to WORKFLOW_DEBUG env var. Pass true to force-enable.\n */\n debugMode?: boolean;\n}\n\nexport interface WorkflowWorker {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\n/**\n * Create a workflow worker that processes jobs from the queue.\n * Uses SandboxRunner with ExecutionBackend for plugin execution.\n *\n * The worker is a pure orchestrator:\n * - Picks jobs from queue, iterates steps sequentially\n * - Delegates execution to backend.execute() (execution plane)\n * - Handles results, marks status, manages retry/failure\n *\n * All provisioning (workspace, environment, cleanup) is handled by the\n * execution plane transparently — the worker doesn't know or care.\n */\nexport async function createWorkflowWorker(\n options: CreateWorkflowWorkerOptions\n): Promise<WorkflowWorker> {\n const {\n engine,\n cliApi,\n logger,\n platform,\n workspaceRoot,\n concurrency = 5,\n defaultTimeout = 120000,\n analytics,\n debugMode = process.env['WORKFLOW_DEBUG'] === 'true',\n } = options;\n\n // Clean up stale worktrees from previous daemon runs on startup.\n const wsProvider = platform.getAdapter<IWorkspaceProvider>('workspace');\n if (wsProvider && typeof (wsProvider as { startupCleanup?: () => Promise<void> }).startupCleanup === 'function') {\n (wsProvider as unknown as { startupCleanup: () => Promise<void> }).startupCleanup().catch(() => {});\n }\n\n let isRunning = false;\n let stopRequested = false;\n\n // Track running jobs for graceful shutdown\n const runningJobs = new Map<string, Promise<void>>();\n\n // In-memory lock to prevent duplicate job processing from concurrent worker loops.\n // zrangebyscore+zrem is not atomic, so multiple workers can dequeue the same entry.\n const claimedJobs = new Set<string>();\n\n // ExecutionBackend from platform — unified across all hosts (CLI, REST API, workflow)\n // In container mode this is a RoutingBackend; in standard mode — in-process/worker-pool.\n const executionBackend = platform.executionBackend;\n\n // Create SandboxRunner with ExecutionBackend\n const runner = new SandboxRunner({\n // IExecutionBackend<unknown> (core-contracts) is structurally compatible with\n // ExecutionBackend (plugin-execution) — both expose the same execute/health/stats/shutdown API.\n backend: executionBackend as unknown as ExecutionBackend,\n cliApi,\n workspaceRoot,\n defaultTimeout,\n });\n\n /**\n * Process a single job from the queue.\n */\n async function processJob(): Promise<boolean> {\n const entry = await engine.nextJob();\n if (!entry) {\n return false; // No job available\n }\n\n // Get run and job from state store using IDs from queue entry\n const run = await engine.getRun(entry.runId);\n if (!run) {\n logger.error('Data inconsistency: Run not found for job entry', undefined, {\n runId: entry.runId,\n jobId: entry.jobId\n });\n return true; // Entry was processed (but run missing - data corruption)\n }\n\n const job = run.jobs.find(j => j.id === entry.jobId);\n if (!job) {\n logger.error('Data inconsistency: Job not found in run', undefined, {\n runId: run.id,\n jobId: entry.jobId\n });\n return true; // Entry was processed (but job missing - data corruption)\n }\n\n const jobKey = `${run.id}:${job.id}`;\n\n // Guard against duplicate processing from concurrent worker loops.\n // zrangebyscore+zrem is not atomic — multiple loops can dequeue the same entry.\n if (claimedJobs.has(jobKey)) {\n return true; // Another loop already claimed this job\n }\n claimedJobs.add(jobKey);\n\n const waitMs = job.queuedAt ? Date.now() - new Date(job.queuedAt).getTime() : undefined;\n logger.info('Job picked from queue', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n queuedAt: job.queuedAt,\n waitMs,\n });\n\n const jobStartTime = Date.now();\n const jobLogger = createCorrelatedLogger(logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service: 'worker',\n requestId: run.id,\n traceId: run.id,\n operation: 'workflow.job',\n bindings: {\n workflowId: run.id,\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n },\n });\n\n jobLogger.info('Processing job', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n });\n\n // Mark job as started (sets startedAt timestamp)\n await engine.markJobStarted(run.id, job.id);\n\n // Track job processing started\n analytics?.track('workflow.worker.job.started', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n stepCount: job.steps.length,\n }).catch(() => {});\n\n // Resolve target hint from workflow spec (explicit override for execution plane)\n const runTarget = (run.metadata as Record<string, unknown> | undefined)?.target as ExecutionTarget | undefined;\n const jobTarget = job.target as ExecutionTarget | undefined;\n const target = jobTarget ?? runTarget;\n\n // ── Workspace provisioning (worktree/container/remote) ──\n // If platform has a workspace provider, create an isolated workspace for this run.\n // All steps will execute in the provisioned workspace instead of the host workspace.\n const wsProvider = platform.getAdapter<IWorkspaceProvider>('workspace');\n // Without a workspace adapter, run steps in the project directory.\n // KB_PROJECT_ROOT is injected by kb-dev; fall back to workspaceRoot (platform dir) only\n // when running outside of kb-dev (e.g. tests or direct node invocation).\n let runWorkspace = wsProvider\n ? workspaceRoot\n : (process.env['KB_PROJECT_ROOT'] ?? workspaceRoot);\n let provisionedWorkspaceId: string | undefined;\n\n if (wsProvider) {\n const wsId = `wt_${run.id.slice(0, 8)}`;\n try {\n // Deterministic workspaceId per run — retries reuse the same worktree\n const ws = await wsProvider.materialize({\n workspaceId: wsId,\n sourceRef: 'main',\n metadata: { runId: run.id, jobId: job.id },\n onProgress: (event) => {\n jobLogger.info(`[workspace] ${event.stage}: ${event.message}`, {\n stage: event.stage,\n progress: event.progress,\n });\n },\n });\n if (ws.rootPath) {\n runWorkspace = ws.rootPath;\n provisionedWorkspaceId = ws.workspaceId;\n jobLogger.info('Workspace provisioned', {\n workspaceId: ws.workspaceId,\n provider: ws.provider,\n rootPath: ws.rootPath,\n });\n }\n } catch (wsError) {\n const msg = wsError instanceof Error ? wsError.message : String(wsError);\n logDiagnosticEvent(jobLogger, {\n domain: 'workflow',\n event: 'workflow.workspace.provision',\n level: 'error',\n reasonCode: inferWorkspaceProvisionReasonCode(msg),\n message: 'Workspace provisioning failed',\n outcome: 'failed',\n error: wsError instanceof Error ? wsError : new Error(String(wsError)),\n serviceId: 'workflow',\n stage: 'materialize',\n evidence: {\n runId: run.id,\n jobId: job.id,\n workspaceId: wsId,\n },\n });\n const provisionErr = new Error(`Workspace provisioning failed: ${msg}`);\n await engine.markJobFailed(run.id, job.id, provisionErr);\n claimedJobs.delete(jobKey);\n return true;\n }\n }\n\n // Create job execution promise for graceful shutdown tracking\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Step execution loop: handles data flow, spec.if, builtin:approval polling, builtin:gate routing with restart-from\n const jobPromise = (async () => {\n try {\n // Execute job steps using SandboxRunner\n // IMPORTANT: Steps MUST run sequentially because:\n // - Step outputs are inputs for next steps\n // - Steps may have side effects that depend on order\n // - Workflow semantics require sequential execution\n let wasCancelled = false;\n for (const step of job.steps) {\n if (step.status === 'success') {\n continue; // Skip already completed steps\n }\n\n // --- Build ExpressionContext from fresh run state ---\n const freshRun = await engine.getRun(run.id);\n\n if (freshRun?.status === 'cancelled') {\n jobLogger.info('[worker] Run cancelled — stopping step execution', {\n runId: run.id,\n jobId: job.id,\n });\n wasCancelled = true;\n break;\n }\n\n const exprCtx: ExpressionContext = {\n env: freshRun?.env ?? {},\n trigger: freshRun?.trigger ?? { type: 'manual' },\n inputs: freshRun?.inputs ?? {},\n steps: {},\n };\n\n // Collect outputs from all completed steps (across all jobs).\n // Failed approval steps also expose their outputs so the following gate\n // can read `outputs.action === 'reject'` and route correctly.\n if (freshRun) {\n for (const j of freshRun.jobs) {\n for (const s of j.steps) {\n if (s.status === 'success' && s.spec.id) {\n exprCtx.steps[s.spec.id] = {\n outputs: (s.outputs ?? {}) as Record<string, unknown>,\n };\n } else if (\n s.status === 'failed' &&\n s.spec.uses === 'builtin:approval' &&\n s.spec.id &&\n s.outputs\n ) {\n // Rejected approval — gate needs to see action/comment to route\n exprCtx.steps[s.spec.id] = {\n outputs: s.outputs as Record<string, unknown>,\n };\n }\n }\n }\n }\n\n // --- Evaluate spec.if (skip step if condition is false) ---\n if (step.spec.if) {\n const condition = step.spec.if;\n // Strip ${{ }} wrapper if present\n const rawExpr = condition.trim().replace(/^\\$\\{\\{\\s*/, '').replace(/\\s*\\}\\}$/, '');\n const shouldRun = evaluateExpression(rawExpr, exprCtx);\n if (!shouldRun) {\n jobLogger.info('[step] Skipped: condition evaluated to false', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n stepIndex: step.index,\n condition: rawExpr,\n evaluatedContext: {\n inputs: exprCtx.inputs,\n steps: exprCtx.steps,\n env: exprCtx.env,\n },\n });\n await engine.markStepCompleted(run.id, job.id, step.id, { skipped: true });\n continue;\n }\n }\n\n // Debug: dump expression context (available to all ${{ }} expressions in this step)\n if (debugMode) {\n jobLogger.info('[debug] Expression context for step', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepUses: step.spec.uses,\n exprCtx: {\n inputs: exprCtx.inputs,\n steps: exprCtx.steps,\n env: exprCtx.env,\n },\n });\n }\n\n // --- Interpolate spec.with (data flow between steps) ---\n // For builtin:shell steps: apply shell-safe command building so that user-supplied\n // values (e.g. issue titles containing backticks or $()) are injected as env vars\n // (_WF_* prefix) rather than substituted directly into the script string.\n // Shell expansion of ${VAR} does NOT re-evaluate backticks or $() in the value.\n let interpolatedWith = step.spec.with\n ? interpolateObject(step.spec.with as Record<string, unknown>, exprCtx)\n : undefined;\n if (step.spec.uses === 'builtin:shell' && typeof step.spec.with?.['command'] === 'string') {\n const rawCommand = step.spec.with['command'] as string;\n const { command: safeCommand, shellEnvVars } = buildShellSafeCommand(rawCommand, exprCtx);\n interpolatedWith = {\n ...(interpolatedWith ?? {}),\n command: safeCommand,\n env: {\n ...Object.fromEntries(\n Object.entries((interpolatedWith?.['env'] as Record<string, unknown> | undefined) ?? {})\n .map(([k, v]) => [k, coerceToString(v)])\n ),\n ...shellEnvVars,\n },\n };\n }\n\n // --- Interpolate spec.env and forward to shell handler ---\n // step.spec.env values may contain ${{ }} expressions. Interpolate them\n // and pass as with.env so builtin:shell merges them into process.env.\n // coerceToString ensures object/array inputs become valid JSON strings\n // rather than \"[object Object]\" when assigned to env vars.\n const interpolatedEnvRaw = step.spec.env\n ? interpolateObject(step.spec.env as Record<string, unknown>, exprCtx)\n : undefined;\n const interpolatedEnv: Record<string, string> | undefined = interpolatedEnvRaw\n ? Object.fromEntries(\n Object.entries(interpolatedEnvRaw).map(([k, v]) => [k, coerceToString(v)])\n )\n : undefined;\n\n // Debug: show raw spec.with vs resolved interpolatedWith\n if (debugMode && step.spec.with) {\n jobLogger.info('[debug] Step input interpolation', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n rawWith: step.spec.with,\n resolvedWith: interpolatedWith,\n });\n }\n\n const stepExecutionId = `wf-${run.id}-${job.id}-${step.id}-${Date.now()}`;\n const stepLogger = jobLogger.child({\n operation: 'workflow.step',\n stepId: step.id,\n stepName: step.name,\n stepIndex: step.index,\n attempt: job.attempt ?? 1,\n executionId: stepExecutionId,\n spanId: stepExecutionId,\n invocationId: stepExecutionId,\n });\n\n // Persist resolved inputs into step.resolvedInputs — a separate field that\n // does NOT mutate spec.with. This preserves the original ${{ }} templates so\n // gate restartFrom cycles can re-interpolate the step correctly on each pass.\n if (interpolatedWith) {\n const stateStore = engine.getStateStore();\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.resolvedInputs = interpolatedWith;\n });\n }\n\n stepLogger.info('Executing step', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n uses: step.spec.uses,\n // Log resolved inputs so failures are debuggable without a debug flag.\n // Sensitive values (tokens, secrets) will appear here — acceptable for\n // server-side structured logs; do not surface in public UI.\n inputs: interpolatedWith,\n });\n\n // --- Handle builtin:approval ---\n if (step.spec.uses === 'builtin:approval') {\n if (step.status === 'failed') {\n // Already rejected (daemon restarted after resolution) — let gate route.\n stepLogger.info('Approval already rejected — skipping to gate', { runId: run.id, stepId: step.id });\n continue;\n }\n if (step.status !== 'waiting_approval') {\n await engine.markStepWaitingApproval(run.id, job.id, step.id);\n }\n const approvalResult = await waitForApproval(\n engine, run.id, job.id, step, interpolatedWith as Record<string, unknown> | undefined,\n () => stopRequested, stepLogger,\n );\n if (approvalResult === 'interrupted') { return; }\n continue; // Outputs already set by resolveApproval\n }\n\n // --- Handle builtin:gate ---\n if (step.spec.uses === 'builtin:gate') {\n const gateInput = (interpolatedWith ?? {}) as unknown as GateInput;\n // Iteration counter lives in step.metadata so it survives restarts without\n // polluting run.metadata. Runs started before this change lose their counter\n // (reset to 0) — extra iterations are safer than silent skips.\n const currentIteration = (step.metadata?.['iterations'] as number) ?? 0;\n\n // Valid restart targets: steps within this job (same-job restart)\n // OR another job by name (cross-job restart — e.g. quality gate\n // routing back to `agent-execute`). Passing them lets the gate fail\n // honestly on a target that matches neither, instead of silently\n // completing (false green).\n const sameJobStepIds = job.steps.flatMap((s) =>\n [s.id, s.spec.id].filter((v): v is string => typeof v === 'string'),\n );\n const jobNames = (freshRun?.jobs ?? run.jobs).map((j) => j.jobName);\n const validRestartTargets = [...sameJobStepIds, ...jobNames];\n\n const decision = new GateHandler().handle(gateInput, exprCtx, currentIteration, validRestartTargets);\n stepLogger.info('[gate] Evaluating gate decision', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n expression: gateInput.decision,\n action: decision.action,\n iteration: currentIteration,\n });\n\n if (decision.action === 'continue') {\n await engine.markStepCompleted(run.id, job.id, step.id, decision.outputs);\n continue;\n }\n if (decision.action === 'fail') {\n stepLogger.error('[gate] Gate condition failed, aborting job', decision.error, {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n });\n await engine.markStepFailed(run.id, job.id, step.id, decision.error, decision.outputs);\n throw decision.error;\n }\n if (decision.action === 'skip') {\n await applyGateSkip(engine, run, job, step, decision, stepLogger);\n return;\n }\n // restart\n await applyGateRestart(engine, run, job, step, decision, stepLogger);\n return;\n }\n\n // --- Regular step execution ---\n // Mark step as started (sets startedAt timestamp)\n const stepStartTime = Date.now();\n await engine.markStepStarted(run.id, job.id, step.id);\n\n // Build spec with interpolated `with`, `run`, and `summary`.\n // Normalize `run: cmd` → `uses: builtin:shell, with: { command: cmd }`\n // Interpolate the run string so ${{ inputs.* }}, ${{ steps.* }} etc. are resolved.\n // StepSpec (post-zod-transform) may omit `run` after normalization, so work\n // with the StepSpecRaw shape here before re-casting to StepSpec for execution.\n // Note: run: blocks are normalized to uses: builtin:shell by the Zod schema transform\n // at parse time. Shell-safe command building for builtin:shell is applied above\n // via buildShellSafeCommand when computing interpolatedWith.\n let baseSpec: StepSpecRaw = step.spec as StepSpecRaw;\n if (baseSpec.run && !baseSpec.uses) {\n // Legacy path: step.spec was not normalized (should not happen after schema v2+)\n const { run: rawRun, with: existingWith, ...rest } = baseSpec;\n const { command, shellEnvVars } =\n typeof rawRun === 'string'\n ? buildShellSafeCommand(rawRun, exprCtx)\n : { command: rawRun, shellEnvVars: {} };\n baseSpec = {\n ...rest,\n uses: 'builtin:shell',\n with: { ...existingWith, command, env: { ...(existingWith?.['env'] as Record<string, string> | undefined ?? {}), ...shellEnvVars } },\n };\n }\n // Interpolate the summary field so ${{ inputs.* }} resolves in step descriptions shown in Studio.\n if (typeof baseSpec.summary === 'string') {\n baseSpec.summary = interpolateString(baseSpec.summary, exprCtx);\n }\n // Merge interpolated env into with.env for builtin:shell (ShellInput.env).\n const specWithEnv = interpolatedEnv\n ? { ...baseSpec, with: { ...(baseSpec.with ?? {}), env: { ...(baseSpec.with?.['env'] as Record<string, string> | undefined ?? {}), ...interpolatedEnv } } }\n : baseSpec;\n const interpolatedSpec = interpolatedWith\n ? {\n ...specWithEnv,\n with: {\n ...(specWithEnv.with ?? {}),\n ...interpolatedWith,\n // spec.env (interpolatedEnv) must survive the spread of interpolatedWith.env\n ...(interpolatedEnv\n ? { env: { ...(interpolatedWith['env'] as Record<string, string> | undefined ?? {}), ...interpolatedEnv } }\n : {}),\n },\n }\n : specWithEnv;\n\n // Delegate execution to the execution plane.\n // The platform handles provisioning (workspace, environment, cleanup) transparently.\n const result = await runner.execute({\n spec: interpolatedSpec as StepSpec,\n context: {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n attempt: 1,\n env: {\n // KB_PLATFORM_ROOT: where platform code (dist/, node_modules) lives.\n // Shell steps can use this to reference platform commands when the\n // worktree doesn't have compiled dist/ directories.\n KB_PLATFORM_ROOT: workspaceRoot,\n // KB_WORKSPACE_ROOT: the worktree (or project dir when no worktree is used).\n // Scripts cd into this path before invoking agents or running git commands.\n KB_WORKSPACE_ROOT: runWorkspace,\n ...(freshRun?.env || {}),\n },\n // Secrets resolution not yet implemented: run.secrets contains names only.\n // When a platform secrets store is available, resolve names → values here.\n secrets: ((): Record<string, string> => {\n const names = freshRun?.secrets ?? []\n if (names.length > 0) {\n stepLogger.warn('Step declares secrets but secret resolution is not implemented', { secrets: names })\n }\n return {}\n })(),\n logger: {\n debug: (message: string, meta?: Record<string, unknown>) => stepLogger.debug(message, meta),\n info: (message: string, meta?: Record<string, unknown>) => stepLogger.info(message, meta),\n warn: (message: string, meta?: Record<string, unknown>) => stepLogger.warn(message, meta),\n error: (message: string, meta?: Record<string, unknown>) => stepLogger.error(message, undefined, meta),\n },\n trace: {\n traceId: run.id,\n spanId: stepExecutionId,\n parentSpanId: job.id,\n },\n // stepLogger as loggerOverride: ctx.logger.* in the plugin will use stepLogger\n // as its base, writing to SQLite with runId/jobId/stepId context.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n loggerOverride: stepLogger,\n // ui/shell log entries: persist to SQLite with workflow context + publish for SSE.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n onLog: (entry) => {\n stepLogger.info(entry.message, {\n stream: entry.stream,\n lineNo: entry.lineNo,\n logSource: entry.stream === 'stderr' ? 'stderr' : 'stdout',\n });\n void engine.publishLog(run.id, job.id, step.id, entry, step.name);\n },\n // ctx.logger.* entries: stepLogger base already wrote to SQLite. Only publish for SSE.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n onLoggerLog: (entry) => {\n void engine.publishLog(run.id, job.id, step.id, entry, step.name);\n },\n },\n // Scripts (.kb/workflows/scripts/*.sh) live in the project root, not the worktree.\n // Use workspaceRoot as cwd so relative paths like `bash .kb/workflows/scripts/...`\n // resolve correctly. Scripts that need to operate inside the worktree cd into\n // KB_WORKSPACE_ROOT themselves (agent scripts, git operations).\n workspace: workspaceRoot,\n target,\n });\n\n if (result.status === 'failed') {\n const stepDurationMs = Date.now() - stepStartTime;\n const error = new Error(result.error?.message ?? 'Step execution failed');\n\n // Mark step as failed (sets finishedAt timestamp + error)\n await engine.markStepFailed(run.id, job.id, step.id, error);\n\n stepLogger.error('Step failed', error, {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n uses: step.spec.uses,\n durationMs: stepDurationMs,\n resolvedInputs: interpolatedWith,\n errorCode: result.error?.code,\n });\n\n if (step.continueOnError) {\n stepLogger.warn('[step] continueOnError=true — continuing despite failure', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n continue;\n }\n throw error;\n }\n\n const stepOutputs = result.status === 'success' ? result.outputs : undefined;\n\n // Mark step as completed (sets finishedAt timestamp + outputs)\n await engine.markStepCompleted(run.id, job.id, step.id, stepOutputs);\n\n stepLogger.info('Step completed', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n\n // Debug: show what outputs are now available to downstream steps\n if (debugMode && stepOutputs) {\n stepLogger.info('[debug] Step outputs', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n outputs: stepOutputs,\n });\n }\n }\n \n\n // Mark job terminal state: interrupted if run was cancelled, completed otherwise.\n if (wasCancelled) {\n await engine.markJobInterrupted(run.id, job.id);\n jobLogger.info('Job interrupted due to run cancellation', {\n runId: run.id,\n jobId: job.id,\n });\n return;\n }\n\n await engine.markJobCompleted(run.id, job.id);\n\n const jobDuration = Date.now() - jobStartTime;\n jobLogger.info('Job completed successfully', {\n runId: run.id,\n jobId: job.id,\n });\n\n // Track job processing completed\n analytics?.track('workflow.worker.job.completed', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n durationMs: jobDuration,\n stepCount: job.steps.length,\n }).catch(() => {});\n\n // Release workspace on success (cleanup worktree)\n if (provisionedWorkspaceId && wsProvider) {\n try {\n await wsProvider.release(provisionedWorkspaceId);\n jobLogger.info('Workspace released', { workspaceId: provisionedWorkspaceId });\n } catch (releaseErr) {\n jobLogger.warn('Workspace release failed', {\n workspaceId: provisionedWorkspaceId,\n error: releaseErr instanceof Error ? releaseErr.message : String(releaseErr),\n });\n }\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const jobDuration = Date.now() - jobStartTime;\n\n await engine.markJobFailed(run.id, job.id, err);\n\n // Track job processing failed\n analytics?.track('workflow.worker.job.failed', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n errorMessage: err.message,\n durationMs: jobDuration,\n }).catch(() => {});\n\n // Keep workspace on failure for debugging\n if (provisionedWorkspaceId) {\n jobLogger.warn('Workspace kept for debugging', {\n workspaceId: provisionedWorkspaceId,\n path: runWorkspace,\n });\n }\n } finally {\n // Remove from tracking\n runningJobs.delete(jobKey);\n claimedJobs.delete(jobKey);\n }\n })();\n\n // Track running job\n runningJobs.set(jobKey, jobPromise);\n\n // Wait for completion\n await jobPromise;\n\n return true;\n }\n\n /**\n * Worker loop - continuously processes jobs from the queue.\n */\n async function workerLoop(): Promise<void> {\n // IMPORTANT: This is a polling loop, must run sequentially\n\n while (isRunning && !stopRequested) {\n try {\n const processed = await processJob();\n\n if (!processed) {\n // No job available, wait before polling again\n await sleep(1000);\n }\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'workflow',\n event: 'workflow.worker.loop',\n level: 'error',\n reasonCode: 'worker_loop_error',\n message: 'Worker loop error',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'workflow',\n evidence: {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n },\n });\n await sleep(5000); // Wait longer on error\n }\n }\n\n\n logger.info('Worker loop stopped');\n }\n\n return {\n async start() {\n if (isRunning) {\n logger.warn('Worker already running');\n return;\n }\n\n logger.info('Starting workflow worker', { concurrency });\n isRunning = true;\n stopRequested = false;\n\n // Track worker start\n analytics?.track('workflow.worker.started', {\n concurrency,\n }).catch(() => {});\n\n // Start multiple worker loops for concurrency\n const promises: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n promises.push(workerLoop());\n }\n\n await Promise.all(promises);\n },\n\n async stop() {\n if (!isRunning) {\n return;\n }\n\n logger.info('Stopping workflow worker', {\n runningJobsCount: runningJobs.size,\n });\n\n // Signal stop\n stopRequested = true;\n isRunning = false;\n\n // Wait for in-flight jobs to complete (graceful shutdown)\n if (runningJobs.size > 0) {\n logger.info('Waiting for in-flight jobs to complete', {\n count: runningJobs.size,\n });\n\n const shutdownTimeoutMs = parseInt(\n process.env.WORKFLOW_SHUTDOWN_TIMEOUT_MS || '120000',\n 10\n );\n\n try {\n // Wait for all running jobs with timeout\n await Promise.race([\n Promise.all(Array.from(runningJobs.values())),\n sleep(shutdownTimeoutMs),\n ]);\n\n if (runningJobs.size > 0) {\n logger.warn('Shutdown timeout reached, marking jobs as interrupted', {\n count: runningJobs.size,\n });\n\n // Mark unfinished jobs as interrupted (parallel for speed)\n await Promise.all(\n Array.from(runningJobs.keys()).map(async (jobKey) => {\n const [runId, jobId] = jobKey.split(':');\n if (runId && jobId) {\n await engine.markJobInterrupted(runId, jobId);\n }\n })\n );\n } else {\n logger.info('All in-flight jobs completed gracefully');\n }\n } catch (error) {\n logger.error('Error during graceful shutdown', error instanceof Error ? error : undefined, {\n runningJobsCount: runningJobs.size,\n });\n }\n }\n\n logger.info('Workflow worker stopped');\n\n // Track worker stop\n analytics?.track('workflow.worker.stopped', {\n gracefulShutdown: runningJobs.size === 0,\n interruptedJobs: runningJobs.size,\n }).catch(() => {});\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll until an approval step is resolved or a stop signal is received.\n * Returns 'done' when the approval is granted or rejected, 'interrupted' on shutdown.\n */\nasync function waitForApproval(\n engine: WorkflowEngine,\n runId: string,\n jobId: string,\n step: Pick<StepRun, 'id' | 'name'>,\n interpolatedWith: Record<string, unknown> | undefined,\n isStopRequested: () => boolean,\n stepLogger: ILogger,\n): Promise<'done' | 'interrupted'> {\n const approvalTimeoutMs = interpolatedWith?.['timeoutMs'];\n if (!approvalTimeoutMs) {\n stepLogger.warn('[approval] No timeout configured — approval may wait indefinitely', {\n runId,\n jobId,\n stepId: step.id,\n stepName: step.name,\n });\n }\n\n stepLogger.info('[approval] Waiting for approval', {\n runId,\n jobId,\n stepId: step.id,\n stepName: step.name,\n context: interpolatedWith,\n });\n\n const approvalStartMs = Date.now();\n let pollCount = 0;\n\n while (!isStopRequested()) {\n await sleep(2000);\n pollCount++;\n const currentRun = await engine.getRun(runId);\n\n // If the run is cancelled, treat it as an interruption — do NOT proceed as\n // if the approval was granted. A cancelled run must never bypass human gates.\n if (currentRun?.status === 'cancelled') {\n stepLogger.info('[approval] Run cancelled — treating as interrupted, NOT approved', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n return 'interrupted';\n }\n\n const currentJob = currentRun?.jobs.find(j => j.id === jobId);\n const currentStep = currentJob?.steps.find(s => s.id === step.id);\n\n if (!currentStep || currentStep.status === 'success') {\n stepLogger.info('[approval] Approval granted', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n break;\n }\n\n if (currentStep.status === 'failed') {\n // Approval was rejected — break so the following builtin:gate step can route.\n stepLogger.info('[approval] Approval rejected', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n break;\n }\n\n if (pollCount % 10 === 0) {\n stepLogger.info('[approval] Still waiting for approval', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n pollCount,\n });\n }\n }\n\n if (isStopRequested()) {\n stepLogger.info('Approval wait interrupted by shutdown', { stepId: step.id });\n return 'interrupted';\n }\n return 'done';\n}\n\ntype GateRestartDecision = Extract<GateDecision, { action: 'restart' }>;\ntype GateSkipDecision = Extract<GateDecision, { action: 'skip' }>;\n\n/**\n * Apply gate skip: mark the gate and all intermediate steps as skipped, then re-enqueue the job.\n * The job loop will resume from skipTo because all preceding steps are already 'success'.\n * Called when GateHandler returns action='skip'.\n */\nasync function applyGateSkip(\n engine: WorkflowEngine,\n run: WorkflowRun,\n job: JobRun,\n step: Pick<StepRun, 'id' | 'name'>,\n decision: GateSkipDecision,\n stepLogger: ILogger,\n): Promise<void> {\n const { skipTo, outputs } = decision;\n\n stepLogger.info('[gate] Gate triggered skip-forward', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n skipTo,\n });\n\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n\n // Mark the gate step itself as completed\n await engine.markStepCompleted(run.id, job.id, step.id, outputs);\n\n // Mark all steps between gate and skipTo target as skipped\n let pastGate = false;\n for (const s of job.steps) {\n if (s.id === step.id) {\n pastGate = true;\n continue; // gate is already marked completed above\n }\n if (!pastGate) {continue;}\n if (s.spec.id === skipTo || s.id === skipTo) {break;} // stop at target (inclusive — don't skip it)\n await stateStore.updateStep(run.id, job.id, s.id, (draft) => {\n draft.status = 'success';\n draft.outputs = { skipped: true };\n draft.startedAt = new Date().toISOString();\n draft.finishedAt = new Date().toISOString();\n });\n }\n\n // Re-enqueue so the job loop restarts from a fresh snapshot and sees updated statuses\n const freshRun = await engine.getRun(run.id);\n const freshJob = freshRun?.jobs.find((j) => j.id === job.id);\n if (freshJob) {\n await scheduler.enqueueJob(run.id, freshJob, freshJob.priority ?? 'normal');\n }\n\n stepLogger.info('[gate] Skip applied — re-enqueued job at skipTo target', {\n runId: run.id,\n skipTo,\n });\n}\n\n/**\n * Apply gate restart: persist iteration counter to step.metadata, reset steps to queued, re-enqueue job.\n * Called when GateHandler returns action='restart'.\n */\nasync function applyGateRestart(\n engine: WorkflowEngine,\n run: WorkflowRun,\n job: JobRun,\n step: Pick<StepRun, 'id' | 'name'>,\n decision: GateRestartDecision,\n stepLogger: ILogger,\n): Promise<void> {\n const { restartFrom, context, outputs, nextIteration } = decision;\n\n // Collect steps that will be reset for logging\n const stepsToReset: string[] = [];\n for (const s of job.steps) {\n if (s.spec.id === restartFrom || s.id === restartFrom) {\n stepsToReset.push(s.name ?? s.id);\n } else if (stepsToReset.length > 0) {\n stepsToReset.push(s.name ?? s.id);\n }\n }\n\n stepLogger.warn('[gate] Gate triggered restart', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n restartFrom,\n iteration: nextIteration,\n stepsToReset,\n });\n\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n\n // Persist iteration counter on the gate step. The step reset below clears\n // status/timing/outputs but NOT metadata, so the counter survives.\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.metadata = { ...(draft.metadata ?? {}), iterations: nextIteration };\n });\n\n // Merge rework feedback into trigger.payload so the restarted job's steps can\n // read it via ${{ trigger.payload.* }} — this survives the reset (whereas\n // steps.*.outputs do not, once the producing steps are reset to queued).\n if (context) {\n await engine.updateRun(run.id, (draft) => {\n const payload = (draft.trigger.payload ?? {}) as Record<string, unknown>;\n Object.assign(payload, context);\n draft.trigger.payload = payload;\n return draft;\n });\n }\n\n // Is restartFrom a step in THIS job (same-job) or another job by name (cross-job)?\n const sameJobTarget = job.steps.some((s) => s.spec.id === restartFrom || s.id === restartFrom);\n\n if (!sameJobTarget) {\n // ── Cross-job restart (e.g. quality gate → agent-execute) ────────────────\n // Reset the target job and every job transitively downstream of it\n // (including this gate's own job), then re-enqueue the target. When it\n // completes, the engine releases its blocked dependents in DAG order:\n // agent re-runs (with feedback) → quality re-runs → gate re-evaluates.\n const fresh = (await engine.getRun(run.id)) ?? run;\n const resetNames = new Set<string>([restartFrom]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const j of fresh.jobs) {\n if (resetNames.has(j.jobName)) {\n continue;\n }\n if ((j.needs ?? []).some((n) => resetNames.has(n))) {\n resetNames.add(j.jobName);\n changed = true;\n }\n }\n }\n\n for (const rj of fresh.jobs) {\n if (!resetNames.has(rj.jobName)) {\n continue;\n }\n // A reset job re-blocks only on needs that are themselves being reset;\n // dependencies outside the reset set already completed and stay satisfied.\n const pending = (rj.needs ?? []).filter((n) => resetNames.has(n));\n for (const s of rj.steps) {\n await stateStore.updateStep(run.id, rj.id, s.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.error = undefined;\n draft.outputs = undefined;\n });\n }\n await stateStore.updateJob(run.id, rj.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.pendingDependencies = [...pending];\n draft.blocked = pending.length > 0;\n });\n }\n\n const refreshed = await engine.getRun(run.id);\n const targetJob = refreshed?.jobs.find((j) => j.jobName === restartFrom);\n if (targetJob && !targetJob.blocked) {\n await scheduler.enqueueJob(run.id, targetJob, targetJob.priority ?? 'normal');\n }\n stepLogger.warn('[gate] Cross-job restart re-enqueued target', {\n runId: run.id,\n restartFrom,\n iteration: nextIteration,\n resetJobs: [...resetNames],\n });\n return;\n }\n\n // ── Same-job restart ───────────────────────────────────────────────────────\n await engine.markStepCompleted(run.id, job.id, step.id, outputs);\n\n let foundTarget = false;\n for (const s of job.steps) {\n if (s.spec.id === restartFrom || s.id === restartFrom) {\n foundTarget = true;\n }\n if (foundTarget) {\n await stateStore.updateStep(run.id, job.id, s.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.error = undefined;\n draft.outputs = undefined;\n });\n }\n }\n\n await stateStore.updateJob(run.id, job.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n });\n\n const updatedRun = await engine.getRun(run.id);\n const updatedJob = updatedRun?.jobs.find((j) => j.id === job.id);\n if (updatedJob) {\n await scheduler.enqueueJob(run.id, updatedJob, updatedJob.priority ?? 'normal');\n stepLogger.info('[gate] Job re-enqueued for restart', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n iteration: nextIteration,\n restartFrom,\n });\n }\n}\n\nfunction inferWorkspaceProvisionReasonCode(message: string) {\n return /ETIMEDOUT|timeout/iu.test(message)\n ? 'workspace_provision_timeout'\n : 'workspace_provision_failed';\n}\n","/**\n * @module @kb-labs/workflow-daemon/job-broker\n * JobBroker implementation - facade for background job operations\n * Specification: kb-labs-mind/docs/adr/0034-job-broker-cron-scheduler.md\n */\n\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { WorkflowRun, WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { ILogger, LogLevel } from '@kb-labs/core-platform';\nimport type { PlatformContainer } from '@kb-labs/core-runtime';\n\nexport interface SubmitJobRequest {\n handler: string;\n input?: Record<string, unknown>;\n priority?: 'low' | 'normal' | 'high';\n metadata?: Record<string, unknown>;\n}\n\n/**\n * JobBroker - Facade for workflow engine operations.\n * Converts job requests to WorkflowSpec and delegates to WorkflowEngine.\n */\nexport class JobBroker {\n constructor(\n private readonly engine: WorkflowEngine,\n private readonly logger: ILogger,\n private readonly platform: PlatformContainer,\n ) {}\n\n /**\n * Submit a background job for execution.\n * Creates a WorkflowSpec with a single job and submits to WorkflowEngine.\n */\n async submit(request: SubmitJobRequest): Promise<WorkflowRun> {\n this.logger.info('Submitting background job', {\n handler: request.handler,\n priority: request.priority ?? 'normal',\n });\n\n // Convert to WorkflowSpec\n // Handler can be in format:\n // - \"command:name\" for CLI commands (e.g., \"command:mind:rag-index\")\n // - \"plugin:id/handler\" for workflow handlers\n // - \"builtin:shell\" for shell execution\n // If no prefix, assume it's a CLI command for backward compatibility\n const uses = request.handler.includes(':')\n ? request.handler\n : `command:${request.handler}`;\n\n const spec: WorkflowSpec = {\n name: `job-${request.handler}`,\n version: '1.0.0',\n on: { manual: true },\n jobs: {\n main: {\n runsOn: 'local',\n steps: [\n {\n id: 'execute',\n name: 'Execute handler',\n uses,\n with: request.input ?? {},\n },\n ],\n },\n },\n };\n\n const run = await this.engine.runFromInline(spec, {\n trigger: { type: 'manual' as const },\n env: {},\n metadata: request.metadata,\n });\n\n this.logger.info('Background job submitted', {\n runId: run.id,\n handler: request.handler,\n status: run.status,\n });\n\n return run;\n }\n\n /**\n * Get job status by run ID.\n */\n async getStatus(runId: string): Promise<WorkflowRun | null> {\n return this.engine.getRun(runId);\n }\n\n /**\n * Cancel a running job.\n */\n async cancel(runId: string): Promise<void> {\n await this.engine.cancelRun(runId);\n this.logger.info('Job cancelled', { runId });\n }\n\n /**\n * Query logs for a specific run, with optional step-level filtering.\n * Used by GET /api/v1/runs/:runId/logs?stepId=...\n */\n async getRunLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n return this._queryLogs(runId, options);\n }\n\n /**\n * Get job logs by run ID.\n * Returns execution logs with optional filtering by level and pagination.\n * Uses platform.logs service to query logs by runId metadata.\n */\n async getJobLogs(\n runId: string,\n options?: { limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n return this._queryLogs(runId, options);\n }\n\n /**\n * Internal: query + filter logs for a given run (optionally narrow to one step).\n */\n private async _queryLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n const run = await this.engine.getRun(runId);\n\n if (!run) {\n return [];\n }\n\n // Build stepId → stepName lookup from the run snapshot for human-readable log lines\n const stepNameMap = new Map<string, string>();\n for (const job of run.jobs ?? []) {\n for (const step of job.steps ?? []) {\n if (step.id && step.name) {\n stepNameMap.set(step.id, step.name);\n }\n }\n }\n\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n // Calculate time window of the run\n const startTime = run.startedAt\n ? new Date(run.startedAt).getTime()\n : Date.now() - 3_600_000; // 1-hour fallback\n const endTime = run.finishedAt ? new Date(run.finishedAt).getTime() : Date.now();\n\n // Query a wide batch from the log store.\n // Guard against the log backend being unavailable (e.g. no logRingBuffer or\n // logPersistence adapter configured) — HybridLogReader.query() throws\n // \"No log storage backend available\" in that case. Return empty array so the\n // endpoint responds with 200+[] instead of 500.\n let queryResult: { logs?: unknown[] } = { logs: [] };\n try {\n queryResult = await this.platform.logs.query(\n {\n from: startTime,\n to: endTime,\n level: options?.level && options.level !== 'all' ? options.level as LogLevel : undefined,\n },\n {\n limit: 2000,\n offset: 0,\n },\n );\n } catch {\n this.logger.warn('Log backend unavailable — returning empty log list for run', { runId });\n }\n\n type LogEntry = {\n timestamp: number;\n level: string;\n message: string;\n fields: Record<string, unknown>;\n };\n\n // Filter by runId, then optionally by stepId.\n // queryResult.logs may be null/undefined when the log adapter returns an\n // empty result set (e.g. noop adapter in worker-pool mode) — guard with ??.\n const filtered = ((queryResult.logs ?? []) as LogEntry[]).filter((log) => {\n // Guard against malformed entries with missing fields object.\n if (!log.fields) {return false;}\n if (log.fields['runId'] !== runId) {\n return false;\n }\n if (options?.stepId && log.fields['stepId'] !== options.stepId) {\n return false;\n }\n return true;\n });\n\n // Sort chronologically (oldest first — natural reading order)\n filtered.sort((a, b) => a.timestamp - b.timestamp);\n\n // Paginate\n const page = filtered.slice(offset, offset + limit);\n\n return page.map((log) => {\n const stepId = log.fields['stepId'] as string | undefined;\n return {\n timestamp: new Date(log.timestamp).toISOString(),\n level: log.level,\n message: log.message,\n stepId,\n stepName: stepId ? stepNameMap.get(stepId) : undefined,\n stream: log.fields['logSource'] as string | undefined,\n context: log.fields,\n };\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/cron-scheduler\n * CronScheduler - manages periodic job execution using node-cron\n */\n\nimport * as cron from 'node-cron';\nimport { CronExpressionParser } from 'cron-parser';\nimport type { ILogger, IAnalytics } from '@kb-labs/core-platform';\nimport type { JobBroker } from './job-broker.js';\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type {\n RegisteredCronJob,\n PluginCronJob,\n UserCronJob,\n WorkflowSpec,\n} from '@kb-labs/workflow-contracts';\n\nexport interface CronSchedulerOptions {\n jobBroker: JobBroker;\n workflowEngine: WorkflowEngine;\n logger: ILogger;\n timezone?: string;\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics;\n}\n\n/**\n * CronScheduler manages periodic job execution.\n *\n * Features:\n * - Registers cron jobs from plugin manifests and user YAML files\n * - Uses node-cron for scheduling\n * - Submits jobs via JobBroker\n * - Graceful shutdown (stops all scheduled tasks)\n */\nexport class CronScheduler {\n private readonly jobBroker: JobBroker;\n private readonly workflowEngine: WorkflowEngine;\n private readonly logger: ILogger;\n private readonly defaultTimezone: string;\n private readonly analytics?: import('@kb-labs/core-platform').IAnalytics; // eslint-disable-line @typescript-eslint/consistent-type-imports\n\n private readonly registeredJobs = new Map<string, RegisteredCronJob>();\n private readonly scheduledTasks = new Map<string, cron.ScheduledTask>();\n private isRunning = false;\n\n constructor(options: CronSchedulerOptions) {\n this.jobBroker = options.jobBroker;\n this.workflowEngine = options.workflowEngine;\n this.logger = options.logger;\n this.defaultTimezone = options.timezone ?? 'UTC';\n this.analytics = options.analytics;\n }\n\n /**\n * Register cron job from plugin manifest.\n */\n registerPluginJob(pluginId: string, job: PluginCronJob): void {\n const cronJobId = `plugin:${pluginId}:${job.id}`;\n\n if (this.registeredJobs.has(cronJobId)) {\n this.logger.warn('Cron job already registered, skipping', { cronJobId });\n return;\n }\n\n const registered: RegisteredCronJob = {\n id: cronJobId,\n source: 'plugin',\n schedule: job.schedule,\n timezone: job.timezone ?? this.defaultTimezone,\n priority: job.priority,\n enabled: job.enabled,\n handler: job.handler,\n input: job.input,\n metadata: job.metadata,\n };\n\n this.registeredJobs.set(cronJobId, registered);\n this.logger.debug('Plugin cron job registered', {\n cronJobId,\n schedule: job.schedule,\n handler: job.handler,\n });\n }\n\n /**\n * Register cron job from user YAML file.\n */\n registerUserJob(fileName: string, job: UserCronJob): void {\n const cronJobId = `user:${fileName}`;\n\n if (this.registeredJobs.has(cronJobId)) {\n this.logger.warn('Cron job already registered, skipping', { cronJobId });\n return;\n }\n\n const registered: RegisteredCronJob = {\n id: cronJobId,\n source: 'user',\n schedule: job.schedule,\n timezone: job.timezone ?? this.defaultTimezone,\n priority: job.priority,\n enabled: job.enabled,\n workflowSpec: {\n name: job.name,\n jobs: job.jobs,\n env: job.env,\n },\n metadata: job.metadata,\n };\n\n this.registeredJobs.set(cronJobId, registered);\n this.logger.debug('User cron job registered', {\n cronJobId,\n schedule: job.schedule,\n name: job.name,\n });\n }\n\n /**\n * Start all registered cron jobs.\n * Schedules enabled jobs using node-cron.\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('CronScheduler already running');\n return;\n }\n\n this.logger.info('Starting CronScheduler', {\n totalJobs: this.registeredJobs.size,\n });\n\n for (const [cronJobId, job] of this.registeredJobs) {\n if (!job.enabled) {\n this.logger.debug('Skipping disabled cron job', { cronJobId });\n continue;\n }\n\n // Validate cron expression\n if (!cron.validate(job.schedule)) {\n this.logger.error('Invalid cron expression', undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n continue;\n }\n\n // Schedule task\n const task = cron.schedule(\n job.schedule,\n () => this.executeCronJob(cronJobId, job),\n {\n timezone: job.timezone,\n }\n );\n\n this.scheduledTasks.set(cronJobId, task);\n\n this.logger.info('Cron job scheduled', {\n cronJobId,\n schedule: job.schedule,\n timezone: job.timezone,\n source: job.source,\n });\n }\n\n this.isRunning = true;\n this.logger.info('CronScheduler started', {\n scheduledJobs: this.scheduledTasks.size,\n });\n\n // Track scheduler start\n this.analytics?.track('workflow.cron.scheduler.started', {\n totalJobs: this.registeredJobs.size,\n scheduledJobs: this.scheduledTasks.size,\n }).catch(() => {});\n }\n\n /**\n * Stop all scheduled cron jobs.\n * Called during graceful shutdown.\n */\n async stop(): Promise<void> {\n if (!this.isRunning) {\n return;\n }\n\n this.logger.info('Stopping CronScheduler', {\n scheduledJobs: this.scheduledTasks.size,\n });\n\n for (const [cronJobId, task] of this.scheduledTasks) {\n task.stop();\n this.logger.debug('Cron job stopped', { cronJobId });\n }\n\n const stoppedCount = this.scheduledTasks.size;\n this.scheduledTasks.clear();\n this.isRunning = false;\n\n this.logger.info('CronScheduler stopped');\n\n // Track scheduler stop\n this.analytics?.track('workflow.cron.scheduler.stopped', {\n stoppedJobs: stoppedCount,\n }).catch(() => {});\n }\n\n /**\n * Execute cron job by submitting it to JobBroker.\n */\n private async executeCronJob(\n cronJobId: string,\n job: RegisteredCronJob\n ): Promise<void> {\n const startTime = Date.now();\n this.logger.info('Executing cron job', { cronJobId });\n\n // Track cron job start\n this.analytics?.track('workflow.cron.job.started', {\n cronJobId,\n source: job.source,\n schedule: job.schedule,\n }).catch(() => {});\n\n try {\n if (job.source === 'plugin' && job.handler) {\n // Plugin cron job - submit via JobBroker\n const result = await this.jobBroker.submit({\n handler: job.handler,\n input: job.input,\n priority: job.priority,\n metadata: {\n ...job.metadata,\n cronJobId,\n scheduledBy: 'cron',\n scheduledAt: new Date().toISOString(),\n },\n });\n\n this.logger.info('Cron job submitted', {\n cronJobId,\n runId: result.id,\n });\n } else if (job.source === 'user' && job.workflowSpec) {\n // User cron job - run workflow directly via WorkflowEngine\n // Create complete WorkflowSpec from user job\n const spec: WorkflowSpec = {\n name: job.workflowSpec.name,\n version: '1.0.0',\n on: { manual: true }, // Cron-triggered workflows use manual trigger\n jobs: job.workflowSpec.jobs,\n env: job.workflowSpec.env,\n };\n\n this.logger.debug('Running workflow from cron', {\n cronJobId,\n spec: JSON.stringify(spec, null, 2),\n });\n\n const result = await this.workflowEngine.runFromInline(spec, {\n trigger: {\n type: 'schedule',\n payload: {\n cronJobId,\n scheduledAt: new Date().toISOString(),\n },\n },\n env: job.workflowSpec.env ?? {},\n metadata: {\n ...job.metadata,\n cronJobId,\n scheduledBy: 'cron',\n scheduledAt: new Date().toISOString(),\n },\n });\n\n this.logger.info('Cron workflow submitted', {\n cronJobId,\n runId: result.id,\n workflowName: spec.name,\n });\n } else {\n throw new Error(`Invalid cron job configuration: ${cronJobId}`);\n }\n\n // Track successful cron job completion\n const duration = Date.now() - startTime;\n this.analytics?.track('workflow.cron.job.completed', {\n cronJobId,\n source: job.source,\n durationMs: duration,\n }).catch(() => {});\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error(\n 'Failed to execute cron job',\n error instanceof Error ? error : undefined,\n { cronJobId }\n );\n\n // Track cron job failure\n this.analytics?.track('workflow.cron.job.failed', {\n cronJobId,\n source: job.source,\n errorMessage: error instanceof Error ? error.message : 'Unknown error',\n durationMs: duration,\n }).catch(() => {});\n }\n }\n\n /**\n * Get all registered cron jobs.\n */\n getRegisteredJobs(): RegisteredCronJob[] {\n return Array.from(this.registeredJobs.values());\n }\n\n /**\n * Get cron job by ID.\n */\n getJob(cronJobId: string): RegisteredCronJob | undefined {\n return this.registeredJobs.get(cronJobId);\n }\n\n /**\n * Check if scheduler is running.\n */\n isSchedulerRunning(): boolean {\n return this.isRunning;\n }\n\n /**\n * Register cron job (generic method for API usage).\n * Supports both plugin and API-registered jobs.\n */\n register(job: RegisteredCronJob): void {\n if (this.registeredJobs.has(job.id)) {\n this.logger.warn('Cron job already registered, overwriting', { cronJobId: job.id });\n }\n\n this.registeredJobs.set(job.id, job);\n this.logger.debug('Cron job registered', {\n cronJobId: job.id,\n schedule: job.schedule,\n source: job.source,\n });\n\n // If scheduler is already running, schedule this job immediately\n if (this.isRunning && job.enabled) {\n this.scheduleJob(job.id, job);\n }\n }\n\n /**\n * Unregister cron job by ID.\n * Stops the scheduled task if running.\n */\n unregister(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n this.logger.warn('Cron job not found for unregister', { cronJobId });\n return;\n }\n\n // Stop scheduled task if exists\n const task = this.scheduledTasks.get(cronJobId);\n if (task) {\n task.stop();\n this.scheduledTasks.delete(cronJobId);\n this.logger.debug('Cron task stopped', { cronJobId });\n }\n\n // Remove from registered jobs\n this.registeredJobs.delete(cronJobId);\n this.logger.info('Cron job unregistered', { cronJobId });\n }\n\n /**\n * Pause cron job (stop task but keep registration).\n */\n pause(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n const task = this.scheduledTasks.get(cronJobId);\n if (!task) {\n throw new Error(`Cron task not scheduled: ${cronJobId}`);\n }\n\n task.stop();\n job.enabled = false;\n this.logger.info('Cron job paused', { cronJobId });\n }\n\n /**\n * Resume cron job (restart stopped task).\n */\n resume(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n const task = this.scheduledTasks.get(cronJobId);\n if (!task) {\n // Job exists but not scheduled - schedule it now\n if (this.isRunning) {\n this.scheduleJob(cronJobId, job);\n }\n } else {\n // Task exists but stopped - restart it\n task.start();\n }\n\n job.enabled = true;\n this.logger.info('Cron job resumed', { cronJobId });\n }\n\n /**\n * Trigger cron job immediately (manual execution).\n */\n async triggerNow(cronJobId: string): Promise<void> {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n this.logger.info('Manually triggering cron job', { cronJobId });\n await this.executeCronJob(cronJobId, job);\n }\n\n /**\n * Schedule a single cron job (helper method).\n */\n private scheduleJob(cronJobId: string, job: RegisteredCronJob): void {\n // Validate cron expression\n if (!cron.validate(job.schedule)) {\n this.logger.error('Invalid cron expression', undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n return;\n }\n\n // Schedule task\n const task = cron.schedule(\n job.schedule,\n () => this.executeCronJob(cronJobId, job),\n {\n timezone: job.timezone,\n }\n );\n\n this.scheduledTasks.set(cronJobId, task);\n\n this.logger.info('Cron job scheduled', {\n cronJobId,\n schedule: job.schedule,\n timezone: job.timezone,\n source: job.source,\n });\n }\n\n /**\n * Get next scheduled run time for a cron job.\n * Returns null if job doesn't exist or has invalid cron expression.\n */\n getNextRunTime(cronJobId: string): Date | null {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n return null;\n }\n\n // Return null for empty schedule\n if (!job.schedule || job.schedule.trim() === '') {\n return null;\n }\n\n try {\n // Parse cron expression to get next execution time\n const interval = CronExpressionParser.parse(job.schedule, {\n tz: job.timezone,\n currentDate: new Date(),\n });\n return interval.next().toDate();\n } catch (error) {\n this.logger.error('Failed to parse cron expression', error instanceof Error ? error : undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n return null;\n }\n }\n\n /**\n * Clear all registered cron jobs.\n * IMPORTANT: This does NOT stop scheduled tasks - call stop() first if needed.\n */\n clearAll(): void {\n this.logger.info('Clearing all registered cron jobs', {\n count: this.registeredJobs.size,\n });\n\n this.registeredJobs.clear();\n // Note: scheduledTasks are cleared in stop()\n }\n\n /**\n * Unregister all user-sourced cron jobs (source === 'user'), stopping their\n * scheduled tasks. Safe to call while the scheduler is running — jobs are\n * stopped and removed so they can be re-registered by a fresh discovery pass.\n */\n clearUserJobs(): void {\n const userJobIds = Array.from(this.registeredJobs.keys()).filter((id) => id.startsWith('user:'));\n\n for (const cronJobId of userJobIds) {\n const task = this.scheduledTasks.get(cronJobId);\n if (task) {\n task.stop();\n this.scheduledTasks.delete(cronJobId);\n }\n this.registeredJobs.delete(cronJobId);\n }\n\n this.logger.info('Cleared user cron jobs', { count: userJobIds.length });\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/cron-discovery\n * CronDiscovery - discovers cron jobs from plugin manifests and user YAML files\n *\n * Purpose: scheduling — registers discovered crons into CronScheduler for execution.\n * (ManifestScanner in engine handles listing — populates the REST API catalog; different output, different consumer.)\n */\n\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { join, basename, extname } from 'node:path';\nimport YAML from 'yaml';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { CronScheduler } from './cron-scheduler.js';\nimport {\n PluginCronJobSchema,\n UserCronJobSchema,\n} from '@kb-labs/workflow-contracts';\n\nexport interface CronDiscoveryOptions {\n cliApi: IEntityRegistry;\n scheduler: CronScheduler;\n logger: ILogger;\n workspaceRoot: string;\n}\n\n/**\n * CronDiscovery scans for cron jobs from:\n * 1. Plugin manifests (manifest.cron section)\n * 2. User YAML files (.kb/jobs/*.yml)\n */\nexport class CronDiscovery {\n private readonly cliApi: IEntityRegistry;\n private readonly scheduler: CronScheduler;\n private readonly logger: ILogger;\n private readonly workspaceRoot: string;\n\n constructor(options: CronDiscoveryOptions) {\n this.cliApi = options.cliApi;\n this.scheduler = options.scheduler;\n this.logger = options.logger;\n this.workspaceRoot = options.workspaceRoot;\n }\n\n /**\n * Discover and register all cron jobs.\n * Scans plugin manifests and user YAML files.\n */\n async discoverAll(): Promise<{ plugins: number; users: number }> {\n this.logger.info('Starting cron job discovery');\n\n const pluginJobs = await this.discoverPluginJobs();\n const userJobs = await this.discoverUserJobs();\n\n this.logger.info('Cron job discovery complete', {\n pluginJobs,\n userJobs,\n total: pluginJobs + userJobs,\n });\n\n return { plugins: pluginJobs, users: userJobs };\n }\n\n /**\n * Discover cron jobs from plugin manifests via entity registry.\n * Uses queryEntities({ kind: 'cron' }) — no manual manifest scanning.\n */\n private async discoverPluginJobs(): Promise<number> {\n let count = 0;\n\n try {\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n for (const entity of cronEntities) {\n try {\n const validated = PluginCronJobSchema.parse(entity.declaration);\n this.scheduler.registerPluginJob(entity.ref.pluginId, validated);\n count++;\n } catch (error) {\n this.logger.warn('Invalid plugin cron job definition', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (cronEntities.length > 0) {\n this.logger.debug('Discovered plugin cron jobs via registry', {\n total: cronEntities.length,\n registered: count,\n });\n }\n } catch (error) {\n this.logger.error(\n 'Failed to discover plugin cron jobs',\n error instanceof Error ? error : undefined\n );\n }\n\n return count;\n }\n\n /**\n * Discover cron jobs from user YAML files in .kb/jobs/*.yml\n */\n private async discoverUserJobs(): Promise<number> {\n let count = 0;\n const jobsDir = join(this.workspaceRoot, '.kb', 'jobs');\n\n try {\n // Check if directory exists\n const dirStat = await stat(jobsDir).catch(() => null);\n if (!dirStat?.isDirectory()) {\n this.logger.debug('User jobs directory does not exist', { jobsDir });\n return 0;\n }\n\n // Read all files in directory\n const files = await readdir(jobsDir);\n\n // Filter YAML files\n const yamlFiles = files.filter((file) => {\n const ext = extname(file);\n return ext === '.yml' || ext === '.yaml';\n });\n\n // Process all YAML files in parallel\n const results = await Promise.allSettled(\n yamlFiles.map(async (file) => {\n const filePath = join(jobsDir, file);\n const ext = extname(file);\n\n const content = await readFile(filePath, 'utf-8');\n const parsed = YAML.parse(content);\n\n // Validate against UserCronJobSchema\n const validated = UserCronJobSchema.parse(parsed);\n\n // Only register if autoStart is true\n if (validated.autoStart) {\n const fileName = basename(file, ext);\n this.scheduler.registerUserJob(fileName, validated);\n return 1;\n } else {\n this.logger.debug('Skipping user cron job (autoStart: false)', {\n file,\n });\n return 0;\n }\n })\n );\n\n // Sum up counts from successful results\n for (const result of results) {\n if (result.status === 'fulfilled') {\n count += result.value;\n } else {\n this.logger.warn('Failed to parse user cron job file', {\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n });\n }\n }\n } catch (error) {\n this.logger.warn('Failed to discover user cron jobs', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n return count;\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/file-watcher\n * WorkflowFileWatcher - watches .kb/workflows/ and .kb/jobs/ for YAML changes\n * and triggers manifest cache invalidation + cron re-discovery on each change.\n */\n\nimport { watch } from 'node:fs';\nimport type { FSWatcher } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowService } from '@kb-labs/workflow-engine';\nimport type { CronDiscovery } from './cron-discovery.js';\nimport type { CronScheduler } from './cron-scheduler.js';\n\nexport interface WorkflowFileWatcherOptions {\n /** Absolute paths to watch (e.g. ['.kb/workflows', '.kb/jobs']). */\n watchDirs: string[];\n workflowService: WorkflowService;\n cronDiscovery: CronDiscovery;\n cronScheduler: CronScheduler;\n logger: ILogger;\n /** Debounce delay in ms before reloading after a file change. Default: 300. */\n debounceMs?: number;\n}\n\n/**\n * WorkflowFileWatcher monitors YAML files in the given directories and\n * invalidates the workflow manifest cache + re-discovers cron jobs whenever\n * a .yml / .yaml file is created, modified, or deleted.\n *\n * Debounced 300 ms (configurable) to coalesce rapid save events from editors.\n */\nexport class WorkflowFileWatcher {\n private readonly watchers: FSWatcher[] = [];\n private readonly workflowService: WorkflowService;\n private readonly cronDiscovery: CronDiscovery;\n private readonly cronScheduler: CronScheduler;\n private readonly logger: ILogger;\n private readonly debounceMs: number;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: WorkflowFileWatcherOptions) {\n this.workflowService = options.workflowService;\n this.cronDiscovery = options.cronDiscovery;\n this.cronScheduler = options.cronScheduler;\n this.logger = options.logger;\n this.debounceMs = options.debounceMs ?? 300;\n\n for (const dir of options.watchDirs) {\n this.startWatcher(dir);\n }\n }\n\n private startWatcher(dir: string): void {\n // Check directory existence asynchronously; skip silently if missing.\n access(dir).then(() => {\n try {\n const watcher = watch(dir, { persistent: false }, (eventType, filename) => {\n if (!filename) { return; }\n if (!filename.endsWith('.yml') && !filename.endsWith('.yaml')) { return; }\n this.scheduleReload(dir, filename);\n });\n\n watcher.on('error', (err) => {\n this.logger.warn('WorkflowFileWatcher: watcher error', {\n dir,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n this.watchers.push(watcher);\n this.logger.info('WorkflowFileWatcher: watching directory', { dir });\n } catch (err) {\n this.logger.warn('WorkflowFileWatcher: could not start watcher', {\n dir,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }).catch(() => {\n this.logger.debug('WorkflowFileWatcher: directory does not exist, skipping', { dir });\n });\n }\n\n private scheduleReload(dir: string, filename: string): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.reload(dir, filename).catch((err) => {\n this.logger.error(\n 'WorkflowFileWatcher: reload failed',\n err instanceof Error ? err : undefined,\n { dir, filename },\n );\n });\n }, this.debounceMs);\n }\n\n private async reload(dir: string, filename: string): Promise<void> {\n this.logger.info('WorkflowFileWatcher: YAML change detected, reloading', { dir, filename });\n\n await this.workflowService.refreshManifests();\n\n // Re-discover cron jobs: clear user-sourced jobs first to avoid duplicates.\n this.cronScheduler.clearUserJobs();\n const discovered = await this.cronDiscovery.discoverAll();\n\n this.logger.info('WorkflowFileWatcher: reload complete', {\n filename,\n cronJobs: discovered,\n });\n }\n\n /** Stop all watchers and cancel any pending debounce timer. */\n close(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n for (const watcher of this.watchers) {\n watcher.close();\n }\n\n this.watchers.length = 0;\n this.logger.info('WorkflowFileWatcher: stopped');\n }\n}\n","import type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine, WorkflowService, WorkflowRuntime } from '@kb-labs/workflow-engine';\nimport type {\n CronInfo,\n CronListResponse,\n CronRegistrationRequest,\n JobRun,\n JobCancelResponse,\n JobListFilter,\n JobListResponse,\n JobStatusInfo,\n JobSubmissionRequest,\n JobSubmissionResponse,\n StepRun,\n WorkflowInfo,\n WorkflowListResponse,\n WorkflowRun,\n WorkflowRunHistoryResponse,\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n} from '@kb-labs/workflow-contracts';\nimport type { JobBroker } from '../job-broker.js';\nimport type { CronScheduler } from '../cron-scheduler.js';\n\nconst TENANT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\nconst CRON_SCHEDULER_NOT_AVAILABLE = 'Cron scheduler not available';\n\ntype JobStatus = JobStatusInfo['status'];\n\nexport interface WorkflowHostServiceOptions {\n engine: WorkflowEngine;\n jobBroker: JobBroker;\n logger: ILogger;\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n}\n\nexport type WorkflowEngineMetrics = Awaited<ReturnType<WorkflowEngine['getMetrics']>>;\n\nexport class WorkflowHostService {\n constructor(private readonly options: WorkflowHostServiceOptions) {}\n\n getHealth(): { ok: boolean; service: string } {\n return { ok: true, service: 'workflow-daemon' };\n }\n\n async getMetrics(): Promise<WorkflowEngineMetrics> {\n return this.options.engine.getMetrics();\n }\n\n async submitJob(\n tenantId: string,\n request: JobSubmissionRequest,\n ): Promise<JobSubmissionResponse> {\n this.assertTenantId(tenantId);\n if (!request.type) {\n throw new Error('Missing required field: type');\n }\n if (\n request.priority !== undefined\n && (request.priority < 1 || request.priority > 10)\n ) {\n throw new Error('Priority must be between 1 and 10');\n }\n\n const run = await this.options.jobBroker.submit({\n handler: request.type,\n input: request.payload,\n priority: mapPriority(request.priority ?? 5),\n });\n\n this.options.logger.info('Job submitted', {\n jobId: run.id,\n type: request.type,\n tenantId,\n });\n\n return { jobId: run.id };\n }\n\n async getJob(\n tenantId: string,\n jobId: string,\n ): Promise<JobStatusInfo & { jobs?: Array<Record<string, unknown>> }> {\n this.assertTenantId(tenantId);\n const run = (await this.options.engine.getRun(jobId)) as WorkflowRun | null;\n if (!run) {\n throw new Error('Job not found');\n }\n\n return {\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n tenantId: run.tenantId ?? tenantId,\n createdAt: run.createdAt,\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n result: run.result,\n error: run.result?.error?.message,\n jobs: run.jobs?.map((job: JobRun) => ({\n id: job.id,\n name: job.jobName,\n status: job.status,\n startedAt: job.startedAt,\n finishedAt: job.finishedAt,\n durationMs: job.durationMs,\n error: job.error?.message,\n steps: job.steps?.map((step: StepRun) => ({\n id: step.id,\n name: step.name,\n status: step.status,\n handler: step.spec?.uses,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n durationMs: step.durationMs,\n outputs: step.outputs,\n error: step.error,\n })),\n })),\n };\n }\n\n async getJobSteps(jobId: string): Promise<Array<Record<string, unknown>>> {\n const run = (await this.options.engine.getRun(jobId)) as WorkflowRun | null;\n if (!run) {\n throw new Error('Job not found');\n }\n return (\n run.jobs?.flatMap((job: JobRun) =>\n job.steps?.map((step: StepRun) => ({\n id: step.id,\n name: step.name,\n status: step.status,\n handler: step.spec?.uses,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n durationMs: step.durationMs,\n outputs: step.outputs,\n error: step.error,\n jobId: job.id,\n jobName: job.jobName,\n })) ?? []\n ) ?? []\n );\n }\n\n async getJobLogs(\n jobId: string,\n options?: { limit?: number; offset?: number; level?: string },\n ): Promise<Array<Record<string, unknown>>> {\n const logs = await this.options.jobBroker.getJobLogs(jobId, options);\n return logs as Array<Record<string, unknown>>;\n }\n\n async getRunLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<Record<string, unknown>>> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) { throw new Error('Run not found'); }\n const logs = await this.options.jobBroker.getRunLogs(resolved, options);\n return logs as Array<Record<string, unknown>>;\n }\n\n async cancelJob(tenantId: string, jobId: string): Promise<JobCancelResponse> {\n await this.options.engine.cancelRun(jobId);\n this.options.logger.info('Job cancelled', { jobId, tenantId });\n return { cancelled: true };\n }\n\n async listJobs(\n tenantId: string,\n filter: JobListFilter,\n ): Promise<JobListResponse> {\n this.assertTenantId(tenantId);\n const { type, status, limit, offset } = filter;\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n let jobs: JobStatusInfo[] = allRuns.map((run: WorkflowRun) => ({\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n tenantId: run.tenantId ?? tenantId,\n createdAt: run.createdAt,\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n result: run.result,\n error: run.result?.error?.message,\n }));\n\n if (type) {\n const escaped = type.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`);\n jobs = jobs.filter((job) => regex.test(job.type));\n }\n\n if (status) {\n jobs = jobs.filter((job) => job.status === status);\n }\n\n const start = offset ?? 0;\n const end = limit ? start + limit : jobs.length;\n\n return { jobs: jobs.slice(start, end) };\n }\n\n async listActiveExecutions(): Promise<Array<Record<string, unknown>>> {\n const runs = (await this.options.engine.getActiveExecutions()) as WorkflowRun[];\n return runs.map((run: WorkflowRun) => ({\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n startedAt: run.startedAt,\n createdAt: run.createdAt,\n }));\n }\n\n async listWorkflows(options: {\n source?: 'manifest' | 'standalone';\n status?: 'active' | 'inactive';\n tags?: string;\n }): Promise<WorkflowListResponse> {\n const workflowService = this.requireWorkflowService();\n const workflows = await workflowService.listAll({\n source: options.source,\n status: options.status === 'inactive' ? 'disabled' : options.status,\n tags: options.tags ? options.tags.split(',') : undefined,\n });\n\n const response: WorkflowListResponse = {\n workflows: workflows.map((w: WorkflowRuntime) => this.mapWorkflowInfo(w)),\n };\n return response;\n }\n\n async getWorkflow(id: string): Promise<WorkflowInfo | null> {\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(id);\n if (!workflow) {\n return null;\n }\n return this.mapWorkflowInfo(workflow);\n }\n\n async runWorkflow(\n id: string,\n request: WorkflowRunRequest,\n ): Promise<{ runId: string; status: string }> {\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(id);\n if (!workflow) {\n throw new Error('Workflow not found');\n }\n\n const specInput = workflow.input as Record<string, unknown>;\n const spec = {\n ...specInput,\n ...(request.target ? { target: request.target } : {}),\n ...(request.isolation ? { isolation: request.isolation } : {}),\n } as unknown as import('@kb-labs/workflow-contracts').WorkflowSpec;\n const triggerType =\n request.trigger?.type === 'cron'\n ? 'schedule'\n : request.trigger?.type === 'api'\n ? 'webhook'\n : 'manual';\n\n // Resolve inputs: merge spec defaults with user-supplied values.\n // Accept `inputs` (plural, preferred) or legacy `input` (singular).\n const specInputDefs = (specInput['inputs'] ?? {}) as Record<\n string,\n { default?: unknown; required?: boolean }\n >;\n const userInputs: Record<string, unknown> =\n request.inputs ??\n (request.input && typeof request.input === 'object'\n ? (request.input as Record<string, unknown>)\n : {});\n\n // Validate required inputs BEFORE creating the run, so a missing value is\n // reported up front instead of failing deep inside a job (B-017).\n const missingRequired: string[] = [];\n for (const [key, def] of Object.entries(specInputDefs)) {\n if (def.required && !(key in userInputs) && def.default === undefined) {\n missingRequired.push(key);\n }\n }\n if (missingRequired.length > 0) {\n throw new Error(`Missing required input(s): ${missingRequired.join(', ')}`);\n }\n\n const resolvedInputs: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(specInputDefs)) {\n resolvedInputs[key] = key in userInputs ? userInputs[key] : def.default;\n }\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: triggerType,\n actor: request.trigger?.user,\n payload: userInputs,\n },\n inputs: resolvedInputs,\n });\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest,\n ): Promise<{ runId: string; status: string }> {\n const resolved = await this.resolveRunId(runId);\n const sourceRun = resolved ? (await this.options.engine.getRun(resolved)) as WorkflowRun | null : null;\n if (!sourceRun) {\n throw new Error('Run not found');\n }\n\n if (request.failedOnly) {\n return this.rerunFailedOnly(sourceRun.id, sourceRun);\n }\n\n const workflowId =\n (sourceRun.metadata as Record<string, unknown> | undefined)?.['workflowId'] as string | undefined\n ?? sourceRun.name;\n\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(workflowId);\n if (!workflow) {\n throw new Error('Workflow not found');\n }\n\n const specInput = workflow.input as Record<string, unknown>;\n const spec = {\n ...specInput,\n } as unknown as import('@kb-labs/workflow-contracts').WorkflowSpec;\n\n const resolvedInputs = (sourceRun.inputs ?? {}) as Record<string, unknown>;\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: 'manual',\n actor: 'cli-rerun',\n payload: resolvedInputs,\n },\n inputs: resolvedInputs,\n });\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n /**\n * failedOnly reruns resume from the source run's snapshot instead of\n * starting a brand-new run (via runFromSpec + a job-filtered spec), so\n * completed step outputs from jobs that are not being rerun are carried\n * forward into the interpolation context instead of being discarded\n * (see issue #263: `rerun --failed-only` used to redo the whole run).\n */\n private async rerunFailedOnly(\n resolvedRunId: string,\n sourceRun: WorkflowRun,\n ): Promise<{ runId: string; status: string }> {\n const failedJobNames = new Set(\n (sourceRun.jobs ?? [])\n .filter((job: JobRun) => job.status === 'failed' || job.status === 'interrupted')\n .map((job: JobRun) => job.jobName),\n );\n\n if (failedJobNames.size === 0) {\n throw new Error('No failed jobs to rerun');\n }\n\n // Resume from the earliest unfinished step in a failed/interrupted job,\n // in run order, so that all steps before it (including ones in jobs\n // that are not being rerun) keep their stored outputs. A job can be\n // 'interrupted' (e.g. cancelled mid-run) without any of its steps ever\n // reaching 'failed' — those steps are left 'running'/'queued' — so the\n // resume point is \"first step that didn't succeed\", not \"first failed\n // step\".\n let fromStepId: string | undefined;\n for (const job of sourceRun.jobs ?? []) {\n if (!failedJobNames.has(job.jobName)) {\n continue;\n }\n const unfinishedStep = (job.steps ?? []).find(\n (s: StepRun) => s.status !== 'success' && s.status !== 'skipped',\n );\n if (unfinishedStep) {\n fromStepId = unfinishedStep.id;\n break;\n }\n }\n\n if (!fromStepId) {\n throw new Error(`Cannot determine resume point: no failed step found in run ${sourceRun.id}`);\n }\n\n const run = await this.options.engine.replayRun(resolvedRunId, { fromStepId });\n if (!run) {\n throw new Error(\n `No replay snapshot for run ${resolvedRunId} — cannot rerun failed steps only. `\n + 'Snapshots are created when a run finishes; check the workflow daemon logs for '\n + '\"Failed to create run snapshot\" around that time.',\n );\n }\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest,\n ): Promise<WorkflowRestartResponse> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Guard: restarting an active run would race with the live worker over the\n // same run ID, corrupting step state. Caller must cancel the run first.\n const currentRun = await this.options.engine.getRun(resolved);\n if (!currentRun) {\n throw new Error(`Run not found: ${resolved}`);\n }\n if (currentRun.status === 'running' || currentRun.status === 'queued') {\n throw new Error(\n `Cannot restart an active run (status: ${currentRun.status}); cancel it first`,\n );\n }\n\n const run = await this.options.engine.replayRun(resolved, {\n fromStepId: request.fromStepId,\n env: request.env,\n });\n\n if (!run) {\n // The run exists, but replayRun() came back empty — this means no\n // snapshot was persisted, not that the run itself is missing. Snapshots\n // are only written once a run reaches a terminal state (success/failed)\n // and creation failures are only logged, not surfaced anywhere else —\n // so distinguish this from \"run not found\" to save the operator a trip\n // through the daemon logs.\n throw new Error(\n `No replay snapshot for run ${resolved} (status: ${currentRun.status}, finished: ${currentRun.finishedAt ?? 'n/a'}). `\n + 'Snapshots are created when a run finishes; if this run finished but has no snapshot, '\n + \"check the workflow daemon logs for \\\"Failed to create run snapshot\\\" around that time.\",\n );\n }\n\n return {\n runId: run.id,\n status: run.status,\n fromStepId: request.fromStepId,\n };\n }\n\n registerCron(\n tenantId: string,\n request: CronRegistrationRequest,\n ): { ok: boolean } {\n this.assertTenantId(tenantId);\n const scheduler = this.requireCronScheduler();\n if (!request.id || !request.schedule || !request.jobType) {\n throw new Error('Missing required fields: id, schedule, jobType');\n }\n\n scheduler.register({\n id: request.id,\n source: 'user',\n schedule: request.schedule,\n timezone: request.timezone ?? 'UTC',\n priority: 'normal',\n enabled: request.enabled ?? true,\n handler: request.jobType,\n metadata: {\n tenantId,\n payload: request.payload,\n },\n });\n\n this.options.logger.info('Cron job registered', {\n id: request.id,\n schedule: request.schedule,\n jobType: request.jobType,\n tenantId,\n });\n\n return { ok: true };\n }\n\n unregisterCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.unregister(id);\n this.options.logger.info('Cron job unregistered', { id, tenantId });\n return { ok: true };\n }\n\n triggerCron(tenantId: string, id: string): Promise<{ ok: boolean }> {\n const scheduler = this.requireCronScheduler();\n return scheduler.triggerNow(id).then(() => {\n this.options.logger.info('Cron job triggered manually', { id, tenantId });\n return { ok: true };\n });\n }\n\n pauseCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.pause(id);\n this.options.logger.info('Cron job paused', { id, tenantId });\n return { ok: true };\n }\n\n resumeCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.resume(id);\n this.options.logger.info('Cron job resumed', { id, tenantId });\n return { ok: true };\n }\n\n listCron(): CronListResponse {\n const scheduler = this.requireCronScheduler();\n const crons: CronInfo[] = scheduler.getRegisteredJobs().map((job) => ({\n id: job.id,\n schedule: job.schedule,\n jobType: job.handler ?? 'unknown',\n timezone: job.timezone ?? 'UTC',\n enabled: job.enabled,\n lastRun: undefined,\n nextRun: scheduler.getNextRunTime(job.id) ?? undefined,\n pluginId: job.source === 'plugin' ? job.id.split(':')[1] : undefined,\n }));\n return { crons };\n }\n\n listLegacyCronJobs(): {\n cronJobs: Array<Record<string, unknown>>;\n total: number;\n running: boolean;\n } {\n const scheduler = this.requireCronScheduler();\n const cronJobs = scheduler.getRegisteredJobs();\n return {\n cronJobs: cronJobs.map((job) => ({\n id: job.id,\n source: job.source,\n schedule: job.schedule,\n timezone: job.timezone,\n priority: job.priority,\n enabled: job.enabled,\n handler: job.handler,\n workflowName: job.workflowSpec?.name,\n metadata: job.metadata,\n })),\n total: cronJobs.length,\n running: scheduler.isSchedulerRunning(),\n };\n }\n\n private assertTenantId(tenantId: string): void {\n if (!TENANT_ID_PATTERN.test(tenantId) || tenantId.length > 64) {\n throw new Error('Invalid tenant ID format or length (max 64 chars)');\n }\n }\n\n async listWorkflowRuns(\n workflowId: string,\n filters?: { limit?: number; offset?: number; status?: string },\n ): Promise<WorkflowRunHistoryResponse> {\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n // Try to resolve workflow name from id for matching\n let workflowName: string | undefined;\n if (this.options.workflowService) {\n const workflow = await this.options.workflowService.get(workflowId);\n workflowName = workflow?.name;\n }\n\n let runs = allRuns.filter((run) =>\n run.name === workflowId ||\n (workflowName && run.name === workflowName)\n );\n\n if (filters?.status) {\n runs = runs.filter((run) => run.status === filters.status);\n }\n\n // Sort newest first\n runs.sort((a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime());\n\n const start = filters?.offset ?? 0;\n const end = filters?.limit ? start + filters.limit : runs.length;\n const page = runs.slice(start, end);\n\n return {\n workflowId,\n runs: page.map((run) => ({\n id: run.id,\n workflowId,\n status: run.status as 'pending' | 'running' | 'completed' | 'failed' | 'cancelled',\n trigger: {\n type: (run.trigger?.type as 'manual' | 'api' | 'cron') ?? 'manual',\n user: run.trigger?.actor,\n },\n startedAt: run.startedAt ?? run.createdAt ?? new Date().toISOString(),\n finishedAt: run.finishedAt,\n durationMs: run.durationMs,\n error: run.result?.error?.message,\n })),\n total: runs.length,\n };\n }\n\n private mapWorkflowInfo(workflow: WorkflowRuntime): WorkflowInfo {\n return {\n id: workflow.id,\n name: workflow.name,\n description: workflow.description,\n source: workflow.source,\n pluginId: workflow.pluginId,\n status: workflow.status === 'active' ? 'active' : 'inactive',\n tags: workflow.tags,\n inputs: workflow.inputSchema,\n version: workflow.version,\n updatedAt: workflow.updatedAt,\n };\n }\n\n async resolveRunId(idOrPrefix: string): Promise<string | null> {\n const run = (await this.options.engine.getRun(idOrPrefix)) as WorkflowRun | null;\n if (run) { return run.id; }\n if (idOrPrefix.length <= 8 && !idOrPrefix.includes('-')) {\n const all = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n return all.find(r => r.id.startsWith(idOrPrefix))?.id ?? null;\n }\n return null;\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) { return null; }\n return (await this.options.engine.getRun(resolved)) as WorkflowRun | null;\n }\n\n async listRuns(filters?: {\n status?: string;\n workflowId?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ runs: Array<WorkflowRun & { hasPendingApproval: boolean; currentStepName?: string }>; total: number }> {\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n let runs = allRuns;\n\n if (filters?.status) {\n runs = runs.filter((run) => run.status === filters.status);\n }\n\n if (filters?.workflowId) {\n runs = runs.filter((run) => run.name === filters.workflowId);\n }\n\n // Sort newest first\n runs.sort((a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime());\n\n const total = runs.length;\n const start = filters?.offset ?? 0;\n const end = filters?.limit ? start + filters.limit : runs.length;\n\n const page = runs.slice(start, end).map(run => {\n const allSteps = (run.jobs ?? []).flatMap(j => j.steps ?? []);\n const activeSteps = allSteps.filter(\n s => s.status === 'running' || s.status === 'waiting_approval',\n );\n let currentStepName: string | undefined;\n if (run.status === 'running' && activeSteps.length > 0) {\n // With parallel jobs multiple steps may run simultaneously; show first + overflow count\n currentStepName = activeSteps.length === 1\n ? activeSteps[0]!.name\n : `${activeSteps[0]!.name} (+${activeSteps.length - 1})`;\n }\n return {\n ...run,\n hasPendingApproval: run.status === 'running' &&\n allSteps.some(s => s.status === 'waiting_approval'),\n currentStepName,\n };\n });\n\n return { runs: page, total };\n }\n\n async cancelRun(runId: string): Promise<void> {\n const resolved = await this.resolveRunId(runId);\n const run = resolved ? await this.options.engine.getRun(resolved) : null;\n if (!run) {\n throw new Error('Run not found');\n }\n if (run.status !== 'running' && run.status !== 'queued') {\n throw new Error(`Cannot cancel run with status \"${run.status}\"`);\n }\n await this.options.engine.cancelRun(resolved!);\n }\n\n private requireWorkflowService(): WorkflowService {\n if (!this.options.workflowService) {\n throw new Error('Workflow service not available');\n }\n return this.options.workflowService;\n }\n\n private requireCronScheduler(): CronScheduler {\n if (!this.options.cronScheduler) {\n throw new Error(CRON_SCHEDULER_NOT_AVAILABLE);\n }\n return this.options.cronScheduler;\n }\n}\n\nfunction mapRunStatusToJobStatus(\n status:\n | 'queued'\n | 'running'\n | 'success'\n | 'failed'\n | 'cancelled'\n | 'skipped'\n | 'dlq',\n): JobStatus {\n switch (status) {\n case 'queued':\n return 'pending';\n case 'running':\n return 'running';\n case 'success':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'cancelled';\n case 'skipped':\n return 'cancelled';\n case 'dlq':\n return 'failed';\n }\n}\n\nfunction mapPriority(priority: number): 'low' | 'normal' | 'high' {\n if (priority <= 3) {\n return 'low';\n }\n if (priority <= 7) {\n return 'normal';\n }\n return 'high';\n}\n","import type { FastifyReply } from 'fastify';\n\nexport interface ApiSuccessResponse<T> {\n ok: true;\n data: T;\n}\n\nexport interface ApiErrorResponse {\n ok: false;\n error: string;\n}\n\nexport type ApiResponse<T> = ApiSuccessResponse<T> | ApiErrorResponse;\n\nexport function ok<T>(data: T): ApiSuccessResponse<T> {\n return { ok: true, data };\n}\n\nexport function fail(\n reply: FastifyReply,\n statusCode: number,\n message: string,\n): ApiErrorResponse {\n reply.code(statusCode);\n return { ok: false, error: message };\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/jobs\n * Jobs REST API routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type {\n JobSubmissionRequest,\n JobListFilter,\n} from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nexport interface JobsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register Jobs API routes\n */\nexport function registerJobsAPI(options: JobsAPIOptions): void {\n const { server, hostService, logger, observability } = options;\n\n /**\n * Submit job\n * POST /api/v1/jobs\n */\n server.post<{ Body: JobSubmissionRequest }>(\n '/api/v1/jobs',\n { schema: { tags: ['Jobs'], summary: 'Submit a new job' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.submit', () => hostService.submitJob(tenantId, request.body));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Job submission failed';\n logger.error('Job submission failed', error instanceof Error ? error : undefined, { tenantId });\n if (message.startsWith('Invalid tenant') || message.startsWith('Missing required') || message.startsWith('Priority')) {\n return fail(reply, 400, message);\n } else {\n return fail(reply, 500, message);\n }\n }\n }\n );\n\n /**\n * Get job status\n * GET /api/v1/jobs/:jobId\n */\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId',\n { schema: { tags: ['Jobs'], summary: 'Get job status' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.get', () => hostService.getJob(tenantId, jobId));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job status';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n logger.error('Failed to get job status', error instanceof Error ? error : undefined, { jobId });\n return fail(reply, 500, message);\n }\n }\n );\n\n /**\n * Cancel job\n * POST /api/v1/jobs/:jobId/cancel\n */\n server.post<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/cancel',\n { schema: { tags: ['Jobs'], summary: 'Cancel a job' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.cancel', () => hostService.cancelJob(tenantId, jobId));\n return ok(data);\n } catch (error) {\n logger.error('Failed to cancel job', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to cancel job');\n }\n }\n );\n\n /**\n * List jobs\n * GET /api/v1/jobs?type=pattern&status=running&limit=10&offset=0\n */\n server.get<{ Querystring: JobListFilter }>(\n '/api/v1/jobs',\n { schema: { tags: ['Jobs'], summary: 'List jobs' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n const filter = request.query;\n\n try {\n const data = await observability.observeOperation('workflow.job.list', () => hostService.listJobs(tenantId, filter));\n return ok(data);\n } catch (error) {\n logger.error('Failed to list jobs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list jobs');\n }\n }\n );\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/steps',\n { schema: { tags: ['Jobs'], summary: 'Get job steps' } },\n async (request, reply) => {\n const { jobId } = request.params;\n try {\n const steps = await observability.observeOperation('workflow.job.steps', () => hostService.getJobSteps(jobId));\n return ok(steps);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job steps';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n return fail(reply, 500, message);\n }\n }\n );\n\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/logs',\n { schema: { tags: ['Jobs'], summary: 'Get job logs' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const limit =\n typeof request.query === 'object' && request.query && 'limit' in request.query\n ? Number((request.query as Record<string, unknown>).limit)\n : undefined;\n const offset =\n typeof request.query === 'object' && request.query && 'offset' in request.query\n ? Number((request.query as Record<string, unknown>).offset)\n : undefined;\n const level =\n typeof request.query === 'object' && request.query && 'level' in request.query\n ? String((request.query as Record<string, unknown>).level)\n : undefined;\n\n try {\n const logs = await observability.observeOperation('workflow.job.logs', () =>\n hostService.getJobLogs(jobId, { limit, offset, level }),\n );\n return ok({ logs });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job logs';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n return fail(reply, 500, message);\n }\n }\n );\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/cron\n * Cron REST API routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { CronRegistrationRequest } from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\ninterface CronIdParams {\n id: string;\n}\n\nexport interface CronAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register Cron API routes\n */\nexport function registerCronAPI(options: CronAPIOptions): void {\n const { server, hostService, logger, observability } = options;\n\n server.post<{ Body: CronRegistrationRequest }>(\n '/api/v1/crons',\n { schema: { tags: ['Cron'], summary: 'Register a cron job' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.register', () =>\n Promise.resolve(hostService.registerCron(tenantId, request.body)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to register cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n if (message.startsWith('Missing required fields')) {\n return fail(reply, 400, message);\n }\n logger.error('Failed to register cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.get(\n '/api/v1/crons',\n { schema: { tags: ['Cron'], summary: 'List cron jobs' } },\n async (_request, reply) => {\n try {\n return ok(await observability.observeOperation('workflow.cron.list', () => Promise.resolve(hostService.listCron())));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to list cron jobs';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to list cron jobs', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.delete<{ Params: CronIdParams }>(\n '/api/v1/crons/:id',\n { schema: { tags: ['Cron'], summary: 'Unregister a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.unregister', () =>\n Promise.resolve(hostService.unregisterCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to unregister cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to unregister cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/trigger',\n { schema: { tags: ['Cron'], summary: 'Trigger a cron job immediately' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.trigger', () => hostService.triggerCron(tenantId, id));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to trigger cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to trigger cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/pause',\n { schema: { tags: ['Cron'], summary: 'Pause a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.pause', () =>\n Promise.resolve(hostService.pauseCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to pause cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to pause cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/resume',\n { schema: { tags: ['Cron'], summary: 'Resume a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.resume', () =>\n Promise.resolve(hostService.resumeCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resume cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to resume cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/workflows-api\n * REST API endpoints for managing workflow definitions\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowRerunRequest, WorkflowRestartRequest, WorkflowRunRequest } from '@kb-labs/workflow-contracts';\nimport type { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nconst TERMINAL_EVENTS = ['run.finished', 'run.failed', 'run.cancelled'];\nconst TERMINAL_STATUSES = ['success', 'failed', 'cancelled', 'skipped', 'dlq'];\nconst KEEP_ALIVE_MS = 30_000;\nconst IDLE_TIMEOUT_MS = 60_000;\n\nexport interface RegisterWorkflowsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n engine: WorkflowEngine;\n workflowService?: WorkflowService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register workflow definition management endpoints.\n *\n * Endpoints:\n * - GET /api/v1/workflows - List all workflow definitions\n * - GET /api/v1/workflows/:id - Get workflow definition details\n * - GET /api/v1/workflows/:id/runs - Get run history for a workflow\n * - POST /api/v1/workflows/:id/run - Run a workflow\n */\nexport function registerWorkflowsAPI(options: RegisterWorkflowsAPIOptions): void {\n const { server, hostService, engine, workflowService, logger, observability } = options;\n\n // POST /api/v1/workflows/reload (alias: /refresh) - Reload workflow definitions from disk\n const reloadHandler = async () => {\n try {\n logger.info('[workflows-api] Refreshing workflows from disk');\n\n if (workflowService) {\n await observability.observeOperation('workflow.catalog.refresh', () => workflowService.refreshManifests());\n }\n\n const workflows = workflowService\n ? await observability.observeOperation('workflow.catalog.list', () => workflowService.listAll())\n : [];\n\n return ok({\n workflowsLoaded: workflows.length,\n workflowIds: workflows.map((w) => w.id),\n });\n } catch (error) {\n logger.error('[workflows-api] Failed to refresh workflows', error instanceof Error ? error : undefined);\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n };\n\n server.post('/api/v1/workflows/reload', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk' } }, reloadHandler);\n server.post('/api/v1/workflows/refresh', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk (alias for /reload)' } }, reloadHandler);\n\n // GET /api/v1/workflows - List all workflow definitions\n server.get<{\n Querystring: {\n source?: 'manifest' | 'standalone';\n status?: 'active' | 'inactive';\n tags?: string;\n };\n }>('/api/v1/workflows', { schema: { tags: ['Workflows'], summary: 'List workflow definitions' } }, async (request, reply) => {\n try {\n const response = await observability.observeOperation('workflow.catalog.list', () => hostService.listWorkflows(request.query));\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing workflows', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list workflows');\n }\n });\n\n // GET /api/v1/workflows/:id - Get workflow definition details\n server.get<{\n Params: { id: string };\n }>('/api/v1/workflows/:id', { schema: { tags: ['Workflows'], summary: 'Get workflow definition' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const workflow = await observability.observeOperation('workflow.catalog.get', () => hostService.getWorkflow(id));\n if (!workflow) {\n return fail(reply, 404, 'Workflow not found');\n }\n return ok(workflow);\n } catch (error) {\n logger.error('[workflows-api] Error getting workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to get workflow');\n }\n });\n\n // GET /api/v1/workflows/:id/runs - Get run history for a workflow\n server.get<{\n Params: { id: string };\n Querystring: { limit?: string; offset?: string; status?: string };\n }>('/api/v1/workflows/:id/runs', { schema: { tags: ['Workflows'], summary: 'List runs for a workflow' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const { limit, offset, status } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listWorkflowRuns(id, {\n limit: limit ? parseInt(limit, 10) : 50,\n offset: offset ? parseInt(offset, 10) : 0,\n status,\n }),\n );\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing workflow runs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list workflow runs');\n }\n });\n\n // POST /api/v1/workflows/:id/runs - Run a workflow\n server.post<{\n Params: { id: string };\n Body: WorkflowRunRequest;\n }>('/api/v1/workflows/:id/runs', { schema: { tags: ['Workflows'], summary: 'Run a workflow' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const response = await observability.observeOperation('workflow.run.start', () => hostService.runWorkflow(id, request.body || {}));\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to run workflow';\n if (message === 'Workflow not found') {\n return fail(reply, 404, message);\n }\n // Invalid request payload (e.g. missing required inputs) is a client error.\n if (message.startsWith('Missing required input')) {\n return fail(reply, 400, message);\n }\n logger.error('[workflows-api] Error running workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/cancel - Cancel a running workflow run\n server.post<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/cancel', { schema: { tags: ['Runs'], summary: 'Cancel a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n await observability.observeOperation('workflow.run.cancel', () => hostService.cancelRun(runId));\n return ok({ cancelled: true, runId });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to cancel run';\n if (message === 'Run not found') {\n return fail(reply, 404, message);\n }\n if (message.startsWith('Cannot cancel run')) {\n return fail(reply, 409, message);\n }\n logger.error('[workflows-api] Error cancelling run', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/rerun — Rerun a workflow run, optionally only failed jobs\n server.post<{\n Params: { runId: string };\n Body: WorkflowRerunRequest;\n }>('/api/v1/runs/:runId/rerun', { schema: { tags: ['Runs'], summary: 'Rerun a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const response = await observability.observeOperation('workflow.run.rerun', () =>\n hostService.rerunWorkflow(runId, request.body ?? {}),\n );\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to rerun workflow';\n if (message === 'Run not found' || message === 'Workflow not found') {\n return fail(reply, 404, message);\n }\n if (message === 'No failed jobs to rerun') {\n return fail(reply, 400, message);\n }\n logger.error('[workflows-api] Error rerunning workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/restart — Restart a run from a snapshot, optionally from a specific step\n server.post<{\n Params: { runId: string };\n Body: WorkflowRestartRequest;\n }>('/api/v1/runs/:runId/restart', { schema: { tags: ['Runs'], summary: 'Restart a run from a specific step (snapshot-based)' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const response = await observability.observeOperation('workflow.run.restart', () =>\n hostService.restartRun(runId, request.body ?? {}),\n );\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to restart run';\n if (message.includes('not found') || message.includes('snapshot not available')) {\n return fail(reply, 404, message);\n }\n if (message.startsWith('Cannot restart an active run')) {\n return fail(reply, 409, message);\n }\n logger.error('[workflows-api] Error restarting run', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // GET /api/v1/runs - List all workflow runs (across all workflows)\n server.get<{\n Querystring: { status?: string; workflowId?: string; limit?: string; offset?: string };\n }>('/api/v1/runs', { schema: { tags: ['Runs'], summary: 'List all workflow runs' } }, async (request, reply) => {\n try {\n const { status, workflowId, limit, offset } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listRuns({\n status,\n workflowId,\n limit: limit ? parseInt(limit, 10) : 50,\n offset: offset ? parseInt(offset, 10) : 0,\n }),\n );\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing runs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list runs');\n }\n });\n\n // GET /api/v1/runs/:runId - Get a specific workflow run\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId', { schema: { tags: ['Runs'], summary: 'Get a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const run = await observability.observeOperation('workflow.run.get', () => hostService.getRun(runId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n return ok({ run });\n } catch (error) {\n logger.error('[workflows-api] Error getting run', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to get run');\n }\n });\n\n // GET /api/v1/runs/:runId/logs — Execution logs for a run, optionally filtered by step\n server.get<{\n Params: { runId: string };\n Querystring: { stepId?: string; level?: string; limit?: string; offset?: string };\n }>(\n '/api/v1/runs/:runId/logs',\n { schema: { tags: ['Runs'], summary: 'Get execution logs for a run' } },\n async (request, reply) => {\n const { runId } = request.params;\n const { stepId, level, limit, offset } = request.query;\n\n try {\n const logs = await observability.observeOperation('workflow.run.logs', () =>\n hostService.getRunLogs(runId, {\n stepId,\n level,\n limit: limit ? parseInt(limit, 10) : undefined,\n offset: offset ? parseInt(offset, 10) : undefined,\n }),\n );\n return ok({ logs, runId, stepId });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get run logs';\n if (message === 'Run not found') {\n return fail(reply, 404, message);\n }\n logger.error('[workflows-api] Error getting run logs', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n // GET /api/v1/runs/:runId/events — SSE stream of run events\n // hide: true — SSE uses raw socket hijack, incompatible with OpenAPI response schema\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/events', { schema: { hide: true } }, async (request, reply) => {\n const { runId: rawId } = request.params;\n const runId = await hostService.resolveRunId(rawId) ?? rawId;\n\n const run = await observability.observeOperation('workflow.run.events', () => engine.getRun(runId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n // SSE response\n reply.hijack();\n const raw = reply.raw;\n\n const origin = request.headers.origin;\n if (typeof origin === 'string' && origin.startsWith('http://localhost')) {\n raw.setHeader('Access-Control-Allow-Origin', origin);\n raw.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n raw.setHeader('Content-Type', 'text/event-stream');\n raw.setHeader('Cache-Control', 'no-cache, no-transform');\n raw.setHeader('Connection', 'keep-alive');\n raw.flushHeaders?.();\n raw.write(': connected\\n\\n');\n\n const sendEvent = (type: string, payload: unknown) => {\n if (raw.writableEnded) {return;}\n raw.write(`event: ${type}\\n`);\n raw.write(`data: ${JSON.stringify({ type, runId, payload, timestamp: new Date().toISOString() })}\\n\\n`);\n };\n\n // Send current snapshot\n sendEvent('run.snapshot', run);\n\n // If run already terminal — emit the terminal event then close.\n // Clients subscribing after completion still see the terminal event,\n // not just the snapshot (makes the stream contract consistent).\n if (TERMINAL_STATUSES.includes(run.status)) {\n const terminalType =\n run.status === 'success' ? 'run.finished' :\n run.status === 'failed' ? 'run.failed' : 'run.cancelled';\n sendEvent(terminalType, run);\n raw.end();\n return;\n }\n\n // Subscribe to live events\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer);}\n idleTimer = setTimeout(() => {\n cleanup();\n }, IDLE_TIMEOUT_MS);\n };\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return;}\n raw.write(': keep-alive\\n\\n');\n }, KEEP_ALIVE_MS);\n\n const unsubscribe = engine.subscribeToRunEvents(runId, (event) => {\n sendEvent(event.type, event.payload);\n resetIdle();\n if (TERMINAL_EVENTS.includes(event.type)) {\n cleanup();\n }\n });\n\n const cleanup = () => {\n unsubscribe();\n if (idleTimer) {clearTimeout(idleTimer);}\n clearInterval(keepAliveTimer);\n if (!raw.writableEnded) {raw.end();}\n };\n\n resetIdle();\n request.raw.on('close', cleanup);\n });\n\n logger.info('[workflows-api] Workflows API endpoints registered');\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/approvals-api\n * REST API endpoints for workflow approval management\n *\n * Provides endpoints for:\n * - Listing pending approvals for a run\n * - Resolving (approve/reject) a pending approval step\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nexport interface ApprovalsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n engine: WorkflowEngine;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register approval management endpoints.\n *\n * Endpoints:\n * - GET /api/v1/runs/:runId/approvals - List steps waiting for approval\n * - POST /api/v1/runs/:runId/approvals/resolve - Approve or reject a pending step\n */\nexport function registerApprovalsAPI(options: ApprovalsAPIOptions): void {\n const { server, hostService, engine, logger, observability } = options;\n\n // GET /api/v1/runs/:runId/approvals\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/approvals', { schema: { tags: ['Approvals'], summary: 'List pending approvals for a run' } }, async (request, reply) => {\n try {\n const { runId: rawId } = request.params;\n const run = await observability.observeOperation('workflow.approval.list', () => hostService.getRun(rawId));\n\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n const pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }> = [];\n\n for (const job of run.jobs) {\n for (const step of job.steps) {\n if ((step.status as string) === 'waiting_approval') {\n pending.push({\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n specId: step.spec.id,\n context: (step.resolvedInputs ?? step.spec.with ?? {}) as Record<string, unknown>,\n waitingSince: step.startedAt,\n });\n }\n }\n }\n\n return ok({ runId: run.id, pending });\n } catch (error) {\n logger.error('[approvals-api] Error listing pending approvals', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list pending approvals');\n }\n });\n\n // POST /api/v1/runs/:runId/approvals/resolve\n server.post<{\n Params: { runId: string };\n Body: {\n jobId: string;\n stepId: string;\n action: 'approve' | 'reject';\n comment?: string;\n data?: Record<string, unknown>;\n };\n }>('/api/v1/runs/:runId/approvals/resolve', { schema: { tags: ['Approvals'], summary: 'Approve or reject a pending step' } }, async (request, reply) => {\n try {\n const { runId: rawId } = request.params;\n const { jobId, stepId, action, comment, data } = request.body;\n\n if (!jobId || !stepId || !action) {\n return fail(reply, 400, 'Missing required fields: jobId, stepId, action');\n }\n\n if (action !== 'approve' && action !== 'reject') {\n return fail(reply, 400, 'action must be \"approve\" or \"reject\"');\n }\n\n const run = await observability.observeOperation('workflow.approval.get', () => hostService.getRun(rawId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n const job = run.jobs.find(j => j.id === jobId);\n if (!job) {\n return fail(reply, 404, 'Job not found');\n }\n\n const step = job.steps.find(s => s.id === stepId);\n if (!step) {\n return fail(reply, 404, 'Step not found');\n }\n\n if ((step.status as string) !== 'waiting_approval') {\n return fail(reply, 409, `Step is not waiting for approval (current status: ${step.status})`);\n }\n\n await observability.observeOperation('workflow.approval.resolve', () =>\n engine.resolveApproval(run.id, jobId, stepId, action, data, comment),\n );\n\n logger.info('[approvals-api] Approval resolved', {\n runId: run.id,\n jobId,\n stepId,\n action,\n comment,\n });\n\n return ok({\n runId: run.id,\n jobId,\n stepId,\n action,\n resolved: true,\n });\n } catch (error) {\n logger.error('[approvals-api] Error resolving approval', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to resolve approval');\n }\n });\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/stats\n * Dashboard statistics REST API — GET /api/v1/stats\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { DashboardStatsResponse } from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport type { CronScheduler } from '../cron-scheduler.js';\nimport { ok } from './response.js';\n\nexport interface StatsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n cronScheduler?: CronScheduler;\n logger: ILogger;\n}\n\nexport function registerStatsAPI(options: StatsAPIOptions): void {\n const { server, hostService, cronScheduler } = options;\n\n server.get('/api/v1/stats', { schema: { tags: ['Stats'], summary: 'Get dashboard statistics' } }, async (_request, _reply) => {\n const tenantId = 'default';\n\n // Jobs — all statuses\n const { jobs } = await hostService.listJobs(tenantId, {});\n const running = jobs.filter((j) => j.status === 'running').length;\n const pending = jobs.filter((j) => j.status === 'pending').length;\n const completed = jobs.filter((j) => j.status === 'completed').length;\n const failed = jobs.filter((j) => j.status === 'failed').length;\n\n // Active executions\n const activeRaw = await hostService.listActiveExecutions();\n const now = Date.now();\n const activeExecutions: DashboardStatsResponse['activeExecutions'] = activeRaw.map((e) => {\n const startedAt = e['startedAt'] as string | Date | undefined;\n const startedAtStr = startedAt ? new Date(startedAt).toISOString() : new Date().toISOString();\n const durationMs = startedAt ? now - new Date(startedAt).getTime() : undefined;\n return {\n id: String(e['id'] ?? ''),\n type: String(e['type'] ?? ''),\n status: 'running' as const,\n startedAt: startedAtStr,\n durationMs,\n };\n });\n\n // Recent activity — last 10 completed/failed/cancelled\n const finished = jobs\n .filter((j) => j.status === 'completed' || j.status === 'failed' || j.status === 'cancelled')\n .filter((j) => j.finishedAt != null)\n .sort((a, b) => new Date(b.finishedAt!).getTime() - new Date(a.finishedAt!).getTime())\n .slice(0, 10);\n\n const recentActivity: DashboardStatsResponse['recentActivity'] = finished.map((j) => {\n const finishedAt = new Date(j.finishedAt!).toISOString();\n const durationMs =\n j.startedAt && j.finishedAt\n ? new Date(j.finishedAt).getTime() - new Date(j.startedAt).getTime()\n : undefined;\n return {\n id: j.id,\n type: j.type,\n status: j.status as 'completed' | 'failed' | 'cancelled',\n finishedAt,\n durationMs,\n error: j.error,\n };\n });\n\n // Workflows\n let workflowStats = { total: 0, active: 0, inactive: 0 };\n try {\n const { workflows } = await hostService.listWorkflows({});\n const active = workflows.filter((w) => w.status !== 'inactive').length;\n workflowStats = { total: workflows.length, active, inactive: workflows.length - active };\n } catch {\n // workflowService may not be available\n }\n\n // Crons\n let cronStats = { total: 0, enabled: 0, disabled: 0 };\n if (cronScheduler) {\n try {\n const { crons } = hostService.listCron();\n const enabled = crons.filter((c) => c.enabled).length;\n cronStats = { total: crons.length, enabled, disabled: crons.length - enabled };\n } catch {\n // ignore\n }\n }\n\n const stats: DashboardStatsResponse = {\n workflows: workflowStats,\n jobs: { running, pending, completed, failed },\n crons: cronStats,\n activeExecutions,\n recentActivity,\n };\n\n return ok(stats);\n });\n}\n","/**\n * @module @kb-labs/workflow-daemon/server\n * HTTP API server for workflow daemon management\n */\n\nimport {\n HttpObservabilityCollector,\n createDaemonServer,\n createServiceReadyResponse,\n metricLine,\n} from '@kb-labs/shared-http';\nimport type { FastifyInstance } from 'fastify';\nimport type { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { ObservabilityCheck, ServiceHealthStatus, ServiceOperationSample } from '@kb-labs/core-contracts';\nimport type { JobBroker } from './job-broker.js';\nimport type { CronScheduler } from './cron-scheduler.js';\nimport type { CronDiscovery } from './cron-discovery.js';\nimport { WorkflowHostService, type WorkflowEngineMetrics } from './host/workflow-host-service.js';\nimport { registerJobsAPI } from './api/jobs-api.js';\nimport { registerCronAPI } from './api/cron-api.js';\nimport { registerWorkflowsAPI } from './api/workflows-api.js';\nimport { registerApprovalsAPI } from './api/approvals-api.js';\nimport { registerStatsAPI } from './api/stats-api.js';\n\nexport interface CreateServerOptions {\n engine: WorkflowEngine;\n jobBroker: JobBroker;\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n cronDiscovery?: CronDiscovery;\n logger: ILogger;\n}\n\n/**\n * Create Fastify HTTP server for workflow daemon.\n * Provides endpoints for job management and monitoring.\n */\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const { engine, jobBroker, workflowService, cronScheduler, cronDiscovery, logger } = options;\n const hostService = new WorkflowHostService({\n engine,\n jobBroker,\n workflowService,\n cronScheduler,\n logger,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n const requireAuth = process.env.KB_DAEMON_REQUIRE_AUTH === 'false'\n ? false\n : (process.env.KB_DAEMON_REQUIRE_AUTH === 'true' || isProduction);\n const daemonApiKey = process.env.KB_DAEMON_API_KEY;\n const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(',') ?? [\n 'http://localhost:3000',\n 'http://localhost:5173',\n ];\n\n if (requireAuth && !daemonApiKey) {\n throw new Error(\n 'KB_DAEMON_API_KEY is required when daemon auth is enabled (KB_DAEMON_REQUIRE_AUTH=true or NODE_ENV=production)',\n );\n }\n\n const observability = new HttpObservabilityCollector({\n serviceId: 'workflow',\n serviceType: 'workflow-daemon',\n version: '1.0.0',\n logsSource: 'workflow',\n dependencies: [\n { serviceId: 'state-daemon', required: false, description: 'Workflow run and job state storage' },\n ],\n });\n\n return createDaemonServer({\n serviceId: 'workflow',\n logger,\n observability,\n bodyLimit: 1048576,\n skipStandardRoutes: true,\n openapi: {\n title: 'KB Labs Workflow Daemon',\n description: 'Background job execution and workflow orchestration API',\n },\n cors: {\n origin: (origin: string | undefined, callback: (err: Error | null, allow: boolean) => void) => {\n if (!origin) {\n const isDevelopment =\n process.env.KB_DAEMON_REQUIRE_AUTH === 'false' || process.env.NODE_ENV !== 'production';\n if (isDevelopment) { callback(null, true); } else { callback(new Error('Origin header required in production'), false); }\n return;\n }\n if (allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error(`Origin ${origin} not allowed by CORS`), false); }\n },\n },\n\n onRequest: async (request, reply) => {\n if (!requireAuth || request.url === '/health') {\n return;\n }\n const apiKeyHeader = request.headers['x-api-key'];\n const authHeader = request.headers.authorization;\n const bearerToken =\n typeof authHeader === 'string' && authHeader.startsWith('Bearer ')\n ? authHeader.slice('Bearer '.length).trim()\n : undefined;\n const token = (typeof apiKeyHeader === 'string' ? apiKeyHeader : undefined) ?? bearerToken;\n if (!token || token !== daemonApiKey) {\n reply.code(401).send({ ok: false, error: 'Unauthorized' });\n }\n },\n\n registerRoutes: async (server) => {\n\n // Business routes\n registerJobsAPI({ server, hostService, logger, observability });\n registerCronAPI({ server, hostService, logger, observability });\n\n if (workflowService) {\n registerWorkflowsAPI({ server, hostService, engine, workflowService, logger, observability });\n }\n\n registerApprovalsAPI({ server, hostService, engine, logger, observability });\n registerStatsAPI({ server, hostService, cronScheduler, logger });\n\n // Custom observability routes (workflow-specific data from hostService)\n server.get('/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n return {\n status: checks.some((entry) => entry.status === 'error') ? 'degraded' : 'ok',\n service: 'workflow',\n ts: Date.now(),\n };\n });\n\n server.get('/ready', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowReadinessChecks({ workflowService, cronScheduler, metrics });\n const hasErrors = checks.some((entry) => entry.status === 'error');\n const hasWarnings = checks.some((entry) => entry.status === 'warn');\n return createServiceReadyResponse({\n ready: !hasErrors,\n status: hasErrors ? 'initializing' : hasWarnings ? 'degraded' : 'ready',\n reason: hasErrors ? 'workflow_checks_failed' : 'ready',\n components: {\n workflowEngine: { ready: true },\n workflowCatalog: { ready: Boolean(workflowService) },\n cronScheduler: { ready: Boolean(cronScheduler) },\n },\n });\n });\n\n server.get('/metrics', async (_request, reply) => {\n const metrics = await hostService.getMetrics();\n const healthStatus = resolveWorkflowHealthStatus(metrics);\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics(\n healthStatus,\n buildWorkflowMetricLines(metrics),\n );\n });\n\n server.get('/observability/describe', async () => observability.buildDescribe());\n\n server.get('/observability/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n return observability.buildHealth({\n status: resolveWorkflowHealthStatus(metrics),\n checks,\n topOperations: buildWorkflowTopOperations(metrics, observability.getTopOperations(3)),\n meta: {\n workflowServiceEnabled: Boolean(workflowService),\n cronSchedulerEnabled: Boolean(cronScheduler),\n cronDiscoveryEnabled: Boolean(cronDiscovery),\n runs: metrics.runs,\n jobs: metrics.jobs,\n },\n });\n });\n },\n });\n}\n\ntype WorkflowMetrics = WorkflowEngineMetrics;\n\nfunction resolveWorkflowHealthStatus(metrics: WorkflowMetrics): ServiceHealthStatus {\n void metrics;\n return 'healthy';\n}\n\nfunction buildWorkflowChecks(input: {\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n metrics: WorkflowMetrics;\n}): ObservabilityCheck[] {\n return [\n ...buildWorkflowReadinessChecks(input),\n {\n id: 'workflow-failures',\n status: input.metrics.runs.failed > 0 || input.metrics.jobs.failed > 0 ? 'warn' : 'ok',\n message:\n input.metrics.runs.failed > 0 || input.metrics.jobs.failed > 0\n ? `${input.metrics.runs.failed} failed runs, ${input.metrics.jobs.failed} failed jobs retained in history`\n : 'No failed workflow runs or jobs in retained history',\n },\n ];\n}\n\nfunction buildWorkflowReadinessChecks(input: {\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n metrics: WorkflowMetrics;\n}): ObservabilityCheck[] {\n return [\n {\n id: 'workflow-engine',\n status: 'ok',\n message: `${input.metrics.runs.total} runs tracked`,\n },\n {\n id: 'workflow-catalog',\n status: input.workflowService ? 'ok' : 'warn',\n message: input.workflowService ? 'Workflow service available' : 'Workflow service not configured',\n },\n {\n id: 'cron-scheduler',\n status: input.cronScheduler ? 'ok' : 'warn',\n message: input.cronScheduler ? 'Cron scheduler available' : 'Cron scheduler not configured',\n },\n ];\n}\n\nfunction buildWorkflowTopOperations(\n metrics: WorkflowMetrics,\n httpOperations: ServiceOperationSample[],\n): ServiceOperationSample[] {\n return [\n ...httpOperations,\n { operation: 'workflow.runs', count: metrics.runs.total, errorCount: metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq },\n { operation: 'workflow.jobs', count: metrics.jobs.total, errorCount: metrics.jobs.failed },\n ].slice(0, 5);\n}\n\nfunction buildWorkflowMetricLines(metrics: WorkflowMetrics): string[] {\n return [\n '# HELP workflow_runs_total Total workflow runs grouped by status',\n '# TYPE workflow_runs_total gauge',\n metricLine('workflow_runs_total', metrics.runs.total, { status: 'total' }),\n metricLine('workflow_runs_total', metrics.runs.queued, { status: 'queued' }),\n metricLine('workflow_runs_total', metrics.runs.running, { status: 'running' }),\n metricLine('workflow_runs_total', metrics.runs.completed, { status: 'completed' }),\n metricLine('workflow_runs_total', metrics.runs.failed, { status: 'failed' }),\n metricLine('workflow_runs_total', metrics.runs.cancelled, { status: 'cancelled' }),\n metricLine('workflow_runs_total', metrics.runs.dlq, { status: 'dlq' }),\n '# HELP workflow_jobs_total Total workflow jobs grouped by status',\n '# TYPE workflow_jobs_total gauge',\n metricLine('workflow_jobs_total', metrics.jobs.total, { status: 'total' }),\n metricLine('workflow_jobs_total', metrics.jobs.queued, { status: 'queued' }),\n metricLine('workflow_jobs_total', metrics.jobs.running, { status: 'running' }),\n metricLine('workflow_jobs_total', metrics.jobs.completed, { status: 'completed' }),\n metricLine('workflow_jobs_total', metrics.jobs.failed, { status: 'failed' }),\n metricLine('service_operation_total', metrics.runs.total, { operation: 'workflow.runs', status: 'ok' }),\n metricLine('service_operation_total', metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq, { operation: 'workflow.runs', status: 'error' }),\n metricLine('service_operation_total', metrics.jobs.total, { operation: 'workflow.jobs', status: 'ok' }),\n metricLine('service_operation_total', metrics.jobs.failed, { operation: 'workflow.jobs', status: 'error' }),\n ];\n}\n","/**\n * @module @kb-labs/workflow-daemon/bootstrap\n * Bootstrap workflow daemon - initialize platform, engine, worker, and HTTP server\n */\n\nimport { platform, createServiceBootstrap } from '@kb-labs/core-runtime';\nimport { makeAssemblyHook } from '@kb-labs/plugin-runtime';\nimport { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport { createCorrelatedLogger, getListenOptions } from '@kb-labs/shared-http';\nimport { runDaemon } from '@kb-labs/shared-daemon';\nimport { createWorkflowWorker } from './worker.js';\nimport { JobBroker } from './job-broker.js';\nimport { CronScheduler } from './cron-scheduler.js';\nimport { CronDiscovery } from './cron-discovery.js';\nimport { WorkflowFileWatcher } from './file-watcher.js';\nimport { createServer } from './server.js';\nimport { createRegistry } from '@kb-labs/core-registry';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\n/**\n * Bootstrap workflow daemon.\n * Initializes platform, engine, worker, and HTTP server.\n */\nexport async function bootstrap(_cwd: string = process.cwd()): Promise<void> {\n await runDaemon(\n {\n appId: 'workflow-daemon',\n // serviceId in the transport map / devservices is 'workflow' (≠ appId).\n serviceId: 'workflow',\n defaultPort: 7778,\n portEnvVar: 'WORKFLOW_PORT',\n defaultHost: '0.0.0.0',\n hostEnvVar: 'WORKFLOW_HOST',\n async setup({ platform: _p, logger: _l, port, host, repoRoot }) {\n // KB_PROJECT_ROOT injected by kb-dev when invoked from a project dir with separate platform.\n // Fall back to the resolved repoRoot (not raw cwd) so plugin/cron/workflow discovery is\n // correct even when the daemon is launched from a subdirectory.\n const projectRoot = process.env['KB_PROJECT_ROOT'] ?? repoRoot;\n\n if (!platform.isConfigured('workspace')) {\n process.stderr.write(\n '[workflow-daemon] WARNING: workspace adapter is not configured.\\n' +\n '[workflow-daemon] Workflows that use isolation: balanced (default) or isolation: strict will fail.\\n' +\n '[workflow-daemon] To fix: set platform.adapters.workspace in kb.config.json.\\n' +\n '[workflow-daemon] To run without a workspace: add \"isolation: relaxed\" to your workflow YAML.\\n',\n );\n }\n\n if (!platform.isConfigured('environment') && platform.isConfigured('workspace')) {\n process.stderr.write(\n '[workflow-daemon] WARNING: environment adapter is not configured.\\n' +\n '[workflow-daemon] Workflows that use isolation: strict will fail.\\n' +\n '[workflow-daemon] To fix: set platform.adapters.environment in kb.config.json.\\n',\n );\n }\n\n const startupRequestId = `workflow-startup-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startupTraceId = randomUUID();\n const startupSpanId = randomUUID();\n const bootstrapLogger = createCorrelatedLogger(platform.logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service: 'bootstrap',\n requestId: startupRequestId,\n traceId: startupTraceId,\n operation: 'workflow.bootstrap',\n bindings: { spanId: startupSpanId, invocationId: startupSpanId, executionId: startupSpanId },\n });\n\n const debugMode = process.env['WORKFLOW_DEBUG'] === 'true';\n bootstrapLogger.info('Workflow daemon starting', { projectRoot, debugMode });\n\n if (debugMode) {\n bootstrapLogger.warn(\n '[WORKFLOW_DEBUG=true] Verbose debug logging is ON — step inputs, outputs, and expr contexts will be logged. ' +\n 'Disable in production (unset WORKFLOW_DEBUG or set to false).',\n );\n }\n\n const createWorkflowLogger = (service: string, operation: string, bindings?: Record<string, unknown>) =>\n createCorrelatedLogger(platform.logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service,\n operation,\n bindings,\n });\n\n bootstrapLogger.info('Loading plugin registry snapshot');\n const cliApi = await createRegistry({ root: repoRoot, cache: { ttlMs: 10 * 60 * 1000 } });\n await cliApi.initialize();\n const plugins = await cliApi.listPlugins();\n bootstrapLogger.info('Plugin registry snapshot loaded', {\n pluginsFound: plugins.length,\n pluginIds: plugins.map((p) => `${p.id}@${p.version}`),\n });\n\n bootstrapLogger.info('Creating WorkflowEngine');\n const engine = new WorkflowEngine({\n cache: platform.cache,\n events: platform.eventBus,\n logger: createWorkflowLogger('engine', 'workflow.engine'),\n snapshotManager: platform.snapshotManager,\n workspaceRoot: projectRoot,\n });\n\n bootstrapLogger.info('Cleaning up stale runs from previous daemon process');\n await engine.cleanupStaleRuns();\n\n bootstrapLogger.info('Resuming interrupted jobs');\n await engine.resumeInterruptedJobs();\n\n bootstrapLogger.info('Creating JobBroker');\n const jobBroker = new JobBroker(\n engine,\n createWorkflowLogger('job-broker', 'workflow.job-broker'),\n platform,\n );\n\n bootstrapLogger.info('Creating CronScheduler');\n const cronScheduler = new CronScheduler({\n jobBroker,\n workflowEngine: engine,\n logger: createWorkflowLogger('cron-scheduler', 'workflow.cron-scheduler'),\n timezone: process.env.WORKFLOW_CRON_TIMEZONE,\n });\n\n bootstrapLogger.info('Discovering cron jobs');\n const cronDiscovery = new CronDiscovery({\n cliApi,\n scheduler: cronScheduler,\n logger: createWorkflowLogger('cron-discovery', 'workflow.cron-discovery'),\n workspaceRoot: projectRoot,\n });\n const discovered = await cronDiscovery.discoverAll();\n bootstrapLogger.info('Cron job discovery complete', discovered);\n\n bootstrapLogger.info('Creating WorkflowService');\n const workflowService = new WorkflowService({ cliApi, platform, workspaceRoot: projectRoot });\n workflowService.listAll().catch((err: unknown) =>\n bootstrapLogger.warn('Manifest scanner warmup failed', { err }),\n );\n\n bootstrapLogger.info('Starting WorkflowFileWatcher');\n const fileWatcher = new WorkflowFileWatcher({\n watchDirs: [\n join(projectRoot, '.kb', 'workflows'),\n join(projectRoot, '.kb', 'jobs'),\n ],\n workflowService,\n cronDiscovery,\n cronScheduler,\n logger: createWorkflowLogger('file-watcher', 'workflow.file-watcher'),\n });\n\n bootstrapLogger.info('Creating HTTP server');\n const server = await createServer({\n engine,\n jobBroker,\n workflowService,\n cronScheduler,\n cronDiscovery,\n logger: createWorkflowLogger('api', 'workflow.api'),\n });\n\n await server.listen(getListenOptions(port, host));\n bootstrapLogger.info('HTTP API listening', { port });\n\n bootstrapLogger.info('Creating WorkflowWorker');\n const worker = await createWorkflowWorker({\n engine,\n cliApi,\n logger: createWorkflowLogger('worker', 'workflow.worker'),\n analytics: platform.analytics,\n platform,\n workspaceRoot: projectRoot,\n concurrency: parseInt(process.env.WORKFLOW_CONCURRENCY ?? '5', 10),\n debugMode,\n });\n\n bootstrapLogger.info('Starting WorkflowWorker');\n worker.start().catch((error) => {\n bootstrapLogger.error(\n 'Worker crashed - shutting down daemon',\n error instanceof Error ? error : undefined,\n );\n process.kill(process.pid, 'SIGTERM');\n });\n\n bootstrapLogger.info('Starting CronScheduler');\n await cronScheduler.start();\n\n bootstrapLogger.info('Workflow daemon started successfully', { port });\n\n return async () => {\n bootstrapLogger.warn('Stopping workflow daemon components');\n fileWatcher.close();\n await cronScheduler.stop();\n await worker.stop();\n await server.close();\n await cliApi.dispose();\n // platform.shutdown() is called by runDaemon after this callback returns\n };\n },\n },\n (appId, repoRoot) =>\n createServiceBootstrap({ appId, repoRoot, assemblyHook: makeAssemblyHook() }),\n );\n}\n","#!/usr/bin/env node\n\n/**\n * @module @kb-labs/workflow-daemon\n * Entry point for KB Workflow Daemon\n */\n\nimport { bootstrap } from './bootstrap.js';\n\n(async () => {\n try {\n await bootstrap(process.cwd());\n } catch (error) {\n process.stderr.write(`[workflow-daemon] FATAL: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n})();\n"]}
1
+ {"version":3,"sources":["../src/worker.ts","../src/job-broker.ts","../src/cron-scheduler.ts","../src/cron-discovery.ts","../src/file-watcher.ts","../src/host/workflow-host-service.ts","../src/api/response.ts","../src/api/jobs-api.ts","../src/api/cron-api.ts","../src/api/workflows-api.ts","../src/api/approvals-api.ts","../src/api/stats-api.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["platform","wsProvider","entry","createCorrelatedLogger","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/workflow-daemon/worker\n * WorkflowWorker implementation - processes jobs from WorkflowEngine.\n *\n * The worker orchestrates job/step execution but delegates all code execution\n * to the execution plane (backend.execute). It knows nothing about containers,\n * environments, or workspace provisioning — that's the platform's responsibility.\n */\n\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { logDiagnosticEvent } from '@kb-labs/core-platform';\nimport type { ILogger, IAnalytics, IWorkspaceProvider } from '@kb-labs/core-platform';\nimport type { IExecutionBackend } from '@kb-labs/core-contracts';\nimport type { ExecutionTarget, ExpressionContext, StepSpec, WorkflowRun, JobRun, StepRun } from '@kb-labs/workflow-contracts';\nimport type { ExecutionBackend } from '@kb-labs/plugin-execution';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport {\n buildShellSafeCommand,\n interpolateObject,\n interpolateString,\n evaluateExpression,\n coerceToString,\n} from '@kb-labs/workflow-contracts';\nimport type { GateInput } from '@kb-labs/workflow-steps';\nimport { GateHandler, type GateDecision } from '@kb-labs/workflow-steps';\nimport { SandboxRunner } from '@kb-labs/workflow-runtime';\n\ninterface StepSpecRaw {\n run?: string;\n uses?: string;\n summary?: string;\n with?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface Platform {\n readonly executionBackend: IExecutionBackend;\n readonly hasExecutionBackend: boolean;\n getAdapter<T = unknown>(name: string): T | undefined;\n}\n\nexport interface CreateWorkflowWorkerOptions {\n engine: WorkflowEngine;\n cliApi: IEntityRegistry;\n logger: ILogger;\n platform: Platform;\n workspaceRoot: string;\n concurrency?: number;\n /** Default timeout for step execution (ms). Default: 120000 (2 minutes) */\n defaultTimeout?: number;\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics;\n /**\n * Enable verbose debug logging (inputs, expr context, interpolation details).\n * Defaults to WORKFLOW_DEBUG env var. Pass true to force-enable.\n */\n debugMode?: boolean;\n}\n\nexport interface WorkflowWorker {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\n/**\n * Create a workflow worker that processes jobs from the queue.\n * Uses SandboxRunner with ExecutionBackend for plugin execution.\n *\n * The worker is a pure orchestrator:\n * - Picks jobs from queue, iterates steps sequentially\n * - Delegates execution to backend.execute() (execution plane)\n * - Handles results, marks status, manages retry/failure\n *\n * All provisioning (workspace, environment, cleanup) is handled by the\n * execution plane transparently — the worker doesn't know or care.\n */\nexport async function createWorkflowWorker(\n options: CreateWorkflowWorkerOptions\n): Promise<WorkflowWorker> {\n const {\n engine,\n cliApi,\n logger,\n platform,\n workspaceRoot,\n concurrency = 5,\n defaultTimeout = 120000,\n analytics,\n debugMode = process.env['WORKFLOW_DEBUG'] === 'true',\n } = options;\n\n // Clean up stale worktrees from previous daemon runs on startup.\n const wsProvider = platform.getAdapter<IWorkspaceProvider>('workspace');\n if (wsProvider && typeof (wsProvider as { startupCleanup?: () => Promise<void> }).startupCleanup === 'function') {\n (wsProvider as unknown as { startupCleanup: () => Promise<void> }).startupCleanup().catch(() => {});\n }\n\n let isRunning = false;\n let stopRequested = false;\n\n // Track running jobs for graceful shutdown\n const runningJobs = new Map<string, Promise<void>>();\n\n // In-memory lock to prevent duplicate job processing from concurrent worker loops.\n // zrangebyscore+zrem is not atomic, so multiple workers can dequeue the same entry.\n const claimedJobs = new Set<string>();\n\n // ExecutionBackend from platform — unified across all hosts (CLI, REST API, workflow)\n // In container mode this is a RoutingBackend; in standard mode — in-process/worker-pool.\n const executionBackend = platform.executionBackend;\n\n // Create SandboxRunner with ExecutionBackend\n const runner = new SandboxRunner({\n // IExecutionBackend<unknown> (core-contracts) is structurally compatible with\n // ExecutionBackend (plugin-execution) — both expose the same execute/health/stats/shutdown API.\n backend: executionBackend as unknown as ExecutionBackend,\n cliApi,\n workspaceRoot,\n defaultTimeout,\n });\n\n /**\n * Process a single job from the queue.\n */\n async function processJob(): Promise<boolean> {\n const entry = await engine.nextJob();\n if (!entry) {\n return false; // No job available\n }\n\n // Get run and job from state store using IDs from queue entry\n const run = await engine.getRun(entry.runId);\n if (!run) {\n logger.error('Data inconsistency: Run not found for job entry', undefined, {\n runId: entry.runId,\n jobId: entry.jobId\n });\n return true; // Entry was processed (but run missing - data corruption)\n }\n\n const job = run.jobs.find(j => j.id === entry.jobId);\n if (!job) {\n logger.error('Data inconsistency: Job not found in run', undefined, {\n runId: run.id,\n jobId: entry.jobId\n });\n return true; // Entry was processed (but job missing - data corruption)\n }\n\n const jobKey = `${run.id}:${job.id}`;\n\n // Guard against duplicate processing from concurrent worker loops.\n // zrangebyscore+zrem is not atomic — multiple loops can dequeue the same entry.\n if (claimedJobs.has(jobKey)) {\n return true; // Another loop already claimed this job\n }\n claimedJobs.add(jobKey);\n\n const waitMs = job.queuedAt ? Date.now() - new Date(job.queuedAt).getTime() : undefined;\n logger.info('Job picked from queue', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n queuedAt: job.queuedAt,\n waitMs,\n });\n\n const jobStartTime = Date.now();\n const jobLogger = createCorrelatedLogger(logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service: 'worker',\n requestId: run.id,\n traceId: run.id,\n operation: 'workflow.job',\n bindings: {\n workflowId: run.id,\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n },\n });\n\n jobLogger.info('Processing job', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n });\n\n // Mark job as started (sets startedAt timestamp)\n await engine.markJobStarted(run.id, job.id);\n\n // Track job processing started\n analytics?.track('workflow.worker.job.started', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n stepCount: job.steps.length,\n }).catch(() => {});\n\n // Resolve target hint from workflow spec (explicit override for execution plane)\n const runTarget = (run.metadata as Record<string, unknown> | undefined)?.target as ExecutionTarget | undefined;\n const jobTarget = job.target as ExecutionTarget | undefined;\n const target = jobTarget ?? runTarget;\n\n // ── Workspace provisioning (worktree/container/remote) ──\n // If platform has a workspace provider, create an isolated workspace for this run.\n // All steps will execute in the provisioned workspace instead of the host workspace.\n const wsProvider = platform.getAdapter<IWorkspaceProvider>('workspace');\n // Without a workspace adapter, run steps in the project directory.\n // KB_PROJECT_ROOT is injected by kb-dev; fall back to workspaceRoot (platform dir) only\n // when running outside of kb-dev (e.g. tests or direct node invocation).\n let runWorkspace = wsProvider\n ? workspaceRoot\n : (process.env['KB_PROJECT_ROOT'] ?? workspaceRoot);\n let provisionedWorkspaceId: string | undefined;\n\n if (wsProvider) {\n const wsId = `wt_${run.id.slice(0, 8)}`;\n try {\n // Deterministic workspaceId per run — retries reuse the same worktree\n const ws = await wsProvider.materialize({\n workspaceId: wsId,\n sourceRef: 'main',\n metadata: { runId: run.id, jobId: job.id },\n onProgress: (event) => {\n jobLogger.info(`[workspace] ${event.stage}: ${event.message}`, {\n stage: event.stage,\n progress: event.progress,\n });\n },\n });\n if (ws.rootPath) {\n runWorkspace = ws.rootPath;\n provisionedWorkspaceId = ws.workspaceId;\n jobLogger.info('Workspace provisioned', {\n workspaceId: ws.workspaceId,\n provider: ws.provider,\n rootPath: ws.rootPath,\n });\n }\n } catch (wsError) {\n const msg = wsError instanceof Error ? wsError.message : String(wsError);\n logDiagnosticEvent(jobLogger, {\n domain: 'workflow',\n event: 'workflow.workspace.provision',\n level: 'error',\n reasonCode: inferWorkspaceProvisionReasonCode(msg),\n message: 'Workspace provisioning failed',\n outcome: 'failed',\n error: wsError instanceof Error ? wsError : new Error(String(wsError)),\n serviceId: 'workflow',\n stage: 'materialize',\n evidence: {\n runId: run.id,\n jobId: job.id,\n workspaceId: wsId,\n },\n });\n const provisionErr = new Error(`Workspace provisioning failed: ${msg}`);\n await engine.markJobFailed(run.id, job.id, provisionErr);\n claimedJobs.delete(jobKey);\n return true;\n }\n }\n\n // Create job execution promise for graceful shutdown tracking\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Step execution loop: handles data flow, spec.if, builtin:approval polling, builtin:gate routing with restart-from\n let failedStepFailure: import('@kb-labs/core-contracts').ClassifiedFailure | undefined;\n let failedStepRetry: typeof job.steps[number]['spec']['retry'] | undefined;\n\n const jobPromise = (async () => {\n try {\n // Execute job steps using SandboxRunner\n // IMPORTANT: Steps MUST run sequentially because:\n // - Step outputs are inputs for next steps\n // - Steps may have side effects that depend on order\n // - Workflow semantics require sequential execution\n let wasCancelled = false;\n for (const step of job.steps) {\n if (step.status === 'success') {\n continue; // Skip already completed steps\n }\n\n // --- Build ExpressionContext from fresh run state ---\n const freshRun = await engine.getRun(run.id);\n\n if (freshRun?.status === 'cancelled') {\n jobLogger.info('[worker] Run cancelled — stopping step execution', {\n runId: run.id,\n jobId: job.id,\n });\n wasCancelled = true;\n break;\n }\n\n const exprCtx: ExpressionContext = {\n env: freshRun?.env ?? {},\n trigger: freshRun?.trigger ?? { type: 'manual' },\n inputs: freshRun?.inputs ?? {},\n steps: {},\n };\n\n // Collect outputs from all completed steps (across all jobs).\n // Failed approval steps also expose their outputs so the following gate\n // can read `outputs.action === 'reject'` and route correctly.\n if (freshRun) {\n for (const j of freshRun.jobs) {\n for (const s of j.steps) {\n if (s.status === 'success' && s.spec.id) {\n exprCtx.steps[s.spec.id] = {\n outputs: (s.outputs ?? {}) as Record<string, unknown>,\n };\n } else if (\n s.status === 'failed' &&\n s.spec.uses === 'builtin:approval' &&\n s.spec.id &&\n s.outputs\n ) {\n // Rejected approval — gate needs to see action/comment to route\n exprCtx.steps[s.spec.id] = {\n outputs: s.outputs as Record<string, unknown>,\n };\n }\n }\n }\n }\n\n // --- Evaluate spec.if (skip step if condition is false) ---\n if (step.spec.if) {\n const condition = step.spec.if;\n // Strip ${{ }} wrapper if present\n const rawExpr = condition.trim().replace(/^\\$\\{\\{\\s*/, '').replace(/\\s*\\}\\}$/, '');\n const shouldRun = evaluateExpression(rawExpr, exprCtx);\n if (!shouldRun) {\n jobLogger.info('[step] Skipped: condition evaluated to false', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n stepIndex: step.index,\n condition: rawExpr,\n evaluatedContext: {\n inputs: exprCtx.inputs,\n steps: exprCtx.steps,\n env: exprCtx.env,\n },\n });\n await engine.markStepCompleted(run.id, job.id, step.id, { skipped: true });\n continue;\n }\n }\n\n // Debug: dump expression context (available to all ${{ }} expressions in this step)\n if (debugMode) {\n jobLogger.info('[debug] Expression context for step', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepUses: step.spec.uses,\n exprCtx: {\n inputs: exprCtx.inputs,\n steps: exprCtx.steps,\n env: exprCtx.env,\n },\n });\n }\n\n // --- Interpolate spec.with (data flow between steps) ---\n // For builtin:shell steps: apply shell-safe command building so that user-supplied\n // values (e.g. issue titles containing backticks or $()) are injected as env vars\n // (_WF_* prefix) rather than substituted directly into the script string.\n // Shell expansion of ${VAR} does NOT re-evaluate backticks or $() in the value.\n let interpolatedWith = step.spec.with\n ? interpolateObject(step.spec.with as Record<string, unknown>, exprCtx)\n : undefined;\n if (step.spec.uses === 'builtin:shell' && typeof step.spec.with?.['command'] === 'string') {\n const rawCommand = step.spec.with['command'] as string;\n const { command: safeCommand, shellEnvVars } = buildShellSafeCommand(rawCommand, exprCtx);\n interpolatedWith = {\n ...(interpolatedWith ?? {}),\n command: safeCommand,\n env: {\n ...Object.fromEntries(\n Object.entries((interpolatedWith?.['env'] as Record<string, unknown> | undefined) ?? {})\n .map(([k, v]) => [k, coerceToString(v)])\n ),\n ...shellEnvVars,\n },\n };\n }\n\n // --- Interpolate spec.env and forward to shell handler ---\n // step.spec.env values may contain ${{ }} expressions. Interpolate them\n // and pass as with.env so builtin:shell merges them into process.env.\n // coerceToString ensures object/array inputs become valid JSON strings\n // rather than \"[object Object]\" when assigned to env vars.\n const interpolatedEnvRaw = step.spec.env\n ? interpolateObject(step.spec.env as Record<string, unknown>, exprCtx)\n : undefined;\n const interpolatedEnv: Record<string, string> | undefined = interpolatedEnvRaw\n ? Object.fromEntries(\n Object.entries(interpolatedEnvRaw).map(([k, v]) => [k, coerceToString(v)])\n )\n : undefined;\n\n // Debug: show raw spec.with vs resolved interpolatedWith\n if (debugMode && step.spec.with) {\n jobLogger.info('[debug] Step input interpolation', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n rawWith: step.spec.with,\n resolvedWith: interpolatedWith,\n });\n }\n\n const stepExecutionId = `wf-${run.id}-${job.id}-${step.id}-${Date.now()}`;\n const stepLogger = jobLogger.child({\n operation: 'workflow.step',\n stepId: step.id,\n stepName: step.name,\n stepIndex: step.index,\n attempt: job.attempt ?? 1,\n executionId: stepExecutionId,\n spanId: stepExecutionId,\n invocationId: stepExecutionId,\n });\n\n // Persist resolved inputs into step.resolvedInputs — a separate field that\n // does NOT mutate spec.with. This preserves the original ${{ }} templates so\n // gate restartFrom cycles can re-interpolate the step correctly on each pass.\n if (interpolatedWith) {\n const stateStore = engine.getStateStore();\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.resolvedInputs = interpolatedWith;\n });\n }\n\n stepLogger.info('Executing step', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n uses: step.spec.uses,\n // Log resolved inputs so failures are debuggable without a debug flag.\n // Sensitive values (tokens, secrets) will appear here — acceptable for\n // server-side structured logs; do not surface in public UI.\n inputs: interpolatedWith,\n });\n\n // --- Handle builtin:approval ---\n if (step.spec.uses === 'builtin:approval') {\n if (step.status === 'failed') {\n // Already rejected (daemon restarted after resolution) — let gate route.\n stepLogger.info('Approval already rejected — skipping to gate', { runId: run.id, stepId: step.id });\n continue;\n }\n if (step.status !== 'waiting_approval') {\n await engine.markStepWaitingApproval(run.id, job.id, step.id);\n }\n const approvalResult = await waitForApproval(\n engine, run.id, job.id, step, interpolatedWith as Record<string, unknown> | undefined,\n () => stopRequested, stepLogger,\n );\n if (approvalResult === 'interrupted') { return; }\n continue; // Outputs already set by resolveApproval\n }\n\n // --- Handle builtin:gate ---\n if (step.spec.uses === 'builtin:gate') {\n const gateInput = (interpolatedWith ?? {}) as unknown as GateInput;\n // Iteration counter lives in step.metadata so it survives restarts without\n // polluting run.metadata. Runs started before this change lose their counter\n // (reset to 0) — extra iterations are safer than silent skips.\n const currentIteration = (step.metadata?.['iterations'] as number) ?? 0;\n\n // Valid restart targets: steps within this job (same-job restart)\n // OR another job by name (cross-job restart — e.g. quality gate\n // routing back to `agent-execute`). Passing them lets the gate fail\n // honestly on a target that matches neither, instead of silently\n // completing (false green).\n const sameJobStepIds = job.steps.flatMap((s) =>\n [s.id, s.spec.id].filter((v): v is string => typeof v === 'string'),\n );\n const jobNames = (freshRun?.jobs ?? run.jobs).map((j) => j.jobName);\n const validRestartTargets = [...sameJobStepIds, ...jobNames];\n\n const decision = new GateHandler().handle(gateInput, exprCtx, currentIteration, validRestartTargets);\n stepLogger.info('[gate] Evaluating gate decision', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n expression: gateInput.decision,\n action: decision.action,\n iteration: currentIteration,\n });\n\n if (decision.action === 'continue') {\n await engine.markStepCompleted(run.id, job.id, step.id, decision.outputs);\n continue;\n }\n if (decision.action === 'fail') {\n stepLogger.error('[gate] Gate condition failed, aborting job', decision.error, {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n });\n await engine.markStepFailed(run.id, job.id, step.id, decision.error, decision.outputs);\n throw decision.error;\n }\n if (decision.action === 'skip') {\n await applyGateSkip(engine, run, job, step, decision, stepLogger);\n return;\n }\n // restart\n await applyGateRestart(engine, run, job, step, decision, stepLogger);\n return;\n }\n\n // --- Regular step execution ---\n // Mark step as started (sets startedAt timestamp)\n const stepStartTime = Date.now();\n await engine.markStepStarted(run.id, job.id, step.id);\n\n // Build spec with interpolated `with`, `run`, and `summary`.\n // Normalize `run: cmd` → `uses: builtin:shell, with: { command: cmd }`\n // Interpolate the run string so ${{ inputs.* }}, ${{ steps.* }} etc. are resolved.\n // StepSpec (post-zod-transform) may omit `run` after normalization, so work\n // with the StepSpecRaw shape here before re-casting to StepSpec for execution.\n // Note: run: blocks are normalized to uses: builtin:shell by the Zod schema transform\n // at parse time. Shell-safe command building for builtin:shell is applied above\n // via buildShellSafeCommand when computing interpolatedWith.\n let baseSpec: StepSpecRaw = step.spec as StepSpecRaw;\n if (baseSpec.run && !baseSpec.uses) {\n // Legacy path: step.spec was not normalized (should not happen after schema v2+)\n const { run: rawRun, with: existingWith, ...rest } = baseSpec;\n const { command, shellEnvVars } =\n typeof rawRun === 'string'\n ? buildShellSafeCommand(rawRun, exprCtx)\n : { command: rawRun, shellEnvVars: {} };\n baseSpec = {\n ...rest,\n uses: 'builtin:shell',\n with: { ...existingWith, command, env: { ...(existingWith?.['env'] as Record<string, string> | undefined ?? {}), ...shellEnvVars } },\n };\n }\n // Interpolate the summary field so ${{ inputs.* }} resolves in step descriptions shown in Studio.\n if (typeof baseSpec.summary === 'string') {\n baseSpec.summary = interpolateString(baseSpec.summary, exprCtx);\n }\n // Merge interpolated env into with.env for builtin:shell (ShellInput.env).\n const specWithEnv = interpolatedEnv\n ? { ...baseSpec, with: { ...(baseSpec.with ?? {}), env: { ...(baseSpec.with?.['env'] as Record<string, string> | undefined ?? {}), ...interpolatedEnv } } }\n : baseSpec;\n const interpolatedSpec = interpolatedWith\n ? {\n ...specWithEnv,\n with: {\n ...(specWithEnv.with ?? {}),\n ...interpolatedWith,\n // spec.env (interpolatedEnv) must survive the spread of interpolatedWith.env\n ...(interpolatedEnv\n ? { env: { ...(interpolatedWith['env'] as Record<string, string> | undefined ?? {}), ...interpolatedEnv } }\n : {}),\n },\n }\n : specWithEnv;\n\n // Delegate execution to the execution plane.\n // The platform handles provisioning (workspace, environment, cleanup) transparently.\n const result = await runner.execute({\n spec: interpolatedSpec as StepSpec,\n context: {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n attempt: 1,\n env: {\n // KB_PLATFORM_ROOT: where platform code (dist/, node_modules) lives.\n // Shell steps can use this to reference platform commands when the\n // worktree doesn't have compiled dist/ directories.\n KB_PLATFORM_ROOT: workspaceRoot,\n // KB_WORKSPACE_ROOT: the worktree (or project dir when no worktree is used).\n // Scripts cd into this path before invoking agents or running git commands.\n KB_WORKSPACE_ROOT: runWorkspace,\n ...(freshRun?.env || {}),\n },\n // Secrets resolution not yet implemented: run.secrets contains names only.\n // When a platform secrets store is available, resolve names → values here.\n secrets: ((): Record<string, string> => {\n const names = freshRun?.secrets ?? []\n if (names.length > 0) {\n stepLogger.warn('Step declares secrets but secret resolution is not implemented', { secrets: names })\n }\n return {}\n })(),\n logger: {\n debug: (message: string, meta?: Record<string, unknown>) => stepLogger.debug(message, meta),\n info: (message: string, meta?: Record<string, unknown>) => stepLogger.info(message, meta),\n warn: (message: string, meta?: Record<string, unknown>) => stepLogger.warn(message, meta),\n error: (message: string, meta?: Record<string, unknown>) => stepLogger.error(message, undefined, meta),\n },\n trace: {\n traceId: run.id,\n spanId: stepExecutionId,\n parentSpanId: job.id,\n },\n // stepLogger as loggerOverride: ctx.logger.* in the plugin will use stepLogger\n // as its base, writing to SQLite with runId/jobId/stepId context.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n loggerOverride: stepLogger,\n // ui/shell log entries: persist to SQLite with workflow context + publish for SSE.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n onLog: (entry) => {\n stepLogger.info(entry.message, {\n stream: entry.stream,\n lineNo: entry.lineNo,\n logSource: entry.stream === 'stderr' ? 'stderr' : 'stdout',\n });\n void engine.publishLog(run.id, job.id, step.id, entry, step.name);\n },\n // ctx.logger.* entries: stepLogger base already wrote to SQLite. Only publish for SSE.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n onLoggerLog: (entry) => {\n void engine.publishLog(run.id, job.id, step.id, entry, step.name);\n },\n },\n // Scripts (.kb/workflows/scripts/*.sh) live in the project root, not the worktree.\n // Use workspaceRoot as cwd so relative paths like `bash .kb/workflows/scripts/...`\n // resolve correctly. Scripts that need to operate inside the worktree cd into\n // KB_WORKSPACE_ROOT themselves (agent scripts, git operations).\n workspace: workspaceRoot,\n target,\n });\n\n if (result.status === 'failed') {\n const stepDurationMs = Date.now() - stepStartTime;\n const error = new Error(result.error?.message ?? 'Step execution failed');\n\n // Mark step as failed (sets finishedAt timestamp + error)\n await engine.markStepFailed(run.id, job.id, step.id, error);\n failedStepFailure = result.failure;\n failedStepRetry = step.spec.retry;\n\n stepLogger.error('Step failed', error, {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n uses: step.spec.uses,\n durationMs: stepDurationMs,\n resolvedInputs: interpolatedWith,\n errorCode: result.error?.code,\n });\n\n if (step.continueOnError) {\n stepLogger.warn('[step] continueOnError=true — continuing despite failure', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n continue;\n }\n throw error;\n }\n\n const stepOutputs = result.status === 'success' ? result.outputs : undefined;\n\n // Mark step as completed (sets finishedAt timestamp + outputs)\n await engine.markStepCompleted(run.id, job.id, step.id, stepOutputs);\n\n stepLogger.info('Step completed', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n\n // Debug: show what outputs are now available to downstream steps\n if (debugMode && stepOutputs) {\n stepLogger.info('[debug] Step outputs', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n outputs: stepOutputs,\n });\n }\n }\n \n\n // Mark job terminal state: interrupted if run was cancelled, completed otherwise.\n if (wasCancelled) {\n await engine.markJobInterrupted(run.id, job.id);\n jobLogger.info('Job interrupted due to run cancellation', {\n runId: run.id,\n jobId: job.id,\n });\n return;\n }\n\n await engine.markJobCompleted(run.id, job.id);\n\n const jobDuration = Date.now() - jobStartTime;\n jobLogger.info('Job completed successfully', {\n runId: run.id,\n jobId: job.id,\n });\n\n // Track job processing completed\n analytics?.track('workflow.worker.job.completed', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n durationMs: jobDuration,\n stepCount: job.steps.length,\n }).catch(() => {});\n\n // Release workspace on success (cleanup worktree)\n if (provisionedWorkspaceId && wsProvider) {\n try {\n await wsProvider.release(provisionedWorkspaceId);\n jobLogger.info('Workspace released', { workspaceId: provisionedWorkspaceId });\n } catch (releaseErr) {\n jobLogger.warn('Workspace release failed', {\n workspaceId: provisionedWorkspaceId,\n error: releaseErr instanceof Error ? releaseErr.message : String(releaseErr),\n });\n }\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const jobDuration = Date.now() - jobStartTime;\n\n const retryPolicy = failedStepRetry ?? job.retries;\n await engine.markJobFailed(run.id, job.id, err, failedStepFailure, retryPolicy);\n\n // Track job processing failed\n analytics?.track('workflow.worker.job.failed', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n errorMessage: err.message,\n durationMs: jobDuration,\n }).catch(() => {});\n\n // Keep workspace on failure for debugging\n if (provisionedWorkspaceId) {\n jobLogger.warn('Workspace kept for debugging', {\n workspaceId: provisionedWorkspaceId,\n path: runWorkspace,\n });\n }\n } finally {\n // Remove from tracking\n runningJobs.delete(jobKey);\n claimedJobs.delete(jobKey);\n }\n })();\n\n // Track running job\n runningJobs.set(jobKey, jobPromise);\n\n // Wait for completion\n await jobPromise;\n\n return true;\n }\n\n /**\n * Worker loop - continuously processes jobs from the queue.\n */\n async function workerLoop(): Promise<void> {\n // IMPORTANT: This is a polling loop, must run sequentially\n\n while (isRunning && !stopRequested) {\n try {\n const processed = await processJob();\n\n if (!processed) {\n // No job available, wait before polling again\n await sleep(1000);\n }\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'workflow',\n event: 'workflow.worker.loop',\n level: 'error',\n reasonCode: 'worker_loop_error',\n message: 'Worker loop error',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'workflow',\n evidence: {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n },\n });\n await sleep(5000); // Wait longer on error\n }\n }\n\n\n logger.info('Worker loop stopped');\n }\n\n return {\n async start() {\n if (isRunning) {\n logger.warn('Worker already running');\n return;\n }\n\n logger.info('Starting workflow worker', { concurrency });\n isRunning = true;\n stopRequested = false;\n\n // Track worker start\n analytics?.track('workflow.worker.started', {\n concurrency,\n }).catch(() => {});\n\n // Start multiple worker loops for concurrency\n const promises: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n promises.push(workerLoop());\n }\n\n await Promise.all(promises);\n },\n\n async stop() {\n if (!isRunning) {\n return;\n }\n\n logger.info('Stopping workflow worker', {\n runningJobsCount: runningJobs.size,\n });\n\n // Signal stop\n stopRequested = true;\n isRunning = false;\n\n // Wait for in-flight jobs to complete (graceful shutdown)\n if (runningJobs.size > 0) {\n logger.info('Waiting for in-flight jobs to complete', {\n count: runningJobs.size,\n });\n\n const shutdownTimeoutMs = parseInt(\n process.env.WORKFLOW_SHUTDOWN_TIMEOUT_MS || '120000',\n 10\n );\n\n try {\n // Wait for all running jobs with timeout\n await Promise.race([\n Promise.all(Array.from(runningJobs.values())),\n sleep(shutdownTimeoutMs),\n ]);\n\n if (runningJobs.size > 0) {\n logger.warn('Shutdown timeout reached, marking jobs as interrupted', {\n count: runningJobs.size,\n });\n\n // Mark unfinished jobs as interrupted (parallel for speed)\n await Promise.all(\n Array.from(runningJobs.keys()).map(async (jobKey) => {\n const [runId, jobId] = jobKey.split(':');\n if (runId && jobId) {\n await engine.markJobInterrupted(runId, jobId);\n }\n })\n );\n } else {\n logger.info('All in-flight jobs completed gracefully');\n }\n } catch (error) {\n logger.error('Error during graceful shutdown', error instanceof Error ? error : undefined, {\n runningJobsCount: runningJobs.size,\n });\n }\n }\n\n logger.info('Workflow worker stopped');\n\n // Track worker stop\n analytics?.track('workflow.worker.stopped', {\n gracefulShutdown: runningJobs.size === 0,\n interruptedJobs: runningJobs.size,\n }).catch(() => {});\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Poll until an approval step is resolved or a stop signal is received.\n * Returns 'done' when the approval is granted or rejected, 'interrupted' on shutdown.\n */\nasync function waitForApproval(\n engine: WorkflowEngine,\n runId: string,\n jobId: string,\n step: Pick<StepRun, 'id' | 'name'>,\n interpolatedWith: Record<string, unknown> | undefined,\n isStopRequested: () => boolean,\n stepLogger: ILogger,\n): Promise<'done' | 'interrupted'> {\n const approvalTimeoutMs = interpolatedWith?.['timeoutMs'];\n if (!approvalTimeoutMs) {\n stepLogger.warn('[approval] No timeout configured — approval may wait indefinitely', {\n runId,\n jobId,\n stepId: step.id,\n stepName: step.name,\n });\n }\n\n stepLogger.info('[approval] Waiting for approval', {\n runId,\n jobId,\n stepId: step.id,\n stepName: step.name,\n context: interpolatedWith,\n });\n\n const approvalStartMs = Date.now();\n let pollCount = 0;\n\n while (!isStopRequested()) {\n await sleep(2000);\n pollCount++;\n const currentRun = await engine.getRun(runId);\n\n // If the run is cancelled, treat it as an interruption — do NOT proceed as\n // if the approval was granted. A cancelled run must never bypass human gates.\n if (currentRun?.status === 'cancelled') {\n stepLogger.info('[approval] Run cancelled — treating as interrupted, NOT approved', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n return 'interrupted';\n }\n\n const currentJob = currentRun?.jobs.find(j => j.id === jobId);\n const currentStep = currentJob?.steps.find(s => s.id === step.id);\n\n if (!currentStep || currentStep.status === 'success') {\n stepLogger.info('[approval] Approval granted', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n break;\n }\n\n if (currentStep.status === 'failed') {\n // Approval was rejected — break so the following builtin:gate step can route.\n stepLogger.info('[approval] Approval rejected', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n });\n break;\n }\n\n if (pollCount % 10 === 0) {\n stepLogger.info('[approval] Still waiting for approval', {\n runId,\n stepId: step.id,\n stepName: step.name,\n waitedMs: Date.now() - approvalStartMs,\n pollCount,\n });\n }\n }\n\n if (isStopRequested()) {\n stepLogger.info('Approval wait interrupted by shutdown', { stepId: step.id });\n return 'interrupted';\n }\n return 'done';\n}\n\ntype GateRestartDecision = Extract<GateDecision, { action: 'restart' }>;\ntype GateSkipDecision = Extract<GateDecision, { action: 'skip' }>;\n\n/**\n * Apply gate skip: mark the gate and all intermediate steps as skipped, then re-enqueue the job.\n * The job loop will resume from skipTo because all preceding steps are already 'success'.\n * Called when GateHandler returns action='skip'.\n */\nasync function applyGateSkip(\n engine: WorkflowEngine,\n run: WorkflowRun,\n job: JobRun,\n step: Pick<StepRun, 'id' | 'name'>,\n decision: GateSkipDecision,\n stepLogger: ILogger,\n): Promise<void> {\n const { skipTo, outputs } = decision;\n\n stepLogger.info('[gate] Gate triggered skip-forward', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n skipTo,\n });\n\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n\n // Mark the gate step itself as completed\n await engine.markStepCompleted(run.id, job.id, step.id, outputs);\n\n // Mark all steps between gate and skipTo target as skipped\n let pastGate = false;\n for (const s of job.steps) {\n if (s.id === step.id) {\n pastGate = true;\n continue; // gate is already marked completed above\n }\n if (!pastGate) {continue;}\n if (s.spec.id === skipTo || s.id === skipTo) {break;} // stop at target (inclusive — don't skip it)\n await stateStore.updateStep(run.id, job.id, s.id, (draft) => {\n draft.status = 'success';\n draft.outputs = { skipped: true };\n draft.startedAt = new Date().toISOString();\n draft.finishedAt = new Date().toISOString();\n });\n }\n\n // Re-enqueue so the job loop restarts from a fresh snapshot and sees updated statuses\n const freshRun = await engine.getRun(run.id);\n const freshJob = freshRun?.jobs.find((j) => j.id === job.id);\n if (freshJob) {\n await scheduler.enqueueJob(run.id, freshJob, freshJob.priority ?? 'normal');\n }\n\n stepLogger.info('[gate] Skip applied — re-enqueued job at skipTo target', {\n runId: run.id,\n skipTo,\n });\n}\n\n/**\n * Apply gate restart: persist iteration counter to step.metadata, reset steps to queued, re-enqueue job.\n * Called when GateHandler returns action='restart'.\n */\nasync function applyGateRestart(\n engine: WorkflowEngine,\n run: WorkflowRun,\n job: JobRun,\n step: Pick<StepRun, 'id' | 'name'>,\n decision: GateRestartDecision,\n stepLogger: ILogger,\n): Promise<void> {\n const { restartFrom, context, outputs, nextIteration } = decision;\n\n // Collect steps that will be reset for logging\n const stepsToReset: string[] = [];\n for (const s of job.steps) {\n if (s.spec.id === restartFrom || s.id === restartFrom) {\n stepsToReset.push(s.name ?? s.id);\n } else if (stepsToReset.length > 0) {\n stepsToReset.push(s.name ?? s.id);\n }\n }\n\n stepLogger.warn('[gate] Gate triggered restart', {\n runId: run.id,\n stepId: step.id,\n stepName: step.name,\n restartFrom,\n iteration: nextIteration,\n stepsToReset,\n });\n\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n\n // Persist iteration counter on the gate step. The step reset below clears\n // status/timing/outputs but NOT metadata, so the counter survives.\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.metadata = { ...(draft.metadata ?? {}), iterations: nextIteration };\n });\n\n // Merge rework feedback into trigger.payload so the restarted job's steps can\n // read it via ${{ trigger.payload.* }} — this survives the reset (whereas\n // steps.*.outputs do not, once the producing steps are reset to queued).\n if (context) {\n await engine.updateRun(run.id, (draft) => {\n const payload = (draft.trigger.payload ?? {}) as Record<string, unknown>;\n Object.assign(payload, context);\n draft.trigger.payload = payload;\n return draft;\n });\n }\n\n // Is restartFrom a step in THIS job (same-job) or another job by name (cross-job)?\n const sameJobTarget = job.steps.some((s) => s.spec.id === restartFrom || s.id === restartFrom);\n\n if (!sameJobTarget) {\n // ── Cross-job restart (e.g. quality gate → agent-execute) ────────────────\n // Reset the target job and every job transitively downstream of it\n // (including this gate's own job), then re-enqueue the target. When it\n // completes, the engine releases its blocked dependents in DAG order:\n // agent re-runs (with feedback) → quality re-runs → gate re-evaluates.\n const fresh = (await engine.getRun(run.id)) ?? run;\n const resetNames = new Set<string>([restartFrom]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const j of fresh.jobs) {\n if (resetNames.has(j.jobName)) {\n continue;\n }\n if ((j.needs ?? []).some((n) => resetNames.has(n))) {\n resetNames.add(j.jobName);\n changed = true;\n }\n }\n }\n\n for (const rj of fresh.jobs) {\n if (!resetNames.has(rj.jobName)) {\n continue;\n }\n // A reset job re-blocks only on needs that are themselves being reset;\n // dependencies outside the reset set already completed and stay satisfied.\n const pending = (rj.needs ?? []).filter((n) => resetNames.has(n));\n for (const s of rj.steps) {\n await stateStore.updateStep(run.id, rj.id, s.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.error = undefined;\n draft.outputs = undefined;\n });\n }\n await stateStore.updateJob(run.id, rj.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.pendingDependencies = [...pending];\n draft.blocked = pending.length > 0;\n });\n }\n\n const refreshed = await engine.getRun(run.id);\n const targetJob = refreshed?.jobs.find((j) => j.jobName === restartFrom);\n if (targetJob && !targetJob.blocked) {\n await scheduler.enqueueJob(run.id, targetJob, targetJob.priority ?? 'normal');\n }\n stepLogger.warn('[gate] Cross-job restart re-enqueued target', {\n runId: run.id,\n restartFrom,\n iteration: nextIteration,\n resetJobs: [...resetNames],\n });\n return;\n }\n\n // ── Same-job restart ───────────────────────────────────────────────────────\n await engine.markStepCompleted(run.id, job.id, step.id, outputs);\n\n let foundTarget = false;\n for (const s of job.steps) {\n if (s.spec.id === restartFrom || s.id === restartFrom) {\n foundTarget = true;\n }\n if (foundTarget) {\n await stateStore.updateStep(run.id, job.id, s.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n draft.error = undefined;\n draft.outputs = undefined;\n });\n }\n }\n\n await stateStore.updateJob(run.id, job.id, (draft) => {\n draft.status = 'queued';\n draft.startedAt = undefined;\n draft.finishedAt = undefined;\n });\n\n const updatedRun = await engine.getRun(run.id);\n const updatedJob = updatedRun?.jobs.find((j) => j.id === job.id);\n if (updatedJob) {\n await scheduler.enqueueJob(run.id, updatedJob, updatedJob.priority ?? 'normal');\n stepLogger.info('[gate] Job re-enqueued for restart', {\n runId: run.id,\n jobId: job.id,\n jobName: job.jobName,\n iteration: nextIteration,\n restartFrom,\n });\n }\n}\n\nfunction inferWorkspaceProvisionReasonCode(message: string) {\n return /ETIMEDOUT|timeout/iu.test(message)\n ? 'workspace_provision_timeout'\n : 'workspace_provision_failed';\n}\n","/**\n * @module @kb-labs/workflow-daemon/job-broker\n * JobBroker implementation - facade for background job operations\n * Specification: kb-labs-mind/docs/adr/0034-job-broker-cron-scheduler.md\n */\n\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { WorkflowRun, WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { ILogger, LogLevel } from '@kb-labs/core-platform';\nimport type { PlatformContainer } from '@kb-labs/core-runtime';\n\nexport interface SubmitJobRequest {\n handler: string;\n input?: Record<string, unknown>;\n priority?: 'low' | 'normal' | 'high';\n metadata?: Record<string, unknown>;\n}\n\n/**\n * JobBroker - Facade for workflow engine operations.\n * Converts job requests to WorkflowSpec and delegates to WorkflowEngine.\n */\nexport class JobBroker {\n constructor(\n private readonly engine: WorkflowEngine,\n private readonly logger: ILogger,\n private readonly platform: PlatformContainer,\n ) {}\n\n /**\n * Submit a background job for execution.\n * Creates a WorkflowSpec with a single job and submits to WorkflowEngine.\n */\n async submit(request: SubmitJobRequest): Promise<WorkflowRun> {\n this.logger.info('Submitting background job', {\n handler: request.handler,\n priority: request.priority ?? 'normal',\n });\n\n // Convert to WorkflowSpec\n // Handler can be in format:\n // - \"command:name\" for CLI commands (e.g., \"command:mind:rag-index\")\n // - \"plugin:id/handler\" for workflow handlers\n // - \"builtin:shell\" for shell execution\n // If no prefix, assume it's a CLI command for backward compatibility\n const uses = request.handler.includes(':')\n ? request.handler\n : `command:${request.handler}`;\n\n const spec: WorkflowSpec = {\n name: `job-${request.handler}`,\n version: '1.0.0',\n on: { manual: true },\n jobs: {\n main: {\n runsOn: 'local',\n steps: [\n {\n id: 'execute',\n name: 'Execute handler',\n uses,\n with: request.input ?? {},\n },\n ],\n },\n },\n };\n\n const run = await this.engine.runFromInline(spec, {\n trigger: { type: 'manual' as const },\n env: {},\n metadata: request.metadata,\n });\n\n this.logger.info('Background job submitted', {\n runId: run.id,\n handler: request.handler,\n status: run.status,\n });\n\n return run;\n }\n\n /**\n * Get job status by run ID.\n */\n async getStatus(runId: string): Promise<WorkflowRun | null> {\n return this.engine.getRun(runId);\n }\n\n /**\n * Cancel a running job.\n */\n async cancel(runId: string): Promise<void> {\n await this.engine.cancelRun(runId);\n this.logger.info('Job cancelled', { runId });\n }\n\n /**\n * Query logs for a specific run, with optional step-level filtering.\n * Used by GET /api/v1/runs/:runId/logs?stepId=...\n */\n async getRunLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n return this._queryLogs(runId, options);\n }\n\n /**\n * Get job logs by run ID.\n * Returns execution logs with optional filtering by level and pagination.\n * Uses platform.logs service to query logs by runId metadata.\n */\n async getJobLogs(\n runId: string,\n options?: { limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n return this._queryLogs(runId, options);\n }\n\n /**\n * Internal: query + filter logs for a given run (optionally narrow to one step).\n */\n private async _queryLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<{ timestamp: string; level: string; message: string; stepId?: string; stepName?: string; stream?: string; context?: Record<string, unknown> }>> {\n const run = await this.engine.getRun(runId);\n\n if (!run) {\n return [];\n }\n\n // Build stepId → stepName lookup from the run snapshot for human-readable log lines\n const stepNameMap = new Map<string, string>();\n for (const job of run.jobs ?? []) {\n for (const step of job.steps ?? []) {\n if (step.id && step.name) {\n stepNameMap.set(step.id, step.name);\n }\n }\n }\n\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n // Calculate time window of the run\n const startTime = run.startedAt\n ? new Date(run.startedAt).getTime()\n : Date.now() - 3_600_000; // 1-hour fallback\n const endTime = run.finishedAt ? new Date(run.finishedAt).getTime() : Date.now();\n\n // Query a wide batch from the log store.\n // Guard against the log backend being unavailable (e.g. no logRingBuffer or\n // logPersistence adapter configured) — HybridLogReader.query() throws\n // \"No log storage backend available\" in that case. Return empty array so the\n // endpoint responds with 200+[] instead of 500.\n let queryResult: { logs?: unknown[] } = { logs: [] };\n try {\n queryResult = await this.platform.logs.query(\n {\n from: startTime,\n to: endTime,\n level: options?.level && options.level !== 'all' ? options.level as LogLevel : undefined,\n },\n {\n limit: 2000,\n offset: 0,\n },\n );\n } catch {\n this.logger.warn('Log backend unavailable — returning empty log list for run', { runId });\n }\n\n type LogEntry = {\n timestamp: number;\n level: string;\n message: string;\n fields: Record<string, unknown>;\n };\n\n // Filter by runId, then optionally by stepId.\n // queryResult.logs may be null/undefined when the log adapter returns an\n // empty result set (e.g. noop adapter in worker-pool mode) — guard with ??.\n const filtered = ((queryResult.logs ?? []) as LogEntry[]).filter((log) => {\n // Guard against malformed entries with missing fields object.\n if (!log.fields) {return false;}\n if (log.fields['runId'] !== runId) {\n return false;\n }\n if (options?.stepId && log.fields['stepId'] !== options.stepId) {\n return false;\n }\n return true;\n });\n\n // Sort chronologically (oldest first — natural reading order)\n filtered.sort((a, b) => a.timestamp - b.timestamp);\n\n // Paginate\n const page = filtered.slice(offset, offset + limit);\n\n return page.map((log) => {\n const stepId = log.fields['stepId'] as string | undefined;\n return {\n timestamp: new Date(log.timestamp).toISOString(),\n level: log.level,\n message: log.message,\n stepId,\n stepName: stepId ? stepNameMap.get(stepId) : undefined,\n stream: log.fields['logSource'] as string | undefined,\n context: log.fields,\n };\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/cron-scheduler\n * CronScheduler - manages periodic job execution using node-cron\n */\n\nimport * as cron from 'node-cron';\nimport { CronExpressionParser } from 'cron-parser';\nimport type { ILogger, IAnalytics } from '@kb-labs/core-platform';\nimport type { JobBroker } from './job-broker.js';\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type {\n RegisteredCronJob,\n PluginCronJob,\n UserCronJob,\n WorkflowSpec,\n} from '@kb-labs/workflow-contracts';\n\nexport interface CronSchedulerOptions {\n jobBroker: JobBroker;\n workflowEngine: WorkflowEngine;\n logger: ILogger;\n timezone?: string;\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics;\n}\n\n/**\n * CronScheduler manages periodic job execution.\n *\n * Features:\n * - Registers cron jobs from plugin manifests and user YAML files\n * - Uses node-cron for scheduling\n * - Submits jobs via JobBroker\n * - Graceful shutdown (stops all scheduled tasks)\n */\nexport class CronScheduler {\n private readonly jobBroker: JobBroker;\n private readonly workflowEngine: WorkflowEngine;\n private readonly logger: ILogger;\n private readonly defaultTimezone: string;\n private readonly analytics?: import('@kb-labs/core-platform').IAnalytics; // eslint-disable-line @typescript-eslint/consistent-type-imports\n\n private readonly registeredJobs = new Map<string, RegisteredCronJob>();\n private readonly scheduledTasks = new Map<string, cron.ScheduledTask>();\n private isRunning = false;\n\n constructor(options: CronSchedulerOptions) {\n this.jobBroker = options.jobBroker;\n this.workflowEngine = options.workflowEngine;\n this.logger = options.logger;\n this.defaultTimezone = options.timezone ?? 'UTC';\n this.analytics = options.analytics;\n }\n\n /**\n * Register cron job from plugin manifest.\n */\n registerPluginJob(pluginId: string, job: PluginCronJob): void {\n const cronJobId = `plugin:${pluginId}:${job.id}`;\n\n if (this.registeredJobs.has(cronJobId)) {\n this.logger.warn('Cron job already registered, skipping', { cronJobId });\n return;\n }\n\n const registered: RegisteredCronJob = {\n id: cronJobId,\n source: 'plugin',\n schedule: job.schedule,\n timezone: job.timezone ?? this.defaultTimezone,\n priority: job.priority,\n enabled: job.enabled,\n handler: job.handler,\n input: job.input,\n metadata: job.metadata,\n };\n\n this.registeredJobs.set(cronJobId, registered);\n this.logger.debug('Plugin cron job registered', {\n cronJobId,\n schedule: job.schedule,\n handler: job.handler,\n });\n }\n\n /**\n * Register cron job from user YAML file.\n */\n registerUserJob(fileName: string, job: UserCronJob): void {\n const cronJobId = `user:${fileName}`;\n\n if (this.registeredJobs.has(cronJobId)) {\n this.logger.warn('Cron job already registered, skipping', { cronJobId });\n return;\n }\n\n const registered: RegisteredCronJob = {\n id: cronJobId,\n source: 'user',\n schedule: job.schedule,\n timezone: job.timezone ?? this.defaultTimezone,\n priority: job.priority,\n enabled: job.enabled,\n workflowSpec: {\n name: job.name,\n jobs: job.jobs,\n env: job.env,\n },\n metadata: job.metadata,\n };\n\n this.registeredJobs.set(cronJobId, registered);\n this.logger.debug('User cron job registered', {\n cronJobId,\n schedule: job.schedule,\n name: job.name,\n });\n }\n\n /**\n * Start all registered cron jobs.\n * Schedules enabled jobs using node-cron.\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('CronScheduler already running');\n return;\n }\n\n this.logger.info('Starting CronScheduler', {\n totalJobs: this.registeredJobs.size,\n });\n\n for (const [cronJobId, job] of this.registeredJobs) {\n if (!job.enabled) {\n this.logger.debug('Skipping disabled cron job', { cronJobId });\n continue;\n }\n\n // Validate cron expression\n if (!cron.validate(job.schedule)) {\n this.logger.error('Invalid cron expression', undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n continue;\n }\n\n // Schedule task\n const task = cron.schedule(\n job.schedule,\n () => this.executeCronJob(cronJobId, job),\n {\n timezone: job.timezone,\n }\n );\n\n this.scheduledTasks.set(cronJobId, task);\n\n this.logger.info('Cron job scheduled', {\n cronJobId,\n schedule: job.schedule,\n timezone: job.timezone,\n source: job.source,\n });\n }\n\n this.isRunning = true;\n this.logger.info('CronScheduler started', {\n scheduledJobs: this.scheduledTasks.size,\n });\n\n // Track scheduler start\n this.analytics?.track('workflow.cron.scheduler.started', {\n totalJobs: this.registeredJobs.size,\n scheduledJobs: this.scheduledTasks.size,\n }).catch(() => {});\n }\n\n /**\n * Stop all scheduled cron jobs.\n * Called during graceful shutdown.\n */\n async stop(): Promise<void> {\n if (!this.isRunning) {\n return;\n }\n\n this.logger.info('Stopping CronScheduler', {\n scheduledJobs: this.scheduledTasks.size,\n });\n\n for (const [cronJobId, task] of this.scheduledTasks) {\n task.stop();\n this.logger.debug('Cron job stopped', { cronJobId });\n }\n\n const stoppedCount = this.scheduledTasks.size;\n this.scheduledTasks.clear();\n this.isRunning = false;\n\n this.logger.info('CronScheduler stopped');\n\n // Track scheduler stop\n this.analytics?.track('workflow.cron.scheduler.stopped', {\n stoppedJobs: stoppedCount,\n }).catch(() => {});\n }\n\n /**\n * Execute cron job by submitting it to JobBroker.\n */\n private async executeCronJob(\n cronJobId: string,\n job: RegisteredCronJob\n ): Promise<void> {\n const startTime = Date.now();\n this.logger.info('Executing cron job', { cronJobId });\n\n // Track cron job start\n this.analytics?.track('workflow.cron.job.started', {\n cronJobId,\n source: job.source,\n schedule: job.schedule,\n }).catch(() => {});\n\n try {\n if (job.source === 'plugin' && job.handler) {\n // Plugin cron job - submit via JobBroker\n const result = await this.jobBroker.submit({\n handler: job.handler,\n input: job.input,\n priority: job.priority,\n metadata: {\n ...job.metadata,\n cronJobId,\n scheduledBy: 'cron',\n scheduledAt: new Date().toISOString(),\n },\n });\n\n this.logger.info('Cron job submitted', {\n cronJobId,\n runId: result.id,\n });\n } else if (job.source === 'user' && job.workflowSpec) {\n // User cron job - run workflow directly via WorkflowEngine\n // Create complete WorkflowSpec from user job\n const spec: WorkflowSpec = {\n name: job.workflowSpec.name,\n version: '1.0.0',\n on: { manual: true }, // Cron-triggered workflows use manual trigger\n jobs: job.workflowSpec.jobs,\n env: job.workflowSpec.env,\n };\n\n this.logger.debug('Running workflow from cron', {\n cronJobId,\n spec: JSON.stringify(spec, null, 2),\n });\n\n const result = await this.workflowEngine.runFromInline(spec, {\n trigger: {\n type: 'schedule',\n payload: {\n cronJobId,\n scheduledAt: new Date().toISOString(),\n },\n },\n env: job.workflowSpec.env ?? {},\n metadata: {\n ...job.metadata,\n cronJobId,\n scheduledBy: 'cron',\n scheduledAt: new Date().toISOString(),\n },\n });\n\n this.logger.info('Cron workflow submitted', {\n cronJobId,\n runId: result.id,\n workflowName: spec.name,\n });\n } else {\n throw new Error(`Invalid cron job configuration: ${cronJobId}`);\n }\n\n // Track successful cron job completion\n const duration = Date.now() - startTime;\n this.analytics?.track('workflow.cron.job.completed', {\n cronJobId,\n source: job.source,\n durationMs: duration,\n }).catch(() => {});\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error(\n 'Failed to execute cron job',\n error instanceof Error ? error : undefined,\n { cronJobId }\n );\n\n // Track cron job failure\n this.analytics?.track('workflow.cron.job.failed', {\n cronJobId,\n source: job.source,\n errorMessage: error instanceof Error ? error.message : 'Unknown error',\n durationMs: duration,\n }).catch(() => {});\n }\n }\n\n /**\n * Get all registered cron jobs.\n */\n getRegisteredJobs(): RegisteredCronJob[] {\n return Array.from(this.registeredJobs.values());\n }\n\n /**\n * Get cron job by ID.\n */\n getJob(cronJobId: string): RegisteredCronJob | undefined {\n return this.registeredJobs.get(cronJobId);\n }\n\n /**\n * Check if scheduler is running.\n */\n isSchedulerRunning(): boolean {\n return this.isRunning;\n }\n\n /**\n * Register cron job (generic method for API usage).\n * Supports both plugin and API-registered jobs.\n */\n register(job: RegisteredCronJob): void {\n if (this.registeredJobs.has(job.id)) {\n this.logger.warn('Cron job already registered, overwriting', { cronJobId: job.id });\n }\n\n this.registeredJobs.set(job.id, job);\n this.logger.debug('Cron job registered', {\n cronJobId: job.id,\n schedule: job.schedule,\n source: job.source,\n });\n\n // If scheduler is already running, schedule this job immediately\n if (this.isRunning && job.enabled) {\n this.scheduleJob(job.id, job);\n }\n }\n\n /**\n * Unregister cron job by ID.\n * Stops the scheduled task if running.\n */\n unregister(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n this.logger.warn('Cron job not found for unregister', { cronJobId });\n return;\n }\n\n // Stop scheduled task if exists\n const task = this.scheduledTasks.get(cronJobId);\n if (task) {\n task.stop();\n this.scheduledTasks.delete(cronJobId);\n this.logger.debug('Cron task stopped', { cronJobId });\n }\n\n // Remove from registered jobs\n this.registeredJobs.delete(cronJobId);\n this.logger.info('Cron job unregistered', { cronJobId });\n }\n\n /**\n * Pause cron job (stop task but keep registration).\n */\n pause(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n const task = this.scheduledTasks.get(cronJobId);\n if (!task) {\n throw new Error(`Cron task not scheduled: ${cronJobId}`);\n }\n\n task.stop();\n job.enabled = false;\n this.logger.info('Cron job paused', { cronJobId });\n }\n\n /**\n * Resume cron job (restart stopped task).\n */\n resume(cronJobId: string): void {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n const task = this.scheduledTasks.get(cronJobId);\n if (!task) {\n // Job exists but not scheduled - schedule it now\n if (this.isRunning) {\n this.scheduleJob(cronJobId, job);\n }\n } else {\n // Task exists but stopped - restart it\n task.start();\n }\n\n job.enabled = true;\n this.logger.info('Cron job resumed', { cronJobId });\n }\n\n /**\n * Trigger cron job immediately (manual execution).\n */\n async triggerNow(cronJobId: string): Promise<void> {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n throw new Error(`Cron job not found: ${cronJobId}`);\n }\n\n this.logger.info('Manually triggering cron job', { cronJobId });\n await this.executeCronJob(cronJobId, job);\n }\n\n /**\n * Schedule a single cron job (helper method).\n */\n private scheduleJob(cronJobId: string, job: RegisteredCronJob): void {\n // Validate cron expression\n if (!cron.validate(job.schedule)) {\n this.logger.error('Invalid cron expression', undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n return;\n }\n\n // Schedule task\n const task = cron.schedule(\n job.schedule,\n () => this.executeCronJob(cronJobId, job),\n {\n timezone: job.timezone,\n }\n );\n\n this.scheduledTasks.set(cronJobId, task);\n\n this.logger.info('Cron job scheduled', {\n cronJobId,\n schedule: job.schedule,\n timezone: job.timezone,\n source: job.source,\n });\n }\n\n /**\n * Get next scheduled run time for a cron job.\n * Returns null if job doesn't exist or has invalid cron expression.\n */\n getNextRunTime(cronJobId: string): Date | null {\n const job = this.registeredJobs.get(cronJobId);\n if (!job) {\n return null;\n }\n\n // Return null for empty schedule\n if (!job.schedule || job.schedule.trim() === '') {\n return null;\n }\n\n try {\n // Parse cron expression to get next execution time\n const interval = CronExpressionParser.parse(job.schedule, {\n tz: job.timezone,\n currentDate: new Date(),\n });\n return interval.next().toDate();\n } catch (error) {\n this.logger.error('Failed to parse cron expression', error instanceof Error ? error : undefined, {\n cronJobId,\n schedule: job.schedule,\n });\n return null;\n }\n }\n\n /**\n * Clear all registered cron jobs.\n * IMPORTANT: This does NOT stop scheduled tasks - call stop() first if needed.\n */\n clearAll(): void {\n this.logger.info('Clearing all registered cron jobs', {\n count: this.registeredJobs.size,\n });\n\n this.registeredJobs.clear();\n // Note: scheduledTasks are cleared in stop()\n }\n\n /**\n * Unregister all user-sourced cron jobs (source === 'user'), stopping their\n * scheduled tasks. Safe to call while the scheduler is running — jobs are\n * stopped and removed so they can be re-registered by a fresh discovery pass.\n */\n clearUserJobs(): void {\n const userJobIds = Array.from(this.registeredJobs.keys()).filter((id) => id.startsWith('user:'));\n\n for (const cronJobId of userJobIds) {\n const task = this.scheduledTasks.get(cronJobId);\n if (task) {\n task.stop();\n this.scheduledTasks.delete(cronJobId);\n }\n this.registeredJobs.delete(cronJobId);\n }\n\n this.logger.info('Cleared user cron jobs', { count: userJobIds.length });\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/cron-discovery\n * CronDiscovery - discovers cron jobs from plugin manifests and user YAML files\n *\n * Purpose: scheduling — registers discovered crons into CronScheduler for execution.\n * (ManifestScanner in engine handles listing — populates the REST API catalog; different output, different consumer.)\n */\n\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { join, basename, extname } from 'node:path';\nimport YAML from 'yaml';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { CronScheduler } from './cron-scheduler.js';\nimport {\n PluginCronJobSchema,\n UserCronJobSchema,\n} from '@kb-labs/workflow-contracts';\n\nexport interface CronDiscoveryOptions {\n cliApi: IEntityRegistry;\n scheduler: CronScheduler;\n logger: ILogger;\n workspaceRoot: string;\n}\n\n/**\n * CronDiscovery scans for cron jobs from:\n * 1. Plugin manifests (manifest.cron section)\n * 2. User YAML files (.kb/jobs/*.yml)\n */\nexport class CronDiscovery {\n private readonly cliApi: IEntityRegistry;\n private readonly scheduler: CronScheduler;\n private readonly logger: ILogger;\n private readonly workspaceRoot: string;\n\n constructor(options: CronDiscoveryOptions) {\n this.cliApi = options.cliApi;\n this.scheduler = options.scheduler;\n this.logger = options.logger;\n this.workspaceRoot = options.workspaceRoot;\n }\n\n /**\n * Discover and register all cron jobs.\n * Scans plugin manifests and user YAML files.\n */\n async discoverAll(): Promise<{ plugins: number; users: number }> {\n this.logger.info('Starting cron job discovery');\n\n const pluginJobs = await this.discoverPluginJobs();\n const userJobs = await this.discoverUserJobs();\n\n this.logger.info('Cron job discovery complete', {\n pluginJobs,\n userJobs,\n total: pluginJobs + userJobs,\n });\n\n return { plugins: pluginJobs, users: userJobs };\n }\n\n /**\n * Discover cron jobs from plugin manifests via entity registry.\n * Uses queryEntities({ kind: 'cron' }) — no manual manifest scanning.\n */\n private async discoverPluginJobs(): Promise<number> {\n let count = 0;\n\n try {\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n for (const entity of cronEntities) {\n try {\n const validated = PluginCronJobSchema.parse(entity.declaration);\n this.scheduler.registerPluginJob(entity.ref.pluginId, validated);\n count++;\n } catch (error) {\n this.logger.warn('Invalid plugin cron job definition', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (cronEntities.length > 0) {\n this.logger.debug('Discovered plugin cron jobs via registry', {\n total: cronEntities.length,\n registered: count,\n });\n }\n } catch (error) {\n this.logger.error(\n 'Failed to discover plugin cron jobs',\n error instanceof Error ? error : undefined\n );\n }\n\n return count;\n }\n\n /**\n * Discover cron jobs from user YAML files in .kb/jobs/*.yml\n */\n private async discoverUserJobs(): Promise<number> {\n let count = 0;\n const jobsDir = join(this.workspaceRoot, '.kb', 'jobs');\n\n try {\n // Check if directory exists\n const dirStat = await stat(jobsDir).catch(() => null);\n if (!dirStat?.isDirectory()) {\n this.logger.debug('User jobs directory does not exist', { jobsDir });\n return 0;\n }\n\n // Read all files in directory\n const files = await readdir(jobsDir);\n\n // Filter YAML files\n const yamlFiles = files.filter((file) => {\n const ext = extname(file);\n return ext === '.yml' || ext === '.yaml';\n });\n\n // Process all YAML files in parallel\n const results = await Promise.allSettled(\n yamlFiles.map(async (file) => {\n const filePath = join(jobsDir, file);\n const ext = extname(file);\n\n const content = await readFile(filePath, 'utf-8');\n const parsed = YAML.parse(content);\n\n // Validate against UserCronJobSchema\n const validated = UserCronJobSchema.parse(parsed);\n\n // Only register if autoStart is true\n if (validated.autoStart) {\n const fileName = basename(file, ext);\n this.scheduler.registerUserJob(fileName, validated);\n return 1;\n } else {\n this.logger.debug('Skipping user cron job (autoStart: false)', {\n file,\n });\n return 0;\n }\n })\n );\n\n // Sum up counts from successful results\n for (const result of results) {\n if (result.status === 'fulfilled') {\n count += result.value;\n } else {\n this.logger.warn('Failed to parse user cron job file', {\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n });\n }\n }\n } catch (error) {\n this.logger.warn('Failed to discover user cron jobs', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n return count;\n }\n}\n","/**\n * @module @kb-labs/workflow-daemon/file-watcher\n * WorkflowFileWatcher - watches .kb/workflows/ and .kb/jobs/ for YAML changes\n * and triggers manifest cache invalidation + cron re-discovery on each change.\n */\n\nimport { watch } from 'node:fs';\nimport type { FSWatcher } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowService } from '@kb-labs/workflow-engine';\nimport type { CronDiscovery } from './cron-discovery.js';\nimport type { CronScheduler } from './cron-scheduler.js';\n\nexport interface WorkflowFileWatcherOptions {\n /** Absolute paths to watch (e.g. ['.kb/workflows', '.kb/jobs']). */\n watchDirs: string[];\n workflowService: WorkflowService;\n cronDiscovery: CronDiscovery;\n cronScheduler: CronScheduler;\n logger: ILogger;\n /** Debounce delay in ms before reloading after a file change. Default: 300. */\n debounceMs?: number;\n}\n\n/**\n * WorkflowFileWatcher monitors YAML files in the given directories and\n * invalidates the workflow manifest cache + re-discovers cron jobs whenever\n * a .yml / .yaml file is created, modified, or deleted.\n *\n * Debounced 300 ms (configurable) to coalesce rapid save events from editors.\n */\nexport class WorkflowFileWatcher {\n private readonly watchers: FSWatcher[] = [];\n private readonly workflowService: WorkflowService;\n private readonly cronDiscovery: CronDiscovery;\n private readonly cronScheduler: CronScheduler;\n private readonly logger: ILogger;\n private readonly debounceMs: number;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: WorkflowFileWatcherOptions) {\n this.workflowService = options.workflowService;\n this.cronDiscovery = options.cronDiscovery;\n this.cronScheduler = options.cronScheduler;\n this.logger = options.logger;\n this.debounceMs = options.debounceMs ?? 300;\n\n for (const dir of options.watchDirs) {\n this.startWatcher(dir);\n }\n }\n\n private startWatcher(dir: string): void {\n // Check directory existence asynchronously; skip silently if missing.\n access(dir).then(() => {\n try {\n const watcher = watch(dir, { persistent: false }, (eventType, filename) => {\n if (!filename) { return; }\n if (!filename.endsWith('.yml') && !filename.endsWith('.yaml')) { return; }\n this.scheduleReload(dir, filename);\n });\n\n watcher.on('error', (err) => {\n this.logger.warn('WorkflowFileWatcher: watcher error', {\n dir,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n this.watchers.push(watcher);\n this.logger.info('WorkflowFileWatcher: watching directory', { dir });\n } catch (err) {\n this.logger.warn('WorkflowFileWatcher: could not start watcher', {\n dir,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }).catch(() => {\n this.logger.debug('WorkflowFileWatcher: directory does not exist, skipping', { dir });\n });\n }\n\n private scheduleReload(dir: string, filename: string): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.reload(dir, filename).catch((err) => {\n this.logger.error(\n 'WorkflowFileWatcher: reload failed',\n err instanceof Error ? err : undefined,\n { dir, filename },\n );\n });\n }, this.debounceMs);\n }\n\n private async reload(dir: string, filename: string): Promise<void> {\n this.logger.info('WorkflowFileWatcher: YAML change detected, reloading', { dir, filename });\n\n await this.workflowService.refreshManifests();\n\n // Re-discover cron jobs: clear user-sourced jobs first to avoid duplicates.\n this.cronScheduler.clearUserJobs();\n const discovered = await this.cronDiscovery.discoverAll();\n\n this.logger.info('WorkflowFileWatcher: reload complete', {\n filename,\n cronJobs: discovered,\n });\n }\n\n /** Stop all watchers and cancel any pending debounce timer. */\n close(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n for (const watcher of this.watchers) {\n watcher.close();\n }\n\n this.watchers.length = 0;\n this.logger.info('WorkflowFileWatcher: stopped');\n }\n}\n","import type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine, WorkflowService, WorkflowRuntime } from '@kb-labs/workflow-engine';\nimport type {\n CronInfo,\n CronListResponse,\n CronRegistrationRequest,\n JobRun,\n JobCancelResponse,\n JobListFilter,\n JobListResponse,\n JobStatusInfo,\n JobSubmissionRequest,\n JobSubmissionResponse,\n StepRun,\n WorkflowInfo,\n WorkflowListResponse,\n WorkflowRun,\n WorkflowRunHistoryResponse,\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n} from '@kb-labs/workflow-contracts';\nimport type { JobBroker } from '../job-broker.js';\nimport type { CronScheduler } from '../cron-scheduler.js';\n\nconst TENANT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\nconst CRON_SCHEDULER_NOT_AVAILABLE = 'Cron scheduler not available';\n\ntype JobStatus = JobStatusInfo['status'];\n\nexport interface WorkflowHostServiceOptions {\n engine: WorkflowEngine;\n jobBroker: JobBroker;\n logger: ILogger;\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n}\n\nexport type WorkflowEngineMetrics = Awaited<ReturnType<WorkflowEngine['getMetrics']>>;\n\nexport class WorkflowHostService {\n constructor(private readonly options: WorkflowHostServiceOptions) {}\n\n getHealth(): { ok: boolean; service: string } {\n return { ok: true, service: 'workflow-daemon' };\n }\n\n async getMetrics(): Promise<WorkflowEngineMetrics> {\n return this.options.engine.getMetrics();\n }\n\n async submitJob(\n tenantId: string,\n request: JobSubmissionRequest,\n ): Promise<JobSubmissionResponse> {\n this.assertTenantId(tenantId);\n if (!request.type) {\n throw new Error('Missing required field: type');\n }\n if (\n request.priority !== undefined\n && (request.priority < 1 || request.priority > 10)\n ) {\n throw new Error('Priority must be between 1 and 10');\n }\n\n const run = await this.options.jobBroker.submit({\n handler: request.type,\n input: request.payload,\n priority: mapPriority(request.priority ?? 5),\n });\n\n this.options.logger.info('Job submitted', {\n jobId: run.id,\n type: request.type,\n tenantId,\n });\n\n return { jobId: run.id };\n }\n\n async getJob(\n tenantId: string,\n jobId: string,\n ): Promise<JobStatusInfo & { jobs?: Array<Record<string, unknown>> }> {\n this.assertTenantId(tenantId);\n const run = (await this.options.engine.getRun(jobId)) as WorkflowRun | null;\n if (!run) {\n throw new Error('Job not found');\n }\n\n return {\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n tenantId: run.tenantId ?? tenantId,\n createdAt: run.createdAt,\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n result: run.result,\n error: run.result?.error?.message,\n jobs: run.jobs?.map((job: JobRun) => ({\n id: job.id,\n name: job.jobName,\n status: job.status,\n startedAt: job.startedAt,\n finishedAt: job.finishedAt,\n durationMs: job.durationMs,\n error: job.error?.message,\n steps: job.steps?.map((step: StepRun) => ({\n id: step.id,\n name: step.name,\n status: step.status,\n handler: step.spec?.uses,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n durationMs: step.durationMs,\n outputs: step.outputs,\n error: step.error,\n })),\n })),\n };\n }\n\n async getJobSteps(jobId: string): Promise<Array<Record<string, unknown>>> {\n const run = (await this.options.engine.getRun(jobId)) as WorkflowRun | null;\n if (!run) {\n throw new Error('Job not found');\n }\n return (\n run.jobs?.flatMap((job: JobRun) =>\n job.steps?.map((step: StepRun) => ({\n id: step.id,\n name: step.name,\n status: step.status,\n handler: step.spec?.uses,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n durationMs: step.durationMs,\n outputs: step.outputs,\n error: step.error,\n jobId: job.id,\n jobName: job.jobName,\n })) ?? []\n ) ?? []\n );\n }\n\n async getJobLogs(\n jobId: string,\n options?: { limit?: number; offset?: number; level?: string },\n ): Promise<Array<Record<string, unknown>>> {\n const logs = await this.options.jobBroker.getJobLogs(jobId, options);\n return logs as Array<Record<string, unknown>>;\n }\n\n async getRunLogs(\n runId: string,\n options?: { stepId?: string; limit?: number; offset?: number; level?: string },\n ): Promise<Array<Record<string, unknown>>> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) { throw new Error('Run not found'); }\n const logs = await this.options.jobBroker.getRunLogs(resolved, options);\n return logs as Array<Record<string, unknown>>;\n }\n\n async cancelJob(tenantId: string, jobId: string): Promise<JobCancelResponse> {\n await this.options.engine.cancelRun(jobId);\n this.options.logger.info('Job cancelled', { jobId, tenantId });\n return { cancelled: true };\n }\n\n async listJobs(\n tenantId: string,\n filter: JobListFilter,\n ): Promise<JobListResponse> {\n this.assertTenantId(tenantId);\n const { type, status, limit, offset } = filter;\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n let jobs: JobStatusInfo[] = allRuns.map((run: WorkflowRun) => ({\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n tenantId: run.tenantId ?? tenantId,\n createdAt: run.createdAt,\n startedAt: run.startedAt,\n finishedAt: run.finishedAt,\n result: run.result,\n error: run.result?.error?.message,\n }));\n\n if (type) {\n const escaped = type.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`);\n jobs = jobs.filter((job) => regex.test(job.type));\n }\n\n if (status) {\n jobs = jobs.filter((job) => job.status === status);\n }\n\n const start = offset ?? 0;\n const end = limit ? start + limit : jobs.length;\n\n return { jobs: jobs.slice(start, end) };\n }\n\n async listActiveExecutions(): Promise<Array<Record<string, unknown>>> {\n const runs = (await this.options.engine.getActiveExecutions()) as WorkflowRun[];\n return runs.map((run: WorkflowRun) => ({\n id: run.id,\n type: run.name,\n status: mapRunStatusToJobStatus(run.status),\n startedAt: run.startedAt,\n createdAt: run.createdAt,\n }));\n }\n\n async listWorkflows(options: {\n source?: 'manifest' | 'standalone';\n status?: 'active' | 'inactive';\n tags?: string;\n }): Promise<WorkflowListResponse> {\n const workflowService = this.requireWorkflowService();\n const workflows = await workflowService.listAll({\n source: options.source,\n status: options.status === 'inactive' ? 'disabled' : options.status,\n tags: options.tags ? options.tags.split(',') : undefined,\n });\n\n const response: WorkflowListResponse = {\n workflows: workflows.map((w: WorkflowRuntime) => this.mapWorkflowInfo(w)),\n };\n return response;\n }\n\n async getWorkflow(id: string): Promise<WorkflowInfo | null> {\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(id);\n if (!workflow) {\n return null;\n }\n return this.mapWorkflowInfo(workflow);\n }\n\n async runWorkflow(\n id: string,\n request: WorkflowRunRequest,\n ): Promise<{ runId: string; status: string }> {\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(id);\n if (!workflow) {\n throw new Error('Workflow not found');\n }\n\n const specInput = workflow.input as Record<string, unknown>;\n const spec = {\n ...specInput,\n ...(request.target ? { target: request.target } : {}),\n ...(request.isolation ? { isolation: request.isolation } : {}),\n } as unknown as import('@kb-labs/workflow-contracts').WorkflowSpec;\n const triggerType =\n request.trigger?.type === 'cron'\n ? 'schedule'\n : request.trigger?.type === 'api'\n ? 'webhook'\n : 'manual';\n\n // Resolve inputs: merge spec defaults with user-supplied values.\n // Accept `inputs` (plural, preferred) or legacy `input` (singular).\n const specInputDefs = (specInput['inputs'] ?? {}) as Record<\n string,\n { default?: unknown; required?: boolean }\n >;\n const userInputs: Record<string, unknown> =\n request.inputs ??\n (request.input && typeof request.input === 'object'\n ? (request.input as Record<string, unknown>)\n : {});\n\n // Validate required inputs BEFORE creating the run, so a missing value is\n // reported up front instead of failing deep inside a job (B-017).\n const missingRequired: string[] = [];\n for (const [key, def] of Object.entries(specInputDefs)) {\n if (def.required && !(key in userInputs) && def.default === undefined) {\n missingRequired.push(key);\n }\n }\n if (missingRequired.length > 0) {\n throw new Error(`Missing required input(s): ${missingRequired.join(', ')}`);\n }\n\n const resolvedInputs: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(specInputDefs)) {\n resolvedInputs[key] = key in userInputs ? userInputs[key] : def.default;\n }\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: triggerType,\n actor: request.trigger?.user,\n payload: userInputs,\n },\n inputs: resolvedInputs,\n });\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest,\n ): Promise<{ runId: string; status: string }> {\n const resolved = await this.resolveRunId(runId);\n const sourceRun = resolved ? (await this.options.engine.getRun(resolved)) as WorkflowRun | null : null;\n if (!sourceRun) {\n throw new Error('Run not found');\n }\n\n if (request.failedOnly) {\n return this.rerunFailedOnly(sourceRun.id, sourceRun);\n }\n\n const workflowId =\n (sourceRun.metadata as Record<string, unknown> | undefined)?.['workflowId'] as string | undefined\n ?? sourceRun.name;\n\n const workflowService = this.requireWorkflowService();\n const workflow = await workflowService.get(workflowId);\n if (!workflow) {\n throw new Error('Workflow not found');\n }\n\n const specInput = workflow.input as Record<string, unknown>;\n const spec = {\n ...specInput,\n } as unknown as import('@kb-labs/workflow-contracts').WorkflowSpec;\n\n const resolvedInputs = (sourceRun.inputs ?? {}) as Record<string, unknown>;\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: 'manual',\n actor: 'cli-rerun',\n payload: resolvedInputs,\n },\n inputs: resolvedInputs,\n });\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n /**\n * failedOnly reruns resume from the source run's snapshot instead of\n * starting a brand-new run (via runFromSpec + a job-filtered spec), so\n * completed step outputs from jobs that are not being rerun are carried\n * forward into the interpolation context instead of being discarded\n * (see issue #263: `rerun --failed-only` used to redo the whole run).\n */\n private async rerunFailedOnly(\n resolvedRunId: string,\n sourceRun: WorkflowRun,\n ): Promise<{ runId: string; status: string }> {\n const failedJobNames = new Set(\n (sourceRun.jobs ?? [])\n .filter((job: JobRun) => job.status === 'failed' || job.status === 'interrupted')\n .map((job: JobRun) => job.jobName),\n );\n\n if (failedJobNames.size === 0) {\n throw new Error('No failed jobs to rerun');\n }\n\n // Resume from the earliest unfinished step in a failed/interrupted job,\n // in run order, so that all steps before it (including ones in jobs\n // that are not being rerun) keep their stored outputs. A job can be\n // 'interrupted' (e.g. cancelled mid-run) without any of its steps ever\n // reaching 'failed' — those steps are left 'running'/'queued' — so the\n // resume point is \"first step that didn't succeed\", not \"first failed\n // step\".\n let fromStepId: string | undefined;\n for (const job of sourceRun.jobs ?? []) {\n if (!failedJobNames.has(job.jobName)) {\n continue;\n }\n const unfinishedStep = (job.steps ?? []).find(\n (s: StepRun) => s.status !== 'success' && s.status !== 'skipped',\n );\n if (unfinishedStep) {\n fromStepId = unfinishedStep.id;\n break;\n }\n }\n\n if (!fromStepId) {\n throw new Error(`Cannot determine resume point: no failed step found in run ${sourceRun.id}`);\n }\n\n const run = await this.options.engine.replayRun(resolvedRunId, { fromStepId });\n if (!run) {\n throw new Error(\n `No replay snapshot for run ${resolvedRunId} — cannot rerun failed steps only. `\n + 'Snapshots are created when a run finishes; check the workflow daemon logs for '\n + '\"Failed to create run snapshot\" around that time.',\n );\n }\n\n return {\n runId: run.id,\n status: run.status,\n };\n }\n\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest,\n ): Promise<WorkflowRestartResponse> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n // Guard: restarting an active run would race with the live worker over the\n // same run ID, corrupting step state. Caller must cancel the run first.\n const currentRun = await this.options.engine.getRun(resolved);\n if (!currentRun) {\n throw new Error(`Run not found: ${resolved}`);\n }\n if (currentRun.status === 'running' || currentRun.status === 'queued') {\n throw new Error(\n `Cannot restart an active run (status: ${currentRun.status}); cancel it first`,\n );\n }\n\n const run = await this.options.engine.replayRun(resolved, {\n fromStepId: request.fromStepId,\n env: request.env,\n });\n\n if (!run) {\n // The run exists, but replayRun() came back empty — this means no\n // snapshot was persisted, not that the run itself is missing. Snapshots\n // are only written once a run reaches a terminal state (success/failed)\n // and creation failures are only logged, not surfaced anywhere else —\n // so distinguish this from \"run not found\" to save the operator a trip\n // through the daemon logs.\n throw new Error(\n `No replay snapshot for run ${resolved} (status: ${currentRun.status}, finished: ${currentRun.finishedAt ?? 'n/a'}). `\n + 'Snapshots are created when a run finishes; if this run finished but has no snapshot, '\n + \"check the workflow daemon logs for \\\"Failed to create run snapshot\\\" around that time.\",\n );\n }\n\n return {\n runId: run.id,\n status: run.status,\n fromStepId: request.fromStepId,\n };\n }\n\n registerCron(\n tenantId: string,\n request: CronRegistrationRequest,\n ): { ok: boolean } {\n this.assertTenantId(tenantId);\n const scheduler = this.requireCronScheduler();\n if (!request.id || !request.schedule || !request.jobType) {\n throw new Error('Missing required fields: id, schedule, jobType');\n }\n\n scheduler.register({\n id: request.id,\n source: 'user',\n schedule: request.schedule,\n timezone: request.timezone ?? 'UTC',\n priority: 'normal',\n enabled: request.enabled ?? true,\n handler: request.jobType,\n metadata: {\n tenantId,\n payload: request.payload,\n },\n });\n\n this.options.logger.info('Cron job registered', {\n id: request.id,\n schedule: request.schedule,\n jobType: request.jobType,\n tenantId,\n });\n\n return { ok: true };\n }\n\n unregisterCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.unregister(id);\n this.options.logger.info('Cron job unregistered', { id, tenantId });\n return { ok: true };\n }\n\n triggerCron(tenantId: string, id: string): Promise<{ ok: boolean }> {\n const scheduler = this.requireCronScheduler();\n return scheduler.triggerNow(id).then(() => {\n this.options.logger.info('Cron job triggered manually', { id, tenantId });\n return { ok: true };\n });\n }\n\n pauseCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.pause(id);\n this.options.logger.info('Cron job paused', { id, tenantId });\n return { ok: true };\n }\n\n resumeCron(tenantId: string, id: string): { ok: boolean } {\n const scheduler = this.requireCronScheduler();\n scheduler.resume(id);\n this.options.logger.info('Cron job resumed', { id, tenantId });\n return { ok: true };\n }\n\n listCron(): CronListResponse {\n const scheduler = this.requireCronScheduler();\n const crons: CronInfo[] = scheduler.getRegisteredJobs().map((job) => ({\n id: job.id,\n schedule: job.schedule,\n jobType: job.handler ?? 'unknown',\n timezone: job.timezone ?? 'UTC',\n enabled: job.enabled,\n lastRun: undefined,\n nextRun: scheduler.getNextRunTime(job.id) ?? undefined,\n pluginId: job.source === 'plugin' ? job.id.split(':')[1] : undefined,\n }));\n return { crons };\n }\n\n listLegacyCronJobs(): {\n cronJobs: Array<Record<string, unknown>>;\n total: number;\n running: boolean;\n } {\n const scheduler = this.requireCronScheduler();\n const cronJobs = scheduler.getRegisteredJobs();\n return {\n cronJobs: cronJobs.map((job) => ({\n id: job.id,\n source: job.source,\n schedule: job.schedule,\n timezone: job.timezone,\n priority: job.priority,\n enabled: job.enabled,\n handler: job.handler,\n workflowName: job.workflowSpec?.name,\n metadata: job.metadata,\n })),\n total: cronJobs.length,\n running: scheduler.isSchedulerRunning(),\n };\n }\n\n private assertTenantId(tenantId: string): void {\n if (!TENANT_ID_PATTERN.test(tenantId) || tenantId.length > 64) {\n throw new Error('Invalid tenant ID format or length (max 64 chars)');\n }\n }\n\n async listWorkflowRuns(\n workflowId: string,\n filters?: { limit?: number; offset?: number; status?: string },\n ): Promise<WorkflowRunHistoryResponse> {\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n // Try to resolve workflow name from id for matching\n let workflowName: string | undefined;\n if (this.options.workflowService) {\n const workflow = await this.options.workflowService.get(workflowId);\n workflowName = workflow?.name;\n }\n\n let runs = allRuns.filter((run) =>\n run.name === workflowId ||\n (workflowName && run.name === workflowName)\n );\n\n if (filters?.status) {\n runs = runs.filter((run) => run.status === filters.status);\n }\n\n // Sort newest first\n runs.sort((a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime());\n\n const start = filters?.offset ?? 0;\n const end = filters?.limit ? start + filters.limit : runs.length;\n const page = runs.slice(start, end);\n\n return {\n workflowId,\n runs: page.map((run) => ({\n id: run.id,\n workflowId,\n status: run.status as 'pending' | 'running' | 'completed' | 'failed' | 'cancelled',\n trigger: {\n type: (run.trigger?.type as 'manual' | 'api' | 'cron') ?? 'manual',\n user: run.trigger?.actor,\n },\n startedAt: run.startedAt ?? run.createdAt ?? new Date().toISOString(),\n finishedAt: run.finishedAt,\n durationMs: run.durationMs,\n error: run.result?.error?.message,\n })),\n total: runs.length,\n };\n }\n\n private mapWorkflowInfo(workflow: WorkflowRuntime): WorkflowInfo {\n return {\n id: workflow.id,\n name: workflow.name,\n description: workflow.description,\n source: workflow.source,\n pluginId: workflow.pluginId,\n status: workflow.status === 'active' ? 'active' : 'inactive',\n tags: workflow.tags,\n inputs: workflow.inputSchema,\n version: workflow.version,\n updatedAt: workflow.updatedAt,\n };\n }\n\n async resolveRunId(idOrPrefix: string): Promise<string | null> {\n const run = (await this.options.engine.getRun(idOrPrefix)) as WorkflowRun | null;\n if (run) { return run.id; }\n if (idOrPrefix.length <= 8 && !idOrPrefix.includes('-')) {\n const all = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n return all.find(r => r.id.startsWith(idOrPrefix))?.id ?? null;\n }\n return null;\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const resolved = await this.resolveRunId(runId);\n if (!resolved) { return null; }\n return (await this.options.engine.getRun(resolved)) as WorkflowRun | null;\n }\n\n async listRuns(filters?: {\n status?: string;\n workflowId?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ runs: Array<WorkflowRun & { hasPendingApproval: boolean; currentStepName?: string }>; total: number }> {\n const allRuns = (await this.options.engine.getAllRuns()) as WorkflowRun[];\n\n let runs = allRuns;\n\n if (filters?.status) {\n runs = runs.filter((run) => run.status === filters.status);\n }\n\n if (filters?.workflowId) {\n runs = runs.filter((run) => run.name === filters.workflowId);\n }\n\n // Sort newest first\n runs.sort((a, b) => new Date(b.createdAt ?? 0).getTime() - new Date(a.createdAt ?? 0).getTime());\n\n const total = runs.length;\n const start = filters?.offset ?? 0;\n const end = filters?.limit ? start + filters.limit : runs.length;\n\n const page = runs.slice(start, end).map(run => {\n const allSteps = (run.jobs ?? []).flatMap(j => j.steps ?? []);\n const activeSteps = allSteps.filter(\n s => s.status === 'running' || s.status === 'waiting_approval',\n );\n let currentStepName: string | undefined;\n if (run.status === 'running' && activeSteps.length > 0) {\n // With parallel jobs multiple steps may run simultaneously; show first + overflow count\n currentStepName = activeSteps.length === 1\n ? activeSteps[0]!.name\n : `${activeSteps[0]!.name} (+${activeSteps.length - 1})`;\n }\n return {\n ...run,\n hasPendingApproval: run.status === 'running' &&\n allSteps.some(s => s.status === 'waiting_approval'),\n currentStepName,\n };\n });\n\n return { runs: page, total };\n }\n\n async cancelRun(runId: string): Promise<void> {\n const resolved = await this.resolveRunId(runId);\n const run = resolved ? await this.options.engine.getRun(resolved) : null;\n if (!run) {\n throw new Error('Run not found');\n }\n if (run.status !== 'running' && run.status !== 'queued') {\n throw new Error(`Cannot cancel run with status \"${run.status}\"`);\n }\n await this.options.engine.cancelRun(resolved!);\n }\n\n private requireWorkflowService(): WorkflowService {\n if (!this.options.workflowService) {\n throw new Error('Workflow service not available');\n }\n return this.options.workflowService;\n }\n\n private requireCronScheduler(): CronScheduler {\n if (!this.options.cronScheduler) {\n throw new Error(CRON_SCHEDULER_NOT_AVAILABLE);\n }\n return this.options.cronScheduler;\n }\n}\n\nfunction mapRunStatusToJobStatus(\n status:\n | 'queued'\n | 'running'\n | 'success'\n | 'failed'\n | 'cancelled'\n | 'skipped'\n | 'dlq',\n): JobStatus {\n switch (status) {\n case 'queued':\n return 'pending';\n case 'running':\n return 'running';\n case 'success':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'cancelled';\n case 'skipped':\n return 'cancelled';\n case 'dlq':\n return 'failed';\n }\n}\n\nfunction mapPriority(priority: number): 'low' | 'normal' | 'high' {\n if (priority <= 3) {\n return 'low';\n }\n if (priority <= 7) {\n return 'normal';\n }\n return 'high';\n}\n","import type { FastifyReply } from 'fastify';\n\nexport interface ApiSuccessResponse<T> {\n ok: true;\n data: T;\n}\n\nexport interface ApiErrorResponse {\n ok: false;\n error: string;\n}\n\nexport type ApiResponse<T> = ApiSuccessResponse<T> | ApiErrorResponse;\n\nexport function ok<T>(data: T): ApiSuccessResponse<T> {\n return { ok: true, data };\n}\n\nexport function fail(\n reply: FastifyReply,\n statusCode: number,\n message: string,\n): ApiErrorResponse {\n reply.code(statusCode);\n return { ok: false, error: message };\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/jobs\n * Jobs REST API routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type {\n JobSubmissionRequest,\n JobListFilter,\n} from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nexport interface JobsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register Jobs API routes\n */\nexport function registerJobsAPI(options: JobsAPIOptions): void {\n const { server, hostService, logger, observability } = options;\n\n /**\n * Submit job\n * POST /api/v1/jobs\n */\n server.post<{ Body: JobSubmissionRequest }>(\n '/api/v1/jobs',\n { schema: { tags: ['Jobs'], summary: 'Submit a new job' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.submit', () => hostService.submitJob(tenantId, request.body));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Job submission failed';\n logger.error('Job submission failed', error instanceof Error ? error : undefined, { tenantId });\n if (message.startsWith('Invalid tenant') || message.startsWith('Missing required') || message.startsWith('Priority')) {\n return fail(reply, 400, message);\n } else {\n return fail(reply, 500, message);\n }\n }\n }\n );\n\n /**\n * Get job status\n * GET /api/v1/jobs/:jobId\n */\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId',\n { schema: { tags: ['Jobs'], summary: 'Get job status' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.get', () => hostService.getJob(tenantId, jobId));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job status';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n logger.error('Failed to get job status', error instanceof Error ? error : undefined, { jobId });\n return fail(reply, 500, message);\n }\n }\n );\n\n /**\n * Cancel job\n * POST /api/v1/jobs/:jobId/cancel\n */\n server.post<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/cancel',\n { schema: { tags: ['Jobs'], summary: 'Cancel a job' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n\n try {\n const data = await observability.observeOperation('workflow.job.cancel', () => hostService.cancelJob(tenantId, jobId));\n return ok(data);\n } catch (error) {\n logger.error('Failed to cancel job', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to cancel job');\n }\n }\n );\n\n /**\n * List jobs\n * GET /api/v1/jobs?type=pattern&status=running&limit=10&offset=0\n */\n server.get<{ Querystring: JobListFilter }>(\n '/api/v1/jobs',\n { schema: { tags: ['Jobs'], summary: 'List jobs' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n const filter = request.query;\n\n try {\n const data = await observability.observeOperation('workflow.job.list', () => hostService.listJobs(tenantId, filter));\n return ok(data);\n } catch (error) {\n logger.error('Failed to list jobs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list jobs');\n }\n }\n );\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/steps',\n { schema: { tags: ['Jobs'], summary: 'Get job steps' } },\n async (request, reply) => {\n const { jobId } = request.params;\n try {\n const steps = await observability.observeOperation('workflow.job.steps', () => hostService.getJobSteps(jobId));\n return ok(steps);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job steps';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n return fail(reply, 500, message);\n }\n }\n );\n\n server.get<{ Params: { jobId: string } }>(\n '/api/v1/jobs/:jobId/logs',\n { schema: { tags: ['Jobs'], summary: 'Get job logs' } },\n async (request, reply) => {\n const { jobId } = request.params;\n const limit =\n typeof request.query === 'object' && request.query && 'limit' in request.query\n ? Number((request.query as Record<string, unknown>).limit)\n : undefined;\n const offset =\n typeof request.query === 'object' && request.query && 'offset' in request.query\n ? Number((request.query as Record<string, unknown>).offset)\n : undefined;\n const level =\n typeof request.query === 'object' && request.query && 'level' in request.query\n ? String((request.query as Record<string, unknown>).level)\n : undefined;\n\n try {\n const logs = await observability.observeOperation('workflow.job.logs', () =>\n hostService.getJobLogs(jobId, { limit, offset, level }),\n );\n return ok({ logs });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get job logs';\n if (message === 'Job not found') {\n return fail(reply, 404, message);\n }\n return fail(reply, 500, message);\n }\n }\n );\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/cron\n * Cron REST API routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { CronRegistrationRequest } from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\ninterface CronIdParams {\n id: string;\n}\n\nexport interface CronAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register Cron API routes\n */\nexport function registerCronAPI(options: CronAPIOptions): void {\n const { server, hostService, logger, observability } = options;\n\n server.post<{ Body: CronRegistrationRequest }>(\n '/api/v1/crons',\n { schema: { tags: ['Cron'], summary: 'Register a cron job' } },\n async (request, reply) => {\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.register', () =>\n Promise.resolve(hostService.registerCron(tenantId, request.body)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to register cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n if (message.startsWith('Missing required fields')) {\n return fail(reply, 400, message);\n }\n logger.error('Failed to register cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.get(\n '/api/v1/crons',\n { schema: { tags: ['Cron'], summary: 'List cron jobs' } },\n async (_request, reply) => {\n try {\n return ok(await observability.observeOperation('workflow.cron.list', () => Promise.resolve(hostService.listCron())));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to list cron jobs';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to list cron jobs', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.delete<{ Params: CronIdParams }>(\n '/api/v1/crons/:id',\n { schema: { tags: ['Cron'], summary: 'Unregister a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.unregister', () =>\n Promise.resolve(hostService.unregisterCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to unregister cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to unregister cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/trigger',\n { schema: { tags: ['Cron'], summary: 'Trigger a cron job immediately' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.trigger', () => hostService.triggerCron(tenantId, id));\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to trigger cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to trigger cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/pause',\n { schema: { tags: ['Cron'], summary: 'Pause a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.pause', () =>\n Promise.resolve(hostService.pauseCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to pause cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to pause cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n server.post<{ Params: CronIdParams }>(\n '/api/v1/crons/:id/resume',\n { schema: { tags: ['Cron'], summary: 'Resume a cron job' } },\n async (request, reply) => {\n const { id } = request.params;\n const tenantId = (request.headers['x-tenant-id'] as string) ?? 'default';\n try {\n const data = await observability.observeOperation('workflow.cron.resume', () =>\n Promise.resolve(hostService.resumeCron(tenantId, id)),\n );\n return ok(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resume cron job';\n if (message === 'Cron scheduler not available') {\n return fail(reply, 503, message);\n }\n logger.error('Failed to resume cron job', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/workflows-api\n * REST API endpoints for managing workflow definitions\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowRerunRequest, WorkflowRestartRequest, WorkflowRunRequest } from '@kb-labs/workflow-contracts';\nimport type { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nconst TERMINAL_EVENTS = ['run.finished', 'run.failed', 'run.cancelled'];\nconst TERMINAL_STATUSES = ['success', 'failed', 'cancelled', 'skipped', 'dlq'];\nconst KEEP_ALIVE_MS = 30_000;\nconst IDLE_TIMEOUT_MS = 60_000;\n\nexport interface RegisterWorkflowsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n engine: WorkflowEngine;\n workflowService?: WorkflowService;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register workflow definition management endpoints.\n *\n * Endpoints:\n * - GET /api/v1/workflows - List all workflow definitions\n * - GET /api/v1/workflows/:id - Get workflow definition details\n * - GET /api/v1/workflows/:id/runs - Get run history for a workflow\n * - POST /api/v1/workflows/:id/run - Run a workflow\n */\nexport function registerWorkflowsAPI(options: RegisterWorkflowsAPIOptions): void {\n const { server, hostService, engine, workflowService, logger, observability } = options;\n\n // POST /api/v1/workflows/reload (alias: /refresh) - Reload workflow definitions from disk\n const reloadHandler = async () => {\n try {\n logger.info('[workflows-api] Refreshing workflows from disk');\n\n if (workflowService) {\n await observability.observeOperation('workflow.catalog.refresh', () => workflowService.refreshManifests());\n }\n\n const workflows = workflowService\n ? await observability.observeOperation('workflow.catalog.list', () => workflowService.listAll())\n : [];\n\n return ok({\n workflowsLoaded: workflows.length,\n workflowIds: workflows.map((w) => w.id),\n });\n } catch (error) {\n logger.error('[workflows-api] Failed to refresh workflows', error instanceof Error ? error : undefined);\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n };\n\n server.post('/api/v1/workflows/reload', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk' } }, reloadHandler);\n server.post('/api/v1/workflows/refresh', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk (alias for /reload)' } }, reloadHandler);\n\n // GET /api/v1/workflows - List all workflow definitions\n server.get<{\n Querystring: {\n source?: 'manifest' | 'standalone';\n status?: 'active' | 'inactive';\n tags?: string;\n };\n }>('/api/v1/workflows', { schema: { tags: ['Workflows'], summary: 'List workflow definitions' } }, async (request, reply) => {\n try {\n const response = await observability.observeOperation('workflow.catalog.list', () => hostService.listWorkflows(request.query));\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing workflows', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list workflows');\n }\n });\n\n // GET /api/v1/workflows/:id - Get workflow definition details\n server.get<{\n Params: { id: string };\n }>('/api/v1/workflows/:id', { schema: { tags: ['Workflows'], summary: 'Get workflow definition' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const workflow = await observability.observeOperation('workflow.catalog.get', () => hostService.getWorkflow(id));\n if (!workflow) {\n return fail(reply, 404, 'Workflow not found');\n }\n return ok(workflow);\n } catch (error) {\n logger.error('[workflows-api] Error getting workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to get workflow');\n }\n });\n\n // GET /api/v1/workflows/:id/runs - Get run history for a workflow\n server.get<{\n Params: { id: string };\n Querystring: { limit?: string; offset?: string; status?: string };\n }>('/api/v1/workflows/:id/runs', { schema: { tags: ['Workflows'], summary: 'List runs for a workflow' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const { limit, offset, status } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listWorkflowRuns(id, {\n limit: limit ? parseInt(limit, 10) : 50,\n offset: offset ? parseInt(offset, 10) : 0,\n status,\n }),\n );\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing workflow runs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list workflow runs');\n }\n });\n\n // POST /api/v1/workflows/:id/runs - Run a workflow\n server.post<{\n Params: { id: string };\n Body: WorkflowRunRequest;\n }>('/api/v1/workflows/:id/runs', { schema: { tags: ['Workflows'], summary: 'Run a workflow' } }, async (request, reply) => {\n try {\n const { id } = request.params;\n const response = await observability.observeOperation('workflow.run.start', () => hostService.runWorkflow(id, request.body || {}));\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to run workflow';\n if (message === 'Workflow not found') {\n return fail(reply, 404, message);\n }\n // Invalid request payload (e.g. missing required inputs) is a client error.\n if (message.startsWith('Missing required input')) {\n return fail(reply, 400, message);\n }\n logger.error('[workflows-api] Error running workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/cancel - Cancel a running workflow run\n server.post<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/cancel', { schema: { tags: ['Runs'], summary: 'Cancel a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n await observability.observeOperation('workflow.run.cancel', () => hostService.cancelRun(runId));\n return ok({ cancelled: true, runId });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to cancel run';\n if (message === 'Run not found') {\n return fail(reply, 404, message);\n }\n if (message.startsWith('Cannot cancel run')) {\n return fail(reply, 409, message);\n }\n logger.error('[workflows-api] Error cancelling run', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/rerun — Rerun a workflow run, optionally only failed jobs\n server.post<{\n Params: { runId: string };\n Body: WorkflowRerunRequest;\n }>('/api/v1/runs/:runId/rerun', { schema: { tags: ['Runs'], summary: 'Rerun a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const response = await observability.observeOperation('workflow.run.rerun', () =>\n hostService.rerunWorkflow(runId, request.body ?? {}),\n );\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to rerun workflow';\n if (message === 'Run not found' || message === 'Workflow not found') {\n return fail(reply, 404, message);\n }\n if (message === 'No failed jobs to rerun') {\n return fail(reply, 400, message);\n }\n logger.error('[workflows-api] Error rerunning workflow', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // POST /api/v1/runs/:runId/restart — Restart a run from a snapshot, optionally from a specific step\n server.post<{\n Params: { runId: string };\n Body: WorkflowRestartRequest;\n }>('/api/v1/runs/:runId/restart', { schema: { tags: ['Runs'], summary: 'Restart a run from a specific step (snapshot-based)' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const response = await observability.observeOperation('workflow.run.restart', () =>\n hostService.restartRun(runId, request.body ?? {}),\n );\n return ok(response);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to restart run';\n if (message.includes('not found') || message.includes('snapshot not available')) {\n return fail(reply, 404, message);\n }\n if (message.startsWith('Cannot restart an active run')) {\n return fail(reply, 409, message);\n }\n logger.error('[workflows-api] Error restarting run', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n });\n\n // GET /api/v1/runs - List all workflow runs (across all workflows)\n server.get<{\n Querystring: { status?: string; workflowId?: string; limit?: string; offset?: string };\n }>('/api/v1/runs', { schema: { tags: ['Runs'], summary: 'List all workflow runs' } }, async (request, reply) => {\n try {\n const { status, workflowId, limit, offset } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listRuns({\n status,\n workflowId,\n limit: limit ? parseInt(limit, 10) : 50,\n offset: offset ? parseInt(offset, 10) : 0,\n }),\n );\n return ok(response);\n } catch (error) {\n logger.error('[workflows-api] Error listing runs', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list runs');\n }\n });\n\n // GET /api/v1/runs/:runId - Get a specific workflow run\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId', { schema: { tags: ['Runs'], summary: 'Get a workflow run' } }, async (request, reply) => {\n try {\n const { runId } = request.params;\n const run = await observability.observeOperation('workflow.run.get', () => hostService.getRun(runId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n return ok({ run });\n } catch (error) {\n logger.error('[workflows-api] Error getting run', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to get run');\n }\n });\n\n // GET /api/v1/runs/:runId/logs — Execution logs for a run, optionally filtered by step\n server.get<{\n Params: { runId: string };\n Querystring: { stepId?: string; level?: string; limit?: string; offset?: string };\n }>(\n '/api/v1/runs/:runId/logs',\n { schema: { tags: ['Runs'], summary: 'Get execution logs for a run' } },\n async (request, reply) => {\n const { runId } = request.params;\n const { stepId, level, limit, offset } = request.query;\n\n try {\n const logs = await observability.observeOperation('workflow.run.logs', () =>\n hostService.getRunLogs(runId, {\n stepId,\n level,\n limit: limit ? parseInt(limit, 10) : undefined,\n offset: offset ? parseInt(offset, 10) : undefined,\n }),\n );\n return ok({ logs, runId, stepId });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to get run logs';\n if (message === 'Run not found') {\n return fail(reply, 404, message);\n }\n logger.error('[workflows-api] Error getting run logs', error instanceof Error ? error : undefined);\n return fail(reply, 500, message);\n }\n },\n );\n\n // GET /api/v1/runs/:runId/events — SSE stream of run events\n // hide: true — SSE uses raw socket hijack, incompatible with OpenAPI response schema\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/events', { schema: { hide: true } }, async (request, reply) => {\n const { runId: rawId } = request.params;\n const runId = await hostService.resolveRunId(rawId) ?? rawId;\n\n const run = await observability.observeOperation('workflow.run.events', () => engine.getRun(runId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n // SSE response\n reply.hijack();\n const raw = reply.raw;\n\n const origin = request.headers.origin;\n if (typeof origin === 'string' && origin.startsWith('http://localhost')) {\n raw.setHeader('Access-Control-Allow-Origin', origin);\n raw.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n raw.setHeader('Content-Type', 'text/event-stream');\n raw.setHeader('Cache-Control', 'no-cache, no-transform');\n raw.setHeader('Connection', 'keep-alive');\n raw.flushHeaders?.();\n raw.write(': connected\\n\\n');\n\n const sendEvent = (type: string, payload: unknown) => {\n if (raw.writableEnded) {return;}\n raw.write(`event: ${type}\\n`);\n raw.write(`data: ${JSON.stringify({ type, runId, payload, timestamp: new Date().toISOString() })}\\n\\n`);\n };\n\n // Send current snapshot\n sendEvent('run.snapshot', run);\n\n // If run already terminal — emit the terminal event then close.\n // Clients subscribing after completion still see the terminal event,\n // not just the snapshot (makes the stream contract consistent).\n if (TERMINAL_STATUSES.includes(run.status)) {\n const terminalType =\n run.status === 'success' ? 'run.finished' :\n run.status === 'failed' ? 'run.failed' : 'run.cancelled';\n sendEvent(terminalType, run);\n raw.end();\n return;\n }\n\n // Subscribe to live events\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer);}\n idleTimer = setTimeout(() => {\n cleanup();\n }, IDLE_TIMEOUT_MS);\n };\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return;}\n raw.write(': keep-alive\\n\\n');\n }, KEEP_ALIVE_MS);\n\n const unsubscribe = engine.subscribeToRunEvents(runId, (event) => {\n sendEvent(event.type, event.payload);\n resetIdle();\n if (TERMINAL_EVENTS.includes(event.type)) {\n cleanup();\n }\n });\n\n const cleanup = () => {\n unsubscribe();\n if (idleTimer) {clearTimeout(idleTimer);}\n clearInterval(keepAliveTimer);\n if (!raw.writableEnded) {raw.end();}\n };\n\n resetIdle();\n request.raw.on('close', cleanup);\n });\n\n logger.info('[workflows-api] Workflows API endpoints registered');\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/approvals-api\n * REST API endpoints for workflow approval management\n *\n * Provides endpoints for:\n * - Listing pending approvals for a run\n * - Resolving (approve/reject) a pending approval step\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine } from '@kb-labs/workflow-engine';\nimport type { OperationObserver } from '@kb-labs/shared-http';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport { fail, ok } from './response.js';\n\nexport interface ApprovalsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n engine: WorkflowEngine;\n logger: ILogger;\n observability: OperationObserver;\n}\n\n/**\n * Register approval management endpoints.\n *\n * Endpoints:\n * - GET /api/v1/runs/:runId/approvals - List steps waiting for approval\n * - POST /api/v1/runs/:runId/approvals/resolve - Approve or reject a pending step\n */\nexport function registerApprovalsAPI(options: ApprovalsAPIOptions): void {\n const { server, hostService, engine, logger, observability } = options;\n\n // GET /api/v1/runs/:runId/approvals\n server.get<{\n Params: { runId: string };\n }>('/api/v1/runs/:runId/approvals', { schema: { tags: ['Approvals'], summary: 'List pending approvals for a run' } }, async (request, reply) => {\n try {\n const { runId: rawId } = request.params;\n const run = await observability.observeOperation('workflow.approval.list', () => hostService.getRun(rawId));\n\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n const pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }> = [];\n\n for (const job of run.jobs) {\n for (const step of job.steps) {\n if ((step.status as string) === 'waiting_approval') {\n pending.push({\n jobId: job.id,\n stepId: step.id,\n stepName: step.name,\n specId: step.spec.id,\n context: (step.resolvedInputs ?? step.spec.with ?? {}) as Record<string, unknown>,\n waitingSince: step.startedAt,\n });\n }\n }\n }\n\n return ok({ runId: run.id, pending });\n } catch (error) {\n logger.error('[approvals-api] Error listing pending approvals', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to list pending approvals');\n }\n });\n\n // POST /api/v1/runs/:runId/approvals/resolve\n server.post<{\n Params: { runId: string };\n Body: {\n jobId: string;\n stepId: string;\n action: 'approve' | 'reject';\n comment?: string;\n data?: Record<string, unknown>;\n };\n }>('/api/v1/runs/:runId/approvals/resolve', { schema: { tags: ['Approvals'], summary: 'Approve or reject a pending step' } }, async (request, reply) => {\n try {\n const { runId: rawId } = request.params;\n const { jobId, stepId, action, comment, data } = request.body;\n\n if (!jobId || !stepId || !action) {\n return fail(reply, 400, 'Missing required fields: jobId, stepId, action');\n }\n\n if (action !== 'approve' && action !== 'reject') {\n return fail(reply, 400, 'action must be \"approve\" or \"reject\"');\n }\n\n const run = await observability.observeOperation('workflow.approval.get', () => hostService.getRun(rawId));\n if (!run) {\n return fail(reply, 404, 'Run not found');\n }\n\n const job = run.jobs.find(j => j.id === jobId);\n if (!job) {\n return fail(reply, 404, 'Job not found');\n }\n\n const step = job.steps.find(s => s.id === stepId);\n if (!step) {\n return fail(reply, 404, 'Step not found');\n }\n\n if ((step.status as string) !== 'waiting_approval') {\n return fail(reply, 409, `Step is not waiting for approval (current status: ${step.status})`);\n }\n\n await observability.observeOperation('workflow.approval.resolve', () =>\n engine.resolveApproval(run.id, jobId, stepId, action, data, comment),\n );\n\n logger.info('[approvals-api] Approval resolved', {\n runId: run.id,\n jobId,\n stepId,\n action,\n comment,\n });\n\n return ok({\n runId: run.id,\n jobId,\n stepId,\n action,\n resolved: true,\n });\n } catch (error) {\n logger.error('[approvals-api] Error resolving approval', error instanceof Error ? error : undefined);\n return fail(reply, 500, error instanceof Error ? error.message : 'Failed to resolve approval');\n }\n });\n}\n","/**\n * @module @kb-labs/workflow-daemon/api/stats\n * Dashboard statistics REST API — GET /api/v1/stats\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { DashboardStatsResponse } from '@kb-labs/workflow-contracts';\nimport type { WorkflowHostService } from '../host/workflow-host-service.js';\nimport type { CronScheduler } from '../cron-scheduler.js';\nimport { ok } from './response.js';\n\nexport interface StatsAPIOptions {\n server: FastifyInstance;\n hostService: WorkflowHostService;\n cronScheduler?: CronScheduler;\n logger: ILogger;\n}\n\nexport function registerStatsAPI(options: StatsAPIOptions): void {\n const { server, hostService, cronScheduler } = options;\n\n server.get('/api/v1/stats', { schema: { tags: ['Stats'], summary: 'Get dashboard statistics' } }, async (_request, _reply) => {\n const tenantId = 'default';\n\n // Jobs — all statuses\n const { jobs } = await hostService.listJobs(tenantId, {});\n const running = jobs.filter((j) => j.status === 'running').length;\n const pending = jobs.filter((j) => j.status === 'pending').length;\n const completed = jobs.filter((j) => j.status === 'completed').length;\n const failed = jobs.filter((j) => j.status === 'failed').length;\n\n // Active executions\n const activeRaw = await hostService.listActiveExecutions();\n const now = Date.now();\n const activeExecutions: DashboardStatsResponse['activeExecutions'] = activeRaw.map((e) => {\n const startedAt = e['startedAt'] as string | Date | undefined;\n const startedAtStr = startedAt ? new Date(startedAt).toISOString() : new Date().toISOString();\n const durationMs = startedAt ? now - new Date(startedAt).getTime() : undefined;\n return {\n id: String(e['id'] ?? ''),\n type: String(e['type'] ?? ''),\n status: 'running' as const,\n startedAt: startedAtStr,\n durationMs,\n };\n });\n\n // Recent activity — last 10 completed/failed/cancelled\n const finished = jobs\n .filter((j) => j.status === 'completed' || j.status === 'failed' || j.status === 'cancelled')\n .filter((j) => j.finishedAt != null)\n .sort((a, b) => new Date(b.finishedAt!).getTime() - new Date(a.finishedAt!).getTime())\n .slice(0, 10);\n\n const recentActivity: DashboardStatsResponse['recentActivity'] = finished.map((j) => {\n const finishedAt = new Date(j.finishedAt!).toISOString();\n const durationMs =\n j.startedAt && j.finishedAt\n ? new Date(j.finishedAt).getTime() - new Date(j.startedAt).getTime()\n : undefined;\n return {\n id: j.id,\n type: j.type,\n status: j.status as 'completed' | 'failed' | 'cancelled',\n finishedAt,\n durationMs,\n error: j.error,\n };\n });\n\n // Workflows\n let workflowStats = { total: 0, active: 0, inactive: 0 };\n try {\n const { workflows } = await hostService.listWorkflows({});\n const active = workflows.filter((w) => w.status !== 'inactive').length;\n workflowStats = { total: workflows.length, active, inactive: workflows.length - active };\n } catch {\n // workflowService may not be available\n }\n\n // Crons\n let cronStats = { total: 0, enabled: 0, disabled: 0 };\n if (cronScheduler) {\n try {\n const { crons } = hostService.listCron();\n const enabled = crons.filter((c) => c.enabled).length;\n cronStats = { total: crons.length, enabled, disabled: crons.length - enabled };\n } catch {\n // ignore\n }\n }\n\n const stats: DashboardStatsResponse = {\n workflows: workflowStats,\n jobs: { running, pending, completed, failed },\n crons: cronStats,\n activeExecutions,\n recentActivity,\n };\n\n return ok(stats);\n });\n}\n","/**\n * @module @kb-labs/workflow-daemon/server\n * HTTP API server for workflow daemon management\n */\n\nimport {\n HttpObservabilityCollector,\n createDaemonServer,\n createServiceReadyResponse,\n metricLine,\n} from '@kb-labs/shared-http';\nimport type { FastifyInstance } from 'fastify';\nimport type { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport type { ObservabilityCheck, ServiceHealthStatus, ServiceOperationSample } from '@kb-labs/core-contracts';\nimport type { JobBroker } from './job-broker.js';\nimport type { CronScheduler } from './cron-scheduler.js';\nimport type { CronDiscovery } from './cron-discovery.js';\nimport { WorkflowHostService, type WorkflowEngineMetrics } from './host/workflow-host-service.js';\nimport { registerJobsAPI } from './api/jobs-api.js';\nimport { registerCronAPI } from './api/cron-api.js';\nimport { registerWorkflowsAPI } from './api/workflows-api.js';\nimport { registerApprovalsAPI } from './api/approvals-api.js';\nimport { registerStatsAPI } from './api/stats-api.js';\n\nexport interface CreateServerOptions {\n engine: WorkflowEngine;\n jobBroker: JobBroker;\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n cronDiscovery?: CronDiscovery;\n logger: ILogger;\n}\n\n/**\n * Create Fastify HTTP server for workflow daemon.\n * Provides endpoints for job management and monitoring.\n */\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const { engine, jobBroker, workflowService, cronScheduler, cronDiscovery, logger } = options;\n const hostService = new WorkflowHostService({\n engine,\n jobBroker,\n workflowService,\n cronScheduler,\n logger,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n const requireAuth = process.env.KB_DAEMON_REQUIRE_AUTH === 'false'\n ? false\n : (process.env.KB_DAEMON_REQUIRE_AUTH === 'true' || isProduction);\n const daemonApiKey = process.env.KB_DAEMON_API_KEY;\n const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(',') ?? [\n 'http://localhost:3000',\n 'http://localhost:5173',\n ];\n\n if (requireAuth && !daemonApiKey) {\n throw new Error(\n 'KB_DAEMON_API_KEY is required when daemon auth is enabled (KB_DAEMON_REQUIRE_AUTH=true or NODE_ENV=production)',\n );\n }\n\n const observability = new HttpObservabilityCollector({\n serviceId: 'workflow',\n serviceType: 'workflow-daemon',\n version: '1.0.0',\n logsSource: 'workflow',\n dependencies: [\n { serviceId: 'state-daemon', required: false, description: 'Workflow run and job state storage' },\n ],\n });\n\n return createDaemonServer({\n serviceId: 'workflow',\n logger,\n observability,\n bodyLimit: 1048576,\n skipStandardRoutes: true,\n openapi: {\n title: 'KB Labs Workflow Daemon',\n description: 'Background job execution and workflow orchestration API',\n },\n cors: {\n origin: (origin: string | undefined, callback: (err: Error | null, allow: boolean) => void) => {\n if (!origin) {\n const isDevelopment =\n process.env.KB_DAEMON_REQUIRE_AUTH === 'false' || process.env.NODE_ENV !== 'production';\n if (isDevelopment) { callback(null, true); } else { callback(new Error('Origin header required in production'), false); }\n return;\n }\n if (allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error(`Origin ${origin} not allowed by CORS`), false); }\n },\n },\n\n onRequest: async (request, reply) => {\n if (!requireAuth || request.url === '/health') {\n return;\n }\n const apiKeyHeader = request.headers['x-api-key'];\n const authHeader = request.headers.authorization;\n const bearerToken =\n typeof authHeader === 'string' && authHeader.startsWith('Bearer ')\n ? authHeader.slice('Bearer '.length).trim()\n : undefined;\n const token = (typeof apiKeyHeader === 'string' ? apiKeyHeader : undefined) ?? bearerToken;\n if (!token || token !== daemonApiKey) {\n reply.code(401).send({ ok: false, error: 'Unauthorized' });\n }\n },\n\n registerRoutes: async (server) => {\n\n // Business routes\n registerJobsAPI({ server, hostService, logger, observability });\n registerCronAPI({ server, hostService, logger, observability });\n\n if (workflowService) {\n registerWorkflowsAPI({ server, hostService, engine, workflowService, logger, observability });\n }\n\n registerApprovalsAPI({ server, hostService, engine, logger, observability });\n registerStatsAPI({ server, hostService, cronScheduler, logger });\n\n // Custom observability routes (workflow-specific data from hostService)\n server.get('/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n return {\n status: checks.some((entry) => entry.status === 'error') ? 'degraded' : 'ok',\n service: 'workflow',\n ts: Date.now(),\n };\n });\n\n server.get('/ready', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowReadinessChecks({ workflowService, cronScheduler, metrics });\n const hasErrors = checks.some((entry) => entry.status === 'error');\n const hasWarnings = checks.some((entry) => entry.status === 'warn');\n return createServiceReadyResponse({\n ready: !hasErrors,\n status: hasErrors ? 'initializing' : hasWarnings ? 'degraded' : 'ready',\n reason: hasErrors ? 'workflow_checks_failed' : 'ready',\n components: {\n workflowEngine: { ready: true },\n workflowCatalog: { ready: Boolean(workflowService) },\n cronScheduler: { ready: Boolean(cronScheduler) },\n },\n });\n });\n\n server.get('/metrics', async (_request, reply) => {\n const metrics = await hostService.getMetrics();\n const healthStatus = resolveWorkflowHealthStatus(metrics);\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics(\n healthStatus,\n buildWorkflowMetricLines(metrics),\n );\n });\n\n server.get('/observability/describe', async () => observability.buildDescribe());\n\n server.get('/observability/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n return observability.buildHealth({\n status: resolveWorkflowHealthStatus(metrics),\n checks,\n topOperations: buildWorkflowTopOperations(metrics, observability.getTopOperations(3)),\n meta: {\n workflowServiceEnabled: Boolean(workflowService),\n cronSchedulerEnabled: Boolean(cronScheduler),\n cronDiscoveryEnabled: Boolean(cronDiscovery),\n runs: metrics.runs,\n jobs: metrics.jobs,\n },\n });\n });\n },\n });\n}\n\ntype WorkflowMetrics = WorkflowEngineMetrics;\n\nfunction resolveWorkflowHealthStatus(metrics: WorkflowMetrics): ServiceHealthStatus {\n void metrics;\n return 'healthy';\n}\n\nfunction buildWorkflowChecks(input: {\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n metrics: WorkflowMetrics;\n}): ObservabilityCheck[] {\n return [\n ...buildWorkflowReadinessChecks(input),\n {\n id: 'workflow-failures',\n status: input.metrics.runs.failed > 0 || input.metrics.jobs.failed > 0 ? 'warn' : 'ok',\n message:\n input.metrics.runs.failed > 0 || input.metrics.jobs.failed > 0\n ? `${input.metrics.runs.failed} failed runs, ${input.metrics.jobs.failed} failed jobs retained in history`\n : 'No failed workflow runs or jobs in retained history',\n },\n ];\n}\n\nfunction buildWorkflowReadinessChecks(input: {\n workflowService?: WorkflowService;\n cronScheduler?: CronScheduler;\n metrics: WorkflowMetrics;\n}): ObservabilityCheck[] {\n return [\n {\n id: 'workflow-engine',\n status: 'ok',\n message: `${input.metrics.runs.total} runs tracked`,\n },\n {\n id: 'workflow-catalog',\n status: input.workflowService ? 'ok' : 'warn',\n message: input.workflowService ? 'Workflow service available' : 'Workflow service not configured',\n },\n {\n id: 'cron-scheduler',\n status: input.cronScheduler ? 'ok' : 'warn',\n message: input.cronScheduler ? 'Cron scheduler available' : 'Cron scheduler not configured',\n },\n ];\n}\n\nfunction buildWorkflowTopOperations(\n metrics: WorkflowMetrics,\n httpOperations: ServiceOperationSample[],\n): ServiceOperationSample[] {\n return [\n ...httpOperations,\n { operation: 'workflow.runs', count: metrics.runs.total, errorCount: metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq },\n { operation: 'workflow.jobs', count: metrics.jobs.total, errorCount: metrics.jobs.failed },\n ].slice(0, 5);\n}\n\nfunction buildWorkflowMetricLines(metrics: WorkflowMetrics): string[] {\n return [\n '# HELP workflow_runs_total Total workflow runs grouped by status',\n '# TYPE workflow_runs_total gauge',\n metricLine('workflow_runs_total', metrics.runs.total, { status: 'total' }),\n metricLine('workflow_runs_total', metrics.runs.queued, { status: 'queued' }),\n metricLine('workflow_runs_total', metrics.runs.running, { status: 'running' }),\n metricLine('workflow_runs_total', metrics.runs.completed, { status: 'completed' }),\n metricLine('workflow_runs_total', metrics.runs.failed, { status: 'failed' }),\n metricLine('workflow_runs_total', metrics.runs.cancelled, { status: 'cancelled' }),\n metricLine('workflow_runs_total', metrics.runs.dlq, { status: 'dlq' }),\n '# HELP workflow_jobs_total Total workflow jobs grouped by status',\n '# TYPE workflow_jobs_total gauge',\n metricLine('workflow_jobs_total', metrics.jobs.total, { status: 'total' }),\n metricLine('workflow_jobs_total', metrics.jobs.queued, { status: 'queued' }),\n metricLine('workflow_jobs_total', metrics.jobs.running, { status: 'running' }),\n metricLine('workflow_jobs_total', metrics.jobs.completed, { status: 'completed' }),\n metricLine('workflow_jobs_total', metrics.jobs.failed, { status: 'failed' }),\n metricLine('service_operation_total', metrics.runs.total, { operation: 'workflow.runs', status: 'ok' }),\n metricLine('service_operation_total', metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq, { operation: 'workflow.runs', status: 'error' }),\n metricLine('service_operation_total', metrics.jobs.total, { operation: 'workflow.jobs', status: 'ok' }),\n metricLine('service_operation_total', metrics.jobs.failed, { operation: 'workflow.jobs', status: 'error' }),\n ];\n}\n","/**\n * @module @kb-labs/workflow-daemon/bootstrap\n * Bootstrap workflow daemon - initialize platform, engine, worker, and HTTP server\n */\n\nimport { platform, createServiceBootstrap } from '@kb-labs/core-runtime';\nimport { makeAssemblyHook } from '@kb-labs/plugin-runtime';\nimport { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport { createCorrelatedLogger, getListenOptions } from '@kb-labs/shared-http';\nimport { runDaemon } from '@kb-labs/shared-daemon';\nimport { createWorkflowWorker } from './worker.js';\nimport { JobBroker } from './job-broker.js';\nimport { CronScheduler } from './cron-scheduler.js';\nimport { CronDiscovery } from './cron-discovery.js';\nimport { WorkflowFileWatcher } from './file-watcher.js';\nimport { createServer } from './server.js';\nimport { createRegistry } from '@kb-labs/core-registry';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\n/**\n * Bootstrap workflow daemon.\n * Initializes platform, engine, worker, and HTTP server.\n */\nexport async function bootstrap(_cwd: string = process.cwd()): Promise<void> {\n await runDaemon(\n {\n appId: 'workflow-daemon',\n // serviceId in the transport map / devservices is 'workflow' (≠ appId).\n serviceId: 'workflow',\n defaultPort: 7778,\n portEnvVar: 'WORKFLOW_PORT',\n defaultHost: '0.0.0.0',\n hostEnvVar: 'WORKFLOW_HOST',\n async setup({ platform: _p, logger: _l, port, host, repoRoot }) {\n // KB_PROJECT_ROOT injected by kb-dev when invoked from a project dir with separate platform.\n // Fall back to the resolved repoRoot (not raw cwd) so plugin/cron/workflow discovery is\n // correct even when the daemon is launched from a subdirectory.\n const projectRoot = process.env['KB_PROJECT_ROOT'] ?? repoRoot;\n\n if (!platform.isConfigured('workspace')) {\n process.stderr.write(\n '[workflow-daemon] WARNING: workspace adapter is not configured.\\n' +\n '[workflow-daemon] Workflows that use isolation: balanced (default) or isolation: strict will fail.\\n' +\n '[workflow-daemon] To fix: set platform.adapters.workspace in kb.config.json.\\n' +\n '[workflow-daemon] To run without a workspace: add \"isolation: relaxed\" to your workflow YAML.\\n',\n );\n }\n\n if (!platform.isConfigured('environment') && platform.isConfigured('workspace')) {\n process.stderr.write(\n '[workflow-daemon] WARNING: environment adapter is not configured.\\n' +\n '[workflow-daemon] Workflows that use isolation: strict will fail.\\n' +\n '[workflow-daemon] To fix: set platform.adapters.environment in kb.config.json.\\n',\n );\n }\n\n const startupRequestId = `workflow-startup-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startupTraceId = randomUUID();\n const startupSpanId = randomUUID();\n const bootstrapLogger = createCorrelatedLogger(platform.logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service: 'bootstrap',\n requestId: startupRequestId,\n traceId: startupTraceId,\n operation: 'workflow.bootstrap',\n bindings: { spanId: startupSpanId, invocationId: startupSpanId, executionId: startupSpanId },\n });\n\n const debugMode = process.env['WORKFLOW_DEBUG'] === 'true';\n bootstrapLogger.info('Workflow daemon starting', { projectRoot, debugMode });\n\n if (debugMode) {\n bootstrapLogger.warn(\n '[WORKFLOW_DEBUG=true] Verbose debug logging is ON — step inputs, outputs, and expr contexts will be logged. ' +\n 'Disable in production (unset WORKFLOW_DEBUG or set to false).',\n );\n }\n\n const createWorkflowLogger = (service: string, operation: string, bindings?: Record<string, unknown>) =>\n createCorrelatedLogger(platform.logger, {\n serviceId: 'workflow',\n logsSource: 'workflow',\n layer: 'workflow',\n service,\n operation,\n bindings,\n });\n\n bootstrapLogger.info('Loading plugin registry snapshot');\n const cliApi = await createRegistry({ root: repoRoot, cache: { ttlMs: 10 * 60 * 1000 } });\n await cliApi.initialize();\n const plugins = await cliApi.listPlugins();\n bootstrapLogger.info('Plugin registry snapshot loaded', {\n pluginsFound: plugins.length,\n pluginIds: plugins.map((p) => `${p.id}@${p.version}`),\n });\n\n bootstrapLogger.info('Creating WorkflowEngine');\n const engine = new WorkflowEngine({\n cache: platform.cache,\n events: platform.eventBus,\n logger: createWorkflowLogger('engine', 'workflow.engine'),\n snapshotManager: platform.snapshotManager,\n workspaceRoot: projectRoot,\n });\n\n bootstrapLogger.info('Cleaning up stale runs from previous daemon process');\n await engine.cleanupStaleRuns();\n\n bootstrapLogger.info('Resuming interrupted jobs');\n await engine.resumeInterruptedJobs();\n\n bootstrapLogger.info('Creating JobBroker');\n const jobBroker = new JobBroker(\n engine,\n createWorkflowLogger('job-broker', 'workflow.job-broker'),\n platform,\n );\n\n bootstrapLogger.info('Creating CronScheduler');\n const cronScheduler = new CronScheduler({\n jobBroker,\n workflowEngine: engine,\n logger: createWorkflowLogger('cron-scheduler', 'workflow.cron-scheduler'),\n timezone: process.env.WORKFLOW_CRON_TIMEZONE,\n });\n\n bootstrapLogger.info('Discovering cron jobs');\n const cronDiscovery = new CronDiscovery({\n cliApi,\n scheduler: cronScheduler,\n logger: createWorkflowLogger('cron-discovery', 'workflow.cron-discovery'),\n workspaceRoot: projectRoot,\n });\n const discovered = await cronDiscovery.discoverAll();\n bootstrapLogger.info('Cron job discovery complete', discovered);\n\n bootstrapLogger.info('Creating WorkflowService');\n const workflowService = new WorkflowService({ cliApi, platform, workspaceRoot: projectRoot });\n workflowService.listAll().catch((err: unknown) =>\n bootstrapLogger.warn('Manifest scanner warmup failed', { err }),\n );\n\n bootstrapLogger.info('Starting WorkflowFileWatcher');\n const fileWatcher = new WorkflowFileWatcher({\n watchDirs: [\n join(projectRoot, '.kb', 'workflows'),\n join(projectRoot, '.kb', 'jobs'),\n ],\n workflowService,\n cronDiscovery,\n cronScheduler,\n logger: createWorkflowLogger('file-watcher', 'workflow.file-watcher'),\n });\n\n bootstrapLogger.info('Creating HTTP server');\n const server = await createServer({\n engine,\n jobBroker,\n workflowService,\n cronScheduler,\n cronDiscovery,\n logger: createWorkflowLogger('api', 'workflow.api'),\n });\n\n await server.listen(getListenOptions(port, host));\n bootstrapLogger.info('HTTP API listening', { port });\n\n bootstrapLogger.info('Creating WorkflowWorker');\n const worker = await createWorkflowWorker({\n engine,\n cliApi,\n logger: createWorkflowLogger('worker', 'workflow.worker'),\n analytics: platform.analytics,\n platform,\n workspaceRoot: projectRoot,\n concurrency: parseInt(process.env.WORKFLOW_CONCURRENCY ?? '5', 10),\n debugMode,\n });\n\n bootstrapLogger.info('Starting WorkflowWorker');\n worker.start().catch((error) => {\n bootstrapLogger.error(\n 'Worker crashed - shutting down daemon',\n error instanceof Error ? error : undefined,\n );\n process.kill(process.pid, 'SIGTERM');\n });\n\n bootstrapLogger.info('Starting CronScheduler');\n await cronScheduler.start();\n\n bootstrapLogger.info('Workflow daemon started successfully', { port });\n\n return async () => {\n bootstrapLogger.warn('Stopping workflow daemon components');\n fileWatcher.close();\n await cronScheduler.stop();\n await worker.stop();\n await server.close();\n await cliApi.dispose();\n // platform.shutdown() is called by runDaemon after this callback returns\n };\n },\n },\n (appId, repoRoot) =>\n createServiceBootstrap({ appId, repoRoot, assemblyHook: makeAssemblyHook() }),\n );\n}\n","#!/usr/bin/env node\n\n/**\n * @module @kb-labs/workflow-daemon\n * Entry point for KB Workflow Daemon\n */\n\nimport { bootstrap } from './bootstrap.js';\n\n(async () => {\n try {\n await bootstrap(process.cwd());\n } catch (error) {\n process.stderr.write(`[workflow-daemon] FATAL: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n})();\n"]}