@tasker-systems/tasker 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ffi/runtime-interface.ts","../src/ffi/deno-runtime.ts","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/darwin_arm64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/darwin_x64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_arm64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_ia32/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_x64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_armhf/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_arm64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_ia32/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_loong64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_riscv64d/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_x64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/openbsd_ia32/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/openbsd_x64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_arm64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_ia32/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_x64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/musl_arm64/koffi.node","node-file:/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/musl_x64/koffi.node","../node_modules/koffi/index.js","../src/ffi/node-runtime.ts","../src/registry/resolvers/explicit-mapping.ts","../src/registry/resolvers/class-lookup.ts","../src/bootstrap/types.ts","../src/bootstrap/bootstrap.ts","../src/client/index.ts","../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","../src/ffi/index.ts","../src/ffi/runtime.ts","../src/ffi/ffi-layer.ts","../src/types/error-type.ts","../src/types/step-handler-result.ts","../src/handler/base.ts","../src/handler/mixins/api.ts","../src/handler/api.ts","../src/types/batch.ts","../src/handler/batchable.ts","../src/handler/mixins/decision.ts","../src/handler/decision.ts","../src/handler/domain-events.ts","../src/registry/errors.ts","../src/registry/handler-definition.ts","../src/registry/method-dispatch-wrapper.ts","../src/registry/registry-resolver.ts","../src/registry/resolver-chain.ts","../src/registry/resolvers/index.ts","../src/handler/registry.ts","../src/handler/handler-system.ts","../src/server/shutdown-controller.ts","../src/server/types.ts","../src/server/worker-server.ts"],"names":["__commonJS","exports","module","require_koffi","init_koffi","koffi_default","__require","crypto","dirname","path","loggerOptions","pino","log","Deno","NodeRuntime","DenoRuntime","filename","ErrorType","DecisionType","existsSync","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Runtime interface for FFI operations.\n *\n * This interface defines the contract that all runtime adapters must implement.\n * It provides strongly-typed access to the Rust FFI functions.\n */\n\nimport type {\n BootstrapConfig,\n BootstrapResult,\n CheckpointYieldData,\n ClientResult,\n FfiDispatchMetrics,\n FfiDomainEvent,\n FfiStepEvent,\n LogFields,\n StepExecutionResult,\n StopResult,\n WorkerStatus,\n} from './types.js';\n\n/**\n * Interface for runtime-specific FFI implementations.\n *\n * Each runtime (Node.js, Bun, Deno) implements this interface\n * using their native FFI mechanism.\n */\nexport interface TaskerRuntime {\n /**\n * Get the runtime name\n */\n readonly name: string;\n\n /**\n * Check if the FFI library is loaded\n */\n readonly isLoaded: boolean;\n\n /**\n * Load the native library from the given path\n */\n load(libraryPath: string): Promise<void>;\n\n /**\n * Unload the native library and release resources\n */\n unload(): void;\n\n // ============================================================================\n // Version and Health\n // ============================================================================\n\n /**\n * Get the version of the tasker-ts package\n */\n getVersion(): string;\n\n /**\n * Get detailed Rust library version\n */\n getRustVersion(): string;\n\n /**\n * Check if the FFI module is functional\n */\n healthCheck(): boolean;\n\n // ============================================================================\n // Worker Lifecycle\n // ============================================================================\n\n /**\n * Bootstrap the worker with optional configuration\n */\n bootstrapWorker(config?: BootstrapConfig): BootstrapResult;\n\n /**\n * Check if the worker is currently running\n */\n isWorkerRunning(): boolean;\n\n /**\n * Get current worker status\n */\n getWorkerStatus(): WorkerStatus;\n\n /**\n * Stop the worker gracefully\n */\n stopWorker(): StopResult;\n\n /**\n * Transition to graceful shutdown mode\n */\n transitionToGracefulShutdown(): StopResult;\n\n // ============================================================================\n // Event Polling\n // ============================================================================\n\n /**\n * Poll for pending step events (non-blocking)\n *\n * @returns Step event if available, null otherwise\n */\n pollStepEvents(): FfiStepEvent | null;\n\n /**\n * Poll for in-process domain events (fast path, non-blocking)\n *\n * Used for real-time notifications that don't require guaranteed delivery\n * (e.g., metrics updates, logging, notifications).\n *\n * @returns Domain event if available, null otherwise\n */\n pollInProcessEvents(): FfiDomainEvent | null;\n\n /**\n * Complete a step event with the given result\n *\n * @param eventId The event ID to complete\n * @param result The step execution result\n * @returns true if successful, false otherwise\n */\n completeStepEvent(eventId: string, result: StepExecutionResult): boolean;\n\n /**\n * TAS-125: Submit a checkpoint yield for batch processing\n *\n * Called from batch processing handlers when they want to persist progress\n * and be re-dispatched for continuation. Unlike completeStepEvent, this\n * does NOT complete the step - instead it persists checkpoint data and\n * re-dispatches the step for continued processing.\n *\n * @param eventId The event ID from the step event\n * @param checkpointData The checkpoint data to persist\n * @returns true if checkpoint persisted and step re-dispatched, false otherwise\n */\n checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean;\n\n // ============================================================================\n // Metrics and Monitoring\n // ============================================================================\n\n /**\n * Get FFI dispatch metrics\n */\n getFfiDispatchMetrics(): FfiDispatchMetrics;\n\n /**\n * Check for and log starvation warnings\n */\n checkStarvationWarnings(): void;\n\n /**\n * Cleanup timed-out events\n */\n cleanupTimeouts(): void;\n\n // ============================================================================\n // Client API Operations (TAS-231)\n // ============================================================================\n\n /**\n * Create a task via the orchestration API client\n *\n * @param requestJson JSON string of ClientTaskRequest\n * @returns ClientResult containing ClientTaskResponse on success\n */\n clientCreateTask(requestJson: string): ClientResult;\n\n /**\n * Get a task by UUID\n *\n * @param taskUuid The task UUID\n * @returns ClientResult containing ClientTaskResponse on success\n */\n clientGetTask(taskUuid: string): ClientResult;\n\n /**\n * List tasks with optional filters\n *\n * @param paramsJson JSON string with limit, offset, namespace, status\n * @returns ClientResult containing ClientTaskListResponse on success\n */\n clientListTasks(paramsJson: string): ClientResult;\n\n /**\n * Cancel a task\n *\n * @param taskUuid The task UUID to cancel\n * @returns ClientResult with cancellation status\n */\n clientCancelTask(taskUuid: string): ClientResult;\n\n /**\n * List workflow steps for a task\n *\n * @param taskUuid The task UUID\n * @returns ClientResult containing step list on success\n */\n clientListTaskSteps(taskUuid: string): ClientResult;\n\n /**\n * Get a specific workflow step\n *\n * @param taskUuid The task UUID\n * @param stepUuid The step UUID\n * @returns ClientResult containing ClientStepResponse on success\n */\n clientGetStep(taskUuid: string, stepUuid: string): ClientResult;\n\n /**\n * Get audit history for a workflow step (SOC2 compliance)\n *\n * @param taskUuid The task UUID\n * @param stepUuid The step UUID\n * @returns ClientResult containing audit history on success\n */\n clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult;\n\n /**\n * Health check against the orchestration API\n *\n * @returns ClientResult containing ClientHealthResponse on success\n */\n clientHealthCheck(): ClientResult;\n\n // ============================================================================\n // Logging\n // ============================================================================\n\n /**\n * Log an error message\n */\n logError(message: string, fields?: LogFields): void;\n\n /**\n * Log a warning message\n */\n logWarn(message: string, fields?: LogFields): void;\n\n /**\n * Log an info message\n */\n logInfo(message: string, fields?: LogFields): void;\n\n /**\n * Log a debug message\n */\n logDebug(message: string, fields?: LogFields): void;\n\n /**\n * Log a trace message\n */\n logTrace(message: string, fields?: LogFields): void;\n}\n\n/**\n * Base class with common functionality for all runtime implementations.\n *\n * Runtime-specific implementations extend this class and implement\n * the abstract methods using their native FFI mechanism.\n */\nexport abstract class BaseTaskerRuntime implements TaskerRuntime {\n abstract readonly name: string;\n abstract readonly isLoaded: boolean;\n\n abstract load(libraryPath: string): Promise<void>;\n abstract unload(): void;\n\n abstract getVersion(): string;\n abstract getRustVersion(): string;\n abstract healthCheck(): boolean;\n\n abstract bootstrapWorker(config?: BootstrapConfig): BootstrapResult;\n abstract isWorkerRunning(): boolean;\n abstract getWorkerStatus(): WorkerStatus;\n abstract stopWorker(): StopResult;\n abstract transitionToGracefulShutdown(): StopResult;\n\n abstract pollStepEvents(): FfiStepEvent | null;\n abstract pollInProcessEvents(): FfiDomainEvent | null;\n abstract completeStepEvent(eventId: string, result: StepExecutionResult): boolean;\n abstract checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean;\n\n abstract getFfiDispatchMetrics(): FfiDispatchMetrics;\n abstract checkStarvationWarnings(): void;\n abstract cleanupTimeouts(): void;\n\n abstract clientCreateTask(requestJson: string): ClientResult;\n abstract clientGetTask(taskUuid: string): ClientResult;\n abstract clientListTasks(paramsJson: string): ClientResult;\n abstract clientCancelTask(taskUuid: string): ClientResult;\n abstract clientListTaskSteps(taskUuid: string): ClientResult;\n abstract clientGetStep(taskUuid: string, stepUuid: string): ClientResult;\n abstract clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult;\n abstract clientHealthCheck(): ClientResult;\n\n abstract logError(message: string, fields?: LogFields): void;\n abstract logWarn(message: string, fields?: LogFields): void;\n abstract logInfo(message: string, fields?: LogFields): void;\n abstract logDebug(message: string, fields?: LogFields): void;\n abstract logTrace(message: string, fields?: LogFields): void;\n\n /**\n * Helper to parse JSON string from FFI\n */\n protected parseJson<T>(jsonStr: string | null): T | null {\n if (jsonStr === null || jsonStr === '') {\n return null;\n }\n try {\n return JSON.parse(jsonStr) as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Helper to stringify JSON for FFI\n */\n protected toJson(value: unknown): string {\n return JSON.stringify(value);\n }\n}\n","/**\n * Deno FFI runtime adapter using Deno.dlopen.\n *\n * This adapter uses Deno's built-in FFI to interface with the Rust native library.\n * It requires --unstable-ffi and --allow-ffi flags.\n */\n\nimport { BaseTaskerRuntime } from './runtime-interface.js';\nimport type {\n BootstrapConfig,\n BootstrapResult,\n CheckpointYieldData,\n ClientResult,\n FfiDispatchMetrics,\n FfiDomainEvent,\n FfiStepEvent,\n LogFields,\n StepExecutionResult,\n StopResult,\n WorkerStatus,\n} from './types.js';\n\n// Deno FFI types - using generic pointer type for build compatibility\n// biome-ignore lint/suspicious/noExplicitAny: Deno global is runtime-specific\ndeclare const Deno: any;\n\n// Generic pointer type (Deno.PointerValue is bigint | null at runtime)\ntype PointerValue = bigint | null;\n\n// Buffer type for 'buffer' parameters (Uint8Array or null)\ntype BufferValue = Uint8Array | null;\n\n// FFI symbol result type - Deno 2.x uses direct function calls\ninterface DenoFfiSymbols {\n get_version: () => PointerValue;\n get_rust_version: () => PointerValue;\n health_check: () => number;\n is_worker_running: () => number;\n bootstrap_worker: (configJson: BufferValue) => PointerValue;\n get_worker_status: () => PointerValue;\n stop_worker: () => PointerValue;\n transition_to_graceful_shutdown: () => PointerValue;\n poll_step_events: () => PointerValue;\n poll_in_process_events: () => PointerValue;\n complete_step_event: (eventId: BufferValue, resultJson: BufferValue) => number;\n checkpoint_yield_step_event: (eventId: BufferValue, checkpointJson: BufferValue) => number;\n get_ffi_dispatch_metrics: () => PointerValue;\n check_starvation_warnings: () => void;\n cleanup_timeouts: () => void;\n log_error: (message: BufferValue, fieldsJson: BufferValue) => void;\n log_warn: (message: BufferValue, fieldsJson: BufferValue) => void;\n log_info: (message: BufferValue, fieldsJson: BufferValue) => void;\n log_debug: (message: BufferValue, fieldsJson: BufferValue) => void;\n log_trace: (message: BufferValue, fieldsJson: BufferValue) => void;\n free_rust_string: (ptr: PointerValue) => void;\n // Client API functions (TAS-231)\n client_create_task: (requestJson: BufferValue) => PointerValue;\n client_get_task: (taskUuid: BufferValue) => PointerValue;\n client_list_tasks: (paramsJson: BufferValue) => PointerValue;\n client_cancel_task: (taskUuid: BufferValue) => PointerValue;\n client_list_task_steps: (taskUuid: BufferValue) => PointerValue;\n client_get_step: (taskUuid: BufferValue, stepUuid: BufferValue) => PointerValue;\n client_get_step_audit_history: (taskUuid: BufferValue, stepUuid: BufferValue) => PointerValue;\n client_health_check: () => PointerValue;\n}\n\n// Deno dynamic library handle\ninterface DenoFfiLibrary {\n symbols: DenoFfiSymbols;\n close(): void;\n}\n\n/**\n * Deno FFI runtime implementation using Deno.dlopen\n */\nexport class DenoRuntime extends BaseTaskerRuntime {\n readonly name = 'deno';\n private lib: DenoFfiLibrary | null = null;\n private encoder: TextEncoder = new TextEncoder();\n\n get isLoaded(): boolean {\n return this.lib !== null;\n }\n\n async load(libraryPath: string): Promise<void> {\n if (this.lib !== null) {\n return; // Already loaded\n }\n\n // Check if Deno is available\n if (typeof Deno === 'undefined') {\n throw new Error('Deno runtime not detected');\n }\n\n // Define FFI symbols\n this.lib = Deno.dlopen(libraryPath, {\n get_version: {\n parameters: [],\n result: 'pointer',\n },\n get_rust_version: {\n parameters: [],\n result: 'pointer',\n },\n health_check: {\n parameters: [],\n result: 'i32',\n },\n is_worker_running: {\n parameters: [],\n result: 'i32',\n },\n bootstrap_worker: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n get_worker_status: {\n parameters: [],\n result: 'pointer',\n },\n stop_worker: {\n parameters: [],\n result: 'pointer',\n },\n transition_to_graceful_shutdown: {\n parameters: [],\n result: 'pointer',\n },\n poll_step_events: {\n parameters: [],\n result: 'pointer',\n },\n poll_in_process_events: {\n parameters: [],\n result: 'pointer',\n },\n complete_step_event: {\n parameters: ['buffer', 'buffer'],\n result: 'i32',\n },\n checkpoint_yield_step_event: {\n parameters: ['buffer', 'buffer'],\n result: 'i32',\n },\n get_ffi_dispatch_metrics: {\n parameters: [],\n result: 'pointer',\n },\n check_starvation_warnings: {\n parameters: [],\n result: 'void',\n },\n cleanup_timeouts: {\n parameters: [],\n result: 'void',\n },\n log_error: {\n parameters: ['buffer', 'buffer'],\n result: 'void',\n },\n log_warn: {\n parameters: ['buffer', 'buffer'],\n result: 'void',\n },\n log_info: {\n parameters: ['buffer', 'buffer'],\n result: 'void',\n },\n log_debug: {\n parameters: ['buffer', 'buffer'],\n result: 'void',\n },\n log_trace: {\n parameters: ['buffer', 'buffer'],\n result: 'void',\n },\n free_rust_string: {\n parameters: ['pointer'],\n result: 'void',\n },\n // Client API functions (TAS-231)\n client_create_task: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n client_get_task: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n client_list_tasks: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n client_cancel_task: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n client_list_task_steps: {\n parameters: ['buffer'],\n result: 'pointer',\n },\n client_get_step: {\n parameters: ['buffer', 'buffer'],\n result: 'pointer',\n },\n client_get_step_audit_history: {\n parameters: ['buffer', 'buffer'],\n result: 'pointer',\n },\n client_health_check: {\n parameters: [],\n result: 'pointer',\n },\n }) as DenoFfiLibrary;\n }\n\n unload(): void {\n if (this.lib) {\n this.lib.close();\n this.lib = null;\n }\n }\n\n private ensureLoaded(): DenoFfiSymbols {\n if (!this.lib) {\n throw new Error('Native library not loaded. Call load() first.');\n }\n return this.lib.symbols;\n }\n\n /**\n * Creates a null-terminated C string buffer.\n * With 'buffer' FFI type, we return Uint8Array directly.\n */\n private toCString(str: string): Uint8Array {\n return this.encoder.encode(`${str}\\0`);\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Deno PointerValue type\n private fromCString(ptr: any): string | null {\n if (ptr === null || Deno.UnsafePointer.equals(ptr, null)) {\n return null;\n }\n // Read C string from pointer using Deno's pointer view\n const view = new Deno.UnsafePointerView(ptr);\n return view.getCString();\n }\n\n getVersion(): string {\n const symbols = this.ensureLoaded();\n const result = symbols.get_version();\n const version = this.fromCString(result) ?? 'unknown';\n if (result !== null) symbols.free_rust_string(result);\n return version;\n }\n\n getRustVersion(): string {\n const symbols = this.ensureLoaded();\n const result = symbols.get_rust_version();\n const version = this.fromCString(result) ?? 'unknown';\n if (result !== null) symbols.free_rust_string(result);\n return version;\n }\n\n healthCheck(): boolean {\n const symbols = this.ensureLoaded();\n return symbols.health_check() === 1;\n }\n\n bootstrapWorker(config?: BootstrapConfig): BootstrapResult {\n const symbols = this.ensureLoaded();\n const configBuf = config ? this.toCString(this.toJson(config)) : null;\n const result = symbols.bootstrap_worker(configBuf);\n const jsonStr = this.fromCString(result);\n if (result !== null) symbols.free_rust_string(result);\n\n const parsed = this.parseJson<BootstrapResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse bootstrap result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n isWorkerRunning(): boolean {\n const symbols = this.ensureLoaded();\n return symbols.is_worker_running() === 1;\n }\n\n getWorkerStatus(): WorkerStatus {\n const symbols = this.ensureLoaded();\n const result = symbols.get_worker_status();\n const jsonStr = this.fromCString(result);\n if (result !== null) symbols.free_rust_string(result);\n\n const parsed = this.parseJson<WorkerStatus>(jsonStr);\n return parsed ?? { success: false, running: false };\n }\n\n stopWorker(): StopResult {\n const symbols = this.ensureLoaded();\n const result = symbols.stop_worker();\n const jsonStr = this.fromCString(result);\n if (result !== null) symbols.free_rust_string(result);\n\n const parsed = this.parseJson<StopResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse stop result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n transitionToGracefulShutdown(): StopResult {\n const symbols = this.ensureLoaded();\n const result = symbols.transition_to_graceful_shutdown();\n const jsonStr = this.fromCString(result);\n if (result !== null) symbols.free_rust_string(result);\n\n const parsed = this.parseJson<StopResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse shutdown result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n pollStepEvents(): FfiStepEvent | null {\n const symbols = this.ensureLoaded();\n const result = symbols.poll_step_events();\n if (result === null || Deno.UnsafePointer.equals(result, null)) {\n return null;\n }\n\n const jsonStr = this.fromCString(result);\n symbols.free_rust_string(result);\n\n return this.parseJson<FfiStepEvent>(jsonStr);\n }\n\n pollInProcessEvents(): FfiDomainEvent | null {\n const symbols = this.ensureLoaded();\n const result = symbols.poll_in_process_events();\n if (result === null || Deno.UnsafePointer.equals(result, null)) {\n return null;\n }\n\n const jsonStr = this.fromCString(result);\n symbols.free_rust_string(result);\n\n return this.parseJson<FfiDomainEvent>(jsonStr);\n }\n\n completeStepEvent(eventId: string, result: StepExecutionResult): boolean {\n const symbols = this.ensureLoaded();\n const eventIdBuf = this.toCString(eventId);\n const resultJsonBuf = this.toCString(this.toJson(result));\n return symbols.complete_step_event(eventIdBuf, resultJsonBuf) === 1;\n }\n\n checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean {\n const symbols = this.ensureLoaded();\n const eventIdBuf = this.toCString(eventId);\n const checkpointJsonBuf = this.toCString(this.toJson(checkpointData));\n return symbols.checkpoint_yield_step_event(eventIdBuf, checkpointJsonBuf) === 1;\n }\n\n getFfiDispatchMetrics(): FfiDispatchMetrics {\n const symbols = this.ensureLoaded();\n const result = symbols.get_ffi_dispatch_metrics();\n const jsonStr = this.fromCString(result);\n if (result !== null) symbols.free_rust_string(result);\n\n const parsed = this.parseJson<FfiDispatchMetrics>(jsonStr);\n // Check if we got a valid metrics object (not an error response)\n if (parsed && typeof parsed.pending_count === 'number') {\n return parsed;\n }\n // Return default metrics when worker not initialized or error\n return {\n pending_count: 0,\n starvation_detected: false,\n starving_event_count: 0,\n oldest_pending_age_ms: null,\n newest_pending_age_ms: null,\n oldest_event_id: null,\n };\n }\n\n checkStarvationWarnings(): void {\n const symbols = this.ensureLoaded();\n symbols.check_starvation_warnings();\n }\n\n cleanupTimeouts(): void {\n const symbols = this.ensureLoaded();\n symbols.cleanup_timeouts();\n }\n\n logError(message: string, fields?: LogFields): void {\n const symbols = this.ensureLoaded();\n const msgBuf = this.toCString(message);\n const fieldsBuf = fields ? this.toCString(this.toJson(fields)) : null;\n symbols.log_error(msgBuf, fieldsBuf);\n }\n\n logWarn(message: string, fields?: LogFields): void {\n const symbols = this.ensureLoaded();\n const msgBuf = this.toCString(message);\n const fieldsBuf = fields ? this.toCString(this.toJson(fields)) : null;\n symbols.log_warn(msgBuf, fieldsBuf);\n }\n\n logInfo(message: string, fields?: LogFields): void {\n const symbols = this.ensureLoaded();\n const msgBuf = this.toCString(message);\n const fieldsBuf = fields ? this.toCString(this.toJson(fields)) : null;\n symbols.log_info(msgBuf, fieldsBuf);\n }\n\n logDebug(message: string, fields?: LogFields): void {\n const symbols = this.ensureLoaded();\n const msgBuf = this.toCString(message);\n const fieldsBuf = fields ? this.toCString(this.toJson(fields)) : null;\n symbols.log_debug(msgBuf, fieldsBuf);\n }\n\n logTrace(message: string, fields?: LogFields): void {\n const symbols = this.ensureLoaded();\n const msgBuf = this.toCString(message);\n const fieldsBuf = fields ? this.toCString(this.toJson(fields)) : null;\n symbols.log_trace(msgBuf, fieldsBuf);\n }\n\n // ==========================================================================\n // Client API Operations (TAS-231)\n // ==========================================================================\n\n private parseClientResult(result: PointerValue): ClientResult {\n const jsonStr = this.fromCString(result);\n if (result !== null) this.ensureLoaded().free_rust_string(result);\n const parsed = this.parseJson<ClientResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n data: null,\n error: 'Failed to parse client result',\n recoverable: null,\n }\n );\n }\n\n clientCreateTask(requestJson: string): ClientResult {\n const symbols = this.ensureLoaded();\n const buf = this.toCString(requestJson);\n const result = symbols.client_create_task(buf);\n return this.parseClientResult(result);\n }\n\n clientGetTask(taskUuid: string): ClientResult {\n const symbols = this.ensureLoaded();\n const buf = this.toCString(taskUuid);\n const result = symbols.client_get_task(buf);\n return this.parseClientResult(result);\n }\n\n clientListTasks(paramsJson: string): ClientResult {\n const symbols = this.ensureLoaded();\n const buf = this.toCString(paramsJson);\n const result = symbols.client_list_tasks(buf);\n return this.parseClientResult(result);\n }\n\n clientCancelTask(taskUuid: string): ClientResult {\n const symbols = this.ensureLoaded();\n const buf = this.toCString(taskUuid);\n const result = symbols.client_cancel_task(buf);\n return this.parseClientResult(result);\n }\n\n clientListTaskSteps(taskUuid: string): ClientResult {\n const symbols = this.ensureLoaded();\n const buf = this.toCString(taskUuid);\n const result = symbols.client_list_task_steps(buf);\n return this.parseClientResult(result);\n }\n\n clientGetStep(taskUuid: string, stepUuid: string): ClientResult {\n const symbols = this.ensureLoaded();\n const tBuf = this.toCString(taskUuid);\n const sBuf = this.toCString(stepUuid);\n const result = symbols.client_get_step(tBuf, sBuf);\n return this.parseClientResult(result);\n }\n\n clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult {\n const symbols = this.ensureLoaded();\n const tBuf = this.toCString(taskUuid);\n const sBuf = this.toCString(stepUuid);\n const result = symbols.client_get_step_audit_history(tBuf, sBuf);\n return this.parseClientResult(result);\n }\n\n clientHealthCheck(): ClientResult {\n const symbols = this.ensureLoaded();\n const result = symbols.client_health_check();\n return this.parseClientResult(result);\n }\n}\n","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/darwin_arm64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/darwin_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_arm64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_ia32/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/freebsd_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_armhf/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_arm64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_ia32/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_loong64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_riscv64d/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/linux_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/openbsd_ia32/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/openbsd_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_arm64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_ia32/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/win32_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/musl_arm64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\n import path from \"/home/runner/work/tasker-core/tasker-core/workers/typescript/node_modules/koffi/build/koffi/musl_x64/koffi.node\"\n try { module.exports = require(path) }\n catch {}\n ","\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod3) => function __require() {\n return mod3 || (0, cb[__getOwnPropNames(cb)[0]])((mod3 = { exports: {} }).exports, mod3), mod3.exports;\n};\n\n// bin/Koffi/package/src/cnoke/src/tools.js\nvar require_tools = __commonJS({\n \"bin/Koffi/package/src/cnoke/src/tools.js\"(exports2, module2) {\n \"use strict\";\n var crypto = require(\"crypto\");\n var fs2 = require(\"fs\");\n var http = require(\"https\");\n var path2 = require(\"path\");\n var zlib = require(\"zlib\");\n async function download_http(url, dest) {\n console.log(\">> Downloading \" + url);\n let [tmp_name, file] = open_temporary_stream(dest);\n try {\n await new Promise((resolve, reject) => {\n let request = http.get(url, (response) => {\n if (response.statusCode != 200) {\n let err = new Error(`Download failed: ${response.statusMessage} [${response.statusCode}]`);\n err.code = response.statusCode;\n reject(err);\n return;\n }\n response.pipe(file);\n file.on(\"finish\", () => file.close(() => {\n try {\n fs2.renameSync(file.path, dest);\n } catch (err) {\n if (!fs2.existsSync(dest))\n reject(err);\n }\n resolve();\n }));\n });\n request.on(\"error\", reject);\n file.on(\"error\", reject);\n });\n } catch (err) {\n file.close();\n try {\n fs2.unlinkSync(tmp_name);\n } catch (err2) {\n if (err2.code != \"ENOENT\")\n throw err2;\n }\n throw err;\n }\n }\n function open_temporary_stream(prefix) {\n let buf = Buffer.allocUnsafe(4);\n for (; ; ) {\n try {\n crypto.randomFillSync(buf);\n let suffix = buf.toString(\"hex\").padStart(8, \"0\");\n let filename2 = `${prefix}.${suffix}`;\n let file = fs2.createWriteStream(filename2, { flags: \"wx\", mode: 420 });\n return [filename2, file];\n } catch (err) {\n if (err.code != \"EEXIST\")\n throw err;\n }\n }\n }\n function extract_targz(filename2, dest_dir, strip = 0) {\n let reader = fs2.createReadStream(filename2).pipe(zlib.createGunzip());\n return new Promise((resolve, reject) => {\n let header = null;\n let extended = {};\n reader.on(\"readable\", () => {\n try {\n for (; ; ) {\n if (header == null) {\n let buf = reader.read(512);\n if (buf == null)\n break;\n if (!buf[0])\n continue;\n header = {\n filename: buf.toString(\"utf-8\", 0, 100).replace(/\\0/g, \"\"),\n mode: parseInt(buf.toString(\"ascii\", 100, 109), 8),\n size: parseInt(buf.toString(\"ascii\", 124, 137), 8),\n type: String.fromCharCode(buf[156])\n };\n Object.assign(header, extended);\n extended = {};\n header.filename = header.filename.replace(/\\\\/g, \"/\");\n if (!header.filename.length)\n throw new Error(`Insecure empty filename inside TAR archive`);\n if (path_is_absolute(header.filename[0]))\n throw new Error(`Insecure filename starting with / inside TAR archive`);\n if (path_has_dotdot(header.filename))\n throw new Error(`Insecure filename containing '..' inside TAR archive`);\n for (let i = 0; i < strip; i++)\n header.filename = header.filename.substr(header.filename.indexOf(\"/\") + 1);\n }\n let aligned = Math.floor((header.size + 511) / 512) * 512;\n let data = header.size ? reader.read(aligned) : null;\n if (data == null) {\n if (header.size)\n break;\n data = Buffer.alloc(0);\n }\n data = data.subarray(0, header.size);\n if (header.type == \"0\" || header.type == \"7\") {\n let filename3 = dest_dir + \"/\" + header.filename;\n let dirname = path2.dirname(filename3);\n fs2.mkdirSync(dirname, { recursive: true, mode: 493 });\n fs2.writeFileSync(filename3, data, { mode: header.mode });\n } else if (header.type == \"5\") {\n let filename3 = dest_dir + \"/\" + header.filename;\n fs2.mkdirSync(filename3, { recursive: true, mode: header.mode });\n } else if (header.type == \"L\") {\n extended.filename = data.toString(\"utf-8\").replace(/\\0/g, \"\");\n } else if (header.type == \"x\") {\n let str = data.toString(\"utf-8\");\n try {\n while (str.length) {\n let matches = str.match(/^([0-9]+) ([a-zA-Z0-9\\._]+)=(.*)\\n/);\n let skip = parseInt(matches[1], 10);\n let key = matches[2];\n let value = matches[3];\n switch (key) {\n case \"path\":\n {\n extended.filename = value;\n }\n break;\n case \"size\":\n {\n extended.size = parseInt(value, 10);\n }\n break;\n }\n str = str.substr(skip).trimStart();\n }\n } catch (err) {\n throw new Error(\"Malformed PAX entry\");\n }\n }\n header = null;\n }\n } catch (err) {\n reject(err);\n }\n });\n reader.on(\"error\", reject);\n reader.on(\"end\", resolve);\n });\n }\n function path_is_absolute(path3) {\n if (process.platform == \"win32\" && path3.match(/^[a-zA-Z]:/))\n path3 = path3.substr(2);\n return is_path_separator(path3[0]);\n }\n function path_has_dotdot(path3) {\n let start = 0;\n for (; ; ) {\n let offset = path3.indexOf(\"..\", start);\n if (offset < 0)\n break;\n start = offset + 2;\n if (offset && !is_path_separator(path3[offset - 1]))\n continue;\n if (offset + 2 < path3.length && !is_path_separator(path3[offset + 2]))\n continue;\n return true;\n }\n return false;\n }\n function is_path_separator(c) {\n if (c == \"/\")\n return true;\n if (process.platform == \"win32\" && c == \"\\\\\")\n return true;\n return false;\n }\n function sync_files(src_dir, dest_dir) {\n let keep = /* @__PURE__ */ new Set();\n {\n let entries = fs2.readdirSync(src_dir, { withFileTypes: true });\n for (let entry of entries) {\n if (!entry.isFile())\n continue;\n keep.add(entry.name);\n fs2.copyFileSync(src_dir + `/${entry.name}`, dest_dir + `/${entry.name}`);\n }\n }\n {\n let entries = fs2.readdirSync(dest_dir, { withFileTypes: true });\n for (let entry of entries) {\n if (!entry.isFile())\n continue;\n if (keep.has(entry.name))\n continue;\n fs2.unlinkSync(dest_dir + `/${entry.name}`);\n }\n }\n }\n function determine_arch2() {\n let arch = process.arch;\n if (arch == \"riscv32\" || arch == \"riscv64\") {\n let buf = read_file_header(process.execPath, 512);\n let header = decode_elf_header(buf);\n let float_abi = header.e_flags & 6;\n switch (float_abi) {\n case 0:\n {\n }\n break;\n case 2:\n {\n arch += \"f\";\n }\n break;\n case 4:\n {\n arch += \"d\";\n }\n break;\n case 6:\n {\n arch += \"q\";\n }\n break;\n }\n } else if (arch == \"arm\") {\n let buf = read_file_header(process.execPath, 512);\n let header = decode_elf_header(buf);\n if (header.e_flags & 1024) {\n arch += \"hf\";\n } else if (header.e_flags & 512) {\n arch += \"sf\";\n } else {\n throw new Error(\"Unknown ARM floating-point ABI\");\n }\n }\n return arch;\n }\n function read_file_header(filename2, read) {\n let fd = null;\n try {\n let fd2 = fs2.openSync(filename2);\n let buf = Buffer.allocUnsafe(read);\n let len = fs2.readSync(fd2, buf);\n return buf.subarray(0, len);\n } finally {\n if (fd != null)\n fs2.closeSync(fd);\n }\n }\n function decode_elf_header(buf) {\n let header = {};\n if (buf.length < 16)\n throw new Error(\"Truncated header\");\n if (buf[0] != 127 || buf[1] != 69 || buf[2] != 76 || buf[3] != 70)\n throw new Error(\"Invalid magic number\");\n if (buf[6] != 1)\n throw new Error(\"Invalid ELF version\");\n if (buf[5] != 1)\n throw new Error(\"Big-endian architectures are not supported\");\n let machine = buf.readUInt16LE(18);\n switch (machine) {\n case 3:\n {\n header.e_machine = \"ia32\";\n }\n break;\n case 40:\n {\n header.e_machine = \"arm\";\n }\n break;\n case 62:\n {\n header.e_machine = \"amd64\";\n }\n break;\n case 183:\n {\n header.e_machine = \"arm64\";\n }\n break;\n case 243:\n {\n switch (buf[4]) {\n case 1:\n {\n header.e_machine = \"riscv32\";\n }\n break;\n case 2:\n {\n header.e_machine = \"riscv64\";\n }\n break;\n }\n }\n break;\n case 248:\n {\n switch (buf[4]) {\n case 1:\n {\n header.e_machine = \"loong32\";\n }\n break;\n case 2:\n {\n header.e_machine = \"loong64\";\n }\n break;\n }\n }\n break;\n default:\n throw new Error(\"Unknown ELF machine type\");\n }\n switch (buf[4]) {\n case 1:\n {\n buf = buf.subarray(0, 68);\n if (buf.length < 68)\n throw new Error(\"Truncated ELF header\");\n header.ei_class = 32;\n header.e_flags = buf.readUInt32LE(36);\n }\n break;\n case 2:\n {\n buf = buf.subarray(0, 120);\n if (buf.length < 120)\n throw new Error(\"Truncated ELF header\");\n header.ei_class = 64;\n header.e_flags = buf.readUInt32LE(48);\n }\n break;\n default:\n throw new Error(\"Invalid ELF class\");\n }\n return header;\n }\n function unlink_recursive(path3) {\n try {\n if (fs2.rmSync != null) {\n fs2.rmSync(path3, { recursive: true, maxRetries: process.platform == \"win32\" ? 3 : 0 });\n } else {\n fs2.rmdirSync(path3, { recursive: true, maxRetries: process.platform == \"win32\" ? 3 : 0 });\n }\n } catch (err) {\n if (err.code !== \"ENOENT\")\n throw err;\n }\n }\n function get_napi_version2(napi, major) {\n if (napi > 8)\n return null;\n const support = {\n 6: [\"6.14.2\", \"6.14.2\", \"6.14.2\"],\n 8: [\"8.6.0\", \"8.10.0\", \"8.11.2\"],\n 9: [\"9.0.0\", \"9.3.0\", \"9.11.0\"],\n 10: [\"10.0.0\", \"10.0.0\", \"10.0.0\", \"10.16.0\", \"10.17.0\", \"10.20.0\", \"10.23.0\"],\n 11: [\"11.0.0\", \"11.0.0\", \"11.0.0\", \"11.8.0\"],\n 12: [\"12.0.0\", \"12.0.0\", \"12.0.0\", \"12.0.0\", \"12.11.0\", \"12.17.0\", \"12.19.0\", \"12.22.0\"],\n 13: [\"13.0.0\", \"13.0.0\", \"13.0.0\", \"13.0.0\", \"13.0.0\"],\n 14: [\"14.0.0\", \"14.0.0\", \"14.0.0\", \"14.0.0\", \"14.0.0\", \"14.0.0\", \"14.12.0\", \"14.17.0\"],\n 15: [\"15.0.0\", \"15.0.0\", \"15.0.0\", \"15.0.0\", \"15.0.0\", \"15.0.0\", \"15.0.0\", \"15.12.0\"]\n };\n const max = Math.max(...Object.keys(support).map((k) => parseInt(k, 10)));\n if (major > max)\n return major + \".0.0\";\n if (support[major] == null)\n return null;\n let required = support[major][napi - 1] || null;\n return required;\n }\n function cmp_version(ver1, ver2) {\n ver1 = String(ver1).replace(/-.*$/, \"\").split(\".\").reduce((acc, v, idx) => acc + parseInt(v, 10) * Math.pow(10, 2 * (5 - idx)), 0);\n ver2 = String(ver2).replace(/-.*$/, \"\").split(\".\").reduce((acc, v, idx) => acc + parseInt(v, 10) * Math.pow(10, 2 * (5 - idx)), 0);\n let cmp = Math.min(Math.max(ver1 - ver2, -1), 1);\n return cmp;\n }\n module2.exports = {\n download_http,\n extract_targz,\n path_is_absolute,\n path_has_dotdot,\n sync_files,\n determine_arch: determine_arch2,\n unlink_recursive,\n get_napi_version: get_napi_version2,\n cmp_version\n };\n }\n});\n\n// bin/Koffi/package/src/koffi/package.json\nvar require_package = __commonJS({\n \"bin/Koffi/package/src/koffi/package.json\"(exports2, module2) {\n module2.exports = {\n name: \"koffi\",\n version: \"2.15.0\",\n description: \"Fast and simple C FFI (foreign function interface) for Node.js\",\n keywords: [\n \"foreign\",\n \"function\",\n \"interface\",\n \"ffi\",\n \"binding\",\n \"c\",\n \"napi\"\n ],\n repository: {\n type: \"git\",\n url: \"https://github.com/Koromix/koffi\"\n },\n homepage: \"https://koffi.dev/\",\n author: {\n name: \"Niels Martign\\xE8ne\",\n email: \"niels.martignene@protonmail.com\",\n url: \"https://koromix.dev/\"\n },\n main: \"./index.js\",\n types: \"./index.d.ts\",\n scripts: {\n test: \"node tools/koffi.js test\",\n prepack: `echo 'Use \"npm run package\" instead' && false`,\n prepublishOnly: `echo 'Use \"npm run package\" instead' && false`,\n package: \"node tools/koffi.js build\"\n },\n license: \"MIT\",\n cnoke: {\n api: \"../../vendor/node-api-headers\",\n output: \"../../bin/Koffi/{{ platform }}_{{ arch }}\",\n node: 16,\n napi: 8,\n require: \"./index.js\"\n },\n funding: \"https://buymeacoffee.com/koromix\"\n };\n }\n});\n\n// bin/Koffi/package/src/koffi/src/init.js\nvar require_init = __commonJS({\n \"bin/Koffi/package/src/koffi/src/init.js\"(exports, module) {\n var fs = require(\"fs\");\n var path = require(\"path\");\n var util = require(\"util\");\n var { get_napi_version, determine_arch } = require_tools();\n var pkg = require_package();\n function detect() {\n if (process.versions.napi == null || process.versions.napi < pkg.cnoke.napi) {\n let major = parseInt(process.versions.node, 10);\n let required = get_napi_version(pkg.cnoke.napi, major);\n if (required != null) {\n throw new Error(`This engine is based on Node ${process.versions.node}, but ${pkg.name} requires Node >= ${required} in the Node ${major}.x branch (N-API >= ${pkg.cnoke.napi})`);\n } else {\n throw new Error(`This engine is based on Node ${process.versions.node}, but ${pkg.name} does not support the Node ${major}.x branch (N-API < ${pkg.cnoke.napi})`);\n }\n }\n let arch = determine_arch();\n let triplet3 = `${process.platform}_${arch}`;\n return triplet3;\n }\n function init(triplet, native) {\n if (native == null) {\n let roots = [path.join(__dirname, \"..\")];\n let triplets = [triplet];\n if (process.resourcesPath != null)\n roots.push(process.resourcesPath);\n if (triplet.startsWith(\"linux_\")) {\n let musl = triplet.replace(/^linux_/, \"musl_\");\n triplets.push(musl);\n }\n let filenames = roots.flatMap((root) => triplets.flatMap((triplet3) => [\n `${root}/build/koffi/${triplet3}/koffi.node`,\n `${root}/koffi/${triplet3}/koffi.node`,\n `${root}/node_modules/koffi/build/koffi/${triplet3}/koffi.node`,\n `${root}/../../bin/Koffi/${triplet3}/koffi.node`\n ]));\n let first_err = null;\n for (let filename of filenames) {\n if (!fs.existsSync(filename))\n continue;\n try {\n native = eval(\"require\")(filename);\n } catch (err) {\n if (first_err == null)\n first_err = err;\n continue;\n }\n break;\n }\n if (first_err != null)\n throw first_err;\n }\n if (native == null)\n throw new Error(\"Cannot find the native Koffi module; did you bundle it correctly?\");\n if (native.version != pkg.version)\n throw new Error(\"Mismatched native Koffi modules\");\n let mod = wrap(native);\n return mod;\n }\n function wrap(native3) {\n let obj = {\n ...native3,\n // Deprecated functions\n handle: util.deprecate(native3.opaque, \"The koffi.handle() function was deprecated in Koffi 2.1, use koffi.opaque() instead\", \"KOFFI001\"),\n callback: util.deprecate(native3.proto, \"The koffi.callback() function was deprecated in Koffi 2.4, use koffi.proto() instead\", \"KOFFI002\")\n };\n obj.load = (...args) => {\n let lib = native3.load(...args);\n lib.cdecl = util.deprecate((...args2) => lib.func(\"__cdecl\", ...args2), \"The koffi.cdecl() function was deprecated in Koffi 2.7, use koffi.func(...) instead\", \"KOFFI003\");\n lib.stdcall = util.deprecate((...args2) => lib.func(\"__stdcall\", ...args2), 'The koffi.stdcall() function was deprecated in Koffi 2.7, use koffi.func(\"__stdcall\", ...) instead', \"KOFFI004\");\n lib.fastcall = util.deprecate((...args2) => lib.func(\"__fastcall\", ...args2), 'The koffi.fastcall() function was deprecated in Koffi 2.7, use koffi.func(\"__fastcall\", ...) instead', \"KOFFI005\");\n lib.thiscall = util.deprecate((...args2) => lib.func(\"__thiscall\", ...args2), 'The koffi.thiscall() function was deprecated in Koffi 2.7, use koffi.func(\"__thiscall\", ...) instead', \"KOFFI006\");\n return lib;\n };\n return obj;\n }\n module.exports = {\n detect,\n init\n };\n }\n});\n\n// bin/Koffi/package/src/koffi/index.js\nvar { detect: detect2, init: init2 } = require_init();\nvar triplet2 = detect2();\nvar native2 = null;\ntry {\n switch (triplet2) {\n case \"darwin_arm64\":\n {\n native2 = require(\"./build/koffi/darwin_arm64/koffi.node\");\n }\n break;\n case \"darwin_x64\":\n {\n native2 = require(\"./build/koffi/darwin_x64/koffi.node\");\n }\n break;\n case \"freebsd_arm64\":\n {\n native2 = require(\"./build/koffi/freebsd_arm64/koffi.node\");\n }\n break;\n case \"freebsd_ia32\":\n {\n native2 = require(\"./build/koffi/freebsd_ia32/koffi.node\");\n }\n break;\n case \"freebsd_x64\":\n {\n native2 = require(\"./build/koffi/freebsd_x64/koffi.node\");\n }\n break;\n case \"linux_armhf\":\n {\n native2 = require(\"./build/koffi/linux_armhf/koffi.node\");\n }\n break;\n case \"linux_arm64\":\n {\n native2 = require(\"./build/koffi/linux_arm64/koffi.node\");\n }\n break;\n case \"linux_ia32\":\n {\n native2 = require(\"./build/koffi/linux_ia32/koffi.node\");\n }\n break;\n case \"linux_loong64\":\n {\n native2 = require(\"./build/koffi/linux_loong64/koffi.node\");\n }\n break;\n case \"linux_riscv64d\":\n {\n native2 = require(\"./build/koffi/linux_riscv64d/koffi.node\");\n }\n break;\n case \"linux_x64\":\n {\n native2 = require(\"./build/koffi/linux_x64/koffi.node\");\n }\n break;\n case \"openbsd_ia32\":\n {\n native2 = require(\"./build/koffi/openbsd_ia32/koffi.node\");\n }\n break;\n case \"openbsd_x64\":\n {\n native2 = require(\"./build/koffi/openbsd_x64/koffi.node\");\n }\n break;\n case \"win32_arm64\":\n {\n native2 = require(\"./build/koffi/win32_arm64/koffi.node\");\n }\n break;\n case \"win32_ia32\":\n {\n native2 = require(\"./build/koffi/win32_ia32/koffi.node\");\n }\n break;\n case \"win32_x64\":\n {\n native2 = require(\"./build/koffi/win32_x64/koffi.node\");\n }\n break;\n }\n} catch {\n try {\n switch (triplet2) {\n case \"linux_arm64\":\n {\n native2 = require(\"./build/koffi/musl_arm64/koffi.node\");\n }\n break;\n case \"linux_x64\":\n {\n native2 = require(\"./build/koffi/musl_x64/koffi.node\");\n }\n break;\n }\n } catch {\n }\n}\nvar mod2 = init2(triplet2, native2);\nmodule.exports = mod2;\n","/// <reference types=\"node\" />\n/**\n * Node.js FFI runtime adapter using koffi.\n *\n * This adapter uses the koffi package to interface with the Rust native library.\n * Koffi is a modern, actively maintained FFI library with prebuilt binaries.\n *\n * Install: npm install koffi\n */\n\nimport { BaseTaskerRuntime } from './runtime-interface.js';\nimport type {\n BootstrapConfig,\n BootstrapResult,\n CheckpointYieldData,\n ClientResult,\n FfiDispatchMetrics,\n FfiDomainEvent,\n FfiStepEvent,\n LogFields,\n StepExecutionResult,\n StopResult,\n WorkerStatus,\n} from './types.js';\n\n// Koffi library type\ninterface KoffiLib {\n get_version: () => unknown;\n get_rust_version: () => unknown;\n health_check: () => number;\n is_worker_running: () => number;\n bootstrap_worker: (configJson: string | null) => unknown;\n get_worker_status: () => unknown;\n stop_worker: () => unknown;\n transition_to_graceful_shutdown: () => unknown;\n poll_step_events: () => unknown;\n poll_in_process_events: () => unknown;\n complete_step_event: (eventId: string, resultJson: string) => number;\n checkpoint_yield_step_event: (eventId: string, checkpointJson: string) => number;\n get_ffi_dispatch_metrics: () => unknown;\n check_starvation_warnings: () => void;\n cleanup_timeouts: () => void;\n log_error: (message: string, fieldsJson: string | null) => void;\n log_warn: (message: string, fieldsJson: string | null) => void;\n log_info: (message: string, fieldsJson: string | null) => void;\n log_debug: (message: string, fieldsJson: string | null) => void;\n log_trace: (message: string, fieldsJson: string | null) => void;\n free_rust_string: (ptr: unknown) => void;\n // Client API functions (TAS-231)\n client_create_task: (requestJson: string) => unknown;\n client_get_task: (taskUuid: string) => unknown;\n client_list_tasks: (paramsJson: string) => unknown;\n client_cancel_task: (taskUuid: string) => unknown;\n client_list_task_steps: (taskUuid: string) => unknown;\n client_get_step: (taskUuid: string, stepUuid: string) => unknown;\n client_get_step_audit_history: (taskUuid: string, stepUuid: string) => unknown;\n client_health_check: () => unknown;\n}\n\n/**\n * Node.js FFI runtime implementation using koffi\n */\nexport class NodeRuntime extends BaseTaskerRuntime {\n readonly name: string = 'node';\n private lib: KoffiLib | null = null;\n // biome-ignore lint/suspicious/noExplicitAny: koffi module type\n private koffi: any = null;\n\n get isLoaded(): boolean {\n return this.lib !== null;\n }\n\n async load(libraryPath: string): Promise<void> {\n if (this.lib !== null) {\n return; // Already loaded\n }\n\n // Dynamically import koffi\n const koffiModule = await import('koffi');\n this.koffi = koffiModule.default ?? koffiModule;\n\n // Load the native library\n const lib = this.koffi.load(libraryPath);\n\n // Define FFI functions\n // Functions returning strings return pointers that we need to free\n this.lib = {\n get_version: lib.func('void* get_version()'),\n get_rust_version: lib.func('void* get_rust_version()'),\n health_check: lib.func('int health_check()'),\n is_worker_running: lib.func('int is_worker_running()'),\n bootstrap_worker: lib.func('void* bootstrap_worker(str)'),\n get_worker_status: lib.func('void* get_worker_status()'),\n stop_worker: lib.func('void* stop_worker()'),\n transition_to_graceful_shutdown: lib.func('void* transition_to_graceful_shutdown()'),\n poll_step_events: lib.func('void* poll_step_events()'),\n poll_in_process_events: lib.func('void* poll_in_process_events()'),\n complete_step_event: lib.func('int complete_step_event(str, str)'),\n checkpoint_yield_step_event: lib.func('int checkpoint_yield_step_event(str, str)'),\n get_ffi_dispatch_metrics: lib.func('void* get_ffi_dispatch_metrics()'),\n check_starvation_warnings: lib.func('void check_starvation_warnings()'),\n cleanup_timeouts: lib.func('void cleanup_timeouts()'),\n log_error: lib.func('void log_error(str, str)'),\n log_warn: lib.func('void log_warn(str, str)'),\n log_info: lib.func('void log_info(str, str)'),\n log_debug: lib.func('void log_debug(str, str)'),\n log_trace: lib.func('void log_trace(str, str)'),\n free_rust_string: lib.func('void free_rust_string(void*)'),\n // Client API functions (TAS-231)\n client_create_task: lib.func('void* client_create_task(str)'),\n client_get_task: lib.func('void* client_get_task(str)'),\n client_list_tasks: lib.func('void* client_list_tasks(str)'),\n client_cancel_task: lib.func('void* client_cancel_task(str)'),\n client_list_task_steps: lib.func('void* client_list_task_steps(str)'),\n client_get_step: lib.func('void* client_get_step(str, str)'),\n client_get_step_audit_history: lib.func('void* client_get_step_audit_history(str, str)'),\n client_health_check: lib.func('void* client_health_check()'),\n };\n }\n\n unload(): void {\n this.lib = null;\n this.koffi = null;\n }\n\n private ensureLoaded(): KoffiLib {\n if (!this.lib) {\n throw new Error('Native library not loaded. Call load() first.');\n }\n return this.lib;\n }\n\n /**\n * Read a C string from a pointer and free the Rust-allocated memory.\n *\n * Uses koffi.decode with 'char' type and -1 length for null-terminated strings.\n */\n private readAndFreeRustString(ptr: unknown): string | null {\n if (!ptr) return null;\n const lib = this.ensureLoaded();\n\n // Decode the null-terminated C string from pointer\n // Using 'char' with -1 length reads until null terminator\n const str = this.koffi.decode(ptr, 'char', -1);\n\n // Free the Rust-allocated memory\n lib.free_rust_string(ptr);\n\n return str;\n }\n\n getVersion(): string {\n const lib = this.ensureLoaded();\n const ptr = lib.get_version();\n return this.readAndFreeRustString(ptr) ?? 'unknown';\n }\n\n getRustVersion(): string {\n const lib = this.ensureLoaded();\n const ptr = lib.get_rust_version();\n return this.readAndFreeRustString(ptr) ?? 'unknown';\n }\n\n healthCheck(): boolean {\n const lib = this.ensureLoaded();\n return lib.health_check() === 1;\n }\n\n bootstrapWorker(config?: BootstrapConfig): BootstrapResult {\n const lib = this.ensureLoaded();\n const configJson = config ? this.toJson(config) : null;\n const ptr = lib.bootstrap_worker(configJson);\n const jsonStr = this.readAndFreeRustString(ptr);\n\n const parsed = this.parseJson<BootstrapResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse bootstrap result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n isWorkerRunning(): boolean {\n const lib = this.ensureLoaded();\n return lib.is_worker_running() === 1;\n }\n\n getWorkerStatus(): WorkerStatus {\n const lib = this.ensureLoaded();\n const ptr = lib.get_worker_status();\n const jsonStr = this.readAndFreeRustString(ptr);\n\n const parsed = this.parseJson<WorkerStatus>(jsonStr);\n return parsed ?? { success: false, running: false };\n }\n\n stopWorker(): StopResult {\n const lib = this.ensureLoaded();\n const ptr = lib.stop_worker();\n const jsonStr = this.readAndFreeRustString(ptr);\n\n const parsed = this.parseJson<StopResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse stop result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n transitionToGracefulShutdown(): StopResult {\n const lib = this.ensureLoaded();\n const ptr = lib.transition_to_graceful_shutdown();\n const jsonStr = this.readAndFreeRustString(ptr);\n\n const parsed = this.parseJson<StopResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n status: 'error',\n message: 'Failed to parse shutdown result',\n error: 'Invalid JSON response',\n }\n );\n }\n\n pollStepEvents(): FfiStepEvent | null {\n const lib = this.ensureLoaded();\n const ptr = lib.poll_step_events();\n if (!ptr) return null;\n\n const jsonStr = this.readAndFreeRustString(ptr);\n return this.parseJson<FfiStepEvent>(jsonStr);\n }\n\n pollInProcessEvents(): FfiDomainEvent | null {\n const lib = this.ensureLoaded();\n const ptr = lib.poll_in_process_events();\n if (!ptr) return null;\n\n const jsonStr = this.readAndFreeRustString(ptr);\n return this.parseJson<FfiDomainEvent>(jsonStr);\n }\n\n completeStepEvent(eventId: string, result: StepExecutionResult): boolean {\n const lib = this.ensureLoaded();\n return lib.complete_step_event(eventId, this.toJson(result)) === 1;\n }\n\n checkpointYieldStepEvent(eventId: string, checkpointData: CheckpointYieldData): boolean {\n const lib = this.ensureLoaded();\n return lib.checkpoint_yield_step_event(eventId, this.toJson(checkpointData)) === 1;\n }\n\n getFfiDispatchMetrics(): FfiDispatchMetrics {\n const lib = this.ensureLoaded();\n const ptr = lib.get_ffi_dispatch_metrics();\n const jsonStr = this.readAndFreeRustString(ptr);\n\n const parsed = this.parseJson<FfiDispatchMetrics>(jsonStr);\n // Check if we got a valid metrics object (not an error response)\n if (parsed && typeof parsed.pending_count === 'number') {\n return parsed;\n }\n // Return default metrics when worker not initialized or error\n return {\n pending_count: 0,\n starvation_detected: false,\n starving_event_count: 0,\n oldest_pending_age_ms: null,\n newest_pending_age_ms: null,\n oldest_event_id: null,\n };\n }\n\n checkStarvationWarnings(): void {\n const lib = this.ensureLoaded();\n lib.check_starvation_warnings();\n }\n\n cleanupTimeouts(): void {\n const lib = this.ensureLoaded();\n lib.cleanup_timeouts();\n }\n\n logError(message: string, fields?: LogFields): void {\n const lib = this.ensureLoaded();\n lib.log_error(message, fields ? this.toJson(fields) : null);\n }\n\n logWarn(message: string, fields?: LogFields): void {\n const lib = this.ensureLoaded();\n lib.log_warn(message, fields ? this.toJson(fields) : null);\n }\n\n logInfo(message: string, fields?: LogFields): void {\n const lib = this.ensureLoaded();\n lib.log_info(message, fields ? this.toJson(fields) : null);\n }\n\n logDebug(message: string, fields?: LogFields): void {\n const lib = this.ensureLoaded();\n lib.log_debug(message, fields ? this.toJson(fields) : null);\n }\n\n logTrace(message: string, fields?: LogFields): void {\n const lib = this.ensureLoaded();\n lib.log_trace(message, fields ? this.toJson(fields) : null);\n }\n\n // ==========================================================================\n // Client API Operations (TAS-231)\n // ==========================================================================\n\n private parseClientResult(ptr: unknown): ClientResult {\n const jsonStr = this.readAndFreeRustString(ptr);\n const parsed = this.parseJson<ClientResult>(jsonStr);\n return (\n parsed ?? {\n success: false,\n data: null,\n error: 'Failed to parse client result',\n recoverable: null,\n }\n );\n }\n\n clientCreateTask(requestJson: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_create_task(requestJson);\n return this.parseClientResult(ptr);\n }\n\n clientGetTask(taskUuid: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_get_task(taskUuid);\n return this.parseClientResult(ptr);\n }\n\n clientListTasks(paramsJson: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_list_tasks(paramsJson);\n return this.parseClientResult(ptr);\n }\n\n clientCancelTask(taskUuid: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_cancel_task(taskUuid);\n return this.parseClientResult(ptr);\n }\n\n clientListTaskSteps(taskUuid: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_list_task_steps(taskUuid);\n return this.parseClientResult(ptr);\n }\n\n clientGetStep(taskUuid: string, stepUuid: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_get_step(taskUuid, stepUuid);\n return this.parseClientResult(ptr);\n }\n\n clientGetStepAuditHistory(taskUuid: string, stepUuid: string): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_get_step_audit_history(taskUuid, stepUuid);\n return this.parseClientResult(ptr);\n }\n\n clientHealthCheck(): ClientResult {\n const lib = this.ensureLoaded();\n const ptr = lib.client_health_check();\n return this.parseClientResult(ptr);\n }\n}\n","/**\n * TAS-93: Explicit mapping resolver (priority 10).\n *\n * Resolves handlers from explicitly registered mappings.\n * This is the highest priority resolver in the default chain.\n *\n * Supports registering:\n * - Handler classes (instantiated on resolve)\n * - Handler instances (returned directly)\n * - Factory functions (called with config on resolve)\n *\n * @example\n * ```typescript\n * const resolver = new ExplicitMappingResolver();\n *\n * // Register a class\n * resolver.register('my_handler', MyHandler);\n *\n * // Register an instance\n * resolver.register('shared_handler', new SharedHandler());\n *\n * // Register a factory\n * resolver.register('configurable_handler', (config) => new ConfigHandler(config));\n *\n * // Resolve\n * const definition: HandlerDefinition = { callable: 'my_handler' };\n * const handler = await resolver.resolve(definition);\n * ```\n */\n\nimport type { StepHandler, StepHandlerClass } from '../../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from '../base-resolver.js';\nimport type { HandlerDefinition } from '../handler-definition.js';\n\n/**\n * Factory function for creating handlers.\n */\nexport type HandlerFactory = (config: ResolverConfig) => StepHandler;\n\n/**\n * Entry types that can be registered.\n */\nexport type HandlerEntry = StepHandlerClass | StepHandler | HandlerFactory;\n\n/**\n * Resolver for explicitly registered handlers.\n *\n * Priority 10 - checked first in the default chain.\n */\nexport class ExplicitMappingResolver implements BaseResolver {\n readonly name: string;\n readonly priority = 10;\n\n private handlers: Map<string, HandlerEntry> = new Map();\n\n /**\n * Create an explicit mapping resolver.\n *\n * @param name - Resolver name (default: 'explicit_mapping')\n */\n constructor(name = 'explicit_mapping') {\n this.name = name;\n }\n\n /**\n * Check if a handler is registered for this callable.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if handler is registered\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n return this.handlers.has(definition.callable);\n }\n\n /**\n * Resolve and instantiate a registered handler.\n *\n * @param definition - Handler definition\n * @param config - Configuration passed to factories\n * @returns Handler instance or null if not registered\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n const entry = this.handlers.get(definition.callable);\n if (!entry) {\n return null;\n }\n\n return this.instantiateHandler(entry, definition, config ?? {});\n }\n\n /**\n * Register a handler.\n *\n * @param key - Handler identifier (matched against definition.callable)\n * @param handler - Handler class, instance, or factory function\n */\n register(key: string, handler: HandlerEntry): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * Unregister a handler.\n *\n * @param key - Handler identifier to remove\n * @returns True if handler was removed, false if not found\n */\n unregister(key: string): boolean {\n return this.handlers.delete(key);\n }\n\n /**\n * Get all registered callable keys.\n *\n * @returns Array of registered keys\n */\n registeredCallables(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Instantiate a handler from a registered entry.\n */\n private instantiateHandler(\n entry: HandlerEntry,\n definition: HandlerDefinition,\n config: ResolverConfig\n ): StepHandler | null {\n // Check if it's a class (has prototype and is a function)\n if (this.isHandlerClass(entry)) {\n return this.instantiateClass(entry, definition);\n }\n\n // Check if it's a factory function (function but not a class)\n if (typeof entry === 'function') {\n try {\n return entry(config);\n } catch (error) {\n console.error(`[ExplicitMappingResolver] Factory failed:`, error);\n return null;\n }\n }\n\n // Otherwise it's an instance - return directly\n return entry as StepHandler;\n }\n\n /**\n * Check if entry is a handler class.\n */\n private isHandlerClass(entry: HandlerEntry): entry is StepHandlerClass {\n return typeof entry === 'function' && entry.prototype !== undefined && 'handlerName' in entry;\n }\n\n /**\n * Instantiate a handler class.\n */\n private instantiateClass(\n handlerClass: StepHandlerClass,\n _definition: HandlerDefinition\n ): StepHandler | null {\n try {\n return new handlerClass();\n } catch (error) {\n console.error(`[ExplicitMappingResolver] Failed to instantiate ${handlerClass.name}:`, error);\n return null;\n }\n }\n}\n","/**\n * TAS-93: Class lookup resolver (priority 100).\n *\n * Infers handler classes from callable strings using dynamic imports.\n * This resolver handles module path formats.\n *\n * Supports callable formats:\n * - \"./path/to/handler.js\" - Relative module path\n * - \"../parent/handler.js\" - Parent-relative module path\n * - \"@scope/package/handler\" - Scoped package path\n *\n * NOT supported (security):\n * - \"/absolute/path/to/handler.js\" - Absolute paths are blocked to prevent\n * loading arbitrary code in shared hosting environments.\n *\n * The module must export a class with a static `handlerName` property\n * matching the expected handler interface.\n *\n * Note: This resolver is lower priority (100) because dynamic imports\n * are more expensive than explicit mappings.\n *\n * @example\n * ```typescript\n * const resolver = new ClassLookupResolver();\n *\n * // Resolve from module path\n * const definition: HandlerDefinition = {\n * callable: './handlers/payment-handler.js',\n * };\n * const handler = await resolver.resolve(definition);\n * ```\n */\n\nimport type { StepHandler, StepHandlerClass } from '../../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from '../base-resolver.js';\nimport type { HandlerDefinition } from '../handler-definition.js';\n\n/**\n * Pattern to match importable paths.\n *\n * Matches:\n * - Relative paths: ./foo, ../foo\n * - Package paths: @scope/foo\n *\n * Note: Absolute paths (/foo/bar) are intentionally NOT supported\n * to prevent loading arbitrary code from the filesystem in shared\n * hosting environments.\n */\nconst IMPORTABLE_PATTERN = /^(\\.\\.?\\/|@[\\w-]+\\/)/;\n\n/**\n * Resolver that infers handlers from module paths via dynamic import.\n *\n * Priority 100 - checked last in the default chain (inferential).\n */\nexport class ClassLookupResolver implements BaseResolver {\n readonly name = 'class_lookup';\n readonly priority = 100;\n\n /**\n * Check if callable looks like an importable path.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if callable matches importable pattern\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n return IMPORTABLE_PATTERN.test(definition.callable);\n }\n\n /**\n * Resolve handler by dynamically importing the module.\n *\n * Looks for:\n * 1. Default export that is a handler class\n * 2. Named exports that are handler classes\n *\n * @param definition - Handler definition with module path\n * @param _config - Unused, part of interface\n * @returns Handler instance or null if not found\n */\n async resolve(\n definition: HandlerDefinition,\n _config?: ResolverConfig\n ): Promise<StepHandler | null> {\n // Security check: only allow paths that pass canResolve\n if (!this.canResolve(definition)) {\n return null;\n }\n\n const modulePath = definition.callable;\n\n try {\n const module = await import(modulePath);\n const handlerClass = this.findHandlerClass(module);\n\n if (!handlerClass) {\n return null;\n }\n\n return this.instantiateHandler(handlerClass);\n } catch (error) {\n // Import failed - log and return null to allow chain to continue\n console.debug(\n `[ClassLookupResolver] Failed to import '${modulePath}':`,\n error instanceof Error ? error.message : error\n );\n return null;\n }\n }\n\n /**\n * Find a handler class in a module's exports.\n */\n private findHandlerClass(module: Record<string, unknown>): StepHandlerClass | null {\n // Try default export first\n if (this.isHandlerClass(module.default)) {\n return module.default;\n }\n\n // Look through named exports\n for (const [, exported] of Object.entries(module)) {\n if (this.isHandlerClass(exported)) {\n return exported;\n }\n }\n\n return null;\n }\n\n /**\n * Check if a value is a valid handler class.\n */\n private isHandlerClass(value: unknown): value is StepHandlerClass {\n return (\n value !== null &&\n typeof value === 'function' &&\n 'handlerName' in value &&\n typeof (value as StepHandlerClass).handlerName === 'string'\n );\n }\n\n /**\n * Instantiate a handler class.\n */\n private instantiateHandler(handlerClass: StepHandlerClass): StepHandler | null {\n try {\n return new handlerClass();\n } catch (error) {\n console.error(`[ClassLookupResolver] Failed to instantiate ${handlerClass.name}:`, error);\n return null;\n }\n }\n}\n","/**\n * Bootstrap configuration and result types.\n *\n * These types extend the FFI types with TypeScript-friendly interfaces\n * for worker lifecycle management.\n */\n\nimport type {\n BootstrapConfig as FfiBootstrapConfig,\n BootstrapResult as FfiBootstrapResult,\n StopResult as FfiStopResult,\n WorkerStatus as FfiWorkerStatus,\n} from '../ffi/types.js';\n\n// Re-export FFI types for convenience\nexport type { FfiBootstrapConfig, FfiBootstrapResult, FfiWorkerStatus, FfiStopResult };\n\n/**\n * Configuration for worker bootstrap.\n *\n * Matches Python's BootstrapConfig and Ruby's bootstrap options.\n */\nexport interface BootstrapConfig {\n /** Optional worker ID. Auto-generated if not provided. */\n workerId?: string;\n\n /** Task namespace this worker handles (default: \"default\"). */\n namespace?: string;\n\n /** Path to custom configuration file (TOML). */\n configPath?: string;\n\n /** Log level: trace, debug, info, warn, error (default: \"info\"). */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n\n /** Database URL override. */\n databaseUrl?: string;\n}\n\n/**\n * Result from worker bootstrap.\n *\n * Contains information about the bootstrapped worker instance.\n */\nexport interface BootstrapResult {\n /** Whether bootstrap was successful. */\n success: boolean;\n\n /** Current status (started, already_running, error). */\n status: 'started' | 'already_running' | 'error';\n\n /** Human-readable status message. */\n message: string;\n\n /** Unique identifier for this worker instance. */\n workerId?: string;\n\n /** Error message if bootstrap failed. */\n error?: string;\n}\n\n/**\n * Current worker status.\n *\n * Contains detailed information about the worker's state and resources.\n */\nexport interface WorkerStatus {\n /** Whether the status query succeeded. */\n success: boolean;\n\n /** Whether the worker is currently running. */\n running: boolean;\n\n /** Current status string. */\n status?: string;\n\n /** Worker ID if running. */\n workerId?: string;\n\n /** Current environment (test, development, production). */\n environment?: string;\n\n /** Internal worker core status. */\n workerCoreStatus?: string;\n\n /** Whether the web API is enabled. */\n webApiEnabled?: boolean;\n\n /** List of task namespaces this worker handles. */\n supportedNamespaces?: string[];\n\n /** Total database connection pool size. */\n databasePoolSize?: number;\n\n /** Number of idle database connections. */\n databasePoolIdle?: number;\n}\n\n/**\n * Result from stopping the worker.\n */\nexport interface StopResult {\n /** Whether the stop was successful. */\n success: boolean;\n\n /** Current status (stopped, not_running, error). */\n status: 'stopped' | 'not_running' | 'error';\n\n /** Human-readable status message. */\n message: string;\n\n /** Worker ID that was stopped. */\n workerId?: string;\n\n /** Error message if stop failed. */\n error?: string;\n}\n\n/**\n * Convert TypeScript BootstrapConfig to FFI format.\n */\nexport function toFfiBootstrapConfig(config?: BootstrapConfig): FfiBootstrapConfig {\n if (!config) {\n return {};\n }\n\n const result: FfiBootstrapConfig = {};\n\n if (config.workerId !== undefined) {\n result.worker_id = config.workerId;\n }\n if (config.logLevel !== undefined) {\n result.log_level = config.logLevel;\n }\n if (config.databaseUrl !== undefined) {\n result.database_url = config.databaseUrl;\n }\n if (config.namespace !== undefined) {\n result.namespace = config.namespace;\n }\n if (config.configPath !== undefined) {\n result.config_path = config.configPath;\n }\n\n return result;\n}\n\n/**\n * Convert FFI BootstrapResult to TypeScript format.\n */\nexport function fromFfiBootstrapResult(result: FfiBootstrapResult): BootstrapResult {\n const converted: BootstrapResult = {\n success: result.success,\n status: result.status,\n message: result.message,\n };\n\n if (result.worker_id !== undefined) {\n converted.workerId = result.worker_id;\n }\n if (result.error !== undefined) {\n converted.error = result.error;\n }\n\n return converted;\n}\n\n/**\n * Convert FFI WorkerStatus to TypeScript format.\n */\nexport function fromFfiWorkerStatus(status: FfiWorkerStatus): WorkerStatus {\n const converted: WorkerStatus = {\n success: status.success,\n running: status.running,\n };\n\n if (status.status !== undefined) {\n converted.status = status.status;\n }\n if (status.worker_id !== undefined) {\n converted.workerId = status.worker_id;\n }\n if (status.environment !== undefined) {\n converted.environment = status.environment;\n }\n if (status.worker_core_status !== undefined) {\n converted.workerCoreStatus = status.worker_core_status;\n }\n if (status.web_api_enabled !== undefined) {\n converted.webApiEnabled = status.web_api_enabled;\n }\n if (status.supported_namespaces !== undefined) {\n converted.supportedNamespaces = status.supported_namespaces;\n }\n if (status.database_pool_size !== undefined) {\n converted.databasePoolSize = status.database_pool_size;\n }\n if (status.database_pool_idle !== undefined) {\n converted.databasePoolIdle = status.database_pool_idle;\n }\n\n return converted;\n}\n\n/**\n * Convert FFI StopResult to TypeScript format.\n */\nexport function fromFfiStopResult(result: FfiStopResult): StopResult {\n const converted: StopResult = {\n success: result.success,\n status: result.status,\n message: result.message,\n };\n\n if (result.worker_id !== undefined) {\n converted.workerId = result.worker_id;\n }\n if (result.error !== undefined) {\n converted.error = result.error;\n }\n\n return converted;\n}\n","/**\n * Bootstrap API for TypeScript workers.\n *\n * High-level TypeScript API for worker lifecycle management.\n * Wraps FFI calls with type-safe interfaces and error handling.\n *\n * Matches Python's bootstrap.py and Ruby's bootstrap.rb (TAS-92 aligned).\n *\n * All functions require an explicit runtime parameter. Use FfiLayer to load\n * the runtime before calling these functions.\n */\n\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { BootstrapConfig, BootstrapResult, StopResult, WorkerStatus } from './types.js';\nimport {\n fromFfiBootstrapResult,\n fromFfiStopResult,\n fromFfiWorkerStatus,\n toFfiBootstrapConfig,\n} from './types.js';\n\n/**\n * Initialize the worker system.\n *\n * This function bootstraps the full tasker-worker system, including:\n * - Creating a Tokio runtime for async operations\n * - Connecting to the database\n * - Setting up the FFI dispatch channel for step events\n * - Subscribing to domain events\n *\n * @param config - Optional bootstrap configuration\n * @param runtime - The loaded FFI runtime (required)\n * @returns BootstrapResult with worker details and status\n * @throws Error if bootstrap fails critically\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const result = await bootstrapWorker({ namespace: 'payments' }, ffiLayer.getRuntime());\n * console.log(`Worker ${result.workerId} started`);\n * ```\n */\nexport async function bootstrapWorker(\n config: BootstrapConfig | undefined,\n runtime: TaskerRuntime\n): Promise<BootstrapResult> {\n try {\n if (!runtime?.isLoaded) {\n return {\n success: false,\n status: 'error',\n message: 'Runtime not loaded. Ensure the FFI library is available.',\n error: 'Runtime not loaded',\n };\n }\n\n const ffiConfig = toFfiBootstrapConfig(config);\n const ffiResult = runtime.bootstrapWorker(ffiConfig);\n return fromFfiBootstrapResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Bootstrap failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Stop the worker system gracefully.\n *\n * This function stops the worker system and releases all resources.\n * Safe to call even if the worker is not running.\n *\n * @param runtime - The loaded FFI runtime (optional - returns success if not loaded)\n * @returns StopResult indicating the outcome\n *\n * @example\n * ```typescript\n * const result = stopWorker(runtime);\n * if (result.success) {\n * console.log('Worker stopped successfully');\n * }\n * ```\n */\nexport function stopWorker(runtime?: TaskerRuntime): StopResult {\n if (!runtime?.isLoaded) {\n return {\n success: true,\n status: 'not_running',\n message: 'Runtime not loaded',\n };\n }\n\n try {\n const ffiResult = runtime.stopWorker();\n return fromFfiStopResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Stop failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get the current worker system status.\n *\n * Returns detailed information about the worker's current state,\n * including resource usage and operational status.\n *\n * @param runtime - The loaded FFI runtime (optional - returns stopped if not loaded)\n * @returns WorkerStatus with current state and metrics\n *\n * @example\n * ```typescript\n * const status = getWorkerStatus(runtime);\n * if (status.running) {\n * console.log(`Pool size: ${status.databasePoolSize}`);\n * } else {\n * console.log(`Worker not running`);\n * }\n * ```\n */\nexport function getWorkerStatus(runtime?: TaskerRuntime): WorkerStatus {\n if (!runtime?.isLoaded) {\n return {\n success: false,\n running: false,\n status: 'stopped',\n };\n }\n\n try {\n const ffiStatus = runtime.getWorkerStatus();\n return fromFfiWorkerStatus(ffiStatus);\n } catch (_error) {\n return {\n success: false,\n running: false,\n status: 'stopped',\n };\n }\n}\n\n/**\n * Initiate graceful shutdown of the worker system.\n *\n * This function begins the graceful shutdown process, allowing\n * in-flight operations to complete before fully stopping.\n * Call stopWorker() after this to fully stop the worker.\n *\n * @param runtime - The loaded FFI runtime (optional - returns success if not loaded)\n * @returns StopResult indicating the transition status\n *\n * @example\n * ```typescript\n * // Start graceful shutdown\n * transitionToGracefulShutdown(runtime);\n *\n * // Wait for in-flight operations...\n * await new Promise(resolve => setTimeout(resolve, 5000));\n *\n * // Fully stop\n * stopWorker(runtime);\n * ```\n */\nexport function transitionToGracefulShutdown(runtime?: TaskerRuntime): StopResult {\n if (!runtime?.isLoaded) {\n return {\n success: true,\n status: 'not_running',\n message: 'Runtime not loaded',\n };\n }\n\n try {\n const ffiResult = runtime.transitionToGracefulShutdown();\n return fromFfiStopResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Graceful shutdown failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check if the worker system is currently running.\n *\n * Lightweight check that doesn't query the full status.\n *\n * @param runtime - The loaded FFI runtime (optional - returns false if not loaded)\n * @returns True if the worker is running\n *\n * @example\n * ```typescript\n * if (!isWorkerRunning(runtime)) {\n * await bootstrapWorker(config, runtime);\n * }\n * ```\n */\nexport function isWorkerRunning(runtime?: TaskerRuntime): boolean {\n if (!runtime?.isLoaded) {\n return false;\n }\n\n try {\n return runtime.isWorkerRunning();\n } catch {\n return false;\n }\n}\n\n/**\n * Get version information for the worker system.\n *\n * @param runtime - The loaded FFI runtime (optional)\n * @returns Version string from the Rust library\n */\nexport function getVersion(runtime?: TaskerRuntime): string {\n if (!runtime?.isLoaded) {\n return 'unknown (runtime not loaded)';\n }\n\n try {\n return runtime.getVersion();\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Get detailed Rust library version.\n *\n * @param runtime - The loaded FFI runtime (optional)\n * @returns Detailed version information\n */\nexport function getRustVersion(runtime?: TaskerRuntime): string {\n if (!runtime?.isLoaded) {\n return 'unknown (runtime not loaded)';\n }\n\n try {\n return runtime.getRustVersion();\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Perform a health check on the FFI module.\n *\n * @param runtime - The loaded FFI runtime (optional - returns false if not loaded)\n * @returns True if the FFI module is functional\n */\nexport function healthCheck(runtime?: TaskerRuntime): boolean {\n if (!runtime?.isLoaded) {\n return false;\n }\n\n try {\n return runtime.healthCheck();\n } catch {\n return false;\n }\n}\n","/**\n * High-level client wrapper for orchestration API operations.\n *\n * The raw FFI exposes `runtime.clientCreateTask(json)` and similar methods\n * that require callers to construct complete JSON request strings with all\n * required fields and return untyped `ClientResult` envelopes.\n *\n * This module provides a `TaskerClient` class with typed methods, sensible\n * defaults, and proper error handling.\n *\n * @example\n * ```typescript\n * import { FfiLayer, TaskerClient } from '@tasker-systems/tasker';\n *\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const client = new TaskerClient(ffiLayer);\n *\n * const task = client.createTask({ name: 'process_order', namespace: 'ecommerce' });\n * console.log(task.task_uuid);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { FfiLayer } from '../ffi/ffi-layer.js';\nimport type {\n ClientHealthResponse,\n ClientResult,\n ClientStepAuditResponse,\n ClientStepResponse,\n ClientTaskListResponse,\n ClientTaskResponse,\n} from '../ffi/types.js';\n\n/**\n * Options for creating a task.\n *\n * Only `name` is required; all other fields have sensible defaults.\n */\nexport interface CreateTaskOptions {\n /** Named task template name */\n name: string;\n /** Task namespace (default: 'default') */\n namespace?: string;\n /** Workflow context passed to step handlers (default: {}) */\n context?: Record<string, unknown>;\n /** Template version (default: '1.0.0') */\n version?: string;\n /** Who initiated the request (default: 'tasker-core-typescript') */\n initiator?: string;\n /** Originating system (default: 'tasker-core') */\n sourceSystem?: string;\n /** Reason for creating the task (default: 'Task requested') */\n reason?: string;\n /** Optional tags */\n tags?: string[];\n /** Optional priority */\n priority?: number | null;\n /** Optional correlation ID (auto-generated if not provided) */\n correlationId?: string;\n /** Optional parent correlation ID */\n parentCorrelationId?: string | null;\n /** Optional idempotency key */\n idempotencyKey?: string | null;\n}\n\n/**\n * Options for listing tasks.\n */\nexport interface ListTasksOptions {\n /** Maximum number of results (default: 50) */\n limit?: number;\n /** Pagination offset (default: 0) */\n offset?: number;\n /** Filter by namespace */\n namespace?: string;\n /** Filter by status */\n status?: string;\n}\n\n/**\n * Error thrown when a client operation fails.\n */\nexport class TaskerClientError extends Error {\n /** Whether the error is potentially recoverable */\n readonly recoverable: boolean;\n\n constructor(message: string, recoverable = false) {\n super(message);\n this.name = 'TaskerClientError';\n this.recoverable = recoverable;\n }\n}\n\n/**\n * High-level client for orchestration API operations.\n *\n * Wraps the raw FFI methods with typed interfaces, sensible defaults,\n * and proper error handling via `TaskerClientError`.\n */\nexport class TaskerClient {\n private readonly ffiLayer: FfiLayer;\n\n constructor(ffiLayer: FfiLayer) {\n this.ffiLayer = ffiLayer;\n }\n\n /**\n * Create a task via the orchestration API.\n *\n * @param options - Task creation options (only `name` is required)\n * @returns Typed task response\n * @throws TaskerClientError if the operation fails\n */\n createTask(options: CreateTaskOptions): ClientTaskResponse {\n const request = {\n name: options.name,\n namespace: options.namespace ?? 'default',\n version: options.version ?? '1.0.0',\n context: options.context ?? {},\n initiator: options.initiator ?? 'tasker-core-typescript',\n source_system: options.sourceSystem ?? 'tasker-core',\n reason: options.reason ?? 'Task requested',\n tags: options.tags ?? [],\n requested_at: new Date().toISOString(),\n options: null,\n priority: options.priority ?? null,\n correlation_id: options.correlationId ?? crypto.randomUUID(),\n parent_correlation_id: options.parentCorrelationId ?? null,\n idempotency_key: options.idempotencyKey ?? null,\n };\n\n const result = this.getRuntime().clientCreateTask(JSON.stringify(request));\n return this.unwrap<ClientTaskResponse>(result);\n }\n\n /**\n * Get a task by UUID.\n *\n * @param taskUuid - The task UUID\n * @returns Typed task response\n * @throws TaskerClientError if the operation fails\n */\n getTask(taskUuid: string): ClientTaskResponse {\n const result = this.getRuntime().clientGetTask(taskUuid);\n return this.unwrap<ClientTaskResponse>(result);\n }\n\n /**\n * List tasks with optional filtering and pagination.\n *\n * @param options - Filtering and pagination options\n * @returns Typed task list response with pagination\n * @throws TaskerClientError if the operation fails\n */\n listTasks(options: ListTasksOptions = {}): ClientTaskListResponse {\n const params = {\n limit: options.limit ?? 50,\n offset: options.offset ?? 0,\n namespace: options.namespace ?? null,\n status: options.status ?? null,\n };\n\n const result = this.getRuntime().clientListTasks(JSON.stringify(params));\n return this.unwrap<ClientTaskListResponse>(result);\n }\n\n /**\n * Cancel a task by UUID.\n *\n * @param taskUuid - The task UUID\n * @throws TaskerClientError if the operation fails\n */\n cancelTask(taskUuid: string): void {\n const result = this.getRuntime().clientCancelTask(taskUuid);\n this.unwrap(result);\n }\n\n /**\n * List workflow steps for a task.\n *\n * @param taskUuid - The task UUID\n * @returns Array of typed step responses\n * @throws TaskerClientError if the operation fails\n */\n listTaskSteps(taskUuid: string): ClientStepResponse[] {\n const result = this.getRuntime().clientListTaskSteps(taskUuid);\n return this.unwrap<ClientStepResponse[]>(result);\n }\n\n /**\n * Get a specific workflow step.\n *\n * @param taskUuid - The task UUID\n * @param stepUuid - The step UUID\n * @returns Typed step response\n * @throws TaskerClientError if the operation fails\n */\n getStep(taskUuid: string, stepUuid: string): ClientStepResponse {\n const result = this.getRuntime().clientGetStep(taskUuid, stepUuid);\n return this.unwrap<ClientStepResponse>(result);\n }\n\n /**\n * Get audit history for a workflow step.\n *\n * @param taskUuid - The task UUID\n * @param stepUuid - The step UUID\n * @returns Array of typed audit history entries\n * @throws TaskerClientError if the operation fails\n */\n getStepAuditHistory(taskUuid: string, stepUuid: string): ClientStepAuditResponse[] {\n const result = this.getRuntime().clientGetStepAuditHistory(taskUuid, stepUuid);\n return this.unwrap<ClientStepAuditResponse[]>(result);\n }\n\n /**\n * Check orchestration API health.\n *\n * @returns Typed health response\n * @throws TaskerClientError if the operation fails\n */\n healthCheck(): ClientHealthResponse {\n const result = this.getRuntime().clientHealthCheck();\n return this.unwrap<ClientHealthResponse>(result);\n }\n\n /**\n * Unwrap a ClientResult envelope, throwing on error.\n */\n private unwrap<T>(result: ClientResult): T {\n if (!result.success) {\n throw new TaskerClientError(\n result.error ?? 'Unknown client error',\n result.recoverable ?? false\n );\n }\n return result.data as T;\n }\n\n /**\n * Get the FFI runtime from the layer.\n */\n private getRuntime() {\n return this.ffiLayer.getRuntime();\n }\n}\n","/**\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","/**\n * FFI module for TypeScript/JavaScript workers.\n *\n * Provides runtime-specific FFI adapters for Bun, Node.js, and Deno.\n */\n\n// Runtime implementations (for direct use if needed)\nexport { DenoRuntime } from './deno-runtime.js';\n// FfiLayer - primary API for FFI management\nexport { FfiLayer, type FfiLayerConfig } from './ffi-layer.js';\nexport { NodeRuntime } from './node-runtime.js';\n// Runtime detection\nexport {\n detectRuntime,\n getLibraryPath,\n getRuntimeInfo,\n isBun,\n isDeno,\n isNode,\n type RuntimeInfo,\n type RuntimeType,\n} from './runtime.js';\n// Runtime interface\nexport { BaseTaskerRuntime, type TaskerRuntime } from './runtime-interface.js';\n\n// FFI types\nexport type {\n BootstrapConfig,\n BootstrapResult,\n DependencyResult,\n FfiDispatchMetrics,\n FfiDomainEvent,\n FfiDomainEventMetadata,\n FfiStepEvent,\n HandlerDefinition,\n LogFields,\n OrchestrationMetadata,\n RetryConfiguration,\n StepDefinition,\n StepExecutionError,\n StepExecutionMetadata,\n StepExecutionResult,\n StopResult,\n Task,\n WorkerStatus,\n WorkflowStep,\n} from './types.js';\n","/**\n * Runtime detection for TypeScript/JavaScript workers.\n *\n * Detects whether the code is running in Bun, Node.js, Deno, or an unknown runtime.\n */\n\n/**\n * Supported JavaScript/TypeScript runtimes\n */\nexport type RuntimeType = 'bun' | 'node' | 'deno' | 'unknown';\n\n/**\n * Runtime information including version details\n */\nexport interface RuntimeInfo {\n type: RuntimeType;\n version: string;\n platform: string;\n arch: string;\n}\n\n/**\n * Cached runtime type for performance\n */\nlet cachedRuntimeType: RuntimeType | null = null;\n\n/**\n * Detect the current JavaScript/TypeScript runtime.\n *\n * @returns The detected runtime type\n */\nexport function detectRuntime(): RuntimeType {\n if (cachedRuntimeType !== null) {\n return cachedRuntimeType;\n }\n\n // Check for Bun\n if (typeof globalThis !== 'undefined' && 'Bun' in globalThis) {\n cachedRuntimeType = 'bun';\n return 'bun';\n }\n\n // Check for Deno\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n cachedRuntimeType = 'deno';\n return 'deno';\n }\n\n // Check for Node.js\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n cachedRuntimeType = 'node';\n return 'node';\n }\n\n cachedRuntimeType = 'unknown';\n return 'unknown';\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return detectRuntime() === 'bun';\n}\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return detectRuntime() === 'node';\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return detectRuntime() === 'deno';\n}\n\n/**\n * Get detailed runtime information\n */\nexport function getRuntimeInfo(): RuntimeInfo {\n const type = detectRuntime();\n\n switch (type) {\n case 'bun': {\n // biome-ignore lint/suspicious/noExplicitAny: Bun global is runtime-specific\n const Bun = (globalThis as any).Bun;\n return {\n type: 'bun',\n version: Bun?.version ?? 'unknown',\n platform: process?.platform ?? 'unknown',\n arch: process?.arch ?? 'unknown',\n };\n }\n case 'deno': {\n // biome-ignore lint/suspicious/noExplicitAny: Deno global is runtime-specific\n const Deno = (globalThis as any).Deno;\n return {\n type: 'deno',\n version: Deno?.version?.deno ?? 'unknown',\n platform: Deno?.build?.os ?? 'unknown',\n arch: Deno?.build?.arch ?? 'unknown',\n };\n }\n case 'node':\n return {\n type: 'node',\n version: process.versions.node,\n platform: process.platform,\n arch: process.arch,\n };\n default:\n return {\n type: 'unknown',\n version: 'unknown',\n platform: 'unknown',\n arch: 'unknown',\n };\n }\n}\n\n/**\n * Get the library filename based on platform.\n *\n * @returns The platform-specific library filename\n */\nexport function getLibraryFilename(): string {\n const platform = process?.platform ?? 'unknown';\n\n switch (platform) {\n case 'darwin':\n return 'libtasker_ts.dylib';\n case 'linux':\n return 'libtasker_ts.so';\n case 'win32':\n return 'tasker_ts.dll';\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\n/**\n * Get the path to the native library.\n *\n * REQUIRES: TASKER_FFI_LIBRARY_PATH environment variable to be set,\n * OR an explicit basePath parameter must be provided.\n *\n * This explicit requirement prevents confusion from automatic debug/release\n * library discovery and ensures intentional configuration at build/runtime.\n *\n * @param basePath Optional explicit base path to the library directory\n * @returns Path to the native library\n * @throws Error if TASKER_FFI_LIBRARY_PATH is not set and no basePath provided\n */\nexport function getLibraryPath(basePath?: string): string {\n // Check environment variable first\n const envPath = process.env.TASKER_FFI_LIBRARY_PATH;\n if (envPath) {\n return envPath;\n }\n\n // If explicit basePath provided, use it\n if (basePath) {\n return `${basePath}/${getLibraryFilename()}`;\n }\n\n throw new Error(\n 'FFI library path not configured. Set TASKER_FFI_LIBRARY_PATH environment variable.\\n' +\n 'Example: export TASKER_FFI_LIBRARY_PATH=/path/to/target/debug/libtasker_ts.dylib'\n );\n}\n","/**\n * FfiLayer - Owns FFI runtime loading and lifecycle.\n *\n * This class encapsulates the FFI runtime management:\n * - Runtime detection (Node.js, Bun, Deno)\n * - Library path discovery\n * - Runtime loading and unloading\n *\n * Both Node.js and Bun use koffi (Node-API) for stable FFI.\n *\n * Design principles:\n * - Explicit construction: No singleton pattern\n * - Clear ownership: Owns the runtime instance\n * - Explicit lifecycle: load() and unload() methods\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { detectRuntime, type RuntimeType } from './runtime.js';\nimport type { TaskerRuntime } from './runtime-interface.js';\n\n/**\n * Configuration for FfiLayer.\n */\nexport interface FfiLayerConfig {\n /** Override runtime detection */\n runtimeType?: RuntimeType;\n\n /** Custom library path (overrides discovery) */\n libraryPath?: string;\n}\n\n/**\n * Owns FFI runtime loading and lifecycle.\n *\n * Unlike RuntimeFactory, this class:\n * - Is NOT a singleton - created and passed explicitly\n * - Owns the runtime instance directly\n * - Has clear load/unload lifecycle\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const runtime = ffiLayer.getRuntime();\n * // ... use runtime ...\n * await ffiLayer.unload();\n * ```\n */\nexport class FfiLayer {\n private runtime: TaskerRuntime | null = null;\n private libraryPath: string | null = null;\n private readonly runtimeType: RuntimeType;\n private readonly configuredLibraryPath: string | undefined;\n\n /**\n * Create a new FfiLayer.\n *\n * @param config - Optional configuration for runtime type and library path\n */\n constructor(config: FfiLayerConfig = {}) {\n this.runtimeType = config.runtimeType ?? detectRuntime();\n this.configuredLibraryPath = config.libraryPath;\n }\n\n /**\n * Load the FFI library.\n *\n * Discovers and loads the native library for the current runtime.\n *\n * @param customPath - Optional override for library path (takes precedence over config)\n * @throws Error if library not found or failed to load\n */\n async load(customPath?: string): Promise<void> {\n if (this.runtime?.isLoaded) {\n return; // Already loaded\n }\n\n const path = customPath ?? this.configuredLibraryPath ?? this.discoverLibraryPath();\n\n if (!path) {\n throw new Error(\n 'FFI library not found. No bundled native library matches this platform, ' +\n 'and TASKER_FFI_LIBRARY_PATH is not set.\\n' +\n `Current platform: ${process.platform}-${process.arch}\\n` +\n 'Supported: linux-x64, linux-arm64, darwin-arm64\\n' +\n 'Override: export TASKER_FFI_LIBRARY_PATH=/path/to/libtasker_ts.dylib'\n );\n }\n\n this.runtime = await this.createRuntime();\n await this.runtime.load(path);\n this.libraryPath = path;\n }\n\n /**\n * Unload the FFI library and release resources.\n *\n * Safe to call even if not loaded.\n */\n async unload(): Promise<void> {\n if (this.runtime?.isLoaded) {\n this.runtime.unload();\n }\n this.runtime = null;\n this.libraryPath = null;\n }\n\n /**\n * Check if the FFI library is loaded.\n */\n isLoaded(): boolean {\n return this.runtime?.isLoaded ?? false;\n }\n\n /**\n * Get the loaded runtime.\n *\n * @throws Error if runtime is not loaded\n */\n getRuntime(): TaskerRuntime {\n if (!this.runtime?.isLoaded) {\n throw new Error('FFI not loaded. Call load() first.');\n }\n return this.runtime;\n }\n\n /**\n * Get the path to the loaded library.\n */\n getLibraryPath(): string | null {\n return this.libraryPath;\n }\n\n /**\n * Get the detected runtime type.\n */\n getRuntimeType(): RuntimeType {\n return this.runtimeType;\n }\n\n /**\n * Find the FFI library path.\n *\n * Static method for finding the library path without creating an instance.\n * Useful for test utilities and pre-flight checks.\n *\n * Resolution order:\n * 1. TASKER_FFI_LIBRARY_PATH environment variable (explicit override)\n * 2. Bundled native library in the package's native/ directory\n *\n * @param _callerDir Deprecated parameter, kept for API compatibility\n * @returns Path to the library if found and exists, null otherwise\n */\n static findLibraryPath(_callerDir?: string): string | null {\n // 1. Check explicit environment variable\n const envPath = process.env.TASKER_FFI_LIBRARY_PATH;\n\n if (envPath) {\n if (!existsSync(envPath)) {\n console.warn(`TASKER_FFI_LIBRARY_PATH is set to \"${envPath}\" but the file does not exist`);\n return null;\n }\n return envPath;\n }\n\n // 2. Try bundled native library\n const bundledPath = findBundledNativeLibrary();\n if (bundledPath && existsSync(bundledPath)) {\n return bundledPath;\n }\n\n return null;\n }\n\n /**\n * Discover the FFI library path.\n *\n * Instance method that delegates to the static findLibraryPath.\n */\n private discoverLibraryPath(): string | null {\n return FfiLayer.findLibraryPath();\n }\n\n /**\n * Create a runtime adapter for the configured runtime type.\n *\n * NOTE: We use koffi (NodeRuntime) for both Node.js and Bun.\n * koffi is stable and works with both runtimes via Node-API.\n * See: https://bun.sh/docs/runtime/node-api\n */\n private async createRuntime(): Promise<TaskerRuntime> {\n switch (this.runtimeType) {\n case 'bun':\n case 'node': {\n // Use koffi-based NodeRuntime for both Bun and Node.js\n // koffi is stable and Bun supports Node-API modules\n const { NodeRuntime } = await import('./node-runtime.js');\n return new NodeRuntime();\n }\n case 'deno': {\n const { DenoRuntime } = await import('./deno-runtime.js');\n return new DenoRuntime();\n }\n default:\n throw new Error(\n `Unsupported runtime: ${this.runtimeType}. Tasker TypeScript worker requires Bun, Node.js, or Deno.`\n );\n }\n }\n}\n\n/**\n * Bundled native library filenames by platform/arch.\n *\n * These libraries are placed in the package's native/ directory during the\n * release build. All supported platforms are bundled in every published package\n * so that npm install \"just works\" without per-platform optional dependencies.\n */\nconst BUNDLED_LIBRARIES: Record<string, string> = {\n 'linux-x64': 'libtasker_ts-linux-x64.so',\n 'linux-arm64': 'libtasker_ts-linux-arm64.so',\n 'darwin-arm64': 'libtasker_ts-darwin-arm64.dylib',\n};\n\n/**\n * Find the bundled native library for the current platform.\n *\n * Walks up from the current file to find the package root (which contains\n * the native/ directory). This works whether running from the unbundled\n * layout (dist/ffi/ffi-layer.js) or the bundled layout (dist/index.js).\n *\n * @returns Absolute path to the native library, or null if not found\n */\nfunction findBundledNativeLibrary(): string | null {\n const key = `${process.platform}-${process.arch}`;\n const filename = BUNDLED_LIBRARIES[key];\n if (!filename) {\n return null;\n }\n\n // Walk up from current file to find package root (contains native/).\n // Works whether running from dist/ffi/ffi-layer.js or dist/index.js.\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'native', filename);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n","/**\n * Standard error types for cross-language consistency.\n *\n * These values align with Ruby and Python worker implementations\n * and are used by the orchestration layer for retry decisions.\n *\n * @see TAS-92 Cross-Language API Alignment\n */\nexport enum ErrorType {\n /**\n * Permanent, non-recoverable failure.\n * Examples: invalid input, resource not found, authentication failure.\n */\n PERMANENT_ERROR = 'permanent_error',\n\n /**\n * Transient failure that may succeed on retry.\n * Examples: network timeout, service unavailable, rate limiting.\n */\n RETRYABLE_ERROR = 'retryable_error',\n\n /**\n * Input validation failure.\n * Examples: missing required field, invalid format, constraint violation.\n */\n VALIDATION_ERROR = 'validation_error',\n\n /**\n * Operation timed out.\n * Examples: HTTP request timeout, database query timeout.\n */\n TIMEOUT = 'timeout',\n\n /**\n * Failure within the step handler itself.\n * Examples: unhandled exception, handler misconfiguration.\n */\n HANDLER_ERROR = 'handler_error',\n}\n\n/**\n * Check if an error type is one of the standard values.\n *\n * @param errorType - The error type string to check\n * @returns True if the error type matches one of the standard values\n *\n * @example\n * isStandardErrorType('permanent_error'); // true\n * isStandardErrorType('custom_error'); // false\n */\nexport function isStandardErrorType(errorType: string): boolean {\n return Object.values(ErrorType).includes(errorType as ErrorType);\n}\n\n/**\n * Get the recommended retryable flag for a given error type.\n *\n * @param errorType - The error type string\n * @returns True if the error type is typically retryable\n *\n * @example\n * isTypicallyRetryable('timeout'); // true\n * isTypicallyRetryable('permanent_error'); // false\n */\nexport function isTypicallyRetryable(errorType: string): boolean {\n return [ErrorType.RETRYABLE_ERROR, ErrorType.TIMEOUT].includes(errorType as ErrorType);\n}\n","import { ErrorType } from './error-type';\n\n/**\n * Configuration for a batch worker instance.\n *\n * Used by batchable handlers to define the work partition for each worker.\n */\nexport interface BatchWorkerConfig {\n /** Unique identifier for this batch */\n batch_id: string;\n /** Starting cursor position (inclusive) */\n cursor_start: number;\n /** Ending cursor position (exclusive) */\n cursor_end: number;\n /** Number of rows/items in this batch */\n row_count: number;\n /** Index of this worker (0-based) */\n worker_index: number;\n /** Total number of workers processing this data */\n total_workers: number;\n /** Optional additional metadata for this batch */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result type alias for batchable handlers.\n *\n * Batchable handlers return this type which is a StepHandlerResult\n * with batch-specific metadata.\n */\nexport type BatchableResult = StepHandlerResult;\n\n/**\n * Parameters for constructing a StepHandlerResult.\n */\nexport interface StepHandlerResultParams {\n success: boolean;\n result?: Record<string, unknown> | null;\n errorMessage?: string | null;\n errorType?: string | null;\n errorCode?: string | null;\n retryable?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result from a step handler execution.\n *\n * Step handlers return this to indicate success or failure,\n * along with any output data or error details.\n *\n * Matches Python's StepHandlerResult and Ruby's StepHandlerCallResult.\n *\n * @example Success case\n * ```typescript\n * return StepHandlerResult.success({ processed: 100 });\n * ```\n *\n * @example Failure case\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Validation failed',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n *\n * @example Failure with error code\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Payment gateway timeout',\n * ErrorType.TIMEOUT,\n * true,\n * { gateway: 'stripe' },\n * 'GATEWAY_TIMEOUT'\n * );\n * ```\n */\nexport class StepHandlerResult {\n /** Whether the handler executed successfully */\n public readonly success: boolean;\n\n /** Handler output data (success case) */\n public readonly result: Record<string, unknown> | null;\n\n /** Error message (failure case) */\n public readonly errorMessage: string | null;\n\n /** Error type/category for classification */\n public readonly errorType: string | null;\n\n /** Optional application-specific error code */\n public readonly errorCode: string | null;\n\n /** Whether the error is retryable */\n public readonly retryable: boolean;\n\n /** Additional execution metadata */\n public readonly metadata: Record<string, unknown>;\n\n constructor(params: StepHandlerResultParams) {\n this.success = params.success;\n this.result = params.result ?? null;\n this.errorMessage = params.errorMessage ?? null;\n this.errorType = params.errorType ?? null;\n this.errorCode = params.errorCode ?? null;\n this.retryable = params.retryable ?? true;\n this.metadata = params.metadata ?? {};\n }\n\n /**\n * Create a successful handler result.\n *\n * This is the primary factory method for creating success results.\n * Aligned with Ruby and Python worker APIs.\n *\n * @param result - The handler output data\n * @param metadata - Optional additional metadata\n * @returns A StepHandlerResult indicating success\n *\n * @example\n * ```typescript\n * return StepHandlerResult.success(\n * { processed: 100, skipped: 5 }\n * );\n * ```\n */\n static success(\n result: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return new StepHandlerResult({\n success: true,\n result,\n metadata: metadata ?? {},\n });\n }\n\n /**\n * Create a failure handler result.\n *\n * @param message - Human-readable error message\n * @param errorType - Error type/category for classification. Use ErrorType enum.\n * @param retryable - Whether the error is retryable (default: true)\n * @param metadata - Optional additional metadata\n * @param errorCode - Optional application-specific error code\n * @returns A StepHandlerResult indicating failure\n *\n * @example\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Invalid input format',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n *\n * @example With error code\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Gateway timeout',\n * ErrorType.TIMEOUT,\n * true,\n * { duration_ms: 30000 },\n * 'GATEWAY_TIMEOUT'\n * );\n * ```\n */\n static failure(\n message: string,\n errorType: ErrorType | string = ErrorType.HANDLER_ERROR,\n retryable = true,\n metadata?: Record<string, unknown>,\n errorCode?: string\n ): StepHandlerResult {\n return new StepHandlerResult({\n success: false,\n errorMessage: message,\n // ErrorType enum values are already strings, so this works directly\n errorType: errorType as string,\n errorCode: errorCode ?? null,\n retryable,\n metadata: metadata ?? {},\n });\n }\n\n /**\n * Check if this result indicates success.\n */\n isSuccess(): boolean {\n return this.success;\n }\n\n /**\n * Check if this result indicates failure.\n */\n isFailure(): boolean {\n return !this.success;\n }\n\n /**\n * Convert to JSON for serialization.\n *\n * Uses snake_case keys to match the Rust FFI contract.\n */\n toJSON(): Record<string, unknown> {\n return {\n success: this.success,\n result: this.result,\n error_message: this.errorMessage,\n error_type: this.errorType,\n error_code: this.errorCode,\n retryable: this.retryable,\n metadata: this.metadata,\n };\n }\n}\n","import { ErrorType } from '../types/error-type';\nimport type { StepContext } from '../types/step-context';\nimport { StepHandlerResult } from '../types/step-handler-result';\n\n/**\n * Public interface for executable handlers (TAS-93).\n *\n * This interface defines the contract that all handlers must fulfill\n * to be executed by the resolver chain. Both StepHandler and\n * MethodDispatchWrapper implement this interface.\n *\n * Use this type when you need to accept either a handler or a wrapped handler.\n */\nexport interface ExecutableHandler {\n /** Unique identifier for this handler */\n readonly name: string;\n\n /** Version string for the handler */\n readonly version: string;\n\n /** List of capability strings the handler supports */\n readonly capabilities: string[];\n\n /**\n * Execute the step handler logic.\n *\n * @param context - Execution context with input data and configuration\n * @returns Promise resolving to handler result\n */\n call(context: StepContext): Promise<StepHandlerResult>;\n\n /**\n * Return JSON schema for handler configuration.\n *\n * @returns JSON schema object, or null if no schema is defined\n */\n configSchema(): Record<string, unknown> | null;\n}\n\n/**\n * Interface for step handler class metadata.\n *\n * Handler classes must implement these static properties.\n */\nexport interface StepHandlerClass {\n /** Unique identifier for this handler. Must match step definition. */\n handlerName: string;\n\n /** Version string for the handler (default: \"1.0.0\") */\n handlerVersion?: string;\n\n /** Constructor that creates a handler instance */\n new (): StepHandler;\n}\n\n/**\n * Abstract base class for step handlers.\n *\n * All step handlers must extend this class and implement\n * the `call` method. The handlerName static property must be set\n * to a unique identifier for the handler.\n *\n * TAS-131: TypeScript handlers are async by default. The `call` method\n * returns a Promise, enabling use of async/await for I/O operations\n * like HTTP requests, database queries, and file operations.\n *\n * Matches Python's StepHandler and Ruby's StepHandler base classes.\n *\n * @example\n * ```typescript\n * class ProcessOrderHandler extends StepHandler {\n * static handlerName = 'process_order';\n * static handlerVersion = '1.0.0';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderId = context.getInput<string>('order_id');\n * // Can use async operations like fetch, database queries, etc.\n * const data = await fetchOrderDetails(orderId);\n * return this.success({ order_id: orderId, status: 'processed', data });\n * }\n * }\n * ```\n */\nexport abstract class StepHandler {\n /**\n * Unique identifier for this handler.\n * Must be set by subclasses and match the step definition.\n */\n static handlerName: string;\n\n /**\n * Version string for the handler.\n * Default: \"1.0.0\"\n */\n static handlerVersion = '1.0.0';\n\n /**\n * Execute the step handler logic.\n *\n * This method is called by the execution subscriber when a step\n * event is received that matches this handler's name.\n *\n * @param context - Execution context with input data, dependency results,\n * and configuration\n * @returns Promise resolving to StepHandlerResult indicating success or failure\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * try {\n * const result = await processData(context.inputData);\n * return this.success(result);\n * } catch (error) {\n * return this.failure(\n * error.message,\n * ErrorType.HANDLER_ERROR,\n * true\n * );\n * }\n * }\n * ```\n */\n abstract call(context: StepContext): Promise<StepHandlerResult>;\n\n /**\n * Get the handler name.\n *\n * @returns The handlerName static property, or the class name if not set\n */\n get name(): string {\n const ctor = this.constructor as typeof StepHandler;\n return ctor.handlerName || ctor.name;\n }\n\n /**\n * Get the handler version.\n *\n * @returns The handlerVersion static property\n */\n get version(): string {\n const ctor = this.constructor as typeof StepHandler;\n return ctor.handlerVersion;\n }\n\n /**\n * Return handler capabilities.\n *\n * Override this to advertise specific capabilities for handler selection.\n *\n * @returns List of capability strings (default: [\"process\"])\n */\n get capabilities(): string[] {\n return ['process'];\n }\n\n /**\n * Return JSON schema for handler configuration.\n *\n * Override this to provide a schema for validating step_config.\n *\n * @returns JSON schema object, or null if no schema is defined\n */\n configSchema(): Record<string, unknown> | null {\n return null;\n }\n\n /**\n * Create a success result.\n *\n * Convenience method for creating success results.\n *\n * @param result - Result data object\n * @param metadata - Optional metadata object\n * @returns StepHandlerResult with success=true\n *\n * @example\n * ```typescript\n * return this.success({ processed: 100 });\n * ```\n */\n protected success(\n result: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a failure result.\n *\n * Convenience method for creating failure results.\n *\n * @param message - Error message\n * @param errorType - Error type classification. Use ErrorType enum for consistency.\n * @param retryable - Whether the error is retryable (default: true)\n * @param metadata - Optional metadata object\n * @param errorCode - Optional application-specific error code\n * @returns StepHandlerResult with success=false\n *\n * @example\n * ```typescript\n * return this.failure(\n * 'Invalid input',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n */\n protected failure(\n message: string,\n errorType: ErrorType | string = ErrorType.HANDLER_ERROR,\n retryable = true,\n metadata?: Record<string, unknown>,\n errorCode?: string\n ): StepHandlerResult {\n return StepHandlerResult.failure(message, errorType, retryable, metadata, errorCode);\n }\n\n /**\n * Get a string representation of the handler.\n */\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, version=${this.version})`;\n }\n}\n","/**\n * API mixin for HTTP functionality.\n *\n * TAS-112: Composition Pattern - API Mixin\n *\n * This module provides the APIMixin class for step handlers that need HTTP\n * functionality. Use via interface implementation with method binding.\n *\n * @example\n * ```typescript\n * class FetchUserHandler extends StepHandler implements APICapable {\n * static handlerName = 'fetch_user';\n * static baseUrl = 'https://api.example.com';\n *\n * // Bind APIMixin methods\n * get = APIMixin.prototype.get.bind(this);\n * apiSuccess = APIMixin.prototype.apiSuccess.bind(this);\n * apiFailure = APIMixin.prototype.apiFailure.bind(this);\n * // ... other required methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const response = await this.get('/users');\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n *\n * @module handler/mixins/api\n */\n\nimport { ErrorType } from '../../types/error-type.js';\nimport { StepHandlerResult } from '../../types/step-handler-result.js';\n\n/**\n * HTTP status codes that indicate client errors (4xx).\n */\nconst CLIENT_ERROR_MIN = 400;\nconst CLIENT_ERROR_MAX = 499;\n\n/**\n * HTTP status codes that indicate server errors (5xx).\n */\nconst SERVER_ERROR_MIN = 500;\nconst SERVER_ERROR_MAX = 599;\n\n/**\n * Status codes that indicate temporary failures (should retry).\n */\nconst RETRYABLE_STATUS_CODES = new Set([\n 408, // Request Timeout\n 429, // Too Many Requests (rate limit)\n 500, // Internal Server Error\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504, // Gateway Timeout\n]);\n\n/**\n * Standard HTTP status code messages.\n */\nconst STATUS_MESSAGES: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n};\n\n/**\n * Response wrapper for API calls.\n *\n * Provides convenient access to response data and error classification.\n */\nexport class ApiResponse {\n public readonly statusCode: number;\n public readonly headers: Record<string, string>;\n public readonly body: unknown;\n public readonly rawResponse: Response;\n\n constructor(response: Response, body?: unknown) {\n this.statusCode = response.status;\n this.headers = Object.fromEntries(response.headers.entries());\n this.rawResponse = response;\n this.body = body;\n }\n\n /**\n * Check if the response indicates success (2xx status).\n */\n get ok(): boolean {\n return this.statusCode >= 200 && this.statusCode < 300;\n }\n\n /**\n * Check if the response indicates a client error (4xx status).\n */\n get isClientError(): boolean {\n return this.statusCode >= CLIENT_ERROR_MIN && this.statusCode <= CLIENT_ERROR_MAX;\n }\n\n /**\n * Check if the response indicates a server error (5xx status).\n */\n get isServerError(): boolean {\n return this.statusCode >= SERVER_ERROR_MIN && this.statusCode <= SERVER_ERROR_MAX;\n }\n\n /**\n * Check if the error should be retried.\n */\n get isRetryable(): boolean {\n return RETRYABLE_STATUS_CODES.has(this.statusCode);\n }\n\n /**\n * Get the Retry-After header value in seconds, if present.\n */\n get retryAfter(): number | null {\n const retryAfter = this.headers['retry-after'];\n if (!retryAfter) {\n return null;\n }\n const parsed = Number.parseInt(retryAfter, 10);\n return Number.isNaN(parsed) ? 60 : parsed;\n }\n\n /**\n * Convert the response to a dictionary for result output.\n */\n toDict(): Record<string, unknown> {\n return {\n status_code: this.statusCode,\n headers: this.headers,\n body: this.body,\n };\n }\n}\n\n/**\n * Interface for API-capable handlers.\n *\n * Implement this interface and bind APIMixin methods to get HTTP functionality.\n */\nexport interface APICapable {\n /** Base URL for API calls */\n baseUrl: string;\n /** Default request timeout in milliseconds */\n timeout: number;\n /** Default headers to include in all requests */\n defaultHeaders: Record<string, string>;\n\n // HTTP methods\n get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse>;\n\n post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n delete(path: string, headers?: Record<string, string>): Promise<ApiResponse>;\n\n request(method: string, path: string, options?: RequestInit): Promise<ApiResponse>;\n\n // Result helpers\n apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse?: boolean\n ): StepHandlerResult;\n\n apiFailure(response: ApiResponse, message?: string): StepHandlerResult;\n\n connectionError(error: Error, context?: string): StepHandlerResult;\n\n timeoutError(error: Error, context?: string): StepHandlerResult;\n}\n\n/**\n * Implementation of API methods.\n *\n * TAS-112: Use via interface implementation with method binding.\n *\n * Provides HTTP client functionality with automatic error classification,\n * retry handling, and convenient methods for common HTTP operations.\n */\nexport class APIMixin implements APICapable {\n // These should be defined on the handler class as static properties\n static baseUrl = '';\n static defaultTimeout = 30000;\n static defaultHeaders: Record<string, string> = {};\n\n get baseUrl(): string {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.baseUrl;\n }\n\n get timeout(): number {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.defaultTimeout;\n }\n\n get defaultHeaders(): Record<string, string> {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.defaultHeaders;\n }\n\n // =========================================================================\n // HTTP Methods\n // =========================================================================\n\n /**\n * Make a GET request.\n */\n async get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path, params);\n return this.fetch(url, {\n method: 'GET',\n headers: this.mergeHeaders(headers),\n });\n }\n\n /**\n * Make a POST request.\n */\n async post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'POST',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a PUT request.\n */\n async put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'PUT',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a PATCH request.\n */\n async patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'PATCH',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a DELETE request.\n */\n async delete(path: string, headers?: Record<string, string>): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n return this.fetch(url, {\n method: 'DELETE',\n headers: this.mergeHeaders(headers),\n });\n }\n\n /**\n * Make an arbitrary HTTP request.\n */\n async request(method: string, path: string, options?: RequestInit): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n return this.fetch(url, {\n ...options,\n method,\n headers: this.mergeHeaders(options?.headers as Record<string, string>),\n });\n }\n\n // =========================================================================\n // Result Helpers\n // =========================================================================\n\n /**\n * Create a success result from an API response.\n */\n apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse = true\n ): StepHandlerResult {\n const resultData =\n result ||\n (typeof response.body === 'object' && response.body !== null\n ? (response.body as Record<string, unknown>)\n : { data: response.body });\n\n const metadata: Record<string, unknown> = {};\n if (includeResponse) {\n metadata.status_code = response.statusCode;\n metadata.headers = response.headers;\n }\n\n return StepHandlerResult.success(resultData, metadata);\n }\n\n /**\n * Create a failure result from an API response.\n */\n apiFailure(response: ApiResponse, message?: string): StepHandlerResult {\n const errorType = this.classifyError(response);\n const errorMessage = message || this.formatErrorMessage(response);\n const retryable = response.isRetryable;\n\n const metadata: Record<string, unknown> = {\n status_code: response.statusCode,\n headers: response.headers,\n };\n\n if (response.retryAfter !== null) {\n metadata.retry_after_seconds = response.retryAfter;\n }\n\n if (response.body) {\n metadata.response_body = response.body;\n }\n\n return StepHandlerResult.failure(errorMessage, errorType, retryable, metadata);\n }\n\n /**\n * Create a failure result from a connection error.\n */\n connectionError(error: Error, context?: string): StepHandlerResult {\n let message = `Connection error: ${error.message}`;\n if (context) {\n message = `Connection error while ${context}: ${error.message}`;\n }\n\n return StepHandlerResult.failure(message, 'connection_error', true, {\n exception_type: error.constructor.name,\n });\n }\n\n /**\n * Create a failure result from a timeout error.\n */\n timeoutError(error: Error, context?: string): StepHandlerResult {\n let message = `Request timeout: ${error.message}`;\n if (context) {\n message = `Request timeout while ${context}: ${error.message}`;\n }\n\n return StepHandlerResult.failure(message, ErrorType.TIMEOUT, true, {\n exception_type: error.constructor.name,\n });\n }\n\n // =========================================================================\n // Internal Helpers\n // =========================================================================\n\n private async fetch(url: string, options: RequestInit): Promise<ApiResponse> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n // Parse body based on content-type\n const contentType = response.headers.get('content-type') || '';\n let body: unknown;\n\n if (contentType.includes('application/json')) {\n try {\n body = await response.json();\n } catch {\n body = await response.text();\n }\n } else {\n body = await response.text();\n }\n\n return new ApiResponse(response, body);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n let url = this.baseUrl + path;\n\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== null && value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const queryString = searchParams.toString();\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n return url;\n }\n\n private mergeHeaders(\n additional?: Record<string, string>,\n isJson = false\n ): Record<string, string> {\n const headers = { ...this.defaultHeaders };\n\n if (isJson && !headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (additional) {\n Object.assign(headers, additional);\n }\n\n return headers;\n }\n\n private prepareBody(body: unknown, asJson: boolean): string | undefined {\n if (!body) {\n return undefined;\n }\n return asJson ? JSON.stringify(body) : String(body);\n }\n\n private classifyError(response: ApiResponse): string {\n const statusCode = response.statusCode;\n\n const errorTypeMap: Record<number, string> = {\n 400: 'bad_request',\n 401: 'unauthorized',\n 403: 'forbidden',\n 404: 'not_found',\n 405: 'method_not_allowed',\n 408: 'request_timeout',\n 409: 'conflict',\n 410: 'gone',\n 422: 'unprocessable_entity',\n 429: 'rate_limited',\n 500: 'internal_server_error',\n 502: 'bad_gateway',\n 503: 'service_unavailable',\n 504: 'gateway_timeout',\n };\n\n const mapped = errorTypeMap[statusCode];\n if (mapped !== undefined) {\n return mapped;\n }\n\n if (response.isClientError) {\n return 'client_error';\n }\n\n if (response.isServerError) {\n return 'server_error';\n }\n\n return 'http_error';\n }\n\n private formatErrorMessage(response: ApiResponse): string {\n const statusCode = response.statusCode;\n\n // Try to extract error message from response body\n const bodyMessage = this.extractBodyErrorMessage(response.body);\n if (bodyMessage) {\n return `HTTP ${statusCode}: ${bodyMessage}`;\n }\n\n // Generic message based on status code\n return `HTTP ${statusCode}: ${STATUS_MESSAGES[statusCode] || 'HTTP Error'}`;\n }\n\n private extractBodyErrorMessage(body: unknown): string | null {\n if (typeof body !== 'object' || body === null) {\n return null;\n }\n\n const bodyObj = body as Record<string, unknown>;\n const errorKeys = ['error', 'message', 'detail', 'error_message', 'msg'];\n\n for (const key of errorKeys) {\n if (!(key in bodyObj)) continue;\n\n const errorDetail = bodyObj[key];\n if (typeof errorDetail === 'string') {\n return errorDetail;\n }\n if (typeof errorDetail === 'object' && errorDetail !== null && 'message' in errorDetail) {\n return String((errorDetail as Record<string, unknown>).message);\n }\n }\n\n return null;\n }\n}\n\n/**\n * Helper function to apply API methods to a handler instance.\n *\n * @example\n * ```typescript\n * class MyApiHandler extends StepHandler {\n * constructor() {\n * super();\n * applyAPI(this);\n * }\n * }\n * ```\n */\nexport function applyAPI<T extends object>(target: T): T & APICapable {\n const mixin = new APIMixin();\n\n // Bind all API methods\n Object.defineProperty(target, 'baseUrl', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.baseUrl || '';\n },\n });\n Object.defineProperty(target, 'timeout', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.defaultTimeout || 30000;\n },\n });\n Object.defineProperty(target, 'defaultHeaders', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.defaultHeaders || {};\n },\n });\n\n (target as T & APICapable).get = mixin.get.bind(target);\n (target as T & APICapable).post = mixin.post.bind(target);\n (target as T & APICapable).put = mixin.put.bind(target);\n (target as T & APICapable).patch = mixin.patch.bind(target);\n (target as T & APICapable).delete = mixin.delete.bind(target);\n (target as T & APICapable).request = mixin.request.bind(target);\n (target as T & APICapable).apiSuccess = mixin.apiSuccess.bind(target);\n (target as T & APICapable).apiFailure = mixin.apiFailure.bind(target);\n (target as T & APICapable).connectionError = mixin.connectionError.bind(target);\n (target as T & APICapable).timeoutError = mixin.timeoutError.bind(target);\n\n return target as T & APICapable;\n}\n","/**\n * API handler for HTTP interactions.\n *\n * TAS-112: Composition Pattern (DEPRECATED CLASS)\n *\n * This module provides the ApiHandler class for backward compatibility.\n * For new code, use the mixin pattern:\n *\n * @example Using APIMixin\n * ```typescript\n * import { StepHandler } from './base';\n * import { APIMixin, APICapable, applyAPI } from './mixins/api';\n *\n * class FetchUserHandler extends StepHandler implements APICapable {\n * static handlerName = 'fetch_user';\n * static baseUrl = 'https://api.example.com';\n *\n * constructor() {\n * super();\n * applyAPI(this);\n * }\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const response = await this.get('/users');\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n *\n * @module handler/api\n */\n\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\nimport { APIMixin, type ApiResponse } from './mixins/api.js';\n\n// Re-export ApiResponse for convenience\nexport { ApiResponse } from './mixins/api.js';\n\n/**\n * Base class for HTTP API step handlers.\n *\n * TAS-112: This class is provided for backward compatibility.\n * For new code, prefer using APIMixin directly with applyAPI().\n *\n * Provides HTTP client functionality with automatic error classification,\n * retry handling, and convenient methods for common HTTP operations.\n *\n * Uses native fetch API (available in Bun and Node.js 18+).\n *\n * @example\n * ```typescript\n * class PaymentApiHandler extends ApiHandler {\n * static handlerName = 'process_payment';\n * static baseUrl = 'https://payments.example.com/api/v1';\n * static defaultHeaders = { 'X-API-Key': 'secret' };\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const paymentData = context.inputData['payment'];\n * const response = await this.post('/payments', { body: paymentData });\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n */\nexport abstract class ApiHandler extends StepHandler {\n /** Base URL for API calls. Override in subclasses. */\n static baseUrl = '';\n\n /** Default request timeout in milliseconds. */\n static defaultTimeout = 30000;\n\n /** Default headers to include in all requests. */\n static defaultHeaders: Record<string, string> = {};\n\n // APIMixin instance configured with this handler's settings\n private _apiMixin: APIMixin | null = null;\n\n private getApiMixin(): APIMixin {\n if (!this._apiMixin) {\n // IMPORTANT: Variable capture is required here - DO NOT refactor to use `this.baseUrl` directly.\n // Static class initializers cannot reference outer instance properties via `this`.\n // In a static initializer context, `this` refers to the class being defined (ConfiguredMixin),\n // not the outer ApiHandler instance. These local variables capture the instance values\n // at runtime so they can be used in the static property initializers below.\n const handlerBaseUrl = this.baseUrl;\n const handlerTimeout = this.timeout;\n const handlerHeaders = this.defaultHeaders;\n\n const ConfiguredMixin = class extends APIMixin {\n static override baseUrl = handlerBaseUrl;\n static override defaultTimeout = handlerTimeout;\n static override defaultHeaders = handlerHeaders;\n };\n this._apiMixin = new ConfiguredMixin();\n }\n return this._apiMixin;\n }\n\n get capabilities(): string[] {\n return ['process', 'http', 'api'];\n }\n\n /**\n * Get the base URL for this handler.\n */\n get baseUrl(): string {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.baseUrl;\n }\n\n /**\n * Get the default timeout for this handler.\n */\n get timeout(): number {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.defaultTimeout;\n }\n\n /**\n * Get the default headers for this handler.\n */\n get defaultHeaders(): Record<string, string> {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.defaultHeaders;\n }\n\n // =========================================================================\n // HTTP Methods - Delegate to mixin\n // =========================================================================\n\n protected get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse> {\n return this.getApiMixin().get(path, params, headers);\n }\n\n protected post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().post(path, options);\n }\n\n protected put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().put(path, options);\n }\n\n protected patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().patch(path, options);\n }\n\n protected delete(path: string, headers?: Record<string, string>): Promise<ApiResponse> {\n return this.getApiMixin().delete(path, headers);\n }\n\n protected request(method: string, path: string, options?: RequestInit): Promise<ApiResponse> {\n return this.getApiMixin().request(method, path, options);\n }\n\n // =========================================================================\n // Result Helpers - Delegate to mixin\n // =========================================================================\n\n protected apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse = true\n ): StepHandlerResult {\n return this.getApiMixin().apiSuccess(response, result, includeResponse);\n }\n\n protected apiFailure(response: ApiResponse, message?: string): StepHandlerResult {\n return this.getApiMixin().apiFailure(response, message);\n }\n\n protected connectionError(error: Error, context?: string): StepHandlerResult {\n return this.getApiMixin().connectionError(error, context);\n }\n\n protected timeoutError(error: Error, context?: string): StepHandlerResult {\n return this.getApiMixin().timeoutError(error, context);\n }\n}\n","/**\n * Batch processing types for cursor-based batch operations.\n *\n * These types support the analyzer/worker pattern for processing\n * large datasets in parallel batches.\n *\n * Matches Python's batch processing types and Ruby's batch types (TAS-92 aligned).\n *\n * ## FFI Boundary Types (TAS-112/TAS-123)\n *\n * This module includes types that cross the Rust ↔ TypeScript FFI boundary:\n *\n * - `RustCursorConfig` - Cursor configuration with flexible cursor types\n * - `BatchProcessingOutcome` - Discriminated union for batch processing decisions\n * - `RustBatchWorkerInputs` - Worker initialization inputs from Rust orchestration\n * - `BatchMetadata` - Batch processing metadata from template configuration\n *\n * These types are serialized by Rust and deserialized by TypeScript workers.\n * They must remain compatible with Rust's serde serialization format.\n *\n * @module types/batch\n */\n\n/**\n * Configuration for cursor-based batch processing.\n *\n * Defines a range of items to process in a batch worker step.\n */\nexport interface CursorConfig {\n /** Starting cursor position (inclusive) */\n startCursor: number;\n /** Ending cursor position (exclusive) */\n endCursor: number;\n /** Step size for iteration (usually 1) */\n stepSize: number;\n /** Additional metadata for this cursor range */\n metadata: Record<string, unknown>;\n}\n\n/**\n * Outcome from a batch analyzer handler.\n *\n * Batch analyzers return this to define the cursor ranges that will\n * spawn parallel batch worker steps.\n */\nexport interface BatchAnalyzerOutcome {\n /** List of cursor configurations for batch workers */\n cursorConfigs: CursorConfig[];\n /** Total number of items to process (for progress tracking) */\n totalItems: number | null;\n /** Metadata to pass to all batch workers */\n batchMetadata: Record<string, unknown>;\n}\n\n/**\n * Context for a batch worker step.\n *\n * Provides information about the specific batch this worker should process,\n * including checkpoint data from previous yields (TAS-125).\n */\nexport interface BatchWorkerContext {\n /** Unique identifier for this batch */\n batchId: string;\n /** Cursor configuration for this batch */\n cursorConfig: CursorConfig;\n /** Index of this batch (0-based) */\n batchIndex: number;\n /** Total number of batches */\n totalBatches: number;\n /** Metadata from the analyzer */\n batchMetadata: Record<string, unknown>;\n /** TAS-125: Checkpoint data from previous yields */\n checkpoint: Record<string, unknown>;\n /** Convenience accessor for start cursor */\n readonly startCursor: number;\n /** Convenience accessor for end cursor */\n readonly endCursor: number;\n /** Convenience accessor for step size */\n readonly stepSize: number;\n // TAS-125: Checkpoint accessor properties\n /** TAS-125: Get checkpoint cursor from previous yield */\n readonly checkpointCursor: number | string | Record<string, unknown> | undefined;\n /** TAS-125: Get accumulated results from previous checkpoint yield */\n readonly accumulatedResults: Record<string, unknown> | undefined;\n /** TAS-125: Get items processed count from checkpoint */\n readonly checkpointItemsProcessed: number;\n /** TAS-125: Check if checkpoint exists */\n hasCheckpoint(): boolean;\n}\n\n/**\n * Outcome from a batch worker step.\n *\n * Batch workers return this to report progress and results.\n */\nexport interface BatchWorkerOutcome {\n /** Total items processed in this batch */\n itemsProcessed: number;\n /** Items that succeeded */\n itemsSucceeded: number;\n /** Items that failed */\n itemsFailed: number;\n /** Items that were skipped */\n itemsSkipped: number;\n /** Individual item results */\n results: Array<Record<string, unknown>>;\n /** Individual item errors */\n errors: Array<Record<string, unknown>>;\n /** Last cursor position processed */\n lastCursor: number | null;\n /** Additional batch metadata */\n batchMetadata: Record<string, unknown>;\n}\n\n/**\n * Create a BatchWorkerContext from raw batch data.\n *\n * Handles both formats:\n * - Nested: { batch_id, cursor_config: { start_cursor, end_cursor, ... } }\n * - Flat: { batch_id, start_cursor, end_cursor, ... }\n *\n * TAS-125: Also extracts checkpoint data if present.\n *\n * @internal\n */\nexport function createBatchWorkerContext(\n batchData: Record<string, unknown>,\n checkpoint?: Record<string, unknown>\n): BatchWorkerContext {\n // Handle both nested cursor_config and flat format\n const cursorData = (batchData.cursor_config as Record<string, unknown>) || batchData;\n const cursorConfig: CursorConfig = {\n startCursor: (cursorData.start_cursor as number) ?? 0,\n endCursor: (cursorData.end_cursor as number) ?? 0,\n stepSize: (cursorData.step_size as number) ?? 1,\n metadata: (cursorData.metadata as Record<string, unknown>) ?? {},\n };\n\n // TAS-125: Extract checkpoint data\n const checkpointData = checkpoint ?? {};\n\n return {\n batchId: (batchData.batch_id as string) ?? '',\n cursorConfig,\n batchIndex: (batchData.batch_index as number) ?? 0,\n totalBatches: (batchData.total_batches as number) ?? 1,\n batchMetadata: (batchData.batch_metadata as Record<string, unknown>) ?? {},\n checkpoint: checkpointData,\n get startCursor() {\n return this.cursorConfig.startCursor;\n },\n get endCursor() {\n return this.cursorConfig.endCursor;\n },\n get stepSize() {\n return this.cursorConfig.stepSize;\n },\n // TAS-125: Checkpoint accessor properties\n get checkpointCursor() {\n return this.checkpoint?.cursor as number | string | Record<string, unknown> | undefined;\n },\n get accumulatedResults() {\n return this.checkpoint?.accumulated_results as Record<string, unknown> | undefined;\n },\n get checkpointItemsProcessed() {\n return (this.checkpoint?.items_processed as number) ?? 0;\n },\n hasCheckpoint() {\n return Boolean(this.checkpoint && this.checkpoint.cursor !== undefined);\n },\n };\n}\n\n// =============================================================================\n// FFI Boundary Types (TAS-112/TAS-123)\n//\n// These types match Rust structures that cross the FFI boundary.\n// They are serialized by Rust and deserialized by TypeScript workers.\n// =============================================================================\n\n/**\n * Cursor configuration for a single batch's position and range.\n *\n * Matches Rust's `CursorConfig` in `tasker-shared/src/messaging/execution_types.rs`.\n *\n * ## Flexible Cursor Types\n *\n * Unlike the simpler `CursorConfig` interface (which uses `number`),\n * this type supports flexible cursor values that can be:\n * - Integer for record IDs: `123`\n * - String for timestamps: `\"2025-11-01T00:00:00Z\"`\n * - Object for composite keys: `{\"page\": 1, \"offset\": 0}`\n *\n * This enables cursor-based pagination across diverse data sources.\n *\n * @example\n * ```typescript\n * // Integer cursors (most common)\n * const intCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: 0,\n * end_cursor: 1000,\n * batch_size: 1000,\n * };\n *\n * // Timestamp cursors\n * const timestampCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: \"2025-01-01T00:00:00Z\",\n * end_cursor: \"2025-01-02T00:00:00Z\",\n * batch_size: 86400, // seconds in a day\n * };\n *\n * // Composite cursors\n * const compositeCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: { page: 1, offset: 0 },\n * end_cursor: { page: 10, offset: 0 },\n * batch_size: 1000,\n * };\n * ```\n */\nexport interface RustCursorConfig {\n /** Batch identifier (e.g., \"batch_001\", \"batch_002\") */\n batch_id: string;\n\n /**\n * Starting position for this batch (inclusive).\n *\n * Type depends on cursor strategy:\n * - `number` for record IDs\n * - `string` for timestamps or UUIDs\n * - `object` for composite keys\n */\n start_cursor: unknown;\n\n /**\n * Ending position for this batch (exclusive).\n *\n * Workers process items from `start_cursor` (inclusive)\n * up to but not including `end_cursor`.\n */\n end_cursor: unknown;\n\n /** Number of items in this batch (for progress reporting) */\n batch_size: number;\n}\n\n/**\n * Failure strategy for batch processing.\n *\n * Matches Rust's `FailureStrategy` enum in `task_template.rs`.\n */\nexport type FailureStrategy = 'continue_on_failure' | 'fail_fast' | 'isolate';\n\n/**\n * Batch processing metadata from template configuration.\n *\n * Matches Rust's `BatchMetadata` in `tasker-shared/src/models/core/batch_worker.rs`.\n *\n * This structure extracts relevant template configuration that workers\n * need during execution. Workers don't need parallelism settings or\n * batch size calculation logic - just execution parameters.\n */\nexport interface BatchMetadata {\n // TAS-125: checkpoint_interval removed - handlers decide when to checkpoint\n\n /**\n * Database field name used for cursor-based pagination.\n *\n * Workers use this to construct queries like:\n * `WHERE cursor_field > start_cursor AND cursor_field <= end_cursor`\n *\n * Common values: \"id\", \"created_at\", \"sequence_number\"\n */\n cursor_field: string;\n\n /**\n * How this worker should handle failures during batch processing.\n *\n * - `continue_on_failure`: Log errors, continue processing remaining items\n * - `fail_fast`: Stop immediately on first error\n * - `isolate`: Mark batch for manual investigation\n */\n failure_strategy: FailureStrategy;\n}\n\n/**\n * Initialization inputs for batch worker instances.\n *\n * Matches Rust's `BatchWorkerInputs` in `tasker-shared/src/models/core/batch_worker.rs`.\n *\n * This structure is serialized to JSONB by Rust orchestration and stored\n * in `workflow_steps.inputs` for dynamically created batch workers.\n *\n * @example\n * ```typescript\n * // In a batch worker handler\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const inputs = context.stepInputs as RustBatchWorkerInputs;\n *\n * // Check for no-op placeholder first\n * if (inputs.is_no_op) {\n * return this.success({\n * batch_id: inputs.cursor.batch_id,\n * no_op: true,\n * message: 'No batches to process',\n * });\n * }\n *\n * // Process the batch using cursor bounds\n * const { start_cursor, end_cursor } = inputs.cursor;\n * // ... process items in range\n * }\n * ```\n */\nexport interface RustBatchWorkerInputs {\n /**\n * Cursor configuration defining this worker's processing range.\n *\n * Created by the batchable handler after analyzing dataset size.\n */\n cursor: RustCursorConfig;\n\n /**\n * Batch processing metadata from template configuration.\n *\n * Provides checkpointing frequency, cursor field, and failure strategy.\n */\n batch_metadata: BatchMetadata;\n\n /**\n * Explicit flag indicating if this is a no-op/placeholder worker.\n *\n * Set by orchestration based on BatchProcessingOutcome type:\n * - `true` for NoBatches outcome (placeholder worker)\n * - `false` for CreateBatches outcome (real worker with data)\n *\n * Workers should check this flag FIRST before any processing logic.\n * If `true`, immediately return success without processing.\n */\n is_no_op: boolean;\n}\n\n// =============================================================================\n// BatchProcessingOutcome - Discriminated Union (TAS-112/TAS-123)\n//\n// Matches Rust's `BatchProcessingOutcome` enum with tagged serialization.\n// Uses TypeScript discriminated unions for type-safe pattern matching.\n// =============================================================================\n\n/**\n * No batches needed - process as single step or skip.\n *\n * Returned when:\n * - Dataset is too small to warrant batching\n * - Data doesn't meet batching criteria\n * - Batch processing not applicable for this execution\n *\n * Serialization format: `{ \"type\": \"no_batches\" }`\n */\nexport interface NoBatchesOutcome {\n type: 'no_batches';\n}\n\n/**\n * Create batch worker steps from template.\n *\n * The orchestration system will:\n * 1. Instantiate N workers from the template step\n * 2. Assign each worker a unique cursor config\n * 3. Create DAG edges from batchable step to workers\n * 4. Enqueue workers for parallel execution\n *\n * Serialization format:\n * ```json\n * {\n * \"type\": \"create_batches\",\n * \"worker_template_name\": \"batch_worker_template\",\n * \"worker_count\": 5,\n * \"cursor_configs\": [...],\n * \"total_items\": 5000\n * }\n * ```\n */\nexport interface CreateBatchesOutcome {\n type: 'create_batches';\n\n /**\n * Template step name to use for creating workers.\n *\n * Must match a step definition in the template with `type: batch_worker`.\n * The system creates multiple instances with generated names like:\n * - `{template_name}_001`\n * - `{template_name}_002`\n */\n worker_template_name: string;\n\n /**\n * Number of worker instances to create.\n *\n * Typically calculated based on dataset size / batch_size.\n */\n worker_count: number;\n\n /**\n * Initial cursor positions for each batch.\n *\n * Each worker receives one cursor config that defines its\n * processing boundaries. Length must equal `worker_count`.\n */\n cursor_configs: RustCursorConfig[];\n\n /**\n * Total items to process across all batches.\n *\n * Used for progress tracking and observability.\n */\n total_items: number;\n}\n\n/**\n * Outcome of a batchable step that determines batch worker creation.\n *\n * Matches Rust's `BatchProcessingOutcome` enum in\n * `tasker-shared/src/messaging/execution_types.rs`.\n *\n * This discriminated union enables type-safe pattern matching:\n *\n * @example\n * ```typescript\n * function handleOutcome(outcome: BatchProcessingOutcome): void {\n * switch (outcome.type) {\n * case 'no_batches':\n * console.log('No batches needed');\n * break;\n * case 'create_batches':\n * console.log(`Creating ${outcome.worker_count} workers`);\n * console.log(`Total items: ${outcome.total_items}`);\n * break;\n * default: {\n * const _exhaustive: never = outcome;\n * throw new Error(`Unhandled outcome type: ${_exhaustive}`);\n * }\n * }\n * }\n * ```\n */\nexport type BatchProcessingOutcome = NoBatchesOutcome | CreateBatchesOutcome;\n\n// =============================================================================\n// Factory Functions for BatchProcessingOutcome\n// =============================================================================\n\n/**\n * Create a NoBatches outcome.\n *\n * Use when batching is not needed or applicable.\n *\n * @returns A NoBatchesOutcome object\n */\nexport function noBatches(): NoBatchesOutcome {\n return { type: 'no_batches' };\n}\n\n/**\n * Create a CreateBatches outcome with specified configuration.\n *\n * @param workerTemplateName - Name of the template step to instantiate\n * @param workerCount - Number of workers to create\n * @param cursorConfigs - Cursor configuration for each worker\n * @param totalItems - Total number of items to process\n * @returns A CreateBatchesOutcome object\n *\n * @example\n * ```typescript\n * const outcome = createBatches(\n * 'process_csv_batch',\n * 3,\n * [\n * { batch_id: '001', start_cursor: 0, end_cursor: 1000, batch_size: 1000 },\n * { batch_id: '002', start_cursor: 1000, end_cursor: 2000, batch_size: 1000 },\n * { batch_id: '003', start_cursor: 2000, end_cursor: 3000, batch_size: 1000 },\n * ],\n * 3000\n * );\n * ```\n */\nexport function createBatches(\n workerTemplateName: string,\n workerCount: number,\n cursorConfigs: RustCursorConfig[],\n totalItems: number\n): CreateBatchesOutcome {\n if (cursorConfigs.length !== workerCount) {\n throw new Error(\n `cursor_configs length (${cursorConfigs.length}) must equal worker_count (${workerCount})`\n );\n }\n\n return {\n type: 'create_batches',\n worker_template_name: workerTemplateName,\n worker_count: workerCount,\n cursor_configs: cursorConfigs,\n total_items: totalItems,\n };\n}\n\n/**\n * Type guard to check if an outcome is NoBatches.\n */\nexport function isNoBatches(outcome: BatchProcessingOutcome): outcome is NoBatchesOutcome {\n return outcome.type === 'no_batches';\n}\n\n/**\n * Type guard to check if an outcome is CreateBatches.\n */\nexport function isCreateBatches(outcome: BatchProcessingOutcome): outcome is CreateBatchesOutcome {\n return outcome.type === 'create_batches';\n}\n\n/**\n * Result from aggregating multiple batch worker results.\n *\n * Cross-language standard: matches Python's aggregate_worker_results output\n * and Ruby's aggregate_batch_worker_results.\n *\n * TAS-112: Standardized aggregation result structure.\n */\nexport interface BatchAggregationResult {\n /** Total items processed across all batches */\n total_processed: number;\n /** Total items that succeeded */\n total_succeeded: number;\n /** Total items that failed */\n total_failed: number;\n /** Total items that were skipped */\n total_skipped: number;\n /** Number of batch workers that ran */\n batch_count: number;\n /** Success rate (0.0 to 1.0) */\n success_rate: number;\n /** Collected errors from all batches (limited) */\n errors: Array<Record<string, unknown>>;\n /** Total error count (may exceed errors array length) */\n error_count: number;\n}\n\n/**\n * Aggregate results from multiple batch workers.\n *\n * Cross-language standard: matches Python's `Batchable.aggregate_worker_results`\n * and Ruby's `aggregate_batch_worker_results`.\n *\n * @param workerResults - Array of results from batch worker steps\n * @param maxErrors - Maximum number of errors to collect (default: 100)\n * @returns Aggregated summary of all batch processing\n *\n * @example\n * ```typescript\n * // In an aggregator handler\n * const workerResults = Object.values(context.previousResults)\n * .filter(r => r?.batch_worker);\n * const summary = aggregateBatchResults(workerResults);\n * return this.success(summary);\n * ```\n */\nexport function aggregateBatchResults(\n workerResults: Array<Record<string, unknown> | null | undefined>,\n maxErrors = 100\n): BatchAggregationResult {\n let totalProcessed = 0;\n let totalSucceeded = 0;\n let totalFailed = 0;\n let totalSkipped = 0;\n const allErrors: Array<Record<string, unknown>> = [];\n let batchCount = 0;\n\n for (const result of workerResults) {\n if (result === null || result === undefined) {\n continue;\n }\n\n batchCount++;\n totalProcessed += (result.items_processed as number) ?? 0;\n totalSucceeded += (result.items_succeeded as number) ?? 0;\n totalFailed += (result.items_failed as number) ?? 0;\n totalSkipped += (result.items_skipped as number) ?? 0;\n\n const errors = result.errors as Array<Record<string, unknown>> | undefined;\n if (errors && Array.isArray(errors)) {\n allErrors.push(...errors);\n }\n }\n\n return {\n total_processed: totalProcessed,\n total_succeeded: totalSucceeded,\n total_failed: totalFailed,\n total_skipped: totalSkipped,\n batch_count: batchCount,\n success_rate: totalProcessed > 0 ? totalSucceeded / totalProcessed : 0,\n errors: allErrors.slice(0, maxErrors),\n error_count: allErrors.length,\n };\n}\n","import type {\n BatchAggregationResult,\n BatchAnalyzerOutcome,\n BatchWorkerContext,\n BatchWorkerOutcome,\n CursorConfig,\n RustBatchWorkerInputs,\n RustCursorConfig,\n} from '../types/batch.js';\nimport {\n aggregateBatchResults,\n createBatches as createBatchesOutcome,\n createBatchWorkerContext,\n noBatches as createNoBatchesOutcome,\n} from '../types/batch.js';\nimport type { StepContext } from '../types/step-context.js';\nimport {\n type BatchableResult,\n type BatchWorkerConfig,\n StepHandlerResult,\n} from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\n\n// Re-export FFI boundary types for handler use (TAS-112/TAS-123)\nexport type {\n BatchAggregationResult,\n RustBatchWorkerInputs,\n RustCursorConfig,\n} from '../types/batch.js';\nexport { aggregateBatchResults, createBatches, noBatches } from '../types/batch.js';\n\n// =============================================================================\n// BatchAggregationScenario - Cross-Language Standard Type (TAS-112)\n// =============================================================================\n\n/**\n * Represents the aggregation scenario for batch processing convergence steps.\n *\n * Cross-language standard: matches Ruby's BatchAggregationScenario,\n * Python's BatchAggregationScenario, and Rust's BatchAggregationScenario enum.\n *\n * There are two scenarios:\n * - **NoBatches**: The batchable step returned `noBatches()`, no workers were created.\n * The convergence step should read results directly from the batchable step.\n * - **WithBatches**: Workers were created and processed batches. The convergence\n * step should aggregate results from all batch workers.\n */\nexport interface BatchAggregationScenario {\n /** True if this is a NoBatches scenario. */\n isNoBatches: boolean;\n /** Result from the batchable step (always present). */\n batchableResult: Record<string, unknown>;\n /** Dict of worker_name -> result (empty for NoBatches). */\n batchResults: Record<string, Record<string, unknown>>;\n /** Number of batch workers (0 for NoBatches). */\n workerCount: number;\n}\n\n/**\n * Extract result data from a step result (handles wrapped and raw results).\n */\nfunction extractResultData(stepResult: unknown): Record<string, unknown> {\n if (typeof stepResult !== 'object' || stepResult === null) {\n return {};\n }\n if ('result' in stepResult) {\n return stepResult.result as Record<string, unknown>;\n }\n return stepResult as Record<string, unknown>;\n}\n\n/**\n * Check if a batch_processing_outcome indicates NoBatches.\n */\nfunction isNoBatchesOutcome(resultData: Record<string, unknown>): boolean {\n const outcome = resultData.batch_processing_outcome;\n if (typeof outcome !== 'object' || outcome === null) {\n return false;\n }\n return (outcome as Record<string, unknown>).type === 'no_batches';\n}\n\n/**\n * Collect batch worker results by prefix.\n */\nfunction collectBatchResults(\n dependencyResults: Record<string, unknown>,\n batchWorkerPrefix: string\n): Record<string, Record<string, unknown>> {\n const batchResults: Record<string, Record<string, unknown>> = {};\n for (const [stepName, stepResult] of Object.entries(dependencyResults)) {\n if (stepName.startsWith(batchWorkerPrefix)) {\n batchResults[stepName] = extractResultData(stepResult);\n }\n }\n return batchResults;\n}\n\n/**\n * Detect the aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's BatchAggregationScenario.detect,\n * Python's BatchAggregationScenario.detect, and Rust's BatchAggregationScenario::detect.\n *\n * @param dependencyResults - All dependency results from the step context.\n * @param batchableStepName - Name of the batchable step (e.g., \"analyze_csv\").\n * @param batchWorkerPrefix - Prefix for batch worker step names (e.g., \"process_csv_batch_\").\n * @returns BatchAggregationScenario indicating NoBatches or WithBatches.\n * @throws Error if batchable step is missing or no workers found without NoBatches outcome.\n *\n * @example\n * ```typescript\n * const scenario = detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n * if (scenario.isNoBatches) {\n * return this.noBatchesAggregationResult({ total: 0 });\n * }\n * ```\n */\nexport function detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n): BatchAggregationScenario {\n // Find the batchable step result\n const batchableResult = dependencyResults[batchableStepName];\n if (batchableResult === undefined || batchableResult === null) {\n throw new Error(`Missing batchable step dependency: ${batchableStepName}`);\n }\n\n const resultData = extractResultData(batchableResult);\n\n // Check for NoBatches scenario\n if (isNoBatchesOutcome(resultData)) {\n return {\n isNoBatches: true,\n batchableResult: resultData,\n batchResults: {},\n workerCount: 0,\n };\n }\n\n // WithBatches scenario - find all batch workers\n const batchResults = collectBatchResults(dependencyResults, batchWorkerPrefix);\n\n if (Object.keys(batchResults).length === 0) {\n throw new Error(\n `No batch workers found with prefix '${batchWorkerPrefix}' ` +\n `and batchable step '${batchableStepName}' did not return NoBatches outcome. ` +\n 'This indicates a workflow configuration error.'\n );\n }\n\n return {\n isNoBatches: false,\n batchableResult: resultData,\n batchResults,\n workerCount: Object.keys(batchResults).length,\n };\n}\n\n/**\n * Mixin interface for batch processing capabilities.\n *\n * TypeScript implementation using interface + method binding pattern\n * (since TS doesn't have true mixins like Python/Ruby).\n *\n * Matches Python's Batchable mixin and Ruby's Batchable module (TAS-92 aligned).\n */\nexport interface Batchable {\n // =========================================================================\n // Cursor Configuration Helpers\n // =========================================================================\n\n createCursorConfig(\n start: number,\n end: number,\n stepSize?: number,\n metadata?: Record<string, unknown>\n ): CursorConfig;\n\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n maxBatches?: number\n ): CursorConfig[];\n\n /**\n * Create cursor configurations for a specific number of workers.\n *\n * Ruby-style method that divides items into worker_count roughly equal ranges.\n * Use this when you know the desired number of workers rather than batch size.\n *\n * Cross-language standard: matches Ruby's create_cursor_configs(total_items, worker_count).\n */\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[];\n\n // =========================================================================\n // Batch Outcome Builders\n // =========================================================================\n\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome;\n\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded?: number,\n itemsFailed?: number,\n itemsSkipped?: number,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome;\n\n // =========================================================================\n // Batch Context Helpers\n // =========================================================================\n\n getBatchContext(context: StepContext): BatchWorkerContext | null;\n\n /**\n * Get Rust batch worker inputs from step context.\n *\n * Returns the BatchWorkerInputs structure from workflow_step.inputs,\n * which contains cursor config, batch metadata, and no-op flag.\n *\n * Cross-language standard: matches Ruby's get_batch_context pattern.\n */\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null;\n\n /**\n * Handle no-op placeholder worker scenario.\n *\n * Returns a success result if the worker is a no-op placeholder,\n * otherwise returns null to allow normal processing to continue.\n *\n * Cross-language standard: matches Ruby's handle_no_op_worker.\n */\n handleNoOpWorker(context: StepContext): StepHandlerResult | null;\n\n // =========================================================================\n // Result Helpers\n // =========================================================================\n\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Use this method when your handler needs to persist progress and be\n * re-dispatched for continued processing. Unlike batchWorkerSuccess,\n * this does NOT complete the step.\n *\n * @param cursor - Position to resume from (number, string, or object)\n * @param itemsProcessed - Total items processed so far (cumulative)\n * @param accumulatedResults - Partial aggregations to carry forward\n * @returns A StepHandlerResult with checkpoint_yield type\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult;\n\n // =========================================================================\n // Aggregation Helpers (TAS-112)\n // =========================================================================\n\n /**\n * Detect batch aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's detect_aggregation_scenario,\n * Python's detect_aggregation_scenario, and Rust's BatchAggregationScenario::detect.\n */\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario;\n\n /**\n * Create a success result for NoBatches aggregation scenario.\n *\n * Cross-language standard: matches Ruby's no_batches_aggregation_result\n * and Python's no_batches_aggregation_result.\n */\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult;\n\n /**\n * Aggregate batch worker results handling both scenarios.\n *\n * Cross-language standard: matches Ruby's aggregate_batch_worker_results\n * and Python's aggregate_batch_worker_results.\n */\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult;\n}\n\n/**\n * Implementation of Batchable methods.\n *\n * Use this class to add batch processing capabilities to your handlers.\n * The methods can be bound to handler instances or used as a mixin.\n *\n * @example Analyzer using method binding\n * ```typescript\n * class ProductAnalyzer extends StepHandler implements Batchable {\n * // Bind Batchable methods to this instance\n * createBatchOutcome = BatchableMixin.prototype.createBatchOutcome.bind(this);\n * batchAnalyzerSuccess = BatchableMixin.prototype.batchAnalyzerSuccess.bind(this);\n * // ... other required Batchable methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const total = context.inputData['product_count'] as number;\n * const outcome = this.createBatchOutcome(total, 100);\n * return this.batchAnalyzerSuccess(outcome);\n * }\n * }\n * ```\n *\n * @example Worker using method binding\n * ```typescript\n * class ProductWorker extends StepHandler implements Batchable {\n * getBatchContext = BatchableMixin.prototype.getBatchContext.bind(this);\n * createWorkerOutcome = BatchableMixin.prototype.createWorkerOutcome.bind(this);\n * batchWorkerSuccess = BatchableMixin.prototype.batchWorkerSuccess.bind(this);\n * // ... other required Batchable methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const batchCtx = this.getBatchContext(context);\n * if (!batchCtx) {\n * return this.failure('No batch context found');\n * }\n *\n * const results = [];\n * for (let i = batchCtx.startCursor; i < batchCtx.endCursor; i++) {\n * results.push(await this.processItem(i));\n * }\n *\n * const outcome = this.createWorkerOutcome(results.length, results.length);\n * return this.batchWorkerSuccess(outcome);\n * }\n * }\n * ```\n */\nexport class BatchableMixin implements Batchable {\n /**\n * Create a cursor configuration for a batch range.\n *\n * @param start - Starting cursor position (inclusive)\n * @param end - Ending cursor position (exclusive)\n * @param stepSize - Step size for iteration (default: 1)\n * @param metadata - Additional metadata for this cursor range\n * @returns CursorConfig for the specified range\n */\n createCursorConfig(\n start: number,\n end: number,\n stepSize = 1,\n metadata?: Record<string, unknown>\n ): CursorConfig {\n return {\n startCursor: start,\n endCursor: end,\n stepSize,\n metadata: metadata || {},\n };\n }\n\n /**\n * Create cursor ranges for batch processing.\n *\n * Divides totalItems into batches of batchSize, optionally limiting\n * the number of batches.\n *\n * @param totalItems - Total number of items to process\n * @param batchSize - Number of items per batch\n * @param stepSize - Step size for iteration (default: 1)\n * @param maxBatches - Maximum number of batches (optional)\n * @returns Array of CursorConfig for each batch\n */\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize = 1,\n maxBatches?: number\n ): CursorConfig[] {\n if (totalItems === 0) {\n return [];\n }\n\n if (batchSize <= 0) {\n throw new Error('batchSize must be > 0');\n }\n\n let adjustedBatchSize = batchSize;\n\n // Adjust batch size if max_batches would create more batches\n if (maxBatches && maxBatches > 0) {\n const calculatedBatches = Math.ceil(totalItems / batchSize);\n if (calculatedBatches > maxBatches) {\n adjustedBatchSize = Math.ceil(totalItems / maxBatches);\n }\n }\n\n const configs: CursorConfig[] = [];\n let start = 0;\n\n while (start < totalItems) {\n const end = Math.min(start + adjustedBatchSize, totalItems);\n configs.push({\n startCursor: start,\n endCursor: end,\n stepSize,\n metadata: {},\n });\n start = end;\n }\n\n return configs;\n }\n\n /**\n * Create cursor configurations for a specific number of workers.\n *\n * Ruby-style method that divides items into worker_count roughly equal ranges.\n * Uses ceiling division to ensure all items are covered.\n *\n * ## Cursor Boundary Math\n *\n * 1. items_per_worker = ceil(total_items / worker_count)\n * 2. For worker i (0-indexed):\n * - start = i * items_per_worker\n * - end = min((i + 1) * items_per_worker, total_items)\n * - batch_size = end - start\n *\n * Example: 1000 items, 3 workers\n * - items_per_worker = ceil(1000/3) = 334\n * - Worker 0: start=0, end=334, size=334\n * - Worker 1: start=334, end=668, size=334\n * - Worker 2: start=668, end=1000, size=332\n *\n * Cross-language standard: matches Ruby's create_cursor_configs(total_items, worker_count).\n *\n * @param totalItems - Total number of items to process\n * @param workerCount - Number of workers to create configs for (must be > 0)\n * @returns Array of BatchWorkerConfig for each worker\n */\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[] {\n if (workerCount <= 0) {\n throw new Error('workerCount must be > 0');\n }\n\n if (totalItems === 0) {\n return [];\n }\n\n const itemsPerWorker = Math.ceil(totalItems / workerCount);\n const configs: BatchWorkerConfig[] = [];\n\n for (let i = 0; i < workerCount; i++) {\n const startPosition = i * itemsPerWorker;\n const endPosition = Math.min((i + 1) * itemsPerWorker, totalItems);\n\n // Skip if this worker would have no items\n if (startPosition >= totalItems) {\n break;\n }\n\n configs.push({\n batch_id: String(i + 1).padStart(3, '0'),\n cursor_start: startPosition,\n cursor_end: endPosition,\n row_count: endPosition - startPosition,\n worker_index: i,\n total_workers: workerCount,\n });\n }\n\n return configs;\n }\n\n /**\n * Create a batch analyzer outcome.\n *\n * Convenience method that creates cursor ranges and wraps them\n * in a BatchAnalyzerOutcome.\n *\n * @param totalItems - Total number of items to process\n * @param batchSize - Number of items per batch\n * @param stepSize - Step size for iteration (default: 1)\n * @param batchMetadata - Metadata to pass to all batch workers\n * @returns BatchAnalyzerOutcome ready for batchAnalyzerSuccess\n */\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize = 1,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome {\n const cursorConfigs = this.createCursorRanges(totalItems, batchSize, stepSize);\n\n return {\n cursorConfigs,\n totalItems,\n batchMetadata: batchMetadata || {},\n };\n }\n\n /**\n * Create a batch worker outcome.\n *\n * @param itemsProcessed - Total items processed in this batch\n * @param itemsSucceeded - Items that succeeded (default: itemsProcessed)\n * @param itemsFailed - Items that failed (default: 0)\n * @param itemsSkipped - Items that were skipped (default: 0)\n * @param results - Individual item results\n * @param errors - Individual item errors\n * @param lastCursor - Last cursor position processed\n * @param batchMetadata - Additional batch metadata\n * @returns BatchWorkerOutcome ready for batchWorkerSuccess\n */\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded = 0,\n itemsFailed = 0,\n itemsSkipped = 0,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome {\n return {\n itemsProcessed,\n itemsSucceeded: itemsSucceeded || itemsProcessed,\n itemsFailed,\n itemsSkipped,\n results: results || [],\n errors: errors || [],\n lastCursor: lastCursor ?? null,\n batchMetadata: batchMetadata || {},\n };\n }\n\n /**\n * Get the batch context from a step context.\n *\n * Looks for batch context in step_config, input_data, or step_inputs.\n *\n * @param context - The step context\n * @returns BatchWorkerContext or null if not found\n */\n getBatchContext(context: StepContext): BatchWorkerContext | null {\n // Look for batch context in step_config or input_data\n let batchData: Record<string, unknown> | undefined;\n\n if (context.stepConfig) {\n batchData = context.stepConfig.batch_context as Record<string, unknown> | undefined;\n }\n\n if (!batchData && context.inputData) {\n batchData = context.inputData.batch_context as Record<string, unknown> | undefined;\n }\n\n // Also check stepInputs (for cursor config from workflow_step.inputs)\n if (!batchData && context.stepInputs) {\n batchData = context.stepInputs.batch_context as Record<string, unknown> | undefined;\n }\n\n if (!batchData) {\n return null;\n }\n\n return createBatchWorkerContext(batchData);\n }\n\n /**\n * Get Rust batch worker inputs from step context.\n *\n * Returns the BatchWorkerInputs structure from workflow_step.inputs,\n * which contains cursor config, batch metadata, and no-op flag.\n *\n * Cross-language standard: matches Ruby's get_batch_context pattern\n * for accessing Rust-provided batch configuration.\n *\n * @param context - The step context\n * @returns BatchWorkerInputs or null if not found\n */\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null {\n if (!context.stepInputs || Object.keys(context.stepInputs).length === 0) {\n return null;\n }\n return context.stepInputs as Partial<RustBatchWorkerInputs>;\n }\n\n /**\n * Handle no-op placeholder worker scenario.\n *\n * Returns a success result if the worker is a no-op placeholder\n * (created when a batchable step returns NoBatches), otherwise\n * returns null to allow normal processing to continue.\n *\n * Cross-language standard: matches Ruby's handle_no_op_worker.\n *\n * @param context - The step context\n * @returns Success result if no-op, null otherwise\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const noOpResult = this.handleNoOpWorker(context);\n * if (noOpResult) {\n * return noOpResult;\n * }\n * // ... normal processing\n * }\n * ```\n */\n handleNoOpWorker(context: StepContext): StepHandlerResult | null {\n const batchInputs = this.getBatchWorkerInputs(context);\n\n if (!batchInputs?.is_no_op) {\n return null;\n }\n\n return StepHandlerResult.success({\n batch_id: batchInputs.cursor?.batch_id ?? 'no_op',\n no_op: true,\n processed_count: 0,\n message: 'No batches to process',\n processed_at: new Date().toISOString(),\n });\n }\n\n /**\n * Create a success result for a batch analyzer.\n *\n * Formats the BatchAnalyzerOutcome in the structure expected by\n * the orchestration layer.\n *\n * @param outcome - The batch analyzer outcome\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the batch outcome\n */\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n batch_analyzer_outcome: {\n cursor_configs: outcome.cursorConfigs.map((c) => ({\n start_cursor: c.startCursor,\n end_cursor: c.endCursor,\n step_size: c.stepSize,\n metadata: c.metadata,\n })),\n total_items: outcome.totalItems,\n batch_metadata: outcome.batchMetadata,\n },\n };\n\n // Access success method from the handler this is mixed into\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a success result for a batch worker.\n *\n * Formats the BatchWorkerOutcome in the structure expected by\n * the orchestration layer.\n *\n * @param outcome - The batch worker outcome\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the worker outcome\n */\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n batch_worker_outcome: {\n items_processed: outcome.itemsProcessed,\n items_succeeded: outcome.itemsSucceeded,\n items_failed: outcome.itemsFailed,\n items_skipped: outcome.itemsSkipped,\n results: outcome.results,\n errors: outcome.errors,\n last_cursor: outcome.lastCursor,\n batch_metadata: outcome.batchMetadata,\n },\n };\n\n // Access success method from the handler this is mixed into\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Use this method when your handler needs to persist progress and be\n * re-dispatched for continued processing. This is useful for:\n * - Processing very large datasets that exceed memory limits\n * - Providing progress visibility for long-running batch jobs\n * - Enabling graceful shutdown with resumption capability\n *\n * Unlike batchWorkerSuccess, this does NOT complete the step.\n * Instead, it persists the checkpoint and causes the step to be\n * re-dispatched with the updated checkpoint context.\n *\n * @param cursor - Position to resume from\n * - number: For offset-based pagination (row number)\n * - string: For cursor-based pagination (opaque token)\n * - object: For complex cursors (e.g., {page_token: \"...\"})\n * @param itemsProcessed - Total items processed so far (cumulative across all yields)\n * @param accumulatedResults - Partial aggregations to carry forward\n * @returns A StepHandlerResult with checkpoint_yield type\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const batchCtx = this.getBatchContext(context);\n * const start = batchCtx?.checkpointCursor ?? batchCtx?.startCursor ?? 0;\n * const accumulated = batchCtx?.accumulatedResults ?? { total: 0 };\n *\n * // Process a chunk\n * const chunkSize = 1000;\n * for (let i = 0; i < chunkSize && start + i < batchCtx.endCursor; i++) {\n * accumulated.total += await processItem(start + i);\n * }\n *\n * const newCursor = start + chunkSize;\n * if (newCursor < batchCtx.endCursor) {\n * // More work to do - yield checkpoint\n * return this.checkpointYield(newCursor, newCursor, accumulated);\n * }\n *\n * // Done - return final success\n * return this.batchWorkerSuccess(\n * this.createWorkerOutcome(batchCtx.endCursor - batchCtx.startCursor)\n * );\n * }\n * ```\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n type: 'checkpoint_yield',\n cursor,\n items_processed: itemsProcessed,\n };\n\n if (accumulatedResults !== undefined) {\n result.accumulated_results = accumulatedResults;\n }\n\n // Return as a special result that the FFI layer will handle\n return StepHandlerResult.success(result, {\n checkpoint_yield: true,\n batch_worker: true,\n });\n }\n\n // =========================================================================\n // Aggregation Helpers (Instance Methods - TAS-112)\n // =========================================================================\n\n /**\n * Detect batch aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's detect_aggregation_scenario,\n * Python's detect_aggregation_scenario, and Rust's BatchAggregationScenario::detect.\n *\n * @param dependencyResults - All dependency results from the step context.\n * @param batchableStepName - Name of the batchable step (e.g., \"analyze_csv\").\n * @param batchWorkerPrefix - Prefix for batch worker step names (e.g., \"process_csv_batch_\").\n * @returns BatchAggregationScenario indicating NoBatches or WithBatches.\n *\n * @example\n * ```typescript\n * const scenario = this.detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n * if (scenario.isNoBatches) {\n * return this.noBatchesAggregationResult({ total: 0 });\n * }\n * ```\n */\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario {\n return detectAggregationScenario(dependencyResults, batchableStepName, batchWorkerPrefix);\n }\n\n /**\n * Create a success result for NoBatches aggregation scenario.\n *\n * Cross-language standard: matches Ruby's no_batches_aggregation_result\n * and Python's no_batches_aggregation_result.\n *\n * @param zeroMetrics - Metrics to return (typically zeros).\n * @returns Success result with workerCount=0 and scenario=\"no_batches\".\n *\n * @example\n * ```typescript\n * return this.noBatchesAggregationResult({\n * totalProcessed: 0,\n * totalValue: 0.0,\n * });\n * ```\n */\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult {\n const result: Record<string, unknown> = {\n worker_count: 0,\n scenario: 'no_batches',\n };\n if (zeroMetrics) {\n Object.assign(result, zeroMetrics);\n }\n return StepHandlerResult.success(result);\n }\n\n /**\n * Aggregate batch worker results handling both scenarios.\n *\n * Cross-language standard: matches Ruby's aggregate_batch_worker_results\n * and Python's aggregate_batch_worker_results.\n * Handles both NoBatches and WithBatches scenarios automatically.\n *\n * For NoBatches, returns zeroMetrics with worker_count=0.\n * For WithBatches, calls aggregationFn with batchResults dict.\n *\n * @param scenario - BatchAggregationScenario from detectAggregationScenario().\n * @param zeroMetrics - Metrics to return for NoBatches scenario.\n * @param aggregationFn - Function to aggregate batch results. Receives dict of\n * worker_name -> result_dict, returns aggregated metrics dict.\n * @returns Success result with aggregated data and worker_count.\n *\n * @example\n * ```typescript\n * const scenario = this.detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n *\n * return this.aggregateBatchWorkerResults(\n * scenario,\n * { totalProcessed: 0 },\n * (batchResults) => {\n * let total = 0;\n * for (const result of Object.values(batchResults)) {\n * total += (result.count as number) || 0;\n * }\n * return { totalProcessed: total };\n * }\n * );\n * ```\n */\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult {\n if (scenario.isNoBatches) {\n return this.noBatchesAggregationResult(zeroMetrics);\n }\n\n // WithBatches scenario - aggregate results\n let aggregated: Record<string, unknown>;\n if (aggregationFn === undefined) {\n // Default aggregation: just pass through batchResults\n aggregated = { batch_results: scenario.batchResults };\n } else {\n aggregated = aggregationFn(scenario.batchResults);\n }\n\n const result: Record<string, unknown> = {\n ...aggregated,\n worker_count: scenario.workerCount,\n scenario: 'with_batches',\n };\n\n return StepHandlerResult.success(result);\n }\n\n // =========================================================================\n // Aggregation Helpers (Static Methods)\n // =========================================================================\n\n /**\n * Aggregate results from multiple batch workers.\n *\n * Delegates to `aggregateBatchResults` from types/batch.ts (TAS-112/TAS-123).\n * Cross-language standard: matches Python's aggregate_batch_results.\n *\n * @param workerResults - Array of results from batch worker steps\n * @param maxErrors - Maximum number of errors to collect (default: 100)\n * @returns Aggregated summary of all batch processing\n *\n * @example\n * ```typescript\n * // In an aggregator handler\n * const workerResults = context.getAllDependencyResults('process_batch_');\n * const summary = BatchableMixin.aggregateWorkerResults(workerResults);\n * return this.success(summary);\n * ```\n */\n static aggregateWorkerResults(\n workerResults: Array<Record<string, unknown> | null>,\n maxErrors = 100\n ): BatchAggregationResult {\n return aggregateBatchResults(workerResults, maxErrors);\n }\n}\n\n/**\n * Helper function to apply Batchable methods to a handler class.\n *\n * This is a convenience for applying all Batchable methods at once.\n *\n * @example\n * ```typescript\n * class MyBatchHandler extends StepHandler {\n * constructor() {\n * super();\n * applyBatchable(this);\n * }\n * }\n * ```\n */\nexport function applyBatchable<T extends object>(target: T): T & Batchable {\n const mixin = new BatchableMixin();\n\n (target as T & Batchable).createCursorConfig = mixin.createCursorConfig.bind(mixin);\n (target as T & Batchable).createCursorRanges = mixin.createCursorRanges.bind(mixin);\n (target as T & Batchable).createCursorConfigs = mixin.createCursorConfigs.bind(mixin);\n (target as T & Batchable).createBatchOutcome = mixin.createBatchOutcome.bind(mixin);\n (target as T & Batchable).createWorkerOutcome = mixin.createWorkerOutcome.bind(mixin);\n (target as T & Batchable).getBatchContext = mixin.getBatchContext.bind(mixin);\n (target as T & Batchable).getBatchWorkerInputs = mixin.getBatchWorkerInputs.bind(mixin);\n (target as T & Batchable).handleNoOpWorker = mixin.handleNoOpWorker.bind(mixin);\n (target as T & Batchable).batchAnalyzerSuccess = mixin.batchAnalyzerSuccess.bind(mixin);\n (target as T & Batchable).batchWorkerSuccess = mixin.batchWorkerSuccess.bind(mixin);\n // TAS-125: Checkpoint yield\n (target as T & Batchable).checkpointYield = mixin.checkpointYield.bind(mixin);\n // TAS-112: Aggregation helpers\n (target as T & Batchable).detectAggregationScenario = mixin.detectAggregationScenario.bind(mixin);\n (target as T & Batchable).noBatchesAggregationResult =\n mixin.noBatchesAggregationResult.bind(mixin);\n (target as T & Batchable).aggregateBatchWorkerResults =\n mixin.aggregateBatchWorkerResults.bind(mixin);\n\n return target as T & Batchable;\n}\n\n/**\n * Base class for batch-enabled step handlers.\n *\n * Extends StepHandler with batch processing capabilities.\n * Use this class when implementing handlers that need to create\n * batch worker configurations.\n *\n * @example\n * ```typescript\n * export class CsvAnalyzerHandler extends BatchableStepHandler {\n * static handlerName = 'MyNamespace.CsvAnalyzer';\n *\n * async call(context: StepContext): Promise<BatchableResult> {\n * const totalRows = 1000;\n * const batchConfigs: BatchWorkerConfig[] = [];\n *\n * for (let i = 0; i < 5; i++) {\n * batchConfigs.push({\n * batch_id: `batch_${i + 1}`,\n * cursor_start: i * 200,\n * cursor_end: (i + 1) * 200,\n * row_count: 200,\n * worker_index: i,\n * total_workers: 5,\n * });\n * }\n *\n * return this.batchSuccess(batchConfigs, {\n * total_rows: totalRows,\n * analyzed_at: new Date().toISOString(),\n * });\n * }\n * }\n * ```\n */\nexport abstract class BatchableStepHandler extends StepHandler implements Batchable {\n private readonly _batchMixin = new BatchableMixin();\n\n // Delegate Batchable interface methods to mixin\n createCursorConfig(\n start: number,\n end: number,\n stepSize?: number,\n metadata?: Record<string, unknown>\n ): CursorConfig {\n return this._batchMixin.createCursorConfig(start, end, stepSize, metadata);\n }\n\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n maxBatches?: number\n ): CursorConfig[] {\n return this._batchMixin.createCursorRanges(totalItems, batchSize, stepSize, maxBatches);\n }\n\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[] {\n return this._batchMixin.createCursorConfigs(totalItems, workerCount);\n }\n\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome {\n return this._batchMixin.createBatchOutcome(totalItems, batchSize, stepSize, batchMetadata);\n }\n\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded?: number,\n itemsFailed?: number,\n itemsSkipped?: number,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome {\n return this._batchMixin.createWorkerOutcome(\n itemsProcessed,\n itemsSucceeded,\n itemsFailed,\n itemsSkipped,\n results,\n errors,\n lastCursor,\n batchMetadata\n );\n }\n\n getBatchContext(context: StepContext): BatchWorkerContext | null {\n return this._batchMixin.getBatchContext(context);\n }\n\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null {\n return this._batchMixin.getBatchWorkerInputs(context);\n }\n\n handleNoOpWorker(context: StepContext): StepHandlerResult | null {\n return this._batchMixin.handleNoOpWorker(context);\n }\n\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.batchAnalyzerSuccess(outcome, metadata);\n }\n\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.batchWorkerSuccess(outcome, metadata);\n }\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Delegates to BatchableMixin.checkpointYield.\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.checkpointYield(cursor, itemsProcessed, accumulatedResults);\n }\n\n // =========================================================================\n // Aggregation Helpers (TAS-112)\n // =========================================================================\n\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario {\n return this._batchMixin.detectAggregationScenario(\n dependencyResults,\n batchableStepName,\n batchWorkerPrefix\n );\n }\n\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult {\n return this._batchMixin.noBatchesAggregationResult(zeroMetrics);\n }\n\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.aggregateBatchWorkerResults(scenario, zeroMetrics, aggregationFn);\n }\n\n /**\n * Create a successful batch analyzer result with batch worker configurations.\n *\n * This is a convenience method that wraps batch configurations in the format\n * expected by the Rust orchestration layer (BatchProcessingOutcome::CreateBatches).\n *\n * Uses the typed BatchProcessingOutcome from types/batch.ts (TAS-112/TAS-123).\n *\n * @param workerTemplateName - Name of the batch worker template step (e.g., \"process_csv_batch_ts\")\n * @param batchConfigs - Array of batch worker configurations\n * @param metadata - Additional metadata to include in the result\n * @returns A BatchableResult (StepHandlerResult) indicating success\n *\n * @example\n * ```typescript\n * return this.batchSuccess('process_csv_batch_ts', batchConfigs, {\n * total_rows: 1000,\n * analyzed_at: new Date().toISOString(),\n * });\n * ```\n */\n batchSuccess(\n workerTemplateName: string,\n batchConfigs: BatchWorkerConfig[],\n metadata?: Record<string, unknown>\n ): BatchableResult {\n // Convert BatchWorkerConfig[] to RustCursorConfig[] (TAS-112/TAS-123)\n const cursorConfigs: RustCursorConfig[] = batchConfigs.map((config) => ({\n batch_id: config.batch_id,\n start_cursor: config.cursor_start,\n end_cursor: config.cursor_end,\n batch_size: config.row_count,\n }));\n\n const totalItems = batchConfigs.reduce((sum, c) => sum + c.row_count, 0);\n\n // Use typed BatchProcessingOutcome factory (TAS-112/TAS-123)\n const batchProcessingOutcome = createBatchesOutcome(\n workerTemplateName,\n batchConfigs.length,\n cursorConfigs,\n totalItems\n );\n\n // Return in the format expected by Rust orchestration\n const result: Record<string, unknown> = {\n batch_processing_outcome: batchProcessingOutcome,\n ...(metadata || {}),\n };\n\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a no-batches result when batch processing is not needed.\n *\n * Use this when the batchable handler determines no batch workers are needed.\n *\n * Uses the typed BatchProcessingOutcome from types/batch.ts (TAS-112/TAS-123).\n * Cross-language standard: matches Ruby's no_batches_outcome(reason:, metadata:)\n * and Python's no_batches_outcome(reason, metadata).\n *\n * @param reason - Human-readable reason why no batches are needed (optional but recommended)\n * @param metadata - Additional metadata to include in the result\n * @returns A BatchableResult (StepHandlerResult) indicating no batches\n *\n * @example\n * ```typescript\n * if (totalItems === 0) {\n * return this.noBatchesResult('empty_dataset', { total_rows: 0 });\n * }\n * ```\n */\n noBatchesResult(reason?: string, metadata?: Record<string, unknown>): BatchableResult {\n // Use typed BatchProcessingOutcome factory (TAS-112/TAS-123)\n const batchProcessingOutcome = createNoBatchesOutcome();\n\n const result: Record<string, unknown> = {\n batch_processing_outcome: batchProcessingOutcome,\n ...(metadata || {}),\n };\n\n // Add reason if provided (matches Ruby/Python pattern)\n if (reason) {\n result.reason = reason;\n }\n\n return StepHandlerResult.success(result, metadata);\n }\n}\n","/**\n * Decision mixin for workflow routing.\n *\n * TAS-112: Composition Pattern - Decision Mixin\n *\n * This module provides the DecisionMixin class for step handlers that make\n * routing decisions. Use via interface implementation with method binding.\n *\n * @example\n * ```typescript\n * class RouteOrderHandler extends StepHandler implements DecisionCapable {\n * static handlerName = 'route_order';\n *\n * // Bind DecisionMixin methods\n * decisionSuccess = DecisionMixin.prototype.decisionSuccess.bind(this);\n * skipBranches = DecisionMixin.prototype.skipBranches.bind(this);\n * // ... other required methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderType = context.inputData['order_type'];\n * if (orderType === 'premium') {\n * return this.decisionSuccess(\n * ['validate_premium', 'process_premium'],\n * { order_type: orderType }\n * );\n * }\n * return this.decisionSuccess(['process_standard']);\n * }\n * }\n * ```\n *\n * @module handler/mixins/decision\n */\n\nimport { StepHandlerResult } from '../../types/step-handler-result.js';\n\n/**\n * Type of decision point outcome.\n */\nexport enum DecisionType {\n CREATE_STEPS = 'create_steps',\n NO_BRANCHES = 'no_branches',\n}\n\n/**\n * Outcome from a decision point handler.\n *\n * Decision handlers return this to indicate which branch(es) of a workflow\n * to execute.\n */\nexport interface DecisionPointOutcome {\n /** Type of decision made */\n decisionType: DecisionType;\n /** Names of steps to execute next */\n nextStepNames: string[];\n /** Optional dynamically created steps */\n dynamicSteps?: Array<Record<string, unknown>>;\n /** Human-readable reason for the decision */\n reason?: string;\n /** Context data for routing */\n routingContext: Record<string, unknown>;\n}\n\n/**\n * Interface for decision-capable handlers.\n *\n * Implement this interface and bind DecisionMixin methods to get decision functionality.\n */\nexport interface DecisionCapable {\n /** Handler name (from StepHandler) */\n name: string;\n /** Handler version (from StepHandler) */\n version: string;\n\n // Decision methods\n decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionFailure(\n message: string,\n errorType?: string,\n retryable?: boolean,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n}\n\n/**\n * Implementation of decision methods.\n *\n * TAS-112: Use via interface implementation with method binding.\n *\n * Decision handlers are used to make routing decisions in workflows.\n * They evaluate conditions and determine which steps should execute next.\n */\nexport class DecisionMixin implements DecisionCapable {\n // These should be defined on the handler class\n get name(): string {\n return (this.constructor as { handlerName?: string }).handlerName || this.constructor.name;\n }\n\n get version(): string {\n return (this.constructor as { handlerVersion?: string }).handlerVersion || '1.0.0';\n }\n\n /**\n * Simplified decision success helper (cross-language standard API).\n *\n * Use this when routing to one or more steps based on a decision.\n * This is the recommended method for most decision handlers.\n *\n * @param steps - List of step names to activate\n * @param routingContext - Optional context for routing decisions\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the decision outcome\n */\n decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const outcome: DecisionPointOutcome = {\n decisionType: DecisionType.CREATE_STEPS,\n nextStepNames: steps,\n routingContext: routingContext || {},\n };\n\n return this.decisionSuccessWithOutcome(outcome, metadata);\n }\n\n /**\n * Create a success result with a DecisionPointOutcome.\n *\n * Use this for complex decision outcomes that require dynamic steps\n * or advanced routing. For simple step routing, use `decisionSuccess()`.\n */\n decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n // Build decision_point_outcome in format Rust expects\n const decisionPointOutcome: Record<string, unknown> = {\n type: outcome.decisionType,\n step_names: outcome.nextStepNames,\n };\n\n const result: Record<string, unknown> = {\n decision_point_outcome: decisionPointOutcome,\n };\n\n if (outcome.dynamicSteps) {\n result.dynamic_steps = outcome.dynamicSteps;\n }\n\n if (outcome.routingContext && Object.keys(outcome.routingContext).length > 0) {\n result.routing_context = outcome.routingContext;\n }\n\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.success(result, combinedMetadata);\n }\n\n /**\n * Create a success result for a decision with no branches.\n *\n * Use this when the decision results in no additional steps being executed.\n * This is still a successful outcome - the decision was made correctly,\n * it just doesn't require any follow-up steps.\n */\n decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const decisionPointOutcome: Record<string, unknown> = {\n type: outcome.decisionType,\n };\n\n const result: Record<string, unknown> = {\n decision_point_outcome: decisionPointOutcome,\n };\n\n if (outcome.reason) {\n result.reason = outcome.reason;\n }\n\n if (outcome.routingContext && Object.keys(outcome.routingContext).length > 0) {\n result.routing_context = outcome.routingContext;\n }\n\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.success(result, combinedMetadata);\n }\n\n /**\n * Convenience method to skip all branches.\n *\n * @param reason - Human-readable reason for skipping branches\n * @param routingContext - Optional context data\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult indicating no branches\n */\n skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const outcome: DecisionPointOutcome = {\n decisionType: DecisionType.NO_BRANCHES,\n nextStepNames: [],\n reason,\n routingContext: routingContext || {},\n };\n\n return this.decisionNoBranches(outcome, metadata);\n }\n\n /**\n * Create a failure result for a decision that could not be made.\n *\n * Use this when the handler cannot determine the appropriate routing,\n * typically due to invalid input data or missing required information.\n *\n * Decision failures are usually NOT retryable.\n */\n decisionFailure(\n message: string,\n errorType = 'decision_error',\n retryable = false,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.failure(message, errorType, retryable, combinedMetadata);\n }\n}\n\n/**\n * Helper function to apply decision methods to a handler instance.\n *\n * @example\n * ```typescript\n * class MyDecisionHandler extends StepHandler {\n * constructor() {\n * super();\n * applyDecision(this);\n * }\n * }\n * ```\n */\nexport function applyDecision<T extends { name: string; version: string }>(\n target: T\n): T & DecisionCapable {\n const mixin = new DecisionMixin();\n\n (target as T & DecisionCapable).decisionSuccess = mixin.decisionSuccess.bind(target);\n (target as T & DecisionCapable).decisionSuccessWithOutcome =\n mixin.decisionSuccessWithOutcome.bind(target);\n (target as T & DecisionCapable).decisionNoBranches = mixin.decisionNoBranches.bind(target);\n (target as T & DecisionCapable).skipBranches = mixin.skipBranches.bind(target);\n (target as T & DecisionCapable).decisionFailure = mixin.decisionFailure.bind(target);\n\n return target as T & DecisionCapable;\n}\n","/**\n * Decision handler for workflow routing.\n *\n * TAS-112: Composition Pattern (DEPRECATED CLASS)\n *\n * This module provides the DecisionHandler class for backward compatibility.\n * For new code, use the mixin pattern:\n *\n * @example Using DecisionMixin\n * ```typescript\n * import { StepHandler } from './base';\n * import { DecisionMixin, DecisionCapable, applyDecision } from './mixins/decision';\n *\n * class RouteOrderHandler extends StepHandler implements DecisionCapable {\n * static handlerName = 'route_order';\n *\n * constructor() {\n * super();\n * applyDecision(this);\n * }\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderType = context.inputData['order_type'];\n * if (orderType === 'premium') {\n * return this.decisionSuccess(\n * ['validate_premium', 'process_premium'],\n * { order_type: orderType }\n * );\n * }\n * return this.decisionSuccess(['process_standard']);\n * }\n * }\n * ```\n *\n * @module handler/decision\n */\n\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\nimport { DecisionMixin, type DecisionPointOutcome } from './mixins/decision.js';\n\n// Re-export types from mixin for backward compatibility\nexport { type DecisionPointOutcome, DecisionType } from './mixins/decision.js';\n\n/**\n * Base class for decision point step handlers.\n *\n * TAS-112: This class is provided for backward compatibility.\n * For new code, prefer using DecisionMixin directly with applyDecision().\n *\n * Decision handlers are used to make routing decisions in workflows.\n * They evaluate conditions and determine which steps should execute next.\n *\n * @example\n * ```typescript\n * class CustomerTierRouter extends DecisionHandler {\n * static handlerName = 'route_by_tier';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const tier = context.inputData['customer_tier'];\n * if (tier === 'enterprise') {\n * return this.decisionSuccess(\n * ['enterprise_validation', 'enterprise_processing'],\n * { tier }\n * );\n * } else if (tier === 'premium') {\n * return this.decisionSuccess(['premium_processing']);\n * } else {\n * return this.decisionSuccess(['standard_processing']);\n * }\n * }\n * }\n * ```\n */\nexport abstract class DecisionHandler extends StepHandler {\n private readonly _decisionMixin = new DecisionMixin();\n\n get capabilities(): string[] {\n return ['process', 'decision', 'routing'];\n }\n\n /**\n * Simplified decision success helper (cross-language standard API).\n *\n * Use this when routing to one or more steps based on a decision.\n * This is the recommended method for most decision handlers.\n */\n protected decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionSuccess.call(this, steps, routingContext, metadata);\n }\n\n /**\n * Create a success result with a DecisionPointOutcome.\n *\n * Use this for complex decision outcomes that require dynamic steps\n * or advanced routing. For simple step routing, use `decisionSuccess()`.\n */\n protected decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionSuccessWithOutcome.call(this, outcome, metadata);\n }\n\n /**\n * Create a success result for a decision with no branches.\n *\n * Use this when the decision results in no additional steps being executed.\n */\n protected decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionNoBranches.call(this, outcome, metadata);\n }\n\n /**\n * Convenience method to skip all branches.\n */\n protected skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.skipBranches.call(this, reason, routingContext, metadata);\n }\n\n /**\n * Create a failure result for a decision that could not be made.\n */\n protected decisionFailure(\n message: string,\n errorType = 'decision_error',\n retryable = false,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionFailure.call(this, message, errorType, retryable, metadata);\n }\n}\n\n/**\n * Alias for DecisionHandler for backwards compatibility.\n *\n * @deprecated Use DecisionHandler instead\n */\nexport { DecisionHandler as DecisionStepHandler };\n","/**\n * Domain Events Module for TypeScript Workers\n *\n * Provides infrastructure for custom domain event publishers and subscribers.\n * Publishers transform step results into business events; subscribers handle\n * fast (in-process) events for internal processing.\n *\n * Architecture: Handlers DON'T publish events directly. Events are declared\n * in YAML templates, and Rust orchestration publishes them after step completion.\n * Custom publishers only transform payloads. Subscribers only receive fast events.\n *\n * @module handler/domain-events\n * @see docs/architecture/domain-events.md\n * @see TAS-122, TAS-112 Phase 7\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { FfiDomainEvent } from '../ffi/types.js';\n\n// ---------------------------------------------------------------------------\n// Logger Setup\n// ---------------------------------------------------------------------------\n\nconst loggerOptions: LoggerOptions = {\n name: 'domain-events',\n level: process.env.RUST_LOG ?? 'info',\n};\n\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// Type Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Context passed to publishers for event transformation.\n *\n * Contains all information needed to build a business event payload.\n */\nexport interface StepEventContext {\n /** UUID of the task */\n readonly taskUuid: string;\n\n /** UUID of the step */\n readonly stepUuid: string;\n\n /** Name of the step handler */\n readonly stepName: string;\n\n /** Namespace (e.g., \"payments\", \"inventory\") */\n readonly namespace: string;\n\n /** Correlation ID for distributed tracing */\n readonly correlationId: string;\n\n /** Step result data (success payload or error info) */\n readonly result?: Record<string, unknown>;\n\n /** Execution metadata */\n readonly metadata: Record<string, unknown>;\n}\n\n/**\n * Event declaration from YAML task template.\n */\nexport interface EventDeclaration {\n /** Event name (e.g., \"payment.processed\") */\n readonly name: string;\n\n /** Publication condition: \"success\" | \"failure\" | \"always\" */\n readonly condition?: 'success' | 'failure' | 'retryable_failure' | 'permanent_failure' | 'always';\n\n /** Delivery mode: \"durable\" (PGMQ) | \"fast\" (in-process) | \"broadcast\" (both) */\n readonly deliveryMode?: 'durable' | 'fast' | 'broadcast';\n\n /** Custom publisher name (optional) */\n readonly publisher?: string;\n\n /** JSON schema for payload validation (optional) */\n readonly schema?: Record<string, unknown>;\n}\n\n/**\n * Step result passed to publishers.\n */\nexport interface StepResult {\n /** Whether the step succeeded */\n readonly success: boolean;\n\n /** Step handler's return value */\n readonly result?: Record<string, unknown>;\n\n /** Execution metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Domain event structure for subscribers.\n *\n * This is the shape of events received by BaseSubscriber.handle().\n */\nexport interface DomainEvent {\n /** Unique event ID (UUID v7) */\n readonly eventId: string;\n\n /** Event name (e.g., \"payment.processed\") */\n readonly eventName: string;\n\n /** Business payload from publisher transformation */\n readonly payload: Record<string, unknown>;\n\n /** Event metadata */\n readonly metadata: DomainEventMetadata;\n\n /** Original step execution result */\n readonly executionResult: StepResult;\n}\n\n/**\n * Metadata attached to every domain event.\n */\nexport interface DomainEventMetadata {\n /** Task UUID */\n readonly taskUuid: string;\n\n /** Step UUID */\n readonly stepUuid: string;\n\n /** Step name */\n readonly stepName?: string;\n\n /** Namespace */\n readonly namespace: string;\n\n /** Correlation ID for tracing */\n readonly correlationId: string;\n\n /** When the event was fired (ISO8601) */\n readonly firedAt: string;\n\n /** Publisher that created this event */\n readonly publisher?: string;\n\n /** Additional custom metadata */\n readonly [key: string]: unknown;\n}\n\n/**\n * Context passed to the publish() method.\n *\n * Cross-language standard API (TAS-96).\n */\nexport interface PublishContext {\n /** Event name */\n readonly eventName: string;\n\n /** Step result */\n readonly stepResult: StepResult;\n\n /** Event declaration from YAML */\n readonly eventDeclaration?: EventDeclaration;\n\n /** Step execution context */\n readonly stepContext?: StepEventContext;\n}\n\n// ---------------------------------------------------------------------------\n// BasePublisher\n// ---------------------------------------------------------------------------\n\n/**\n * Abstract base class for custom domain event publishers.\n *\n * Publishers transform step execution results into business events.\n * They are declared in YAML via the `publisher:` field and registered\n * at bootstrap time.\n *\n * NOTE: Publishers don't call publish APIs directly. They transform data\n * that Rust orchestration publishes.\n *\n * @example\n * ```typescript\n * class PaymentEventPublisher extends BasePublisher {\n * readonly publisherName = 'PaymentEventPublisher';\n *\n * transformPayload(stepResult: StepResult, eventDecl?: EventDeclaration): Record<string, unknown> {\n * const result = stepResult.result ?? {};\n * return {\n * transactionId: result.transaction_id,\n * amount: result.amount,\n * currency: result.currency ?? 'USD',\n * status: stepResult.success ? 'succeeded' : 'failed',\n * };\n * }\n *\n * shouldPublish(stepResult: StepResult): boolean {\n * return stepResult.success && stepResult.result?.transaction_id != null;\n * }\n * }\n * ```\n */\nexport abstract class BasePublisher {\n protected readonly logger: Logger = log;\n\n /**\n * Publisher name for registry lookup.\n * Must match the `publisher:` field in YAML.\n */\n abstract readonly publisherName: string;\n\n /**\n * Transform step result into business event payload.\n *\n * Override to customize the event payload for your domain.\n * Default returns the step result as-is.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns Business event payload to publish\n */\n transformPayload(\n stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): Record<string, unknown> {\n return stepResult.result ?? {};\n }\n\n /**\n * Determine if this event should be published.\n *\n * Override to add custom conditions beyond YAML's `condition:` field.\n * The YAML condition is evaluated first by Rust orchestration.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns true if the event should be published\n */\n shouldPublish(\n _stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): boolean {\n return true;\n }\n\n /**\n * Add additional metadata to the event.\n *\n * Override to add custom metadata fields.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns Additional metadata to merge into event metadata\n */\n additionalMetadata(\n _stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): Record<string, unknown> {\n return {};\n }\n\n /**\n * Hook called before publishing.\n *\n * Override for pre-publish validation, logging, or metrics.\n * Return false to prevent publishing.\n *\n * @param eventName - The event name\n * @param payload - The transformed payload\n * @param metadata - The event metadata\n * @returns true to continue, false to skip publishing\n */\n beforePublish(\n eventName: string,\n _payload: Record<string, unknown>,\n _metadata: Record<string, unknown>\n ): boolean {\n this.logger.debug({ eventName }, 'Publishing event');\n return true;\n }\n\n /**\n * Hook called after successful publishing.\n *\n * Override for post-publish logging, metrics, or cleanup.\n *\n * @param eventName - The event name\n * @param payload - The transformed payload\n * @param metadata - The event metadata\n */\n afterPublish(\n eventName: string,\n _payload: Record<string, unknown>,\n _metadata: Record<string, unknown>\n ): void {\n this.logger.debug({ eventName }, 'Event published');\n }\n\n /**\n * Hook called if publishing fails.\n *\n * Override for error handling, logging, or fallback behavior.\n *\n * @param eventName - The event name\n * @param error - The error that occurred\n * @param payload - The transformed payload\n */\n onPublishError(eventName: string, error: Error, _payload: Record<string, unknown>): void {\n this.logger.error({ eventName, error: error.message }, 'Failed to publish event');\n }\n\n /**\n * Cross-language standard: Publish an event with unified context.\n *\n * Coordinates the lifecycle hooks into a single publish call.\n *\n * @param ctx - Publish context containing all required data\n * @returns true if event was published, false if skipped\n */\n publish(ctx: PublishContext): boolean {\n const { eventName, stepResult, eventDeclaration, stepContext } = ctx;\n\n // Check publishing conditions\n if (!this.shouldPublish(stepResult, eventDeclaration, stepContext)) {\n return false;\n }\n\n // Transform payload\n const payload = this.transformPayload(stepResult, eventDeclaration, stepContext);\n\n // Build metadata\n const baseMetadata: Record<string, unknown> = {\n publisher: this.publisherName,\n publishedAt: new Date().toISOString(),\n };\n\n // Add step context info if available\n if (stepContext) {\n baseMetadata.taskUuid = stepContext.taskUuid;\n baseMetadata.stepUuid = stepContext.stepUuid;\n baseMetadata.stepName = stepContext.stepName;\n baseMetadata.namespace = stepContext.namespace;\n }\n\n const metadata = {\n ...baseMetadata,\n ...this.additionalMetadata(stepResult, eventDeclaration, stepContext),\n };\n\n try {\n // Pre-publish hook (can abort)\n if (!this.beforePublish(eventName, payload, metadata)) {\n return false;\n }\n\n // Actual publishing is handled by Rust orchestration\n // This method just prepares and validates the event\n\n // Post-publish hook\n this.afterPublish(eventName, payload, metadata);\n\n return true;\n } catch (error) {\n this.onPublishError(\n eventName,\n error instanceof Error ? error : new Error(String(error)),\n payload\n );\n return false;\n }\n }\n}\n\n/**\n * Default publisher that passes step result through unchanged.\n */\nexport class DefaultPublisher extends BasePublisher {\n readonly publisherName = 'default';\n\n transformPayload(stepResult: StepResult): Record<string, unknown> {\n return stepResult.result ?? {};\n }\n}\n\n// ---------------------------------------------------------------------------\n// BaseSubscriber\n// ---------------------------------------------------------------------------\n\n/**\n * Static interface for subscriber classes (for type checking).\n */\nexport interface SubscriberClass {\n /** Patterns to subscribe to */\n subscribesTo(): string[];\n\n /** Constructor */\n new (): BaseSubscriber;\n}\n\n/**\n * Abstract base class for domain event subscribers.\n *\n * Subscribers handle fast (in-process) domain events for internal processing.\n * They subscribe to event patterns and receive events via the InProcessEventBus.\n *\n * @example\n * ```typescript\n * class MetricsSubscriber extends BaseSubscriber {\n * static subscribesTo(): string[] {\n * return ['*']; // All events\n * }\n *\n * handle(event: DomainEvent): void {\n * metrics.increment(`domain_events.${event.eventName.replace('.', '_')}`);\n * }\n * }\n *\n * class PaymentSubscriber extends BaseSubscriber {\n * static subscribesTo(): string[] {\n * return ['payment.*']; // Only payment events\n * }\n *\n * handle(event: DomainEvent): void {\n * if (event.eventName === 'payment.processed') {\n * notifyAccounting(event.payload);\n * }\n * }\n * }\n * ```\n */\nexport abstract class BaseSubscriber {\n protected readonly logger: Logger = log;\n private _active = false;\n private _subscriptions: string[] = [];\n\n /**\n * Event patterns to subscribe to.\n *\n * Override this static method to declare patterns.\n * Supports wildcards: \"*\" matches all, \"payment.*\" matches payment.processed, etc.\n *\n * @returns Array of event patterns\n */\n static subscribesTo(): string[] {\n return ['*'];\n }\n\n /**\n * Check if the subscriber is active.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * Get subscribed patterns.\n */\n get subscriptions(): readonly string[] {\n return this._subscriptions;\n }\n\n /**\n * Handle a domain event.\n *\n * Subclasses MUST implement this method.\n *\n * @param event - The domain event to handle\n */\n abstract handle(event: DomainEvent): void | Promise<void>;\n\n /**\n * Hook called before handling an event.\n *\n * Override for pre-processing, validation, or filtering.\n * Return false to skip handling this event.\n *\n * @param event - The domain event\n * @returns true to continue handling, false to skip\n */\n beforeHandle(_event: DomainEvent): boolean {\n return true;\n }\n\n /**\n * Hook called after successful handling.\n *\n * Override for post-processing, metrics, or cleanup.\n *\n * @param event - The domain event\n */\n afterHandle(_event: DomainEvent): void {\n // Default: no-op\n }\n\n /**\n * Hook called if handling fails.\n *\n * Override for custom error handling, alerts, or retry logic.\n * Note: Domain events use fire-and-forget semantics.\n *\n * @param event - The domain event\n * @param error - The error that occurred\n */\n onHandleError(event: DomainEvent, error: Error): void {\n this.logger.error(\n { eventName: event.eventName, error: error.message },\n `${this.constructor.name}: Failed to handle event`\n );\n }\n\n /**\n * Check if this subscriber matches an event name.\n *\n * Supports wildcard patterns:\n * - \"*\" matches everything\n * - \"payment.*\" matches \"payment.processed\", \"payment.failed\"\n * - \"order.created\" matches exactly \"order.created\"\n *\n * @param eventName - The event name to check\n * @returns true if this subscriber should handle the event\n */\n matches(eventName: string): boolean {\n const ctor = this.constructor as typeof BaseSubscriber;\n const patterns = ctor.subscribesTo();\n\n return patterns.some((pattern) => {\n if (pattern === '*') {\n return true;\n }\n // Convert glob pattern to regex\n const regex = new RegExp(`^${pattern.replace(/\\*/g, '.*')}$`);\n return regex.test(eventName);\n });\n }\n\n /**\n * Start listening for events.\n *\n * Registers with the InProcessDomainEventPoller.\n *\n * @param poller - The event poller to register with\n */\n start(poller: InProcessDomainEventPoller): void {\n if (this._active) {\n return;\n }\n\n this._active = true;\n const ctor = this.constructor as typeof BaseSubscriber;\n const patterns = ctor.subscribesTo();\n\n for (const pattern of patterns) {\n poller.subscribe(pattern, (event) => this.handleEventSafely(event));\n this._subscriptions.push(pattern);\n this.logger.info({ pattern, subscriber: this.constructor.name }, 'Subscribed to pattern');\n }\n\n this.logger.info(\n { subscriber: this.constructor.name, subscriptionCount: this._subscriptions.length },\n 'Subscriber started'\n );\n }\n\n /**\n * Stop listening for events.\n */\n stop(): void {\n if (!this._active) {\n return;\n }\n\n this._active = false;\n this._subscriptions = [];\n this.logger.info({ subscriber: this.constructor.name }, 'Subscriber stopped');\n }\n\n /**\n * Safely handle an event with error capture.\n */\n private async handleEventSafely(event: DomainEvent): Promise<void> {\n if (!this._active) {\n return;\n }\n\n if (!this.beforeHandle(event)) {\n return;\n }\n\n try {\n await this.handle(event);\n this.afterHandle(event);\n } catch (error) {\n this.onHandleError(event, error instanceof Error ? error : new Error(String(error)));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// PublisherRegistry\n// ---------------------------------------------------------------------------\n\n/**\n * Error thrown when a required publisher is not registered.\n */\nexport class PublisherNotFoundError extends Error {\n readonly publisherName: string;\n readonly registeredPublishers: string[];\n\n constructor(name: string, registered: string[]) {\n super(`Publisher '${name}' not found. Registered: ${registered.join(', ')}`);\n this.name = 'PublisherNotFoundError';\n this.publisherName = name;\n this.registeredPublishers = registered;\n }\n}\n\n/**\n * Error thrown when required publishers are missing during validation.\n */\nexport class PublisherValidationError extends Error {\n readonly missingPublishers: string[];\n readonly registeredPublishers: string[];\n\n constructor(missing: string[], registered: string[]) {\n super(`Missing publishers: ${missing.join(', ')}. Registered: ${registered.join(', ')}`);\n this.name = 'PublisherValidationError';\n this.missingPublishers = missing;\n this.registeredPublishers = registered;\n }\n}\n\n/**\n * Error thrown when modifying a frozen registry.\n */\nexport class RegistryFrozenError extends Error {\n constructor() {\n super('Registry is frozen after validation');\n this.name = 'RegistryFrozenError';\n }\n}\n\n/**\n * Error thrown when registering a duplicate publisher.\n */\nexport class DuplicatePublisherError extends Error {\n readonly publisherName: string;\n\n constructor(name: string) {\n super(`Publisher '${name}' is already registered`);\n this.name = 'DuplicatePublisherError';\n this.publisherName = name;\n }\n}\n\n/**\n * Registry for custom domain event publishers.\n *\n * Maps publisher names (from YAML configuration) to their implementations.\n * Publishers are registered at bootstrap time and validated against task templates.\n *\n * @example\n * ```typescript\n * const registry = PublisherRegistry.instance;\n *\n * // Register custom publishers\n * registry.register(new PaymentEventPublisher());\n * registry.register(new InventoryEventPublisher());\n *\n * // Validate against templates\n * registry.validateRequired(['PaymentEventPublisher', 'InventoryEventPublisher']);\n *\n * // Look up publishers\n * const publisher = registry.get('PaymentEventPublisher');\n * ```\n */\nexport class PublisherRegistry {\n private static _instance: PublisherRegistry | null = null;\n\n private readonly publishers = new Map<string, BasePublisher>();\n private readonly defaultPublisher = new DefaultPublisher();\n private frozen = false;\n private readonly logger: Logger = log;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance.\n */\n static get instance(): PublisherRegistry {\n if (!PublisherRegistry._instance) {\n PublisherRegistry._instance = new PublisherRegistry();\n }\n return PublisherRegistry._instance;\n }\n\n /**\n * Register a custom publisher.\n *\n * @param publisher - The publisher instance to register\n * @throws RegistryFrozenError if registry is frozen\n * @throws DuplicatePublisherError if name is already registered\n */\n register(publisher: BasePublisher): void {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n const name = publisher.publisherName;\n\n if (this.publishers.has(name)) {\n throw new DuplicatePublisherError(name);\n }\n\n this.logger.info({ publisherName: name }, 'Registering domain event publisher');\n this.publishers.set(name, publisher);\n }\n\n /**\n * Get a publisher by name.\n *\n * @param name - The publisher name\n * @returns The publisher, or undefined if not found\n */\n get(name: string): BasePublisher | undefined {\n return this.publishers.get(name);\n }\n\n /**\n * Get a publisher by name, or return the default.\n *\n * @param name - The publisher name (optional)\n * @returns The publisher or default\n */\n getOrDefault(name?: string): BasePublisher {\n if (!name || name === 'default') {\n return this.defaultPublisher;\n }\n\n const publisher = this.publishers.get(name);\n if (!publisher) {\n this.logger.warn({ publisherName: name }, 'Publisher not found, using default');\n return this.defaultPublisher;\n }\n\n return publisher;\n }\n\n /**\n * Get a publisher by name (strict mode).\n *\n * @param name - The publisher name\n * @returns The publisher\n * @throws PublisherNotFoundError if not registered\n */\n getStrict(name: string): BasePublisher {\n if (name === 'default') {\n return this.defaultPublisher;\n }\n\n const publisher = this.publishers.get(name);\n if (!publisher) {\n throw new PublisherNotFoundError(name, this.registeredNames);\n }\n\n return publisher;\n }\n\n /**\n * Check if a publisher is registered.\n */\n isRegistered(name: string): boolean {\n return name === 'default' || this.publishers.has(name);\n }\n\n /**\n * Get all registered publisher names.\n */\n get registeredNames(): string[] {\n return Array.from(this.publishers.keys());\n }\n\n /**\n * Get count of registered publishers.\n */\n get count(): number {\n return this.publishers.size;\n }\n\n /**\n * Check if registry is empty.\n */\n get isEmpty(): boolean {\n return this.publishers.size === 0;\n }\n\n /**\n * Check if registry is frozen.\n */\n get isFrozen(): boolean {\n return this.frozen;\n }\n\n /**\n * Unregister a publisher.\n *\n * @throws RegistryFrozenError if registry is frozen\n */\n unregister(name: string): boolean {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n this.logger.info({ publisherName: name }, 'Unregistering domain event publisher');\n return this.publishers.delete(name);\n }\n\n /**\n * Clear all registered publishers.\n *\n * @throws RegistryFrozenError if registry is frozen\n */\n clear(): void {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n this.logger.info('Clearing all domain event publishers');\n this.publishers.clear();\n }\n\n /**\n * Validate that all required publishers are registered.\n *\n * After validation, the registry is frozen.\n *\n * @param requiredPublishers - Publisher names from YAML configs\n * @throws PublisherValidationError if some publishers are missing\n */\n validateRequired(requiredPublishers: string[]): void {\n const missing: string[] = [];\n\n for (const name of requiredPublishers) {\n if (name === 'default') {\n continue;\n }\n if (!this.isRegistered(name)) {\n missing.push(name);\n }\n }\n\n if (missing.length > 0) {\n throw new PublisherValidationError(missing, this.registeredNames);\n }\n\n this.frozen = true;\n this.logger.info({ registeredPublishers: this.registeredNames }, 'Publisher validation passed');\n }\n\n /**\n * Freeze the registry to prevent further changes.\n */\n freeze(): void {\n this.frozen = true;\n this.logger.info('Publisher registry frozen');\n }\n\n /**\n * Reset the registry (for testing).\n */\n reset(): void {\n this.publishers.clear();\n this.frozen = false;\n this.logger.info('Publisher registry reset');\n }\n}\n\n// ---------------------------------------------------------------------------\n// SubscriberRegistry\n// ---------------------------------------------------------------------------\n\n/**\n * Subscriber statistics.\n */\nexport interface SubscriberStats {\n /** Whether subscribers have been started */\n readonly started: boolean;\n\n /** Total subscriber count */\n readonly subscriberCount: number;\n\n /** Number of active subscribers */\n readonly activeCount: number;\n\n /** Individual subscriber info */\n readonly subscribers: ReadonlyArray<{\n readonly className: string;\n readonly active: boolean;\n readonly patterns: readonly string[];\n }>;\n}\n\n/**\n * Registry for domain event subscribers.\n *\n * Manages the lifecycle of subscribers. Subscribers are registered at bootstrap\n * time and started/stopped together with the worker.\n *\n * @example\n * ```typescript\n * const registry = SubscriberRegistry.instance;\n *\n * // Register subscriber classes (instantiation deferred)\n * registry.register(PaymentSubscriber);\n * registry.register(MetricsSubscriber);\n *\n * // Start all subscribers with the poller\n * registry.startAll(poller);\n *\n * // Stop all when shutting down\n * registry.stopAll();\n * ```\n */\nexport class SubscriberRegistry {\n private static _instance: SubscriberRegistry | null = null;\n\n private readonly subscriberClasses: SubscriberClass[] = [];\n private readonly subscribers: BaseSubscriber[] = [];\n private started = false;\n private readonly logger: Logger = log;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance.\n */\n static get instance(): SubscriberRegistry {\n if (!SubscriberRegistry._instance) {\n SubscriberRegistry._instance = new SubscriberRegistry();\n }\n return SubscriberRegistry._instance;\n }\n\n /**\n * Register a subscriber class.\n *\n * The class will be instantiated when startAll() is called.\n *\n * @param subscriberClass - A subclass of BaseSubscriber\n */\n register(subscriberClass: SubscriberClass): void {\n this.logger.info(\n { subscriberClass: subscriberClass.name },\n 'SubscriberRegistry: Registered subscriber class'\n );\n this.subscriberClasses.push(subscriberClass);\n }\n\n /**\n * Register a subscriber instance directly.\n *\n * Use this when your subscriber needs custom initialization.\n *\n * @param subscriber - A subscriber instance\n */\n registerInstance(subscriber: BaseSubscriber): void {\n this.logger.info(\n { subscriberClass: subscriber.constructor.name },\n 'SubscriberRegistry: Registered subscriber instance'\n );\n this.subscribers.push(subscriber);\n }\n\n /**\n * Start all registered subscribers.\n *\n * @param poller - The event poller to register subscribers with\n */\n startAll(poller: InProcessDomainEventPoller): void {\n if (this.started) {\n return;\n }\n\n // Instantiate registered classes\n for (const SubscriberClass of this.subscriberClasses) {\n try {\n const instance = new SubscriberClass();\n this.subscribers.push(instance);\n } catch (error) {\n this.logger.error(\n { subscriberClass: SubscriberClass.name, error: String(error) },\n 'Failed to instantiate subscriber'\n );\n }\n }\n\n // Start all subscribers\n for (const subscriber of this.subscribers) {\n try {\n subscriber.start(poller);\n } catch (error) {\n this.logger.error(\n { subscriberClass: subscriber.constructor.name, error: String(error) },\n 'Failed to start subscriber'\n );\n }\n }\n\n this.started = true;\n this.logger.info(\n { subscriberCount: this.subscribers.length },\n 'SubscriberRegistry: Started all subscribers'\n );\n }\n\n /**\n * Stop all subscribers.\n */\n stopAll(): void {\n if (!this.started) {\n return;\n }\n\n for (const subscriber of this.subscribers) {\n try {\n subscriber.stop();\n } catch (error) {\n this.logger.error(\n { subscriberClass: subscriber.constructor.name, error: String(error) },\n 'Failed to stop subscriber'\n );\n }\n }\n\n this.started = false;\n this.logger.info('SubscriberRegistry: Stopped all subscribers');\n }\n\n /**\n * Check if subscribers have been started.\n */\n get isStarted(): boolean {\n return this.started;\n }\n\n /**\n * Get count of registered subscribers (classes + instances).\n */\n get count(): number {\n return this.subscriberClasses.length + this.subscribers.length;\n }\n\n /**\n * Get subscriber statistics.\n */\n get stats(): SubscriberStats {\n return {\n started: this.started,\n subscriberCount: this.subscribers.length,\n activeCount: this.subscribers.filter((s) => s.active).length,\n subscribers: this.subscribers.map((s) => ({\n className: s.constructor.name,\n active: s.active,\n patterns: (s.constructor as typeof BaseSubscriber).subscribesTo(),\n })),\n };\n }\n\n /**\n * Reset the registry (for testing).\n */\n reset(): void {\n this.stopAll();\n this.subscribers.length = 0;\n this.subscriberClasses.length = 0;\n this.started = false;\n this.logger.info('SubscriberRegistry: Reset');\n }\n}\n\n// ---------------------------------------------------------------------------\n// InProcessDomainEventPoller\n// ---------------------------------------------------------------------------\n\n/**\n * Callback type for domain event handlers.\n */\nexport type DomainEventCallback = (event: DomainEvent) => void | Promise<void>;\n\n/**\n * Error callback type for domain event processing.\n */\nexport type DomainEventErrorCallback = (error: Error) => void;\n\n/**\n * Poller statistics.\n */\nexport interface PollerStats {\n /** Total poll cycles */\n readonly pollCount: number;\n\n /** Total events processed */\n readonly eventsProcessed: number;\n\n /** Events that lagged (couldn't keep up) */\n readonly eventsLagged: number;\n\n /** Whether the poller is running */\n readonly running: boolean;\n}\n\n/**\n * Poller configuration.\n */\nexport interface DomainEventPollerConfig {\n /** Polling interval in milliseconds (default: 10) */\n readonly pollIntervalMs?: number;\n\n /** Maximum events per poll cycle (default: 100) */\n readonly maxEventsPerPoll?: number;\n}\n\n/**\n * In-process domain event poller.\n *\n * Polls for fast domain events from the Rust broadcast channel and\n * dispatches them to registered subscribers.\n *\n * Threading Model:\n * - Main Thread: TypeScript application, event handlers\n * - Poll Loop: Async timer-based polling\n * - Rust: Rust worker runtime (separate from TypeScript)\n *\n * @example\n * ```typescript\n * const poller = new InProcessDomainEventPoller({\n * pollIntervalMs: 10,\n * maxEventsPerPoll: 100,\n * });\n *\n * // Subscribe to patterns\n * poller.subscribe('payment.*', (event) => {\n * console.log('Payment event:', event.eventName);\n * });\n *\n * // Start polling\n * poller.start();\n *\n * // Stop when done\n * poller.stop();\n * ```\n */\nexport class InProcessDomainEventPoller {\n private readonly pollIntervalMs: number;\n private readonly maxEventsPerPoll: number;\n private running = false;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly logger: Logger = log;\n\n // Callbacks\n private readonly subscriptions = new Map<string, DomainEventCallback[]>();\n private readonly errorCallbacks: DomainEventErrorCallback[] = [];\n\n // Stats\n private pollCount = 0;\n private eventsProcessed = 0;\n private eventsLagged = 0;\n\n // FFI function reference (set when FFI layer is available)\n private pollFn: (() => DomainEvent | null) | null = null;\n\n constructor(config: DomainEventPollerConfig = {}) {\n this.pollIntervalMs = config.pollIntervalMs ?? 10;\n this.maxEventsPerPoll = config.maxEventsPerPoll ?? 100;\n }\n\n /**\n * Set the FFI poll function.\n *\n * This must be called before start() to enable actual polling.\n * Without it, the poller runs in \"dry\" mode (for testing).\n *\n * @param pollFn - Function that polls for events from Rust\n */\n setPollFunction(pollFn: () => DomainEvent | null): void {\n this.pollFn = pollFn;\n }\n\n /**\n * Subscribe to events matching a pattern.\n *\n * @param pattern - Event pattern (e.g., \"*\", \"payment.*\")\n * @param callback - Function to call when events match\n */\n subscribe(pattern: string, callback: DomainEventCallback): void {\n const callbacks = this.subscriptions.get(pattern) ?? [];\n callbacks.push(callback);\n this.subscriptions.set(pattern, callbacks);\n\n this.logger.debug({ pattern }, 'Subscribed to pattern');\n }\n\n /**\n * Unsubscribe from a pattern.\n *\n * @param pattern - The pattern to unsubscribe from\n */\n unsubscribe(pattern: string): void {\n this.subscriptions.delete(pattern);\n this.logger.debug({ pattern }, 'Unsubscribed from pattern');\n }\n\n /**\n * Register an error callback.\n */\n onError(callback: DomainEventErrorCallback): void {\n this.errorCallbacks.push(callback);\n }\n\n /**\n * Start the polling loop.\n */\n start(): void {\n if (this.running) {\n this.logger.warn('InProcessDomainEventPoller already running');\n return;\n }\n\n this.running = true;\n this.logger.info({ pollIntervalMs: this.pollIntervalMs }, 'InProcessDomainEventPoller started');\n\n this.schedulePoll();\n }\n\n /**\n * Stop the polling loop.\n */\n stop(): void {\n if (!this.running) {\n return;\n }\n\n this.running = false;\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n this.logger.info(\n { eventsProcessed: this.eventsProcessed, eventsLagged: this.eventsLagged },\n 'InProcessDomainEventPoller stopped'\n );\n }\n\n /**\n * Check if the poller is running.\n */\n get isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get poller statistics.\n */\n get stats(): PollerStats {\n return {\n pollCount: this.pollCount,\n eventsProcessed: this.eventsProcessed,\n eventsLagged: this.eventsLagged,\n running: this.running,\n };\n }\n\n /**\n * Schedule the next poll cycle.\n */\n private schedulePoll(): void {\n if (!this.running) {\n return;\n }\n\n this.pollTimer = setTimeout(() => {\n this.pollCycle().catch((error) => {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n });\n }, this.pollIntervalMs);\n }\n\n /**\n * Execute a poll cycle.\n */\n private async pollCycle(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n this.pollCount++;\n let eventsThisCycle = 0;\n\n try {\n // Poll for events (up to max per cycle)\n while (eventsThisCycle < this.maxEventsPerPoll) {\n const event = this.pollFn?.();\n\n if (!event) {\n break; // No more events\n }\n\n await this.dispatchEvent(event);\n eventsThisCycle++;\n this.eventsProcessed++;\n }\n\n // Check for lag (if we hit max, there might be more)\n if (eventsThisCycle >= this.maxEventsPerPoll) {\n this.eventsLagged++;\n this.logger.warn(\n { maxEventsPerPoll: this.maxEventsPerPoll },\n 'Event poller may be lagging'\n );\n }\n } catch (error) {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n\n // Schedule next cycle\n this.schedulePoll();\n }\n\n /**\n * Dispatch an event to matching subscribers.\n */\n private async dispatchEvent(event: DomainEvent): Promise<void> {\n this.logger.debug(\n { eventId: event.eventId, eventName: event.eventName },\n 'Dispatching domain event'\n );\n\n for (const [pattern, callbacks] of this.subscriptions) {\n if (this.matchesPattern(event.eventName, pattern)) {\n for (const callback of callbacks) {\n try {\n await callback(event);\n } catch (error) {\n this.logger.error(\n { eventName: event.eventName, pattern, error: String(error) },\n 'Subscriber callback error'\n );\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n }\n }\n }\n\n /**\n * Check if an event name matches a pattern.\n */\n private matchesPattern(eventName: string, pattern: string): boolean {\n if (pattern === '*') {\n return true;\n }\n const regex = new RegExp(`^${pattern.replace(/\\*/g, '.*')}$`);\n return regex.test(eventName);\n }\n\n /**\n * Emit an error to registered callbacks.\n */\n private emitError(error: Error): void {\n for (const callback of this.errorCallbacks) {\n try {\n callback(error);\n } catch {\n // Ignore errors in error callbacks\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory Functions\n// ---------------------------------------------------------------------------\n\n/**\n * Create a StepEventContext from step data.\n *\n * @param data - Raw step context data\n * @returns StepEventContext\n */\nexport function createStepEventContext(data: {\n taskUuid: string;\n stepUuid: string;\n stepName: string;\n namespace?: string;\n correlationId?: string;\n result?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}): StepEventContext {\n const base = {\n taskUuid: data.taskUuid,\n stepUuid: data.stepUuid,\n stepName: data.stepName,\n namespace: data.namespace ?? 'default',\n correlationId: data.correlationId ?? data.taskUuid,\n metadata: data.metadata ?? {},\n };\n\n // Handle optional result property correctly for exactOptionalPropertyTypes\n if (data.result !== undefined) {\n return { ...base, result: data.result };\n }\n\n return base;\n}\n\n/**\n * Create a DomainEvent from raw data.\n *\n * @param data - Raw event data\n * @returns DomainEvent\n */\nexport function createDomainEvent(data: {\n eventId: string;\n eventName: string;\n payload: Record<string, unknown>;\n metadata: Record<string, unknown>;\n executionResult: StepResult;\n}): DomainEvent {\n return {\n eventId: data.eventId,\n eventName: data.eventName,\n payload: data.payload,\n metadata: data.metadata as DomainEventMetadata,\n executionResult: data.executionResult,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FFI Domain Event Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Transform an FfiDomainEvent to a DomainEvent.\n *\n * The FFI domain event has a simpler structure than the full DomainEvent.\n * This function converts between them, synthesizing missing fields.\n *\n * @param ffiEvent - Event from FFI poll_in_process_events\n * @returns DomainEvent suitable for subscribers\n */\nexport function ffiEventToDomainEvent(ffiEvent: FfiDomainEvent): DomainEvent {\n // Build metadata with conditional optional fields (exactOptionalPropertyTypes)\n const metadata: DomainEventMetadata = {\n taskUuid: ffiEvent.metadata.taskUuid,\n stepUuid: ffiEvent.metadata.stepUuid ?? '',\n namespace: ffiEvent.metadata.namespace,\n correlationId: ffiEvent.metadata.correlationId,\n firedAt: ffiEvent.metadata.firedAt,\n eventVersion: ffiEvent.eventVersion,\n // Conditionally spread optional fields\n ...(ffiEvent.metadata.stepName !== null ? { stepName: ffiEvent.metadata.stepName } : {}),\n ...(ffiEvent.metadata.firedBy !== null ? { publisher: ffiEvent.metadata.firedBy } : {}),\n };\n\n return {\n eventId: ffiEvent.eventId,\n eventName: ffiEvent.eventName,\n payload: ffiEvent.payload,\n metadata,\n // FFI events don't include execution result - synthesize a placeholder\n executionResult: {\n success: true,\n result: ffiEvent.payload,\n },\n };\n}\n\n/**\n * Create an FFI poll function adapter for InProcessDomainEventPoller.\n *\n * This function wraps the runtime's pollInProcessEvents() to return\n * DomainEvent objects that the poller expects.\n *\n * @param runtime - The FFI runtime instance\n * @returns A poll function that returns DomainEvent | null\n *\n * @example\n * ```typescript\n * const poller = new InProcessDomainEventPoller();\n * poller.setPollFunction(createFfiPollAdapter(runtime));\n * poller.start();\n * ```\n */\nexport function createFfiPollAdapter(runtime: TaskerRuntime): () => DomainEvent | null {\n return () => {\n const ffiEvent = runtime.pollInProcessEvents();\n if (ffiEvent === null) {\n return null;\n }\n return ffiEventToDomainEvent(ffiEvent);\n };\n}\n","/**\n * TAS-93: Error types for resolver chain.\n */\n\n/**\n * Base error class for resolution errors.\n */\nexport class ResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ResolutionError';\n }\n}\n\n/**\n * Error thrown when a specified resolver is not found.\n */\nexport class ResolverNotFoundError extends ResolutionError {\n readonly resolverName: string;\n\n constructor(resolverName: string) {\n super(`Resolver not found: '${resolverName}'`);\n this.name = 'ResolverNotFoundError';\n this.resolverName = resolverName;\n }\n}\n\n/**\n * Error thrown when no resolver can handle a callable.\n */\nexport class NoResolverMatchError extends ResolutionError {\n readonly callable: string;\n readonly triedResolvers: string[];\n\n constructor(callable: string, triedResolvers: string[]) {\n const tried = triedResolvers.length > 0 ? triedResolvers.join(', ') : 'none';\n super(`No resolver could resolve callable '${callable}'. Tried: ${tried}`);\n this.name = 'NoResolverMatchError';\n this.callable = callable;\n this.triedResolvers = triedResolvers;\n }\n}\n\n/**\n * Error thrown when method dispatch fails.\n */\nexport class MethodDispatchError extends ResolutionError {\n readonly handlerName: string;\n readonly methodName: string;\n\n constructor(handlerName: string, methodName: string) {\n super(`Handler '${handlerName}' does not have method '${methodName}'`);\n this.name = 'MethodDispatchError';\n this.handlerName = handlerName;\n this.methodName = methodName;\n }\n}\n","/**\n * TAS-93: Handler definition type for resolver chain.\n *\n * Represents the configuration for a step handler, including:\n * - callable: The handler address/identifier\n * - method: Optional method to invoke (defaults to \"call\")\n * - resolver: Optional resolver hint to bypass chain\n * - initialization: Optional configuration passed to handler\n *\n * @example\n * ```typescript\n * const definition: HandlerDefinition = {\n * callable: 'payment_handler',\n * method: 'refund',\n * resolver: 'explicit_mapping',\n * initialization: { apiKey: 'secret' },\n * };\n *\n * // Check if method dispatch is needed\n * if (usesMethodDispatch(definition)) {\n * // Wrap handler for method dispatch\n * }\n * ```\n */\n\nimport type { HandlerDefinitionDto } from '../ffi/generated/HandlerDefinitionDto.js';\n\n/**\n * Handler definition with resolution metadata.\n */\nexport interface HandlerDefinition {\n /** The handler address/identifier (required) */\n callable: string;\n\n /** Method to invoke on the handler (defaults to \"call\") */\n method?: string | null;\n\n /** Resolver hint to bypass chain resolution */\n resolver?: string | null;\n\n /** Initialization configuration passed to handler */\n initialization?: Record<string, unknown>;\n}\n\n/**\n * Get the effective method to invoke.\n *\n * @param definition - Handler definition\n * @returns The method name (defaults to \"call\")\n */\nexport function effectiveMethod(definition: HandlerDefinition): string {\n // Handle null, undefined, and empty string\n if (!definition.method || definition.method.length === 0) {\n return 'call';\n }\n return definition.method;\n}\n\n/**\n * Check if method dispatch is needed.\n *\n * Returns true if a non-default method is specified.\n *\n * @param definition - Handler definition\n * @returns True if method dispatch wrapper is needed\n */\nexport function usesMethodDispatch(definition: HandlerDefinition): boolean {\n // Handle null, undefined, empty string, and 'call'\n if (!definition.method || definition.method.length === 0) {\n return false;\n }\n return definition.method !== 'call';\n}\n\n/**\n * Check if a resolver hint is provided.\n *\n * @param definition - Handler definition\n * @returns True if resolver hint should be used\n */\nexport function hasResolverHint(definition: HandlerDefinition): boolean {\n return definition.resolver != null && definition.resolver.length > 0;\n}\n\n/**\n * Create a HandlerDefinition from a callable string.\n *\n * @param callable - Handler callable string\n * @returns HandlerDefinition with defaults\n */\nexport function fromCallable(callable: string): HandlerDefinition {\n return {\n callable,\n method: null,\n resolver: null,\n initialization: {},\n };\n}\n\n/**\n * Create a HandlerDefinition from FFI DTO.\n *\n * Maps Rust field names to TypeScript:\n * - Rust uses 'method' field (matches our interface)\n *\n * @param dto - FFI handler definition DTO\n * @returns HandlerDefinition\n */\nexport function fromDto(dto: HandlerDefinitionDto | null | undefined): HandlerDefinition {\n if (!dto) {\n return {\n callable: '',\n method: null,\n resolver: null,\n initialization: {},\n };\n }\n\n // FFI DTO may have method and resolver fields\n const dtoRecord = dto as Record<string, unknown>;\n const method = dtoRecord.method as string | null | undefined;\n const resolver = dtoRecord.resolver as string | null | undefined;\n\n return {\n callable: dto.callable ?? '',\n // Convert undefined to null for exactOptionalPropertyTypes compatibility\n method: method ?? null,\n resolver: resolver ?? null,\n initialization: dto.initialization ?? {},\n };\n}\n\n/**\n * Type alias for handler specification input.\n *\n * Accepts:\n * - string: Simple callable name\n * - HandlerDefinition: Full definition with method/resolver\n * - HandlerDefinitionDto: FFI DTO from Rust\n */\nexport type HandlerSpec = string | HandlerDefinition | HandlerDefinitionDto;\n\n/**\n * Normalize any handler spec to HandlerDefinition.\n *\n * @param spec - Handler specification (string, definition, or DTO)\n * @returns Normalized HandlerDefinition\n */\nexport function normalizeToDefinition(spec: HandlerSpec): HandlerDefinition {\n if (typeof spec === 'string') {\n return fromCallable(spec);\n }\n\n // Check if it's already a HandlerDefinition (has method/resolver properties)\n if ('method' in spec || 'resolver' in spec) {\n return spec as HandlerDefinition;\n }\n\n // Assume it's a DTO\n return fromDto(spec as HandlerDefinitionDto);\n}\n","/**\n * TAS-93: Method dispatch wrapper for step handlers.\n *\n * Wraps a handler to redirect .call() invocations to a specified method.\n * This enables the `handler_method` field to work transparently.\n *\n * @example\n * ```typescript\n * class PaymentHandler extends StepHandler {\n * static handlerName = 'payment_handler';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * return this.success({ action: 'default' });\n * }\n *\n * async refund(context: StepContext): Promise<StepHandlerResult> {\n * return this.success({ action: 'refund' });\n * }\n * }\n *\n * // Without wrapper: handler.call(ctx) returns { action: 'default' }\n * // With wrapper:\n * const wrapped = new MethodDispatchWrapper(handler, 'refund');\n * await wrapped.call(ctx); // returns { action: 'refund' }\n * ```\n */\n\nimport type { ExecutableHandler, StepHandler } from '../handler/base.js';\nimport type { StepContext } from '../types/step-context.js';\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { MethodDispatchError } from './errors.js';\n\n/**\n * Wrapper that redirects .call() to a specified method.\n *\n * Implements ExecutableHandler to be type-safe when used in place of\n * a regular StepHandler. This avoids unsafe type casting while providing\n * the same public interface.\n */\nexport class MethodDispatchWrapper implements ExecutableHandler {\n /** The wrapped handler instance */\n readonly handler: StepHandler;\n\n /** The method to invoke instead of call() */\n readonly targetMethod: string;\n\n /** The bound method function */\n private readonly boundMethod: (context: StepContext) => Promise<StepHandlerResult>;\n\n /**\n * Create a new method dispatch wrapper.\n *\n * @param handler - The handler to wrap\n * @param targetMethod - The method name to invoke\n * @throws MethodDispatchError if handler doesn't have the method\n */\n constructor(handler: StepHandler, targetMethod: string) {\n this.handler = handler;\n this.targetMethod = targetMethod;\n\n // Validate method exists on handler\n const method = (handler as unknown as Record<string, unknown>)[targetMethod];\n if (typeof method !== 'function') {\n throw new MethodDispatchError(handler.name, targetMethod);\n }\n\n // Bind the method to the handler\n this.boundMethod = method.bind(handler) as (context: StepContext) => Promise<StepHandlerResult>;\n }\n\n /**\n * Get the handler name.\n * Delegates to wrapped handler.\n */\n get name(): string {\n return this.handler.name;\n }\n\n /**\n * Get the handler version.\n * Delegates to wrapped handler.\n */\n get version(): string {\n return this.handler.version;\n }\n\n /**\n * Get the handler capabilities.\n * Delegates to wrapped handler.\n */\n get capabilities(): string[] {\n return this.handler.capabilities;\n }\n\n /**\n * Execute the step by calling the target method.\n *\n * @param context - Step execution context\n * @returns Handler result from the target method\n */\n async call(context: StepContext): Promise<StepHandlerResult> {\n return this.boundMethod(context);\n }\n\n /**\n * Get config schema from wrapped handler.\n */\n configSchema(): Record<string, unknown> | null {\n return this.handler.configSchema();\n }\n\n /**\n * Get the unwrapped handler.\n *\n * Useful for testing and debugging.\n *\n * @returns The original handler instance\n */\n unwrap(): StepHandler {\n return this.handler;\n }\n\n /**\n * String representation for debugging.\n */\n toString(): string {\n return `MethodDispatchWrapper(handler=${this.handler.name}, method=${this.targetMethod})`;\n }\n}\n","/**\n * TAS-93: Developer-friendly base class for custom resolvers.\n *\n * Provides pattern and prefix matching capabilities for implementing\n * custom domain-specific resolvers.\n *\n * @example\n * ```typescript\n * class PaymentResolver extends RegistryResolver {\n * static readonly _name = 'payment_resolver';\n * static readonly _priority = 20;\n * static readonly pattern = /^payments:(?<provider>\\w+):(?<action>\\w+)$/;\n *\n * async resolveHandler(\n * definition: HandlerDefinition,\n * match: RegExpMatchArray | null\n * ): Promise<StepHandler | null> {\n * if (!match?.groups) return null;\n *\n * const { provider, action } = match.groups;\n * return PaymentHandlers.get(provider, action);\n * }\n * }\n *\n * // Register with chain\n * chain.addResolver(new PaymentResolver());\n *\n * // Resolves: { callable: 'payments:stripe:refund' }\n * ```\n */\n\nimport type { StepHandler } from '../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from './base-resolver.js';\nimport type { HandlerDefinition } from './handler-definition.js';\n\n/**\n * Static configuration for RegistryResolver subclasses.\n */\nexport interface RegistryResolverStatic {\n /** Resolver name (required) */\n readonly _name: string;\n\n /** Priority in chain (default: 50) */\n readonly _priority?: number;\n\n /** Regex pattern to match callables (optional) */\n readonly pattern?: RegExp;\n\n /** String prefix to match callables (optional) */\n readonly prefix?: string;\n}\n\n/**\n * Developer-friendly base class for custom resolvers.\n *\n * Subclasses should:\n * 1. Set static `_name` and optionally `_priority`\n * 2. Set static `pattern` or `prefix` for matching\n * 3. Implement `resolveHandler()` for resolution logic\n */\nexport abstract class RegistryResolver implements BaseResolver {\n /**\n * Get the resolver name from static property.\n */\n get name(): string {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n return ctor._name ?? 'custom_resolver';\n }\n\n /**\n * Get the resolver priority from static property.\n */\n get priority(): number {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n return ctor._priority ?? 50;\n }\n\n /**\n * Check if this resolver can handle the definition.\n *\n * Uses pattern or prefix matching from static properties.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if callable matches\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n const callable = definition.callable;\n\n if (ctor.pattern) {\n return ctor.pattern.test(callable);\n }\n\n if (ctor.prefix) {\n return callable.startsWith(ctor.prefix);\n }\n\n return false;\n }\n\n /**\n * Resolve the handler.\n *\n * Delegates to resolveHandler() with pattern match if applicable.\n *\n * @param definition - Handler definition\n * @param config - Resolver configuration\n * @returns Handler instance or null\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n const match = ctor.pattern ? definition.callable.match(ctor.pattern) : null;\n\n return this.resolveHandler(definition, match, config);\n }\n\n /**\n * Override this in subclasses for custom resolution logic.\n *\n * @param definition - Handler definition\n * @param match - Regex match result (if pattern was used)\n * @param config - Resolver configuration\n * @returns Handler instance or null\n */\n abstract resolveHandler(\n definition: HandlerDefinition,\n match: RegExpMatchArray | null,\n config?: ResolverConfig\n ): Promise<StepHandler | null>;\n}\n","/**\n * TAS-93: Resolver chain for step handler resolution.\n *\n * Orchestrates multiple resolvers in priority order to find handlers.\n * Supports resolver hints to bypass the chain and method dispatch wrapping.\n *\n * @example\n * ```typescript\n * // Create chain with default resolvers\n * const chain = ResolverChain.default();\n *\n * // Register a handler\n * const explicit = chain.getResolver('explicit_mapping') as ExplicitMappingResolver;\n * explicit.register('my_handler', MyHandler);\n *\n * // Resolve handler\n * const definition: HandlerDefinition = { callable: 'my_handler' };\n * const handler = await chain.resolve(definition);\n *\n * // Resolve with method dispatch\n * const definition2: HandlerDefinition = {\n * callable: 'my_handler',\n * method: 'process',\n * };\n * const handler2 = await chain.resolve(definition2);\n * // handler2.call() will invoke handler.process()\n * ```\n */\n\nimport type { ExecutableHandler, StepHandler } from '../handler/base.js';\nimport { createLogger } from '../logging/index.js';\nimport type { BaseResolver, ResolverConfig } from './base-resolver.js';\nimport { ResolverNotFoundError } from './errors.js';\nimport {\n effectiveMethod,\n type HandlerDefinition,\n hasResolverHint,\n usesMethodDispatch,\n} from './handler-definition.js';\nimport { MethodDispatchWrapper } from './method-dispatch-wrapper.js';\n\nconst log = createLogger({ component: 'resolver-chain' });\n\n// Lazy imports to avoid circular dependencies - uses Promise caching for thread safety\nlet defaultChainPromise: Promise<ResolverChain> | null = null;\n\n/**\n * Priority-ordered chain of resolvers for handler resolution.\n */\nexport class ResolverChain {\n private resolvers: BaseResolver[] = [];\n private resolversByName: Map<string, BaseResolver> = new Map();\n\n /**\n * Create a resolver chain with default resolvers.\n *\n * Default resolvers:\n * - ExplicitMappingResolver (priority 10)\n * - ClassLookupResolver (priority 100)\n *\n * Note: Uses Promise caching to prevent race conditions when called\n * concurrently. Multiple callers will receive the same chain instance.\n *\n * @returns Configured resolver chain\n */\n static default(): Promise<ResolverChain> {\n // Use Promise caching to prevent race conditions on concurrent calls\n if (!defaultChainPromise) {\n defaultChainPromise = ResolverChain.createDefaultChain();\n }\n return defaultChainPromise;\n }\n\n /**\n * Reset the default chain (for testing only).\n *\n * @internal\n */\n static resetDefault(): void {\n defaultChainPromise = null;\n }\n\n /**\n * Internal method to create the default chain.\n */\n private static async createDefaultChain(): Promise<ResolverChain> {\n const chain = new ResolverChain();\n\n // Lazy load to avoid circular dependencies\n const [explicitMod, classLookupMod] = await Promise.all([\n import('./resolvers/explicit-mapping.js'),\n import('./resolvers/class-lookup.js'),\n ]);\n\n chain.addResolver(new explicitMod.ExplicitMappingResolver());\n chain.addResolver(new classLookupMod.ClassLookupResolver());\n\n return chain;\n }\n\n /**\n * Create a resolver chain synchronously with provided resolvers.\n *\n * Use this when you want to avoid async initialization.\n *\n * @param resolvers - Resolvers to add to the chain\n * @returns Configured resolver chain\n */\n static withResolvers(resolvers: BaseResolver[]): ResolverChain {\n const chain = new ResolverChain();\n for (const resolver of resolvers) {\n chain.addResolver(resolver);\n }\n return chain;\n }\n\n /**\n * Add a resolver to the chain.\n *\n * Resolvers are automatically sorted by priority (lowest first).\n *\n * @param resolver - Resolver to add\n */\n addResolver(resolver: BaseResolver): void {\n this.resolvers.push(resolver);\n this.resolversByName.set(resolver.name, resolver);\n this.sortResolvers();\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined if not found\n */\n getResolver(name: string): BaseResolver | undefined {\n return this.resolversByName.get(name);\n }\n\n /**\n * List all resolvers with their priorities.\n *\n * @returns Array of [name, priority] tuples, sorted by priority\n */\n listResolvers(): Array<[string, number]> {\n return this.resolvers.map((r) => [r.name, r.priority]);\n }\n\n /**\n * Resolve a handler from a definition.\n *\n * Resolution process:\n * 1. If resolver hint is present, use only that resolver\n * 2. Otherwise, try resolvers in priority order\n * 3. If method dispatch is needed, wrap the handler\n *\n * @param definition - Handler definition to resolve\n * @param config - Optional resolver configuration\n * @returns ExecutableHandler instance (possibly wrapped) or null\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<ExecutableHandler | null> {\n let handler: StepHandler | null;\n\n if (hasResolverHint(definition)) {\n handler = await this.resolveWithHint(definition, config);\n } else {\n handler = await this.resolveWithChain(definition, config);\n }\n\n if (!handler) {\n return null;\n }\n\n return this.wrapForMethodDispatch(handler, definition);\n }\n\n /**\n * Wrap a handler for method dispatch if needed.\n *\n * @param handler - Handler to potentially wrap\n * @param definition - Handler definition with method info\n * @returns Original handler or MethodDispatchWrapper (both implement ExecutableHandler)\n */\n wrapForMethodDispatch(handler: StepHandler, definition: HandlerDefinition): ExecutableHandler {\n if (!usesMethodDispatch(definition)) {\n return handler;\n }\n\n const method = effectiveMethod(definition);\n\n // Check if handler has the method\n const handlerWithMethod = handler as unknown as Record<string, unknown>;\n if (typeof handlerWithMethod[method] !== 'function') {\n log.warn(`Handler does not have requested method`, {\n operation: 'wrap_for_method_dispatch',\n handler_name: handler.name,\n method,\n });\n return handler;\n }\n\n // MethodDispatchWrapper implements ExecutableHandler, so no casting needed\n return new MethodDispatchWrapper(handler, method);\n }\n\n /**\n * Resolve using a specific resolver (from hint).\n */\n private async resolveWithHint(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n // Resolver hint is guaranteed to exist when this method is called\n // (checked by hasResolverHint), but we handle the edge case safely\n const resolverName = definition.resolver ?? '';\n const resolver = this.resolversByName.get(resolverName);\n\n if (!resolver) {\n throw new ResolverNotFoundError(resolverName);\n }\n\n return resolver.resolve(definition, config);\n }\n\n /**\n * Resolve by trying resolvers in priority order.\n */\n private async resolveWithChain(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n for (const resolver of this.resolvers) {\n if (resolver.canResolve(definition, config)) {\n const handler = await resolver.resolve(definition, config);\n if (handler) {\n return handler;\n }\n }\n }\n return null;\n }\n\n /**\n * Sort resolvers by priority (ascending).\n */\n private sortResolvers(): void {\n this.resolvers.sort((a, b) => a.priority - b.priority);\n }\n}\n","/**\n * TAS-93: Built-in resolvers for step handler resolution.\n */\n\nexport { ClassLookupResolver } from './class-lookup.js';\nexport {\n ExplicitMappingResolver,\n type HandlerEntry,\n type HandlerFactory,\n} from './explicit-mapping.js';\n","/**\n * TAS-93: Step handler registry with resolver chain support.\n *\n * Provides handler registration and resolution using a priority-ordered\n * resolver chain. Supports method dispatch and resolver hints.\n *\n * @example\n * ```typescript\n * const registry = new HandlerRegistry();\n * await registry.initialize();\n *\n * // Register a handler\n * registry.register('my_handler', MyHandler);\n *\n * // Simple resolution (string callable)\n * const handler = await registry.resolve('my_handler');\n *\n * // Resolution with method dispatch\n * const definition: HandlerDefinition = {\n * callable: 'my_handler',\n * method: 'process',\n * };\n * const handler2 = await registry.resolve(definition);\n * // handler2.call() invokes handler.process()\n *\n * // Resolution with resolver hint\n * const definition2: HandlerDefinition = {\n * callable: 'my_handler',\n * resolver: 'explicit_mapping',\n * };\n * const handler3 = await registry.resolve(definition2);\n * ```\n */\n\nimport {\n type BaseResolver,\n ExplicitMappingResolver,\n type HandlerDefinition,\n type HandlerSpec,\n normalizeToDefinition,\n ResolverChain,\n} from '../registry/index.js';\nimport type { ExecutableHandler, StepHandler, StepHandlerClass } from './base';\n\n/**\n * Registry for step handler classes.\n *\n * TAS-93: Uses ResolverChain for flexible handler resolution\n * with support for method dispatch and resolver hints.\n *\n * Provides handler discovery, registration, and resolution.\n */\nexport class HandlerRegistry {\n private _resolverChain: ResolverChain | null = null;\n private _explicitResolver: ExplicitMappingResolver | null = null;\n private _initialized = false;\n\n /** Promise-based lock for initialization to prevent concurrent init */\n private _initPromise: Promise<void> | null = null;\n\n /** Track registrations so they can be transferred to chain resolver */\n private _pendingRegistrations: Map<string, StepHandlerClass> = new Map();\n\n /**\n * Initialize the registry with default resolvers.\n *\n * Must be called before using resolve() with resolver chain features.\n * For simple register/resolve with strings, lazy initialization is used.\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n\n this._resolverChain = await ResolverChain.default();\n const chainResolver = this._resolverChain.getResolver(\n 'explicit_mapping'\n ) as ExplicitMappingResolver;\n\n // Transfer handlers from standalone resolver (if any) to chain resolver\n if (this._explicitResolver && this._explicitResolver !== chainResolver) {\n for (const name of this._explicitResolver.registeredCallables()) {\n // Re-register from pending registrations (original class reference)\n const handlerClass = this._pendingRegistrations.get(name);\n if (handlerClass) {\n chainResolver.register(name, handlerClass);\n }\n }\n }\n\n // Transfer any handlers registered before initialization\n for (const [name, handlerClass] of this._pendingRegistrations) {\n chainResolver.register(name, handlerClass);\n }\n this._pendingRegistrations.clear();\n\n // Now point to the chain resolver\n this._explicitResolver = chainResolver;\n this._initialized = true;\n }\n\n /**\n * Ensure the registry is initialized.\n * Uses lazy initialization with proper locking to prevent concurrent init.\n */\n private async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n\n // Use promise-based lock to prevent concurrent initialization\n if (!this._initPromise) {\n this._initPromise = this.initialize();\n }\n await this._initPromise;\n }\n\n /**\n * Get the explicit mapping resolver for direct registration.\n */\n private getExplicitResolver(): ExplicitMappingResolver {\n if (!this._explicitResolver) {\n // Create standalone resolver for pre-initialization use\n this._explicitResolver = new ExplicitMappingResolver();\n }\n return this._explicitResolver;\n }\n\n /**\n * Register a handler class.\n *\n * @param name - Handler name (must match step definition)\n * @param handlerClass - StepHandler subclass\n * @throws Error if handlerClass is not a valid StepHandler subclass\n *\n * @example\n * ```typescript\n * registry.register('my_handler', MyHandler);\n * ```\n */\n register(name: string, handlerClass: StepHandlerClass): void {\n if (!name || typeof name !== 'string') {\n throw new Error('Handler name must be a non-empty string');\n }\n\n if (typeof handlerClass !== 'function') {\n throw new Error(`handlerClass must be a StepHandler subclass, got ${typeof handlerClass}`);\n }\n\n // Track for transfer during initialization\n if (!this._initialized) {\n this._pendingRegistrations.set(name, handlerClass);\n }\n\n const resolver = this.getExplicitResolver();\n resolver.register(name, handlerClass);\n console.info(`[HandlerRegistry] Registered handler: ${name} -> ${handlerClass.name}`);\n }\n\n /**\n * Unregister a handler.\n *\n * @param name - Handler name to unregister\n * @returns True if handler was unregistered, false if not found\n */\n unregister(name: string): boolean {\n // Remove from pending registrations if not initialized\n if (!this._initialized) {\n this._pendingRegistrations.delete(name);\n }\n\n const resolver = this.getExplicitResolver();\n const removed = resolver.unregister(name);\n if (removed) {\n console.debug(`[HandlerRegistry] Unregistered handler: ${name}`);\n }\n return removed;\n }\n\n /**\n * Resolve and instantiate a handler.\n *\n * TAS-93: Accepts flexible input types:\n * - string: Simple callable name\n * - HandlerDefinition: Full definition with method/resolver\n * - HandlerSpec: Union type for all formats\n *\n * @param handlerSpec - Handler specification\n * @returns ExecutableHandler (StepHandler or MethodDispatchWrapper) or null if not found\n *\n * @example\n * ```typescript\n * // String callable\n * const handler = await registry.resolve('my_handler');\n *\n * // With method dispatch\n * const handler2 = await registry.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n * ```\n */\n async resolve(handlerSpec: HandlerSpec): Promise<ExecutableHandler | null> {\n await this.ensureInitialized();\n\n const definition = normalizeToDefinition(handlerSpec);\n\n if (!this._resolverChain) {\n console.warn('[HandlerRegistry] Resolver chain not initialized');\n return null;\n }\n\n const handler = await this._resolverChain.resolve(definition);\n\n if (!handler) {\n console.warn(`[HandlerRegistry] Handler not found: ${definition.callable}`);\n }\n\n return handler;\n }\n\n /**\n * Synchronous resolve for backward compatibility.\n *\n * Note: This only works with explicitly registered handlers.\n * For full resolver chain support, use the async resolve() method.\n *\n * @param name - Handler name to resolve\n * @returns Instantiated handler or null if not found\n */\n resolveSync(name: string): StepHandler | null {\n const resolver = this.getExplicitResolver();\n const definition: HandlerDefinition = { callable: name };\n\n if (!resolver.canResolve(definition)) {\n console.warn(`[HandlerRegistry] Handler not found: ${name}`);\n return null;\n }\n\n // Use Promise.resolve to handle the async resolve, but block on it\n // This is a workaround for backward compatibility\n let result: StepHandler | null = null;\n\n // Try to instantiate directly from the explicit resolver\n const entry = resolver.registeredCallables().includes(name);\n if (entry) {\n // Access internal state - not ideal but needed for sync compat\n resolver\n .resolve(definition)\n .then((h) => {\n result = h;\n })\n .catch(() => {\n result = null;\n });\n }\n\n // For sync compatibility, try direct instantiation\n // This is a best-effort approach\n return result;\n }\n\n /**\n * Get a handler class without instantiation.\n *\n * @param name - Handler name to look up\n * @returns Handler class or undefined if not found\n */\n getHandlerClass(_name: string): StepHandlerClass | undefined {\n // This would require exposing internal state from ExplicitMappingResolver\n // For now, return undefined - users should use resolve()\n console.warn('[HandlerRegistry] getHandlerClass is deprecated, use resolve() instead');\n return undefined;\n }\n\n /**\n * Check if a handler is registered.\n *\n * @param name - Handler name to check\n * @returns True if handler is registered\n */\n isRegistered(name: string): boolean {\n const resolver = this.getExplicitResolver();\n return resolver.registeredCallables().includes(name);\n }\n\n /**\n * List all registered handler names.\n *\n * @returns Array of registered handler names\n */\n listHandlers(): string[] {\n const resolver = this.getExplicitResolver();\n return resolver.registeredCallables();\n }\n\n /**\n * Get the number of registered handlers.\n */\n handlerCount(): number {\n return this.listHandlers().length;\n }\n\n /**\n * Clear all registered handlers.\n */\n clear(): void {\n if (this._explicitResolver) {\n for (const key of this._explicitResolver.registeredCallables()) {\n this._explicitResolver.unregister(key);\n }\n }\n console.debug('[HandlerRegistry] Cleared all handlers from registry');\n }\n\n /**\n * Add a custom resolver to the chain.\n *\n * TAS-93: Allows adding custom domain-specific resolvers.\n *\n * @param resolver - Resolver to add\n */\n async addResolver(resolver: BaseResolver): Promise<void> {\n await this.ensureInitialized();\n this._resolverChain?.addResolver(resolver);\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined\n */\n async getResolver(name: string): Promise<BaseResolver | undefined> {\n await this.ensureInitialized();\n return this._resolverChain?.getResolver(name);\n }\n\n /**\n * List all resolvers with priorities.\n *\n * @returns Array of [name, priority] tuples\n */\n async listResolvers(): Promise<Array<[string, number]>> {\n await this.ensureInitialized();\n return this._resolverChain?.listResolvers() ?? [];\n }\n\n /**\n * Get the underlying resolver chain.\n *\n * Useful for advanced configuration.\n */\n async getResolverChain(): Promise<ResolverChain | null> {\n await this.ensureInitialized();\n return this._resolverChain;\n }\n\n /**\n * Get debug information about the registry.\n */\n debugInfo(): Record<string, unknown> {\n const resolver = this.getExplicitResolver();\n const handlers: Record<string, string> = {};\n\n for (const name of resolver.registeredCallables()) {\n handlers[name] = name; // We don't have class names readily available\n }\n\n return {\n initialized: this._initialized,\n handlerCount: resolver.registeredCallables().length,\n handlers,\n };\n }\n}\n","/**\n * HandlerSystem - Owns handler registration and discovery.\n *\n * TAS-93: Uses HandlerRegistry with resolver chain for flexible handler resolution.\n *\n * This class encapsulates handler management:\n * - Owns a HandlerRegistry instance (no singleton)\n * - Provides handler discovery from directories\n * - Manages handler registration lifecycle\n * - Full resolver chain support via HandlerRegistry\n *\n * Design principles:\n * - Explicit construction: No singleton pattern\n * - Clear ownership: Owns the registry instance\n * - Encapsulated discovery: Handler loading logic contained here\n * - Single registry: Uses HandlerRegistry for all resolution\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createLogger } from '../logging/index.js';\nimport type { BaseResolver, HandlerSpec, ResolverChain } from '../registry/index.js';\nimport type { ExecutableHandler, StepHandlerClass } from './base.js';\nimport { HandlerRegistry } from './registry.js';\n\nconst log = createLogger({ component: 'handler-system' });\n\n/**\n * Configuration for HandlerSystem.\n */\nexport interface HandlerSystemConfig {\n /** Path to directory containing handlers (can also use TYPESCRIPT_HANDLER_PATH env var) */\n handlerPath?: string;\n}\n\n/**\n * Owns handler registration and discovery.\n *\n * TAS-93: Uses HandlerRegistry internally for unified resolution.\n *\n * Unlike using HandlerRegistry directly, this class:\n * - Encapsulates handler discovery from directories\n * - Provides convenience methods for loading handlers\n * - Manages the full handler lifecycle\n *\n * @example\n * ```typescript\n * const handlerSystem = new HandlerSystem();\n *\n * // Register individual handlers\n * handlerSystem.register('my_handler', MyHandler);\n *\n * // Or load from directory\n * await handlerSystem.loadFromPath('./handlers');\n *\n * // Resolve with full resolver chain support\n * const handler = await handlerSystem.resolve('my_handler');\n *\n * // Resolve with method dispatch\n * const handler2 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n * ```\n */\nexport class HandlerSystem {\n private readonly registry: HandlerRegistry;\n\n /**\n * Create a new HandlerSystem.\n */\n constructor() {\n this.registry = new HandlerRegistry();\n }\n\n // ==========================================================================\n // Initialization\n // ==========================================================================\n\n /**\n * Initialize the handler system.\n *\n * Initializes the underlying HandlerRegistry with resolver chain.\n * Call this before using resolve() for best performance.\n */\n async initialize(): Promise<void> {\n await this.registry.initialize();\n log.info('HandlerSystem initialized', { operation: 'initialize' });\n }\n\n /**\n * Check if the system is initialized.\n */\n get initialized(): boolean {\n return this.registry.debugInfo().initialized as boolean;\n }\n\n // ==========================================================================\n // Handler Loading\n // ==========================================================================\n\n /**\n * Load handlers from a directory path.\n *\n * Searches for handler modules in the directory and registers them.\n * Supports both index file exports and directory scanning.\n *\n * @param path - Path to directory containing handlers\n * @returns Number of handlers loaded\n */\n async loadFromPath(path: string): Promise<number> {\n if (!existsSync(path)) {\n log.warn(`Handler path does not exist: ${path}`, { operation: 'load_from_path' });\n return 0;\n }\n\n log.info(`Loading handlers from: ${path}`, { operation: 'load_from_path' });\n\n try {\n // Try to find and import an index file first\n const indexResult = await this.tryImportIndexFile(path);\n if (indexResult.module) {\n return this.registerHandlersFromModule(indexResult.module, indexResult.path);\n }\n\n // Fallback: scan for handler files\n log.debug('No index file found, scanning for handler files...', {\n operation: 'load_from_path',\n });\n return this.scanAndImportHandlers(path);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.error(`Failed to load handlers from path: ${errorMessage}`, {\n operation: 'load_from_path',\n error_message: errorMessage,\n });\n return 0;\n }\n }\n\n /**\n * Load handlers from TYPESCRIPT_HANDLER_PATH environment variable.\n *\n * @returns Number of handlers loaded\n */\n async loadFromEnv(): Promise<number> {\n const handlerPath = process.env.TYPESCRIPT_HANDLER_PATH;\n if (!handlerPath) {\n log.debug('TYPESCRIPT_HANDLER_PATH not set, skipping handler import', {\n operation: 'load_from_env',\n });\n return 0;\n }\n\n return this.loadFromPath(handlerPath);\n }\n\n // ==========================================================================\n // Registration (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Register a handler class.\n *\n * @param name - Handler name (must match step definition)\n * @param handlerClass - StepHandler subclass\n */\n register(name: string, handlerClass: StepHandlerClass): void {\n this.registry.register(name, handlerClass);\n }\n\n /**\n * Unregister a handler.\n *\n * @param name - Handler name to unregister\n * @returns True if handler was unregistered\n */\n unregister(name: string): boolean {\n return this.registry.unregister(name);\n }\n\n // ==========================================================================\n // Resolution (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Resolve and instantiate a handler.\n *\n * TAS-93: Supports full resolver chain with method dispatch and resolver hints.\n *\n * @param handlerSpec - Handler specification (string, definition, or DTO)\n * @returns Instantiated handler or null if not found\n *\n * @example\n * ```typescript\n * // String callable\n * const handler = await handlerSystem.resolve('my_handler');\n *\n * // With method dispatch\n * const handler2 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n *\n * // With resolver hint\n * const handler3 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * resolver: 'explicit_mapping',\n * });\n * ```\n */\n async resolve(handlerSpec: HandlerSpec): Promise<ExecutableHandler | null> {\n return this.registry.resolve(handlerSpec);\n }\n\n /**\n * Check if a handler is registered.\n */\n isRegistered(name: string): boolean {\n return this.registry.isRegistered(name);\n }\n\n /**\n * List all registered handler names.\n */\n listHandlers(): string[] {\n return this.registry.listHandlers();\n }\n\n /**\n * Get the number of registered handlers.\n */\n handlerCount(): number {\n return this.registry.handlerCount();\n }\n\n /**\n * Clear all registered handlers.\n */\n clear(): void {\n this.registry.clear();\n }\n\n // ==========================================================================\n // Resolver Chain Access (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Add a custom resolver to the chain.\n *\n * TAS-93: Allows adding custom domain-specific resolvers.\n *\n * @param resolver - Resolver to add\n */\n async addResolver(resolver: BaseResolver): Promise<void> {\n await this.registry.addResolver(resolver);\n log.info(`Added custom resolver: ${resolver.name}`, { operation: 'add_resolver' });\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined\n */\n async getResolver(name: string): Promise<BaseResolver | undefined> {\n return this.registry.getResolver(name);\n }\n\n /**\n * List all resolvers with priorities.\n *\n * @returns Array of [name, priority] tuples\n */\n async listResolvers(): Promise<Array<[string, number]>> {\n return this.registry.listResolvers();\n }\n\n /**\n * Get the underlying resolver chain.\n *\n * Useful for advanced configuration.\n */\n async getResolverChain(): Promise<ResolverChain | null> {\n return this.registry.getResolverChain();\n }\n\n // ==========================================================================\n // Registry Access\n // ==========================================================================\n\n /**\n * Get the underlying HandlerRegistry.\n *\n * TAS-93: Returns the HandlerRegistry directly for use with\n * StepExecutionSubscriber and other components.\n */\n getRegistry(): HandlerRegistry {\n return this.registry;\n }\n\n /**\n * Get debug information about the handler system.\n */\n debugInfo(): Record<string, unknown> {\n return {\n ...this.registry.debugInfo(),\n component: 'HandlerSystem',\n };\n }\n\n // ==========================================================================\n // Private Methods - Handler Discovery\n // ==========================================================================\n\n /**\n * Try to import an index file from the handler path.\n */\n private async tryImportIndexFile(\n handlerPath: string\n ): Promise<{ module: Record<string, unknown> | null; path: string | null }> {\n const indexPaths = [\n join(handlerPath, 'examples', 'index.js'),\n join(handlerPath, 'examples', 'index.ts'),\n join(handlerPath, 'index.js'),\n join(handlerPath, 'index.ts'),\n ];\n\n for (const indexPath of indexPaths) {\n if (existsSync(indexPath)) {\n const module = (await import(`file://${indexPath}`)) as Record<string, unknown>;\n return { module, path: indexPath };\n }\n }\n\n return { module: null, path: null };\n }\n\n /**\n * Register handlers from a module's exports.\n */\n private registerHandlersFromModule(\n module: Record<string, unknown>,\n importPath: string | null\n ): number {\n log.info(`Loaded handler module from: ${importPath}`, { operation: 'import_handlers' });\n\n // Check for ALL_EXAMPLE_HANDLERS array (preferred pattern)\n if (Array.isArray(module.ALL_EXAMPLE_HANDLERS)) {\n return this.registerFromHandlerArray(module.ALL_EXAMPLE_HANDLERS);\n }\n\n // Fallback: scan module exports for handler classes\n return this.registerFromModuleExports(module);\n }\n\n /**\n * Register handlers from ALL_EXAMPLE_HANDLERS array.\n */\n private registerFromHandlerArray(handlers: unknown[]): number {\n let count = 0;\n for (const handlerClass of handlers) {\n if (this.isValidHandlerClass(handlerClass)) {\n this.registry.register(handlerClass.handlerName, handlerClass);\n count++;\n }\n }\n log.info(`Registered ${count} handlers from ALL_EXAMPLE_HANDLERS`, {\n operation: 'import_handlers',\n });\n return count;\n }\n\n /**\n * Register handlers from module exports.\n */\n private registerFromModuleExports(module: Record<string, unknown>): number {\n let count = 0;\n for (const [exportName, exported] of Object.entries(module)) {\n if (this.isValidHandlerClass(exported)) {\n this.registry.register(exported.handlerName, exported);\n count++;\n log.debug(`Registered handler from export: ${exportName}`, {\n operation: 'import_handlers',\n });\n }\n }\n log.info(`Registered ${count} handlers from module exports`, {\n operation: 'import_handlers',\n });\n return count;\n }\n\n /**\n * Check if a value is a valid handler class.\n */\n private isValidHandlerClass(value: unknown): value is StepHandlerClass {\n return (\n value !== null &&\n typeof value === 'function' &&\n 'handlerName' in value &&\n typeof (value as StepHandlerClass).handlerName === 'string'\n );\n }\n\n /**\n * Recursively scan a directory for handler files and import them.\n */\n private async scanAndImportHandlers(dirPath: string): Promise<number> {\n let count = 0;\n\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n count += await this.processDirectoryEntry(entry, fullPath);\n }\n } catch (error) {\n log.debug(`Could not scan ${dirPath}: ${error}`, { operation: 'import_handlers' });\n }\n\n return count;\n }\n\n /**\n * Process a single directory entry for handler import.\n */\n private async processDirectoryEntry(\n entry: { isDirectory(): boolean; isFile(): boolean; name: string },\n fullPath: string\n ): Promise<number> {\n if (this.shouldScanDirectory(entry)) {\n return this.scanAndImportHandlers(fullPath);\n }\n\n if (this.isHandlerFile(entry)) {\n return this.importHandlerFile(fullPath);\n }\n\n return 0;\n }\n\n /**\n * Check if a directory should be scanned for handlers.\n */\n private shouldScanDirectory(entry: { isDirectory(): boolean; name: string }): boolean {\n return entry.isDirectory() && !entry.name.startsWith('_') && entry.name !== 'node_modules';\n }\n\n /**\n * Check if a file might contain handlers.\n */\n private isHandlerFile(entry: { isFile(): boolean; name: string }): boolean {\n const name = entry.name;\n return (\n entry.isFile() &&\n (name.endsWith('.ts') || name.endsWith('.js')) &&\n !name.startsWith('_') &&\n !name.endsWith('.d.ts') &&\n !name.endsWith('.test.ts') &&\n !name.endsWith('.spec.ts')\n );\n }\n\n /**\n * Import handlers from a single file.\n */\n private async importHandlerFile(fullPath: string): Promise<number> {\n let count = 0;\n\n try {\n const module = (await import(`file://${fullPath}`)) as Record<string, unknown>;\n\n for (const [, exported] of Object.entries(module)) {\n if (this.isValidHandlerClass(exported)) {\n this.registry.register(exported.handlerName, exported);\n count++;\n }\n }\n } catch (importError) {\n log.debug(`Could not import ${fullPath}: ${importError}`, { operation: 'import_handlers' });\n }\n\n return count;\n }\n}\n","/**\n * Shutdown controller for coordinating graceful shutdown.\n *\n * Provides a signal-based mechanism for triggering and awaiting\n * shutdown across async boundaries.\n */\n\nimport { createLogger } from '../logging/index.js';\n\nconst log = createLogger({ component: 'shutdown' });\n\n/**\n * Shutdown signal handler type.\n */\nexport type ShutdownHandler = () => void | Promise<void>;\n\n/**\n * Controller for coordinating graceful shutdown.\n *\n * Provides a promise-based mechanism for waiting on shutdown signals\n * and executing cleanup handlers in order.\n *\n * @example\n * ```typescript\n * const shutdown = new ShutdownController();\n *\n * process.on('SIGTERM', () => shutdown.trigger('SIGTERM'));\n * process.on('SIGINT', () => shutdown.trigger('SIGINT'));\n *\n * // Wait for shutdown signal\n * await shutdown.promise;\n *\n * // Or check if shutdown was requested\n * if (shutdown.isRequested) {\n * await cleanup();\n * }\n * ```\n */\nexport class ShutdownController {\n private _shutdownRequested = false;\n private _resolver: (() => void) | null = null;\n private _signal: string | null = null;\n private readonly _handlers: ShutdownHandler[] = [];\n\n /**\n * Promise that resolves when shutdown is triggered.\n */\n readonly promise: Promise<void>;\n\n constructor() {\n this.promise = new Promise<void>((resolve) => {\n this._resolver = resolve;\n });\n }\n\n /**\n * Check if shutdown has been requested.\n */\n get isRequested(): boolean {\n return this._shutdownRequested;\n }\n\n /**\n * Get the signal that triggered shutdown, if any.\n */\n get signal(): string | null {\n return this._signal;\n }\n\n /**\n * Register a handler to be called during shutdown.\n *\n * Handlers are called in registration order.\n */\n onShutdown(handler: ShutdownHandler): void {\n this._handlers.push(handler);\n }\n\n /**\n * Trigger shutdown with the given signal.\n *\n * @param signal - The signal that triggered shutdown (e.g., 'SIGTERM', 'SIGINT')\n */\n trigger(signal: string): void {\n if (this._shutdownRequested) {\n log.warn(`Shutdown already requested, ignoring ${signal}`, {\n operation: 'shutdown',\n signal,\n original_signal: this._signal ?? 'unknown',\n });\n return;\n }\n\n log.info(`Received ${signal} signal, initiating shutdown...`, {\n operation: 'shutdown',\n signal,\n });\n\n this._shutdownRequested = true;\n this._signal = signal;\n this._resolver?.();\n }\n\n /**\n * Execute all registered shutdown handlers.\n *\n * Handlers are called in registration order. Errors are logged\n * but do not prevent subsequent handlers from running.\n */\n async executeHandlers(): Promise<void> {\n for (const handler of this._handlers) {\n try {\n await handler();\n } catch (error) {\n log.error(\n `Shutdown handler failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n operation: 'shutdown',\n error_message: error instanceof Error ? error.message : String(error),\n }\n );\n }\n }\n }\n\n /**\n * Reset the controller for reuse (primarily for testing).\n */\n reset(): void {\n this._shutdownRequested = false;\n this._signal = null;\n this._handlers.length = 0;\n }\n}\n","/**\n * Server module types.\n *\n * Defines types for WorkerServer lifecycle and configuration.\n */\n\nimport type { TaskerEventEmitter } from '../events/event-emitter.js';\nimport type { EventPoller } from '../events/event-poller.js';\nimport type { TaskerRuntime } from '../ffi/runtime-interface.js';\nimport type { HandlerRegistry } from '../handler/registry.js';\nimport type { StepExecutionSubscriber } from '../subscriber/step-execution-subscriber.js';\n\n/**\n * Server state constants.\n *\n * Use these constants instead of raw strings for type safety and consistency.\n *\n * State transitions:\n * - INITIALIZED -> STARTING -> RUNNING -> SHUTTING_DOWN -> STOPPED\n * - Any state can transition to ERROR on fatal failures\n */\nexport const ServerStates = {\n /** Initial state after construction */\n INITIALIZED: 'initialized',\n /** Starting up: loading FFI, registering handlers, bootstrapping */\n STARTING: 'starting',\n /** Running and processing events */\n RUNNING: 'running',\n /** Graceful shutdown in progress */\n SHUTTING_DOWN: 'shutting_down',\n /** Fully stopped */\n STOPPED: 'stopped',\n /** Error state - fatal failure occurred */\n ERROR: 'error',\n} as const;\n\n/**\n * Server lifecycle states (union type derived from constants).\n */\nexport type ServerState = (typeof ServerStates)[keyof typeof ServerStates];\n\n/**\n * Worker server configuration.\n *\n * All fields are optional with sensible defaults.\n */\nexport interface WorkerServerConfig {\n /** Task namespace to handle (default: \"default\") */\n namespace?: string;\n\n /** Log level for Rust tracing (default: \"info\") */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n\n /** Path to TOML configuration file */\n configPath?: string;\n\n /** PostgreSQL database connection URL */\n databaseUrl?: string;\n\n /** Path to the FFI library (overrides auto-discovery) */\n libraryPath?: string;\n\n /** Maximum concurrent handler executions (default: 10) */\n maxConcurrentHandlers?: number;\n\n /** Handler execution timeout in milliseconds (default: 300000 = 5 minutes) */\n handlerTimeoutMs?: number;\n\n /** Event polling interval in milliseconds (default: 10) */\n pollIntervalMs?: number;\n\n /** Starvation check interval in poll cycles (default: 100) */\n starvationCheckInterval?: number;\n\n /** Cleanup interval in poll cycles (default: 1000) */\n cleanupInterval?: number;\n\n /** Metrics reporting interval in poll cycles (default: 100) */\n metricsInterval?: number;\n}\n\n/**\n * Health check result.\n */\nexport interface HealthCheckResult {\n /** Whether the worker is healthy */\n healthy: boolean;\n\n /** Optional status details when healthy */\n status?: ServerStatus;\n\n /** Error message when unhealthy */\n error?: string;\n}\n\n/**\n * Server status information.\n */\nexport interface ServerStatus {\n /** Current server state */\n state: ServerState;\n\n /** Worker identifier */\n workerId: string | null;\n\n /** Whether the worker is actively running */\n running: boolean;\n\n /** Number of events processed */\n processedCount: number;\n\n /** Number of errors encountered */\n errorCount: number;\n\n /** Number of currently active handlers */\n activeHandlers: number;\n\n /** Server uptime in milliseconds */\n uptimeMs: number;\n}\n\n/**\n * Internal server components.\n *\n * Used by WorkerServer to manage lifecycle of all components.\n */\nexport interface ServerComponents {\n /** FFI runtime instance */\n runtime: TaskerRuntime;\n\n /** Event emitter for step events */\n emitter: TaskerEventEmitter;\n\n /** Handler registry */\n registry: HandlerRegistry;\n\n /** Event poller for FFI events */\n eventPoller: EventPoller;\n\n /** Step execution subscriber */\n stepSubscriber: StepExecutionSubscriber;\n\n /** Worker identifier from bootstrap */\n workerId: string;\n}\n","/**\n * WorkerServer - Orchestrates the TypeScript worker lifecycle.\n *\n * Manages the complete lifecycle of a TypeScript worker:\n * - FFI library loading (via FfiLayer)\n * - Handler registration (via HandlerSystem)\n * - Rust worker bootstrapping\n * - Event processing (via EventSystem)\n * - Graceful shutdown\n *\n * Design principles:\n * - Explicit construction: No singleton pattern - caller creates and manages\n * - Clear ownership: Owns FfiLayer, HandlerSystem, EventSystem\n * - Explicit lifecycle: Clear 3-phase startup and shutdown\n *\n * @example\n * ```typescript\n * const server = new WorkerServer();\n *\n * await server.start({\n * namespace: 'payments',\n * logLevel: 'debug',\n * });\n *\n * // Server is now running and processing tasks\n *\n * await server.shutdown();\n * ```\n */\n\nimport {\n bootstrapWorker,\n healthCheck as ffiHealthCheck,\n getVersion,\n getWorkerStatus,\n isWorkerRunning,\n stopWorker,\n transitionToGracefulShutdown,\n} from '../bootstrap/bootstrap.js';\nimport type { BootstrapConfig, BootstrapResult } from '../bootstrap/types.js';\nimport { EventSystem, type EventSystemConfig } from '../events/event-system.js';\nimport { FfiLayer, type FfiLayerConfig } from '../ffi/ffi-layer.js';\nimport { HandlerSystem } from '../handler/handler-system.js';\nimport { createLogger, setLoggingRuntime } from '../logging/index.js';\nimport {\n type HealthCheckResult,\n type ServerState,\n ServerStates,\n type ServerStatus,\n type WorkerServerConfig,\n} from './types.js';\n\nconst log = createLogger({ component: 'server' });\n\n/**\n * Worker server class.\n *\n * Unlike the previous singleton pattern, this class is instantiated directly\n * by the caller (typically bin/server.ts). This provides explicit lifecycle\n * control and clear dependency ownership.\n */\nexport class WorkerServer {\n private readonly ffiLayer: FfiLayer;\n private readonly handlerSystem: HandlerSystem;\n private eventSystem: EventSystem | null = null;\n\n private state: ServerState = ServerStates.INITIALIZED;\n private config: WorkerServerConfig | null = null;\n private workerId: string | null = null;\n private startTime: number | null = null;\n private shutdownHandlers: Array<() => void | Promise<void>> = [];\n\n /**\n * Create a new WorkerServer.\n *\n * @param ffiConfig - Optional FFI layer configuration\n */\n constructor(ffiConfig?: FfiLayerConfig) {\n this.ffiLayer = new FfiLayer(ffiConfig);\n this.handlerSystem = new HandlerSystem();\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n /**\n * Get the current server state.\n */\n getState(): ServerState {\n return this.state;\n }\n\n /**\n * Get the worker identifier.\n */\n getWorkerId(): string | null {\n return this.workerId;\n }\n\n /**\n * Check if the server is currently running.\n */\n isRunning(): boolean {\n return this.state === ServerStates.RUNNING;\n }\n\n /**\n * Get the handler system for external handler registration.\n */\n getHandlerSystem(): HandlerSystem {\n return this.handlerSystem;\n }\n\n /**\n * Get the event system (available after start).\n */\n getEventSystem(): EventSystem | null {\n return this.eventSystem;\n }\n\n // ==========================================================================\n // Lifecycle Methods\n // ==========================================================================\n\n /**\n * Start the worker server.\n *\n * Three-phase startup:\n * 1. Initialize: Load FFI, load handlers\n * 2. Bootstrap: Initialize Rust worker\n * 3. Start: Begin event processing\n *\n * @param config - Optional server configuration\n * @returns The server instance for chaining\n * @throws Error if server is already running or fails to start\n */\n async start(config?: WorkerServerConfig): Promise<this> {\n if (this.state === ServerStates.RUNNING) {\n throw new Error('WorkerServer is already running');\n }\n\n if (this.state === ServerStates.STARTING) {\n throw new Error('WorkerServer is already starting');\n }\n\n this.state = ServerStates.STARTING;\n this.config = config ?? {};\n this.startTime = Date.now();\n\n try {\n // Phase 1: Initialize\n await this.initializePhase();\n\n // Phase 2: Bootstrap Rust worker\n const bootstrapResult = await this.bootstrapPhase();\n this.workerId = bootstrapResult.workerId ?? `typescript-worker-${process.pid}`;\n\n log.info(`Worker bootstrapped successfully (ID: ${this.workerId})`, {\n operation: 'bootstrap',\n worker_id: this.workerId,\n });\n\n // Phase 3: Start event processing\n await this.startEventProcessingPhase();\n\n this.state = ServerStates.RUNNING;\n\n log.info('WorkerServer started successfully', {\n operation: 'start',\n worker_id: this.workerId,\n version: getVersion(this.ffiLayer.getRuntime()),\n });\n\n return this;\n } catch (error) {\n this.state = ServerStates.ERROR;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n log.error(`WorkerServer failed to start: ${errorMessage}`, {\n operation: 'start',\n error_message: errorMessage,\n });\n\n // Cleanup any partially initialized components\n await this.cleanupOnError();\n\n throw error;\n }\n }\n\n /**\n * Shutdown the worker server gracefully.\n *\n * Three-phase shutdown:\n * 1. Stop event processing\n * 2. Stop Rust worker\n * 3. Unload FFI\n */\n async shutdown(): Promise<void> {\n if (this.state === ServerStates.SHUTTING_DOWN) {\n log.warn('Shutdown already in progress', { operation: 'shutdown' });\n return;\n }\n\n if (this.state !== ServerStates.RUNNING) {\n log.info('Server not running, nothing to shutdown', {\n operation: 'shutdown',\n state: this.state,\n });\n return;\n }\n\n this.state = ServerStates.SHUTTING_DOWN;\n\n log.info('Starting shutdown sequence...', { operation: 'shutdown' });\n\n try {\n // Phase 1: Stop event processing\n if (this.eventSystem) {\n log.info(' Stopping event system...', { operation: 'shutdown' });\n await this.eventSystem.stop();\n this.eventSystem = null;\n log.info(' Event system stopped', { operation: 'shutdown' });\n }\n\n // Phase 2: Stop Rust worker\n const runtime = this.ffiLayer.isLoaded() ? this.ffiLayer.getRuntime() : undefined;\n if (isWorkerRunning(runtime)) {\n log.info(' Transitioning to graceful shutdown...', {\n operation: 'shutdown',\n });\n transitionToGracefulShutdown(runtime);\n\n log.info(' Stopping Rust worker...', { operation: 'shutdown' });\n stopWorker(runtime);\n log.info(' Rust worker stopped', { operation: 'shutdown' });\n }\n\n // Phase 3: Unload FFI\n log.info(' Unloading FFI...', { operation: 'shutdown' });\n await this.ffiLayer.unload();\n log.info(' FFI unloaded', { operation: 'shutdown' });\n\n // Execute registered shutdown handlers\n for (const handler of this.shutdownHandlers) {\n try {\n await handler();\n } catch (error) {\n log.error(\n `Shutdown handler failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n operation: 'shutdown',\n }\n );\n }\n }\n\n this.state = ServerStates.STOPPED;\n\n log.info('WorkerServer shutdown completed successfully', {\n operation: 'shutdown',\n });\n } catch (error) {\n this.state = ServerStates.ERROR;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n log.error(`Shutdown failed: ${errorMessage}`, {\n operation: 'shutdown',\n error_message: errorMessage,\n });\n\n throw error;\n }\n }\n\n /**\n * Register a handler to be called during shutdown.\n *\n * @param handler - Function to execute during shutdown\n */\n onShutdown(handler: () => void | Promise<void>): void {\n this.shutdownHandlers.push(handler);\n }\n\n // ==========================================================================\n // Status Methods\n // ==========================================================================\n\n /**\n * Perform a health check on the worker.\n */\n healthCheck(): HealthCheckResult {\n if (this.state !== ServerStates.RUNNING) {\n return {\n healthy: false,\n error: `Server not running (state: ${this.state})`,\n };\n }\n\n try {\n const runtime = this.ffiLayer.isLoaded() ? this.ffiLayer.getRuntime() : undefined;\n const ffiHealthy = ffiHealthCheck(runtime);\n if (!ffiHealthy) {\n return { healthy: false, error: 'FFI health check failed' };\n }\n\n const workerStatus = getWorkerStatus(runtime);\n if (!workerStatus.running) {\n return { healthy: false, error: 'Worker not running' };\n }\n\n return {\n healthy: true,\n status: this.status(),\n };\n } catch (error) {\n return {\n healthy: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Get detailed server status.\n */\n status(): ServerStatus {\n const stats = this.eventSystem?.getStats();\n\n return {\n state: this.state,\n workerId: this.workerId,\n running: this.state === ServerStates.RUNNING,\n processedCount: stats?.processedCount ?? 0,\n errorCount: stats?.errorCount ?? 0,\n activeHandlers: stats?.activeHandlers ?? 0,\n uptimeMs: this.startTime ? Date.now() - this.startTime : 0,\n };\n }\n\n // ==========================================================================\n // Private Phase Methods\n // ==========================================================================\n\n /**\n * Phase 1: Initialize FFI and handlers.\n */\n private async initializePhase(): Promise<void> {\n // Load handlers from environment\n const handlerCount = await this.handlerSystem.loadFromEnv();\n log.info(`Loaded ${handlerCount} handlers from TYPESCRIPT_HANDLER_PATH`, {\n operation: 'initialize',\n });\n\n // Load FFI library\n log.info('Loading FFI library...', { operation: 'initialize' });\n await this.ffiLayer.load(this.config?.libraryPath);\n log.info(`FFI library loaded: ${this.ffiLayer.getLibraryPath()}`, {\n operation: 'initialize',\n });\n\n // Install the runtime for logging (enables Rust tracing integration)\n setLoggingRuntime(this.ffiLayer.getRuntime());\n\n // Log handler info\n const totalHandlers = this.handlerSystem.handlerCount();\n if (totalHandlers > 0) {\n log.info(`Handler registry: ${totalHandlers} handlers registered`, {\n operation: 'initialize',\n handler_count: String(totalHandlers),\n });\n log.info(`Registered handlers: ${this.handlerSystem.listHandlers().join(', ')}`, {\n operation: 'initialize',\n });\n } else {\n log.warn('No handlers registered. Did you register handlers before starting?', {\n operation: 'initialize',\n });\n }\n }\n\n /**\n * Phase 2: Bootstrap Rust worker.\n */\n private async bootstrapPhase(): Promise<BootstrapResult> {\n // Build config, only setting properties that have values\n const bootstrapConfig: BootstrapConfig = {\n namespace: this.config?.namespace ?? process.env.TASKER_NAMESPACE ?? 'default',\n logLevel:\n this.config?.logLevel ?? (process.env.RUST_LOG as BootstrapConfig['logLevel']) ?? 'info',\n };\n\n const configPath = this.config?.configPath ?? process.env.TASKER_CONFIG_PATH;\n if (configPath) {\n bootstrapConfig.configPath = configPath;\n }\n\n const databaseUrl = this.config?.databaseUrl ?? process.env.DATABASE_URL;\n if (databaseUrl) {\n bootstrapConfig.databaseUrl = databaseUrl;\n }\n\n log.info('Bootstrapping Rust worker...', { operation: 'bootstrap' });\n const runtime = this.ffiLayer.getRuntime();\n const result = await bootstrapWorker(bootstrapConfig, runtime);\n\n if (!result.success) {\n throw new Error(`Bootstrap failed: ${result.message}`);\n }\n\n return result;\n }\n\n /**\n * Phase 3: Start event processing.\n */\n private async startEventProcessingPhase(): Promise<void> {\n log.info('Starting event processing system...', {\n operation: 'start_events',\n });\n\n const runtime = this.ffiLayer.getRuntime();\n\n // Build event system config\n const eventConfig: EventSystemConfig = {\n poller: {\n pollIntervalMs: this.config?.pollIntervalMs ?? 10,\n starvationCheckInterval: this.config?.starvationCheckInterval ?? 100,\n cleanupInterval: this.config?.cleanupInterval ?? 1000,\n metricsInterval: this.config?.metricsInterval ?? 100,\n },\n subscriber: {\n maxConcurrent: this.config?.maxConcurrentHandlers ?? 10,\n handlerTimeoutMs: this.config?.handlerTimeoutMs ?? 300000,\n },\n };\n\n // Only add workerId if it's set (exactOptionalPropertyTypes compatibility)\n if (this.workerId) {\n eventConfig.subscriber = {\n ...eventConfig.subscriber,\n workerId: this.workerId,\n };\n }\n\n // Create EventSystem with explicit dependencies\n this.eventSystem = new EventSystem(runtime, this.handlerSystem.getRegistry(), eventConfig);\n\n // Start the event system\n this.eventSystem.start();\n\n log.info('Event processing system started', {\n operation: 'start_events',\n worker_id: this.workerId,\n });\n }\n\n /**\n * Cleanup on error during startup.\n */\n private async cleanupOnError(): Promise<void> {\n try {\n if (this.eventSystem) {\n await this.eventSystem.stop();\n this.eventSystem = null;\n }\n if (isWorkerRunning()) {\n stopWorker();\n }\n await this.ffiLayer.unload();\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ==========================================================================\n// Legacy Compatibility (Deprecated)\n// ==========================================================================\n\n/**\n * @deprecated Use `new WorkerServer()` instead. Will be removed in future version.\n *\n * This function provides backwards compatibility during migration.\n * New code should create WorkerServer directly.\n */\nexport function createWorkerServer(ffiConfig?: FfiLayerConfig): WorkerServer {\n return new WorkerServer(ffiConfig);\n}\n"]}
1
+ {"version":3,"sources":["../src/registry/resolvers/explicit-mapping.ts","../src/registry/resolvers/class-lookup.ts","../src/bootstrap/types.ts","../src/bootstrap/bootstrap.ts","../src/client/index.ts","../src/events/event-names.ts","../src/events/event-emitter.ts","../src/events/event-poller.ts","../src/logging/index.ts","../src/types/error-type.ts","../src/types/step-context.ts","../src/types/step-handler-result.ts","../src/subscriber/step-execution-subscriber.ts","../src/events/event-system.ts","../src/ffi/ffi-layer.ts","../src/handler/base.ts","../src/handler/mixins/api.ts","../src/handler/api.ts","../src/types/batch.ts","../src/handler/batchable.ts","../src/handler/mixins/decision.ts","../src/handler/decision.ts","../src/handler/domain-events.ts","../src/registry/errors.ts","../src/registry/handler-definition.ts","../src/registry/method-dispatch-wrapper.ts","../src/registry/registry-resolver.ts","../src/registry/resolver-chain.ts","../src/registry/resolvers/index.ts","../src/handler/registry.ts","../src/handler/handler-system.ts","../src/server/shutdown-controller.ts","../src/server/types.ts","../src/server/worker-server.ts"],"names":["ErrorType","loggerOptions","pino","log","DecisionType","existsSync","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TAS-93: Explicit mapping resolver (priority 10).\n *\n * Resolves handlers from explicitly registered mappings.\n * This is the highest priority resolver in the default chain.\n *\n * Supports registering:\n * - Handler classes (instantiated on resolve)\n * - Handler instances (returned directly)\n * - Factory functions (called with config on resolve)\n *\n * @example\n * ```typescript\n * const resolver = new ExplicitMappingResolver();\n *\n * // Register a class\n * resolver.register('my_handler', MyHandler);\n *\n * // Register an instance\n * resolver.register('shared_handler', new SharedHandler());\n *\n * // Register a factory\n * resolver.register('configurable_handler', (config) => new ConfigHandler(config));\n *\n * // Resolve\n * const definition: HandlerDefinition = { callable: 'my_handler' };\n * const handler = await resolver.resolve(definition);\n * ```\n */\n\nimport type { StepHandler, StepHandlerClass } from '../../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from '../base-resolver.js';\nimport type { HandlerDefinition } from '../handler-definition.js';\n\n/**\n * Factory function for creating handlers.\n */\nexport type HandlerFactory = (config: ResolverConfig) => StepHandler;\n\n/**\n * Entry types that can be registered.\n */\nexport type HandlerEntry = StepHandlerClass | StepHandler | HandlerFactory;\n\n/**\n * Resolver for explicitly registered handlers.\n *\n * Priority 10 - checked first in the default chain.\n */\nexport class ExplicitMappingResolver implements BaseResolver {\n readonly name: string;\n readonly priority = 10;\n\n private handlers: Map<string, HandlerEntry> = new Map();\n\n /**\n * Create an explicit mapping resolver.\n *\n * @param name - Resolver name (default: 'explicit_mapping')\n */\n constructor(name = 'explicit_mapping') {\n this.name = name;\n }\n\n /**\n * Check if a handler is registered for this callable.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if handler is registered\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n return this.handlers.has(definition.callable);\n }\n\n /**\n * Resolve and instantiate a registered handler.\n *\n * @param definition - Handler definition\n * @param config - Configuration passed to factories\n * @returns Handler instance or null if not registered\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n const entry = this.handlers.get(definition.callable);\n if (!entry) {\n return null;\n }\n\n return this.instantiateHandler(entry, definition, config ?? {});\n }\n\n /**\n * Register a handler.\n *\n * @param key - Handler identifier (matched against definition.callable)\n * @param handler - Handler class, instance, or factory function\n */\n register(key: string, handler: HandlerEntry): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * Unregister a handler.\n *\n * @param key - Handler identifier to remove\n * @returns True if handler was removed, false if not found\n */\n unregister(key: string): boolean {\n return this.handlers.delete(key);\n }\n\n /**\n * Get all registered callable keys.\n *\n * @returns Array of registered keys\n */\n registeredCallables(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Instantiate a handler from a registered entry.\n */\n private instantiateHandler(\n entry: HandlerEntry,\n definition: HandlerDefinition,\n config: ResolverConfig\n ): StepHandler | null {\n // Check if it's a class (has prototype and is a function)\n if (this.isHandlerClass(entry)) {\n return this.instantiateClass(entry, definition);\n }\n\n // Check if it's a factory function (function but not a class)\n if (typeof entry === 'function') {\n try {\n return entry(config);\n } catch (error) {\n console.error(`[ExplicitMappingResolver] Factory failed:`, error);\n return null;\n }\n }\n\n // Otherwise it's an instance - return directly\n return entry as StepHandler;\n }\n\n /**\n * Check if entry is a handler class.\n */\n private isHandlerClass(entry: HandlerEntry): entry is StepHandlerClass {\n return typeof entry === 'function' && entry.prototype !== undefined && 'handlerName' in entry;\n }\n\n /**\n * Instantiate a handler class.\n */\n private instantiateClass(\n handlerClass: StepHandlerClass,\n _definition: HandlerDefinition\n ): StepHandler | null {\n try {\n return new handlerClass();\n } catch (error) {\n console.error(`[ExplicitMappingResolver] Failed to instantiate ${handlerClass.name}:`, error);\n return null;\n }\n }\n}\n","/**\n * TAS-93: Class lookup resolver (priority 100).\n *\n * Infers handler classes from callable strings using dynamic imports.\n * This resolver handles module path formats.\n *\n * Supports callable formats:\n * - \"./path/to/handler.js\" - Relative module path\n * - \"../parent/handler.js\" - Parent-relative module path\n * - \"@scope/package/handler\" - Scoped package path\n *\n * NOT supported (security):\n * - \"/absolute/path/to/handler.js\" - Absolute paths are blocked to prevent\n * loading arbitrary code in shared hosting environments.\n *\n * The module must export a class with a static `handlerName` property\n * matching the expected handler interface.\n *\n * Note: This resolver is lower priority (100) because dynamic imports\n * are more expensive than explicit mappings.\n *\n * @example\n * ```typescript\n * const resolver = new ClassLookupResolver();\n *\n * // Resolve from module path\n * const definition: HandlerDefinition = {\n * callable: './handlers/payment-handler.js',\n * };\n * const handler = await resolver.resolve(definition);\n * ```\n */\n\nimport type { StepHandler, StepHandlerClass } from '../../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from '../base-resolver.js';\nimport type { HandlerDefinition } from '../handler-definition.js';\n\n/**\n * Pattern to match importable paths.\n *\n * Matches:\n * - Relative paths: ./foo, ../foo\n * - Package paths: @scope/foo\n *\n * Note: Absolute paths (/foo/bar) are intentionally NOT supported\n * to prevent loading arbitrary code from the filesystem in shared\n * hosting environments.\n */\nconst IMPORTABLE_PATTERN = /^(\\.\\.?\\/|@[\\w-]+\\/)/;\n\n/**\n * Resolver that infers handlers from module paths via dynamic import.\n *\n * Priority 100 - checked last in the default chain (inferential).\n */\nexport class ClassLookupResolver implements BaseResolver {\n readonly name = 'class_lookup';\n readonly priority = 100;\n\n /**\n * Check if callable looks like an importable path.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if callable matches importable pattern\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n return IMPORTABLE_PATTERN.test(definition.callable);\n }\n\n /**\n * Resolve handler by dynamically importing the module.\n *\n * Looks for:\n * 1. Default export that is a handler class\n * 2. Named exports that are handler classes\n *\n * @param definition - Handler definition with module path\n * @param _config - Unused, part of interface\n * @returns Handler instance or null if not found\n */\n async resolve(\n definition: HandlerDefinition,\n _config?: ResolverConfig\n ): Promise<StepHandler | null> {\n // Security check: only allow paths that pass canResolve\n if (!this.canResolve(definition)) {\n return null;\n }\n\n const modulePath = definition.callable;\n\n try {\n const module = await import(modulePath);\n const handlerClass = this.findHandlerClass(module);\n\n if (!handlerClass) {\n return null;\n }\n\n return this.instantiateHandler(handlerClass);\n } catch (error) {\n // Import failed - log and return null to allow chain to continue\n console.debug(\n `[ClassLookupResolver] Failed to import '${modulePath}':`,\n error instanceof Error ? error.message : error\n );\n return null;\n }\n }\n\n /**\n * Find a handler class in a module's exports.\n */\n private findHandlerClass(module: Record<string, unknown>): StepHandlerClass | null {\n // Try default export first\n if (this.isHandlerClass(module.default)) {\n return module.default;\n }\n\n // Look through named exports\n for (const [, exported] of Object.entries(module)) {\n if (this.isHandlerClass(exported)) {\n return exported;\n }\n }\n\n return null;\n }\n\n /**\n * Check if a value is a valid handler class.\n */\n private isHandlerClass(value: unknown): value is StepHandlerClass {\n return (\n value !== null &&\n typeof value === 'function' &&\n 'handlerName' in value &&\n typeof (value as StepHandlerClass).handlerName === 'string'\n );\n }\n\n /**\n * Instantiate a handler class.\n */\n private instantiateHandler(handlerClass: StepHandlerClass): StepHandler | null {\n try {\n return new handlerClass();\n } catch (error) {\n console.error(`[ClassLookupResolver] Failed to instantiate ${handlerClass.name}:`, error);\n return null;\n }\n }\n}\n","/**\n * Bootstrap configuration and result types.\n *\n * TAS-290: With napi-rs, FFI types are already camelCase, so conversion\n * functions are simplified (mostly pass-through).\n */\n\nimport type {\n BootstrapConfig as FfiBootstrapConfig,\n BootstrapResult as FfiBootstrapResult,\n WorkerStatus as FfiWorkerStatus,\n} from '../ffi/types.js';\n\n// Re-export FFI types for convenience\nexport type { FfiBootstrapConfig, FfiBootstrapResult, FfiWorkerStatus };\n\n/**\n * Configuration for worker bootstrap.\n *\n * Matches Python's BootstrapConfig and Ruby's bootstrap options.\n */\nexport interface BootstrapConfig {\n /** Optional worker ID. Auto-generated if not provided. */\n workerId?: string;\n\n /** Task namespace this worker handles (default: \"default\"). */\n namespace?: string;\n\n /** Path to custom configuration file (TOML). */\n configPath?: string;\n\n /** Log level: trace, debug, info, warn, error (default: \"info\"). */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n\n /** Database URL override. */\n databaseUrl?: string;\n}\n\n/**\n * Result from worker bootstrap.\n */\nexport interface BootstrapResult {\n /** Whether bootstrap was successful. */\n success: boolean;\n\n /** Current status (started, already_running, error). */\n status: 'started' | 'already_running' | 'error';\n\n /** Human-readable status message. */\n message: string;\n\n /** Unique identifier for this worker instance. */\n workerId?: string;\n\n /** Error message if bootstrap failed. */\n error?: string;\n}\n\n/**\n * Current worker status.\n */\nexport interface WorkerStatus {\n /** Whether the status query succeeded. */\n success: boolean;\n\n /** Whether the worker is currently running. */\n running: boolean;\n\n /** Current status string. */\n status?: string;\n\n /** Worker ID if running. */\n workerId?: string;\n\n /** Current environment (test, development, production). */\n environment?: string;\n\n /** Internal worker core status. */\n workerCoreStatus?: string;\n\n /** Whether the web API is enabled. */\n webApiEnabled?: boolean;\n\n /** List of task namespaces this worker handles. */\n supportedNamespaces?: string[];\n\n /** Total database connection pool size. */\n databasePoolSize?: number;\n\n /** Number of idle database connections. */\n databasePoolIdle?: number;\n}\n\n/**\n * Result from stopping the worker.\n */\nexport interface StopResult {\n /** Whether the stop was successful. */\n success: boolean;\n\n /** Current status (stopped, not_running, error). */\n status: 'stopped' | 'not_running' | 'error';\n\n /** Human-readable status message. */\n message: string;\n\n /** Worker ID that was stopped. */\n workerId?: string;\n\n /** Error message if stop failed. */\n error?: string;\n}\n\n/**\n * Convert TypeScript BootstrapConfig to FFI format.\n *\n * TAS-290: With napi-rs, the FFI BootstrapConfig is already camelCase.\n * Only namespace and configPath are passed to the Rust layer.\n */\nexport function toFfiBootstrapConfig(config?: BootstrapConfig): FfiBootstrapConfig {\n if (!config) {\n return {};\n }\n\n const result: FfiBootstrapConfig = {};\n if (config.namespace !== undefined) result.namespace = config.namespace;\n if (config.configPath !== undefined) result.configPath = config.configPath;\n return result;\n}\n\n/**\n * Convert FFI BootstrapResult to TypeScript format.\n *\n * TAS-290: FFI result is already camelCase, minimal conversion needed.\n */\nexport function fromFfiBootstrapResult(result: FfiBootstrapResult): BootstrapResult {\n const out: BootstrapResult = {\n success: result.success,\n status: result.status as BootstrapResult['status'],\n message: result.message,\n };\n if (result.workerId != null) out.workerId = result.workerId;\n return out;\n}\n\n/**\n * Convert FFI WorkerStatus to TypeScript format.\n */\nexport function fromFfiWorkerStatus(status: FfiWorkerStatus): WorkerStatus {\n const out: WorkerStatus = {\n success: status.success,\n running: status.running,\n };\n if (status.status != null) out.status = status.status;\n if (status.workerId != null) out.workerId = status.workerId;\n if (status.environment != null) out.environment = status.environment;\n return out;\n}\n\n/**\n * Convert FFI WorkerStatus to StopResult format.\n */\nexport function fromFfiStopResult(result: FfiWorkerStatus): StopResult {\n const out: StopResult = {\n success: result.success,\n status: result.running ? 'stopped' : 'not_running',\n message: result.status ?? 'Worker stopped',\n };\n if (result.workerId != null) out.workerId = result.workerId;\n return out;\n}\n","/**\n * Bootstrap API for TypeScript workers.\n *\n * High-level TypeScript API for worker lifecycle management.\n * Wraps FFI calls with type-safe interfaces and error handling.\n *\n * Matches Python's bootstrap.py and Ruby's bootstrap.rb (TAS-92 aligned).\n *\n * TAS-290: Uses NapiModule directly instead of TaskerRuntime abstraction.\n * All functions require an explicit module parameter. Use FfiLayer to load\n * the module before calling these functions.\n */\n\nimport type { NapiModule } from '../ffi/ffi-layer.js';\nimport type { BootstrapConfig, BootstrapResult, StopResult, WorkerStatus } from './types.js';\nimport {\n fromFfiBootstrapResult,\n fromFfiStopResult,\n fromFfiWorkerStatus,\n toFfiBootstrapConfig,\n} from './types.js';\n\n/**\n * Initialize the worker system.\n *\n * This function bootstraps the full tasker-worker system, including:\n * - Creating a Tokio runtime for async operations\n * - Connecting to the database\n * - Setting up the FFI dispatch channel for step events\n * - Subscribing to domain events\n *\n * @param config - Optional bootstrap configuration\n * @param module - The loaded napi-rs module (required)\n * @returns BootstrapResult with worker details and status\n * @throws Error if bootstrap fails critically\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const result = await bootstrapWorker({ namespace: 'payments' }, ffiLayer.getModule());\n * console.log(`Worker ${result.workerId} started`);\n * ```\n */\nexport async function bootstrapWorker(\n config: BootstrapConfig | undefined,\n module: NapiModule\n): Promise<BootstrapResult> {\n try {\n if (!module) {\n return {\n success: false,\n status: 'error',\n message: 'Module not loaded. Ensure the FFI library is available.',\n error: 'Module not loaded',\n };\n }\n\n const ffiConfig = toFfiBootstrapConfig(config);\n const ffiResult = module.bootstrapWorker(ffiConfig);\n return fromFfiBootstrapResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Bootstrap failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Stop the worker system gracefully.\n *\n * This function stops the worker system and releases all resources.\n * Safe to call even if the worker is not running.\n *\n * @param module - The loaded napi-rs module (optional - returns success if not loaded)\n * @returns StopResult indicating the outcome\n *\n * @example\n * ```typescript\n * const result = stopWorker(module);\n * if (result.success) {\n * console.log('Worker stopped successfully');\n * }\n * ```\n */\nexport function stopWorker(module?: NapiModule): StopResult {\n if (!module) {\n return {\n success: true,\n status: 'not_running',\n message: 'Module not loaded',\n };\n }\n\n try {\n const ffiResult = module.stopWorker();\n return fromFfiStopResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Stop failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get the current worker system status.\n *\n * Returns detailed information about the worker's current state,\n * including resource usage and operational status.\n *\n * @param module - The loaded napi-rs module (optional - returns stopped if not loaded)\n * @returns WorkerStatus with current state and metrics\n *\n * @example\n * ```typescript\n * const status = getWorkerStatus(module);\n * if (status.running) {\n * console.log(`Pool size: ${status.databasePoolSize}`);\n * } else {\n * console.log(`Worker not running`);\n * }\n * ```\n */\nexport function getWorkerStatus(module?: NapiModule): WorkerStatus {\n if (!module) {\n return {\n success: false,\n running: false,\n status: 'stopped',\n };\n }\n\n try {\n const ffiStatus = module.getWorkerStatus();\n return fromFfiWorkerStatus(ffiStatus);\n } catch (_error) {\n return {\n success: false,\n running: false,\n status: 'stopped',\n };\n }\n}\n\n/**\n * Initiate graceful shutdown of the worker system.\n *\n * This function begins the graceful shutdown process, allowing\n * in-flight operations to complete before fully stopping.\n * Call stopWorker() after this to fully stop the worker.\n *\n * @param module - The loaded napi-rs module (optional - returns success if not loaded)\n * @returns StopResult indicating the transition status\n *\n * @example\n * ```typescript\n * // Start graceful shutdown\n * transitionToGracefulShutdown(module);\n *\n * // Wait for in-flight operations...\n * await new Promise(resolve => setTimeout(resolve, 5000));\n *\n * // Fully stop\n * stopWorker(module);\n * ```\n */\nexport function transitionToGracefulShutdown(module?: NapiModule): StopResult {\n if (!module) {\n return {\n success: true,\n status: 'not_running',\n message: 'Module not loaded',\n };\n }\n\n try {\n const ffiResult = module.transitionToGracefulShutdown();\n return fromFfiStopResult(ffiResult);\n } catch (error) {\n return {\n success: false,\n status: 'error',\n message: `Graceful shutdown failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check if the worker system is currently running.\n *\n * Lightweight check that doesn't query the full status.\n *\n * @param module - The loaded napi-rs module (optional - returns false if not loaded)\n * @returns True if the worker is running\n *\n * @example\n * ```typescript\n * if (!isWorkerRunning(module)) {\n * await bootstrapWorker(config, module);\n * }\n * ```\n */\nexport function isWorkerRunning(module?: NapiModule): boolean {\n if (!module) {\n return false;\n }\n\n try {\n return module.isWorkerRunning();\n } catch {\n return false;\n }\n}\n\n/**\n * Get version information for the worker system.\n *\n * @param module - The loaded napi-rs module (optional)\n * @returns Version string from the Rust library\n */\nexport function getVersion(module?: NapiModule): string {\n if (!module) {\n return 'unknown (module not loaded)';\n }\n\n try {\n return module.getVersion();\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Get detailed Rust library version.\n *\n * @param module - The loaded napi-rs module (optional)\n * @returns Detailed version information\n */\nexport function getRustVersion(module?: NapiModule): string {\n if (!module) {\n return 'unknown (module not loaded)';\n }\n\n try {\n return module.getRustVersion();\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Perform a health check on the FFI module.\n *\n * @param module - The loaded napi-rs module (optional - returns false if not loaded)\n * @returns True if the FFI module is functional\n */\nexport function healthCheck(module?: NapiModule): boolean {\n if (!module) {\n return false;\n }\n\n try {\n return module.healthCheck();\n } catch {\n return false;\n }\n}\n","/**\n * High-level client wrapper for orchestration API operations.\n *\n * TAS-290: With napi-rs, requests are passed as typed objects directly —\n * no JSON.stringify() at the boundary. This eliminates TAS-283 trailing\n * input bugs.\n *\n * @example\n * ```typescript\n * import { FfiLayer, TaskerClient } from '@tasker-systems/tasker';\n *\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const client = new TaskerClient(ffiLayer);\n *\n * const task = client.createTask({ name: 'process_order', namespace: 'ecommerce' });\n * console.log(task.taskUuid);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { FfiLayer } from '../ffi/ffi-layer.js';\nimport type { NapiClientResult, NapiListTasksParams, NapiTaskRequest } from '../ffi/types.js';\n\n/**\n * Options for creating a task.\n *\n * Only `name` is required; all other fields have sensible defaults.\n */\nexport interface CreateTaskOptions {\n /** Named task template name */\n name: string;\n /** Task namespace (default: 'default') */\n namespace?: string;\n /** Workflow context passed to step handlers (default: {}) */\n context?: Record<string, unknown>;\n /** Template version (default: '1.0.0') */\n version?: string;\n /** Who initiated the request (default: 'tasker-core-typescript') */\n initiator?: string;\n /** Originating system (default: 'tasker-core') */\n sourceSystem?: string;\n /** Reason for creating the task (default: 'Task requested') */\n reason?: string;\n /** Optional tags */\n tags?: string[];\n /** Optional priority */\n priority?: number;\n /** Optional correlation ID (auto-generated if not provided) */\n correlationId?: string;\n /** Optional parent correlation ID */\n parentCorrelationId?: string;\n /** Optional idempotency key */\n idempotencyKey?: string;\n}\n\n/**\n * Options for listing tasks.\n */\nexport interface ListTasksOptions {\n /** Maximum number of results (default: 50) */\n limit?: number;\n /** Pagination offset (default: 0) */\n offset?: number;\n /** Filter by namespace */\n namespace?: string;\n /** Filter by status */\n status?: string;\n}\n\n/**\n * Error thrown when a client operation fails.\n */\nexport class TaskerClientError extends Error {\n /** Whether the error is potentially recoverable */\n readonly recoverable: boolean;\n\n constructor(message: string, recoverable = false) {\n super(message);\n this.name = 'TaskerClientError';\n this.recoverable = recoverable;\n }\n}\n\n/**\n * High-level client for orchestration API operations.\n *\n * Wraps the raw FFI methods with typed interfaces, sensible defaults,\n * and proper error handling via `TaskerClientError`.\n */\nexport class TaskerClient {\n private readonly ffiLayer: FfiLayer;\n\n constructor(ffiLayer: FfiLayer) {\n this.ffiLayer = ffiLayer;\n }\n\n /**\n * Create a task via the orchestration API.\n *\n * @param options - Task creation options (only `name` is required)\n * @returns Typed task response data\n * @throws TaskerClientError if the operation fails\n */\n createTask(options: CreateTaskOptions): unknown {\n const request: NapiTaskRequest = {\n name: options.name,\n namespace: options.namespace ?? 'default',\n version: options.version ?? '1.0.0',\n context: options.context ?? {},\n initiator: options.initiator ?? 'tasker-core-typescript',\n sourceSystem: options.sourceSystem ?? 'tasker-core',\n reason: options.reason ?? 'Task requested',\n tags: options.tags ?? [],\n };\n if (options.priority !== undefined) request.priority = options.priority;\n if (options.correlationId !== undefined) request.correlationId = options.correlationId;\n else request.correlationId = crypto.randomUUID();\n if (options.parentCorrelationId !== undefined)\n request.parentCorrelationId = options.parentCorrelationId;\n if (options.idempotencyKey !== undefined) request.idempotencyKey = options.idempotencyKey;\n\n const result = this.getModule().clientCreateTask(request);\n return this.unwrap(result);\n }\n\n /**\n * Get a task by UUID.\n *\n * @param taskUuid - The task UUID\n * @returns Typed task response data\n * @throws TaskerClientError if the operation fails\n */\n getTask(taskUuid: string): unknown {\n const result = this.getModule().clientGetTask(taskUuid);\n return this.unwrap(result);\n }\n\n /**\n * List tasks with optional filtering and pagination.\n *\n * @param options - Filtering and pagination options\n * @returns Typed task list response data\n * @throws TaskerClientError if the operation fails\n */\n listTasks(options: ListTasksOptions = {}): unknown {\n const params: NapiListTasksParams = {\n limit: options.limit ?? 50,\n offset: options.offset ?? 0,\n };\n if (options.namespace !== undefined) params.namespace = options.namespace;\n if (options.status !== undefined) params.status = options.status;\n\n const result = this.getModule().clientListTasks(params);\n return this.unwrap(result);\n }\n\n /**\n * Cancel a task by UUID.\n *\n * @param taskUuid - The task UUID\n * @throws TaskerClientError if the operation fails\n */\n cancelTask(taskUuid: string): void {\n const result = this.getModule().clientCancelTask(taskUuid);\n this.unwrap(result);\n }\n\n /**\n * List workflow steps for a task.\n *\n * @param taskUuid - The task UUID\n * @returns Array of step data\n * @throws TaskerClientError if the operation fails\n */\n listTaskSteps(taskUuid: string): unknown {\n const result = this.getModule().clientListTaskSteps(taskUuid);\n return this.unwrap(result);\n }\n\n /**\n * Get a specific workflow step.\n *\n * @param taskUuid - The task UUID\n * @param stepUuid - The step UUID\n * @returns Typed step response data\n * @throws TaskerClientError if the operation fails\n */\n getStep(taskUuid: string, stepUuid: string): unknown {\n const result = this.getModule().clientGetStep(taskUuid, stepUuid);\n return this.unwrap(result);\n }\n\n /**\n * Get audit history for a workflow step.\n *\n * @param taskUuid - The task UUID\n * @param stepUuid - The step UUID\n * @returns Array of audit history entries\n * @throws TaskerClientError if the operation fails\n */\n getStepAuditHistory(taskUuid: string, stepUuid: string): unknown {\n const result = this.getModule().clientGetStepAuditHistory(taskUuid, stepUuid);\n return this.unwrap(result);\n }\n\n /**\n * Check orchestration API health.\n *\n * @returns Typed health response data\n * @throws TaskerClientError if the operation fails\n */\n healthCheck(): unknown {\n const result = this.getModule().clientHealthCheck();\n return this.unwrap(result);\n }\n\n /**\n * Unwrap a NapiClientResult envelope, throwing on error.\n */\n private unwrap(result: NapiClientResult): unknown {\n if (!result.success) {\n throw new TaskerClientError(\n result.error ?? 'Unknown client error',\n result.recoverable ?? false\n );\n }\n return result.data;\n }\n\n /**\n * Get the napi-rs module from the layer.\n */\n private getModule() {\n return this.ffiLayer.getModule();\n }\n}\n","/**\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 * TAS-290: Uses NapiModule directly instead of TaskerRuntime.\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { NapiModule } from '../ffi/ffi-layer.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 module: NapiModule;\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 module - The napi-rs module 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(module: NapiModule, emitter: TaskerEventEmitter, config: EventPollerConfig = {}) {\n this.module = module;\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 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.module.pollStepEvents();\n if (event === null) {\n break; // No more events\n }\n\n eventsProcessed++;\n const handlerCallable = event.stepDefinition.handlerCallable;\n log.info(\n {\n component: 'event-poller',\n operation: 'event_received',\n stepUuid: event.stepUuid,\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.module.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.stepDefinition.handlerCallable;\n log.debug(\n {\n component: 'event-poller',\n operation: 'handle_step_event',\n stepUuid: event.stepUuid,\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.stepUuid,\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.stepUuid,\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.stepUuid,\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.stepUuid },\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.stepUuid },\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.module.checkStarvationWarnings();\n\n const metrics = this.module.getFfiDispatchMetrics();\n if (metrics.starvationDetected) {\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.module.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 module, emitter, and configuration\n */\nexport function createEventPoller(\n module: NapiModule,\n emitter: TaskerEventEmitter,\n config?: EventPollerConfig\n): EventPoller {\n return new EventPoller(module, 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 { NapiModule } from '../ffi/ffi-layer.js';\nimport type { LogFields as FfiLogFields } from '../ffi/types.js';\n\n/**\n * Installed module for logging.\n * Set via setLoggingRuntime() for explicit dependency injection.\n */\nlet installedModule: NapiModule | null = null;\n\n/**\n * Install a napi module 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 module - The napi module to use for logging\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * setLoggingRuntime(ffiLayer.getModule());\n * ```\n */\nexport function setLoggingRuntime(module: NapiModule): void {\n installedModule = module;\n}\n\n/**\n * Clear the installed logging runtime.\n *\n * Primarily for testing.\n */\nexport function clearLoggingRuntime(): void {\n installedModule = null;\n}\n\n/**\n * Get the module for logging.\n * Returns null if no module is installed (falls back to console).\n * @internal\n */\nfunction getLoggingModule(): NapiModule | null {\n return installedModule;\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 */\nexport function logError(message: string, fields?: LogFields): void {\n const module = getLoggingModule();\n if (!module) {\n fallbackLog('error', message, fields);\n return;\n }\n\n try {\n module.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 */\nexport function logWarn(message: string, fields?: LogFields): void {\n const module = getLoggingModule();\n if (!module) {\n fallbackLog('warn', message, fields);\n return;\n }\n\n try {\n module.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 */\nexport function logInfo(message: string, fields?: LogFields): void {\n const module = getLoggingModule();\n if (!module) {\n fallbackLog('info', message, fields);\n return;\n }\n\n try {\n module.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 */\nexport function logDebug(message: string, fields?: LogFields): void {\n const module = getLoggingModule();\n if (!module) {\n fallbackLog('debug', message, fields);\n return;\n }\n\n try {\n module.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 */\nexport function logTrace(message: string, fields?: LogFields): void {\n const module = getLoggingModule();\n if (!module) {\n fallbackLog('trace', message, fields);\n return;\n }\n\n try {\n module.logTrace(message, toFfiFields(fields));\n } catch {\n fallbackLog('trace', message, fields);\n }\n}\n\n/**\n * Create a logger with preset fields.\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","/**\n * Standard error types for cross-language consistency.\n *\n * These values align with Ruby and Python worker implementations\n * and are used by the orchestration layer for retry decisions.\n *\n * @see TAS-92 Cross-Language API Alignment\n */\nexport enum ErrorType {\n /**\n * Permanent, non-recoverable failure.\n * Examples: invalid input, resource not found, authentication failure.\n */\n PERMANENT_ERROR = 'permanent_error',\n\n /**\n * Transient failure that may succeed on retry.\n * Examples: network timeout, service unavailable, rate limiting.\n */\n RETRYABLE_ERROR = 'retryable_error',\n\n /**\n * Input validation failure.\n * Examples: missing required field, invalid format, constraint violation.\n */\n VALIDATION_ERROR = 'validation_error',\n\n /**\n * Operation timed out.\n * Examples: HTTP request timeout, database query timeout.\n */\n TIMEOUT = 'timeout',\n\n /**\n * Failure within the step handler itself.\n * Examples: unhandled exception, handler misconfiguration.\n */\n HANDLER_ERROR = 'handler_error',\n}\n\n/**\n * Check if an error type is one of the standard values.\n *\n * @param errorType - The error type string to check\n * @returns True if the error type matches one of the standard values\n *\n * @example\n * isStandardErrorType('permanent_error'); // true\n * isStandardErrorType('custom_error'); // false\n */\nexport function isStandardErrorType(errorType: string): boolean {\n return Object.values(ErrorType).includes(errorType as ErrorType);\n}\n\n/**\n * Get the recommended retryable flag for a given error type.\n *\n * @param errorType - The error type string\n * @returns True if the error type is typically retryable\n *\n * @example\n * isTypicallyRetryable('timeout'); // true\n * isTypicallyRetryable('permanent_error'); // false\n */\nexport function isTypicallyRetryable(errorType: string): boolean {\n return [ErrorType.RETRYABLE_ERROR, ErrorType.TIMEOUT].includes(errorType as ErrorType);\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 stepDefinition.handlerInitialization) */\n public readonly stepConfig: Record<string, unknown>;\n\n /** Step-specific inputs (from workflowStep.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 * TAS-290: All field access uses camelCase (napi-rs auto-converts).\n *\n * The FFI data structure mirrors the Ruby TaskSequenceStepWrapper:\n * - task.context -> inputData (task context with user inputs)\n * - dependencyResults -> results from parent steps\n * - stepDefinition.handlerInitialization -> stepConfig\n * - workflowStep.attempts -> retryCount\n * - workflowStep.maxAttempts -> maxRetries\n * - workflowStep.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.dependencyResults as Record<string, unknown>) ?? {};\n\n // Extract step config from handler initialization (flattened in napi-rs)\n const stepDefinition = event.stepDefinition ?? {};\n const stepConfig = (stepDefinition.handlerInitialization as Record<string, unknown>) ?? {};\n\n // Extract retry information and step inputs from workflowStep\n const workflowStep = event.workflowStep ?? {};\n const retryCount = workflowStep.attempts ?? 0;\n const maxRetries = workflowStep.maxAttempts ?? 3;\n const stepInputs = (workflowStep.inputs as Record<string, unknown>) ?? {};\n\n return new StepContext({\n event,\n taskUuid: event.taskUuid,\n stepUuid: event.stepUuid,\n correlationId: event.correlationId,\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 * Note: Checkpoint data from the database uses snake_case keys\n * (cursor, items_processed, accumulated_results) because it's stored\n * as a serde_json::Value that passes through napi-rs as-is.\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.workflowStep ?? {};\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","import type { NapiOrchestrationMetadata } from '../ffi/types.js';\nimport { ErrorType } from './error-type';\n\n/**\n * Configuration for a batch worker instance.\n *\n * Used by batchable handlers to define the work partition for each worker.\n */\nexport interface BatchWorkerConfig {\n /** Unique identifier for this batch */\n batch_id: string;\n /** Starting cursor position (inclusive) */\n cursor_start: number;\n /** Ending cursor position (exclusive) */\n cursor_end: number;\n /** Number of rows/items in this batch */\n row_count: number;\n /** Index of this worker (0-based) */\n worker_index: number;\n /** Total number of workers processing this data */\n total_workers: number;\n /** Optional additional metadata for this batch */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result type alias for batchable handlers.\n *\n * Batchable handlers return this type which is a StepHandlerResult\n * with batch-specific metadata.\n */\nexport type BatchableResult = StepHandlerResult;\n\n/**\n * Parameters for constructing a StepHandlerResult.\n */\nexport interface StepHandlerResultParams {\n success: boolean;\n result?: Record<string, unknown> | null;\n errorMessage?: string | null;\n errorType?: string | null;\n errorCode?: string | null;\n retryable?: boolean;\n metadata?: Record<string, unknown>;\n orchestrationMetadata?: NapiOrchestrationMetadata | null;\n}\n\n/**\n * Result from a step handler execution.\n *\n * Step handlers return this to indicate success or failure,\n * along with any output data or error details.\n *\n * Matches Python's StepHandlerResult and Ruby's StepHandlerCallResult.\n *\n * @example Success case\n * ```typescript\n * return StepHandlerResult.success({ processed: 100 });\n * ```\n *\n * @example Failure case\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Validation failed',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n *\n * @example Failure with error code\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Payment gateway timeout',\n * ErrorType.TIMEOUT,\n * true,\n * { gateway: 'stripe' },\n * 'GATEWAY_TIMEOUT'\n * );\n * ```\n */\nexport class StepHandlerResult {\n /** Whether the handler executed successfully */\n public readonly success: boolean;\n\n /** Handler output data (success case) */\n public readonly result: Record<string, unknown> | null;\n\n /** Error message (failure case) */\n public readonly errorMessage: string | null;\n\n /** Error type/category for classification */\n public readonly errorType: string | null;\n\n /** Optional application-specific error code */\n public readonly errorCode: string | null;\n\n /** Whether the error is retryable */\n public readonly retryable: boolean;\n\n /** Additional execution metadata */\n public readonly metadata: Record<string, unknown>;\n\n /** Orchestration metadata for workflow coordination hints (e.g., backoff, headers) */\n public readonly orchestrationMetadata: NapiOrchestrationMetadata | null;\n\n constructor(params: StepHandlerResultParams) {\n this.success = params.success;\n this.result = params.result ?? null;\n this.errorMessage = params.errorMessage ?? null;\n this.errorType = params.errorType ?? null;\n this.errorCode = params.errorCode ?? null;\n this.retryable = params.retryable ?? true;\n this.metadata = params.metadata ?? {};\n this.orchestrationMetadata = params.orchestrationMetadata ?? null;\n }\n\n /**\n * Create a successful handler result.\n *\n * This is the primary factory method for creating success results.\n * Aligned with Ruby and Python worker APIs.\n *\n * @param result - The handler output data\n * @param metadata - Optional additional metadata\n * @returns A StepHandlerResult indicating success\n *\n * @example\n * ```typescript\n * return StepHandlerResult.success(\n * { processed: 100, skipped: 5 }\n * );\n * ```\n */\n static success(\n result: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return new StepHandlerResult({\n success: true,\n result,\n metadata: metadata ?? {},\n });\n }\n\n /**\n * Create a failure handler result.\n *\n * @param message - Human-readable error message\n * @param errorType - Error type/category for classification. Use ErrorType enum.\n * @param retryable - Whether the error is retryable (default: true)\n * @param metadata - Optional additional metadata\n * @param errorCode - Optional application-specific error code\n * @returns A StepHandlerResult indicating failure\n *\n * @example\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Invalid input format',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n *\n * @example With error code\n * ```typescript\n * return StepHandlerResult.failure(\n * 'Gateway timeout',\n * ErrorType.TIMEOUT,\n * true,\n * { duration_ms: 30000 },\n * 'GATEWAY_TIMEOUT'\n * );\n * ```\n */\n static failure(\n message: string,\n errorType: ErrorType | string = ErrorType.HANDLER_ERROR,\n retryable = true,\n metadata?: Record<string, unknown>,\n errorCode?: string\n ): StepHandlerResult {\n return new StepHandlerResult({\n success: false,\n errorMessage: message,\n // ErrorType enum values are already strings, so this works directly\n errorType: errorType as string,\n errorCode: errorCode ?? null,\n retryable,\n metadata: metadata ?? {},\n });\n }\n\n /**\n * Check if this result indicates success.\n */\n isSuccess(): boolean {\n return this.success;\n }\n\n /**\n * Check if this result indicates failure.\n */\n isFailure(): boolean {\n return !this.success;\n }\n\n /**\n * Convert to JSON for serialization.\n *\n * Uses snake_case keys to match the Rust FFI contract.\n */\n toJSON(): Record<string, unknown> {\n return {\n success: this.success,\n result: this.result,\n error_message: this.errorMessage,\n error_type: this.errorType,\n error_code: this.errorCode,\n retryable: this.retryable,\n metadata: this.metadata,\n orchestration_metadata: this.orchestrationMetadata,\n };\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 * TAS-290: Uses NapiModule directly instead of TaskerRuntime.\n * All field access uses camelCase (napi-rs auto-converts from Rust snake_case).\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 { NapiModule } from '../ffi/ffi-layer.js';\nimport type {\n NapiCheckpointYieldData,\n NapiStepEvent,\n NapiStepExecutionMetadata,\n NapiStepExecutionResult,\n} from '../ffi/types.js';\n\n/** @internal Alias for migration — use NapiStepEvent directly in new code */\ntype FfiStepEvent = NapiStepEvent;\n\nimport type { ExecutableHandler } from '../handler/base.js';\nimport { logDebug, logError, logInfo, logWarn } from '../logging/index.js';\nimport { ErrorType } from '../types/error-type.js';\nimport { StepContext } from '../types/step-context.js';\nimport { 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 * module,\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 module: NapiModule;\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 module - The napi-rs module for submitting results (required, no fallback)\n * @param config - Optional configuration for execution behavior\n */\n constructor(\n emitter: TaskerEventEmitter,\n registry: HandlerRegistryInterface,\n module: NapiModule,\n config: StepExecutionSubscriberConfig = {}\n ) {\n this.emitter = emitter;\n this.registry = registry;\n this.module = module;\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.eventId,\n stepUuid: payload.event.stepUuid,\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.eventId,\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.eventId },\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.eventId },\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.eventId,\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 * All paths produce a StepHandlerResult — the handler's result or a\n * system-level failure. This mirrors Python's pattern where system errors\n * (handler not found, timeout, uncaught exception) become\n * StepHandlerResult.failure() with appropriate error_type and retryable.\n */\n private async processEvent(event: FfiStepEvent): Promise<void> {\n pinoLog.info({ component: 'subscriber', eventId: event.eventId }, 'processEvent() starting');\n\n this.activeHandlers++;\n const startTime = Date.now();\n\n const { handlerResult, handlerName, handlerWasInvoked } =\n await this.resolveAndExecuteHandler(event);\n\n // Single submission path — the subscriber's only job here is to wrap\n // the handler result with execution metadata (timing, worker_id, step_uuid).\n const executionTimeMs = Date.now() - startTime;\n await this.submitResult(event, handlerResult, executionTimeMs);\n\n this.emitCompletionEvents(\n event,\n handlerResult,\n handlerName,\n executionTimeMs,\n handlerWasInvoked\n );\n this.activeHandlers--;\n }\n\n /**\n * Resolve handler from registry and execute it, returning a StepHandlerResult.\n *\n * System-level failures (no handler name, handler not found, uncaught exception)\n * are converted to StepHandlerResult.failure() with appropriate error_type and\n * retryable — the caller always gets a result, never an exception.\n */\n private async resolveAndExecuteHandler(event: FfiStepEvent): Promise<{\n handlerResult: StepHandlerResult;\n handlerName: string | null;\n handlerWasInvoked: boolean;\n }> {\n let handlerName: string | null = null;\n\n try {\n handlerName = this.extractHandlerName(event);\n pinoLog.info(\n { component: 'subscriber', eventId: event.eventId, handlerName },\n 'Extracted handler name'\n );\n\n if (!handlerName) {\n pinoLog.error(\n { component: 'subscriber', eventId: event.eventId },\n 'No handler name found!'\n );\n return {\n handlerResult: StepHandlerResult.failure(\n 'No handler name found in step definition',\n ErrorType.PERMANENT_ERROR,\n false\n ),\n handlerName,\n handlerWasInvoked: false,\n };\n }\n\n pinoLog.info(\n { component: 'subscriber', eventId: event.eventId, stepUuid: event.stepUuid, handlerName },\n 'Processing step event'\n );\n\n this.emitter.emit(StepEventNames.STEP_EXECUTION_STARTED, {\n eventId: event.eventId,\n stepUuid: event.stepUuid,\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 return {\n handlerResult: StepHandlerResult.failure(\n `Handler not found: ${handlerName}`,\n 'handler_not_found',\n false\n ),\n handlerName,\n handlerWasInvoked: false,\n };\n }\n\n return await this.invokeHandler(event, handler, handlerName);\n } catch (error) {\n // Uncaught exception — system-level error.\n // Use the error class name as the error type (matches Python pattern).\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorTypeName = error instanceof Error ? error.constructor.name : 'Error';\n\n logError('Handler execution failed', {\n component: 'subscriber',\n event_id: event.eventId,\n step_uuid: event.stepUuid,\n error_message: errorMessage,\n });\n\n return {\n handlerResult: StepHandlerResult.failure(errorMessage, errorTypeName, true, {\n traceback: error instanceof Error ? error.stack : undefined,\n }),\n handlerName,\n handlerWasInvoked: false,\n };\n }\n }\n\n /**\n * Create context and invoke the handler, returning its result.\n *\n * handlerWasInvoked is true only if the handler returned (not threw).\n */\n private async invokeHandler(\n event: FfiStepEvent,\n handler: ExecutableHandler,\n handlerName: string\n ): Promise<{\n handlerResult: StepHandlerResult;\n handlerName: string;\n handlerWasInvoked: boolean;\n }> {\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 const handlerResult = await this.executeWithTimeout(\n () => handler.call(context),\n this.handlerTimeoutMs\n );\n\n pinoLog.info(\n { component: 'subscriber', handlerName, success: handlerResult.success },\n 'Handler execution completed'\n );\n\n return { handlerResult, handlerName, handlerWasInvoked: true };\n }\n\n /**\n * Update counters and emit observability events after step completion.\n *\n * A handler returning failure() is still \"processed\" — the handler ran and\n * gave a definitive answer. Only system-level errors (handler not found,\n * timeout, uncaught exception) count as \"errors\".\n */\n private emitCompletionEvents(\n event: FfiStepEvent,\n handlerResult: StepHandlerResult,\n handlerName: string | null,\n executionTimeMs: number,\n handlerWasInvoked: boolean\n ): void {\n const name = handlerName ?? 'unknown';\n\n if (handlerResult.success || handlerWasInvoked) {\n // Handler ran and gave a definitive answer (success or explicit failure)\n this.processedCount++;\n } else {\n // System-level error — handler couldn't be found, timed out, or threw\n this.errorCount++;\n }\n\n const eventName = handlerResult.success\n ? StepEventNames.STEP_EXECUTION_COMPLETED\n : StepEventNames.STEP_EXECUTION_FAILED;\n\n this.emitter.emit(eventName, {\n eventId: event.eventId,\n stepUuid: event.stepUuid,\n handlerName: name,\n ...(handlerResult.success ? {} : { error: handlerResult.errorMessage }),\n executionTimeMs,\n timestamp: new Date(),\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 * TAS-290: With napi-rs, handler callable is flattened to stepDefinition.handlerCallable\n */\n private extractHandlerName(event: FfiStepEvent): string | null {\n return event.stepDefinition?.handlerCallable || 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({ component: 'subscriber', eventId: event.eventId }, 'submitResult() called');\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 serdeResult = this.buildStepExecutionResult(event, result, executionTimeMs);\n await this.sendCompletionViaFfi(event, serdeResult, 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.eventId },\n 'submitCheckpointYield() called - handler yielded checkpoint'\n );\n\n // Extract checkpoint data from the result\n const resultData = result.result ?? {};\n const checkpointData: NapiCheckpointYieldData = {\n stepUuid: event.stepUuid,\n cursor: resultData.cursor ?? 0,\n itemsProcessed: (resultData.items_processed as number) ?? 0,\n };\n\n // Only set accumulatedResults if it exists\n const accumulatedResults = resultData.accumulated_results as\n | Record<string, unknown>\n | undefined;\n if (accumulatedResults !== undefined) {\n checkpointData.accumulatedResults = accumulatedResults;\n }\n\n try {\n const success = this.module.checkpointYieldStepEvent(event.eventId, checkpointData);\n\n if (success) {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.eventId,\n cursor: checkpointData.cursor,\n itemsProcessed: checkpointData.itemsProcessed,\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.eventId,\n stepUuid: event.stepUuid,\n cursor: checkpointData.cursor,\n itemsProcessed: checkpointData.itemsProcessed,\n timestamp: new Date(),\n });\n\n logInfo('Checkpoint yield submitted', {\n component: 'subscriber',\n event_id: event.eventId,\n step_uuid: event.stepUuid,\n cursor: String(checkpointData.cursor),\n items_processed: String(checkpointData.itemsProcessed),\n });\n } else {\n pinoLog.error(\n { component: 'subscriber', eventId: event.eventId },\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.eventId,\n step_uuid: event.stepUuid,\n });\n }\n } catch (error) {\n pinoLog.error(\n {\n component: 'subscriber',\n eventId: event.eventId,\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.eventId,\n error_message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Build a NapiStepExecutionResult from a StepHandlerResult.\n *\n * The subscriber's only job here is to WRAP the handler result with\n * execution metadata (timing, worker_id, step_uuid). All handler decisions\n * (success, retryable, errorType, errorCode, orchestrationMetadata) are\n * passed through faithfully — the subscriber does not re-interpret them.\n *\n * This mirrors Python's _submit_result() which calls\n * StepExecutionResult.success_result() or .failure_result() passing\n * handler fields straight through.\n *\n * napi-rs #[napi(object)] maps Option<T> to `?: T`. With\n * exactOptionalPropertyTypes, optional props must be OMITTED (not null\n * or undefined) — hence the conditional spread pattern.\n */\n private buildStepExecutionResult(\n event: FfiStepEvent,\n result: StepHandlerResult,\n executionTimeMs: number\n ): NapiStepExecutionResult {\n const now = new Date().toISOString();\n\n // Execution metadata: timing + worker identity + handler-provided fields\n const metadata: NapiStepExecutionMetadata = {\n executionTimeMs,\n completedAt: now,\n ...(this.workerId != null && { workerId: this.workerId }),\n ...(Object.keys(result.metadata).length > 0 && { custom: result.metadata }),\n // Pass through handler's classification — subscriber doesn't interpret these\n ...(result.retryable != null && { retryable: result.retryable }),\n ...(result.errorType != null && { errorType: result.errorType }),\n ...(result.errorCode != null && { errorCode: result.errorCode }),\n };\n\n const napiResult: NapiStepExecutionResult = {\n stepUuid: event.stepUuid,\n success: result.success,\n result: result.result ?? {},\n status: result.success ? 'completed' : 'failed',\n metadata,\n };\n\n // Error details — only present when handler reported failure.\n // All fields come from the handler's StepHandlerResult.\n if (!result.success) {\n napiResult.error = {\n message: result.errorMessage ?? 'Unknown error',\n ...(result.errorType != null && { errorType: result.errorType }),\n ...(result.retryable != null && { retryable: result.retryable }),\n };\n }\n\n if (result.orchestrationMetadata != null) {\n napiResult.orchestrationMetadata = result.orchestrationMetadata;\n }\n\n return napiResult;\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 napiResult: NapiStepExecutionResult,\n isSuccess: boolean\n ): Promise<boolean> {\n pinoLog.info(\n {\n component: 'subscriber',\n eventId: event.eventId,\n stepUuid: event.stepUuid,\n success: napiResult.success,\n status: napiResult.status,\n },\n 'About to call module.completeStepEvent()'\n );\n\n try {\n const ffiResult = this.module.completeStepEvent(event.eventId, napiResult);\n\n if (ffiResult) {\n this.handleFfiSuccess(event, 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(event: FfiStepEvent, isSuccess: boolean): void {\n pinoLog.info(\n { component: 'subscriber', eventId: event.eventId, success: isSuccess },\n 'completeStepEvent() returned TRUE - completion accepted by Rust'\n );\n\n this.emitter.emit(StepEventNames.STEP_COMPLETION_SENT, {\n eventId: event.eventId,\n stepUuid: event.stepUuid,\n success: isSuccess,\n timestamp: new Date(),\n });\n\n logDebug('Step result submitted', {\n component: 'subscriber',\n event_id: event.eventId,\n step_uuid: event.stepUuid,\n success: String(isSuccess),\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.eventId,\n stepUuid: event.stepUuid,\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.eventId,\n step_uuid: event.stepUuid,\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.eventId,\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.eventId,\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 * TAS-290: Uses NapiModule directly instead of TaskerRuntime.\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 { NapiModule } from '../ffi/ffi-layer.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(module, 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 module - The napi-rs module 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 module: NapiModule,\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(module, this.emitter, config.poller);\n\n // Create subscriber with explicit emitter and module\n this.subscriber = new StepExecutionSubscriber(\n this.emitter,\n registry,\n module,\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?.eventId,\n stepUuid: payload.event?.stepUuid,\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","/**\n * FfiLayer - Owns napi-rs module loading and lifecycle.\n *\n * TAS-290: Simplified from the multi-runtime koffi approach.\n * The napi-rs `.node` file IS the runtime — no runtime detection,\n * no NodeRuntime/DenoRuntime adapters, no JSON serialization.\n *\n * Design principles:\n * - Explicit construction: No singleton pattern\n * - Clear ownership: Owns the napi module instance\n * - Explicit lifecycle: load() and unload() methods\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {\n BootstrapConfig,\n BootstrapResult,\n NapiCheckpointYieldData,\n NapiClientResult,\n NapiDispatchMetrics,\n NapiDomainEvent,\n NapiListTasksParams,\n NapiStepEvent,\n NapiStepExecutionResult,\n NapiTaskRequest,\n WorkerStatus,\n} from './types.js';\n\n/**\n * Interface for the napi-rs native module.\n *\n * These are the functions exported by the Rust `#[napi]` bindings.\n * Function names are auto-camelCased by napi-rs from Rust snake_case.\n */\nexport interface NapiModule {\n // Lifecycle\n getVersion(): string;\n getRustVersion(): string;\n healthCheck(): boolean;\n bootstrapWorker(config: BootstrapConfig): BootstrapResult;\n isWorkerRunning(): boolean;\n getWorkerStatus(): WorkerStatus;\n stopWorker(): WorkerStatus;\n transitionToGracefulShutdown(): WorkerStatus;\n\n // Step dispatch\n pollStepEvents(): NapiStepEvent | null;\n completeStepEvent(eventId: string, result: NapiStepExecutionResult): boolean;\n pollInProcessEvents(): NapiDomainEvent | null;\n checkpointYieldStepEvent(eventId: string, checkpoint: NapiCheckpointYieldData): boolean;\n\n // Metrics & maintenance\n getFfiDispatchMetrics(): NapiDispatchMetrics;\n checkStarvationWarnings(): void;\n cleanupTimeouts(): void;\n\n // Client API\n clientCreateTask(request: NapiTaskRequest): NapiClientResult;\n clientGetTask(taskUuid: string): NapiClientResult;\n clientListTasks(params: NapiListTasksParams): NapiClientResult;\n clientCancelTask(taskUuid: string): NapiClientResult;\n clientListTaskSteps(taskUuid: string): NapiClientResult;\n clientGetStep(taskUuid: string, stepUuid: string): NapiClientResult;\n clientGetStepAuditHistory(taskUuid: string, stepUuid: string): NapiClientResult;\n clientHealthCheck(): NapiClientResult;\n\n // Logging\n logError(message: string, fields?: Record<string, unknown>): void;\n logWarn(message: string, fields?: Record<string, unknown>): void;\n logInfo(message: string, fields?: Record<string, unknown>): void;\n logDebug(message: string, fields?: Record<string, unknown>): void;\n logTrace(message: string, fields?: Record<string, unknown>): void;\n}\n\n/**\n * Configuration for FfiLayer.\n */\nexport interface FfiLayerConfig {\n /** Custom module path (overrides discovery) */\n modulePath?: string;\n}\n\n/**\n * Owns napi-rs module loading and lifecycle.\n *\n * @example\n * ```typescript\n * const ffiLayer = new FfiLayer();\n * await ffiLayer.load();\n * const module = ffiLayer.getModule();\n * const result = module.bootstrapWorker({ namespace: 'default' });\n * await ffiLayer.unload();\n * ```\n */\nexport class FfiLayer {\n private module: NapiModule | null = null;\n private modulePath: string | null = null;\n private readonly configuredModulePath: string | undefined;\n\n constructor(config: FfiLayerConfig = {}) {\n this.configuredModulePath = config.modulePath;\n }\n\n /**\n * Load the napi-rs native module.\n *\n * @param customPath - Optional override for module path\n * @throws Error if module not found or failed to load\n */\n async load(customPath?: string): Promise<void> {\n if (this.module) {\n return; // Already loaded\n }\n\n const path = customPath ?? this.configuredModulePath ?? this.discoverModulePath();\n\n if (!path) {\n throw new Error(\n 'napi-rs native module not found. No bundled .node file matches this platform, ' +\n 'and TASKER_FFI_MODULE_PATH is not set.\\n' +\n `Current platform: ${process.platform}-${process.arch}\\n` +\n 'Supported: linux-x64, darwin-arm64\\n' +\n 'Override: export TASKER_FFI_MODULE_PATH=/path/to/tasker_ts.linux-x64-gnu.node'\n );\n }\n\n // Load the .node file — this is a native Node-API module\n const nativeModule = require(path) as NapiModule;\n this.module = nativeModule;\n this.modulePath = path;\n }\n\n /**\n * Unload the native module and release resources.\n */\n async unload(): Promise<void> {\n this.module = null;\n this.modulePath = null;\n }\n\n /**\n * Check if the native module is loaded.\n */\n isLoaded(): boolean {\n return this.module !== null;\n }\n\n /**\n * Get the loaded napi-rs module.\n *\n * @throws Error if module is not loaded\n */\n getModule(): NapiModule {\n if (!this.module) {\n throw new Error('FFI not loaded. Call load() first.');\n }\n return this.module;\n }\n\n /**\n * Backward-compatible alias for getModule().\n *\n * @deprecated Use getModule() instead\n */\n getRuntime(): NapiModule {\n return this.getModule();\n }\n\n /**\n * Get the path to the loaded module.\n */\n getModulePath(): string | null {\n return this.modulePath;\n }\n\n /**\n * Find the napi-rs module path.\n *\n * Resolution order:\n * 1. TASKER_FFI_MODULE_PATH environment variable (explicit override, for unusual setups)\n * 2. Bundled .node file in package directory (standard path — `napi build --platform` places it here)\n */\n static findModulePath(): string | null {\n // 1. Check explicit environment variable override\n const envPath = process.env.TASKER_FFI_MODULE_PATH;\n if (envPath) {\n if (!existsSync(envPath)) {\n console.warn(`TASKER_FFI_MODULE_PATH is set to \"${envPath}\" but the file does not exist`);\n return null;\n }\n return envPath;\n }\n\n // 2. Try bundled .node file (placed by `napi build --platform`)\n const bundledPath = findBundledNodeModule();\n if (bundledPath && existsSync(bundledPath)) {\n return bundledPath;\n }\n\n return null;\n }\n\n /**\n * Backward-compatible alias for findModulePath().\n *\n * @deprecated Use findModulePath() instead\n */\n static findLibraryPath(_callerDir?: string): string | null {\n return FfiLayer.findModulePath();\n }\n\n private discoverModulePath(): string | null {\n return FfiLayer.findModulePath();\n }\n}\n\n/**\n * Bundled .node module filenames by platform/arch.\n *\n * napi-rs generates platform-specific .node files with this naming convention.\n */\nconst BUNDLED_NODE_MODULES: Record<string, string> = {\n 'linux-x64': 'tasker_ts.linux-x64-gnu.node',\n 'darwin-arm64': 'tasker_ts.darwin-arm64.node',\n 'darwin-x64': 'tasker_ts.darwin-x64.node',\n};\n\n/**\n * Find the bundled .node module for the current platform.\n */\nfunction findBundledNodeModule(): string | null {\n const key = `${process.platform}-${process.arch}`;\n const filename = BUNDLED_NODE_MODULES[key];\n if (!filename) {\n return null;\n }\n\n // Walk up from current file to find package root\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n // Check in package root directory\n const candidate = join(dir, filename);\n if (existsSync(candidate)) return candidate;\n // Check in native/ subdirectory (backward compat layout)\n const nativeCandidate = join(dir, 'native', filename);\n if (existsSync(nativeCandidate)) return nativeCandidate;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n","import { ErrorType } from '../types/error-type';\nimport type { StepContext } from '../types/step-context';\nimport { StepHandlerResult } from '../types/step-handler-result';\n\n/**\n * Public interface for executable handlers (TAS-93).\n *\n * This interface defines the contract that all handlers must fulfill\n * to be executed by the resolver chain. Both StepHandler and\n * MethodDispatchWrapper implement this interface.\n *\n * Use this type when you need to accept either a handler or a wrapped handler.\n */\nexport interface ExecutableHandler {\n /** Unique identifier for this handler */\n readonly name: string;\n\n /** Version string for the handler */\n readonly version: string;\n\n /** List of capability strings the handler supports */\n readonly capabilities: string[];\n\n /**\n * Execute the step handler logic.\n *\n * @param context - Execution context with input data and configuration\n * @returns Promise resolving to handler result\n */\n call(context: StepContext): Promise<StepHandlerResult>;\n\n /**\n * Return JSON schema for handler configuration.\n *\n * @returns JSON schema object, or null if no schema is defined\n */\n configSchema(): Record<string, unknown> | null;\n}\n\n/**\n * Interface for step handler class metadata.\n *\n * Handler classes must implement these static properties.\n */\nexport interface StepHandlerClass {\n /** Unique identifier for this handler. Must match step definition. */\n handlerName: string;\n\n /** Version string for the handler (default: \"1.0.0\") */\n handlerVersion?: string;\n\n /** Constructor that creates a handler instance */\n new (): StepHandler;\n}\n\n/**\n * Abstract base class for step handlers.\n *\n * All step handlers must extend this class and implement\n * the `call` method. The handlerName static property must be set\n * to a unique identifier for the handler.\n *\n * TAS-131: TypeScript handlers are async by default. The `call` method\n * returns a Promise, enabling use of async/await for I/O operations\n * like HTTP requests, database queries, and file operations.\n *\n * Matches Python's StepHandler and Ruby's StepHandler base classes.\n *\n * @example\n * ```typescript\n * class ProcessOrderHandler extends StepHandler {\n * static handlerName = 'process_order';\n * static handlerVersion = '1.0.0';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderId = context.getInput<string>('order_id');\n * // Can use async operations like fetch, database queries, etc.\n * const data = await fetchOrderDetails(orderId);\n * return this.success({ order_id: orderId, status: 'processed', data });\n * }\n * }\n * ```\n */\nexport abstract class StepHandler {\n /**\n * Unique identifier for this handler.\n * Must be set by subclasses and match the step definition.\n */\n static handlerName: string;\n\n /**\n * Version string for the handler.\n * Default: \"1.0.0\"\n */\n static handlerVersion = '1.0.0';\n\n /**\n * Execute the step handler logic.\n *\n * This method is called by the execution subscriber when a step\n * event is received that matches this handler's name.\n *\n * @param context - Execution context with input data, dependency results,\n * and configuration\n * @returns Promise resolving to StepHandlerResult indicating success or failure\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * try {\n * const result = await processData(context.inputData);\n * return this.success(result);\n * } catch (error) {\n * return this.failure(\n * error.message,\n * ErrorType.HANDLER_ERROR,\n * true\n * );\n * }\n * }\n * ```\n */\n abstract call(context: StepContext): Promise<StepHandlerResult>;\n\n /**\n * Get the handler name.\n *\n * @returns The handlerName static property, or the class name if not set\n */\n get name(): string {\n const ctor = this.constructor as typeof StepHandler;\n return ctor.handlerName || ctor.name;\n }\n\n /**\n * Get the handler version.\n *\n * @returns The handlerVersion static property\n */\n get version(): string {\n const ctor = this.constructor as typeof StepHandler;\n return ctor.handlerVersion;\n }\n\n /**\n * Return handler capabilities.\n *\n * Override this to advertise specific capabilities for handler selection.\n *\n * @returns List of capability strings (default: [\"process\"])\n */\n get capabilities(): string[] {\n return ['process'];\n }\n\n /**\n * Return JSON schema for handler configuration.\n *\n * Override this to provide a schema for validating step_config.\n *\n * @returns JSON schema object, or null if no schema is defined\n */\n configSchema(): Record<string, unknown> | null {\n return null;\n }\n\n /**\n * Create a success result.\n *\n * Convenience method for creating success results.\n *\n * @param result - Result data object\n * @param metadata - Optional metadata object\n * @returns StepHandlerResult with success=true\n *\n * @example\n * ```typescript\n * return this.success({ processed: 100 });\n * ```\n */\n protected success(\n result: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a failure result.\n *\n * Convenience method for creating failure results.\n *\n * @param message - Error message\n * @param errorType - Error type classification. Use ErrorType enum for consistency.\n * @param retryable - Whether the error is retryable (default: true)\n * @param metadata - Optional metadata object\n * @param errorCode - Optional application-specific error code\n * @returns StepHandlerResult with success=false\n *\n * @example\n * ```typescript\n * return this.failure(\n * 'Invalid input',\n * ErrorType.VALIDATION_ERROR,\n * false\n * );\n * ```\n */\n protected failure(\n message: string,\n errorType: ErrorType | string = ErrorType.HANDLER_ERROR,\n retryable = true,\n metadata?: Record<string, unknown>,\n errorCode?: string\n ): StepHandlerResult {\n return StepHandlerResult.failure(message, errorType, retryable, metadata, errorCode);\n }\n\n /**\n * Get a string representation of the handler.\n */\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, version=${this.version})`;\n }\n}\n","/**\n * API mixin for HTTP functionality.\n *\n * TAS-112: Composition Pattern - API Mixin\n *\n * This module provides the APIMixin class for step handlers that need HTTP\n * functionality. Use via interface implementation with method binding.\n *\n * @example\n * ```typescript\n * class FetchUserHandler extends StepHandler implements APICapable {\n * static handlerName = 'fetch_user';\n * static baseUrl = 'https://api.example.com';\n *\n * // Bind APIMixin methods\n * get = APIMixin.prototype.get.bind(this);\n * apiSuccess = APIMixin.prototype.apiSuccess.bind(this);\n * apiFailure = APIMixin.prototype.apiFailure.bind(this);\n * // ... other required methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const response = await this.get('/users');\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n *\n * @module handler/mixins/api\n */\n\nimport { ErrorType } from '../../types/error-type.js';\nimport { StepHandlerResult } from '../../types/step-handler-result.js';\n\n/**\n * HTTP status codes that indicate client errors (4xx).\n */\nconst CLIENT_ERROR_MIN = 400;\nconst CLIENT_ERROR_MAX = 499;\n\n/**\n * HTTP status codes that indicate server errors (5xx).\n */\nconst SERVER_ERROR_MIN = 500;\nconst SERVER_ERROR_MAX = 599;\n\n/**\n * Status codes that indicate temporary failures (should retry).\n */\nconst RETRYABLE_STATUS_CODES = new Set([\n 408, // Request Timeout\n 429, // Too Many Requests (rate limit)\n 500, // Internal Server Error\n 502, // Bad Gateway\n 503, // Service Unavailable\n 504, // Gateway Timeout\n]);\n\n/**\n * Standard HTTP status code messages.\n */\nconst STATUS_MESSAGES: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n};\n\n/**\n * Response wrapper for API calls.\n *\n * Provides convenient access to response data and error classification.\n */\nexport class ApiResponse {\n public readonly statusCode: number;\n public readonly headers: Record<string, string>;\n public readonly body: unknown;\n public readonly rawResponse: Response;\n\n constructor(response: Response, body?: unknown) {\n this.statusCode = response.status;\n this.headers = Object.fromEntries(response.headers.entries());\n this.rawResponse = response;\n this.body = body;\n }\n\n /**\n * Check if the response indicates success (2xx status).\n */\n get ok(): boolean {\n return this.statusCode >= 200 && this.statusCode < 300;\n }\n\n /**\n * Check if the response indicates a client error (4xx status).\n */\n get isClientError(): boolean {\n return this.statusCode >= CLIENT_ERROR_MIN && this.statusCode <= CLIENT_ERROR_MAX;\n }\n\n /**\n * Check if the response indicates a server error (5xx status).\n */\n get isServerError(): boolean {\n return this.statusCode >= SERVER_ERROR_MIN && this.statusCode <= SERVER_ERROR_MAX;\n }\n\n /**\n * Check if the error should be retried.\n */\n get isRetryable(): boolean {\n return RETRYABLE_STATUS_CODES.has(this.statusCode);\n }\n\n /**\n * Get the Retry-After header value in seconds, if present.\n */\n get retryAfter(): number | null {\n const retryAfter = this.headers['retry-after'];\n if (!retryAfter) {\n return null;\n }\n const parsed = Number.parseInt(retryAfter, 10);\n return Number.isNaN(parsed) ? 60 : parsed;\n }\n\n /**\n * Convert the response to a dictionary for result output.\n */\n toDict(): Record<string, unknown> {\n return {\n status_code: this.statusCode,\n headers: this.headers,\n body: this.body,\n };\n }\n}\n\n/**\n * Interface for API-capable handlers.\n *\n * Implement this interface and bind APIMixin methods to get HTTP functionality.\n */\nexport interface APICapable {\n /** Base URL for API calls */\n baseUrl: string;\n /** Default request timeout in milliseconds */\n timeout: number;\n /** Default headers to include in all requests */\n defaultHeaders: Record<string, string>;\n\n // HTTP methods\n get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse>;\n\n post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse>;\n\n delete(path: string, headers?: Record<string, string>): Promise<ApiResponse>;\n\n request(method: string, path: string, options?: RequestInit): Promise<ApiResponse>;\n\n // Result helpers\n apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse?: boolean\n ): StepHandlerResult;\n\n apiFailure(response: ApiResponse, message?: string): StepHandlerResult;\n\n connectionError(error: Error, context?: string): StepHandlerResult;\n\n timeoutError(error: Error, context?: string): StepHandlerResult;\n}\n\n/**\n * Implementation of API methods.\n *\n * TAS-112: Use via interface implementation with method binding.\n *\n * Provides HTTP client functionality with automatic error classification,\n * retry handling, and convenient methods for common HTTP operations.\n */\nexport class APIMixin implements APICapable {\n // These should be defined on the handler class as static properties\n static baseUrl = '';\n static defaultTimeout = 30000;\n static defaultHeaders: Record<string, string> = {};\n\n get baseUrl(): string {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.baseUrl;\n }\n\n get timeout(): number {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.defaultTimeout;\n }\n\n get defaultHeaders(): Record<string, string> {\n const ctor = this.constructor as typeof APIMixin;\n return ctor.defaultHeaders;\n }\n\n // =========================================================================\n // HTTP Methods\n // =========================================================================\n\n /**\n * Make a GET request.\n */\n async get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path, params);\n return this.fetch(url, {\n method: 'GET',\n headers: this.mergeHeaders(headers),\n });\n }\n\n /**\n * Make a POST request.\n */\n async post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'POST',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a PUT request.\n */\n async put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'PUT',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a PATCH request.\n */\n async patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n const body = this.prepareBody(options?.body, options?.json !== false);\n return this.fetch(url, {\n method: 'PATCH',\n headers: this.mergeHeaders(options?.headers, options?.json !== false),\n body,\n });\n }\n\n /**\n * Make a DELETE request.\n */\n async delete(path: string, headers?: Record<string, string>): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n return this.fetch(url, {\n method: 'DELETE',\n headers: this.mergeHeaders(headers),\n });\n }\n\n /**\n * Make an arbitrary HTTP request.\n */\n async request(method: string, path: string, options?: RequestInit): Promise<ApiResponse> {\n const url = this.buildUrl(path);\n return this.fetch(url, {\n ...options,\n method,\n headers: this.mergeHeaders(options?.headers as Record<string, string>),\n });\n }\n\n // =========================================================================\n // Result Helpers\n // =========================================================================\n\n /**\n * Create a success result from an API response.\n */\n apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse = true\n ): StepHandlerResult {\n const resultData =\n result ||\n (typeof response.body === 'object' && response.body !== null\n ? (response.body as Record<string, unknown>)\n : { data: response.body });\n\n const metadata: Record<string, unknown> = {};\n if (includeResponse) {\n metadata.status_code = response.statusCode;\n metadata.headers = response.headers;\n }\n\n return StepHandlerResult.success(resultData, metadata);\n }\n\n /**\n * Create a failure result from an API response.\n */\n apiFailure(response: ApiResponse, message?: string): StepHandlerResult {\n const errorType = this.classifyError(response);\n const errorMessage = message || this.formatErrorMessage(response);\n const retryable = response.isRetryable;\n\n const metadata: Record<string, unknown> = {\n status_code: response.statusCode,\n headers: response.headers,\n };\n\n if (response.retryAfter !== null) {\n metadata.retry_after_seconds = response.retryAfter;\n }\n\n if (response.body) {\n metadata.response_body = response.body;\n }\n\n return StepHandlerResult.failure(errorMessage, errorType, retryable, metadata);\n }\n\n /**\n * Create a failure result from a connection error.\n */\n connectionError(error: Error, context?: string): StepHandlerResult {\n let message = `Connection error: ${error.message}`;\n if (context) {\n message = `Connection error while ${context}: ${error.message}`;\n }\n\n return StepHandlerResult.failure(message, 'connection_error', true, {\n exception_type: error.constructor.name,\n });\n }\n\n /**\n * Create a failure result from a timeout error.\n */\n timeoutError(error: Error, context?: string): StepHandlerResult {\n let message = `Request timeout: ${error.message}`;\n if (context) {\n message = `Request timeout while ${context}: ${error.message}`;\n }\n\n return StepHandlerResult.failure(message, ErrorType.TIMEOUT, true, {\n exception_type: error.constructor.name,\n });\n }\n\n // =========================================================================\n // Internal Helpers\n // =========================================================================\n\n private async fetch(url: string, options: RequestInit): Promise<ApiResponse> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n // Parse body based on content-type\n const contentType = response.headers.get('content-type') || '';\n let body: unknown;\n\n if (contentType.includes('application/json')) {\n try {\n body = await response.json();\n } catch {\n body = await response.text();\n }\n } else {\n body = await response.text();\n }\n\n return new ApiResponse(response, body);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n let url = this.baseUrl + path;\n\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== null && value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const queryString = searchParams.toString();\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n return url;\n }\n\n private mergeHeaders(\n additional?: Record<string, string>,\n isJson = false\n ): Record<string, string> {\n const headers = { ...this.defaultHeaders };\n\n if (isJson && !headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (additional) {\n Object.assign(headers, additional);\n }\n\n return headers;\n }\n\n private prepareBody(body: unknown, asJson: boolean): string | undefined {\n if (!body) {\n return undefined;\n }\n return asJson ? JSON.stringify(body) : String(body);\n }\n\n private classifyError(response: ApiResponse): string {\n const statusCode = response.statusCode;\n\n const errorTypeMap: Record<number, string> = {\n 400: 'bad_request',\n 401: 'unauthorized',\n 403: 'forbidden',\n 404: 'not_found',\n 405: 'method_not_allowed',\n 408: 'request_timeout',\n 409: 'conflict',\n 410: 'gone',\n 422: 'unprocessable_entity',\n 429: 'rate_limited',\n 500: 'internal_server_error',\n 502: 'bad_gateway',\n 503: 'service_unavailable',\n 504: 'gateway_timeout',\n };\n\n const mapped = errorTypeMap[statusCode];\n if (mapped !== undefined) {\n return mapped;\n }\n\n if (response.isClientError) {\n return 'client_error';\n }\n\n if (response.isServerError) {\n return 'server_error';\n }\n\n return 'http_error';\n }\n\n private formatErrorMessage(response: ApiResponse): string {\n const statusCode = response.statusCode;\n\n // Try to extract error message from response body\n const bodyMessage = this.extractBodyErrorMessage(response.body);\n if (bodyMessage) {\n return `HTTP ${statusCode}: ${bodyMessage}`;\n }\n\n // Generic message based on status code\n return `HTTP ${statusCode}: ${STATUS_MESSAGES[statusCode] || 'HTTP Error'}`;\n }\n\n private extractBodyErrorMessage(body: unknown): string | null {\n if (typeof body !== 'object' || body === null) {\n return null;\n }\n\n const bodyObj = body as Record<string, unknown>;\n const errorKeys = ['error', 'message', 'detail', 'error_message', 'msg'];\n\n for (const key of errorKeys) {\n if (!(key in bodyObj)) continue;\n\n const errorDetail = bodyObj[key];\n if (typeof errorDetail === 'string') {\n return errorDetail;\n }\n if (typeof errorDetail === 'object' && errorDetail !== null && 'message' in errorDetail) {\n return String((errorDetail as Record<string, unknown>).message);\n }\n }\n\n return null;\n }\n}\n\n/**\n * Helper function to apply API methods to a handler instance.\n *\n * @example\n * ```typescript\n * class MyApiHandler extends StepHandler {\n * constructor() {\n * super();\n * applyAPI(this);\n * }\n * }\n * ```\n */\nexport function applyAPI<T extends object>(target: T): T & APICapable {\n const mixin = new APIMixin();\n\n // Bind all API methods\n Object.defineProperty(target, 'baseUrl', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.baseUrl || '';\n },\n });\n Object.defineProperty(target, 'timeout', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.defaultTimeout || 30000;\n },\n });\n Object.defineProperty(target, 'defaultHeaders', {\n get: () => {\n const ctor = target.constructor as typeof APIMixin;\n return ctor.defaultHeaders || {};\n },\n });\n\n (target as T & APICapable).get = mixin.get.bind(target);\n (target as T & APICapable).post = mixin.post.bind(target);\n (target as T & APICapable).put = mixin.put.bind(target);\n (target as T & APICapable).patch = mixin.patch.bind(target);\n (target as T & APICapable).delete = mixin.delete.bind(target);\n (target as T & APICapable).request = mixin.request.bind(target);\n (target as T & APICapable).apiSuccess = mixin.apiSuccess.bind(target);\n (target as T & APICapable).apiFailure = mixin.apiFailure.bind(target);\n (target as T & APICapable).connectionError = mixin.connectionError.bind(target);\n (target as T & APICapable).timeoutError = mixin.timeoutError.bind(target);\n\n return target as T & APICapable;\n}\n","/**\n * API handler for HTTP interactions.\n *\n * TAS-112: Composition Pattern (DEPRECATED CLASS)\n *\n * This module provides the ApiHandler class for backward compatibility.\n * For new code, use the mixin pattern:\n *\n * @example Using APIMixin\n * ```typescript\n * import { StepHandler } from './base';\n * import { APIMixin, APICapable, applyAPI } from './mixins/api';\n *\n * class FetchUserHandler extends StepHandler implements APICapable {\n * static handlerName = 'fetch_user';\n * static baseUrl = 'https://api.example.com';\n *\n * constructor() {\n * super();\n * applyAPI(this);\n * }\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const response = await this.get('/users');\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n *\n * @module handler/api\n */\n\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\nimport { APIMixin, type ApiResponse } from './mixins/api.js';\n\n// Re-export ApiResponse for convenience\nexport { ApiResponse } from './mixins/api.js';\n\n/**\n * Base class for HTTP API step handlers.\n *\n * TAS-112: This class is provided for backward compatibility.\n * For new code, prefer using APIMixin directly with applyAPI().\n *\n * Provides HTTP client functionality with automatic error classification,\n * retry handling, and convenient methods for common HTTP operations.\n *\n * Uses native fetch API (available in Bun and Node.js 18+).\n *\n * @example\n * ```typescript\n * class PaymentApiHandler extends ApiHandler {\n * static handlerName = 'process_payment';\n * static baseUrl = 'https://payments.example.com/api/v1';\n * static defaultHeaders = { 'X-API-Key': 'secret' };\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const paymentData = context.inputData['payment'];\n * const response = await this.post('/payments', { body: paymentData });\n * if (response.ok) {\n * return this.apiSuccess(response);\n * }\n * return this.apiFailure(response);\n * }\n * }\n * ```\n */\nexport abstract class ApiHandler extends StepHandler {\n /** Base URL for API calls. Override in subclasses. */\n static baseUrl = '';\n\n /** Default request timeout in milliseconds. */\n static defaultTimeout = 30000;\n\n /** Default headers to include in all requests. */\n static defaultHeaders: Record<string, string> = {};\n\n // APIMixin instance configured with this handler's settings\n private _apiMixin: APIMixin | null = null;\n\n private getApiMixin(): APIMixin {\n if (!this._apiMixin) {\n // IMPORTANT: Variable capture is required here - DO NOT refactor to use `this.baseUrl` directly.\n // Static class initializers cannot reference outer instance properties via `this`.\n // In a static initializer context, `this` refers to the class being defined (ConfiguredMixin),\n // not the outer ApiHandler instance. These local variables capture the instance values\n // at runtime so they can be used in the static property initializers below.\n const handlerBaseUrl = this.baseUrl;\n const handlerTimeout = this.timeout;\n const handlerHeaders = this.defaultHeaders;\n\n const ConfiguredMixin = class extends APIMixin {\n static override baseUrl = handlerBaseUrl;\n static override defaultTimeout = handlerTimeout;\n static override defaultHeaders = handlerHeaders;\n };\n this._apiMixin = new ConfiguredMixin();\n }\n return this._apiMixin;\n }\n\n get capabilities(): string[] {\n return ['process', 'http', 'api'];\n }\n\n /**\n * Get the base URL for this handler.\n */\n get baseUrl(): string {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.baseUrl;\n }\n\n /**\n * Get the default timeout for this handler.\n */\n get timeout(): number {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.defaultTimeout;\n }\n\n /**\n * Get the default headers for this handler.\n */\n get defaultHeaders(): Record<string, string> {\n const ctor = this.constructor as typeof ApiHandler;\n return ctor.defaultHeaders;\n }\n\n // =========================================================================\n // HTTP Methods - Delegate to mixin\n // =========================================================================\n\n protected get(\n path: string,\n params?: Record<string, unknown>,\n headers?: Record<string, string>\n ): Promise<ApiResponse> {\n return this.getApiMixin().get(path, params, headers);\n }\n\n protected post(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().post(path, options);\n }\n\n protected put(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().put(path, options);\n }\n\n protected patch(\n path: string,\n options?: {\n body?: unknown;\n json?: boolean;\n headers?: Record<string, string>;\n }\n ): Promise<ApiResponse> {\n return this.getApiMixin().patch(path, options);\n }\n\n protected delete(path: string, headers?: Record<string, string>): Promise<ApiResponse> {\n return this.getApiMixin().delete(path, headers);\n }\n\n protected request(method: string, path: string, options?: RequestInit): Promise<ApiResponse> {\n return this.getApiMixin().request(method, path, options);\n }\n\n // =========================================================================\n // Result Helpers - Delegate to mixin\n // =========================================================================\n\n protected apiSuccess(\n response: ApiResponse,\n result?: Record<string, unknown>,\n includeResponse = true\n ): StepHandlerResult {\n return this.getApiMixin().apiSuccess(response, result, includeResponse);\n }\n\n protected apiFailure(response: ApiResponse, message?: string): StepHandlerResult {\n return this.getApiMixin().apiFailure(response, message);\n }\n\n protected connectionError(error: Error, context?: string): StepHandlerResult {\n return this.getApiMixin().connectionError(error, context);\n }\n\n protected timeoutError(error: Error, context?: string): StepHandlerResult {\n return this.getApiMixin().timeoutError(error, context);\n }\n}\n","/**\n * Batch processing types for cursor-based batch operations.\n *\n * These types support the analyzer/worker pattern for processing\n * large datasets in parallel batches.\n *\n * Matches Python's batch processing types and Ruby's batch types (TAS-92 aligned).\n *\n * ## FFI Boundary Types (TAS-112/TAS-123)\n *\n * This module includes types that cross the Rust ↔ TypeScript FFI boundary:\n *\n * - `RustCursorConfig` - Cursor configuration with flexible cursor types\n * - `BatchProcessingOutcome` - Discriminated union for batch processing decisions\n * - `RustBatchWorkerInputs` - Worker initialization inputs from Rust orchestration\n * - `BatchMetadata` - Batch processing metadata from template configuration\n *\n * These types are serialized by Rust and deserialized by TypeScript workers.\n * They must remain compatible with Rust's serde serialization format.\n *\n * @module types/batch\n */\n\n/**\n * Configuration for cursor-based batch processing.\n *\n * Defines a range of items to process in a batch worker step.\n */\nexport interface CursorConfig {\n /** Starting cursor position (inclusive) */\n startCursor: number;\n /** Ending cursor position (exclusive) */\n endCursor: number;\n /** Step size for iteration (usually 1) */\n stepSize: number;\n /** Additional metadata for this cursor range */\n metadata: Record<string, unknown>;\n}\n\n/**\n * Outcome from a batch analyzer handler.\n *\n * Batch analyzers return this to define the cursor ranges that will\n * spawn parallel batch worker steps.\n */\nexport interface BatchAnalyzerOutcome {\n /** List of cursor configurations for batch workers */\n cursorConfigs: CursorConfig[];\n /** Total number of items to process (for progress tracking) */\n totalItems: number | null;\n /** Metadata to pass to all batch workers */\n batchMetadata: Record<string, unknown>;\n}\n\n/**\n * Context for a batch worker step.\n *\n * Provides information about the specific batch this worker should process,\n * including checkpoint data from previous yields (TAS-125).\n */\nexport interface BatchWorkerContext {\n /** Unique identifier for this batch */\n batchId: string;\n /** Cursor configuration for this batch */\n cursorConfig: CursorConfig;\n /** Index of this batch (0-based) */\n batchIndex: number;\n /** Total number of batches */\n totalBatches: number;\n /** Metadata from the analyzer */\n batchMetadata: Record<string, unknown>;\n /** TAS-125: Checkpoint data from previous yields */\n checkpoint: Record<string, unknown>;\n /** Convenience accessor for start cursor */\n readonly startCursor: number;\n /** Convenience accessor for end cursor */\n readonly endCursor: number;\n /** Convenience accessor for step size */\n readonly stepSize: number;\n // TAS-125: Checkpoint accessor properties\n /** TAS-125: Get checkpoint cursor from previous yield */\n readonly checkpointCursor: number | string | Record<string, unknown> | undefined;\n /** TAS-125: Get accumulated results from previous checkpoint yield */\n readonly accumulatedResults: Record<string, unknown> | undefined;\n /** TAS-125: Get items processed count from checkpoint */\n readonly checkpointItemsProcessed: number;\n /** TAS-125: Check if checkpoint exists */\n hasCheckpoint(): boolean;\n}\n\n/**\n * Outcome from a batch worker step.\n *\n * Batch workers return this to report progress and results.\n */\nexport interface BatchWorkerOutcome {\n /** Total items processed in this batch */\n itemsProcessed: number;\n /** Items that succeeded */\n itemsSucceeded: number;\n /** Items that failed */\n itemsFailed: number;\n /** Items that were skipped */\n itemsSkipped: number;\n /** Individual item results */\n results: Array<Record<string, unknown>>;\n /** Individual item errors */\n errors: Array<Record<string, unknown>>;\n /** Last cursor position processed */\n lastCursor: number | null;\n /** Additional batch metadata */\n batchMetadata: Record<string, unknown>;\n}\n\n/**\n * Create a BatchWorkerContext from raw batch data.\n *\n * Handles both formats:\n * - Nested: { batch_id, cursor_config: { start_cursor, end_cursor, ... } }\n * - Flat: { batch_id, start_cursor, end_cursor, ... }\n *\n * TAS-125: Also extracts checkpoint data if present.\n *\n * @internal\n */\nexport function createBatchWorkerContext(\n batchData: Record<string, unknown>,\n checkpoint?: Record<string, unknown>\n): BatchWorkerContext {\n // Handle both nested cursor_config and flat format\n const cursorData = (batchData.cursor_config as Record<string, unknown>) || batchData;\n const cursorConfig: CursorConfig = {\n startCursor: (cursorData.start_cursor as number) ?? 0,\n endCursor: (cursorData.end_cursor as number) ?? 0,\n stepSize: (cursorData.step_size as number) ?? 1,\n metadata: (cursorData.metadata as Record<string, unknown>) ?? {},\n };\n\n // TAS-125: Extract checkpoint data\n const checkpointData = checkpoint ?? {};\n\n return {\n batchId: (batchData.batch_id as string) ?? '',\n cursorConfig,\n batchIndex: (batchData.batch_index as number) ?? 0,\n totalBatches: (batchData.total_batches as number) ?? 1,\n batchMetadata: (batchData.batch_metadata as Record<string, unknown>) ?? {},\n checkpoint: checkpointData,\n get startCursor() {\n return this.cursorConfig.startCursor;\n },\n get endCursor() {\n return this.cursorConfig.endCursor;\n },\n get stepSize() {\n return this.cursorConfig.stepSize;\n },\n // TAS-125: Checkpoint accessor properties\n get checkpointCursor() {\n return this.checkpoint?.cursor as number | string | Record<string, unknown> | undefined;\n },\n get accumulatedResults() {\n return this.checkpoint?.accumulated_results as Record<string, unknown> | undefined;\n },\n get checkpointItemsProcessed() {\n return (this.checkpoint?.items_processed as number) ?? 0;\n },\n hasCheckpoint() {\n return Boolean(this.checkpoint && this.checkpoint.cursor !== undefined);\n },\n };\n}\n\n// =============================================================================\n// FFI Boundary Types (TAS-112/TAS-123)\n//\n// These types match Rust structures that cross the FFI boundary.\n// They are serialized by Rust and deserialized by TypeScript workers.\n// =============================================================================\n\n/**\n * Cursor configuration for a single batch's position and range.\n *\n * Matches Rust's `CursorConfig` in `tasker-shared/src/messaging/execution_types.rs`.\n *\n * ## Flexible Cursor Types\n *\n * Unlike the simpler `CursorConfig` interface (which uses `number`),\n * this type supports flexible cursor values that can be:\n * - Integer for record IDs: `123`\n * - String for timestamps: `\"2025-11-01T00:00:00Z\"`\n * - Object for composite keys: `{\"page\": 1, \"offset\": 0}`\n *\n * This enables cursor-based pagination across diverse data sources.\n *\n * @example\n * ```typescript\n * // Integer cursors (most common)\n * const intCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: 0,\n * end_cursor: 1000,\n * batch_size: 1000,\n * };\n *\n * // Timestamp cursors\n * const timestampCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: \"2025-01-01T00:00:00Z\",\n * end_cursor: \"2025-01-02T00:00:00Z\",\n * batch_size: 86400, // seconds in a day\n * };\n *\n * // Composite cursors\n * const compositeCursor: RustCursorConfig = {\n * batch_id: \"batch_001\",\n * start_cursor: { page: 1, offset: 0 },\n * end_cursor: { page: 10, offset: 0 },\n * batch_size: 1000,\n * };\n * ```\n */\nexport interface RustCursorConfig {\n /** Batch identifier (e.g., \"batch_001\", \"batch_002\") */\n batch_id: string;\n\n /**\n * Starting position for this batch (inclusive).\n *\n * Type depends on cursor strategy:\n * - `number` for record IDs\n * - `string` for timestamps or UUIDs\n * - `object` for composite keys\n */\n start_cursor: unknown;\n\n /**\n * Ending position for this batch (exclusive).\n *\n * Workers process items from `start_cursor` (inclusive)\n * up to but not including `end_cursor`.\n */\n end_cursor: unknown;\n\n /** Number of items in this batch (for progress reporting) */\n batch_size: number;\n}\n\n/**\n * Failure strategy for batch processing.\n *\n * Matches Rust's `FailureStrategy` enum in `task_template.rs`.\n */\nexport type FailureStrategy = 'continue_on_failure' | 'fail_fast' | 'isolate';\n\n/**\n * Batch processing metadata from template configuration.\n *\n * Matches Rust's `BatchMetadata` in `tasker-shared/src/models/core/batch_worker.rs`.\n *\n * This structure extracts relevant template configuration that workers\n * need during execution. Workers don't need parallelism settings or\n * batch size calculation logic - just execution parameters.\n */\nexport interface BatchMetadata {\n // TAS-125: checkpoint_interval removed - handlers decide when to checkpoint\n\n /**\n * Database field name used for cursor-based pagination.\n *\n * Workers use this to construct queries like:\n * `WHERE cursor_field > start_cursor AND cursor_field <= end_cursor`\n *\n * Common values: \"id\", \"created_at\", \"sequence_number\"\n */\n cursor_field: string;\n\n /**\n * How this worker should handle failures during batch processing.\n *\n * - `continue_on_failure`: Log errors, continue processing remaining items\n * - `fail_fast`: Stop immediately on first error\n * - `isolate`: Mark batch for manual investigation\n */\n failure_strategy: FailureStrategy;\n}\n\n/**\n * Initialization inputs for batch worker instances.\n *\n * Matches Rust's `BatchWorkerInputs` in `tasker-shared/src/models/core/batch_worker.rs`.\n *\n * This structure is serialized to JSONB by Rust orchestration and stored\n * in `workflow_steps.inputs` for dynamically created batch workers.\n *\n * @example\n * ```typescript\n * // In a batch worker handler\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const inputs = context.stepInputs as RustBatchWorkerInputs;\n *\n * // Check for no-op placeholder first\n * if (inputs.is_no_op) {\n * return this.success({\n * batch_id: inputs.cursor.batch_id,\n * no_op: true,\n * message: 'No batches to process',\n * });\n * }\n *\n * // Process the batch using cursor bounds\n * const { start_cursor, end_cursor } = inputs.cursor;\n * // ... process items in range\n * }\n * ```\n */\nexport interface RustBatchWorkerInputs {\n /**\n * Cursor configuration defining this worker's processing range.\n *\n * Created by the batchable handler after analyzing dataset size.\n */\n cursor: RustCursorConfig;\n\n /**\n * Batch processing metadata from template configuration.\n *\n * Provides checkpointing frequency, cursor field, and failure strategy.\n */\n batch_metadata: BatchMetadata;\n\n /**\n * Explicit flag indicating if this is a no-op/placeholder worker.\n *\n * Set by orchestration based on BatchProcessingOutcome type:\n * - `true` for NoBatches outcome (placeholder worker)\n * - `false` for CreateBatches outcome (real worker with data)\n *\n * Workers should check this flag FIRST before any processing logic.\n * If `true`, immediately return success without processing.\n */\n is_no_op: boolean;\n}\n\n// =============================================================================\n// BatchProcessingOutcome - Discriminated Union (TAS-112/TAS-123)\n//\n// Matches Rust's `BatchProcessingOutcome` enum with tagged serialization.\n// Uses TypeScript discriminated unions for type-safe pattern matching.\n// =============================================================================\n\n/**\n * No batches needed - process as single step or skip.\n *\n * Returned when:\n * - Dataset is too small to warrant batching\n * - Data doesn't meet batching criteria\n * - Batch processing not applicable for this execution\n *\n * Serialization format: `{ \"type\": \"no_batches\" }`\n */\nexport interface NoBatchesOutcome {\n type: 'no_batches';\n}\n\n/**\n * Create batch worker steps from template.\n *\n * The orchestration system will:\n * 1. Instantiate N workers from the template step\n * 2. Assign each worker a unique cursor config\n * 3. Create DAG edges from batchable step to workers\n * 4. Enqueue workers for parallel execution\n *\n * Serialization format:\n * ```json\n * {\n * \"type\": \"create_batches\",\n * \"worker_template_name\": \"batch_worker_template\",\n * \"worker_count\": 5,\n * \"cursor_configs\": [...],\n * \"total_items\": 5000\n * }\n * ```\n */\nexport interface CreateBatchesOutcome {\n type: 'create_batches';\n\n /**\n * Template step name to use for creating workers.\n *\n * Must match a step definition in the template with `type: batch_worker`.\n * The system creates multiple instances with generated names like:\n * - `{template_name}_001`\n * - `{template_name}_002`\n */\n worker_template_name: string;\n\n /**\n * Number of worker instances to create.\n *\n * Typically calculated based on dataset size / batch_size.\n */\n worker_count: number;\n\n /**\n * Initial cursor positions for each batch.\n *\n * Each worker receives one cursor config that defines its\n * processing boundaries. Length must equal `worker_count`.\n */\n cursor_configs: RustCursorConfig[];\n\n /**\n * Total items to process across all batches.\n *\n * Used for progress tracking and observability.\n */\n total_items: number;\n}\n\n/**\n * Outcome of a batchable step that determines batch worker creation.\n *\n * Matches Rust's `BatchProcessingOutcome` enum in\n * `tasker-shared/src/messaging/execution_types.rs`.\n *\n * This discriminated union enables type-safe pattern matching:\n *\n * @example\n * ```typescript\n * function handleOutcome(outcome: BatchProcessingOutcome): void {\n * switch (outcome.type) {\n * case 'no_batches':\n * console.log('No batches needed');\n * break;\n * case 'create_batches':\n * console.log(`Creating ${outcome.worker_count} workers`);\n * console.log(`Total items: ${outcome.total_items}`);\n * break;\n * default: {\n * const _exhaustive: never = outcome;\n * throw new Error(`Unhandled outcome type: ${_exhaustive}`);\n * }\n * }\n * }\n * ```\n */\nexport type BatchProcessingOutcome = NoBatchesOutcome | CreateBatchesOutcome;\n\n// =============================================================================\n// Factory Functions for BatchProcessingOutcome\n// =============================================================================\n\n/**\n * Create a NoBatches outcome.\n *\n * Use when batching is not needed or applicable.\n *\n * @returns A NoBatchesOutcome object\n */\nexport function noBatches(): NoBatchesOutcome {\n return { type: 'no_batches' };\n}\n\n/**\n * Create a CreateBatches outcome with specified configuration.\n *\n * @param workerTemplateName - Name of the template step to instantiate\n * @param workerCount - Number of workers to create\n * @param cursorConfigs - Cursor configuration for each worker\n * @param totalItems - Total number of items to process\n * @returns A CreateBatchesOutcome object\n *\n * @example\n * ```typescript\n * const outcome = createBatches(\n * 'process_csv_batch',\n * 3,\n * [\n * { batch_id: '001', start_cursor: 0, end_cursor: 1000, batch_size: 1000 },\n * { batch_id: '002', start_cursor: 1000, end_cursor: 2000, batch_size: 1000 },\n * { batch_id: '003', start_cursor: 2000, end_cursor: 3000, batch_size: 1000 },\n * ],\n * 3000\n * );\n * ```\n */\nexport function createBatches(\n workerTemplateName: string,\n workerCount: number,\n cursorConfigs: RustCursorConfig[],\n totalItems: number\n): CreateBatchesOutcome {\n if (cursorConfigs.length !== workerCount) {\n throw new Error(\n `cursor_configs length (${cursorConfigs.length}) must equal worker_count (${workerCount})`\n );\n }\n\n return {\n type: 'create_batches',\n worker_template_name: workerTemplateName,\n worker_count: workerCount,\n cursor_configs: cursorConfigs,\n total_items: totalItems,\n };\n}\n\n/**\n * Type guard to check if an outcome is NoBatches.\n */\nexport function isNoBatches(outcome: BatchProcessingOutcome): outcome is NoBatchesOutcome {\n return outcome.type === 'no_batches';\n}\n\n/**\n * Type guard to check if an outcome is CreateBatches.\n */\nexport function isCreateBatches(outcome: BatchProcessingOutcome): outcome is CreateBatchesOutcome {\n return outcome.type === 'create_batches';\n}\n\n/**\n * Result from aggregating multiple batch worker results.\n *\n * Cross-language standard: matches Python's aggregate_worker_results output\n * and Ruby's aggregate_batch_worker_results.\n *\n * TAS-112: Standardized aggregation result structure.\n */\nexport interface BatchAggregationResult {\n /** Total items processed across all batches */\n total_processed: number;\n /** Total items that succeeded */\n total_succeeded: number;\n /** Total items that failed */\n total_failed: number;\n /** Total items that were skipped */\n total_skipped: number;\n /** Number of batch workers that ran */\n batch_count: number;\n /** Success rate (0.0 to 1.0) */\n success_rate: number;\n /** Collected errors from all batches (limited) */\n errors: Array<Record<string, unknown>>;\n /** Total error count (may exceed errors array length) */\n error_count: number;\n}\n\n/**\n * Aggregate results from multiple batch workers.\n *\n * Cross-language standard: matches Python's `Batchable.aggregate_worker_results`\n * and Ruby's `aggregate_batch_worker_results`.\n *\n * @param workerResults - Array of results from batch worker steps\n * @param maxErrors - Maximum number of errors to collect (default: 100)\n * @returns Aggregated summary of all batch processing\n *\n * @example\n * ```typescript\n * // In an aggregator handler\n * const workerResults = Object.values(context.previousResults)\n * .filter(r => r?.batch_worker);\n * const summary = aggregateBatchResults(workerResults);\n * return this.success(summary);\n * ```\n */\nexport function aggregateBatchResults(\n workerResults: Array<Record<string, unknown> | null | undefined>,\n maxErrors = 100\n): BatchAggregationResult {\n let totalProcessed = 0;\n let totalSucceeded = 0;\n let totalFailed = 0;\n let totalSkipped = 0;\n const allErrors: Array<Record<string, unknown>> = [];\n let batchCount = 0;\n\n for (const result of workerResults) {\n if (result === null || result === undefined) {\n continue;\n }\n\n batchCount++;\n totalProcessed += (result.items_processed as number) ?? 0;\n totalSucceeded += (result.items_succeeded as number) ?? 0;\n totalFailed += (result.items_failed as number) ?? 0;\n totalSkipped += (result.items_skipped as number) ?? 0;\n\n const errors = result.errors as Array<Record<string, unknown>> | undefined;\n if (errors && Array.isArray(errors)) {\n allErrors.push(...errors);\n }\n }\n\n return {\n total_processed: totalProcessed,\n total_succeeded: totalSucceeded,\n total_failed: totalFailed,\n total_skipped: totalSkipped,\n batch_count: batchCount,\n success_rate: totalProcessed > 0 ? totalSucceeded / totalProcessed : 0,\n errors: allErrors.slice(0, maxErrors),\n error_count: allErrors.length,\n };\n}\n","import type {\n BatchAggregationResult,\n BatchAnalyzerOutcome,\n BatchWorkerContext,\n BatchWorkerOutcome,\n CursorConfig,\n RustBatchWorkerInputs,\n RustCursorConfig,\n} from '../types/batch.js';\nimport {\n aggregateBatchResults,\n createBatches as createBatchesOutcome,\n createBatchWorkerContext,\n noBatches as createNoBatchesOutcome,\n} from '../types/batch.js';\nimport type { StepContext } from '../types/step-context.js';\nimport {\n type BatchableResult,\n type BatchWorkerConfig,\n StepHandlerResult,\n} from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\n\n// Re-export FFI boundary types for handler use (TAS-112/TAS-123)\nexport type {\n BatchAggregationResult,\n RustBatchWorkerInputs,\n RustCursorConfig,\n} from '../types/batch.js';\nexport { aggregateBatchResults, createBatches, noBatches } from '../types/batch.js';\n\n// =============================================================================\n// BatchAggregationScenario - Cross-Language Standard Type (TAS-112)\n// =============================================================================\n\n/**\n * Represents the aggregation scenario for batch processing convergence steps.\n *\n * Cross-language standard: matches Ruby's BatchAggregationScenario,\n * Python's BatchAggregationScenario, and Rust's BatchAggregationScenario enum.\n *\n * There are two scenarios:\n * - **NoBatches**: The batchable step returned `noBatches()`, no workers were created.\n * The convergence step should read results directly from the batchable step.\n * - **WithBatches**: Workers were created and processed batches. The convergence\n * step should aggregate results from all batch workers.\n */\nexport interface BatchAggregationScenario {\n /** True if this is a NoBatches scenario. */\n isNoBatches: boolean;\n /** Result from the batchable step (always present). */\n batchableResult: Record<string, unknown>;\n /** Dict of worker_name -> result (empty for NoBatches). */\n batchResults: Record<string, Record<string, unknown>>;\n /** Number of batch workers (0 for NoBatches). */\n workerCount: number;\n}\n\n/**\n * Extract result data from a step result (handles wrapped and raw results).\n */\nfunction extractResultData(stepResult: unknown): Record<string, unknown> {\n if (typeof stepResult !== 'object' || stepResult === null) {\n return {};\n }\n if ('result' in stepResult) {\n return stepResult.result as Record<string, unknown>;\n }\n return stepResult as Record<string, unknown>;\n}\n\n/**\n * Check if a batch_processing_outcome indicates NoBatches.\n */\nfunction isNoBatchesOutcome(resultData: Record<string, unknown>): boolean {\n const outcome = resultData.batch_processing_outcome;\n if (typeof outcome !== 'object' || outcome === null) {\n return false;\n }\n return (outcome as Record<string, unknown>).type === 'no_batches';\n}\n\n/**\n * Collect batch worker results by prefix.\n */\nfunction collectBatchResults(\n dependencyResults: Record<string, unknown>,\n batchWorkerPrefix: string\n): Record<string, Record<string, unknown>> {\n const batchResults: Record<string, Record<string, unknown>> = {};\n for (const [stepName, stepResult] of Object.entries(dependencyResults)) {\n if (stepName.startsWith(batchWorkerPrefix)) {\n batchResults[stepName] = extractResultData(stepResult);\n }\n }\n return batchResults;\n}\n\n/**\n * Detect the aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's BatchAggregationScenario.detect,\n * Python's BatchAggregationScenario.detect, and Rust's BatchAggregationScenario::detect.\n *\n * @param dependencyResults - All dependency results from the step context.\n * @param batchableStepName - Name of the batchable step (e.g., \"analyze_csv\").\n * @param batchWorkerPrefix - Prefix for batch worker step names (e.g., \"process_csv_batch_\").\n * @returns BatchAggregationScenario indicating NoBatches or WithBatches.\n * @throws Error if batchable step is missing or no workers found without NoBatches outcome.\n *\n * @example\n * ```typescript\n * const scenario = detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n * if (scenario.isNoBatches) {\n * return this.noBatchesAggregationResult({ total: 0 });\n * }\n * ```\n */\nexport function detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n): BatchAggregationScenario {\n // Find the batchable step result\n const batchableResult = dependencyResults[batchableStepName];\n if (batchableResult === undefined || batchableResult === null) {\n throw new Error(`Missing batchable step dependency: ${batchableStepName}`);\n }\n\n const resultData = extractResultData(batchableResult);\n\n // Check for NoBatches scenario\n if (isNoBatchesOutcome(resultData)) {\n return {\n isNoBatches: true,\n batchableResult: resultData,\n batchResults: {},\n workerCount: 0,\n };\n }\n\n // WithBatches scenario - find all batch workers\n const batchResults = collectBatchResults(dependencyResults, batchWorkerPrefix);\n\n if (Object.keys(batchResults).length === 0) {\n throw new Error(\n `No batch workers found with prefix '${batchWorkerPrefix}' ` +\n `and batchable step '${batchableStepName}' did not return NoBatches outcome. ` +\n 'This indicates a workflow configuration error.'\n );\n }\n\n return {\n isNoBatches: false,\n batchableResult: resultData,\n batchResults,\n workerCount: Object.keys(batchResults).length,\n };\n}\n\n/**\n * Mixin interface for batch processing capabilities.\n *\n * TypeScript implementation using interface + method binding pattern\n * (since TS doesn't have true mixins like Python/Ruby).\n *\n * Matches Python's Batchable mixin and Ruby's Batchable module (TAS-92 aligned).\n */\nexport interface Batchable {\n // =========================================================================\n // Cursor Configuration Helpers\n // =========================================================================\n\n createCursorConfig(\n start: number,\n end: number,\n stepSize?: number,\n metadata?: Record<string, unknown>\n ): CursorConfig;\n\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n maxBatches?: number\n ): CursorConfig[];\n\n /**\n * Create cursor configurations for a specific number of workers.\n *\n * Ruby-style method that divides items into worker_count roughly equal ranges.\n * Use this when you know the desired number of workers rather than batch size.\n *\n * Cross-language standard: matches Ruby's create_cursor_configs(total_items, worker_count).\n */\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[];\n\n // =========================================================================\n // Batch Outcome Builders\n // =========================================================================\n\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome;\n\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded?: number,\n itemsFailed?: number,\n itemsSkipped?: number,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome;\n\n // =========================================================================\n // Batch Context Helpers\n // =========================================================================\n\n getBatchContext(context: StepContext): BatchWorkerContext | null;\n\n /**\n * Get Rust batch worker inputs from step context.\n *\n * Returns the BatchWorkerInputs structure from workflow_step.inputs,\n * which contains cursor config, batch metadata, and no-op flag.\n *\n * Cross-language standard: matches Ruby's get_batch_context pattern.\n */\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null;\n\n /**\n * Handle no-op placeholder worker scenario.\n *\n * Returns a success result if the worker is a no-op placeholder,\n * otherwise returns null to allow normal processing to continue.\n *\n * Cross-language standard: matches Ruby's handle_no_op_worker.\n */\n handleNoOpWorker(context: StepContext): StepHandlerResult | null;\n\n // =========================================================================\n // Result Helpers\n // =========================================================================\n\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Use this method when your handler needs to persist progress and be\n * re-dispatched for continued processing. Unlike batchWorkerSuccess,\n * this does NOT complete the step.\n *\n * @param cursor - Position to resume from (number, string, or object)\n * @param itemsProcessed - Total items processed so far (cumulative)\n * @param accumulatedResults - Partial aggregations to carry forward\n * @returns A StepHandlerResult with checkpoint_yield type\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult;\n\n // =========================================================================\n // Aggregation Helpers (TAS-112)\n // =========================================================================\n\n /**\n * Detect batch aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's detect_aggregation_scenario,\n * Python's detect_aggregation_scenario, and Rust's BatchAggregationScenario::detect.\n */\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario;\n\n /**\n * Create a success result for NoBatches aggregation scenario.\n *\n * Cross-language standard: matches Ruby's no_batches_aggregation_result\n * and Python's no_batches_aggregation_result.\n */\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult;\n\n /**\n * Aggregate batch worker results handling both scenarios.\n *\n * Cross-language standard: matches Ruby's aggregate_batch_worker_results\n * and Python's aggregate_batch_worker_results.\n */\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult;\n}\n\n/**\n * Implementation of Batchable methods.\n *\n * Use this class to add batch processing capabilities to your handlers.\n * The methods can be bound to handler instances or used as a mixin.\n *\n * @example Analyzer using method binding\n * ```typescript\n * class ProductAnalyzer extends StepHandler implements Batchable {\n * // Bind Batchable methods to this instance\n * createBatchOutcome = BatchableMixin.prototype.createBatchOutcome.bind(this);\n * batchAnalyzerSuccess = BatchableMixin.prototype.batchAnalyzerSuccess.bind(this);\n * // ... other required Batchable methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const total = context.inputData['product_count'] as number;\n * const outcome = this.createBatchOutcome(total, 100);\n * return this.batchAnalyzerSuccess(outcome);\n * }\n * }\n * ```\n *\n * @example Worker using method binding\n * ```typescript\n * class ProductWorker extends StepHandler implements Batchable {\n * getBatchContext = BatchableMixin.prototype.getBatchContext.bind(this);\n * createWorkerOutcome = BatchableMixin.prototype.createWorkerOutcome.bind(this);\n * batchWorkerSuccess = BatchableMixin.prototype.batchWorkerSuccess.bind(this);\n * // ... other required Batchable methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const batchCtx = this.getBatchContext(context);\n * if (!batchCtx) {\n * return this.failure('No batch context found');\n * }\n *\n * const results = [];\n * for (let i = batchCtx.startCursor; i < batchCtx.endCursor; i++) {\n * results.push(await this.processItem(i));\n * }\n *\n * const outcome = this.createWorkerOutcome(results.length, results.length);\n * return this.batchWorkerSuccess(outcome);\n * }\n * }\n * ```\n */\nexport class BatchableMixin implements Batchable {\n /**\n * Create a cursor configuration for a batch range.\n *\n * @param start - Starting cursor position (inclusive)\n * @param end - Ending cursor position (exclusive)\n * @param stepSize - Step size for iteration (default: 1)\n * @param metadata - Additional metadata for this cursor range\n * @returns CursorConfig for the specified range\n */\n createCursorConfig(\n start: number,\n end: number,\n stepSize = 1,\n metadata?: Record<string, unknown>\n ): CursorConfig {\n return {\n startCursor: start,\n endCursor: end,\n stepSize,\n metadata: metadata || {},\n };\n }\n\n /**\n * Create cursor ranges for batch processing.\n *\n * Divides totalItems into batches of batchSize, optionally limiting\n * the number of batches.\n *\n * @param totalItems - Total number of items to process\n * @param batchSize - Number of items per batch\n * @param stepSize - Step size for iteration (default: 1)\n * @param maxBatches - Maximum number of batches (optional)\n * @returns Array of CursorConfig for each batch\n */\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize = 1,\n maxBatches?: number\n ): CursorConfig[] {\n if (totalItems === 0) {\n return [];\n }\n\n if (batchSize <= 0) {\n throw new Error('batchSize must be > 0');\n }\n\n let adjustedBatchSize = batchSize;\n\n // Adjust batch size if max_batches would create more batches\n if (maxBatches && maxBatches > 0) {\n const calculatedBatches = Math.ceil(totalItems / batchSize);\n if (calculatedBatches > maxBatches) {\n adjustedBatchSize = Math.ceil(totalItems / maxBatches);\n }\n }\n\n const configs: CursorConfig[] = [];\n let start = 0;\n\n while (start < totalItems) {\n const end = Math.min(start + adjustedBatchSize, totalItems);\n configs.push({\n startCursor: start,\n endCursor: end,\n stepSize,\n metadata: {},\n });\n start = end;\n }\n\n return configs;\n }\n\n /**\n * Create cursor configurations for a specific number of workers.\n *\n * Ruby-style method that divides items into worker_count roughly equal ranges.\n * Uses ceiling division to ensure all items are covered.\n *\n * ## Cursor Boundary Math\n *\n * 1. items_per_worker = ceil(total_items / worker_count)\n * 2. For worker i (0-indexed):\n * - start = i * items_per_worker\n * - end = min((i + 1) * items_per_worker, total_items)\n * - batch_size = end - start\n *\n * Example: 1000 items, 3 workers\n * - items_per_worker = ceil(1000/3) = 334\n * - Worker 0: start=0, end=334, size=334\n * - Worker 1: start=334, end=668, size=334\n * - Worker 2: start=668, end=1000, size=332\n *\n * Cross-language standard: matches Ruby's create_cursor_configs(total_items, worker_count).\n *\n * @param totalItems - Total number of items to process\n * @param workerCount - Number of workers to create configs for (must be > 0)\n * @returns Array of BatchWorkerConfig for each worker\n */\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[] {\n if (workerCount <= 0) {\n throw new Error('workerCount must be > 0');\n }\n\n if (totalItems === 0) {\n return [];\n }\n\n const itemsPerWorker = Math.ceil(totalItems / workerCount);\n const configs: BatchWorkerConfig[] = [];\n\n for (let i = 0; i < workerCount; i++) {\n const startPosition = i * itemsPerWorker;\n const endPosition = Math.min((i + 1) * itemsPerWorker, totalItems);\n\n // Skip if this worker would have no items\n if (startPosition >= totalItems) {\n break;\n }\n\n configs.push({\n batch_id: String(i + 1).padStart(3, '0'),\n cursor_start: startPosition,\n cursor_end: endPosition,\n row_count: endPosition - startPosition,\n worker_index: i,\n total_workers: workerCount,\n });\n }\n\n return configs;\n }\n\n /**\n * Create a batch analyzer outcome.\n *\n * Convenience method that creates cursor ranges and wraps them\n * in a BatchAnalyzerOutcome.\n *\n * @param totalItems - Total number of items to process\n * @param batchSize - Number of items per batch\n * @param stepSize - Step size for iteration (default: 1)\n * @param batchMetadata - Metadata to pass to all batch workers\n * @returns BatchAnalyzerOutcome ready for batchAnalyzerSuccess\n */\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize = 1,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome {\n const cursorConfigs = this.createCursorRanges(totalItems, batchSize, stepSize);\n\n return {\n cursorConfigs,\n totalItems,\n batchMetadata: batchMetadata || {},\n };\n }\n\n /**\n * Create a batch worker outcome.\n *\n * @param itemsProcessed - Total items processed in this batch\n * @param itemsSucceeded - Items that succeeded (default: itemsProcessed)\n * @param itemsFailed - Items that failed (default: 0)\n * @param itemsSkipped - Items that were skipped (default: 0)\n * @param results - Individual item results\n * @param errors - Individual item errors\n * @param lastCursor - Last cursor position processed\n * @param batchMetadata - Additional batch metadata\n * @returns BatchWorkerOutcome ready for batchWorkerSuccess\n */\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded = 0,\n itemsFailed = 0,\n itemsSkipped = 0,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome {\n return {\n itemsProcessed,\n itemsSucceeded: itemsSucceeded || itemsProcessed,\n itemsFailed,\n itemsSkipped,\n results: results || [],\n errors: errors || [],\n lastCursor: lastCursor ?? null,\n batchMetadata: batchMetadata || {},\n };\n }\n\n /**\n * Get the batch context from a step context.\n *\n * Looks for batch context in step_config, input_data, or step_inputs.\n *\n * @param context - The step context\n * @returns BatchWorkerContext or null if not found\n */\n getBatchContext(context: StepContext): BatchWorkerContext | null {\n // Look for batch context in step_config or input_data\n let batchData: Record<string, unknown> | undefined;\n\n if (context.stepConfig) {\n batchData = context.stepConfig.batch_context as Record<string, unknown> | undefined;\n }\n\n if (!batchData && context.inputData) {\n batchData = context.inputData.batch_context as Record<string, unknown> | undefined;\n }\n\n // Also check stepInputs (for cursor config from workflow_step.inputs)\n if (!batchData && context.stepInputs) {\n batchData = context.stepInputs.batch_context as Record<string, unknown> | undefined;\n }\n\n if (!batchData) {\n return null;\n }\n\n return createBatchWorkerContext(batchData);\n }\n\n /**\n * Get Rust batch worker inputs from step context.\n *\n * Returns the BatchWorkerInputs structure from workflow_step.inputs,\n * which contains cursor config, batch metadata, and no-op flag.\n *\n * Cross-language standard: matches Ruby's get_batch_context pattern\n * for accessing Rust-provided batch configuration.\n *\n * @param context - The step context\n * @returns BatchWorkerInputs or null if not found\n */\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null {\n if (!context.stepInputs || Object.keys(context.stepInputs).length === 0) {\n return null;\n }\n return context.stepInputs as Partial<RustBatchWorkerInputs>;\n }\n\n /**\n * Handle no-op placeholder worker scenario.\n *\n * Returns a success result if the worker is a no-op placeholder\n * (created when a batchable step returns NoBatches), otherwise\n * returns null to allow normal processing to continue.\n *\n * Cross-language standard: matches Ruby's handle_no_op_worker.\n *\n * @param context - The step context\n * @returns Success result if no-op, null otherwise\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const noOpResult = this.handleNoOpWorker(context);\n * if (noOpResult) {\n * return noOpResult;\n * }\n * // ... normal processing\n * }\n * ```\n */\n handleNoOpWorker(context: StepContext): StepHandlerResult | null {\n const batchInputs = this.getBatchWorkerInputs(context);\n\n if (!batchInputs?.is_no_op) {\n return null;\n }\n\n return StepHandlerResult.success({\n batch_id: batchInputs.cursor?.batch_id ?? 'no_op',\n no_op: true,\n processed_count: 0,\n message: 'No batches to process',\n processed_at: new Date().toISOString(),\n });\n }\n\n /**\n * Create a success result for a batch analyzer.\n *\n * Formats the BatchAnalyzerOutcome in the structure expected by\n * the orchestration layer.\n *\n * @param outcome - The batch analyzer outcome\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the batch outcome\n */\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n batch_analyzer_outcome: {\n cursor_configs: outcome.cursorConfigs.map((c) => ({\n start_cursor: c.startCursor,\n end_cursor: c.endCursor,\n step_size: c.stepSize,\n metadata: c.metadata,\n })),\n total_items: outcome.totalItems,\n batch_metadata: outcome.batchMetadata,\n },\n };\n\n // Access success method from the handler this is mixed into\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a success result for a batch worker.\n *\n * Formats the BatchWorkerOutcome in the structure expected by\n * the orchestration layer.\n *\n * @param outcome - The batch worker outcome\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the worker outcome\n */\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n batch_worker_outcome: {\n items_processed: outcome.itemsProcessed,\n items_succeeded: outcome.itemsSucceeded,\n items_failed: outcome.itemsFailed,\n items_skipped: outcome.itemsSkipped,\n results: outcome.results,\n errors: outcome.errors,\n last_cursor: outcome.lastCursor,\n batch_metadata: outcome.batchMetadata,\n },\n };\n\n // Access success method from the handler this is mixed into\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Use this method when your handler needs to persist progress and be\n * re-dispatched for continued processing. This is useful for:\n * - Processing very large datasets that exceed memory limits\n * - Providing progress visibility for long-running batch jobs\n * - Enabling graceful shutdown with resumption capability\n *\n * Unlike batchWorkerSuccess, this does NOT complete the step.\n * Instead, it persists the checkpoint and causes the step to be\n * re-dispatched with the updated checkpoint context.\n *\n * @param cursor - Position to resume from\n * - number: For offset-based pagination (row number)\n * - string: For cursor-based pagination (opaque token)\n * - object: For complex cursors (e.g., {page_token: \"...\"})\n * @param itemsProcessed - Total items processed so far (cumulative across all yields)\n * @param accumulatedResults - Partial aggregations to carry forward\n * @returns A StepHandlerResult with checkpoint_yield type\n *\n * @example\n * ```typescript\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const batchCtx = this.getBatchContext(context);\n * const start = batchCtx?.checkpointCursor ?? batchCtx?.startCursor ?? 0;\n * const accumulated = batchCtx?.accumulatedResults ?? { total: 0 };\n *\n * // Process a chunk\n * const chunkSize = 1000;\n * for (let i = 0; i < chunkSize && start + i < batchCtx.endCursor; i++) {\n * accumulated.total += await processItem(start + i);\n * }\n *\n * const newCursor = start + chunkSize;\n * if (newCursor < batchCtx.endCursor) {\n * // More work to do - yield checkpoint\n * return this.checkpointYield(newCursor, newCursor, accumulated);\n * }\n *\n * // Done - return final success\n * return this.batchWorkerSuccess(\n * this.createWorkerOutcome(batchCtx.endCursor - batchCtx.startCursor)\n * );\n * }\n * ```\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult {\n const result: Record<string, unknown> = {\n type: 'checkpoint_yield',\n cursor,\n items_processed: itemsProcessed,\n };\n\n if (accumulatedResults !== undefined) {\n result.accumulated_results = accumulatedResults;\n }\n\n // Return as a special result that the FFI layer will handle\n return StepHandlerResult.success(result, {\n checkpoint_yield: true,\n batch_worker: true,\n });\n }\n\n // =========================================================================\n // Aggregation Helpers (Instance Methods - TAS-112)\n // =========================================================================\n\n /**\n * Detect batch aggregation scenario from dependency results.\n *\n * Cross-language standard: matches Ruby's detect_aggregation_scenario,\n * Python's detect_aggregation_scenario, and Rust's BatchAggregationScenario::detect.\n *\n * @param dependencyResults - All dependency results from the step context.\n * @param batchableStepName - Name of the batchable step (e.g., \"analyze_csv\").\n * @param batchWorkerPrefix - Prefix for batch worker step names (e.g., \"process_csv_batch_\").\n * @returns BatchAggregationScenario indicating NoBatches or WithBatches.\n *\n * @example\n * ```typescript\n * const scenario = this.detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n * if (scenario.isNoBatches) {\n * return this.noBatchesAggregationResult({ total: 0 });\n * }\n * ```\n */\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario {\n return detectAggregationScenario(dependencyResults, batchableStepName, batchWorkerPrefix);\n }\n\n /**\n * Create a success result for NoBatches aggregation scenario.\n *\n * Cross-language standard: matches Ruby's no_batches_aggregation_result\n * and Python's no_batches_aggregation_result.\n *\n * @param zeroMetrics - Metrics to return (typically zeros).\n * @returns Success result with workerCount=0 and scenario=\"no_batches\".\n *\n * @example\n * ```typescript\n * return this.noBatchesAggregationResult({\n * totalProcessed: 0,\n * totalValue: 0.0,\n * });\n * ```\n */\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult {\n const result: Record<string, unknown> = {\n worker_count: 0,\n scenario: 'no_batches',\n };\n if (zeroMetrics) {\n Object.assign(result, zeroMetrics);\n }\n return StepHandlerResult.success(result);\n }\n\n /**\n * Aggregate batch worker results handling both scenarios.\n *\n * Cross-language standard: matches Ruby's aggregate_batch_worker_results\n * and Python's aggregate_batch_worker_results.\n * Handles both NoBatches and WithBatches scenarios automatically.\n *\n * For NoBatches, returns zeroMetrics with worker_count=0.\n * For WithBatches, calls aggregationFn with batchResults dict.\n *\n * @param scenario - BatchAggregationScenario from detectAggregationScenario().\n * @param zeroMetrics - Metrics to return for NoBatches scenario.\n * @param aggregationFn - Function to aggregate batch results. Receives dict of\n * worker_name -> result_dict, returns aggregated metrics dict.\n * @returns Success result with aggregated data and worker_count.\n *\n * @example\n * ```typescript\n * const scenario = this.detectAggregationScenario(\n * context.dependencyResults,\n * 'analyze_csv',\n * 'process_csv_batch_'\n * );\n *\n * return this.aggregateBatchWorkerResults(\n * scenario,\n * { totalProcessed: 0 },\n * (batchResults) => {\n * let total = 0;\n * for (const result of Object.values(batchResults)) {\n * total += (result.count as number) || 0;\n * }\n * return { totalProcessed: total };\n * }\n * );\n * ```\n */\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult {\n if (scenario.isNoBatches) {\n return this.noBatchesAggregationResult(zeroMetrics);\n }\n\n // WithBatches scenario - aggregate results\n let aggregated: Record<string, unknown>;\n if (aggregationFn === undefined) {\n // Default aggregation: just pass through batchResults\n aggregated = { batch_results: scenario.batchResults };\n } else {\n aggregated = aggregationFn(scenario.batchResults);\n }\n\n const result: Record<string, unknown> = {\n ...aggregated,\n worker_count: scenario.workerCount,\n scenario: 'with_batches',\n };\n\n return StepHandlerResult.success(result);\n }\n\n // =========================================================================\n // Aggregation Helpers (Static Methods)\n // =========================================================================\n\n /**\n * Aggregate results from multiple batch workers.\n *\n * Delegates to `aggregateBatchResults` from types/batch.ts (TAS-112/TAS-123).\n * Cross-language standard: matches Python's aggregate_batch_results.\n *\n * @param workerResults - Array of results from batch worker steps\n * @param maxErrors - Maximum number of errors to collect (default: 100)\n * @returns Aggregated summary of all batch processing\n *\n * @example\n * ```typescript\n * // In an aggregator handler\n * const workerResults = context.getAllDependencyResults('process_batch_');\n * const summary = BatchableMixin.aggregateWorkerResults(workerResults);\n * return this.success(summary);\n * ```\n */\n static aggregateWorkerResults(\n workerResults: Array<Record<string, unknown> | null>,\n maxErrors = 100\n ): BatchAggregationResult {\n return aggregateBatchResults(workerResults, maxErrors);\n }\n}\n\n/**\n * Helper function to apply Batchable methods to a handler class.\n *\n * This is a convenience for applying all Batchable methods at once.\n *\n * @example\n * ```typescript\n * class MyBatchHandler extends StepHandler {\n * constructor() {\n * super();\n * applyBatchable(this);\n * }\n * }\n * ```\n */\nexport function applyBatchable<T extends object>(target: T): T & Batchable {\n const mixin = new BatchableMixin();\n\n (target as T & Batchable).createCursorConfig = mixin.createCursorConfig.bind(mixin);\n (target as T & Batchable).createCursorRanges = mixin.createCursorRanges.bind(mixin);\n (target as T & Batchable).createCursorConfigs = mixin.createCursorConfigs.bind(mixin);\n (target as T & Batchable).createBatchOutcome = mixin.createBatchOutcome.bind(mixin);\n (target as T & Batchable).createWorkerOutcome = mixin.createWorkerOutcome.bind(mixin);\n (target as T & Batchable).getBatchContext = mixin.getBatchContext.bind(mixin);\n (target as T & Batchable).getBatchWorkerInputs = mixin.getBatchWorkerInputs.bind(mixin);\n (target as T & Batchable).handleNoOpWorker = mixin.handleNoOpWorker.bind(mixin);\n (target as T & Batchable).batchAnalyzerSuccess = mixin.batchAnalyzerSuccess.bind(mixin);\n (target as T & Batchable).batchWorkerSuccess = mixin.batchWorkerSuccess.bind(mixin);\n // TAS-125: Checkpoint yield\n (target as T & Batchable).checkpointYield = mixin.checkpointYield.bind(mixin);\n // TAS-112: Aggregation helpers\n (target as T & Batchable).detectAggregationScenario = mixin.detectAggregationScenario.bind(mixin);\n (target as T & Batchable).noBatchesAggregationResult =\n mixin.noBatchesAggregationResult.bind(mixin);\n (target as T & Batchable).aggregateBatchWorkerResults =\n mixin.aggregateBatchWorkerResults.bind(mixin);\n\n return target as T & Batchable;\n}\n\n/**\n * Base class for batch-enabled step handlers.\n *\n * Extends StepHandler with batch processing capabilities.\n * Use this class when implementing handlers that need to create\n * batch worker configurations.\n *\n * @example\n * ```typescript\n * export class CsvAnalyzerHandler extends BatchableStepHandler {\n * static handlerName = 'MyNamespace.CsvAnalyzer';\n *\n * async call(context: StepContext): Promise<BatchableResult> {\n * const totalRows = 1000;\n * const batchConfigs: BatchWorkerConfig[] = [];\n *\n * for (let i = 0; i < 5; i++) {\n * batchConfigs.push({\n * batch_id: `batch_${i + 1}`,\n * cursor_start: i * 200,\n * cursor_end: (i + 1) * 200,\n * row_count: 200,\n * worker_index: i,\n * total_workers: 5,\n * });\n * }\n *\n * return this.batchSuccess(batchConfigs, {\n * total_rows: totalRows,\n * analyzed_at: new Date().toISOString(),\n * });\n * }\n * }\n * ```\n */\nexport abstract class BatchableStepHandler extends StepHandler implements Batchable {\n private readonly _batchMixin = new BatchableMixin();\n\n // Delegate Batchable interface methods to mixin\n createCursorConfig(\n start: number,\n end: number,\n stepSize?: number,\n metadata?: Record<string, unknown>\n ): CursorConfig {\n return this._batchMixin.createCursorConfig(start, end, stepSize, metadata);\n }\n\n createCursorRanges(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n maxBatches?: number\n ): CursorConfig[] {\n return this._batchMixin.createCursorRanges(totalItems, batchSize, stepSize, maxBatches);\n }\n\n createCursorConfigs(totalItems: number, workerCount: number): BatchWorkerConfig[] {\n return this._batchMixin.createCursorConfigs(totalItems, workerCount);\n }\n\n createBatchOutcome(\n totalItems: number,\n batchSize: number,\n stepSize?: number,\n batchMetadata?: Record<string, unknown>\n ): BatchAnalyzerOutcome {\n return this._batchMixin.createBatchOutcome(totalItems, batchSize, stepSize, batchMetadata);\n }\n\n createWorkerOutcome(\n itemsProcessed: number,\n itemsSucceeded?: number,\n itemsFailed?: number,\n itemsSkipped?: number,\n results?: Array<Record<string, unknown>>,\n errors?: Array<Record<string, unknown>>,\n lastCursor?: number | null,\n batchMetadata?: Record<string, unknown>\n ): BatchWorkerOutcome {\n return this._batchMixin.createWorkerOutcome(\n itemsProcessed,\n itemsSucceeded,\n itemsFailed,\n itemsSkipped,\n results,\n errors,\n lastCursor,\n batchMetadata\n );\n }\n\n getBatchContext(context: StepContext): BatchWorkerContext | null {\n return this._batchMixin.getBatchContext(context);\n }\n\n getBatchWorkerInputs(context: StepContext): Partial<RustBatchWorkerInputs> | null {\n return this._batchMixin.getBatchWorkerInputs(context);\n }\n\n handleNoOpWorker(context: StepContext): StepHandlerResult | null {\n return this._batchMixin.handleNoOpWorker(context);\n }\n\n batchAnalyzerSuccess(\n outcome: BatchAnalyzerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.batchAnalyzerSuccess(outcome, metadata);\n }\n\n batchWorkerSuccess(\n outcome: BatchWorkerOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.batchWorkerSuccess(outcome, metadata);\n }\n\n /**\n * TAS-125: Yield checkpoint for batch processing.\n *\n * Delegates to BatchableMixin.checkpointYield.\n */\n checkpointYield(\n cursor: number | string | Record<string, unknown>,\n itemsProcessed: number,\n accumulatedResults?: Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.checkpointYield(cursor, itemsProcessed, accumulatedResults);\n }\n\n // =========================================================================\n // Aggregation Helpers (TAS-112)\n // =========================================================================\n\n detectAggregationScenario(\n dependencyResults: Record<string, unknown>,\n batchableStepName: string,\n batchWorkerPrefix: string\n ): BatchAggregationScenario {\n return this._batchMixin.detectAggregationScenario(\n dependencyResults,\n batchableStepName,\n batchWorkerPrefix\n );\n }\n\n noBatchesAggregationResult(zeroMetrics?: Record<string, unknown>): StepHandlerResult {\n return this._batchMixin.noBatchesAggregationResult(zeroMetrics);\n }\n\n aggregateBatchWorkerResults(\n scenario: BatchAggregationScenario,\n zeroMetrics?: Record<string, unknown>,\n aggregationFn?: (\n batchResults: Record<string, Record<string, unknown>>\n ) => Record<string, unknown>\n ): StepHandlerResult {\n return this._batchMixin.aggregateBatchWorkerResults(scenario, zeroMetrics, aggregationFn);\n }\n\n /**\n * Create a successful batch analyzer result with batch worker configurations.\n *\n * This is a convenience method that wraps batch configurations in the format\n * expected by the Rust orchestration layer (BatchProcessingOutcome::CreateBatches).\n *\n * Uses the typed BatchProcessingOutcome from types/batch.ts (TAS-112/TAS-123).\n *\n * @param workerTemplateName - Name of the batch worker template step (e.g., \"process_csv_batch_ts\")\n * @param batchConfigs - Array of batch worker configurations\n * @param metadata - Additional metadata to include in the result\n * @returns A BatchableResult (StepHandlerResult) indicating success\n *\n * @example\n * ```typescript\n * return this.batchSuccess('process_csv_batch_ts', batchConfigs, {\n * total_rows: 1000,\n * analyzed_at: new Date().toISOString(),\n * });\n * ```\n */\n batchSuccess(\n workerTemplateName: string,\n batchConfigs: BatchWorkerConfig[],\n metadata?: Record<string, unknown>\n ): BatchableResult {\n // Convert BatchWorkerConfig[] to RustCursorConfig[] (TAS-112/TAS-123)\n const cursorConfigs: RustCursorConfig[] = batchConfigs.map((config) => ({\n batch_id: config.batch_id,\n start_cursor: config.cursor_start,\n end_cursor: config.cursor_end,\n batch_size: config.row_count,\n }));\n\n const totalItems = batchConfigs.reduce((sum, c) => sum + c.row_count, 0);\n\n // Use typed BatchProcessingOutcome factory (TAS-112/TAS-123)\n const batchProcessingOutcome = createBatchesOutcome(\n workerTemplateName,\n batchConfigs.length,\n cursorConfigs,\n totalItems\n );\n\n // Return in the format expected by Rust orchestration\n const result: Record<string, unknown> = {\n batch_processing_outcome: batchProcessingOutcome,\n ...(metadata || {}),\n };\n\n return StepHandlerResult.success(result, metadata);\n }\n\n /**\n * Create a no-batches result when batch processing is not needed.\n *\n * Use this when the batchable handler determines no batch workers are needed.\n *\n * Uses the typed BatchProcessingOutcome from types/batch.ts (TAS-112/TAS-123).\n * Cross-language standard: matches Ruby's no_batches_outcome(reason:, metadata:)\n * and Python's no_batches_outcome(reason, metadata).\n *\n * @param reason - Human-readable reason why no batches are needed (optional but recommended)\n * @param metadata - Additional metadata to include in the result\n * @returns A BatchableResult (StepHandlerResult) indicating no batches\n *\n * @example\n * ```typescript\n * if (totalItems === 0) {\n * return this.noBatchesResult('empty_dataset', { total_rows: 0 });\n * }\n * ```\n */\n noBatchesResult(reason?: string, metadata?: Record<string, unknown>): BatchableResult {\n // Use typed BatchProcessingOutcome factory (TAS-112/TAS-123)\n const batchProcessingOutcome = createNoBatchesOutcome();\n\n const result: Record<string, unknown> = {\n batch_processing_outcome: batchProcessingOutcome,\n ...(metadata || {}),\n };\n\n // Add reason if provided (matches Ruby/Python pattern)\n if (reason) {\n result.reason = reason;\n }\n\n return StepHandlerResult.success(result, metadata);\n }\n}\n","/**\n * Decision mixin for workflow routing.\n *\n * TAS-112: Composition Pattern - Decision Mixin\n *\n * This module provides the DecisionMixin class for step handlers that make\n * routing decisions. Use via interface implementation with method binding.\n *\n * @example\n * ```typescript\n * class RouteOrderHandler extends StepHandler implements DecisionCapable {\n * static handlerName = 'route_order';\n *\n * // Bind DecisionMixin methods\n * decisionSuccess = DecisionMixin.prototype.decisionSuccess.bind(this);\n * skipBranches = DecisionMixin.prototype.skipBranches.bind(this);\n * // ... other required methods\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderType = context.inputData['order_type'];\n * if (orderType === 'premium') {\n * return this.decisionSuccess(\n * ['validate_premium', 'process_premium'],\n * { order_type: orderType }\n * );\n * }\n * return this.decisionSuccess(['process_standard']);\n * }\n * }\n * ```\n *\n * @module handler/mixins/decision\n */\n\nimport { StepHandlerResult } from '../../types/step-handler-result.js';\n\n/**\n * Type of decision point outcome.\n */\nexport enum DecisionType {\n CREATE_STEPS = 'create_steps',\n NO_BRANCHES = 'no_branches',\n}\n\n/**\n * Outcome from a decision point handler.\n *\n * Decision handlers return this to indicate which branch(es) of a workflow\n * to execute.\n */\nexport interface DecisionPointOutcome {\n /** Type of decision made */\n decisionType: DecisionType;\n /** Names of steps to execute next */\n nextStepNames: string[];\n /** Optional dynamically created steps */\n dynamicSteps?: Array<Record<string, unknown>>;\n /** Human-readable reason for the decision */\n reason?: string;\n /** Context data for routing */\n routingContext: Record<string, unknown>;\n}\n\n/**\n * Interface for decision-capable handlers.\n *\n * Implement this interface and bind DecisionMixin methods to get decision functionality.\n */\nexport interface DecisionCapable {\n /** Handler name (from StepHandler) */\n name: string;\n /** Handler version (from StepHandler) */\n version: string;\n\n // Decision methods\n decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n\n decisionFailure(\n message: string,\n errorType?: string,\n retryable?: boolean,\n metadata?: Record<string, unknown>\n ): StepHandlerResult;\n}\n\n/**\n * Implementation of decision methods.\n *\n * TAS-112: Use via interface implementation with method binding.\n *\n * Decision handlers are used to make routing decisions in workflows.\n * They evaluate conditions and determine which steps should execute next.\n */\nexport class DecisionMixin implements DecisionCapable {\n // These should be defined on the handler class\n get name(): string {\n return (this.constructor as { handlerName?: string }).handlerName || this.constructor.name;\n }\n\n get version(): string {\n return (this.constructor as { handlerVersion?: string }).handlerVersion || '1.0.0';\n }\n\n /**\n * Simplified decision success helper (cross-language standard API).\n *\n * Use this when routing to one or more steps based on a decision.\n * This is the recommended method for most decision handlers.\n *\n * @param steps - List of step names to activate\n * @param routingContext - Optional context for routing decisions\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult with the decision outcome\n */\n decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const outcome: DecisionPointOutcome = {\n decisionType: DecisionType.CREATE_STEPS,\n nextStepNames: steps,\n routingContext: routingContext || {},\n };\n\n return this.decisionSuccessWithOutcome(outcome, metadata);\n }\n\n /**\n * Create a success result with a DecisionPointOutcome.\n *\n * Use this for complex decision outcomes that require dynamic steps\n * or advanced routing. For simple step routing, use `decisionSuccess()`.\n */\n decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n // Build decision_point_outcome in format Rust expects\n const decisionPointOutcome: Record<string, unknown> = {\n type: outcome.decisionType,\n step_names: outcome.nextStepNames,\n };\n\n const result: Record<string, unknown> = {\n decision_point_outcome: decisionPointOutcome,\n };\n\n if (outcome.dynamicSteps) {\n result.dynamic_steps = outcome.dynamicSteps;\n }\n\n if (outcome.routingContext && Object.keys(outcome.routingContext).length > 0) {\n result.routing_context = outcome.routingContext;\n }\n\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.success(result, combinedMetadata);\n }\n\n /**\n * Create a success result for a decision with no branches.\n *\n * Use this when the decision results in no additional steps being executed.\n * This is still a successful outcome - the decision was made correctly,\n * it just doesn't require any follow-up steps.\n */\n decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const decisionPointOutcome: Record<string, unknown> = {\n type: outcome.decisionType,\n };\n\n const result: Record<string, unknown> = {\n decision_point_outcome: decisionPointOutcome,\n };\n\n if (outcome.reason) {\n result.reason = outcome.reason;\n }\n\n if (outcome.routingContext && Object.keys(outcome.routingContext).length > 0) {\n result.routing_context = outcome.routingContext;\n }\n\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.success(result, combinedMetadata);\n }\n\n /**\n * Convenience method to skip all branches.\n *\n * @param reason - Human-readable reason for skipping branches\n * @param routingContext - Optional context data\n * @param metadata - Optional additional metadata\n * @returns A success StepHandlerResult indicating no branches\n */\n skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const outcome: DecisionPointOutcome = {\n decisionType: DecisionType.NO_BRANCHES,\n nextStepNames: [],\n reason,\n routingContext: routingContext || {},\n };\n\n return this.decisionNoBranches(outcome, metadata);\n }\n\n /**\n * Create a failure result for a decision that could not be made.\n *\n * Use this when the handler cannot determine the appropriate routing,\n * typically due to invalid input data or missing required information.\n *\n * Decision failures are usually NOT retryable.\n */\n decisionFailure(\n message: string,\n errorType = 'decision_error',\n retryable = false,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n const combinedMetadata: Record<string, unknown> = { ...(metadata || {}) };\n combinedMetadata.decision_handler = this.name;\n combinedMetadata.decision_version = this.version;\n\n return StepHandlerResult.failure(message, errorType, retryable, combinedMetadata);\n }\n}\n\n/**\n * Helper function to apply decision methods to a handler instance.\n *\n * @example\n * ```typescript\n * class MyDecisionHandler extends StepHandler {\n * constructor() {\n * super();\n * applyDecision(this);\n * }\n * }\n * ```\n */\nexport function applyDecision<T extends { name: string; version: string }>(\n target: T\n): T & DecisionCapable {\n const mixin = new DecisionMixin();\n\n (target as T & DecisionCapable).decisionSuccess = mixin.decisionSuccess.bind(target);\n (target as T & DecisionCapable).decisionSuccessWithOutcome =\n mixin.decisionSuccessWithOutcome.bind(target);\n (target as T & DecisionCapable).decisionNoBranches = mixin.decisionNoBranches.bind(target);\n (target as T & DecisionCapable).skipBranches = mixin.skipBranches.bind(target);\n (target as T & DecisionCapable).decisionFailure = mixin.decisionFailure.bind(target);\n\n return target as T & DecisionCapable;\n}\n","/**\n * Decision handler for workflow routing.\n *\n * TAS-112: Composition Pattern (DEPRECATED CLASS)\n *\n * This module provides the DecisionHandler class for backward compatibility.\n * For new code, use the mixin pattern:\n *\n * @example Using DecisionMixin\n * ```typescript\n * import { StepHandler } from './base';\n * import { DecisionMixin, DecisionCapable, applyDecision } from './mixins/decision';\n *\n * class RouteOrderHandler extends StepHandler implements DecisionCapable {\n * static handlerName = 'route_order';\n *\n * constructor() {\n * super();\n * applyDecision(this);\n * }\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const orderType = context.inputData['order_type'];\n * if (orderType === 'premium') {\n * return this.decisionSuccess(\n * ['validate_premium', 'process_premium'],\n * { order_type: orderType }\n * );\n * }\n * return this.decisionSuccess(['process_standard']);\n * }\n * }\n * ```\n *\n * @module handler/decision\n */\n\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { StepHandler } from './base.js';\nimport { DecisionMixin, type DecisionPointOutcome } from './mixins/decision.js';\n\n// Re-export types from mixin for backward compatibility\nexport { type DecisionPointOutcome, DecisionType } from './mixins/decision.js';\n\n/**\n * Base class for decision point step handlers.\n *\n * TAS-112: This class is provided for backward compatibility.\n * For new code, prefer using DecisionMixin directly with applyDecision().\n *\n * Decision handlers are used to make routing decisions in workflows.\n * They evaluate conditions and determine which steps should execute next.\n *\n * @example\n * ```typescript\n * class CustomerTierRouter extends DecisionHandler {\n * static handlerName = 'route_by_tier';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * const tier = context.inputData['customer_tier'];\n * if (tier === 'enterprise') {\n * return this.decisionSuccess(\n * ['enterprise_validation', 'enterprise_processing'],\n * { tier }\n * );\n * } else if (tier === 'premium') {\n * return this.decisionSuccess(['premium_processing']);\n * } else {\n * return this.decisionSuccess(['standard_processing']);\n * }\n * }\n * }\n * ```\n */\nexport abstract class DecisionHandler extends StepHandler {\n private readonly _decisionMixin = new DecisionMixin();\n\n get capabilities(): string[] {\n return ['process', 'decision', 'routing'];\n }\n\n /**\n * Simplified decision success helper (cross-language standard API).\n *\n * Use this when routing to one or more steps based on a decision.\n * This is the recommended method for most decision handlers.\n */\n protected decisionSuccess(\n steps: string[],\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionSuccess.call(this, steps, routingContext, metadata);\n }\n\n /**\n * Create a success result with a DecisionPointOutcome.\n *\n * Use this for complex decision outcomes that require dynamic steps\n * or advanced routing. For simple step routing, use `decisionSuccess()`.\n */\n protected decisionSuccessWithOutcome(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionSuccessWithOutcome.call(this, outcome, metadata);\n }\n\n /**\n * Create a success result for a decision with no branches.\n *\n * Use this when the decision results in no additional steps being executed.\n */\n protected decisionNoBranches(\n outcome: DecisionPointOutcome,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionNoBranches.call(this, outcome, metadata);\n }\n\n /**\n * Convenience method to skip all branches.\n */\n protected skipBranches(\n reason: string,\n routingContext?: Record<string, unknown>,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.skipBranches.call(this, reason, routingContext, metadata);\n }\n\n /**\n * Create a failure result for a decision that could not be made.\n */\n protected decisionFailure(\n message: string,\n errorType = 'decision_error',\n retryable = false,\n metadata?: Record<string, unknown>\n ): StepHandlerResult {\n return this._decisionMixin.decisionFailure.call(this, message, errorType, retryable, metadata);\n }\n}\n\n/**\n * Alias for DecisionHandler for backwards compatibility.\n *\n * @deprecated Use DecisionHandler instead\n */\nexport { DecisionHandler as DecisionStepHandler };\n","/**\n * Domain Events Module for TypeScript Workers\n *\n * Provides infrastructure for custom domain event publishers and subscribers.\n * Publishers transform step results into business events; subscribers handle\n * fast (in-process) events for internal processing.\n *\n * Architecture: Handlers DON'T publish events directly. Events are declared\n * in YAML templates, and Rust orchestration publishes them after step completion.\n * Custom publishers only transform payloads. Subscribers only receive fast events.\n *\n * @module handler/domain-events\n * @see docs/architecture/domain-events.md\n * @see TAS-122, TAS-112 Phase 7\n */\n\nimport pino, { type Logger, type LoggerOptions } from 'pino';\nimport type { NapiModule } from '../ffi/ffi-layer.js';\nimport type { FfiDomainEvent } from '../ffi/types.js';\n\n// ---------------------------------------------------------------------------\n// Logger Setup\n// ---------------------------------------------------------------------------\n\nconst loggerOptions: LoggerOptions = {\n name: 'domain-events',\n level: process.env.RUST_LOG ?? 'info',\n};\n\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// Type Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Context passed to publishers for event transformation.\n *\n * Contains all information needed to build a business event payload.\n */\nexport interface StepEventContext {\n /** UUID of the task */\n readonly taskUuid: string;\n\n /** UUID of the step */\n readonly stepUuid: string;\n\n /** Name of the step handler */\n readonly stepName: string;\n\n /** Namespace (e.g., \"payments\", \"inventory\") */\n readonly namespace: string;\n\n /** Correlation ID for distributed tracing */\n readonly correlationId: string;\n\n /** Step result data (success payload or error info) */\n readonly result?: Record<string, unknown>;\n\n /** Execution metadata */\n readonly metadata: Record<string, unknown>;\n}\n\n/**\n * Event declaration from YAML task template.\n */\nexport interface EventDeclaration {\n /** Event name (e.g., \"payment.processed\") */\n readonly name: string;\n\n /** Publication condition: \"success\" | \"failure\" | \"always\" */\n readonly condition?: 'success' | 'failure' | 'retryable_failure' | 'permanent_failure' | 'always';\n\n /** Delivery mode: \"durable\" (PGMQ) | \"fast\" (in-process) | \"broadcast\" (both) */\n readonly deliveryMode?: 'durable' | 'fast' | 'broadcast';\n\n /** Custom publisher name (optional) */\n readonly publisher?: string;\n\n /** JSON schema for payload validation (optional) */\n readonly schema?: Record<string, unknown>;\n}\n\n/**\n * Step result passed to publishers.\n */\nexport interface StepResult {\n /** Whether the step succeeded */\n readonly success: boolean;\n\n /** Step handler's return value */\n readonly result?: Record<string, unknown>;\n\n /** Execution metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Domain event structure for subscribers.\n *\n * This is the shape of events received by BaseSubscriber.handle().\n */\nexport interface DomainEvent {\n /** Unique event ID (UUID v7) */\n readonly eventId: string;\n\n /** Event name (e.g., \"payment.processed\") */\n readonly eventName: string;\n\n /** Business payload from publisher transformation */\n readonly payload: Record<string, unknown>;\n\n /** Event metadata */\n readonly metadata: DomainEventMetadata;\n\n /** Original step execution result */\n readonly executionResult: StepResult;\n}\n\n/**\n * Metadata attached to every domain event.\n */\nexport interface DomainEventMetadata {\n /** Task UUID */\n readonly taskUuid: string;\n\n /** Step UUID */\n readonly stepUuid: string;\n\n /** Step name */\n readonly stepName?: string;\n\n /** Namespace */\n readonly namespace: string;\n\n /** Correlation ID for tracing */\n readonly correlationId: string;\n\n /** When the event was fired (ISO8601) */\n readonly firedAt: string;\n\n /** Publisher that created this event */\n readonly publisher?: string;\n\n /** Additional custom metadata */\n readonly [key: string]: unknown;\n}\n\n/**\n * Context passed to the publish() method.\n *\n * Cross-language standard API (TAS-96).\n */\nexport interface PublishContext {\n /** Event name */\n readonly eventName: string;\n\n /** Step result */\n readonly stepResult: StepResult;\n\n /** Event declaration from YAML */\n readonly eventDeclaration?: EventDeclaration;\n\n /** Step execution context */\n readonly stepContext?: StepEventContext;\n}\n\n// ---------------------------------------------------------------------------\n// BasePublisher\n// ---------------------------------------------------------------------------\n\n/**\n * Abstract base class for custom domain event publishers.\n *\n * Publishers transform step execution results into business events.\n * They are declared in YAML via the `publisher:` field and registered\n * at bootstrap time.\n *\n * NOTE: Publishers don't call publish APIs directly. They transform data\n * that Rust orchestration publishes.\n *\n * @example\n * ```typescript\n * class PaymentEventPublisher extends BasePublisher {\n * readonly publisherName = 'PaymentEventPublisher';\n *\n * transformPayload(stepResult: StepResult, eventDecl?: EventDeclaration): Record<string, unknown> {\n * const result = stepResult.result ?? {};\n * return {\n * transactionId: result.transaction_id,\n * amount: result.amount,\n * currency: result.currency ?? 'USD',\n * status: stepResult.success ? 'succeeded' : 'failed',\n * };\n * }\n *\n * shouldPublish(stepResult: StepResult): boolean {\n * return stepResult.success && stepResult.result?.transaction_id != null;\n * }\n * }\n * ```\n */\nexport abstract class BasePublisher {\n protected readonly logger: Logger = log;\n\n /**\n * Publisher name for registry lookup.\n * Must match the `publisher:` field in YAML.\n */\n abstract readonly publisherName: string;\n\n /**\n * Transform step result into business event payload.\n *\n * Override to customize the event payload for your domain.\n * Default returns the step result as-is.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns Business event payload to publish\n */\n transformPayload(\n stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): Record<string, unknown> {\n return stepResult.result ?? {};\n }\n\n /**\n * Determine if this event should be published.\n *\n * Override to add custom conditions beyond YAML's `condition:` field.\n * The YAML condition is evaluated first by Rust orchestration.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns true if the event should be published\n */\n shouldPublish(\n _stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): boolean {\n return true;\n }\n\n /**\n * Add additional metadata to the event.\n *\n * Override to add custom metadata fields.\n *\n * @param stepResult - The step execution result\n * @param eventDeclaration - The event declaration from YAML\n * @param stepContext - The step execution context\n * @returns Additional metadata to merge into event metadata\n */\n additionalMetadata(\n _stepResult: StepResult,\n _eventDeclaration?: EventDeclaration,\n _stepContext?: StepEventContext\n ): Record<string, unknown> {\n return {};\n }\n\n /**\n * Hook called before publishing.\n *\n * Override for pre-publish validation, logging, or metrics.\n * Return false to prevent publishing.\n *\n * @param eventName - The event name\n * @param payload - The transformed payload\n * @param metadata - The event metadata\n * @returns true to continue, false to skip publishing\n */\n beforePublish(\n eventName: string,\n _payload: Record<string, unknown>,\n _metadata: Record<string, unknown>\n ): boolean {\n this.logger.debug({ eventName }, 'Publishing event');\n return true;\n }\n\n /**\n * Hook called after successful publishing.\n *\n * Override for post-publish logging, metrics, or cleanup.\n *\n * @param eventName - The event name\n * @param payload - The transformed payload\n * @param metadata - The event metadata\n */\n afterPublish(\n eventName: string,\n _payload: Record<string, unknown>,\n _metadata: Record<string, unknown>\n ): void {\n this.logger.debug({ eventName }, 'Event published');\n }\n\n /**\n * Hook called if publishing fails.\n *\n * Override for error handling, logging, or fallback behavior.\n *\n * @param eventName - The event name\n * @param error - The error that occurred\n * @param payload - The transformed payload\n */\n onPublishError(eventName: string, error: Error, _payload: Record<string, unknown>): void {\n this.logger.error({ eventName, error: error.message }, 'Failed to publish event');\n }\n\n /**\n * Cross-language standard: Publish an event with unified context.\n *\n * Coordinates the lifecycle hooks into a single publish call.\n *\n * @param ctx - Publish context containing all required data\n * @returns true if event was published, false if skipped\n */\n publish(ctx: PublishContext): boolean {\n const { eventName, stepResult, eventDeclaration, stepContext } = ctx;\n\n // Check publishing conditions\n if (!this.shouldPublish(stepResult, eventDeclaration, stepContext)) {\n return false;\n }\n\n // Transform payload\n const payload = this.transformPayload(stepResult, eventDeclaration, stepContext);\n\n // Build metadata\n const baseMetadata: Record<string, unknown> = {\n publisher: this.publisherName,\n publishedAt: new Date().toISOString(),\n };\n\n // Add step context info if available\n if (stepContext) {\n baseMetadata.taskUuid = stepContext.taskUuid;\n baseMetadata.stepUuid = stepContext.stepUuid;\n baseMetadata.stepName = stepContext.stepName;\n baseMetadata.namespace = stepContext.namespace;\n }\n\n const metadata = {\n ...baseMetadata,\n ...this.additionalMetadata(stepResult, eventDeclaration, stepContext),\n };\n\n try {\n // Pre-publish hook (can abort)\n if (!this.beforePublish(eventName, payload, metadata)) {\n return false;\n }\n\n // Actual publishing is handled by Rust orchestration\n // This method just prepares and validates the event\n\n // Post-publish hook\n this.afterPublish(eventName, payload, metadata);\n\n return true;\n } catch (error) {\n this.onPublishError(\n eventName,\n error instanceof Error ? error : new Error(String(error)),\n payload\n );\n return false;\n }\n }\n}\n\n/**\n * Default publisher that passes step result through unchanged.\n */\nexport class DefaultPublisher extends BasePublisher {\n readonly publisherName = 'default';\n\n transformPayload(stepResult: StepResult): Record<string, unknown> {\n return stepResult.result ?? {};\n }\n}\n\n// ---------------------------------------------------------------------------\n// BaseSubscriber\n// ---------------------------------------------------------------------------\n\n/**\n * Static interface for subscriber classes (for type checking).\n */\nexport interface SubscriberClass {\n /** Patterns to subscribe to */\n subscribesTo(): string[];\n\n /** Constructor */\n new (): BaseSubscriber;\n}\n\n/**\n * Abstract base class for domain event subscribers.\n *\n * Subscribers handle fast (in-process) domain events for internal processing.\n * They subscribe to event patterns and receive events via the InProcessEventBus.\n *\n * @example\n * ```typescript\n * class MetricsSubscriber extends BaseSubscriber {\n * static subscribesTo(): string[] {\n * return ['*']; // All events\n * }\n *\n * handle(event: DomainEvent): void {\n * metrics.increment(`domain_events.${event.eventName.replace('.', '_')}`);\n * }\n * }\n *\n * class PaymentSubscriber extends BaseSubscriber {\n * static subscribesTo(): string[] {\n * return ['payment.*']; // Only payment events\n * }\n *\n * handle(event: DomainEvent): void {\n * if (event.eventName === 'payment.processed') {\n * notifyAccounting(event.payload);\n * }\n * }\n * }\n * ```\n */\nexport abstract class BaseSubscriber {\n protected readonly logger: Logger = log;\n private _active = false;\n private _subscriptions: string[] = [];\n\n /**\n * Event patterns to subscribe to.\n *\n * Override this static method to declare patterns.\n * Supports wildcards: \"*\" matches all, \"payment.*\" matches payment.processed, etc.\n *\n * @returns Array of event patterns\n */\n static subscribesTo(): string[] {\n return ['*'];\n }\n\n /**\n * Check if the subscriber is active.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * Get subscribed patterns.\n */\n get subscriptions(): readonly string[] {\n return this._subscriptions;\n }\n\n /**\n * Handle a domain event.\n *\n * Subclasses MUST implement this method.\n *\n * @param event - The domain event to handle\n */\n abstract handle(event: DomainEvent): void | Promise<void>;\n\n /**\n * Hook called before handling an event.\n *\n * Override for pre-processing, validation, or filtering.\n * Return false to skip handling this event.\n *\n * @param event - The domain event\n * @returns true to continue handling, false to skip\n */\n beforeHandle(_event: DomainEvent): boolean {\n return true;\n }\n\n /**\n * Hook called after successful handling.\n *\n * Override for post-processing, metrics, or cleanup.\n *\n * @param event - The domain event\n */\n afterHandle(_event: DomainEvent): void {\n // Default: no-op\n }\n\n /**\n * Hook called if handling fails.\n *\n * Override for custom error handling, alerts, or retry logic.\n * Note: Domain events use fire-and-forget semantics.\n *\n * @param event - The domain event\n * @param error - The error that occurred\n */\n onHandleError(event: DomainEvent, error: Error): void {\n this.logger.error(\n { eventName: event.eventName, error: error.message },\n `${this.constructor.name}: Failed to handle event`\n );\n }\n\n /**\n * Check if this subscriber matches an event name.\n *\n * Supports wildcard patterns:\n * - \"*\" matches everything\n * - \"payment.*\" matches \"payment.processed\", \"payment.failed\"\n * - \"order.created\" matches exactly \"order.created\"\n *\n * @param eventName - The event name to check\n * @returns true if this subscriber should handle the event\n */\n matches(eventName: string): boolean {\n const ctor = this.constructor as typeof BaseSubscriber;\n const patterns = ctor.subscribesTo();\n\n return patterns.some((pattern) => {\n if (pattern === '*') {\n return true;\n }\n // Convert glob pattern to regex\n const regex = new RegExp(`^${pattern.replace(/\\*/g, '.*')}$`);\n return regex.test(eventName);\n });\n }\n\n /**\n * Start listening for events.\n *\n * Registers with the InProcessDomainEventPoller.\n *\n * @param poller - The event poller to register with\n */\n start(poller: InProcessDomainEventPoller): void {\n if (this._active) {\n return;\n }\n\n this._active = true;\n const ctor = this.constructor as typeof BaseSubscriber;\n const patterns = ctor.subscribesTo();\n\n for (const pattern of patterns) {\n poller.subscribe(pattern, (event) => this.handleEventSafely(event));\n this._subscriptions.push(pattern);\n this.logger.info({ pattern, subscriber: this.constructor.name }, 'Subscribed to pattern');\n }\n\n this.logger.info(\n { subscriber: this.constructor.name, subscriptionCount: this._subscriptions.length },\n 'Subscriber started'\n );\n }\n\n /**\n * Stop listening for events.\n */\n stop(): void {\n if (!this._active) {\n return;\n }\n\n this._active = false;\n this._subscriptions = [];\n this.logger.info({ subscriber: this.constructor.name }, 'Subscriber stopped');\n }\n\n /**\n * Safely handle an event with error capture.\n */\n private async handleEventSafely(event: DomainEvent): Promise<void> {\n if (!this._active) {\n return;\n }\n\n if (!this.beforeHandle(event)) {\n return;\n }\n\n try {\n await this.handle(event);\n this.afterHandle(event);\n } catch (error) {\n this.onHandleError(event, error instanceof Error ? error : new Error(String(error)));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// PublisherRegistry\n// ---------------------------------------------------------------------------\n\n/**\n * Error thrown when a required publisher is not registered.\n */\nexport class PublisherNotFoundError extends Error {\n readonly publisherName: string;\n readonly registeredPublishers: string[];\n\n constructor(name: string, registered: string[]) {\n super(`Publisher '${name}' not found. Registered: ${registered.join(', ')}`);\n this.name = 'PublisherNotFoundError';\n this.publisherName = name;\n this.registeredPublishers = registered;\n }\n}\n\n/**\n * Error thrown when required publishers are missing during validation.\n */\nexport class PublisherValidationError extends Error {\n readonly missingPublishers: string[];\n readonly registeredPublishers: string[];\n\n constructor(missing: string[], registered: string[]) {\n super(`Missing publishers: ${missing.join(', ')}. Registered: ${registered.join(', ')}`);\n this.name = 'PublisherValidationError';\n this.missingPublishers = missing;\n this.registeredPublishers = registered;\n }\n}\n\n/**\n * Error thrown when modifying a frozen registry.\n */\nexport class RegistryFrozenError extends Error {\n constructor() {\n super('Registry is frozen after validation');\n this.name = 'RegistryFrozenError';\n }\n}\n\n/**\n * Error thrown when registering a duplicate publisher.\n */\nexport class DuplicatePublisherError extends Error {\n readonly publisherName: string;\n\n constructor(name: string) {\n super(`Publisher '${name}' is already registered`);\n this.name = 'DuplicatePublisherError';\n this.publisherName = name;\n }\n}\n\n/**\n * Registry for custom domain event publishers.\n *\n * Maps publisher names (from YAML configuration) to their implementations.\n * Publishers are registered at bootstrap time and validated against task templates.\n *\n * @example\n * ```typescript\n * const registry = PublisherRegistry.instance;\n *\n * // Register custom publishers\n * registry.register(new PaymentEventPublisher());\n * registry.register(new InventoryEventPublisher());\n *\n * // Validate against templates\n * registry.validateRequired(['PaymentEventPublisher', 'InventoryEventPublisher']);\n *\n * // Look up publishers\n * const publisher = registry.get('PaymentEventPublisher');\n * ```\n */\nexport class PublisherRegistry {\n private static _instance: PublisherRegistry | null = null;\n\n private readonly publishers = new Map<string, BasePublisher>();\n private readonly defaultPublisher = new DefaultPublisher();\n private frozen = false;\n private readonly logger: Logger = log;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance.\n */\n static get instance(): PublisherRegistry {\n if (!PublisherRegistry._instance) {\n PublisherRegistry._instance = new PublisherRegistry();\n }\n return PublisherRegistry._instance;\n }\n\n /**\n * Register a custom publisher.\n *\n * @param publisher - The publisher instance to register\n * @throws RegistryFrozenError if registry is frozen\n * @throws DuplicatePublisherError if name is already registered\n */\n register(publisher: BasePublisher): void {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n const name = publisher.publisherName;\n\n if (this.publishers.has(name)) {\n throw new DuplicatePublisherError(name);\n }\n\n this.logger.info({ publisherName: name }, 'Registering domain event publisher');\n this.publishers.set(name, publisher);\n }\n\n /**\n * Get a publisher by name.\n *\n * @param name - The publisher name\n * @returns The publisher, or undefined if not found\n */\n get(name: string): BasePublisher | undefined {\n return this.publishers.get(name);\n }\n\n /**\n * Get a publisher by name, or return the default.\n *\n * @param name - The publisher name (optional)\n * @returns The publisher or default\n */\n getOrDefault(name?: string): BasePublisher {\n if (!name || name === 'default') {\n return this.defaultPublisher;\n }\n\n const publisher = this.publishers.get(name);\n if (!publisher) {\n this.logger.warn({ publisherName: name }, 'Publisher not found, using default');\n return this.defaultPublisher;\n }\n\n return publisher;\n }\n\n /**\n * Get a publisher by name (strict mode).\n *\n * @param name - The publisher name\n * @returns The publisher\n * @throws PublisherNotFoundError if not registered\n */\n getStrict(name: string): BasePublisher {\n if (name === 'default') {\n return this.defaultPublisher;\n }\n\n const publisher = this.publishers.get(name);\n if (!publisher) {\n throw new PublisherNotFoundError(name, this.registeredNames);\n }\n\n return publisher;\n }\n\n /**\n * Check if a publisher is registered.\n */\n isRegistered(name: string): boolean {\n return name === 'default' || this.publishers.has(name);\n }\n\n /**\n * Get all registered publisher names.\n */\n get registeredNames(): string[] {\n return Array.from(this.publishers.keys());\n }\n\n /**\n * Get count of registered publishers.\n */\n get count(): number {\n return this.publishers.size;\n }\n\n /**\n * Check if registry is empty.\n */\n get isEmpty(): boolean {\n return this.publishers.size === 0;\n }\n\n /**\n * Check if registry is frozen.\n */\n get isFrozen(): boolean {\n return this.frozen;\n }\n\n /**\n * Unregister a publisher.\n *\n * @throws RegistryFrozenError if registry is frozen\n */\n unregister(name: string): boolean {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n this.logger.info({ publisherName: name }, 'Unregistering domain event publisher');\n return this.publishers.delete(name);\n }\n\n /**\n * Clear all registered publishers.\n *\n * @throws RegistryFrozenError if registry is frozen\n */\n clear(): void {\n if (this.frozen) {\n throw new RegistryFrozenError();\n }\n\n this.logger.info('Clearing all domain event publishers');\n this.publishers.clear();\n }\n\n /**\n * Validate that all required publishers are registered.\n *\n * After validation, the registry is frozen.\n *\n * @param requiredPublishers - Publisher names from YAML configs\n * @throws PublisherValidationError if some publishers are missing\n */\n validateRequired(requiredPublishers: string[]): void {\n const missing: string[] = [];\n\n for (const name of requiredPublishers) {\n if (name === 'default') {\n continue;\n }\n if (!this.isRegistered(name)) {\n missing.push(name);\n }\n }\n\n if (missing.length > 0) {\n throw new PublisherValidationError(missing, this.registeredNames);\n }\n\n this.frozen = true;\n this.logger.info({ registeredPublishers: this.registeredNames }, 'Publisher validation passed');\n }\n\n /**\n * Freeze the registry to prevent further changes.\n */\n freeze(): void {\n this.frozen = true;\n this.logger.info('Publisher registry frozen');\n }\n\n /**\n * Reset the registry (for testing).\n */\n reset(): void {\n this.publishers.clear();\n this.frozen = false;\n this.logger.info('Publisher registry reset');\n }\n}\n\n// ---------------------------------------------------------------------------\n// SubscriberRegistry\n// ---------------------------------------------------------------------------\n\n/**\n * Subscriber statistics.\n */\nexport interface SubscriberStats {\n /** Whether subscribers have been started */\n readonly started: boolean;\n\n /** Total subscriber count */\n readonly subscriberCount: number;\n\n /** Number of active subscribers */\n readonly activeCount: number;\n\n /** Individual subscriber info */\n readonly subscribers: ReadonlyArray<{\n readonly className: string;\n readonly active: boolean;\n readonly patterns: readonly string[];\n }>;\n}\n\n/**\n * Registry for domain event subscribers.\n *\n * Manages the lifecycle of subscribers. Subscribers are registered at bootstrap\n * time and started/stopped together with the worker.\n *\n * @example\n * ```typescript\n * const registry = SubscriberRegistry.instance;\n *\n * // Register subscriber classes (instantiation deferred)\n * registry.register(PaymentSubscriber);\n * registry.register(MetricsSubscriber);\n *\n * // Start all subscribers with the poller\n * registry.startAll(poller);\n *\n * // Stop all when shutting down\n * registry.stopAll();\n * ```\n */\nexport class SubscriberRegistry {\n private static _instance: SubscriberRegistry | null = null;\n\n private readonly subscriberClasses: SubscriberClass[] = [];\n private readonly subscribers: BaseSubscriber[] = [];\n private started = false;\n private readonly logger: Logger = log;\n\n private constructor() {\n // Private constructor for singleton\n }\n\n /**\n * Get the singleton instance.\n */\n static get instance(): SubscriberRegistry {\n if (!SubscriberRegistry._instance) {\n SubscriberRegistry._instance = new SubscriberRegistry();\n }\n return SubscriberRegistry._instance;\n }\n\n /**\n * Register a subscriber class.\n *\n * The class will be instantiated when startAll() is called.\n *\n * @param subscriberClass - A subclass of BaseSubscriber\n */\n register(subscriberClass: SubscriberClass): void {\n this.logger.info(\n { subscriberClass: subscriberClass.name },\n 'SubscriberRegistry: Registered subscriber class'\n );\n this.subscriberClasses.push(subscriberClass);\n }\n\n /**\n * Register a subscriber instance directly.\n *\n * Use this when your subscriber needs custom initialization.\n *\n * @param subscriber - A subscriber instance\n */\n registerInstance(subscriber: BaseSubscriber): void {\n this.logger.info(\n { subscriberClass: subscriber.constructor.name },\n 'SubscriberRegistry: Registered subscriber instance'\n );\n this.subscribers.push(subscriber);\n }\n\n /**\n * Start all registered subscribers.\n *\n * @param poller - The event poller to register subscribers with\n */\n startAll(poller: InProcessDomainEventPoller): void {\n if (this.started) {\n return;\n }\n\n // Instantiate registered classes\n for (const SubscriberClass of this.subscriberClasses) {\n try {\n const instance = new SubscriberClass();\n this.subscribers.push(instance);\n } catch (error) {\n this.logger.error(\n { subscriberClass: SubscriberClass.name, error: String(error) },\n 'Failed to instantiate subscriber'\n );\n }\n }\n\n // Start all subscribers\n for (const subscriber of this.subscribers) {\n try {\n subscriber.start(poller);\n } catch (error) {\n this.logger.error(\n { subscriberClass: subscriber.constructor.name, error: String(error) },\n 'Failed to start subscriber'\n );\n }\n }\n\n this.started = true;\n this.logger.info(\n { subscriberCount: this.subscribers.length },\n 'SubscriberRegistry: Started all subscribers'\n );\n }\n\n /**\n * Stop all subscribers.\n */\n stopAll(): void {\n if (!this.started) {\n return;\n }\n\n for (const subscriber of this.subscribers) {\n try {\n subscriber.stop();\n } catch (error) {\n this.logger.error(\n { subscriberClass: subscriber.constructor.name, error: String(error) },\n 'Failed to stop subscriber'\n );\n }\n }\n\n this.started = false;\n this.logger.info('SubscriberRegistry: Stopped all subscribers');\n }\n\n /**\n * Check if subscribers have been started.\n */\n get isStarted(): boolean {\n return this.started;\n }\n\n /**\n * Get count of registered subscribers (classes + instances).\n */\n get count(): number {\n return this.subscriberClasses.length + this.subscribers.length;\n }\n\n /**\n * Get subscriber statistics.\n */\n get stats(): SubscriberStats {\n return {\n started: this.started,\n subscriberCount: this.subscribers.length,\n activeCount: this.subscribers.filter((s) => s.active).length,\n subscribers: this.subscribers.map((s) => ({\n className: s.constructor.name,\n active: s.active,\n patterns: (s.constructor as typeof BaseSubscriber).subscribesTo(),\n })),\n };\n }\n\n /**\n * Reset the registry (for testing).\n */\n reset(): void {\n this.stopAll();\n this.subscribers.length = 0;\n this.subscriberClasses.length = 0;\n this.started = false;\n this.logger.info('SubscriberRegistry: Reset');\n }\n}\n\n// ---------------------------------------------------------------------------\n// InProcessDomainEventPoller\n// ---------------------------------------------------------------------------\n\n/**\n * Callback type for domain event handlers.\n */\nexport type DomainEventCallback = (event: DomainEvent) => void | Promise<void>;\n\n/**\n * Error callback type for domain event processing.\n */\nexport type DomainEventErrorCallback = (error: Error) => void;\n\n/**\n * Poller statistics.\n */\nexport interface PollerStats {\n /** Total poll cycles */\n readonly pollCount: number;\n\n /** Total events processed */\n readonly eventsProcessed: number;\n\n /** Events that lagged (couldn't keep up) */\n readonly eventsLagged: number;\n\n /** Whether the poller is running */\n readonly running: boolean;\n}\n\n/**\n * Poller configuration.\n */\nexport interface DomainEventPollerConfig {\n /** Polling interval in milliseconds (default: 10) */\n readonly pollIntervalMs?: number;\n\n /** Maximum events per poll cycle (default: 100) */\n readonly maxEventsPerPoll?: number;\n}\n\n/**\n * In-process domain event poller.\n *\n * Polls for fast domain events from the Rust broadcast channel and\n * dispatches them to registered subscribers.\n *\n * Threading Model:\n * - Main Thread: TypeScript application, event handlers\n * - Poll Loop: Async timer-based polling\n * - Rust: Rust worker runtime (separate from TypeScript)\n *\n * @example\n * ```typescript\n * const poller = new InProcessDomainEventPoller({\n * pollIntervalMs: 10,\n * maxEventsPerPoll: 100,\n * });\n *\n * // Subscribe to patterns\n * poller.subscribe('payment.*', (event) => {\n * console.log('Payment event:', event.eventName);\n * });\n *\n * // Start polling\n * poller.start();\n *\n * // Stop when done\n * poller.stop();\n * ```\n */\nexport class InProcessDomainEventPoller {\n private readonly pollIntervalMs: number;\n private readonly maxEventsPerPoll: number;\n private running = false;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly logger: Logger = log;\n\n // Callbacks\n private readonly subscriptions = new Map<string, DomainEventCallback[]>();\n private readonly errorCallbacks: DomainEventErrorCallback[] = [];\n\n // Stats\n private pollCount = 0;\n private eventsProcessed = 0;\n private eventsLagged = 0;\n\n // FFI function reference (set when FFI layer is available)\n private pollFn: (() => DomainEvent | null) | null = null;\n\n constructor(config: DomainEventPollerConfig = {}) {\n this.pollIntervalMs = config.pollIntervalMs ?? 10;\n this.maxEventsPerPoll = config.maxEventsPerPoll ?? 100;\n }\n\n /**\n * Set the FFI poll function.\n *\n * This must be called before start() to enable actual polling.\n * Without it, the poller runs in \"dry\" mode (for testing).\n *\n * @param pollFn - Function that polls for events from Rust\n */\n setPollFunction(pollFn: () => DomainEvent | null): void {\n this.pollFn = pollFn;\n }\n\n /**\n * Subscribe to events matching a pattern.\n *\n * @param pattern - Event pattern (e.g., \"*\", \"payment.*\")\n * @param callback - Function to call when events match\n */\n subscribe(pattern: string, callback: DomainEventCallback): void {\n const callbacks = this.subscriptions.get(pattern) ?? [];\n callbacks.push(callback);\n this.subscriptions.set(pattern, callbacks);\n\n this.logger.debug({ pattern }, 'Subscribed to pattern');\n }\n\n /**\n * Unsubscribe from a pattern.\n *\n * @param pattern - The pattern to unsubscribe from\n */\n unsubscribe(pattern: string): void {\n this.subscriptions.delete(pattern);\n this.logger.debug({ pattern }, 'Unsubscribed from pattern');\n }\n\n /**\n * Register an error callback.\n */\n onError(callback: DomainEventErrorCallback): void {\n this.errorCallbacks.push(callback);\n }\n\n /**\n * Start the polling loop.\n */\n start(): void {\n if (this.running) {\n this.logger.warn('InProcessDomainEventPoller already running');\n return;\n }\n\n this.running = true;\n this.logger.info({ pollIntervalMs: this.pollIntervalMs }, 'InProcessDomainEventPoller started');\n\n this.schedulePoll();\n }\n\n /**\n * Stop the polling loop.\n */\n stop(): void {\n if (!this.running) {\n return;\n }\n\n this.running = false;\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n this.logger.info(\n { eventsProcessed: this.eventsProcessed, eventsLagged: this.eventsLagged },\n 'InProcessDomainEventPoller stopped'\n );\n }\n\n /**\n * Check if the poller is running.\n */\n get isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get poller statistics.\n */\n get stats(): PollerStats {\n return {\n pollCount: this.pollCount,\n eventsProcessed: this.eventsProcessed,\n eventsLagged: this.eventsLagged,\n running: this.running,\n };\n }\n\n /**\n * Schedule the next poll cycle.\n */\n private schedulePoll(): void {\n if (!this.running) {\n return;\n }\n\n this.pollTimer = setTimeout(() => {\n this.pollCycle().catch((error) => {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n });\n }, this.pollIntervalMs);\n }\n\n /**\n * Execute a poll cycle.\n */\n private async pollCycle(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n this.pollCount++;\n let eventsThisCycle = 0;\n\n try {\n // Poll for events (up to max per cycle)\n while (eventsThisCycle < this.maxEventsPerPoll) {\n const event = this.pollFn?.();\n\n if (!event) {\n break; // No more events\n }\n\n await this.dispatchEvent(event);\n eventsThisCycle++;\n this.eventsProcessed++;\n }\n\n // Check for lag (if we hit max, there might be more)\n if (eventsThisCycle >= this.maxEventsPerPoll) {\n this.eventsLagged++;\n this.logger.warn(\n { maxEventsPerPoll: this.maxEventsPerPoll },\n 'Event poller may be lagging'\n );\n }\n } catch (error) {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n\n // Schedule next cycle\n this.schedulePoll();\n }\n\n /**\n * Dispatch an event to matching subscribers.\n */\n private async dispatchEvent(event: DomainEvent): Promise<void> {\n this.logger.debug(\n { eventId: event.eventId, eventName: event.eventName },\n 'Dispatching domain event'\n );\n\n for (const [pattern, callbacks] of this.subscriptions) {\n if (this.matchesPattern(event.eventName, pattern)) {\n for (const callback of callbacks) {\n try {\n await callback(event);\n } catch (error) {\n this.logger.error(\n { eventName: event.eventName, pattern, error: String(error) },\n 'Subscriber callback error'\n );\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n }\n }\n }\n\n /**\n * Check if an event name matches a pattern.\n */\n private matchesPattern(eventName: string, pattern: string): boolean {\n if (pattern === '*') {\n return true;\n }\n const regex = new RegExp(`^${pattern.replace(/\\*/g, '.*')}$`);\n return regex.test(eventName);\n }\n\n /**\n * Emit an error to registered callbacks.\n */\n private emitError(error: Error): void {\n for (const callback of this.errorCallbacks) {\n try {\n callback(error);\n } catch {\n // Ignore errors in error callbacks\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory Functions\n// ---------------------------------------------------------------------------\n\n/**\n * Create a StepEventContext from step data.\n *\n * @param data - Raw step context data\n * @returns StepEventContext\n */\nexport function createStepEventContext(data: {\n taskUuid: string;\n stepUuid: string;\n stepName: string;\n namespace?: string;\n correlationId?: string;\n result?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}): StepEventContext {\n const base = {\n taskUuid: data.taskUuid,\n stepUuid: data.stepUuid,\n stepName: data.stepName,\n namespace: data.namespace ?? 'default',\n correlationId: data.correlationId ?? data.taskUuid,\n metadata: data.metadata ?? {},\n };\n\n // Handle optional result property correctly for exactOptionalPropertyTypes\n if (data.result !== undefined) {\n return { ...base, result: data.result };\n }\n\n return base;\n}\n\n/**\n * Create a DomainEvent from raw data.\n *\n * @param data - Raw event data\n * @returns DomainEvent\n */\nexport function createDomainEvent(data: {\n eventId: string;\n eventName: string;\n payload: Record<string, unknown>;\n metadata: Record<string, unknown>;\n executionResult: StepResult;\n}): DomainEvent {\n return {\n eventId: data.eventId,\n eventName: data.eventName,\n payload: data.payload,\n metadata: data.metadata as DomainEventMetadata,\n executionResult: data.executionResult,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FFI Domain Event Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Transform an FfiDomainEvent to a DomainEvent.\n *\n * The FFI domain event has a simpler structure than the full DomainEvent.\n * This function converts between them, synthesizing missing fields.\n *\n * @param ffiEvent - Event from FFI poll_in_process_events\n * @returns DomainEvent suitable for subscribers\n */\nexport function ffiEventToDomainEvent(ffiEvent: FfiDomainEvent): DomainEvent {\n // Build metadata with conditional optional fields (exactOptionalPropertyTypes)\n const metadata: DomainEventMetadata = {\n taskUuid: ffiEvent.metadata.taskUuid,\n stepUuid: ffiEvent.metadata.stepUuid ?? '',\n namespace: ffiEvent.metadata.namespace,\n correlationId: ffiEvent.metadata.correlationId,\n firedAt: ffiEvent.metadata.firedAt,\n eventVersion: ffiEvent.eventVersion,\n // Conditionally spread optional fields\n ...(ffiEvent.metadata.stepName !== null ? { stepName: ffiEvent.metadata.stepName } : {}),\n ...(ffiEvent.metadata.firedBy !== null ? { publisher: ffiEvent.metadata.firedBy } : {}),\n };\n\n return {\n eventId: ffiEvent.eventId,\n eventName: ffiEvent.eventName,\n payload: ffiEvent.payload,\n metadata,\n // FFI events don't include execution result - synthesize a placeholder\n executionResult: {\n success: true,\n result: ffiEvent.payload,\n },\n };\n}\n\n/**\n * Create an FFI poll function adapter for InProcessDomainEventPoller.\n *\n * This function wraps the runtime's pollInProcessEvents() to return\n * DomainEvent objects that the poller expects.\n *\n * @param runtime - The FFI runtime instance\n * @returns A poll function that returns DomainEvent | null\n *\n * @example\n * ```typescript\n * const poller = new InProcessDomainEventPoller();\n * poller.setPollFunction(createFfiPollAdapter(runtime));\n * poller.start();\n * ```\n */\nexport function createFfiPollAdapter(module: NapiModule): () => DomainEvent | null {\n return () => {\n const ffiEvent = module.pollInProcessEvents();\n if (ffiEvent === null) {\n return null;\n }\n return ffiEventToDomainEvent(ffiEvent);\n };\n}\n","/**\n * TAS-93: Error types for resolver chain.\n */\n\n/**\n * Base error class for resolution errors.\n */\nexport class ResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ResolutionError';\n }\n}\n\n/**\n * Error thrown when a specified resolver is not found.\n */\nexport class ResolverNotFoundError extends ResolutionError {\n readonly resolverName: string;\n\n constructor(resolverName: string) {\n super(`Resolver not found: '${resolverName}'`);\n this.name = 'ResolverNotFoundError';\n this.resolverName = resolverName;\n }\n}\n\n/**\n * Error thrown when no resolver can handle a callable.\n */\nexport class NoResolverMatchError extends ResolutionError {\n readonly callable: string;\n readonly triedResolvers: string[];\n\n constructor(callable: string, triedResolvers: string[]) {\n const tried = triedResolvers.length > 0 ? triedResolvers.join(', ') : 'none';\n super(`No resolver could resolve callable '${callable}'. Tried: ${tried}`);\n this.name = 'NoResolverMatchError';\n this.callable = callable;\n this.triedResolvers = triedResolvers;\n }\n}\n\n/**\n * Error thrown when method dispatch fails.\n */\nexport class MethodDispatchError extends ResolutionError {\n readonly handlerName: string;\n readonly methodName: string;\n\n constructor(handlerName: string, methodName: string) {\n super(`Handler '${handlerName}' does not have method '${methodName}'`);\n this.name = 'MethodDispatchError';\n this.handlerName = handlerName;\n this.methodName = methodName;\n }\n}\n","/**\n * TAS-93: Handler definition type for resolver chain.\n *\n * Represents the configuration for a step handler, including:\n * - callable: The handler address/identifier\n * - method: Optional method to invoke (defaults to \"call\")\n * - resolver: Optional resolver hint to bypass chain\n * - initialization: Optional configuration passed to handler\n *\n * @example\n * ```typescript\n * const definition: HandlerDefinition = {\n * callable: 'payment_handler',\n * method: 'refund',\n * resolver: 'explicit_mapping',\n * initialization: { apiKey: 'secret' },\n * };\n *\n * // Check if method dispatch is needed\n * if (usesMethodDispatch(definition)) {\n * // Wrap handler for method dispatch\n * }\n * ```\n */\n\n/**\n * Handler definition DTO from napi-rs (flattened from step definition).\n *\n * TAS-290: With napi-rs, handler fields are flattened into NapiStepDefinition\n * (handlerCallable, handlerMethod, handlerResolver, handlerInitialization).\n * This interface provides a compatible shape for fromDto().\n */\nexport interface HandlerDefinitionDto {\n callable?: string;\n method?: string | null;\n resolver?: string | null;\n initialization?: Record<string, unknown>;\n}\n\n/**\n * Handler definition with resolution metadata.\n */\nexport interface HandlerDefinition {\n /** The handler address/identifier (required) */\n callable: string;\n\n /** Method to invoke on the handler (defaults to \"call\") */\n method?: string | null;\n\n /** Resolver hint to bypass chain resolution */\n resolver?: string | null;\n\n /** Initialization configuration passed to handler */\n initialization?: Record<string, unknown>;\n}\n\n/**\n * Get the effective method to invoke.\n *\n * @param definition - Handler definition\n * @returns The method name (defaults to \"call\")\n */\nexport function effectiveMethod(definition: HandlerDefinition): string {\n // Handle null, undefined, and empty string\n if (!definition.method || definition.method.length === 0) {\n return 'call';\n }\n return definition.method;\n}\n\n/**\n * Check if method dispatch is needed.\n *\n * Returns true if a non-default method is specified.\n *\n * @param definition - Handler definition\n * @returns True if method dispatch wrapper is needed\n */\nexport function usesMethodDispatch(definition: HandlerDefinition): boolean {\n // Handle null, undefined, empty string, and 'call'\n if (!definition.method || definition.method.length === 0) {\n return false;\n }\n return definition.method !== 'call';\n}\n\n/**\n * Check if a resolver hint is provided.\n *\n * @param definition - Handler definition\n * @returns True if resolver hint should be used\n */\nexport function hasResolverHint(definition: HandlerDefinition): boolean {\n return definition.resolver != null && definition.resolver.length > 0;\n}\n\n/**\n * Create a HandlerDefinition from a callable string.\n *\n * @param callable - Handler callable string\n * @returns HandlerDefinition with defaults\n */\nexport function fromCallable(callable: string): HandlerDefinition {\n return {\n callable,\n method: null,\n resolver: null,\n initialization: {},\n };\n}\n\n/**\n * Create a HandlerDefinition from FFI DTO.\n *\n * Maps Rust field names to TypeScript:\n * - Rust uses 'method' field (matches our interface)\n *\n * @param dto - FFI handler definition DTO\n * @returns HandlerDefinition\n */\nexport function fromDto(dto: HandlerDefinitionDto | null | undefined): HandlerDefinition {\n if (!dto) {\n return {\n callable: '',\n method: null,\n resolver: null,\n initialization: {},\n };\n }\n\n // FFI DTO may have method and resolver fields\n const dtoRecord = dto as Record<string, unknown>;\n const method = dtoRecord.method as string | null | undefined;\n const resolver = dtoRecord.resolver as string | null | undefined;\n\n return {\n callable: dto.callable ?? '',\n // Convert undefined to null for exactOptionalPropertyTypes compatibility\n method: method ?? null,\n resolver: resolver ?? null,\n initialization: dto.initialization ?? {},\n };\n}\n\n/**\n * Type alias for handler specification input.\n *\n * Accepts:\n * - string: Simple callable name\n * - HandlerDefinition: Full definition with method/resolver\n * - HandlerDefinitionDto: FFI DTO from Rust\n */\nexport type HandlerSpec = string | HandlerDefinition | HandlerDefinitionDto;\n\n/**\n * Normalize any handler spec to HandlerDefinition.\n *\n * @param spec - Handler specification (string, definition, or DTO)\n * @returns Normalized HandlerDefinition\n */\nexport function normalizeToDefinition(spec: HandlerSpec): HandlerDefinition {\n if (typeof spec === 'string') {\n return fromCallable(spec);\n }\n\n // Check if it's already a HandlerDefinition (has method/resolver properties)\n if ('method' in spec || 'resolver' in spec) {\n return spec as HandlerDefinition;\n }\n\n // Assume it's a DTO\n return fromDto(spec as HandlerDefinitionDto);\n}\n","/**\n * TAS-93: Method dispatch wrapper for step handlers.\n *\n * Wraps a handler to redirect .call() invocations to a specified method.\n * This enables the `handler_method` field to work transparently.\n *\n * @example\n * ```typescript\n * class PaymentHandler extends StepHandler {\n * static handlerName = 'payment_handler';\n *\n * async call(context: StepContext): Promise<StepHandlerResult> {\n * return this.success({ action: 'default' });\n * }\n *\n * async refund(context: StepContext): Promise<StepHandlerResult> {\n * return this.success({ action: 'refund' });\n * }\n * }\n *\n * // Without wrapper: handler.call(ctx) returns { action: 'default' }\n * // With wrapper:\n * const wrapped = new MethodDispatchWrapper(handler, 'refund');\n * await wrapped.call(ctx); // returns { action: 'refund' }\n * ```\n */\n\nimport type { ExecutableHandler, StepHandler } from '../handler/base.js';\nimport type { StepContext } from '../types/step-context.js';\nimport type { StepHandlerResult } from '../types/step-handler-result.js';\nimport { MethodDispatchError } from './errors.js';\n\n/**\n * Wrapper that redirects .call() to a specified method.\n *\n * Implements ExecutableHandler to be type-safe when used in place of\n * a regular StepHandler. This avoids unsafe type casting while providing\n * the same public interface.\n */\nexport class MethodDispatchWrapper implements ExecutableHandler {\n /** The wrapped handler instance */\n readonly handler: StepHandler;\n\n /** The method to invoke instead of call() */\n readonly targetMethod: string;\n\n /** The bound method function */\n private readonly boundMethod: (context: StepContext) => Promise<StepHandlerResult>;\n\n /**\n * Create a new method dispatch wrapper.\n *\n * @param handler - The handler to wrap\n * @param targetMethod - The method name to invoke\n * @throws MethodDispatchError if handler doesn't have the method\n */\n constructor(handler: StepHandler, targetMethod: string) {\n this.handler = handler;\n this.targetMethod = targetMethod;\n\n // Validate method exists on handler\n const method = (handler as unknown as Record<string, unknown>)[targetMethod];\n if (typeof method !== 'function') {\n throw new MethodDispatchError(handler.name, targetMethod);\n }\n\n // Bind the method to the handler\n this.boundMethod = method.bind(handler) as (context: StepContext) => Promise<StepHandlerResult>;\n }\n\n /**\n * Get the handler name.\n * Delegates to wrapped handler.\n */\n get name(): string {\n return this.handler.name;\n }\n\n /**\n * Get the handler version.\n * Delegates to wrapped handler.\n */\n get version(): string {\n return this.handler.version;\n }\n\n /**\n * Get the handler capabilities.\n * Delegates to wrapped handler.\n */\n get capabilities(): string[] {\n return this.handler.capabilities;\n }\n\n /**\n * Execute the step by calling the target method.\n *\n * @param context - Step execution context\n * @returns Handler result from the target method\n */\n async call(context: StepContext): Promise<StepHandlerResult> {\n return this.boundMethod(context);\n }\n\n /**\n * Get config schema from wrapped handler.\n */\n configSchema(): Record<string, unknown> | null {\n return this.handler.configSchema();\n }\n\n /**\n * Get the unwrapped handler.\n *\n * Useful for testing and debugging.\n *\n * @returns The original handler instance\n */\n unwrap(): StepHandler {\n return this.handler;\n }\n\n /**\n * String representation for debugging.\n */\n toString(): string {\n return `MethodDispatchWrapper(handler=${this.handler.name}, method=${this.targetMethod})`;\n }\n}\n","/**\n * TAS-93: Developer-friendly base class for custom resolvers.\n *\n * Provides pattern and prefix matching capabilities for implementing\n * custom domain-specific resolvers.\n *\n * @example\n * ```typescript\n * class PaymentResolver extends RegistryResolver {\n * static readonly _name = 'payment_resolver';\n * static readonly _priority = 20;\n * static readonly pattern = /^payments:(?<provider>\\w+):(?<action>\\w+)$/;\n *\n * async resolveHandler(\n * definition: HandlerDefinition,\n * match: RegExpMatchArray | null\n * ): Promise<StepHandler | null> {\n * if (!match?.groups) return null;\n *\n * const { provider, action } = match.groups;\n * return PaymentHandlers.get(provider, action);\n * }\n * }\n *\n * // Register with chain\n * chain.addResolver(new PaymentResolver());\n *\n * // Resolves: { callable: 'payments:stripe:refund' }\n * ```\n */\n\nimport type { StepHandler } from '../handler/base.js';\nimport type { BaseResolver, ResolverConfig } from './base-resolver.js';\nimport type { HandlerDefinition } from './handler-definition.js';\n\n/**\n * Static configuration for RegistryResolver subclasses.\n */\nexport interface RegistryResolverStatic {\n /** Resolver name (required) */\n readonly _name: string;\n\n /** Priority in chain (default: 50) */\n readonly _priority?: number;\n\n /** Regex pattern to match callables (optional) */\n readonly pattern?: RegExp;\n\n /** String prefix to match callables (optional) */\n readonly prefix?: string;\n}\n\n/**\n * Developer-friendly base class for custom resolvers.\n *\n * Subclasses should:\n * 1. Set static `_name` and optionally `_priority`\n * 2. Set static `pattern` or `prefix` for matching\n * 3. Implement `resolveHandler()` for resolution logic\n */\nexport abstract class RegistryResolver implements BaseResolver {\n /**\n * Get the resolver name from static property.\n */\n get name(): string {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n return ctor._name ?? 'custom_resolver';\n }\n\n /**\n * Get the resolver priority from static property.\n */\n get priority(): number {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n return ctor._priority ?? 50;\n }\n\n /**\n * Check if this resolver can handle the definition.\n *\n * Uses pattern or prefix matching from static properties.\n *\n * @param definition - Handler definition\n * @param _config - Unused, part of interface\n * @returns True if callable matches\n */\n canResolve(definition: HandlerDefinition, _config?: ResolverConfig): boolean {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n const callable = definition.callable;\n\n if (ctor.pattern) {\n return ctor.pattern.test(callable);\n }\n\n if (ctor.prefix) {\n return callable.startsWith(ctor.prefix);\n }\n\n return false;\n }\n\n /**\n * Resolve the handler.\n *\n * Delegates to resolveHandler() with pattern match if applicable.\n *\n * @param definition - Handler definition\n * @param config - Resolver configuration\n * @returns Handler instance or null\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n const ctor = this.constructor as unknown as RegistryResolverStatic;\n const match = ctor.pattern ? definition.callable.match(ctor.pattern) : null;\n\n return this.resolveHandler(definition, match, config);\n }\n\n /**\n * Override this in subclasses for custom resolution logic.\n *\n * @param definition - Handler definition\n * @param match - Regex match result (if pattern was used)\n * @param config - Resolver configuration\n * @returns Handler instance or null\n */\n abstract resolveHandler(\n definition: HandlerDefinition,\n match: RegExpMatchArray | null,\n config?: ResolverConfig\n ): Promise<StepHandler | null>;\n}\n","/**\n * TAS-93: Resolver chain for step handler resolution.\n *\n * Orchestrates multiple resolvers in priority order to find handlers.\n * Supports resolver hints to bypass the chain and method dispatch wrapping.\n *\n * @example\n * ```typescript\n * // Create chain with default resolvers\n * const chain = ResolverChain.default();\n *\n * // Register a handler\n * const explicit = chain.getResolver('explicit_mapping') as ExplicitMappingResolver;\n * explicit.register('my_handler', MyHandler);\n *\n * // Resolve handler\n * const definition: HandlerDefinition = { callable: 'my_handler' };\n * const handler = await chain.resolve(definition);\n *\n * // Resolve with method dispatch\n * const definition2: HandlerDefinition = {\n * callable: 'my_handler',\n * method: 'process',\n * };\n * const handler2 = await chain.resolve(definition2);\n * // handler2.call() will invoke handler.process()\n * ```\n */\n\nimport type { ExecutableHandler, StepHandler } from '../handler/base.js';\nimport { createLogger } from '../logging/index.js';\nimport type { BaseResolver, ResolverConfig } from './base-resolver.js';\nimport { ResolverNotFoundError } from './errors.js';\nimport {\n effectiveMethod,\n type HandlerDefinition,\n hasResolverHint,\n usesMethodDispatch,\n} from './handler-definition.js';\nimport { MethodDispatchWrapper } from './method-dispatch-wrapper.js';\n\nconst log = createLogger({ component: 'resolver-chain' });\n\n// Lazy imports to avoid circular dependencies - uses Promise caching for thread safety\nlet defaultChainPromise: Promise<ResolverChain> | null = null;\n\n/**\n * Priority-ordered chain of resolvers for handler resolution.\n */\nexport class ResolverChain {\n private resolvers: BaseResolver[] = [];\n private resolversByName: Map<string, BaseResolver> = new Map();\n\n /**\n * Create a resolver chain with default resolvers.\n *\n * Default resolvers:\n * - ExplicitMappingResolver (priority 10)\n * - ClassLookupResolver (priority 100)\n *\n * Note: Uses Promise caching to prevent race conditions when called\n * concurrently. Multiple callers will receive the same chain instance.\n *\n * @returns Configured resolver chain\n */\n static default(): Promise<ResolverChain> {\n // Use Promise caching to prevent race conditions on concurrent calls\n if (!defaultChainPromise) {\n defaultChainPromise = ResolverChain.createDefaultChain();\n }\n return defaultChainPromise;\n }\n\n /**\n * Reset the default chain (for testing only).\n *\n * @internal\n */\n static resetDefault(): void {\n defaultChainPromise = null;\n }\n\n /**\n * Internal method to create the default chain.\n */\n private static async createDefaultChain(): Promise<ResolverChain> {\n const chain = new ResolverChain();\n\n // Lazy load to avoid circular dependencies\n const [explicitMod, classLookupMod] = await Promise.all([\n import('./resolvers/explicit-mapping.js'),\n import('./resolvers/class-lookup.js'),\n ]);\n\n chain.addResolver(new explicitMod.ExplicitMappingResolver());\n chain.addResolver(new classLookupMod.ClassLookupResolver());\n\n return chain;\n }\n\n /**\n * Create a resolver chain synchronously with provided resolvers.\n *\n * Use this when you want to avoid async initialization.\n *\n * @param resolvers - Resolvers to add to the chain\n * @returns Configured resolver chain\n */\n static withResolvers(resolvers: BaseResolver[]): ResolverChain {\n const chain = new ResolverChain();\n for (const resolver of resolvers) {\n chain.addResolver(resolver);\n }\n return chain;\n }\n\n /**\n * Add a resolver to the chain.\n *\n * Resolvers are automatically sorted by priority (lowest first).\n *\n * @param resolver - Resolver to add\n */\n addResolver(resolver: BaseResolver): void {\n this.resolvers.push(resolver);\n this.resolversByName.set(resolver.name, resolver);\n this.sortResolvers();\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined if not found\n */\n getResolver(name: string): BaseResolver | undefined {\n return this.resolversByName.get(name);\n }\n\n /**\n * List all resolvers with their priorities.\n *\n * @returns Array of [name, priority] tuples, sorted by priority\n */\n listResolvers(): Array<[string, number]> {\n return this.resolvers.map((r) => [r.name, r.priority]);\n }\n\n /**\n * Resolve a handler from a definition.\n *\n * Resolution process:\n * 1. If resolver hint is present, use only that resolver\n * 2. Otherwise, try resolvers in priority order\n * 3. If method dispatch is needed, wrap the handler\n *\n * @param definition - Handler definition to resolve\n * @param config - Optional resolver configuration\n * @returns ExecutableHandler instance (possibly wrapped) or null\n */\n async resolve(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<ExecutableHandler | null> {\n let handler: StepHandler | null;\n\n if (hasResolverHint(definition)) {\n handler = await this.resolveWithHint(definition, config);\n } else {\n handler = await this.resolveWithChain(definition, config);\n }\n\n if (!handler) {\n return null;\n }\n\n return this.wrapForMethodDispatch(handler, definition);\n }\n\n /**\n * Wrap a handler for method dispatch if needed.\n *\n * @param handler - Handler to potentially wrap\n * @param definition - Handler definition with method info\n * @returns Original handler or MethodDispatchWrapper (both implement ExecutableHandler)\n */\n wrapForMethodDispatch(handler: StepHandler, definition: HandlerDefinition): ExecutableHandler {\n if (!usesMethodDispatch(definition)) {\n return handler;\n }\n\n const method = effectiveMethod(definition);\n\n // Check if handler has the method\n const handlerWithMethod = handler as unknown as Record<string, unknown>;\n if (typeof handlerWithMethod[method] !== 'function') {\n log.warn(`Handler does not have requested method`, {\n operation: 'wrap_for_method_dispatch',\n handler_name: handler.name,\n method,\n });\n return handler;\n }\n\n // MethodDispatchWrapper implements ExecutableHandler, so no casting needed\n return new MethodDispatchWrapper(handler, method);\n }\n\n /**\n * Resolve using a specific resolver (from hint).\n */\n private async resolveWithHint(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n // Resolver hint is guaranteed to exist when this method is called\n // (checked by hasResolverHint), but we handle the edge case safely\n const resolverName = definition.resolver ?? '';\n const resolver = this.resolversByName.get(resolverName);\n\n if (!resolver) {\n throw new ResolverNotFoundError(resolverName);\n }\n\n return resolver.resolve(definition, config);\n }\n\n /**\n * Resolve by trying resolvers in priority order.\n */\n private async resolveWithChain(\n definition: HandlerDefinition,\n config?: ResolverConfig\n ): Promise<StepHandler | null> {\n for (const resolver of this.resolvers) {\n if (resolver.canResolve(definition, config)) {\n const handler = await resolver.resolve(definition, config);\n if (handler) {\n return handler;\n }\n }\n }\n return null;\n }\n\n /**\n * Sort resolvers by priority (ascending).\n */\n private sortResolvers(): void {\n this.resolvers.sort((a, b) => a.priority - b.priority);\n }\n}\n","/**\n * TAS-93: Built-in resolvers for step handler resolution.\n */\n\nexport { ClassLookupResolver } from './class-lookup.js';\nexport {\n ExplicitMappingResolver,\n type HandlerEntry,\n type HandlerFactory,\n} from './explicit-mapping.js';\n","/**\n * TAS-93: Step handler registry with resolver chain support.\n *\n * Provides handler registration and resolution using a priority-ordered\n * resolver chain. Supports method dispatch and resolver hints.\n *\n * @example\n * ```typescript\n * const registry = new HandlerRegistry();\n * await registry.initialize();\n *\n * // Register a handler\n * registry.register('my_handler', MyHandler);\n *\n * // Simple resolution (string callable)\n * const handler = await registry.resolve('my_handler');\n *\n * // Resolution with method dispatch\n * const definition: HandlerDefinition = {\n * callable: 'my_handler',\n * method: 'process',\n * };\n * const handler2 = await registry.resolve(definition);\n * // handler2.call() invokes handler.process()\n *\n * // Resolution with resolver hint\n * const definition2: HandlerDefinition = {\n * callable: 'my_handler',\n * resolver: 'explicit_mapping',\n * };\n * const handler3 = await registry.resolve(definition2);\n * ```\n */\n\nimport {\n type BaseResolver,\n ExplicitMappingResolver,\n type HandlerDefinition,\n type HandlerSpec,\n normalizeToDefinition,\n ResolverChain,\n} from '../registry/index.js';\nimport type { ExecutableHandler, StepHandler, StepHandlerClass } from './base';\n\n/**\n * Registry for step handler classes.\n *\n * TAS-93: Uses ResolverChain for flexible handler resolution\n * with support for method dispatch and resolver hints.\n *\n * Provides handler discovery, registration, and resolution.\n */\nexport class HandlerRegistry {\n private _resolverChain: ResolverChain | null = null;\n private _explicitResolver: ExplicitMappingResolver | null = null;\n private _initialized = false;\n\n /** Promise-based lock for initialization to prevent concurrent init */\n private _initPromise: Promise<void> | null = null;\n\n /** Track registrations so they can be transferred to chain resolver */\n private _pendingRegistrations: Map<string, StepHandlerClass> = new Map();\n\n /**\n * Initialize the registry with default resolvers.\n *\n * Must be called before using resolve() with resolver chain features.\n * For simple register/resolve with strings, lazy initialization is used.\n */\n async initialize(): Promise<void> {\n if (this._initialized) return;\n\n this._resolverChain = await ResolverChain.default();\n const chainResolver = this._resolverChain.getResolver(\n 'explicit_mapping'\n ) as ExplicitMappingResolver;\n\n // Transfer handlers from standalone resolver (if any) to chain resolver\n if (this._explicitResolver && this._explicitResolver !== chainResolver) {\n for (const name of this._explicitResolver.registeredCallables()) {\n // Re-register from pending registrations (original class reference)\n const handlerClass = this._pendingRegistrations.get(name);\n if (handlerClass) {\n chainResolver.register(name, handlerClass);\n }\n }\n }\n\n // Transfer any handlers registered before initialization\n for (const [name, handlerClass] of this._pendingRegistrations) {\n chainResolver.register(name, handlerClass);\n }\n this._pendingRegistrations.clear();\n\n // Now point to the chain resolver\n this._explicitResolver = chainResolver;\n this._initialized = true;\n }\n\n /**\n * Ensure the registry is initialized.\n * Uses lazy initialization with proper locking to prevent concurrent init.\n */\n private async ensureInitialized(): Promise<void> {\n if (this._initialized) return;\n\n // Use promise-based lock to prevent concurrent initialization\n if (!this._initPromise) {\n this._initPromise = this.initialize();\n }\n await this._initPromise;\n }\n\n /**\n * Get the explicit mapping resolver for direct registration.\n */\n private getExplicitResolver(): ExplicitMappingResolver {\n if (!this._explicitResolver) {\n // Create standalone resolver for pre-initialization use\n this._explicitResolver = new ExplicitMappingResolver();\n }\n return this._explicitResolver;\n }\n\n /**\n * Register a handler class.\n *\n * @param name - Handler name (must match step definition)\n * @param handlerClass - StepHandler subclass\n * @throws Error if handlerClass is not a valid StepHandler subclass\n *\n * @example\n * ```typescript\n * registry.register('my_handler', MyHandler);\n * ```\n */\n register(name: string, handlerClass: StepHandlerClass): void {\n if (!name || typeof name !== 'string') {\n throw new Error('Handler name must be a non-empty string');\n }\n\n if (typeof handlerClass !== 'function') {\n throw new Error(`handlerClass must be a StepHandler subclass, got ${typeof handlerClass}`);\n }\n\n // Track for transfer during initialization\n if (!this._initialized) {\n this._pendingRegistrations.set(name, handlerClass);\n }\n\n const resolver = this.getExplicitResolver();\n resolver.register(name, handlerClass);\n console.info(`[HandlerRegistry] Registered handler: ${name} -> ${handlerClass.name}`);\n }\n\n /**\n * Unregister a handler.\n *\n * @param name - Handler name to unregister\n * @returns True if handler was unregistered, false if not found\n */\n unregister(name: string): boolean {\n // Remove from pending registrations if not initialized\n if (!this._initialized) {\n this._pendingRegistrations.delete(name);\n }\n\n const resolver = this.getExplicitResolver();\n const removed = resolver.unregister(name);\n if (removed) {\n console.debug(`[HandlerRegistry] Unregistered handler: ${name}`);\n }\n return removed;\n }\n\n /**\n * Resolve and instantiate a handler.\n *\n * TAS-93: Accepts flexible input types:\n * - string: Simple callable name\n * - HandlerDefinition: Full definition with method/resolver\n * - HandlerSpec: Union type for all formats\n *\n * @param handlerSpec - Handler specification\n * @returns ExecutableHandler (StepHandler or MethodDispatchWrapper) or null if not found\n *\n * @example\n * ```typescript\n * // String callable\n * const handler = await registry.resolve('my_handler');\n *\n * // With method dispatch\n * const handler2 = await registry.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n * ```\n */\n async resolve(handlerSpec: HandlerSpec): Promise<ExecutableHandler | null> {\n await this.ensureInitialized();\n\n const definition = normalizeToDefinition(handlerSpec);\n\n if (!this._resolverChain) {\n console.warn('[HandlerRegistry] Resolver chain not initialized');\n return null;\n }\n\n const handler = await this._resolverChain.resolve(definition);\n\n if (!handler) {\n console.warn(`[HandlerRegistry] Handler not found: ${definition.callable}`);\n }\n\n return handler;\n }\n\n /**\n * Synchronous resolve for backward compatibility.\n *\n * Note: This only works with explicitly registered handlers.\n * For full resolver chain support, use the async resolve() method.\n *\n * @param name - Handler name to resolve\n * @returns Instantiated handler or null if not found\n */\n resolveSync(name: string): StepHandler | null {\n const resolver = this.getExplicitResolver();\n const definition: HandlerDefinition = { callable: name };\n\n if (!resolver.canResolve(definition)) {\n console.warn(`[HandlerRegistry] Handler not found: ${name}`);\n return null;\n }\n\n // Use Promise.resolve to handle the async resolve, but block on it\n // This is a workaround for backward compatibility\n let result: StepHandler | null = null;\n\n // Try to instantiate directly from the explicit resolver\n const entry = resolver.registeredCallables().includes(name);\n if (entry) {\n // Access internal state - not ideal but needed for sync compat\n resolver\n .resolve(definition)\n .then((h) => {\n result = h;\n })\n .catch(() => {\n result = null;\n });\n }\n\n // For sync compatibility, try direct instantiation\n // This is a best-effort approach\n return result;\n }\n\n /**\n * Get a handler class without instantiation.\n *\n * @param name - Handler name to look up\n * @returns Handler class or undefined if not found\n */\n getHandlerClass(_name: string): StepHandlerClass | undefined {\n // This would require exposing internal state from ExplicitMappingResolver\n // For now, return undefined - users should use resolve()\n console.warn('[HandlerRegistry] getHandlerClass is deprecated, use resolve() instead');\n return undefined;\n }\n\n /**\n * Check if a handler is registered.\n *\n * @param name - Handler name to check\n * @returns True if handler is registered\n */\n isRegistered(name: string): boolean {\n const resolver = this.getExplicitResolver();\n return resolver.registeredCallables().includes(name);\n }\n\n /**\n * List all registered handler names.\n *\n * @returns Array of registered handler names\n */\n listHandlers(): string[] {\n const resolver = this.getExplicitResolver();\n return resolver.registeredCallables();\n }\n\n /**\n * Get the number of registered handlers.\n */\n handlerCount(): number {\n return this.listHandlers().length;\n }\n\n /**\n * Clear all registered handlers.\n */\n clear(): void {\n if (this._explicitResolver) {\n for (const key of this._explicitResolver.registeredCallables()) {\n this._explicitResolver.unregister(key);\n }\n }\n console.debug('[HandlerRegistry] Cleared all handlers from registry');\n }\n\n /**\n * Add a custom resolver to the chain.\n *\n * TAS-93: Allows adding custom domain-specific resolvers.\n *\n * @param resolver - Resolver to add\n */\n async addResolver(resolver: BaseResolver): Promise<void> {\n await this.ensureInitialized();\n this._resolverChain?.addResolver(resolver);\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined\n */\n async getResolver(name: string): Promise<BaseResolver | undefined> {\n await this.ensureInitialized();\n return this._resolverChain?.getResolver(name);\n }\n\n /**\n * List all resolvers with priorities.\n *\n * @returns Array of [name, priority] tuples\n */\n async listResolvers(): Promise<Array<[string, number]>> {\n await this.ensureInitialized();\n return this._resolverChain?.listResolvers() ?? [];\n }\n\n /**\n * Get the underlying resolver chain.\n *\n * Useful for advanced configuration.\n */\n async getResolverChain(): Promise<ResolverChain | null> {\n await this.ensureInitialized();\n return this._resolverChain;\n }\n\n /**\n * Get debug information about the registry.\n */\n debugInfo(): Record<string, unknown> {\n const resolver = this.getExplicitResolver();\n const handlers: Record<string, string> = {};\n\n for (const name of resolver.registeredCallables()) {\n handlers[name] = name; // We don't have class names readily available\n }\n\n return {\n initialized: this._initialized,\n handlerCount: resolver.registeredCallables().length,\n handlers,\n };\n }\n}\n","/**\n * HandlerSystem - Owns handler registration and discovery.\n *\n * TAS-93: Uses HandlerRegistry with resolver chain for flexible handler resolution.\n *\n * This class encapsulates handler management:\n * - Owns a HandlerRegistry instance (no singleton)\n * - Provides handler discovery from directories\n * - Manages handler registration lifecycle\n * - Full resolver chain support via HandlerRegistry\n *\n * Design principles:\n * - Explicit construction: No singleton pattern\n * - Clear ownership: Owns the registry instance\n * - Encapsulated discovery: Handler loading logic contained here\n * - Single registry: Uses HandlerRegistry for all resolution\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createLogger } from '../logging/index.js';\nimport type { BaseResolver, HandlerSpec, ResolverChain } from '../registry/index.js';\nimport type { ExecutableHandler, StepHandlerClass } from './base.js';\nimport { HandlerRegistry } from './registry.js';\n\nconst log = createLogger({ component: 'handler-system' });\n\n/**\n * Configuration for HandlerSystem.\n */\nexport interface HandlerSystemConfig {\n /** Path to directory containing handlers (can also use TYPESCRIPT_HANDLER_PATH env var) */\n handlerPath?: string;\n}\n\n/**\n * Owns handler registration and discovery.\n *\n * TAS-93: Uses HandlerRegistry internally for unified resolution.\n *\n * Unlike using HandlerRegistry directly, this class:\n * - Encapsulates handler discovery from directories\n * - Provides convenience methods for loading handlers\n * - Manages the full handler lifecycle\n *\n * @example\n * ```typescript\n * const handlerSystem = new HandlerSystem();\n *\n * // Register individual handlers\n * handlerSystem.register('my_handler', MyHandler);\n *\n * // Or load from directory\n * await handlerSystem.loadFromPath('./handlers');\n *\n * // Resolve with full resolver chain support\n * const handler = await handlerSystem.resolve('my_handler');\n *\n * // Resolve with method dispatch\n * const handler2 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n * ```\n */\nexport class HandlerSystem {\n private readonly registry: HandlerRegistry;\n\n /**\n * Create a new HandlerSystem.\n */\n constructor() {\n this.registry = new HandlerRegistry();\n }\n\n // ==========================================================================\n // Initialization\n // ==========================================================================\n\n /**\n * Initialize the handler system.\n *\n * Initializes the underlying HandlerRegistry with resolver chain.\n * Call this before using resolve() for best performance.\n */\n async initialize(): Promise<void> {\n await this.registry.initialize();\n log.info('HandlerSystem initialized', { operation: 'initialize' });\n }\n\n /**\n * Check if the system is initialized.\n */\n get initialized(): boolean {\n return this.registry.debugInfo().initialized as boolean;\n }\n\n // ==========================================================================\n // Handler Loading\n // ==========================================================================\n\n /**\n * Load handlers from a directory path.\n *\n * Searches for handler modules in the directory and registers them.\n * Supports both index file exports and directory scanning.\n *\n * @param path - Path to directory containing handlers\n * @returns Number of handlers loaded\n */\n async loadFromPath(path: string): Promise<number> {\n if (!existsSync(path)) {\n log.warn(`Handler path does not exist: ${path}`, { operation: 'load_from_path' });\n return 0;\n }\n\n log.info(`Loading handlers from: ${path}`, { operation: 'load_from_path' });\n\n try {\n // Try to find and import an index file first\n const indexResult = await this.tryImportIndexFile(path);\n if (indexResult.module) {\n return this.registerHandlersFromModule(indexResult.module, indexResult.path);\n }\n\n // Fallback: scan for handler files\n log.debug('No index file found, scanning for handler files...', {\n operation: 'load_from_path',\n });\n return this.scanAndImportHandlers(path);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.error(`Failed to load handlers from path: ${errorMessage}`, {\n operation: 'load_from_path',\n error_message: errorMessage,\n });\n return 0;\n }\n }\n\n /**\n * Load handlers from TYPESCRIPT_HANDLER_PATH environment variable.\n *\n * @returns Number of handlers loaded\n */\n async loadFromEnv(): Promise<number> {\n const handlerPath = process.env.TYPESCRIPT_HANDLER_PATH;\n if (!handlerPath) {\n log.debug('TYPESCRIPT_HANDLER_PATH not set, skipping handler import', {\n operation: 'load_from_env',\n });\n return 0;\n }\n\n return this.loadFromPath(handlerPath);\n }\n\n // ==========================================================================\n // Registration (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Register a handler class.\n *\n * @param name - Handler name (must match step definition)\n * @param handlerClass - StepHandler subclass\n */\n register(name: string, handlerClass: StepHandlerClass): void {\n this.registry.register(name, handlerClass);\n }\n\n /**\n * Unregister a handler.\n *\n * @param name - Handler name to unregister\n * @returns True if handler was unregistered\n */\n unregister(name: string): boolean {\n return this.registry.unregister(name);\n }\n\n // ==========================================================================\n // Resolution (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Resolve and instantiate a handler.\n *\n * TAS-93: Supports full resolver chain with method dispatch and resolver hints.\n *\n * @param handlerSpec - Handler specification (string, definition, or DTO)\n * @returns Instantiated handler or null if not found\n *\n * @example\n * ```typescript\n * // String callable\n * const handler = await handlerSystem.resolve('my_handler');\n *\n * // With method dispatch\n * const handler2 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * method: 'process',\n * });\n *\n * // With resolver hint\n * const handler3 = await handlerSystem.resolve({\n * callable: 'my_handler',\n * resolver: 'explicit_mapping',\n * });\n * ```\n */\n async resolve(handlerSpec: HandlerSpec): Promise<ExecutableHandler | null> {\n return this.registry.resolve(handlerSpec);\n }\n\n /**\n * Check if a handler is registered.\n */\n isRegistered(name: string): boolean {\n return this.registry.isRegistered(name);\n }\n\n /**\n * List all registered handler names.\n */\n listHandlers(): string[] {\n return this.registry.listHandlers();\n }\n\n /**\n * Get the number of registered handlers.\n */\n handlerCount(): number {\n return this.registry.handlerCount();\n }\n\n /**\n * Clear all registered handlers.\n */\n clear(): void {\n this.registry.clear();\n }\n\n // ==========================================================================\n // Resolver Chain Access (delegates to HandlerRegistry)\n // ==========================================================================\n\n /**\n * Add a custom resolver to the chain.\n *\n * TAS-93: Allows adding custom domain-specific resolvers.\n *\n * @param resolver - Resolver to add\n */\n async addResolver(resolver: BaseResolver): Promise<void> {\n await this.registry.addResolver(resolver);\n log.info(`Added custom resolver: ${resolver.name}`, { operation: 'add_resolver' });\n }\n\n /**\n * Get a resolver by name.\n *\n * @param name - Resolver name\n * @returns Resolver or undefined\n */\n async getResolver(name: string): Promise<BaseResolver | undefined> {\n return this.registry.getResolver(name);\n }\n\n /**\n * List all resolvers with priorities.\n *\n * @returns Array of [name, priority] tuples\n */\n async listResolvers(): Promise<Array<[string, number]>> {\n return this.registry.listResolvers();\n }\n\n /**\n * Get the underlying resolver chain.\n *\n * Useful for advanced configuration.\n */\n async getResolverChain(): Promise<ResolverChain | null> {\n return this.registry.getResolverChain();\n }\n\n // ==========================================================================\n // Registry Access\n // ==========================================================================\n\n /**\n * Get the underlying HandlerRegistry.\n *\n * TAS-93: Returns the HandlerRegistry directly for use with\n * StepExecutionSubscriber and other components.\n */\n getRegistry(): HandlerRegistry {\n return this.registry;\n }\n\n /**\n * Get debug information about the handler system.\n */\n debugInfo(): Record<string, unknown> {\n return {\n ...this.registry.debugInfo(),\n component: 'HandlerSystem',\n };\n }\n\n // ==========================================================================\n // Private Methods - Handler Discovery\n // ==========================================================================\n\n /**\n * Try to import an index file from the handler path.\n */\n private async tryImportIndexFile(\n handlerPath: string\n ): Promise<{ module: Record<string, unknown> | null; path: string | null }> {\n const indexPaths = [\n join(handlerPath, 'examples', 'index.js'),\n join(handlerPath, 'examples', 'index.ts'),\n join(handlerPath, 'index.js'),\n join(handlerPath, 'index.ts'),\n ];\n\n for (const indexPath of indexPaths) {\n if (existsSync(indexPath)) {\n const module = (await import(`file://${indexPath}`)) as Record<string, unknown>;\n return { module, path: indexPath };\n }\n }\n\n return { module: null, path: null };\n }\n\n /**\n * Register handlers from a module's exports.\n */\n private registerHandlersFromModule(\n module: Record<string, unknown>,\n importPath: string | null\n ): number {\n log.info(`Loaded handler module from: ${importPath}`, { operation: 'import_handlers' });\n\n // Check for ALL_EXAMPLE_HANDLERS array (preferred pattern)\n if (Array.isArray(module.ALL_EXAMPLE_HANDLERS)) {\n return this.registerFromHandlerArray(module.ALL_EXAMPLE_HANDLERS);\n }\n\n // Fallback: scan module exports for handler classes\n return this.registerFromModuleExports(module);\n }\n\n /**\n * Register handlers from ALL_EXAMPLE_HANDLERS array.\n */\n private registerFromHandlerArray(handlers: unknown[]): number {\n let count = 0;\n for (const handlerClass of handlers) {\n if (this.isValidHandlerClass(handlerClass)) {\n this.registry.register(handlerClass.handlerName, handlerClass);\n count++;\n }\n }\n log.info(`Registered ${count} handlers from ALL_EXAMPLE_HANDLERS`, {\n operation: 'import_handlers',\n });\n return count;\n }\n\n /**\n * Register handlers from module exports.\n */\n private registerFromModuleExports(module: Record<string, unknown>): number {\n let count = 0;\n for (const [exportName, exported] of Object.entries(module)) {\n if (this.isValidHandlerClass(exported)) {\n this.registry.register(exported.handlerName, exported);\n count++;\n log.debug(`Registered handler from export: ${exportName}`, {\n operation: 'import_handlers',\n });\n }\n }\n log.info(`Registered ${count} handlers from module exports`, {\n operation: 'import_handlers',\n });\n return count;\n }\n\n /**\n * Check if a value is a valid handler class.\n */\n private isValidHandlerClass(value: unknown): value is StepHandlerClass {\n return (\n value !== null &&\n typeof value === 'function' &&\n 'handlerName' in value &&\n typeof (value as StepHandlerClass).handlerName === 'string'\n );\n }\n\n /**\n * Recursively scan a directory for handler files and import them.\n */\n private async scanAndImportHandlers(dirPath: string): Promise<number> {\n let count = 0;\n\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n count += await this.processDirectoryEntry(entry, fullPath);\n }\n } catch (error) {\n log.debug(`Could not scan ${dirPath}: ${error}`, { operation: 'import_handlers' });\n }\n\n return count;\n }\n\n /**\n * Process a single directory entry for handler import.\n */\n private async processDirectoryEntry(\n entry: { isDirectory(): boolean; isFile(): boolean; name: string },\n fullPath: string\n ): Promise<number> {\n if (this.shouldScanDirectory(entry)) {\n return this.scanAndImportHandlers(fullPath);\n }\n\n if (this.isHandlerFile(entry)) {\n return this.importHandlerFile(fullPath);\n }\n\n return 0;\n }\n\n /**\n * Check if a directory should be scanned for handlers.\n */\n private shouldScanDirectory(entry: { isDirectory(): boolean; name: string }): boolean {\n return entry.isDirectory() && !entry.name.startsWith('_') && entry.name !== 'node_modules';\n }\n\n /**\n * Check if a file might contain handlers.\n */\n private isHandlerFile(entry: { isFile(): boolean; name: string }): boolean {\n const name = entry.name;\n return (\n entry.isFile() &&\n (name.endsWith('.ts') || name.endsWith('.js')) &&\n !name.startsWith('_') &&\n !name.endsWith('.d.ts') &&\n !name.endsWith('.test.ts') &&\n !name.endsWith('.spec.ts')\n );\n }\n\n /**\n * Import handlers from a single file.\n */\n private async importHandlerFile(fullPath: string): Promise<number> {\n let count = 0;\n\n try {\n const module = (await import(`file://${fullPath}`)) as Record<string, unknown>;\n\n for (const [, exported] of Object.entries(module)) {\n if (this.isValidHandlerClass(exported)) {\n this.registry.register(exported.handlerName, exported);\n count++;\n }\n }\n } catch (importError) {\n log.debug(`Could not import ${fullPath}: ${importError}`, { operation: 'import_handlers' });\n }\n\n return count;\n }\n}\n","/**\n * Shutdown controller for coordinating graceful shutdown.\n *\n * Provides a signal-based mechanism for triggering and awaiting\n * shutdown across async boundaries.\n */\n\nimport { createLogger } from '../logging/index.js';\n\nconst log = createLogger({ component: 'shutdown' });\n\n/**\n * Shutdown signal handler type.\n */\nexport type ShutdownHandler = () => void | Promise<void>;\n\n/**\n * Controller for coordinating graceful shutdown.\n *\n * Provides a promise-based mechanism for waiting on shutdown signals\n * and executing cleanup handlers in order.\n *\n * @example\n * ```typescript\n * const shutdown = new ShutdownController();\n *\n * process.on('SIGTERM', () => shutdown.trigger('SIGTERM'));\n * process.on('SIGINT', () => shutdown.trigger('SIGINT'));\n *\n * // Wait for shutdown signal\n * await shutdown.promise;\n *\n * // Or check if shutdown was requested\n * if (shutdown.isRequested) {\n * await cleanup();\n * }\n * ```\n */\nexport class ShutdownController {\n private _shutdownRequested = false;\n private _resolver: (() => void) | null = null;\n private _signal: string | null = null;\n private readonly _handlers: ShutdownHandler[] = [];\n\n /**\n * Promise that resolves when shutdown is triggered.\n */\n readonly promise: Promise<void>;\n\n constructor() {\n this.promise = new Promise<void>((resolve) => {\n this._resolver = resolve;\n });\n }\n\n /**\n * Check if shutdown has been requested.\n */\n get isRequested(): boolean {\n return this._shutdownRequested;\n }\n\n /**\n * Get the signal that triggered shutdown, if any.\n */\n get signal(): string | null {\n return this._signal;\n }\n\n /**\n * Register a handler to be called during shutdown.\n *\n * Handlers are called in registration order.\n */\n onShutdown(handler: ShutdownHandler): void {\n this._handlers.push(handler);\n }\n\n /**\n * Trigger shutdown with the given signal.\n *\n * @param signal - The signal that triggered shutdown (e.g., 'SIGTERM', 'SIGINT')\n */\n trigger(signal: string): void {\n if (this._shutdownRequested) {\n log.warn(`Shutdown already requested, ignoring ${signal}`, {\n operation: 'shutdown',\n signal,\n original_signal: this._signal ?? 'unknown',\n });\n return;\n }\n\n log.info(`Received ${signal} signal, initiating shutdown...`, {\n operation: 'shutdown',\n signal,\n });\n\n this._shutdownRequested = true;\n this._signal = signal;\n this._resolver?.();\n }\n\n /**\n * Execute all registered shutdown handlers.\n *\n * Handlers are called in registration order. Errors are logged\n * but do not prevent subsequent handlers from running.\n */\n async executeHandlers(): Promise<void> {\n for (const handler of this._handlers) {\n try {\n await handler();\n } catch (error) {\n log.error(\n `Shutdown handler failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n operation: 'shutdown',\n error_message: error instanceof Error ? error.message : String(error),\n }\n );\n }\n }\n }\n\n /**\n * Reset the controller for reuse (primarily for testing).\n */\n reset(): void {\n this._shutdownRequested = false;\n this._signal = null;\n this._handlers.length = 0;\n }\n}\n","/**\n * Server module types.\n *\n * Defines types for WorkerServer lifecycle and configuration.\n */\n\nimport type { TaskerEventEmitter } from '../events/event-emitter.js';\nimport type { EventPoller } from '../events/event-poller.js';\nimport type { NapiModule } from '../ffi/ffi-layer.js';\nimport type { HandlerRegistry } from '../handler/registry.js';\nimport type { StepExecutionSubscriber } from '../subscriber/step-execution-subscriber.js';\n\n/**\n * Server state constants.\n *\n * Use these constants instead of raw strings for type safety and consistency.\n *\n * State transitions:\n * - INITIALIZED -> STARTING -> RUNNING -> SHUTTING_DOWN -> STOPPED\n * - Any state can transition to ERROR on fatal failures\n */\nexport const ServerStates = {\n /** Initial state after construction */\n INITIALIZED: 'initialized',\n /** Starting up: loading FFI, registering handlers, bootstrapping */\n STARTING: 'starting',\n /** Running and processing events */\n RUNNING: 'running',\n /** Graceful shutdown in progress */\n SHUTTING_DOWN: 'shutting_down',\n /** Fully stopped */\n STOPPED: 'stopped',\n /** Error state - fatal failure occurred */\n ERROR: 'error',\n} as const;\n\n/**\n * Server lifecycle states (union type derived from constants).\n */\nexport type ServerState = (typeof ServerStates)[keyof typeof ServerStates];\n\n/**\n * Worker server configuration.\n *\n * All fields are optional with sensible defaults.\n */\nexport interface WorkerServerConfig {\n /** Task namespace to handle (default: \"default\") */\n namespace?: string;\n\n /** Log level for Rust tracing (default: \"info\") */\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n\n /** Path to TOML configuration file */\n configPath?: string;\n\n /** PostgreSQL database connection URL */\n databaseUrl?: string;\n\n /** Path to the FFI library (overrides auto-discovery) */\n libraryPath?: string;\n\n /** Maximum concurrent handler executions (default: 10) */\n maxConcurrentHandlers?: number;\n\n /** Handler execution timeout in milliseconds (default: 300000 = 5 minutes) */\n handlerTimeoutMs?: number;\n\n /** Event polling interval in milliseconds (default: 10) */\n pollIntervalMs?: number;\n\n /** Starvation check interval in poll cycles (default: 100) */\n starvationCheckInterval?: number;\n\n /** Cleanup interval in poll cycles (default: 1000) */\n cleanupInterval?: number;\n\n /** Metrics reporting interval in poll cycles (default: 100) */\n metricsInterval?: number;\n}\n\n/**\n * Health check result.\n */\nexport interface HealthCheckResult {\n /** Whether the worker is healthy */\n healthy: boolean;\n\n /** Optional status details when healthy */\n status?: ServerStatus;\n\n /** Error message when unhealthy */\n error?: string;\n}\n\n/**\n * Server status information.\n */\nexport interface ServerStatus {\n /** Current server state */\n state: ServerState;\n\n /** Worker identifier */\n workerId: string | null;\n\n /** Whether the worker is actively running */\n running: boolean;\n\n /** Number of events processed */\n processedCount: number;\n\n /** Number of errors encountered */\n errorCount: number;\n\n /** Number of currently active handlers */\n activeHandlers: number;\n\n /** Server uptime in milliseconds */\n uptimeMs: number;\n}\n\n/**\n * Internal server components.\n *\n * Used by WorkerServer to manage lifecycle of all components.\n */\nexport interface ServerComponents {\n /** napi-rs FFI module instance */\n module: NapiModule;\n\n /** Event emitter for step events */\n emitter: TaskerEventEmitter;\n\n /** Handler registry */\n registry: HandlerRegistry;\n\n /** Event poller for FFI events */\n eventPoller: EventPoller;\n\n /** Step execution subscriber */\n stepSubscriber: StepExecutionSubscriber;\n\n /** Worker identifier from bootstrap */\n workerId: string;\n}\n","/**\n * WorkerServer - Orchestrates the TypeScript worker lifecycle.\n *\n * Manages the complete lifecycle of a TypeScript worker:\n * - FFI library loading (via FfiLayer)\n * - Handler registration (via HandlerSystem)\n * - Rust worker bootstrapping\n * - Event processing (via EventSystem)\n * - Graceful shutdown\n *\n * TAS-290: Uses NapiModule directly instead of TaskerRuntime.\n *\n * Design principles:\n * - Explicit construction: No singleton pattern - caller creates and manages\n * - Clear ownership: Owns FfiLayer, HandlerSystem, EventSystem\n * - Explicit lifecycle: Clear 3-phase startup and shutdown\n *\n * @example\n * ```typescript\n * const server = new WorkerServer();\n *\n * await server.start({\n * namespace: 'payments',\n * logLevel: 'debug',\n * });\n *\n * // Server is now running and processing tasks\n *\n * await server.shutdown();\n * ```\n */\n\nimport {\n bootstrapWorker,\n healthCheck as ffiHealthCheck,\n getVersion,\n getWorkerStatus,\n isWorkerRunning,\n stopWorker,\n transitionToGracefulShutdown,\n} from '../bootstrap/bootstrap.js';\nimport type { BootstrapConfig, BootstrapResult } from '../bootstrap/types.js';\nimport { EventSystem, type EventSystemConfig } from '../events/event-system.js';\nimport { FfiLayer, type FfiLayerConfig } from '../ffi/ffi-layer.js';\nimport { HandlerSystem } from '../handler/handler-system.js';\nimport { createLogger, setLoggingRuntime } from '../logging/index.js';\nimport {\n type HealthCheckResult,\n type ServerState,\n ServerStates,\n type ServerStatus,\n type WorkerServerConfig,\n} from './types.js';\n\nconst log = createLogger({ component: 'server' });\n\n/**\n * Worker server class.\n *\n * Unlike the previous singleton pattern, this class is instantiated directly\n * by the caller (typically bin/server.ts). This provides explicit lifecycle\n * control and clear dependency ownership.\n */\nexport class WorkerServer {\n private readonly ffiLayer: FfiLayer;\n private readonly handlerSystem: HandlerSystem;\n private eventSystem: EventSystem | null = null;\n\n private state: ServerState = ServerStates.INITIALIZED;\n private config: WorkerServerConfig | null = null;\n private workerId: string | null = null;\n private startTime: number | null = null;\n private shutdownHandlers: Array<() => void | Promise<void>> = [];\n\n /**\n * Create a new WorkerServer.\n *\n * @param ffiConfig - Optional FFI layer configuration\n */\n constructor(ffiConfig?: FfiLayerConfig) {\n this.ffiLayer = new FfiLayer(ffiConfig);\n this.handlerSystem = new HandlerSystem();\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n /**\n * Get the current server state.\n */\n getState(): ServerState {\n return this.state;\n }\n\n /**\n * Get the worker identifier.\n */\n getWorkerId(): string | null {\n return this.workerId;\n }\n\n /**\n * Check if the server is currently running.\n */\n isRunning(): boolean {\n return this.state === ServerStates.RUNNING;\n }\n\n /**\n * Get the handler system for external handler registration.\n */\n getHandlerSystem(): HandlerSystem {\n return this.handlerSystem;\n }\n\n /**\n * Get the event system (available after start).\n */\n getEventSystem(): EventSystem | null {\n return this.eventSystem;\n }\n\n // ==========================================================================\n // Lifecycle Methods\n // ==========================================================================\n\n /**\n * Start the worker server.\n *\n * Three-phase startup:\n * 1. Initialize: Load FFI, load handlers\n * 2. Bootstrap: Initialize Rust worker\n * 3. Start: Begin event processing\n *\n * @param config - Optional server configuration\n * @returns The server instance for chaining\n * @throws Error if server is already running or fails to start\n */\n async start(config?: WorkerServerConfig): Promise<this> {\n if (this.state === ServerStates.RUNNING) {\n throw new Error('WorkerServer is already running');\n }\n\n if (this.state === ServerStates.STARTING) {\n throw new Error('WorkerServer is already starting');\n }\n\n this.state = ServerStates.STARTING;\n this.config = config ?? {};\n this.startTime = Date.now();\n\n try {\n // Phase 1: Initialize\n await this.initializePhase();\n\n // Phase 2: Bootstrap Rust worker\n const bootstrapResult = await this.bootstrapPhase();\n this.workerId = bootstrapResult.workerId ?? `typescript-worker-${process.pid}`;\n\n log.info(`Worker bootstrapped successfully (ID: ${this.workerId})`, {\n operation: 'bootstrap',\n worker_id: this.workerId,\n });\n\n // Phase 3: Start event processing\n await this.startEventProcessingPhase();\n\n this.state = ServerStates.RUNNING;\n\n log.info('WorkerServer started successfully', {\n operation: 'start',\n worker_id: this.workerId,\n version: getVersion(this.ffiLayer.getModule()),\n });\n\n return this;\n } catch (error) {\n this.state = ServerStates.ERROR;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n log.error(`WorkerServer failed to start: ${errorMessage}`, {\n operation: 'start',\n error_message: errorMessage,\n });\n\n // Cleanup any partially initialized components\n await this.cleanupOnError();\n\n throw error;\n }\n }\n\n /**\n * Shutdown the worker server gracefully.\n *\n * Three-phase shutdown:\n * 1. Stop event processing\n * 2. Stop Rust worker\n * 3. Unload FFI\n */\n async shutdown(): Promise<void> {\n if (this.state === ServerStates.SHUTTING_DOWN) {\n log.warn('Shutdown already in progress', { operation: 'shutdown' });\n return;\n }\n\n if (this.state !== ServerStates.RUNNING) {\n log.info('Server not running, nothing to shutdown', {\n operation: 'shutdown',\n state: this.state,\n });\n return;\n }\n\n this.state = ServerStates.SHUTTING_DOWN;\n\n log.info('Starting shutdown sequence...', { operation: 'shutdown' });\n\n try {\n // Phase 1: Stop event processing\n if (this.eventSystem) {\n log.info(' Stopping event system...', { operation: 'shutdown' });\n await this.eventSystem.stop();\n this.eventSystem = null;\n log.info(' Event system stopped', { operation: 'shutdown' });\n }\n\n // Phase 2: Stop Rust worker\n const module = this.ffiLayer.isLoaded() ? this.ffiLayer.getModule() : undefined;\n if (isWorkerRunning(module)) {\n log.info(' Transitioning to graceful shutdown...', {\n operation: 'shutdown',\n });\n transitionToGracefulShutdown(module);\n\n log.info(' Stopping Rust worker...', { operation: 'shutdown' });\n stopWorker(module);\n log.info(' Rust worker stopped', { operation: 'shutdown' });\n }\n\n // Phase 3: Unload FFI\n log.info(' Unloading FFI...', { operation: 'shutdown' });\n await this.ffiLayer.unload();\n log.info(' FFI unloaded', { operation: 'shutdown' });\n\n // Execute registered shutdown handlers\n for (const handler of this.shutdownHandlers) {\n try {\n await handler();\n } catch (error) {\n log.error(\n `Shutdown handler failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n operation: 'shutdown',\n }\n );\n }\n }\n\n this.state = ServerStates.STOPPED;\n\n log.info('WorkerServer shutdown completed successfully', {\n operation: 'shutdown',\n });\n } catch (error) {\n this.state = ServerStates.ERROR;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n log.error(`Shutdown failed: ${errorMessage}`, {\n operation: 'shutdown',\n error_message: errorMessage,\n });\n\n throw error;\n }\n }\n\n /**\n * Register a handler to be called during shutdown.\n *\n * @param handler - Function to execute during shutdown\n */\n onShutdown(handler: () => void | Promise<void>): void {\n this.shutdownHandlers.push(handler);\n }\n\n // ==========================================================================\n // Status Methods\n // ==========================================================================\n\n /**\n * Perform a health check on the worker.\n */\n healthCheck(): HealthCheckResult {\n if (this.state !== ServerStates.RUNNING) {\n return {\n healthy: false,\n error: `Server not running (state: ${this.state})`,\n };\n }\n\n try {\n const module = this.ffiLayer.isLoaded() ? this.ffiLayer.getModule() : undefined;\n const ffiHealthy = ffiHealthCheck(module);\n if (!ffiHealthy) {\n return { healthy: false, error: 'FFI health check failed' };\n }\n\n const workerStatus = getWorkerStatus(module);\n if (!workerStatus.running) {\n return { healthy: false, error: 'Worker not running' };\n }\n\n return {\n healthy: true,\n status: this.status(),\n };\n } catch (error) {\n return {\n healthy: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Get detailed server status.\n */\n status(): ServerStatus {\n const stats = this.eventSystem?.getStats();\n\n return {\n state: this.state,\n workerId: this.workerId,\n running: this.state === ServerStates.RUNNING,\n processedCount: stats?.processedCount ?? 0,\n errorCount: stats?.errorCount ?? 0,\n activeHandlers: stats?.activeHandlers ?? 0,\n uptimeMs: this.startTime ? Date.now() - this.startTime : 0,\n };\n }\n\n // ==========================================================================\n // Private Phase Methods\n // ==========================================================================\n\n /**\n * Phase 1: Initialize FFI and handlers.\n */\n private async initializePhase(): Promise<void> {\n // Load handlers from environment\n const handlerCount = await this.handlerSystem.loadFromEnv();\n log.info(`Loaded ${handlerCount} handlers from TYPESCRIPT_HANDLER_PATH`, {\n operation: 'initialize',\n });\n\n // Load FFI library\n log.info('Loading FFI library...', { operation: 'initialize' });\n await this.ffiLayer.load(this.config?.libraryPath);\n log.info(`FFI library loaded: ${this.ffiLayer.getModulePath()}`, {\n operation: 'initialize',\n });\n\n // Install the module for logging (enables Rust tracing integration)\n setLoggingRuntime(this.ffiLayer.getModule());\n\n // Log handler info\n const totalHandlers = this.handlerSystem.handlerCount();\n if (totalHandlers > 0) {\n log.info(`Handler registry: ${totalHandlers} handlers registered`, {\n operation: 'initialize',\n handler_count: String(totalHandlers),\n });\n log.info(`Registered handlers: ${this.handlerSystem.listHandlers().join(', ')}`, {\n operation: 'initialize',\n });\n } else {\n log.warn('No handlers registered. Did you register handlers before starting?', {\n operation: 'initialize',\n });\n }\n }\n\n /**\n * Phase 2: Bootstrap Rust worker.\n */\n private async bootstrapPhase(): Promise<BootstrapResult> {\n // Build config, only setting properties that have values\n const bootstrapConfig: BootstrapConfig = {\n namespace: this.config?.namespace ?? process.env.TASKER_NAMESPACE ?? 'default',\n logLevel:\n this.config?.logLevel ?? (process.env.RUST_LOG as BootstrapConfig['logLevel']) ?? 'info',\n };\n\n const configPath = this.config?.configPath ?? process.env.TASKER_CONFIG_PATH;\n if (configPath) {\n bootstrapConfig.configPath = configPath;\n }\n\n const databaseUrl = this.config?.databaseUrl ?? process.env.DATABASE_URL;\n if (databaseUrl) {\n bootstrapConfig.databaseUrl = databaseUrl;\n }\n\n log.info('Bootstrapping Rust worker...', { operation: 'bootstrap' });\n const module = this.ffiLayer.getModule();\n const result = await bootstrapWorker(bootstrapConfig, module);\n\n if (!result.success) {\n throw new Error(`Bootstrap failed: ${result.message}`);\n }\n\n return result;\n }\n\n /**\n * Phase 3: Start event processing.\n */\n private async startEventProcessingPhase(): Promise<void> {\n log.info('Starting event processing system...', {\n operation: 'start_events',\n });\n\n const module = this.ffiLayer.getModule();\n\n // Build event system config\n const eventConfig: EventSystemConfig = {\n poller: {\n pollIntervalMs: this.config?.pollIntervalMs ?? 10,\n starvationCheckInterval: this.config?.starvationCheckInterval ?? 100,\n cleanupInterval: this.config?.cleanupInterval ?? 1000,\n metricsInterval: this.config?.metricsInterval ?? 100,\n },\n subscriber: {\n maxConcurrent: this.config?.maxConcurrentHandlers ?? 10,\n handlerTimeoutMs: this.config?.handlerTimeoutMs ?? 300000,\n },\n };\n\n // Only add workerId if it's set (exactOptionalPropertyTypes compatibility)\n if (this.workerId) {\n eventConfig.subscriber = {\n ...eventConfig.subscriber,\n workerId: this.workerId,\n };\n }\n\n // Create EventSystem with explicit dependencies\n this.eventSystem = new EventSystem(module, this.handlerSystem.getRegistry(), eventConfig);\n\n // Start the event system\n this.eventSystem.start();\n\n log.info('Event processing system started', {\n operation: 'start_events',\n worker_id: this.workerId,\n });\n }\n\n /**\n * Cleanup on error during startup.\n */\n private async cleanupOnError(): Promise<void> {\n try {\n if (this.eventSystem) {\n await this.eventSystem.stop();\n this.eventSystem = null;\n }\n const module = this.ffiLayer.isLoaded() ? this.ffiLayer.getModule() : undefined;\n if (isWorkerRunning(module)) {\n stopWorker(module);\n }\n await this.ffiLayer.unload();\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ==========================================================================\n// Legacy Compatibility (Deprecated)\n// ==========================================================================\n\n/**\n * @deprecated Use `new WorkerServer()` instead. Will be removed in future version.\n *\n * This function provides backwards compatibility during migration.\n * New code should create WorkerServer directly.\n */\nexport function createWorkerServer(ffiConfig?: FfiLayerConfig): WorkerServer {\n return new WorkerServer(ffiConfig);\n}\n"]}