@kb-labs/workflow-daemon 2.15.0 → 2.17.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 +1 -1
- package/package.json +18 -18
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/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","run","entry","createCorrelatedLogger"],"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 } from '@kb-labs/workflow-contracts';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport {\n interpolateObject,\n evaluateExpression,\n resolveValue,\n} from '@kb-labs/workflow-contracts';\nimport type { GateInput, GateRouteAction } from '@kb-labs/workflow-builtins';\nimport { SandboxRunner } from '@kb-labs/workflow-runtime';\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\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 } = options;\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 backend: executionBackend as any, // ExecutionBackend type from plugin-execution\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 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 },\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 let runWorkspace = 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 as unknown as ILogger, {\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 \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 const exprCtx: ExpressionContext = {\n env: freshRun?.env ?? {},\n trigger: freshRun?.trigger ?? { type: 'manual' },\n steps: {},\n };\n\n // Collect outputs from all completed steps (across all jobs)\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 }\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 false)', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n condition,\n });\n await engine.markStepCompleted(run.id, job.id, step.id, { skipped: true });\n continue;\n }\n }\n\n // --- Interpolate spec.with (data flow between steps) ---\n const interpolatedWith = step.spec.with\n ? interpolateObject(step.spec.with as Record<string, unknown>, exprCtx)\n : undefined;\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 attempt: 1,\n executionId: stepExecutionId,\n spanId: stepExecutionId,\n invocationId: stepExecutionId,\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 });\n\n // --- Handle builtin:approval ---\n if (step.spec.uses === 'builtin:approval') {\n // If step is already waiting (e.g. daemon restarted), skip to polling\n if (step.status !== 'waiting_approval') {\n // Persist interpolated spec.with so REST API shows resolved values\n if (interpolatedWith) {\n const stateStore = engine.getStateStore();\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.spec = { ...draft.spec, with: interpolatedWith };\n });\n }\n await engine.markStepWaitingApproval(run.id, job.id, step.id);\n }\n\n stepLogger.info('Waiting for approval', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n context: interpolatedWith,\n });\n\n // Poll until approval is resolved or stop is requested\n while (!stopRequested) {\n await sleep(2000);\n const currentRun = await engine.getRun(run.id);\n const currentJob = currentRun?.jobs.find(j => j.id === job.id);\n const currentStep = currentJob?.steps.find(s => s.id === step.id);\n\n if (!currentStep || currentStep.status === 'success') {\n stepLogger.info('Approval granted', { runId: run.id, stepId: step.id });\n break;\n }\n\n if (currentStep.status === 'failed') {\n const rejectMsg = currentStep.error?.message ?? 'Approval rejected';\n stepLogger.info('Approval rejected', { runId: run.id, stepId: step.id });\n throw new Error(rejectMsg);\n }\n }\n\n if (stopRequested) {\n stepLogger.info('Approval wait interrupted by shutdown', { stepId: step.id });\n return;\n }\n\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 const decisionPath = gateInput.decision;\n const maxIterations = gateInput.maxIterations ?? 3;\n\n // Resolve decision value from expression context\n const decisionValue = resolveValue(decisionPath, exprCtx);\n const decisionKey = String(decisionValue);\n\n // Find matching route\n const route: GateRouteAction | undefined =\n gateInput.routes[decisionKey] ?? gateInput.routes[decisionValue as string];\n const action = route ?? gateInput.default ?? 'fail';\n\n stepLogger.info('Gate evaluation', {\n runId: run.id,\n stepId: step.id,\n decision: decisionPath,\n decisionValue,\n action: typeof action === 'string' ? action : 'restart',\n });\n\n // Track gate iterations in run metadata\n const iterationKey = `gate:${step.spec.id ?? step.id}:iterations`;\n const metadata = (freshRun?.metadata ?? {}) as Record<string, unknown>;\n const currentIteration = (metadata[iterationKey] as number) ?? 0;\n\n if (action === 'continue') {\n await engine.markStepCompleted(run.id, job.id, step.id, {\n decisionValue,\n action: 'continue',\n iteration: currentIteration,\n });\n continue;\n }\n\n if (action === 'fail') {\n const error = new Error(`Gate failed: decision=${decisionKey}`);\n await engine.markStepFailed(run.id, job.id, step.id, error, {\n decisionValue,\n action: 'fail',\n iteration: currentIteration,\n });\n throw error;\n }\n\n // restartFrom action\n const restartAction = action as { restartFrom: string; context?: Record<string, unknown> };\n const nextIteration = currentIteration + 1;\n\n if (nextIteration >= maxIterations) {\n const error = new Error(\n `Gate max iterations reached (${maxIterations}) for step ${step.spec.id ?? step.id}`\n );\n await engine.markStepFailed(run.id, job.id, step.id, error, {\n decisionValue,\n action: 'fail',\n maxIterationsReached: true,\n iteration: currentIteration,\n maxIterations,\n });\n throw error;\n }\n\n stepLogger.info('Gate triggering restart', {\n restartFrom: restartAction.restartFrom,\n iteration: nextIteration,\n maxIterations,\n });\n\n // Mark gate step as completed (with restart info)\n await engine.markStepCompleted(run.id, job.id, step.id, {\n decisionValue,\n action: 'restart',\n restartFrom: restartAction.restartFrom,\n iteration: nextIteration,\n });\n\n // Update iteration counter in run metadata\n await engine.updateRun(run.id, (draft) => {\n const md = (draft.metadata ?? {}) as Record<string, unknown>;\n md[iterationKey] = nextIteration;\n (draft as any).metadata = md;\n\n // Merge rework context into trigger.payload\n if (restartAction.context) {\n const payload = (draft.trigger.payload ?? {}) as Record<string, unknown>;\n Object.assign(payload, restartAction.context);\n draft.trigger.payload = payload;\n }\n\n return draft;\n });\n\n // Reset steps from target to end of job (set to queued)\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n let foundTarget = false;\n\n for (const s of job.steps) {\n if (s.spec.id === restartAction.restartFrom || s.id === restartAction.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 // Reset job status and re-enqueue\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 }\n\n // Exit processJob — worker will pick up the re-queued job\n return;\n }\n\n // --- Regular step execution ---\n // Mark step as started (sets startedAt timestamp)\n await engine.markStepStarted(run.id, job.id, step.id);\n\n // Build spec with interpolated `with`\n // Normalize `run: cmd` → `uses: builtin:shell, with: { command: cmd }`\n let baseSpec = step.spec as Record<string, unknown>;\n if ((baseSpec as any).run && !(baseSpec as any).uses) {\n const { run, with: existingWith, ...rest } = baseSpec as any;\n baseSpec = { ...rest, uses: 'builtin:shell', with: { ...existingWith, command: run } };\n }\n const interpolatedSpec = interpolatedWith\n ? { ...baseSpec, with: { ...(baseSpec.with as object ?? {}), ...interpolatedWith } }\n : baseSpec;\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,\n context: {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n attempt: 1,\n env: freshRun?.env || ({} as Record<string, string>),\n secrets: {} as Record<string, string>, // TODO: map run.secrets array to Record\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 onLog: (entry) => {\n void engine.publishLog(run.id, job.id, step.id, entry);\n },\n },\n workspace: runWorkspace,\n target,\n });\n\n if (result.status === 'failed') {\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 });\n throw error;\n }\n\n // Mark step as completed (sets finishedAt timestamp + outputs)\n await engine.markStepCompleted(run.id, job.id, step.id, result.status === 'success' ? result.outputs : undefined);\n\n stepLogger.info('Step completed', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n }\n \n\n // Mark job as completed\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\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 } from '@kb-labs/core-platform';\nimport type { PlatformContainer } from '@kb-labs/core-runtime';\n\nexport interface SubmitJobRequest {\n handler: string;\n input?: unknown;\n priority?: 'low' | 'normal' | 'high';\n metadata?: Record<string, unknown>;\n}\n\nexport interface ScheduleJobRequest {\n handler: string;\n cron: string;\n input?: unknown;\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 // @ts-expect-error - WorkflowSpec step.with type mismatch\n with: request.input ?? ({} as Record<string, unknown>),\n },\n ],\n },\n },\n };\n\n // Submit to engine\n // @ts-expect-error - CreateRunInput type mismatch with inline options\n const run = await this.engine.runFromInline(spec, {\n env: {} as Record<string, string>,\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 * Schedule a recurring job with cron expression.\n * Registers job with CronScheduler (if available).\n *\n * NOTE: CronScheduler integration not yet implemented.\n * This is a placeholder for future implementation.\n */\n async schedule(request: ScheduleJobRequest): Promise<{ id: string; cron: string }> {\n this.logger.warn('CronScheduler not yet implemented', {\n handler: request.handler,\n cron: request.cron,\n });\n\n // TODO: Integrate with CronScheduler\n // const scheduleId = await this.cronScheduler.register({\n // id: `schedule-${Date.now()}`,\n // cron: request.cron,\n // handler: request.handler,\n // input: request.input,\n // });\n\n throw new Error('CronScheduler not yet implemented');\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 * 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; context?: Record<string, unknown> }>> {\n const run = await this.engine.getRun(runId);\n\n if (!run) {\n return [];\n }\n\n // Query logs using platform.logs service\n // Since LogQuery doesn't support metadata filtering, we need to:\n // 1. Query all logs in the time window of the job execution\n // 2. Filter in-memory by runId in fields\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n // Calculate time window for query\n const startTime = run.startedAt ? new Date(run.startedAt).getTime() : Date.now() - 3600000; // 1 hour ago fallback\n const endTime = run.finishedAt ? new Date(run.finishedAt).getTime() : Date.now();\n\n // Query logs with wider limit to ensure we get all logs after filtering\n const queryResult = await this.platform.logs.query(\n {\n from: startTime,\n to: endTime,\n level: options?.level && options.level !== 'all' ? options.level as any : undefined,\n },\n {\n limit: 1000, // Query more logs, then filter in-memory\n offset: 0,\n }\n );\n\n // Filter logs by runId in metadata\n const filteredLogs = queryResult.logs.filter((log: any) => {\n // Check if log has runId in fields metadata\n return log.fields.runId === runId ||\n log.fields.executionId === runId ||\n // Also check jobId and stepId for drill-down capability\n log.fields.jobId?.toString().startsWith(runId);\n });\n\n // Sort by timestamp (newest first)\n const sortedLogs = filteredLogs.sort((a: any, b: any) => b.timestamp - a.timestamp);\n\n // Apply pagination\n const paginatedLogs = sortedLogs.slice(offset, offset + limit);\n\n // Convert to expected format\n return paginatedLogs.map((log: any) => ({\n timestamp: new Date(log.timestamp).toISOString(),\n level: log.level,\n message: log.message,\n context: log.fields,\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 // Debug: log the spec being passed\n console.log('🔍 CRON SPEC:', JSON.stringify(spec, null, 2));\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 * @module @kb-labs/workflow-daemon/cron-discovery\n * CronDiscovery - discovers cron jobs from plugin manifests and user YAML files\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","import type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine, WorkflowService } 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 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 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 pattern = type.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${pattern}$`);\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: any) => 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 any;\n const triggerType =\n request.trigger?.type === 'cron'\n ? 'schedule'\n : request.trigger?.type === 'api'\n ? 'webhook'\n : 'manual';\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: triggerType,\n actor: request.trigger?.user,\n payload:\n request.input && typeof request.input === 'object'\n ? (request.input as Record<string, unknown>)\n : undefined,\n },\n });\n\n return {\n runId: run.id,\n status: run.status,\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: any): 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 };\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return (await this.options.engine.getRun(runId)) as WorkflowRun | null;\n }\n\n async listRuns(filters?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ runs: WorkflowRun[]; 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 // 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 return { runs: runs.slice(start, end), total };\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.options.engine.getRun(runId);\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(runId);\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 const registerCronHandler = async (\n request: { headers: Record<string, unknown>; body: CronRegistrationRequest },\n reply: any,\n ) => {\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 const listCronHandler = async (_request: unknown, reply: any) => {\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 const unregisterCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const triggerCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const pauseCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const resumeCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 server.post<{ Body: CronRegistrationRequest }>('/api/v1/crons', { schema: { tags: ['Cron'], summary: 'Register a cron job' } }, registerCronHandler as any);\n server.get('/api/v1/crons', { schema: { tags: ['Cron'], summary: 'List cron jobs' } }, listCronHandler as any);\n server.delete<{ Params: CronIdParams }>('/api/v1/crons/:id', { schema: { tags: ['Cron'], summary: 'Unregister a cron job' } }, unregisterCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/trigger', { schema: { tags: ['Cron'], summary: 'Trigger a cron job immediately' } }, triggerCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/pause', { schema: { tags: ['Cron'], summary: 'Pause a cron job' } }, pauseCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/resume', { schema: { tags: ['Cron'], summary: 'Resume a cron job' } }, resumeCronHandler as any);\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 { 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'];\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/refresh - Reload workflow definitions from disk\n server.post('/api/v1/workflows/refresh', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk' } }, 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: any) => 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 // 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 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 // GET /api/v1/runs - List all workflow runs (across all workflows)\n server.get<{\n Querystring: { status?: 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, limit, offset } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listRuns({\n status,\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/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 } = request.params;\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: workflow.event\\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 — close immediately\n if (TERMINAL_STATUSES.includes(run.status)) {\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 { fail, ok } from './response.js';\n\nexport interface ApprovalsAPIOptions {\n server: FastifyInstance;\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, 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 } = request.params;\n const run = await observability.observeOperation('workflow.approval.list', () => engine.getRun(runId));\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.spec.with ?? {}) as Record<string, unknown>,\n waitingSince: step.startedAt,\n });\n }\n }\n }\n\n return ok({ runId, 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 } = 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', () => engine.getRun(runId));\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(runId, jobId, stepId, action, data, comment),\n );\n\n logger.info('[approvals-api] Approval resolved', {\n runId,\n jobId,\n stepId,\n action,\n comment,\n });\n\n return ok({\n runId,\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 Fastify from 'fastify';\nimport cors from '@fastify/cors';\nimport {\n HttpObservabilityCollector,\n createServiceReadyResponse,\n metricLine,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\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) {\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 server = Fastify({\n logger: false, // Use platform logger instead\n bodyLimit: 1048576, // 1MB body limit (prevents parsing huge payloads)\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n // OpenAPI / Swagger UI — must be registered before routes\n await registerOpenAPI(server, {\n title: 'KB Labs Workflow Daemon',\n description: 'Background job execution and workflow orchestration API',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:7778', description: 'Local dev' }],\n ui: !isProduction,\n });\n const requireAuth = process.env.KB_DAEMON_REQUIRE_AUTH === 'true' || isProduction;\n const daemonApiKey = process.env.KB_DAEMON_API_KEY;\n const observability = new HttpObservabilityCollector({\n serviceId: 'workflow',\n serviceType: 'workflow-daemon',\n version: '1.0.0',\n logsSource: 'workflow',\n dependencies: [\n {\n serviceId: 'state-daemon',\n required: false,\n description: 'Workflow run and job state storage',\n },\n ],\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 server.addHook('onRequest', async (request, reply) => {\n if (!requireAuth) {\n return;\n }\n\n if (request.url === '/health') {\n return;\n }\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\n const token = (typeof apiKeyHeader === 'string' ? apiKeyHeader : undefined) ?? bearerToken;\n\n if (!token || token !== daemonApiKey) {\n reply.code(401).send({ ok: false, error: 'Unauthorized' });\n }\n });\n observability.register(server);\n\n // Enable CORS with restricted origins\n const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(',') || [\n 'http://localhost:3000',\n 'http://localhost:5173', // Vite dev server\n ];\n\n await server.register(cors, {\n origin: (origin, callback) => {\n // TODO: Security - For production, implement proper authentication (API keys, mTLS)\n // instead of allowing no-origin requests. Currently allows for development convenience.\n\n // Allow requests with no origin ONLY in development\n if (!origin) {\n // Check NODE_ENV to determine environment\n const isDevelopment = process.env.NODE_ENV !== 'production';\n if (isDevelopment) {\n // Development: allow no-origin (curl, Postman, server-to-server)\n callback(null, true);\n return;\n }\n // Production: reject no-origin requests (enforce proper auth instead)\n callback(new Error('Origin header required in production'), false);\n return;\n }\n\n // Check if origin is in whitelist\n if (allowedOrigins.includes(origin)) {\n callback(null, true);\n } else {\n callback(new Error(`Origin ${origin} not allowed by CORS`), false);\n }\n },\n });\n\n // Register REST API routes\n registerJobsAPI({\n server,\n hostService,\n logger,\n observability,\n });\n\n registerCronAPI({\n server,\n hostService,\n logger,\n observability,\n });\n\n if (workflowService) {\n registerWorkflowsAPI({\n server,\n hostService,\n engine,\n workflowService,\n logger,\n observability,\n });\n }\n\n // Approvals API (always enabled — needed for builtin:approval steps)\n registerApprovalsAPI({\n server,\n engine,\n logger,\n observability,\n });\n\n // Stats API — dashboard statistics\n registerStatsAPI({\n server,\n hostService,\n cronScheduler,\n logger,\n });\n\n // Health check\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 = buildWorkflowChecks({ 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: {\n ready: true,\n },\n workflowCatalog: {\n ready: Boolean(workflowService),\n },\n cronScheduler: {\n ready: Boolean(cronScheduler),\n },\n },\n });\n });\n\n // Metrics\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 server.get('/observability/describe', async () => observability.buildDescribe());\n server.get('/observability/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n\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 return server;\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 {\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 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 buildWorkflowTopOperations(\n metrics: WorkflowMetrics,\n httpOperations: ServiceOperationSample[],\n): ServiceOperationSample[] {\n return [\n ...httpOperations,\n {\n operation: 'workflow.runs',\n count: metrics.runs.total,\n errorCount: metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq,\n },\n {\n operation: 'workflow.jobs',\n count: metrics.jobs.total,\n errorCount: metrics.jobs.failed,\n },\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 { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport { createWorkflowWorker } from './worker.js';\nimport { JobBroker } from './job-broker.js';\nimport { CronScheduler } from './cron-scheduler.js';\nimport { CronDiscovery } from './cron-discovery.js';\nimport { createServer } from './server.js';\nimport { createRegistry } from '@kb-labs/core-registry';\nimport { findRepoRoot } from '@kb-labs/core-sys';\nimport { randomUUID } from 'node:crypto';\nimport type { WorkflowWorker } from './worker.js';\nimport type { FastifyInstance } from 'fastify';\n\n// Singleton instances for cleanup\nlet workerInstance: WorkflowWorker | null = null;\nlet serverInstance: FastifyInstance | null = null;\nlet cronSchedulerInstance: CronScheduler | null = null;\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 // Detect repo root first\n const repoRoot = await findRepoRoot(cwd);\n\n // Initialize platform (loads .env + adapters from kb.config.json)\n await createServiceBootstrap({ appId: 'workflow-daemon', repoRoot });\n\n if (!platform.isConfigured('workspace')) {\n // Not fatal — workflows with explicit isolation: relaxed will still work.\n // But balanced (default) and strict isolation will fail at job execution time.\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 // Now we can use platform.logger (configured from kb.config.json)\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: {\n spanId: startupSpanId,\n invocationId: startupSpanId,\n executionId: startupSpanId,\n },\n });\n\n bootstrapLogger.info('Workflow daemon starting', { repoRoot });\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 // Initialize CLI API consumer snapshot\n bootstrapLogger.info('Loading plugin registry snapshot');\n\n const cliApi = await createRegistry({\n root: repoRoot,\n cache: {\n ttlMs: 10 * 60 * 1000, // 10 minutes\n },\n });\n\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 as any).snapshotManager,\n workspaceRoot: repoRoot,\n });\n\n // Mark stale running/queued runs as failed (they're orphaned from previous process)\n bootstrapLogger.info('Cleaning up stale runs from previous daemon process');\n await engine.cleanupStaleRuns();\n\n // Resume interrupted jobs from previous shutdown\n bootstrapLogger.info('Resuming interrupted jobs');\n await engine.resumeInterruptedJobs();\n\n // Create JobBroker\n bootstrapLogger.info('Creating JobBroker');\n const jobBroker = new JobBroker(engine, createWorkflowLogger('job-broker', 'workflow.job-broker'), platform);\n\n // Create CronScheduler (before HTTP server so it can be exposed via API)\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 // Store cron scheduler instance for cleanup\n cronSchedulerInstance = cronScheduler;\n\n // Discover cron jobs from plugin manifests and user YAML files (BEFORE HTTP server)\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: repoRoot,\n });\n\n const discovered = await cronDiscovery.discoverAll();\n bootstrapLogger.info('Cron job discovery complete', discovered);\n\n // Create WorkflowService for workflow definitions management\n bootstrapLogger.info('Creating WorkflowService');\n const workflowService = new WorkflowService({\n cliApi,\n platform,\n workspaceRoot: repoRoot,\n });\n\n // Create HTTP API server (pass cronDiscovery for refresh endpoint)\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 // Start HTTP server\n const port = parseInt(process.env.WORKFLOW_PORT || '7778', 10);\n await server.listen({ port, host: '0.0.0.0' });\n bootstrapLogger.info('HTTP API listening', { port });\n\n // Store server instance for cleanup\n serverInstance = server;\n\n // Create WorkflowWorker\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: repoRoot,\n concurrency: parseInt(process.env.WORKFLOW_CONCURRENCY || '5', 10),\n });\n\n // Store worker instance for cleanup\n workerInstance = worker;\n\n // Start worker\n bootstrapLogger.info('Starting WorkflowWorker');\n // Start worker in background (non-blocking)\n worker.start().catch(error => {\n bootstrapLogger.error('Worker crashed - shutting down daemon', error instanceof Error ? error : undefined);\n // Trigger graceful shutdown - daemon cannot function without worker\n process.kill(process.pid, 'SIGTERM');\n });\n\n // Start cron scheduler\n if (discovered.plugins + discovered.users > 0) {\n bootstrapLogger.info('Starting CronScheduler');\n await cronScheduler.start();\n } else {\n bootstrapLogger.info('No cron jobs found, skipping CronScheduler start');\n }\n\n bootstrapLogger.info('Workflow daemon started successfully', { port });\n\n // Setup graceful shutdown\n const shutdown = async (signal: string) => {\n bootstrapLogger.warn('Received shutdown signal', { signal });\n\n // Stop cron scheduler first (prevent new jobs from being scheduled)\n if (cronSchedulerInstance) {\n await cronSchedulerInstance.stop();\n cronSchedulerInstance = null;\n }\n\n // Stop worker (wait for in-flight jobs)\n if (workerInstance) {\n await workerInstance.stop();\n workerInstance = null;\n }\n\n // Close HTTP server\n if (serverInstance) {\n await serverInstance.close();\n serverInstance = null;\n }\n\n // Dispose CLI API\n await cliApi.dispose();\n\n // Shutdown platform (includes ExecutionBackend and all adapters)\n await platform.shutdown();\n bootstrapLogger.info('Workflow daemon shutdown complete');\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\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 console.error('Failed to start workflow daemon:', error);\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/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","run","entry","createCorrelatedLogger"],"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 } from '@kb-labs/workflow-contracts';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport {\n interpolateObject,\n evaluateExpression,\n resolveValue,\n} from '@kb-labs/workflow-contracts';\nimport type { GateInput, GateRouteAction } from '@kb-labs/workflow-builtins';\nimport { SandboxRunner } from '@kb-labs/workflow-runtime';\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\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 } = options;\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 backend: executionBackend as any, // ExecutionBackend type from plugin-execution\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 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 },\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 let runWorkspace = 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 as unknown as ILogger, {\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 \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 const exprCtx: ExpressionContext = {\n env: freshRun?.env ?? {},\n trigger: freshRun?.trigger ?? { type: 'manual' },\n steps: {},\n };\n\n // Collect outputs from all completed steps (across all jobs)\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 }\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 false)', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n condition,\n });\n await engine.markStepCompleted(run.id, job.id, step.id, { skipped: true });\n continue;\n }\n }\n\n // --- Interpolate spec.with (data flow between steps) ---\n const interpolatedWith = step.spec.with\n ? interpolateObject(step.spec.with as Record<string, unknown>, exprCtx)\n : undefined;\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 attempt: 1,\n executionId: stepExecutionId,\n spanId: stepExecutionId,\n invocationId: stepExecutionId,\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 });\n\n // --- Handle builtin:approval ---\n if (step.spec.uses === 'builtin:approval') {\n // If step is already waiting (e.g. daemon restarted), skip to polling\n if (step.status !== 'waiting_approval') {\n // Persist interpolated spec.with so REST API shows resolved values\n if (interpolatedWith) {\n const stateStore = engine.getStateStore();\n await stateStore.updateStep(run.id, job.id, step.id, (draft) => {\n draft.spec = { ...draft.spec, with: interpolatedWith };\n });\n }\n await engine.markStepWaitingApproval(run.id, job.id, step.id);\n }\n\n stepLogger.info('Waiting for approval', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n context: interpolatedWith,\n });\n\n // Poll until approval is resolved or stop is requested\n while (!stopRequested) {\n await sleep(2000);\n const currentRun = await engine.getRun(run.id);\n const currentJob = currentRun?.jobs.find(j => j.id === job.id);\n const currentStep = currentJob?.steps.find(s => s.id === step.id);\n\n if (!currentStep || currentStep.status === 'success') {\n stepLogger.info('Approval granted', { runId: run.id, stepId: step.id });\n break;\n }\n\n if (currentStep.status === 'failed') {\n const rejectMsg = currentStep.error?.message ?? 'Approval rejected';\n stepLogger.info('Approval rejected', { runId: run.id, stepId: step.id });\n throw new Error(rejectMsg);\n }\n }\n\n if (stopRequested) {\n stepLogger.info('Approval wait interrupted by shutdown', { stepId: step.id });\n return;\n }\n\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 const decisionPath = gateInput.decision;\n const maxIterations = gateInput.maxIterations ?? 3;\n\n // Resolve decision value from expression context\n const decisionValue = resolveValue(decisionPath, exprCtx);\n const decisionKey = String(decisionValue);\n\n // Find matching route\n const route: GateRouteAction | undefined =\n gateInput.routes[decisionKey] ?? gateInput.routes[decisionValue as string];\n const action = route ?? gateInput.default ?? 'fail';\n\n stepLogger.info('Gate evaluation', {\n runId: run.id,\n stepId: step.id,\n decision: decisionPath,\n decisionValue,\n action: typeof action === 'string' ? action : 'restart',\n });\n\n // Track gate iterations in run metadata\n const iterationKey = `gate:${step.spec.id ?? step.id}:iterations`;\n const metadata = (freshRun?.metadata ?? {}) as Record<string, unknown>;\n const currentIteration = (metadata[iterationKey] as number) ?? 0;\n\n if (action === 'continue') {\n await engine.markStepCompleted(run.id, job.id, step.id, {\n decisionValue,\n action: 'continue',\n iteration: currentIteration,\n });\n continue;\n }\n\n if (action === 'fail') {\n const error = new Error(`Gate failed: decision=${decisionKey}`);\n await engine.markStepFailed(run.id, job.id, step.id, error, {\n decisionValue,\n action: 'fail',\n iteration: currentIteration,\n });\n throw error;\n }\n\n // restartFrom action\n const restartAction = action as { restartFrom: string; context?: Record<string, unknown> };\n const nextIteration = currentIteration + 1;\n\n if (nextIteration >= maxIterations) {\n const error = new Error(\n `Gate max iterations reached (${maxIterations}) for step ${step.spec.id ?? step.id}`\n );\n await engine.markStepFailed(run.id, job.id, step.id, error, {\n decisionValue,\n action: 'fail',\n maxIterationsReached: true,\n iteration: currentIteration,\n maxIterations,\n });\n throw error;\n }\n\n stepLogger.info('Gate triggering restart', {\n restartFrom: restartAction.restartFrom,\n iteration: nextIteration,\n maxIterations,\n });\n\n // Mark gate step as completed (with restart info)\n await engine.markStepCompleted(run.id, job.id, step.id, {\n decisionValue,\n action: 'restart',\n restartFrom: restartAction.restartFrom,\n iteration: nextIteration,\n });\n\n // Update iteration counter in run metadata\n await engine.updateRun(run.id, (draft) => {\n const md = (draft.metadata ?? {}) as Record<string, unknown>;\n md[iterationKey] = nextIteration;\n (draft as any).metadata = md;\n\n // Merge rework context into trigger.payload\n if (restartAction.context) {\n const payload = (draft.trigger.payload ?? {}) as Record<string, unknown>;\n Object.assign(payload, restartAction.context);\n draft.trigger.payload = payload;\n }\n\n return draft;\n });\n\n // Reset steps from target to end of job (set to queued)\n const stateStore = engine.getStateStore();\n const scheduler = engine.getScheduler();\n let foundTarget = false;\n\n for (const s of job.steps) {\n if (s.spec.id === restartAction.restartFrom || s.id === restartAction.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 // Reset job status and re-enqueue\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 }\n\n // Exit processJob — worker will pick up the re-queued job\n return;\n }\n\n // --- Regular step execution ---\n // Mark step as started (sets startedAt timestamp)\n await engine.markStepStarted(run.id, job.id, step.id);\n\n // Build spec with interpolated `with`\n // Normalize `run: cmd` → `uses: builtin:shell, with: { command: cmd }`\n let baseSpec = step.spec as Record<string, unknown>;\n if ((baseSpec as any).run && !(baseSpec as any).uses) {\n const { run, with: existingWith, ...rest } = baseSpec as any;\n baseSpec = { ...rest, uses: 'builtin:shell', with: { ...existingWith, command: run } };\n }\n const interpolatedSpec = interpolatedWith\n ? { ...baseSpec, with: { ...(baseSpec.with as object ?? {}), ...interpolatedWith } }\n : baseSpec;\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: freshRun?.env || ({} as Record<string, string>),\n secrets: {} as Record<string, string>, // TODO: map run.secrets array to Record\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 onLog: (entry) => {\n void engine.publishLog(run.id, job.id, step.id, entry);\n },\n },\n workspace: runWorkspace,\n target,\n });\n\n if (result.status === 'failed') {\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 });\n throw error;\n }\n\n // Mark step as completed (sets finishedAt timestamp + outputs)\n await engine.markStepCompleted(run.id, job.id, step.id, result.status === 'success' ? result.outputs : undefined);\n\n stepLogger.info('Step completed', {\n runId: run.id,\n jobId: job.id,\n stepId: step.id,\n });\n }\n \n\n // Mark job as completed\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\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 } from '@kb-labs/core-platform';\nimport type { PlatformContainer } from '@kb-labs/core-runtime';\n\nexport interface SubmitJobRequest {\n handler: string;\n input?: unknown;\n priority?: 'low' | 'normal' | 'high';\n metadata?: Record<string, unknown>;\n}\n\nexport interface ScheduleJobRequest {\n handler: string;\n cron: string;\n input?: unknown;\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 // @ts-expect-error - WorkflowSpec step.with type mismatch\n with: request.input ?? ({} as Record<string, unknown>),\n },\n ],\n },\n },\n };\n\n // Submit to engine\n // @ts-expect-error - CreateRunInput type mismatch with inline options\n const run = await this.engine.runFromInline(spec, {\n env: {} as Record<string, string>,\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 * Schedule a recurring job with cron expression.\n * Registers job with CronScheduler (if available).\n *\n * NOTE: CronScheduler integration not yet implemented.\n * This is a placeholder for future implementation.\n */\n async schedule(request: ScheduleJobRequest): Promise<{ id: string; cron: string }> {\n this.logger.warn('CronScheduler not yet implemented', {\n handler: request.handler,\n cron: request.cron,\n });\n\n // TODO: Integrate with CronScheduler\n // const scheduleId = await this.cronScheduler.register({\n // id: `schedule-${Date.now()}`,\n // cron: request.cron,\n // handler: request.handler,\n // input: request.input,\n // });\n\n throw new Error('CronScheduler not yet implemented');\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 * 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; context?: Record<string, unknown> }>> {\n const run = await this.engine.getRun(runId);\n\n if (!run) {\n return [];\n }\n\n // Query logs using platform.logs service\n // Since LogQuery doesn't support metadata filtering, we need to:\n // 1. Query all logs in the time window of the job execution\n // 2. Filter in-memory by runId in fields\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n // Calculate time window for query\n const startTime = run.startedAt ? new Date(run.startedAt).getTime() : Date.now() - 3600000; // 1 hour ago fallback\n const endTime = run.finishedAt ? new Date(run.finishedAt).getTime() : Date.now();\n\n // Query logs with wider limit to ensure we get all logs after filtering\n const queryResult = await this.platform.logs.query(\n {\n from: startTime,\n to: endTime,\n level: options?.level && options.level !== 'all' ? options.level as any : undefined,\n },\n {\n limit: 1000, // Query more logs, then filter in-memory\n offset: 0,\n }\n );\n\n // Filter logs by runId in metadata\n const filteredLogs = queryResult.logs.filter((log: any) => {\n // Check if log has runId in fields metadata\n return log.fields.runId === runId ||\n log.fields.executionId === runId ||\n // Also check jobId and stepId for drill-down capability\n log.fields.jobId?.toString().startsWith(runId);\n });\n\n // Sort by timestamp (newest first)\n const sortedLogs = filteredLogs.sort((a: any, b: any) => b.timestamp - a.timestamp);\n\n // Apply pagination\n const paginatedLogs = sortedLogs.slice(offset, offset + limit);\n\n // Convert to expected format\n return paginatedLogs.map((log: any) => ({\n timestamp: new Date(log.timestamp).toISOString(),\n level: log.level,\n message: log.message,\n context: log.fields,\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 // Debug: log the spec being passed\n console.log('🔍 CRON SPEC:', JSON.stringify(spec, null, 2));\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 * @module @kb-labs/workflow-daemon/cron-discovery\n * CronDiscovery - discovers cron jobs from plugin manifests and user YAML files\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","import type { ILogger } from '@kb-labs/core-platform';\nimport type { WorkflowEngine, WorkflowService } 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 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 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 pattern = type.replace(/\\*/g, '.*');\n const regex = new RegExp(`^${pattern}$`);\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: any) => 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 any;\n const triggerType =\n request.trigger?.type === 'cron'\n ? 'schedule'\n : request.trigger?.type === 'api'\n ? 'webhook'\n : 'manual';\n\n const run = await this.options.engine.runFromSpec(spec, {\n trigger: {\n type: triggerType,\n actor: request.trigger?.user,\n payload:\n request.input && typeof request.input === 'object'\n ? (request.input as Record<string, unknown>)\n : undefined,\n },\n });\n\n return {\n runId: run.id,\n status: run.status,\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: any): 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 };\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return (await this.options.engine.getRun(runId)) as WorkflowRun | null;\n }\n\n async listRuns(filters?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ runs: WorkflowRun[]; 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 // 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 return { runs: runs.slice(start, end), total };\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.options.engine.getRun(runId);\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(runId);\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 const registerCronHandler = async (\n request: { headers: Record<string, unknown>; body: CronRegistrationRequest },\n reply: any,\n ) => {\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 const listCronHandler = async (_request: unknown, reply: any) => {\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 const unregisterCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const triggerCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const pauseCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 const resumeCronHandler = async (\n request: { params: CronIdParams; headers: Record<string, unknown> },\n reply: any,\n ) => {\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 server.post<{ Body: CronRegistrationRequest }>('/api/v1/crons', { schema: { tags: ['Cron'], summary: 'Register a cron job' } }, registerCronHandler as any);\n server.get('/api/v1/crons', { schema: { tags: ['Cron'], summary: 'List cron jobs' } }, listCronHandler as any);\n server.delete<{ Params: CronIdParams }>('/api/v1/crons/:id', { schema: { tags: ['Cron'], summary: 'Unregister a cron job' } }, unregisterCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/trigger', { schema: { tags: ['Cron'], summary: 'Trigger a cron job immediately' } }, triggerCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/pause', { schema: { tags: ['Cron'], summary: 'Pause a cron job' } }, pauseCronHandler as any);\n server.post<{ Params: CronIdParams }>('/api/v1/crons/:id/resume', { schema: { tags: ['Cron'], summary: 'Resume a cron job' } }, resumeCronHandler as any);\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 { 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'];\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/refresh - Reload workflow definitions from disk\n server.post('/api/v1/workflows/refresh', { schema: { tags: ['Workflows'], summary: 'Reload workflow definitions from disk' } }, 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: any) => 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 // 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 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 // GET /api/v1/runs - List all workflow runs (across all workflows)\n server.get<{\n Querystring: { status?: 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, limit, offset } = request.query;\n const response = await observability.observeOperation('workflow.run.list', () =>\n hostService.listRuns({\n status,\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/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 } = request.params;\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: workflow.event\\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 — close immediately\n if (TERMINAL_STATUSES.includes(run.status)) {\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 { fail, ok } from './response.js';\n\nexport interface ApprovalsAPIOptions {\n server: FastifyInstance;\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, 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 } = request.params;\n const run = await observability.observeOperation('workflow.approval.list', () => engine.getRun(runId));\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.spec.with ?? {}) as Record<string, unknown>,\n waitingSince: step.startedAt,\n });\n }\n }\n }\n\n return ok({ runId, 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 } = 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', () => engine.getRun(runId));\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(runId, jobId, stepId, action, data, comment),\n );\n\n logger.info('[approvals-api] Approval resolved', {\n runId,\n jobId,\n stepId,\n action,\n comment,\n });\n\n return ok({\n runId,\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 Fastify from 'fastify';\nimport cors from '@fastify/cors';\nimport {\n HttpObservabilityCollector,\n createServiceReadyResponse,\n metricLine,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\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) {\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 server = Fastify({\n logger: false, // Use platform logger instead\n bodyLimit: 1048576, // 1MB body limit (prevents parsing huge payloads)\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n // OpenAPI / Swagger UI — must be registered before routes\n await registerOpenAPI(server, {\n title: 'KB Labs Workflow Daemon',\n description: 'Background job execution and workflow orchestration API',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:7778', description: 'Local dev' }],\n ui: !isProduction,\n });\n const requireAuth = process.env.KB_DAEMON_REQUIRE_AUTH === 'true' || isProduction;\n const daemonApiKey = process.env.KB_DAEMON_API_KEY;\n const observability = new HttpObservabilityCollector({\n serviceId: 'workflow',\n serviceType: 'workflow-daemon',\n version: '1.0.0',\n logsSource: 'workflow',\n dependencies: [\n {\n serviceId: 'state-daemon',\n required: false,\n description: 'Workflow run and job state storage',\n },\n ],\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 server.addHook('onRequest', async (request, reply) => {\n if (!requireAuth) {\n return;\n }\n\n if (request.url === '/health') {\n return;\n }\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\n const token = (typeof apiKeyHeader === 'string' ? apiKeyHeader : undefined) ?? bearerToken;\n\n if (!token || token !== daemonApiKey) {\n reply.code(401).send({ ok: false, error: 'Unauthorized' });\n }\n });\n observability.register(server);\n\n // Enable CORS with restricted origins\n const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(',') || [\n 'http://localhost:3000',\n 'http://localhost:5173', // Vite dev server\n ];\n\n await server.register(cors, {\n origin: (origin, callback) => {\n // TODO: Security - For production, implement proper authentication (API keys, mTLS)\n // instead of allowing no-origin requests. Currently allows for development convenience.\n\n // Allow requests with no origin ONLY in development\n if (!origin) {\n // Check NODE_ENV to determine environment\n const isDevelopment = process.env.NODE_ENV !== 'production';\n if (isDevelopment) {\n // Development: allow no-origin (curl, Postman, server-to-server)\n callback(null, true);\n return;\n }\n // Production: reject no-origin requests (enforce proper auth instead)\n callback(new Error('Origin header required in production'), false);\n return;\n }\n\n // Check if origin is in whitelist\n if (allowedOrigins.includes(origin)) {\n callback(null, true);\n } else {\n callback(new Error(`Origin ${origin} not allowed by CORS`), false);\n }\n },\n });\n\n // Register REST API routes\n registerJobsAPI({\n server,\n hostService,\n logger,\n observability,\n });\n\n registerCronAPI({\n server,\n hostService,\n logger,\n observability,\n });\n\n if (workflowService) {\n registerWorkflowsAPI({\n server,\n hostService,\n engine,\n workflowService,\n logger,\n observability,\n });\n }\n\n // Approvals API (always enabled — needed for builtin:approval steps)\n registerApprovalsAPI({\n server,\n engine,\n logger,\n observability,\n });\n\n // Stats API — dashboard statistics\n registerStatsAPI({\n server,\n hostService,\n cronScheduler,\n logger,\n });\n\n // Health check\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 = buildWorkflowChecks({ 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: {\n ready: true,\n },\n workflowCatalog: {\n ready: Boolean(workflowService),\n },\n cronScheduler: {\n ready: Boolean(cronScheduler),\n },\n },\n });\n });\n\n // Metrics\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 server.get('/observability/describe', async () => observability.buildDescribe());\n server.get('/observability/health', async () => {\n const metrics = await hostService.getMetrics();\n const checks = buildWorkflowChecks({ workflowService, cronScheduler, metrics });\n\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 return server;\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 {\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 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 buildWorkflowTopOperations(\n metrics: WorkflowMetrics,\n httpOperations: ServiceOperationSample[],\n): ServiceOperationSample[] {\n return [\n ...httpOperations,\n {\n operation: 'workflow.runs',\n count: metrics.runs.total,\n errorCount: metrics.runs.failed + metrics.runs.cancelled + metrics.runs.dlq,\n },\n {\n operation: 'workflow.jobs',\n count: metrics.jobs.total,\n errorCount: metrics.jobs.failed,\n },\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 { WorkflowEngine, WorkflowService } from '@kb-labs/workflow-engine';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport { createWorkflowWorker } from './worker.js';\nimport { JobBroker } from './job-broker.js';\nimport { CronScheduler } from './cron-scheduler.js';\nimport { CronDiscovery } from './cron-discovery.js';\nimport { createServer } from './server.js';\nimport { createRegistry } from '@kb-labs/core-registry';\nimport { findRepoRoot } from '@kb-labs/core-sys';\nimport { randomUUID } from 'node:crypto';\nimport type { WorkflowWorker } from './worker.js';\nimport type { FastifyInstance } from 'fastify';\n\n// Singleton instances for cleanup\nlet workerInstance: WorkflowWorker | null = null;\nlet serverInstance: FastifyInstance | null = null;\nlet cronSchedulerInstance: CronScheduler | null = null;\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 // Detect repo root first\n const repoRoot = await findRepoRoot(cwd);\n\n // Initialize platform (loads .env + adapters from kb.config.json)\n await createServiceBootstrap({ appId: 'workflow-daemon', repoRoot });\n\n if (!platform.isConfigured('workspace')) {\n // Not fatal — workflows with explicit isolation: relaxed will still work.\n // But balanced (default) and strict isolation will fail at job execution time.\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 // Now we can use platform.logger (configured from kb.config.json)\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: {\n spanId: startupSpanId,\n invocationId: startupSpanId,\n executionId: startupSpanId,\n },\n });\n\n bootstrapLogger.info('Workflow daemon starting', { repoRoot });\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 // Initialize CLI API consumer snapshot\n bootstrapLogger.info('Loading plugin registry snapshot');\n\n const cliApi = await createRegistry({\n root: repoRoot,\n cache: {\n ttlMs: 10 * 60 * 1000, // 10 minutes\n },\n });\n\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 as any).snapshotManager,\n workspaceRoot: repoRoot,\n });\n\n // Mark stale running/queued runs as failed (they're orphaned from previous process)\n bootstrapLogger.info('Cleaning up stale runs from previous daemon process');\n await engine.cleanupStaleRuns();\n\n // Resume interrupted jobs from previous shutdown\n bootstrapLogger.info('Resuming interrupted jobs');\n await engine.resumeInterruptedJobs();\n\n // Create JobBroker\n bootstrapLogger.info('Creating JobBroker');\n const jobBroker = new JobBroker(engine, createWorkflowLogger('job-broker', 'workflow.job-broker'), platform);\n\n // Create CronScheduler (before HTTP server so it can be exposed via API)\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 // Store cron scheduler instance for cleanup\n cronSchedulerInstance = cronScheduler;\n\n // Discover cron jobs from plugin manifests and user YAML files (BEFORE HTTP server)\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: repoRoot,\n });\n\n const discovered = await cronDiscovery.discoverAll();\n bootstrapLogger.info('Cron job discovery complete', discovered);\n\n // Create WorkflowService for workflow definitions management\n bootstrapLogger.info('Creating WorkflowService');\n const workflowService = new WorkflowService({\n cliApi,\n platform,\n workspaceRoot: repoRoot,\n });\n\n // Create HTTP API server (pass cronDiscovery for refresh endpoint)\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 // Start HTTP server\n const port = parseInt(process.env.WORKFLOW_PORT || '7778', 10);\n await server.listen({ port, host: '0.0.0.0' });\n bootstrapLogger.info('HTTP API listening', { port });\n\n // Store server instance for cleanup\n serverInstance = server;\n\n // Create WorkflowWorker\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: repoRoot,\n concurrency: parseInt(process.env.WORKFLOW_CONCURRENCY || '5', 10),\n });\n\n // Store worker instance for cleanup\n workerInstance = worker;\n\n // Start worker\n bootstrapLogger.info('Starting WorkflowWorker');\n // Start worker in background (non-blocking)\n worker.start().catch(error => {\n bootstrapLogger.error('Worker crashed - shutting down daemon', error instanceof Error ? error : undefined);\n // Trigger graceful shutdown - daemon cannot function without worker\n process.kill(process.pid, 'SIGTERM');\n });\n\n // Start cron scheduler\n if (discovered.plugins + discovered.users > 0) {\n bootstrapLogger.info('Starting CronScheduler');\n await cronScheduler.start();\n } else {\n bootstrapLogger.info('No cron jobs found, skipping CronScheduler start');\n }\n\n bootstrapLogger.info('Workflow daemon started successfully', { port });\n\n // Setup graceful shutdown\n const shutdown = async (signal: string) => {\n bootstrapLogger.warn('Received shutdown signal', { signal });\n\n // Stop cron scheduler first (prevent new jobs from being scheduled)\n if (cronSchedulerInstance) {\n await cronSchedulerInstance.stop();\n cronSchedulerInstance = null;\n }\n\n // Stop worker (wait for in-flight jobs)\n if (workerInstance) {\n await workerInstance.stop();\n workerInstance = null;\n }\n\n // Close HTTP server\n if (serverInstance) {\n await serverInstance.close();\n serverInstance = null;\n }\n\n // Dispose CLI API\n await cliApi.dispose();\n\n // Shutdown platform (includes ExecutionBackend and all adapters)\n await platform.shutdown();\n bootstrapLogger.info('Workflow daemon shutdown complete');\n\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\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 console.error('Failed to start workflow daemon:', error);\n process.exit(1);\n }\n})();\n"]}
|
package/package.json
CHANGED
|
@@ -13,22 +13,22 @@
|
|
|
13
13
|
"node-cron": "^4.2.1",
|
|
14
14
|
"pino": "^9.0.0",
|
|
15
15
|
"yaml": "^2.8.0",
|
|
16
|
-
"@kb-labs/core-config": "2.
|
|
17
|
-
"@kb-labs/core-
|
|
18
|
-
"@kb-labs/core-
|
|
19
|
-
"@kb-labs/core-
|
|
20
|
-
"@kb-labs/core-registry": "2.
|
|
21
|
-
"@kb-labs/
|
|
22
|
-
"@kb-labs/
|
|
23
|
-
"@kb-labs/
|
|
24
|
-
"@kb-labs/
|
|
25
|
-
"@kb-labs/
|
|
26
|
-
"@kb-labs/
|
|
27
|
-
"@kb-labs/
|
|
28
|
-
"@kb-labs/
|
|
29
|
-
"@kb-labs/workflow-
|
|
30
|
-
"@kb-labs/
|
|
31
|
-
"@kb-labs/
|
|
16
|
+
"@kb-labs/core-config": "2.17.0",
|
|
17
|
+
"@kb-labs/core-contracts": "2.17.0",
|
|
18
|
+
"@kb-labs/core-runtime": "2.17.0",
|
|
19
|
+
"@kb-labs/core-sys": "2.17.0",
|
|
20
|
+
"@kb-labs/core-registry": "2.17.0",
|
|
21
|
+
"@kb-labs/plugin-contracts": "2.17.0",
|
|
22
|
+
"@kb-labs/workflow-builtins": "2.17.0",
|
|
23
|
+
"@kb-labs/core-platform": "2.17.0",
|
|
24
|
+
"@kb-labs/workflow-contracts": "2.17.0",
|
|
25
|
+
"@kb-labs/plugin-execution": "2.17.0",
|
|
26
|
+
"@kb-labs/shared-http": "2.17.0",
|
|
27
|
+
"@kb-labs/workflow-runtime": "2.17.0",
|
|
28
|
+
"@kb-labs/gateway-core": "2.17.0",
|
|
29
|
+
"@kb-labs/workflow-engine": "2.17.0",
|
|
30
|
+
"@kb-labs/plugin-execution-factory": "2.17.0",
|
|
31
|
+
"@kb-labs/gateway-auth": "2.17.0"
|
|
32
32
|
},
|
|
33
33
|
"description": "Workflow daemon for KB Labs - standalone service for background job execution",
|
|
34
34
|
"devDependencies": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"tsx": "^4.20.5",
|
|
40
40
|
"typescript": "^5.6.3",
|
|
41
41
|
"vitest": "^3.2.4",
|
|
42
|
-
"@kb-labs/devkit": "2.
|
|
42
|
+
"@kb-labs/devkit": "2.17.0"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=20.0.0",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"main": "./dist/index.js",
|
|
55
55
|
"name": "@kb-labs/workflow-daemon",
|
|
56
56
|
"type": "module",
|
|
57
|
-
"version": "2.
|
|
57
|
+
"version": "2.17.0",
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build": "tsup",
|
|
60
60
|
"clean": "rimraf dist",
|