@tasker-systems/tasker 0.1.0-alpha.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/events/event-names.ts","../../src/events/event-emitter.ts","../../src/events/event-poller.ts","../../src/logging/index.ts","../../src/types/step-context.ts","../../src/subscriber/step-execution-subscriber.ts","../../src/events/event-system.ts"],"names":["loggerOptions","pino","log"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Standard event names for the TypeScript worker.\n *\n * These constants provide type-safe event names that match\n * the event system used by other language workers.\n */\n\n/**\n * Event names for step execution lifecycle\n */\nexport const StepEventNames = {\n /** Emitted when a step execution event is received from the FFI layer */\n STEP_EXECUTION_RECEIVED: 'step.execution.received',\n\n /** Emitted when a step handler starts executing */\n STEP_EXECUTION_STARTED: 'step.execution.started',\n\n /** Emitted when a step handler completes successfully */\n STEP_EXECUTION_COMPLETED: 'step.execution.completed',\n\n /** Emitted when a step handler fails */\n STEP_EXECUTION_FAILED: 'step.execution.failed',\n\n /** Emitted when a step completion is sent back to Rust */\n STEP_COMPLETION_SENT: 'step.completion.sent',\n\n /** Emitted when a step handler times out */\n STEP_EXECUTION_TIMEOUT: 'step.execution.timeout',\n\n /** TAS-125: Emitted when a checkpoint yield is sent back to Rust */\n STEP_CHECKPOINT_YIELD_SENT: 'step.checkpoint_yield.sent',\n} as const;\n\n/**\n * Event names for worker lifecycle\n */\nexport const WorkerEventNames = {\n /** Emitted when the worker starts up */\n WORKER_STARTED: 'worker.started',\n\n /** Emitted when the worker is ready to process events */\n WORKER_READY: 'worker.ready',\n\n /** Emitted when graceful shutdown begins */\n WORKER_SHUTDOWN_STARTED: 'worker.shutdown.started',\n\n /** Emitted when the worker has fully stopped */\n WORKER_STOPPED: 'worker.stopped',\n\n /** Emitted when the worker encounters an error */\n WORKER_ERROR: 'worker.error',\n} as const;\n\n/**\n * Event names for polling lifecycle\n */\nexport const PollerEventNames = {\n /** Emitted when the poller starts */\n POLLER_STARTED: 'poller.started',\n\n /** Emitted when the poller stops */\n POLLER_STOPPED: 'poller.stopped',\n\n /** Emitted when a poll cycle completes */\n POLLER_CYCLE_COMPLETE: 'poller.cycle.complete',\n\n /** Emitted when starvation is detected */\n POLLER_STARVATION_DETECTED: 'poller.starvation.detected',\n\n /** Emitted when the poller encounters an error */\n POLLER_ERROR: 'poller.error',\n} as const;\n\n/**\n * Event names for metrics\n */\nexport const MetricsEventNames = {\n /** Emitted periodically with FFI dispatch metrics */\n METRICS_UPDATED: 'metrics.updated',\n\n /** Emitted when metrics collection fails */\n METRICS_ERROR: 'metrics.error',\n} as const;\n\n/**\n * All event names combined\n */\nexport const EventNames = {\n ...StepEventNames,\n ...WorkerEventNames,\n ...PollerEventNames,\n ...MetricsEventNames,\n} as const;\n\n/**\n * Type representing all possible event names\n */\nexport type EventName = (typeof EventNames)[keyof typeof EventNames];\n\n/**\n * Type representing step event names\n */\nexport type StepEventName = (typeof StepEventNames)[keyof typeof StepEventNames];\n\n/**\n * Type representing worker event names\n */\nexport type WorkerEventName = (typeof WorkerEventNames)[keyof typeof WorkerEventNames];\n\n/**\n * Type representing poller event names\n */\nexport type PollerEventName = (typeof PollerEventNames)[keyof typeof PollerEventNames];\n\n/**\n * Type representing metrics event names\n */\nexport type MetricsEventName = (typeof MetricsEventNames)[keyof typeof MetricsEventNames];\n","/**\n * Event emitter for TypeScript workers.\n *\n * Provides a type-safe event emitter wrapper that works across\n * all supported runtimes (Bun, Node.js, Deno).\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type { FfiDispatchMetrics, FfiStepEvent, StepExecutionResult } from '../ffi/types.js';\nimport {\n MetricsEventNames,\n PollerEventNames,\n StepEventNames,\n WorkerEventNames,\n} from './event-names.js';\n\n/**\n * Event payload types\n */\nexport interface StepExecutionReceivedPayload {\n event: FfiStepEvent;\n receivedAt: Date;\n}\n\nexport interface StepExecutionStartedPayload {\n eventId: string;\n stepUuid: string;\n taskUuid: string;\n handlerName: string;\n startedAt: Date;\n}\n\nexport interface StepExecutionCompletedPayload {\n eventId: string;\n stepUuid: string;\n taskUuid: string;\n result: StepExecutionResult;\n executionTimeMs: number;\n completedAt: Date;\n}\n\nexport interface StepExecutionFailedPayload {\n eventId: string;\n stepUuid: string;\n taskUuid: string;\n error: Error;\n failedAt: Date;\n}\n\nexport interface StepCompletionSentPayload {\n eventId: string;\n stepUuid: string;\n success: boolean;\n sentAt: Date;\n}\n\n/** TAS-125: Checkpoint yield event payload */\nexport interface StepCheckpointYieldSentPayload {\n eventId: string;\n stepUuid: string;\n cursor: unknown;\n itemsProcessed: number;\n timestamp: Date;\n}\n\nexport interface WorkerEventPayload {\n workerId?: string;\n timestamp: Date;\n message?: string;\n}\n\nexport interface WorkerErrorPayload {\n error: Error;\n timestamp: Date;\n context?: Record<string, unknown>;\n}\n\nexport interface PollerCyclePayload {\n eventsProcessed: number;\n cycleNumber: number;\n timestamp: Date;\n}\n\nexport interface MetricsPayload {\n metrics: FfiDispatchMetrics;\n timestamp: Date;\n}\n\n/**\n * Event map for type-safe event handling\n */\nexport interface TaskerEventMap {\n // Step events\n 'step.execution.received': StepExecutionReceivedPayload;\n 'step.execution.started': StepExecutionStartedPayload;\n 'step.execution.completed': StepExecutionCompletedPayload;\n 'step.execution.failed': StepExecutionFailedPayload;\n 'step.completion.sent': StepCompletionSentPayload;\n 'step.execution.timeout': StepExecutionFailedPayload;\n // TAS-125: Checkpoint yield event\n 'step.checkpoint_yield.sent': StepCheckpointYieldSentPayload;\n\n // Worker events\n 'worker.started': WorkerEventPayload;\n 'worker.ready': WorkerEventPayload;\n 'worker.shutdown.started': WorkerEventPayload;\n 'worker.stopped': WorkerEventPayload;\n 'worker.error': WorkerErrorPayload;\n\n // Poller events\n 'poller.started': WorkerEventPayload;\n 'poller.stopped': WorkerEventPayload;\n 'poller.cycle.complete': PollerCyclePayload;\n 'poller.starvation.detected': MetricsPayload;\n 'poller.error': WorkerErrorPayload;\n\n // Metrics events\n 'metrics.updated': MetricsPayload;\n 'metrics.error': WorkerErrorPayload;\n}\n\n/**\n * Type-safe event emitter for Tasker events\n */\nexport class TaskerEventEmitter extends EventEmitter<TaskerEventMap> {\n private readonly instanceId: string;\n\n constructor() {\n super();\n this.instanceId = crypto.randomUUID();\n }\n\n /**\n * Get the unique instance ID for this emitter\n */\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Emit a step execution received event\n */\n emitStepReceived(event: FfiStepEvent): void {\n this.emit(StepEventNames.STEP_EXECUTION_RECEIVED, {\n event,\n receivedAt: new Date(),\n });\n }\n\n /**\n * Emit a step execution started event\n */\n emitStepStarted(eventId: string, stepUuid: string, taskUuid: string, handlerName: string): void {\n this.emit(StepEventNames.STEP_EXECUTION_STARTED, {\n eventId,\n stepUuid,\n taskUuid,\n handlerName,\n startedAt: new Date(),\n });\n }\n\n /**\n * Emit a step execution completed event\n */\n emitStepCompleted(\n eventId: string,\n stepUuid: string,\n taskUuid: string,\n result: StepExecutionResult,\n executionTimeMs: number\n ): void {\n this.emit(StepEventNames.STEP_EXECUTION_COMPLETED, {\n eventId,\n stepUuid,\n taskUuid,\n result,\n executionTimeMs,\n completedAt: new Date(),\n });\n }\n\n /**\n * Emit a step execution failed event\n */\n emitStepFailed(eventId: string, stepUuid: string, taskUuid: string, error: Error): void {\n this.emit(StepEventNames.STEP_EXECUTION_FAILED, {\n eventId,\n stepUuid,\n taskUuid,\n error,\n failedAt: new Date(),\n });\n }\n\n /**\n * Emit a step completion sent event\n */\n emitCompletionSent(eventId: string, stepUuid: string, success: boolean): void {\n this.emit(StepEventNames.STEP_COMPLETION_SENT, {\n eventId,\n stepUuid,\n success,\n sentAt: new Date(),\n });\n }\n\n /**\n * Emit a worker started event\n */\n emitWorkerStarted(workerId?: string): void {\n this.emit(WorkerEventNames.WORKER_STARTED, {\n workerId,\n timestamp: new Date(),\n message: 'Worker started',\n });\n }\n\n /**\n * Emit a worker ready event\n */\n emitWorkerReady(workerId?: string): void {\n this.emit(WorkerEventNames.WORKER_READY, {\n workerId,\n timestamp: new Date(),\n message: 'Worker ready to process events',\n });\n }\n\n /**\n * Emit a worker shutdown started event\n */\n emitWorkerShutdownStarted(workerId?: string): void {\n this.emit(WorkerEventNames.WORKER_SHUTDOWN_STARTED, {\n workerId,\n timestamp: new Date(),\n message: 'Graceful shutdown initiated',\n });\n }\n\n /**\n * Emit a worker stopped event\n */\n emitWorkerStopped(workerId?: string): void {\n this.emit(WorkerEventNames.WORKER_STOPPED, {\n workerId,\n timestamp: new Date(),\n message: 'Worker stopped',\n });\n }\n\n /**\n * Emit a worker error event\n */\n emitWorkerError(error: Error, context?: Record<string, unknown>): void {\n this.emit(WorkerEventNames.WORKER_ERROR, {\n error,\n timestamp: new Date(),\n context,\n });\n }\n\n /**\n * Emit a metrics updated event\n */\n emitMetricsUpdated(metrics: FfiDispatchMetrics): void {\n this.emit(MetricsEventNames.METRICS_UPDATED, {\n metrics,\n timestamp: new Date(),\n });\n }\n\n /**\n * Emit a starvation detected event\n */\n emitStarvationDetected(metrics: FfiDispatchMetrics): void {\n this.emit(PollerEventNames.POLLER_STARVATION_DETECTED, {\n metrics,\n timestamp: new Date(),\n });\n }\n}\n","/**\n * Event poller for TypeScript workers.\n *\n * Provides a polling loop that retrieves step events from the Rust FFI layer\n * and dispatches them to registered handlers. Uses a 10ms polling interval\n * matching other language workers.\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { FfiDispatchMetrics, FfiStepEvent } from '../ffi/types.js';\nimport type { TaskerEventEmitter } from './event-emitter.js';\nimport { MetricsEventNames, PollerEventNames, StepEventNames } from './event-names.js';\n\n// Create a pino logger for the event poller\nconst loggerOptions: LoggerOptions = {\n name: 'event-poller',\n level: process.env.RUST_LOG ?? 'info',\n};\n\n// Add pino-pretty transport in non-production environments\nif (process.env.TASKER_ENV !== 'production') {\n loggerOptions.transport = {\n target: 'pino-pretty',\n options: { colorize: true },\n };\n}\n\nconst log: Logger = pino(loggerOptions);\n\n/**\n * Configuration for the event poller\n */\nexport interface EventPollerConfig {\n /** Polling interval in milliseconds (default: 10) */\n pollIntervalMs?: number;\n\n /** Number of polls between starvation checks (default: 100) */\n starvationCheckInterval?: number;\n\n /** Number of polls between cleanup operations (default: 1000) */\n cleanupInterval?: number;\n\n /** Number of polls between metrics emissions (default: 100) */\n metricsInterval?: number;\n\n /** Maximum events to process per poll cycle (default: 100) */\n maxEventsPerCycle?: number;\n}\n\n/**\n * Callback for step event handling\n */\nexport type StepEventCallback = (event: FfiStepEvent) => Promise<void>;\n\n/**\n * Callback for error handling\n */\nexport type ErrorCallback = (error: Error) => void;\n\n/**\n * Callback for metrics handling\n */\nexport type MetricsCallback = (metrics: FfiDispatchMetrics) => void;\n\n/**\n * Event poller state\n */\nexport type PollerState = 'stopped' | 'running' | 'stopping';\n\n/**\n * Event poller for retrieving and dispatching step events from the FFI layer.\n *\n * The poller runs a continuous loop that:\n * 1. Polls for step events at 10ms intervals\n * 2. Dispatches received events to registered handlers\n * 3. Periodically checks for starvation conditions\n * 4. Performs cleanup of timed-out events\n * 5. Emits metrics for monitoring\n */\nexport class EventPoller {\n private readonly runtime: TaskerRuntime;\n private readonly config: Required<EventPollerConfig>;\n private readonly emitter: TaskerEventEmitter;\n\n private state: PollerState = 'stopped';\n private pollCount = 0;\n private cycleCount = 0;\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n private stepEventCallback: StepEventCallback | null = null;\n private errorCallback: ErrorCallback | null = null;\n private metricsCallback: MetricsCallback | null = null;\n\n /**\n * Create a new EventPoller.\n *\n * @param runtime - The FFI runtime for polling events\n * @param emitter - The event emitter to dispatch events to (required, no fallback)\n * @param config - Optional configuration for polling behavior\n */\n constructor(runtime: TaskerRuntime, emitter: TaskerEventEmitter, config: EventPollerConfig = {}) {\n this.runtime = runtime;\n this.emitter = emitter;\n this.config = {\n pollIntervalMs: config.pollIntervalMs ?? 10,\n starvationCheckInterval: config.starvationCheckInterval ?? 100,\n cleanupInterval: config.cleanupInterval ?? 1000,\n metricsInterval: config.metricsInterval ?? 100,\n maxEventsPerCycle: config.maxEventsPerCycle ?? 100,\n };\n }\n\n /**\n * Get the current poller state\n */\n getState(): PollerState {\n return this.state;\n }\n\n /**\n * Check if the poller is running\n */\n isRunning(): boolean {\n return this.state === 'running';\n }\n\n /**\n * Get the total number of polls executed\n */\n getPollCount(): number {\n return this.pollCount;\n }\n\n /**\n * Get the total number of cycles completed\n */\n getCycleCount(): number {\n return this.cycleCount;\n }\n\n /**\n * Register a callback for step events\n */\n onStepEvent(callback: StepEventCallback): this {\n this.stepEventCallback = callback;\n return this;\n }\n\n /**\n * Register a callback for errors\n */\n onError(callback: ErrorCallback): this {\n this.errorCallback = callback;\n return this;\n }\n\n /**\n * Register a callback for metrics\n */\n onMetrics(callback: MetricsCallback): this {\n this.metricsCallback = callback;\n return this;\n }\n\n /**\n * Start the polling loop\n */\n start(): void {\n log.info(\n { component: 'event-poller', operation: 'start', currentState: this.state },\n 'EventPoller start() called'\n );\n\n if (this.state === 'running') {\n log.debug({ component: 'event-poller' }, 'Already running, returning early');\n return; // Already running\n }\n\n log.debug(\n { component: 'event-poller', runtimeLoaded: this.runtime.isLoaded },\n 'Checking runtime.isLoaded'\n );\n if (!this.runtime.isLoaded) {\n throw new Error('Runtime not loaded. Call runtime.load() first.');\n }\n\n this.state = 'running';\n this.pollCount = 0;\n this.cycleCount = 0;\n\n this.emitter.emit(PollerEventNames.POLLER_STARTED, {\n timestamp: new Date(),\n message: 'Event poller started',\n });\n\n log.info(\n { component: 'event-poller', intervalMs: this.config.pollIntervalMs },\n 'Setting up setInterval for polling'\n );\n\n // Start the polling loop\n this.intervalId = setInterval(() => {\n this.poll();\n }, this.config.pollIntervalMs);\n\n log.info(\n { component: 'event-poller', intervalId: String(this.intervalId) },\n 'setInterval created, polling active'\n );\n }\n\n /**\n * Stop the polling loop\n */\n async stop(): Promise<void> {\n if (this.state === 'stopped') {\n return; // Already stopped\n }\n\n this.state = 'stopping';\n\n // Clear the interval\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n this.state = 'stopped';\n\n this.emitter.emit(PollerEventNames.POLLER_STOPPED, {\n timestamp: new Date(),\n message: `Event poller stopped after ${this.pollCount} polls`,\n });\n }\n\n /**\n * Execute a single poll cycle\n */\n private poll(): void {\n // Log first poll at info level to confirm interval is working\n if (this.pollCount === 0) {\n log.info(\n { component: 'event-poller', state: this.state },\n 'First poll() call - setInterval is working'\n );\n }\n\n // Log every 100th poll to avoid spam\n if (this.pollCount % 100 === 0) {\n log.debug(\n { component: 'event-poller', pollCount: this.pollCount, state: this.state },\n 'poll() cycle'\n );\n }\n\n if (this.state !== 'running') {\n return;\n }\n\n this.pollCount++;\n\n try {\n // Poll for events (non-blocking)\n let eventsProcessed = 0;\n\n for (let i = 0; i < this.config.maxEventsPerCycle; i++) {\n const event = this.runtime.pollStepEvents();\n if (event === null) {\n break; // No more events\n }\n\n eventsProcessed++;\n const handlerCallable = event.step_definition.handler.callable;\n log.info(\n {\n component: 'event-poller',\n operation: 'event_received',\n stepUuid: event.step_uuid,\n handlerCallable,\n eventIndex: i,\n },\n `Received step event for handler: ${handlerCallable}`\n );\n this.handleStepEvent(event);\n }\n\n // Periodic starvation check\n if (this.pollCount % this.config.starvationCheckInterval === 0) {\n this.checkStarvation();\n }\n\n // Periodic cleanup\n if (this.pollCount % this.config.cleanupInterval === 0) {\n this.runtime.cleanupTimeouts();\n }\n\n // Periodic metrics\n if (this.pollCount % this.config.metricsInterval === 0) {\n this.emitMetrics();\n }\n\n // Emit cycle complete\n this.cycleCount++;\n if (eventsProcessed > 0) {\n this.emitter.emit(PollerEventNames.POLLER_CYCLE_COMPLETE, {\n eventsProcessed,\n cycleNumber: this.cycleCount,\n timestamp: new Date(),\n });\n }\n } catch (error) {\n this.handleError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Handle a step event\n */\n private handleStepEvent(event: FfiStepEvent): void {\n const handlerCallable = event.step_definition.handler.callable;\n log.debug(\n {\n component: 'event-poller',\n operation: 'handle_step_event',\n stepUuid: event.step_uuid,\n handlerCallable,\n hasCallback: !!this.stepEventCallback,\n },\n 'Handling step event'\n );\n\n // Log emitter instance for debugging\n const listenerCountBefore = this.emitter.listenerCount(StepEventNames.STEP_EXECUTION_RECEIVED);\n log.info(\n {\n component: 'event-poller',\n emitterInstanceId: this.emitter.getInstanceId(),\n stepUuid: event.step_uuid,\n listenerCount: listenerCountBefore,\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n `About to emit ${StepEventNames.STEP_EXECUTION_RECEIVED} event`\n );\n\n // Emit the event through the event emitter with error handling\n try {\n const emitResult = this.emitter.emit(StepEventNames.STEP_EXECUTION_RECEIVED, {\n event,\n receivedAt: new Date(),\n });\n log.info(\n {\n component: 'event-poller',\n stepUuid: event.step_uuid,\n emitResult,\n listenerCountAfter: this.emitter.listenerCount(StepEventNames.STEP_EXECUTION_RECEIVED),\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n `Emit returned: ${emitResult} (true means listeners were called)`\n );\n } catch (emitError) {\n log.error(\n {\n component: 'event-poller',\n stepUuid: event.step_uuid,\n error: emitError instanceof Error ? emitError.message : String(emitError),\n stack: emitError instanceof Error ? emitError.stack : undefined,\n },\n 'Error during emit'\n );\n }\n\n // Call the registered callback if present\n if (this.stepEventCallback) {\n log.debug(\n { component: 'event-poller', stepUuid: event.step_uuid },\n 'Invoking step event callback'\n );\n this.stepEventCallback(event).catch((error) => {\n this.handleError(error instanceof Error ? error : new Error(String(error)));\n });\n } else {\n log.warn(\n { component: 'event-poller', stepUuid: event.step_uuid },\n 'No step event callback registered!'\n );\n }\n }\n\n /**\n * Check for starvation conditions\n */\n private checkStarvation(): void {\n try {\n this.runtime.checkStarvationWarnings();\n\n const metrics = this.runtime.getFfiDispatchMetrics();\n if (metrics.starvation_detected) {\n this.emitter.emitStarvationDetected(metrics);\n }\n } catch (error) {\n // Log but don't fail the poll loop\n this.handleError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Emit current metrics\n */\n private emitMetrics(): void {\n try {\n const metrics = this.runtime.getFfiDispatchMetrics();\n this.emitter.emitMetricsUpdated(metrics);\n\n if (this.metricsCallback) {\n this.metricsCallback(metrics);\n }\n } catch (error) {\n this.emitter.emit(MetricsEventNames.METRICS_ERROR, {\n error: error instanceof Error ? error : new Error(String(error)),\n timestamp: new Date(),\n });\n }\n }\n\n /**\n * Handle an error\n */\n private handleError(error: Error): void {\n this.emitter.emit(PollerEventNames.POLLER_ERROR, {\n error,\n timestamp: new Date(),\n });\n\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n }\n}\n\n/**\n * Create an event poller with the given runtime, emitter, and configuration\n */\nexport function createEventPoller(\n runtime: TaskerRuntime,\n emitter: TaskerEventEmitter,\n config?: EventPollerConfig\n): EventPoller {\n return new EventPoller(runtime, emitter, config);\n}\n","/**\n * Structured logging API for TypeScript workers.\n *\n * Provides unified structured logging that integrates with Rust tracing\n * infrastructure via FFI. All log messages are forwarded to the Rust\n * tracing subscriber for consistent formatting and output.\n *\n * Matches Python's logging module and Ruby's tracing module (TAS-92 aligned).\n *\n * To enable FFI logging, call setLoggingRuntime() after loading the FFI layer.\n * If no runtime is installed, logs fall back to console output.\n */\n\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { LogFields as FfiLogFields } from '../ffi/types.js';\n\n/**\n * Installed runtime for logging.\n * Set via setLoggingRuntime() for explicit dependency injection.\n */\nlet installedRuntime: TaskerRuntime | null = null;\n\n/**\n * Install a runtime for logging to use.\n *\n * Call this after loading the FFI layer to enable Rust tracing integration.\n * If not called, logs fall back to console output.\n *\n * @param runtime - The runtime to use for logging\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * setLoggingRuntime(ffiLayer.getRuntime());\n * ```\n */\nexport function setLoggingRuntime(runtime: TaskerRuntime): void {\n installedRuntime = runtime;\n}\n\n/**\n * Clear the installed logging runtime.\n *\n * Primarily for testing.\n */\nexport function clearLoggingRuntime(): void {\n installedRuntime = null;\n}\n\n/**\n * Get the runtime for logging.\n * Returns null if no runtime is installed (falls back to console).\n * @internal\n */\nfunction getLoggingRuntime(): TaskerRuntime | null {\n if (installedRuntime?.isLoaded) {\n return installedRuntime;\n }\n return null;\n}\n\n/**\n * Structured logging fields.\n *\n * All fields are optional. Common fields include:\n * - component: Component/subsystem identifier (e.g., \"handler\", \"registry\")\n * - operation: Operation being performed (e.g., \"process_payment\")\n * - correlation_id: Distributed tracing correlation ID\n * - task_uuid: Task identifier\n * - step_uuid: Step identifier\n * - namespace: Task namespace\n * - error_message: Error message for error logs\n * - duration_ms: Execution duration for timed operations\n */\nexport interface LogFields {\n [key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Convert LogFields to FFI-compatible format.\n * FFI expects all values as string | number | boolean | null.\n */\nfunction toFfiFields(fields?: LogFields): FfiLogFields {\n if (!fields) {\n return {};\n }\n\n const result: FfiLogFields = {};\n for (const [key, value] of Object.entries(fields)) {\n if (value !== undefined) {\n result[key] = value as string | number | boolean | null;\n }\n }\n return result;\n}\n\n/**\n * Fallback console logging when FFI is not available.\n */\nfunction fallbackLog(level: string, message: string, fields?: LogFields): void {\n const timestamp = new Date().toISOString();\n const fieldsStr = fields ? ` ${JSON.stringify(fields)}` : '';\n console.log(`[${timestamp}] ${level.toUpperCase()}: ${message}${fieldsStr}`);\n}\n\n/**\n * Log an ERROR level message with structured fields.\n *\n * Use this for unrecoverable failures that require intervention.\n *\n * @param message - The log message\n * @param fields - Optional structured fields for context\n *\n * @example\n * logError('Database connection failed', {\n * component: 'database',\n * operation: 'connect',\n * error_message: 'Connection timeout',\n * });\n */\nexport function logError(message: string, fields?: LogFields): void {\n const runtime = getLoggingRuntime();\n if (!runtime) {\n fallbackLog('error', message, fields);\n return;\n }\n\n try {\n runtime.logError(message, toFfiFields(fields));\n } catch {\n fallbackLog('error', message, fields);\n }\n}\n\n/**\n * Log a WARN level message with structured fields.\n *\n * Use this for degraded operation or retryable failures.\n *\n * @param message - The log message\n * @param fields - Optional structured fields for context\n *\n * @example\n * logWarn('Retry attempt 3 of 5', {\n * component: 'handler',\n * operation: 'retry',\n * attempt: 3,\n * });\n */\nexport function logWarn(message: string, fields?: LogFields): void {\n const runtime = getLoggingRuntime();\n if (!runtime) {\n fallbackLog('warn', message, fields);\n return;\n }\n\n try {\n runtime.logWarn(message, toFfiFields(fields));\n } catch {\n fallbackLog('warn', message, fields);\n }\n}\n\n/**\n * Log an INFO level message with structured fields.\n *\n * Use this for lifecycle events and state transitions.\n *\n * @param message - The log message\n * @param fields - Optional structured fields for context\n *\n * @example\n * logInfo('Task processing started', {\n * component: 'handler',\n * operation: 'process_payment',\n * correlation_id: 'abc-123',\n * task_uuid: 'task-456',\n * });\n */\nexport function logInfo(message: string, fields?: LogFields): void {\n const runtime = getLoggingRuntime();\n if (!runtime) {\n fallbackLog('info', message, fields);\n return;\n }\n\n try {\n runtime.logInfo(message, toFfiFields(fields));\n } catch {\n fallbackLog('info', message, fields);\n }\n}\n\n/**\n * Log a DEBUG level message with structured fields.\n *\n * Use this for detailed diagnostic information during development.\n *\n * @param message - The log message\n * @param fields - Optional structured fields for context\n *\n * @example\n * logDebug('Parsed request payload', {\n * component: 'handler',\n * payload_size: 1024,\n * content_type: 'application/json',\n * });\n */\nexport function logDebug(message: string, fields?: LogFields): void {\n const runtime = getLoggingRuntime();\n if (!runtime) {\n fallbackLog('debug', message, fields);\n return;\n }\n\n try {\n runtime.logDebug(message, toFfiFields(fields));\n } catch {\n fallbackLog('debug', message, fields);\n }\n}\n\n/**\n * Log a TRACE level message with structured fields.\n *\n * Use this for very verbose logging, like function entry/exit.\n * This level is typically disabled in production.\n *\n * @param message - The log message\n * @param fields - Optional structured fields for context\n *\n * @example\n * logTrace('Entering process_step', {\n * component: 'handler',\n * step_uuid: 'step-789',\n * });\n */\nexport function logTrace(message: string, fields?: LogFields): void {\n const runtime = getLoggingRuntime();\n if (!runtime) {\n fallbackLog('trace', message, fields);\n return;\n }\n\n try {\n runtime.logTrace(message, toFfiFields(fields));\n } catch {\n fallbackLog('trace', message, fields);\n }\n}\n\n/**\n * Create a logger with preset fields.\n *\n * Useful for creating component-specific loggers that automatically\n * include common fields in every log message.\n *\n * @param defaultFields - Fields to include in every log message\n * @returns Logger object with log methods\n *\n * @example\n * const logger = createLogger({ component: 'payment_handler' });\n * logger.info('Processing payment', { amount: 100 });\n * // Logs: { component: 'payment_handler', amount: 100 }\n */\nexport function createLogger(defaultFields: LogFields) {\n const mergeFields = (fields?: LogFields): LogFields => ({\n ...defaultFields,\n ...fields,\n });\n\n return {\n error: (message: string, fields?: LogFields) => logError(message, mergeFields(fields)),\n warn: (message: string, fields?: LogFields) => logWarn(message, mergeFields(fields)),\n info: (message: string, fields?: LogFields) => logInfo(message, mergeFields(fields)),\n debug: (message: string, fields?: LogFields) => logDebug(message, mergeFields(fields)),\n trace: (message: string, fields?: LogFields) => logTrace(message, mergeFields(fields)),\n };\n}\n","import type { FfiStepEvent } from '../ffi/types';\n\n/**\n * Parameters for constructing a StepContext.\n */\nexport interface StepContextParams {\n event: FfiStepEvent;\n taskUuid: string;\n stepUuid: string;\n correlationId: string;\n handlerName: string;\n inputData: Record<string, unknown>;\n dependencyResults: Record<string, unknown>;\n stepConfig: Record<string, unknown>;\n stepInputs: Record<string, unknown>;\n retryCount: number;\n maxRetries: number;\n}\n\n/**\n * Context provided to step handlers during execution.\n *\n * Contains all information needed for a step handler to execute,\n * including input data, dependency results, and configuration.\n *\n * Matches Python's StepContext and Ruby's StepContext (post-TAS-96).\n *\n * @example\n * ```typescript\n * class MyHandler extends StepHandler {\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderId = context.inputData['order_id'];\n * const previousResult = context.getDependencyResult('step_1');\n * // ... handler logic ...\n * return this.success({ processed: true });\n * }\n * }\n * ```\n */\nexport class StepContext {\n /** The original FFI step event */\n public readonly event: FfiStepEvent;\n\n /** Task UUID */\n public readonly taskUuid: string;\n\n /** Step UUID */\n public readonly stepUuid: string;\n\n /** Correlation ID for tracing */\n public readonly correlationId: string;\n\n /** Name of the handler being executed */\n public readonly handlerName: string;\n\n /** Input data for the handler (from task context) */\n public readonly inputData: Record<string, unknown>;\n\n /** Results from dependent steps */\n public readonly dependencyResults: Record<string, unknown>;\n\n /** Handler-specific configuration (from step_definition.handler.initialization) */\n public readonly stepConfig: Record<string, unknown>;\n\n /** Step-specific inputs (from workflow_step.inputs, used for batch cursor config) */\n public readonly stepInputs: Record<string, unknown>;\n\n /** Current retry attempt number */\n public readonly retryCount: number;\n\n /** Maximum retry attempts allowed */\n public readonly maxRetries: number;\n\n constructor(params: StepContextParams) {\n this.event = params.event;\n this.taskUuid = params.taskUuid;\n this.stepUuid = params.stepUuid;\n this.correlationId = params.correlationId;\n this.handlerName = params.handlerName;\n this.inputData = params.inputData;\n this.dependencyResults = params.dependencyResults;\n this.stepConfig = params.stepConfig;\n this.stepInputs = params.stepInputs;\n this.retryCount = params.retryCount;\n this.maxRetries = params.maxRetries;\n }\n\n /**\n * Create a StepContext from an FFI event.\n *\n * Extracts input data, dependency results, and configuration from\n * the task_sequence_step payload.\n *\n * The FFI data structure mirrors the Ruby TaskSequenceStepWrapper:\n * - task.context -> inputData (task context with user inputs)\n * - dependency_results -> results from parent steps\n * - step_definition.handler.initialization -> stepConfig\n * - workflow_step.attempts -> retryCount\n * - workflow_step.max_attempts -> maxRetries\n * - workflow_step.inputs -> stepInputs\n *\n * @param event - The FFI step event\n * @param handlerName - Name of the handler to execute\n * @returns A StepContext populated from the event\n */\n static fromFfiEvent(event: FfiStepEvent, handlerName: string): StepContext {\n // Extract task context (inputData) from the task structure\n // The task field contains task metadata including context\n const task = event.task ?? {};\n const inputData = (task.context as Record<string, unknown>) ?? {};\n\n // Extract dependency results\n const dependencyResults = (event.dependency_results as Record<string, unknown>) ?? {};\n\n // Extract step config from handler initialization\n const stepDefinition = event.step_definition ?? {};\n const handlerConfig = stepDefinition.handler ?? {};\n const stepConfig = (handlerConfig.initialization as Record<string, unknown>) ?? {};\n\n // Extract retry information and step inputs from workflow_step\n const workflowStep = event.workflow_step ?? {};\n const retryCount = workflowStep.attempts ?? 0;\n const maxRetries = workflowStep.max_attempts ?? 3;\n const stepInputs = (workflowStep.inputs as Record<string, unknown>) ?? {};\n\n return new StepContext({\n event,\n taskUuid: event.task_uuid,\n stepUuid: event.step_uuid,\n correlationId: event.correlation_id,\n handlerName,\n inputData,\n dependencyResults,\n stepConfig,\n stepInputs,\n retryCount,\n maxRetries,\n });\n }\n\n /**\n * Get the computed result value from a dependency step.\n *\n * This method extracts the actual computed value from a dependency result,\n * unwrapping any nested structure. Matches Python's get_dependency_result().\n *\n * The dependency result structure can be:\n * - {\"result\": actual_value} - unwraps to actual_value\n * - primitive value - returns as-is\n *\n * @param stepName - Name of the dependency step\n * @returns The computed result value, or null if not found\n *\n * @example\n * ```typescript\n * // Instead of:\n * const step1Result = context.dependencyResults['step_1'] || {};\n * const value = step1Result.result; // Might be nested!\n *\n * // Use:\n * const value = context.getDependencyResult('step_1'); // Unwrapped\n * ```\n */\n getDependencyResult(stepName: string): unknown {\n const resultHash = this.dependencyResults[stepName];\n if (resultHash === undefined || resultHash === null) {\n return null;\n }\n\n // If it's an object with a 'result' key, extract that value\n if (typeof resultHash === 'object' && resultHash !== null && 'result' in resultHash) {\n return (resultHash as Record<string, unknown>).result;\n }\n\n // Otherwise return the whole thing (might be a primitive value)\n return resultHash;\n }\n\n /**\n * Get a value from the input data.\n *\n * @param key - The key to look up in inputData\n * @returns The value or undefined if not found\n */\n getInput<T = unknown>(key: string): T | undefined {\n return this.inputData[key] as T | undefined;\n }\n\n /**\n * Get a value from the step configuration.\n *\n * @param key - The key to look up in stepConfig\n * @returns The value or undefined if not found\n */\n getConfig<T = unknown>(key: string): T | undefined {\n return this.stepConfig[key] as T | undefined;\n }\n\n /**\n * Check if this is a retry attempt.\n *\n * @returns True if retryCount > 0\n */\n isRetry(): boolean {\n return this.retryCount > 0;\n }\n\n /**\n * Check if this is the last allowed retry attempt.\n *\n * @returns True if retryCount >= maxRetries - 1\n */\n isLastRetry(): boolean {\n return this.retryCount >= this.maxRetries - 1;\n }\n\n /**\n * Get a value from the input data with a default.\n *\n * @param key - The key to look up in inputData\n * @param defaultValue - Value to return if key not found or undefined\n * @returns The value or default if not found/undefined\n *\n * @example\n * ```typescript\n * const batchSize = context.getInputOr('batch_size', 100);\n * ```\n */\n getInputOr<T = unknown>(key: string, defaultValue: T): T {\n const value = this.inputData[key];\n return value === undefined ? defaultValue : (value as T);\n }\n\n /**\n * Extract a nested field from a dependency result.\n *\n * Useful when dependency results are complex objects and you need\n * to extract a specific nested value without manual object traversal.\n *\n * @param stepName - Name of the dependency step\n * @param path - Path elements to traverse into the result\n * @returns The nested value, or null if not found\n *\n * @example\n * ```typescript\n * // Extract nested field from dependency result\n * const csvPath = context.getDependencyField('analyze_csv', 'csv_file_path');\n * // Multiple levels deep\n * const value = context.getDependencyField('step_1', 'data', 'items');\n * ```\n */\n getDependencyField(stepName: string, ...path: string[]): unknown {\n let result = this.getDependencyResult(stepName);\n if (result === null || result === undefined) {\n return null;\n }\n for (const key of path) {\n if (typeof result !== 'object' || result === null) {\n return null;\n }\n result = (result as Record<string, unknown>)[key];\n }\n return result;\n }\n\n // ===========================================================================\n // CHECKPOINT ACCESSORS (TAS-125 Batch Processing Support)\n // ===========================================================================\n\n /**\n * Get the raw checkpoint data from the workflow step.\n *\n * @returns The checkpoint data object or null if not set\n */\n get checkpoint(): Record<string, unknown> | null {\n const workflowStep = this.event.workflow_step ?? {};\n return (workflowStep.checkpoint as Record<string, unknown>) ?? null;\n }\n\n /**\n * Get the checkpoint cursor position.\n *\n * The cursor represents the current position in batch processing,\n * allowing handlers to resume from where they left off.\n *\n * @returns The cursor value (number, string, or object) or null if not set\n *\n * @example\n * ```typescript\n * const cursor = context.checkpointCursor;\n * const startFrom = cursor ?? 0;\n * ```\n */\n get checkpointCursor(): unknown {\n return this.checkpoint?.cursor ?? null;\n }\n\n /**\n * Get the number of items processed in the current batch run.\n *\n * @returns Number of items processed (0 if no checkpoint)\n */\n get checkpointItemsProcessed(): number {\n return (this.checkpoint?.items_processed as number) ?? 0;\n }\n\n /**\n * Get the accumulated results from batch processing.\n *\n * Accumulated results allow handlers to maintain running totals\n * or aggregated state across checkpoint boundaries.\n *\n * @returns The accumulated results object or null if not set\n *\n * @example\n * ```typescript\n * const totals = context.accumulatedResults ?? {};\n * const currentSum = totals.sum ?? 0;\n * ```\n */\n get accumulatedResults(): Record<string, unknown> | null {\n return (this.checkpoint?.accumulated_results as Record<string, unknown>) ?? null;\n }\n\n /**\n * Check if a checkpoint exists for this step.\n *\n * @returns True if a checkpoint cursor exists\n *\n * @example\n * ```typescript\n * if (context.hasCheckpoint()) {\n * console.log(`Resuming from cursor: ${context.checkpointCursor}`);\n * }\n * ```\n */\n hasCheckpoint(): boolean {\n return this.checkpointCursor !== null;\n }\n\n /**\n * Get all dependency result keys.\n *\n * @returns Array of step names that have dependency results\n */\n getDependencyResultKeys(): string[] {\n return Object.keys(this.dependencyResults);\n }\n\n /**\n * Get all dependency results matching a step name prefix.\n *\n * This is useful for batch processing where multiple worker steps\n * share a common prefix (e.g., \"process_batch_001\", \"process_batch_002\").\n *\n * Returns the unwrapped result values (same as getDependencyResult).\n *\n * @param prefix - Step name prefix to match\n * @returns Array of unwrapped result values from matching steps\n *\n * @example\n * ```typescript\n * // For batch worker results named: process_batch_001, process_batch_002, etc.\n * const batchResults = context.getAllDependencyResults('process_batch_');\n * const total = batchResults.reduce((sum, r) => sum + r.count, 0);\n * ```\n */\n getAllDependencyResults(prefix: string): unknown[] {\n const results: unknown[] = [];\n\n for (const key of Object.keys(this.dependencyResults)) {\n if (key.startsWith(prefix)) {\n const result = this.getDependencyResult(key);\n if (result !== null) {\n results.push(result);\n }\n }\n }\n\n return results;\n }\n}\n","/**\n * Step execution subscriber for TypeScript workers.\n *\n * Subscribes to step execution events from the EventPoller and dispatches\n * them to the appropriate handlers via the HandlerRegistry.\n *\n * Matches Python's StepExecutionSubscriber pattern (TAS-92 aligned).\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { StepExecutionReceivedPayload, TaskerEventEmitter } from '../events/event-emitter.js';\nimport { StepEventNames } from '../events/event-names.js';\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { CheckpointYieldData, FfiStepEvent, StepExecutionResult } from '../ffi/types.js';\nimport type { ExecutableHandler } from '../handler/base.js';\nimport { logDebug, logError, logInfo, logWarn } from '../logging/index.js';\nimport { StepContext } from '../types/step-context.js';\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\n\n// Create a pino logger for the subscriber (for debugging)\nconst loggerOptions: LoggerOptions = {\n name: 'step-subscriber',\n level: process.env.RUST_LOG ?? 'info',\n};\n\n// Add pino-pretty transport in non-production environments\nif (process.env.TASKER_ENV !== 'production') {\n loggerOptions.transport = {\n target: 'pino-pretty',\n options: { colorize: true },\n };\n}\n\nconst pinoLog: Logger = pino(loggerOptions);\n\n/**\n * Interface for handler registry required by StepExecutionSubscriber.\n *\n * TAS-93: Updated to support async resolution via ResolverChain.\n * Returns ExecutableHandler which includes both StepHandler and MethodDispatchWrapper.\n */\nexport interface HandlerRegistryInterface {\n /** Resolve and instantiate a handler by name (async for resolver chain support) */\n resolve(name: string): Promise<ExecutableHandler | null>;\n}\n\n/**\n * Configuration for the step execution subscriber.\n */\nexport interface StepExecutionSubscriberConfig {\n /** Worker ID for result attribution */\n workerId?: string;\n\n /** Maximum concurrent handler executions (default: 10) */\n maxConcurrent?: number;\n\n /** Handler execution timeout in milliseconds (default: 300000 = 5 minutes) */\n handlerTimeoutMs?: number;\n}\n\n/**\n * Subscribes to step execution events and dispatches them to handlers.\n *\n * This is the critical component that connects the FFI event stream\n * to TypeScript handler execution. It:\n * 1. Listens for step events from the EventPoller via EventEmitter\n * 2. Resolves the appropriate handler from the HandlerRegistry\n * 3. Creates a StepContext from the FFI event\n * 4. Executes the handler\n * 5. Submits the result back to Rust via FFI\n *\n * @example\n * ```typescript\n * const subscriber = new StepExecutionSubscriber(\n * eventEmitter,\n * handlerRegistry,\n * runtime,\n * { workerId: 'worker-1' }\n * );\n *\n * subscriber.start();\n *\n * // Later...\n * subscriber.stop();\n * ```\n */\nexport class StepExecutionSubscriber {\n private readonly emitter: TaskerEventEmitter;\n private readonly registry: HandlerRegistryInterface;\n private readonly runtime: TaskerRuntime;\n private readonly workerId: string;\n private readonly maxConcurrent: number;\n private readonly handlerTimeoutMs: number;\n\n private running = false;\n private activeHandlers = 0;\n private processedCount = 0;\n private errorCount = 0;\n\n /**\n * Create a new StepExecutionSubscriber.\n *\n * @param emitter - The event emitter to subscribe to (required, no fallback)\n * @param registry - The handler registry for resolving step handlers\n * @param runtime - The FFI runtime for submitting results (required, no fallback)\n * @param config - Optional configuration for execution behavior\n */\n constructor(\n emitter: TaskerEventEmitter,\n registry: HandlerRegistryInterface,\n runtime: TaskerRuntime,\n config: StepExecutionSubscriberConfig = {}\n ) {\n this.emitter = emitter;\n this.registry = registry;\n this.runtime = runtime;\n this.workerId = config.workerId ?? `typescript-worker-${process.pid}`;\n this.maxConcurrent = config.maxConcurrent ?? 10;\n this.handlerTimeoutMs = config.handlerTimeoutMs ?? 300000;\n }\n\n /**\n * Start subscribing to step execution events.\n */\n start(): void {\n pinoLog.info(\n { component: 'subscriber', emitterInstanceId: this.emitter.getInstanceId() },\n 'StepExecutionSubscriber.start() called'\n );\n\n if (this.running) {\n logWarn('StepExecutionSubscriber already running', {\n component: 'subscriber',\n });\n return;\n }\n\n this.running = true;\n this.processedCount = 0;\n this.errorCount = 0;\n\n // Subscribe to step events\n pinoLog.info(\n {\n component: 'subscriber',\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n emitterInstanceId: this.emitter.getInstanceId(),\n },\n 'Registering event listener on emitter'\n );\n\n this.emitter.on(\n StepEventNames.STEP_EXECUTION_RECEIVED,\n (payload: StepExecutionReceivedPayload) => {\n try {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: payload.event.event_id,\n stepUuid: payload.event.step_uuid,\n },\n 'Received step event in subscriber callback!'\n );\n // Extract the event from the payload wrapper\n pinoLog.info({ component: 'subscriber' }, 'About to call handleEvent from callback');\n this.handleEvent(payload.event);\n pinoLog.info({ component: 'subscriber' }, 'handleEvent returned from callback');\n } catch (error) {\n pinoLog.error(\n {\n component: 'subscriber',\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'EXCEPTION in event listener callback!'\n );\n }\n }\n );\n\n pinoLog.info(\n { component: 'subscriber', workerId: this.workerId },\n 'StepExecutionSubscriber started successfully'\n );\n\n logInfo('StepExecutionSubscriber started', {\n component: 'subscriber',\n operation: 'start',\n worker_id: this.workerId,\n });\n }\n\n /**\n * Stop subscribing to step execution events.\n *\n * Note: Does not wait for in-flight handlers to complete.\n * Use waitForCompletion() if you need to wait.\n */\n stop(): void {\n if (!this.running) {\n return;\n }\n\n this.running = false;\n this.emitter.removeAllListeners(StepEventNames.STEP_EXECUTION_RECEIVED);\n\n logInfo('StepExecutionSubscriber stopped', {\n component: 'subscriber',\n operation: 'stop',\n processed_count: String(this.processedCount),\n error_count: String(this.errorCount),\n });\n }\n\n /**\n * Check if the subscriber is running.\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the count of events processed.\n */\n getProcessedCount(): number {\n return this.processedCount;\n }\n\n /**\n * Get the count of errors encountered.\n */\n getErrorCount(): number {\n return this.errorCount;\n }\n\n /**\n * Get the count of currently active handlers.\n */\n getActiveHandlers(): number {\n return this.activeHandlers;\n }\n\n /**\n * Wait for all active handlers to complete.\n *\n * @param timeoutMs - Maximum time to wait (default: 30000)\n * @returns True if all handlers completed, false if timeout\n */\n async waitForCompletion(timeoutMs = 30000): Promise<boolean> {\n const startTime = Date.now();\n const checkInterval = 100;\n\n while (this.activeHandlers > 0) {\n if (Date.now() - startTime > timeoutMs) {\n logWarn('Timeout waiting for handlers to complete', {\n component: 'subscriber',\n active_handlers: String(this.activeHandlers),\n });\n return false;\n }\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n }\n\n return true;\n }\n\n /**\n * Handle a step execution event.\n */\n private handleEvent(event: FfiStepEvent): void {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.event_id,\n running: this.running,\n activeHandlers: this.activeHandlers,\n maxConcurrent: this.maxConcurrent,\n },\n 'handleEvent() called'\n );\n\n if (!this.running) {\n pinoLog.warn(\n { component: 'subscriber', eventId: event.event_id },\n 'Received event while stopped, ignoring'\n );\n return;\n }\n\n // Check concurrency limit\n if (this.activeHandlers >= this.maxConcurrent) {\n pinoLog.warn(\n {\n component: 'subscriber',\n activeHandlers: this.activeHandlers,\n maxConcurrent: this.maxConcurrent,\n },\n 'Max concurrent handlers reached, event will be re-polled'\n );\n // Don't process - event stays in FFI queue and will be re-polled\n return;\n }\n\n pinoLog.info(\n { component: 'subscriber', eventId: event.event_id },\n 'About to call processEvent()'\n );\n\n // Process asynchronously\n this.processEvent(event).catch((error) => {\n pinoLog.error(\n {\n component: 'subscriber',\n eventId: event.event_id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Unhandled error in processEvent'\n );\n });\n }\n\n /**\n * Process a step execution event.\n */\n private async processEvent(event: FfiStepEvent): Promise<void> {\n pinoLog.info({ component: 'subscriber', eventId: event.event_id }, 'processEvent() starting');\n\n this.activeHandlers++;\n const startTime = Date.now();\n\n try {\n // Extract handler name from step definition\n const handlerName = this.extractHandlerName(event);\n pinoLog.info(\n { component: 'subscriber', eventId: event.event_id, handlerName },\n 'Extracted handler name'\n );\n\n if (!handlerName) {\n pinoLog.error(\n { component: 'subscriber', eventId: event.event_id },\n 'No handler name found!'\n );\n await this.submitErrorResult(event, 'No handler name found in step definition', startTime);\n return;\n }\n\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n handlerName,\n },\n 'Processing step event'\n );\n\n // Emit started event\n this.emitter.emit(StepEventNames.STEP_EXECUTION_STARTED, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n handlerName,\n timestamp: new Date(),\n });\n\n // Resolve handler from registry (TAS-93: async for resolver chain support)\n pinoLog.info({ component: 'subscriber', handlerName }, 'Resolving handler from registry...');\n const handler = await this.registry.resolve(handlerName);\n pinoLog.info(\n { component: 'subscriber', handlerName, handlerFound: !!handler },\n 'Handler resolution result'\n );\n\n if (!handler) {\n pinoLog.error({ component: 'subscriber', handlerName }, 'Handler not found in registry!');\n await this.submitErrorResult(event, `Handler not found: ${handlerName}`, startTime);\n return;\n }\n\n // Create context from FFI event\n pinoLog.info({ component: 'subscriber', handlerName }, 'Creating StepContext from FFI event');\n const context = StepContext.fromFfiEvent(event, handlerName);\n pinoLog.info(\n { component: 'subscriber', handlerName },\n 'StepContext created, executing handler'\n );\n\n // Execute handler with timeout\n const result = await this.executeWithTimeout(\n () => handler.call(context),\n this.handlerTimeoutMs\n );\n\n pinoLog.info(\n { component: 'subscriber', handlerName, success: result.success },\n 'Handler execution completed'\n );\n\n const executionTimeMs = Date.now() - startTime;\n\n // Submit result to Rust\n await this.submitResult(event, result, executionTimeMs);\n\n // Emit completed/failed event\n if (result.success) {\n this.emitter.emit(StepEventNames.STEP_EXECUTION_COMPLETED, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n handlerName,\n executionTimeMs,\n timestamp: new Date(),\n });\n } else {\n this.emitter.emit(StepEventNames.STEP_EXECUTION_FAILED, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n handlerName,\n error: result.errorMessage,\n executionTimeMs,\n timestamp: new Date(),\n });\n }\n\n this.processedCount++;\n } catch (error) {\n this.errorCount++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logError('Handler execution failed', {\n component: 'subscriber',\n event_id: event.event_id,\n step_uuid: event.step_uuid,\n error_message: errorMessage,\n });\n\n await this.submitErrorResult(event, errorMessage, startTime);\n\n this.emitter.emit(StepEventNames.STEP_EXECUTION_FAILED, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n error: errorMessage,\n executionTimeMs: Date.now() - startTime,\n timestamp: new Date(),\n });\n } finally {\n this.activeHandlers--;\n }\n }\n\n /**\n * Execute a function with a timeout.\n */\n private async executeWithTimeout<T>(fn: () => Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n fn(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Handler execution timed out after ${timeoutMs}ms`)),\n timeoutMs\n )\n ),\n ]);\n }\n\n /**\n * Extract handler name from FFI event.\n *\n * The handler name is in step_definition.handler.callable\n */\n private extractHandlerName(event: FfiStepEvent): string | null {\n const stepDefinition = event.step_definition;\n if (!stepDefinition) {\n return null;\n }\n\n const handler = stepDefinition.handler;\n if (!handler) {\n return null;\n }\n\n return handler.callable || null;\n }\n\n /**\n * Submit a handler result via FFI.\n *\n * TAS-125: Detects checkpoint yields and routes them to checkpointYieldStepEvent\n * instead of the normal completion path.\n */\n private async submitResult(\n event: FfiStepEvent,\n result: StepHandlerResult,\n executionTimeMs: number\n ): Promise<void> {\n pinoLog.info(\n { component: 'subscriber', eventId: event.event_id, runtimeLoaded: this.runtime.isLoaded },\n 'submitResult() called'\n );\n\n if (!this.runtime.isLoaded) {\n pinoLog.error(\n { component: 'subscriber', eventId: event.event_id },\n 'Cannot submit result: runtime not loaded!'\n );\n return;\n }\n\n // TAS-125: Check for checkpoint yield in metadata\n if (result.metadata?.checkpoint_yield === true) {\n await this.submitCheckpointYield(event, result);\n return;\n }\n\n const executionResult = this.buildExecutionResult(event, result, executionTimeMs);\n await this.sendCompletionViaFfi(event, executionResult, result.success);\n }\n\n /**\n * TAS-125: Submit a checkpoint yield via FFI.\n *\n * Called when a handler returns a checkpoint_yield result.\n * This persists the checkpoint and re-dispatches the step.\n */\n private async submitCheckpointYield(\n event: FfiStepEvent,\n result: StepHandlerResult\n ): Promise<void> {\n pinoLog.info(\n { component: 'subscriber', eventId: event.event_id },\n 'submitCheckpointYield() called - handler yielded checkpoint'\n );\n\n // Extract checkpoint data from the result\n const resultData = result.result ?? {};\n const checkpointData: CheckpointYieldData = {\n step_uuid: event.step_uuid,\n cursor: resultData.cursor ?? 0,\n items_processed: (resultData.items_processed as number) ?? 0,\n };\n\n // Only set accumulated_results if it exists\n const accumulatedResults = resultData.accumulated_results as\n | Record<string, unknown>\n | undefined;\n if (accumulatedResults !== undefined) {\n checkpointData.accumulated_results = accumulatedResults;\n }\n\n try {\n const success = this.runtime.checkpointYieldStepEvent(event.event_id, checkpointData);\n\n if (success) {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.event_id,\n cursor: checkpointData.cursor,\n itemsProcessed: checkpointData.items_processed,\n },\n 'Checkpoint yield submitted successfully - step will be re-dispatched'\n );\n\n this.emitter.emit(StepEventNames.STEP_CHECKPOINT_YIELD_SENT, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n cursor: checkpointData.cursor,\n itemsProcessed: checkpointData.items_processed,\n timestamp: new Date(),\n });\n\n logInfo('Checkpoint yield submitted', {\n component: 'subscriber',\n event_id: event.event_id,\n step_uuid: event.step_uuid,\n cursor: String(checkpointData.cursor),\n items_processed: String(checkpointData.items_processed),\n });\n } else {\n pinoLog.error(\n { component: 'subscriber', eventId: event.event_id },\n 'Checkpoint yield rejected by Rust - event may not be in pending map'\n );\n logError('Checkpoint yield rejected', {\n component: 'subscriber',\n event_id: event.event_id,\n step_uuid: event.step_uuid,\n });\n }\n } catch (error) {\n pinoLog.error(\n {\n component: 'subscriber',\n eventId: event.event_id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Checkpoint yield failed with error'\n );\n logError('Failed to submit checkpoint yield', {\n component: 'subscriber',\n event_id: event.event_id,\n error_message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Submit an error result via FFI (for handler resolution/execution failures).\n */\n private async submitErrorResult(\n event: FfiStepEvent,\n errorMessage: string,\n startTime: number\n ): Promise<void> {\n if (!this.runtime.isLoaded) {\n logError('Cannot submit error result: runtime not available', {\n component: 'subscriber',\n event_id: event.event_id,\n });\n return;\n }\n\n const executionTimeMs = Date.now() - startTime;\n const executionResult = this.buildErrorExecutionResult(event, errorMessage, executionTimeMs);\n\n const accepted = await this.sendCompletionViaFfi(event, executionResult, false);\n if (accepted) {\n this.errorCount++;\n }\n }\n\n /**\n * Build a StepExecutionResult from a handler result.\n *\n * IMPORTANT: metadata.retryable must be set for Rust's is_retryable() to work correctly.\n */\n private buildExecutionResult(\n event: FfiStepEvent,\n result: StepHandlerResult,\n executionTimeMs: number\n ): StepExecutionResult {\n const executionResult: StepExecutionResult = {\n step_uuid: event.step_uuid,\n success: result.success,\n result: result.result ?? {},\n metadata: {\n execution_time_ms: executionTimeMs,\n worker_id: this.workerId,\n handler_name: this.extractHandlerName(event) ?? 'unknown',\n attempt_number: event.workflow_step?.attempts ?? 1,\n retryable: result.retryable ?? false,\n ...result.metadata,\n },\n status: result.success ? 'completed' : 'failed',\n };\n\n // Only add error field when not successful\n if (!result.success) {\n executionResult.error = {\n message: result.errorMessage ?? 'Unknown error',\n error_type: result.errorType ?? 'handler_error',\n retryable: result.retryable,\n status_code: null,\n backtrace: null,\n };\n }\n\n return executionResult;\n }\n\n /**\n * Build an error StepExecutionResult for handler resolution/execution failures.\n *\n * IMPORTANT: metadata.retryable must be set for Rust's is_retryable() to work correctly.\n */\n private buildErrorExecutionResult(\n event: FfiStepEvent,\n errorMessage: string,\n executionTimeMs: number\n ): StepExecutionResult {\n return {\n step_uuid: event.step_uuid,\n success: false,\n result: {},\n metadata: {\n execution_time_ms: executionTimeMs,\n worker_id: this.workerId,\n retryable: true,\n },\n status: 'error',\n error: {\n message: errorMessage,\n error_type: 'handler_error',\n retryable: true,\n status_code: null,\n backtrace: null,\n },\n };\n }\n\n /**\n * Send a completion result to Rust via FFI and handle the response.\n *\n * @returns true if the completion was accepted by Rust, false otherwise\n */\n private async sendCompletionViaFfi(\n event: FfiStepEvent,\n executionResult: StepExecutionResult,\n isSuccess: boolean\n ): Promise<boolean> {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n resultJson: JSON.stringify(executionResult),\n },\n 'About to call runtime.completeStepEvent()'\n );\n\n try {\n const ffiResult = this.runtime.completeStepEvent(event.event_id, executionResult);\n\n if (ffiResult) {\n this.handleFfiSuccess(event, executionResult, isSuccess);\n return true;\n }\n this.handleFfiRejection(event);\n return false;\n } catch (error) {\n this.handleFfiError(event, error);\n return false;\n }\n }\n\n /**\n * Handle successful FFI completion submission.\n */\n private handleFfiSuccess(\n event: FfiStepEvent,\n executionResult: StepExecutionResult,\n isSuccess: boolean\n ): void {\n pinoLog.info(\n { component: 'subscriber', eventId: event.event_id, success: isSuccess },\n 'completeStepEvent() returned TRUE - completion accepted by Rust'\n );\n\n this.emitter.emit(StepEventNames.STEP_COMPLETION_SENT, {\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n success: isSuccess,\n timestamp: new Date(),\n });\n\n logDebug('Step result submitted', {\n component: 'subscriber',\n event_id: event.event_id,\n step_uuid: event.step_uuid,\n success: String(isSuccess),\n execution_time_ms: String(executionResult.metadata.execution_time_ms),\n });\n }\n\n /**\n * Handle FFI completion rejection (event not in pending map).\n */\n private handleFfiRejection(event: FfiStepEvent): void {\n pinoLog.error(\n {\n component: 'subscriber',\n eventId: event.event_id,\n stepUuid: event.step_uuid,\n },\n 'completeStepEvent() returned FALSE - completion REJECTED by Rust! Event may not be in pending map.'\n );\n logError('FFI completion rejected', {\n component: 'subscriber',\n event_id: event.event_id,\n step_uuid: event.step_uuid,\n });\n }\n\n /**\n * Handle FFI completion error.\n */\n private handleFfiError(event: FfiStepEvent, error: unknown): void {\n pinoLog.error(\n {\n component: 'subscriber',\n eventId: event.event_id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'completeStepEvent() THREW AN ERROR!'\n );\n logError('Failed to submit step result', {\n component: 'subscriber',\n event_id: event.event_id,\n error_message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n","/**\n * EventSystem - Unified event processing system for TypeScript workers.\n *\n * This class owns and manages the complete event flow:\n * - TaskerEventEmitter: Event bus for step events\n * - EventPoller: Polls FFI for step events, emits to emitter\n * - StepExecutionSubscriber: Subscribes to emitter, dispatches to handlers\n *\n * By owning all three components, EventSystem guarantees they share the\n * same emitter instance, eliminating reference sharing bugs.\n *\n * Design principles:\n * - Explicit construction: All dependencies injected via constructor\n * - Clear ownership: This class owns the emitter lifecycle\n * - Explicit lifecycle: start() and stop() methods with defined phases\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport {\n type HandlerRegistryInterface,\n StepExecutionSubscriber,\n} from '../subscriber/step-execution-subscriber.js';\nimport type { StepExecutionReceivedPayload } from './event-emitter.js';\nimport { TaskerEventEmitter } from './event-emitter.js';\nimport { StepEventNames } from './event-names.js';\nimport { EventPoller } from './event-poller.js';\n\n// Re-export for backwards compatibility\nexport type { HandlerRegistryInterface };\n\n// Create a pino logger for the event system (for debugging)\nconst loggerOptions: LoggerOptions = {\n name: 'event-system',\n level: process.env.RUST_LOG ?? 'info',\n};\n\n// Add pino-pretty transport in non-production environments\nif (process.env.TASKER_ENV !== 'production') {\n loggerOptions.transport = {\n target: 'pino-pretty',\n options: { colorize: true },\n };\n}\n\nconst log: Logger = pino(loggerOptions);\n\n/**\n * Configuration for EventPoller within EventSystem.\n */\nexport interface EventPollerConfig {\n /** Polling interval in milliseconds (default: 10) */\n pollIntervalMs?: number;\n\n /** Number of polls between starvation checks (default: 100) */\n starvationCheckInterval?: number;\n\n /** Number of polls between cleanup operations (default: 1000) */\n cleanupInterval?: number;\n\n /** Number of polls between metrics emissions (default: 100) */\n metricsInterval?: number;\n\n /** Maximum events to process per poll cycle (default: 100) */\n maxEventsPerCycle?: number;\n}\n\n/**\n * Configuration for StepExecutionSubscriber within EventSystem.\n */\nexport interface SubscriberConfig {\n /** Unique identifier for this worker (default: typescript-worker-{pid}) */\n workerId?: string;\n\n /** Maximum number of concurrent handler executions (default: 10) */\n maxConcurrent?: number;\n\n /** Timeout for individual handler execution in milliseconds (default: 300000) */\n handlerTimeoutMs?: number;\n}\n\n/**\n * Complete configuration for EventSystem.\n */\nexport interface EventSystemConfig {\n /** Configuration for the event poller */\n poller?: EventPollerConfig;\n\n /** Configuration for the step execution subscriber */\n subscriber?: SubscriberConfig;\n}\n\n/**\n * Statistics about the event system's operation.\n */\nexport interface EventSystemStats {\n /** Whether the system is currently running */\n running: boolean;\n\n /** Total events processed by the subscriber */\n processedCount: number;\n\n /** Total errors encountered during processing */\n errorCount: number;\n\n /** Number of currently active handler executions */\n activeHandlers: number;\n\n /** Total poll cycles executed */\n pollCount: number;\n}\n\n/**\n * Unified event processing system.\n *\n * Owns the complete event flow: emitter → poller → subscriber.\n * Guarantees all components share the same emitter instance.\n *\n * @example\n * ```typescript\n * const eventSystem = new EventSystem(runtime, registry, {\n * poller: { pollIntervalMs: 10 },\n * subscriber: { workerId: 'worker-1', maxConcurrent: 10 },\n * });\n *\n * eventSystem.start();\n * // ... processing events ...\n * await eventSystem.stop();\n * ```\n */\nexport class EventSystem {\n private readonly emitter: TaskerEventEmitter;\n private readonly poller: EventPoller;\n private readonly subscriber: StepExecutionSubscriber;\n private running: boolean = false;\n\n /**\n * Create a new EventSystem.\n *\n * @param runtime - The FFI runtime for polling events and submitting results\n * @param registry - The handler registry for resolving step handlers\n * @param config - Optional configuration for poller and subscriber\n */\n constructor(\n runtime: TaskerRuntime,\n registry: HandlerRegistryInterface,\n config: EventSystemConfig = {}\n ) {\n // Create a single emitter instance owned by this class\n this.emitter = new TaskerEventEmitter();\n\n // Create poller with explicit emitter (no global fallback)\n this.poller = new EventPoller(runtime, this.emitter, config.poller);\n\n // Create subscriber with explicit emitter and runtime\n this.subscriber = new StepExecutionSubscriber(\n this.emitter,\n registry,\n runtime,\n config.subscriber\n );\n }\n\n /**\n * Start the event system.\n *\n * Starts the subscriber first (to register listeners), then the poller.\n * This ensures no events are missed.\n */\n start(): void {\n log.info(\n { component: 'event-system', emitterInstanceId: this.emitter.getInstanceId() },\n 'EventSystem.start() called'\n );\n\n if (this.running) {\n log.warn({ component: 'event-system' }, 'EventSystem already running');\n return;\n }\n\n // Add a debug listener BEFORE subscriber to trace event flow\n log.info(\n { component: 'event-system', eventName: StepEventNames.STEP_EXECUTION_RECEIVED },\n `Adding debug listener BEFORE subscriber for ${StepEventNames.STEP_EXECUTION_RECEIVED}...`\n );\n this.emitter.on(\n StepEventNames.STEP_EXECUTION_RECEIVED,\n (payload: StepExecutionReceivedPayload) => {\n log.info(\n {\n component: 'event-system',\n debugListener: true,\n eventId: payload.event?.event_id,\n stepUuid: payload.event?.step_uuid,\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n `🔍 DEBUG LISTENER: Received ${StepEventNames.STEP_EXECUTION_RECEIVED} event!`\n );\n }\n );\n log.info(\n {\n component: 'event-system',\n listenerCountAfterDebug: this.emitter.listenerCount(StepEventNames.STEP_EXECUTION_RECEIVED),\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n 'Debug listener added'\n );\n\n // Start subscriber first to register listeners\n log.info({ component: 'event-system' }, 'Starting subscriber first...');\n this.subscriber.start();\n\n log.info(\n {\n component: 'event-system',\n listenerCountAfterSubscriber: this.emitter.listenerCount(\n StepEventNames.STEP_EXECUTION_RECEIVED\n ),\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n 'Subscriber started, checking listener count'\n );\n\n // Then start poller to begin receiving events\n log.info({ component: 'event-system' }, 'Starting poller...');\n this.poller.start();\n\n this.running = true;\n log.info(\n {\n component: 'event-system',\n emitterInstanceId: this.emitter.getInstanceId(),\n listenerCount: this.emitter.listenerCount(StepEventNames.STEP_EXECUTION_RECEIVED),\n eventName: StepEventNames.STEP_EXECUTION_RECEIVED,\n },\n 'EventSystem started successfully'\n );\n }\n\n /**\n * Stop the event system gracefully.\n *\n * Stops ingress first (poller), waits for in-flight handlers,\n * then stops the subscriber.\n *\n * @param drainTimeoutMs - Maximum time to wait for in-flight handlers (default: 30000)\n */\n async stop(drainTimeoutMs: number = 30000): Promise<void> {\n if (!this.running) {\n return;\n }\n\n // Stop ingress first\n await this.poller.stop();\n\n // Wait for in-flight handlers to complete\n await this.subscriber.waitForCompletion(drainTimeoutMs);\n\n // Stop subscriber\n this.subscriber.stop();\n\n this.running = false;\n }\n\n /**\n * Check if the event system is running.\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the event emitter (for testing or advanced use cases).\n */\n getEmitter(): TaskerEventEmitter {\n return this.emitter;\n }\n\n /**\n * Get current statistics about the event system.\n */\n getStats(): EventSystemStats {\n return {\n running: this.running,\n processedCount: this.subscriber.getProcessedCount(),\n errorCount: this.subscriber.getErrorCount(),\n activeHandlers: this.subscriber.getActiveHandlers(),\n pollCount: this.poller.getPollCount(),\n };\n }\n}\n"]}
@@ -0,0 +1,308 @@
1
+ import { B as BaseTaskerRuntime, a as BootstrapConfig, b as BootstrapResult, W as WorkerStatus, q as StopResult, l as FfiStepEvent, F as FfiDomainEvent, p as StepExecutionResult, t as CheckpointYieldData, k as FfiDispatchMetrics, L as LogFields, d as ClientResult, T as TaskerRuntime } from '../runtime-interface-CE4viUt7.js';
2
+ export { D as DependencyResult, u as FfiDomainEventMetadata, m as HandlerDefinition, O as OrchestrationMetadata, R as RetryConfiguration, S as StepDefinition, n as StepExecutionError, o as StepExecutionMetadata, r as Task, s as WorkflowStep } from '../runtime-interface-CE4viUt7.js';
3
+
4
+ /**
5
+ * Node.js FFI runtime adapter using koffi.
6
+ *
7
+ * This adapter uses the koffi package to interface with the Rust native library.
8
+ * Koffi is a modern, actively maintained FFI library with prebuilt binaries.
9
+ *
10
+ * Install: npm install koffi
11
+ */
12
+
13
+ /**
14
+ * Node.js FFI runtime implementation using koffi
15
+ */
16
+ declare class NodeRuntime extends BaseTaskerRuntime {
17
+ readonly name: string;
18
+ private lib;
19
+ private koffi;
20
+ get isLoaded(): boolean;
21
+ load(libraryPath: string): Promise<void>;
22
+ unload(): void;
23
+ private ensureLoaded;
24
+ /**
25
+ * Read a C string from a pointer and free the Rust-allocated memory.
26
+ *
27
+ * Uses koffi.decode with 'char' type and -1 length for null-terminated strings.
28
+ */
29
+ private readAndFreeRustString;
30
+ getVersion(): string;
31
+ getRustVersion(): string;
32
+ healthCheck(): boolean;
33
+ bootstrapWorker(config?: BootstrapConfig): BootstrapResult;
34
+ isWorkerRunning(): boolean;
35
+ getWorkerStatus(): WorkerStatus;
36
+ stopWorker(): StopResult;
37
+ transitionToGracefulShutdown(): StopResult;
38
+ pollStepEvents(): FfiStepEvent | null;
39
+ pollInProcessEvents(): FfiDomainEvent | null;
40
+ completeStepEvent(eventId: string, result: StepExecutionResult): boolean;
41
+ checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean;
42
+ getFfiDispatchMetrics(): FfiDispatchMetrics;
43
+ checkStarvationWarnings(): void;
44
+ cleanupTimeouts(): void;
45
+ logError(message: string, fields?: LogFields): void;
46
+ logWarn(message: string, fields?: LogFields): void;
47
+ logInfo(message: string, fields?: LogFields): void;
48
+ logDebug(message: string, fields?: LogFields): void;
49
+ logTrace(message: string, fields?: LogFields): void;
50
+ private parseClientResult;
51
+ clientCreateTask(requestJson: string): ClientResult;
52
+ clientGetTask(taskUuid: string): ClientResult;
53
+ clientListTasks(paramsJson: string): ClientResult;
54
+ clientCancelTask(taskUuid: string): ClientResult;
55
+ clientListTaskSteps(taskUuid: string): ClientResult;
56
+ clientGetStep(taskUuid: string, stepUuid: string): ClientResult;
57
+ clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult;
58
+ clientHealthCheck(): ClientResult;
59
+ }
60
+
61
+ /**
62
+ * Bun FFI runtime adapter using koffi (via Node-API).
63
+ *
64
+ * Bun supports Node-API modules natively, so we use koffi (the same FFI
65
+ * library as NodeRuntime) rather than bun:ffi. This gives us:
66
+ * - Stable, well-tested string/pointer handling
67
+ * - Identical behavior across Node.js and Bun
68
+ * - No manual Buffer→pointer conversion bugs
69
+ *
70
+ * See: https://bun.sh/docs/runtime/node-api
71
+ */
72
+
73
+ /**
74
+ * Bun FFI runtime implementation using koffi (Node-API).
75
+ *
76
+ * Extends NodeRuntime since both use koffi for FFI. The only difference
77
+ * is the runtime name identifier used for logging and diagnostics.
78
+ */
79
+ declare class BunRuntime extends NodeRuntime {
80
+ readonly name = "bun";
81
+ }
82
+
83
+ /**
84
+ * Deno FFI runtime adapter using Deno.dlopen.
85
+ *
86
+ * This adapter uses Deno's built-in FFI to interface with the Rust native library.
87
+ * It requires --unstable-ffi and --allow-ffi flags.
88
+ */
89
+
90
+ /**
91
+ * Deno FFI runtime implementation using Deno.dlopen
92
+ */
93
+ declare class DenoRuntime extends BaseTaskerRuntime {
94
+ readonly name = "deno";
95
+ private lib;
96
+ private encoder;
97
+ get isLoaded(): boolean;
98
+ load(libraryPath: string): Promise<void>;
99
+ unload(): void;
100
+ private ensureLoaded;
101
+ /**
102
+ * Creates a null-terminated C string buffer.
103
+ * With 'buffer' FFI type, we return Uint8Array directly.
104
+ */
105
+ private toCString;
106
+ private fromCString;
107
+ getVersion(): string;
108
+ getRustVersion(): string;
109
+ healthCheck(): boolean;
110
+ bootstrapWorker(config?: BootstrapConfig): BootstrapResult;
111
+ isWorkerRunning(): boolean;
112
+ getWorkerStatus(): WorkerStatus;
113
+ stopWorker(): StopResult;
114
+ transitionToGracefulShutdown(): StopResult;
115
+ pollStepEvents(): FfiStepEvent | null;
116
+ pollInProcessEvents(): FfiDomainEvent | null;
117
+ completeStepEvent(eventId: string, result: StepExecutionResult): boolean;
118
+ checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean;
119
+ getFfiDispatchMetrics(): FfiDispatchMetrics;
120
+ checkStarvationWarnings(): void;
121
+ cleanupTimeouts(): void;
122
+ logError(message: string, fields?: LogFields): void;
123
+ logWarn(message: string, fields?: LogFields): void;
124
+ logInfo(message: string, fields?: LogFields): void;
125
+ logDebug(message: string, fields?: LogFields): void;
126
+ logTrace(message: string, fields?: LogFields): void;
127
+ private parseClientResult;
128
+ clientCreateTask(requestJson: string): ClientResult;
129
+ clientGetTask(taskUuid: string): ClientResult;
130
+ clientListTasks(paramsJson: string): ClientResult;
131
+ clientCancelTask(taskUuid: string): ClientResult;
132
+ clientListTaskSteps(taskUuid: string): ClientResult;
133
+ clientGetStep(taskUuid: string, stepUuid: string): ClientResult;
134
+ clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult;
135
+ clientHealthCheck(): ClientResult;
136
+ }
137
+
138
+ /**
139
+ * Runtime detection for TypeScript/JavaScript workers.
140
+ *
141
+ * Detects whether the code is running in Bun, Node.js, Deno, or an unknown runtime.
142
+ */
143
+ /**
144
+ * Supported JavaScript/TypeScript runtimes
145
+ */
146
+ type RuntimeType = 'bun' | 'node' | 'deno' | 'unknown';
147
+ /**
148
+ * Runtime information including version details
149
+ */
150
+ interface RuntimeInfo {
151
+ type: RuntimeType;
152
+ version: string;
153
+ platform: string;
154
+ arch: string;
155
+ }
156
+ /**
157
+ * Detect the current JavaScript/TypeScript runtime.
158
+ *
159
+ * @returns The detected runtime type
160
+ */
161
+ declare function detectRuntime(): RuntimeType;
162
+ /**
163
+ * Check if running in Bun
164
+ */
165
+ declare function isBun(): boolean;
166
+ /**
167
+ * Check if running in Node.js
168
+ */
169
+ declare function isNode(): boolean;
170
+ /**
171
+ * Check if running in Deno
172
+ */
173
+ declare function isDeno(): boolean;
174
+ /**
175
+ * Get detailed runtime information
176
+ */
177
+ declare function getRuntimeInfo(): RuntimeInfo;
178
+ /**
179
+ * Get the path to the native library.
180
+ *
181
+ * REQUIRES: TASKER_FFI_LIBRARY_PATH environment variable to be set,
182
+ * OR an explicit basePath parameter must be provided.
183
+ *
184
+ * This explicit requirement prevents confusion from automatic debug/release
185
+ * library discovery and ensures intentional configuration at build/runtime.
186
+ *
187
+ * @param basePath Optional explicit base path to the library directory
188
+ * @returns Path to the native library
189
+ * @throws Error if TASKER_FFI_LIBRARY_PATH is not set and no basePath provided
190
+ */
191
+ declare function getLibraryPath(basePath?: string): string;
192
+
193
+ /**
194
+ * FfiLayer - Owns FFI runtime loading and lifecycle.
195
+ *
196
+ * This class encapsulates the FFI runtime management:
197
+ * - Runtime detection (Bun, Node.js, Deno)
198
+ * - Library path discovery
199
+ * - Runtime loading and unloading
200
+ *
201
+ * Design principles:
202
+ * - Explicit construction: No singleton pattern
203
+ * - Clear ownership: Owns the runtime instance
204
+ * - Explicit lifecycle: load() and unload() methods
205
+ */
206
+
207
+ /**
208
+ * Configuration for FfiLayer.
209
+ */
210
+ interface FfiLayerConfig {
211
+ /** Override runtime detection */
212
+ runtimeType?: RuntimeType;
213
+ /** Custom library path (overrides discovery) */
214
+ libraryPath?: string;
215
+ }
216
+ /**
217
+ * Owns FFI runtime loading and lifecycle.
218
+ *
219
+ * Unlike RuntimeFactory, this class:
220
+ * - Is NOT a singleton - created and passed explicitly
221
+ * - Owns the runtime instance directly
222
+ * - Has clear load/unload lifecycle
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const ffiLayer = new FfiLayer();
227
+ * await ffiLayer.load();
228
+ * const runtime = ffiLayer.getRuntime();
229
+ * // ... use runtime ...
230
+ * await ffiLayer.unload();
231
+ * ```
232
+ */
233
+ declare class FfiLayer {
234
+ private runtime;
235
+ private libraryPath;
236
+ private readonly runtimeType;
237
+ private readonly configuredLibraryPath;
238
+ /**
239
+ * Create a new FfiLayer.
240
+ *
241
+ * @param config - Optional configuration for runtime type and library path
242
+ */
243
+ constructor(config?: FfiLayerConfig);
244
+ /**
245
+ * Load the FFI library.
246
+ *
247
+ * Discovers and loads the native library for the current runtime.
248
+ *
249
+ * @param customPath - Optional override for library path (takes precedence over config)
250
+ * @throws Error if library not found or failed to load
251
+ */
252
+ load(customPath?: string): Promise<void>;
253
+ /**
254
+ * Unload the FFI library and release resources.
255
+ *
256
+ * Safe to call even if not loaded.
257
+ */
258
+ unload(): Promise<void>;
259
+ /**
260
+ * Check if the FFI library is loaded.
261
+ */
262
+ isLoaded(): boolean;
263
+ /**
264
+ * Get the loaded runtime.
265
+ *
266
+ * @throws Error if runtime is not loaded
267
+ */
268
+ getRuntime(): TaskerRuntime;
269
+ /**
270
+ * Get the path to the loaded library.
271
+ */
272
+ getLibraryPath(): string | null;
273
+ /**
274
+ * Get the detected runtime type.
275
+ */
276
+ getRuntimeType(): RuntimeType;
277
+ /**
278
+ * Find the FFI library path.
279
+ *
280
+ * Static method for finding the library path without creating an instance.
281
+ * Useful for test utilities and pre-flight checks.
282
+ *
283
+ * REQUIRES: TASKER_FFI_LIBRARY_PATH environment variable to be set.
284
+ * This explicit requirement prevents confusion from automatic debug/release
285
+ * library discovery and ensures intentional configuration at build/runtime.
286
+ *
287
+ * @param _callerDir Deprecated parameter, kept for API compatibility
288
+ * @returns Path to the library if found and exists, null otherwise
289
+ */
290
+ static findLibraryPath(_callerDir?: string): string | null;
291
+ /**
292
+ * Discover the FFI library path.
293
+ *
294
+ * Instance method that delegates to the static findLibraryPath.
295
+ */
296
+ private discoverLibraryPath;
297
+ /**
298
+ * Create a runtime adapter for the configured runtime type.
299
+ *
300
+ * NOTE: We use koffi (NodeRuntime) for both Node.js and Bun because:
301
+ * - bun:ffi is experimental with known bugs (per Bun docs)
302
+ * - koffi is stable and works with both Node.js and Bun via Node-API
303
+ * - See: https://bun.sh/docs/runtime/node-api
304
+ */
305
+ private createRuntime;
306
+ }
307
+
308
+ export { BaseTaskerRuntime, BootstrapConfig, BootstrapResult, BunRuntime, DenoRuntime, FfiDispatchMetrics, FfiDomainEvent, FfiLayer, type FfiLayerConfig, FfiStepEvent, LogFields, NodeRuntime, type RuntimeInfo, type RuntimeType, StepExecutionResult, StopResult, TaskerRuntime, WorkerStatus, detectRuntime, getLibraryPath, getRuntimeInfo, isBun, isDeno, isNode };