@agentxjs/runtime 0.1.5 → 0.1.6
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.cjs +134 -114
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +134 -114
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/internal/SystemBusImpl.ts","../../common/src/logger/ConsoleLogger.ts","../../common/src/logger/LoggerFactoryImpl.ts","../src/internal/BusDriver.ts","../src/internal/AgentInteractor.ts","../../types/src/agent/event/state/index.ts","../../types/src/agent/event/message/index.ts","../../types/src/agent/event/turn/index.ts","../../agent/src/engine/mealy/Store.ts","../../agent/src/engine/mealy/Mealy.ts","../../agent/src/engine/mealy/combinators.ts","../../agent/src/engine/internal/messageAssemblerProcessor.ts","../../agent/src/engine/internal/stateEventProcessor.ts","../../agent/src/engine/internal/turnTrackerProcessor.ts","../../agent/src/engine/AgentProcessor.ts","../../agent/src/engine/MealyMachine.ts","../../agent/src/AgentStateMachine.ts","../../agent/src/createAgent.ts","../src/environment/ClaudeReceptor.ts","../src/environment/ClaudeEffector.ts","../src/environment/buildOptions.ts","../src/environment/helpers.ts","../src/environment/observableToAsyncIterable.ts","../src/environment/ClaudeEnvironment.ts","../src/internal/RuntimeAgent.ts","../src/internal/RuntimeSession.ts","../src/internal/RuntimeSandbox.ts","../src/internal/RuntimeImage.ts","../src/internal/RuntimeContainer.ts","../src/internal/BaseEventHandler.ts","../src/internal/CommandHandler.ts","../src/RuntimeImpl.ts","../src/createRuntime.ts","../src/internal/persistence/PersistenceImpl.ts","../src/internal/persistence/repository/StorageImageRepository.ts","../src/internal/persistence/repository/StorageContainerRepository.ts","../src/internal/persistence/repository/StorageSessionRepository.ts"],"sourcesContent":["/**\n * @agentxjs/runtime - Runtime for AI Agents\n *\n * @example\n * ```typescript\n * import { createRuntime, createPersistence } from \"@agentxjs/runtime\";\n *\n * const runtime = createRuntime({\n * persistence: createPersistence(),\n * });\n *\n * // Use request/response pattern\n * const res = await runtime.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n *\n * runtime.on(\"text_delta\", (e) => console.log(e.data.text));\n *\n * await runtime.dispose();\n * ```\n *\n * @packageDocumentation\n */\n\nexport { createRuntime, type RuntimeConfig } from \"./createRuntime\";\nexport {\n createPersistence,\n type PersistenceConfig,\n type StorageDriver,\n} from \"./internal/persistence\";\n","/**\n * SystemBusImpl - Central event bus implementation\n *\n * Pub/Sub event bus for runtime communication.\n */\n\nimport type {\n SystemBus,\n SystemBusProducer,\n SystemBusConsumer,\n BusEventHandler,\n SubscribeOptions,\n Unsubscribe,\n} from \"@agentxjs/types/runtime/internal\";\nimport type {\n SystemEvent,\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n CommandRequestResponseMap,\n} from \"@agentxjs/types/event\";\nimport { Subject } from \"rxjs\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/SystemBusImpl\");\n\n/**\n * Internal subscription record\n */\ninterface Subscription {\n id: number;\n type: string | string[] | \"*\";\n handler: BusEventHandler;\n filter?: (event: SystemEvent) => boolean;\n priority: number;\n once: boolean;\n}\n\n/**\n * SystemBus implementation using RxJS Subject\n */\nexport class SystemBusImpl implements SystemBus {\n private readonly subject = new Subject<SystemEvent>();\n private subscriptions: Subscription[] = [];\n private nextId = 0;\n private isDestroyed = false;\n\n // Cached restricted views\n private producerView: SystemBusProducer | null = null;\n private consumerView: SystemBusConsumer | null = null;\n\n constructor() {\n this.subject.subscribe((event) => {\n this.dispatch(event);\n });\n }\n\n emit(event: SystemEvent): void {\n if (this.isDestroyed) return;\n this.subject.next(event);\n }\n\n emitBatch(events: SystemEvent[]): void {\n for (const event of events) {\n this.emit(event);\n }\n }\n\n on<T extends string>(\n typeOrTypes: T | string[],\n handler: BusEventHandler<SystemEvent & { type: T }>,\n options?: SubscribeOptions<SystemEvent & { type: T }>\n ): Unsubscribe {\n if (this.isDestroyed) return () => {};\n\n const subscription: Subscription = {\n id: this.nextId++,\n type: typeOrTypes,\n handler: handler as BusEventHandler,\n filter: options?.filter as ((event: SystemEvent) => boolean) | undefined,\n priority: options?.priority ?? 0,\n once: options?.once ?? false,\n };\n\n this.subscriptions.push(subscription);\n this.sortByPriority();\n\n return () => this.removeSubscription(subscription.id);\n }\n\n onAny(handler: BusEventHandler, options?: SubscribeOptions): Unsubscribe {\n if (this.isDestroyed) return () => {};\n\n const subscription: Subscription = {\n id: this.nextId++,\n type: \"*\",\n handler,\n filter: options?.filter as ((event: SystemEvent) => boolean) | undefined,\n priority: options?.priority ?? 0,\n once: options?.once ?? false,\n };\n\n this.subscriptions.push(subscription);\n this.sortByPriority();\n\n return () => this.removeSubscription(subscription.id);\n }\n\n once<T extends string>(\n type: T,\n handler: BusEventHandler<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.on(type, handler, { once: true });\n }\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n // Reuse the existing on() implementation with type casting\n return this.on(type as string, handler as BusEventHandler);\n }\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n this.emit({\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: type.endsWith(\"_response\") ? \"response\" : \"request\",\n intent: type.endsWith(\"_response\") ? \"result\" : \"request\",\n } as SystemEvent);\n }\n\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout: number = 30000\n ): Promise<ResponseEventFor<T>> {\n return new Promise((resolve, reject) => {\n const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n // Get response type from request type\n const responseType = type.replace(\"_request\", \"_response\") as CommandRequestResponseMap[T];\n\n // Set up timeout\n const timer = setTimeout(() => {\n unsubscribe();\n reject(new Error(`Request timeout: ${type}`));\n }, timeout);\n\n // Listen for response\n const unsubscribe = this.onCommand(responseType, (event) => {\n // Match by requestId\n if ((event.data as { requestId: string }).requestId === requestId) {\n clearTimeout(timer);\n unsubscribe();\n resolve(event as ResponseEventFor<T>);\n }\n });\n\n // Emit request with generated requestId\n this.emitCommand(type, { ...data, requestId } as CommandEventMap[T][\"data\"]);\n });\n }\n\n destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n this.subscriptions = [];\n this.subject.complete();\n }\n\n private dispatch(event: SystemEvent): void {\n const toRemove: number[] = [];\n\n for (const sub of this.subscriptions) {\n if (!this.matchesType(sub.type, event.type)) continue;\n if (sub.filter && !sub.filter(event)) continue;\n\n try {\n sub.handler(event);\n } catch (err) {\n logger.error(\"Event handler error\", {\n eventType: event.type,\n subscriptionType: sub.type,\n error: err instanceof Error ? err.message : String(err),\n stack: err instanceof Error ? err.stack : undefined,\n });\n }\n\n if (sub.once) {\n toRemove.push(sub.id);\n }\n }\n\n for (const id of toRemove) {\n this.removeSubscription(id);\n }\n }\n\n private matchesType(subscriptionType: string | string[] | \"*\", eventType: string): boolean {\n if (subscriptionType === \"*\") return true;\n if (Array.isArray(subscriptionType)) return subscriptionType.includes(eventType);\n return subscriptionType === eventType;\n }\n\n private sortByPriority(): void {\n this.subscriptions.sort((a, b) => b.priority - a.priority);\n }\n\n private removeSubscription(id: number): void {\n this.subscriptions = this.subscriptions.filter((s) => s.id !== id);\n }\n\n /**\n * Get a read-only consumer view (only subscribe methods)\n */\n asConsumer(): SystemBusConsumer {\n if (!this.consumerView) {\n this.consumerView = {\n on: this.on.bind(this),\n onAny: this.onAny.bind(this),\n once: this.once.bind(this),\n onCommand: this.onCommand.bind(this),\n request: this.request.bind(this),\n };\n }\n return this.consumerView;\n }\n\n /**\n * Get a write-only producer view (only emit methods)\n */\n asProducer(): SystemBusProducer {\n if (!this.producerView) {\n this.producerView = {\n emit: this.emit.bind(this),\n emitBatch: this.emitBatch.bind(this),\n emitCommand: this.emitCommand.bind(this),\n };\n }\n return this.producerView;\n }\n}\n","/**\n * ConsoleLogger - Default logger implementation\n *\n * Simple console-based logger with color support.\n * Used as fallback when no custom LoggerFactory is provided.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\n\nexport interface ConsoleLoggerOptions {\n level?: LogLevel;\n colors?: boolean;\n timestamps?: boolean;\n}\n\nexport class ConsoleLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly colors: boolean;\n private readonly timestamps: boolean;\n\n private static readonly COLORS = {\n DEBUG: \"\\x1b[36m\",\n INFO: \"\\x1b[32m\",\n WARN: \"\\x1b[33m\",\n ERROR: \"\\x1b[31m\",\n RESET: \"\\x1b[0m\",\n };\n\n constructor(name: string, options: ConsoleLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? \"info\";\n this.colors = options.colors ?? this.isNodeEnvironment();\n this.timestamps = options.timestamps ?? true;\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.isDebugEnabled()) {\n this.log(\"DEBUG\", message, context);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.isInfoEnabled()) {\n this.log(\"INFO\", message, context);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.isWarnEnabled()) {\n this.log(\"WARN\", message, context);\n }\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (this.isErrorEnabled()) {\n if (message instanceof Error) {\n this.log(\"ERROR\", message.message, { ...context, stack: message.stack });\n } else {\n this.log(\"ERROR\", message, context);\n }\n }\n }\n\n isDebugEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"error\");\n }\n\n private getLevelValue(level: LogLevel): number {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n };\n return levels[level];\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const parts: string[] = [];\n\n if (this.timestamps) {\n parts.push(new Date().toISOString());\n }\n\n if (this.colors) {\n const color = ConsoleLogger.COLORS[level as keyof typeof ConsoleLogger.COLORS];\n parts.push(`${color}${level.padEnd(5)}${ConsoleLogger.COLORS.RESET}`);\n } else {\n parts.push(level.padEnd(5));\n }\n\n parts.push(`[${this.name}]`);\n parts.push(message);\n\n const logLine = parts.join(\" \");\n const consoleMethod = this.getConsoleMethod(level);\n\n if (context && Object.keys(context).length > 0) {\n consoleMethod(logLine, context);\n } else {\n consoleMethod(logLine);\n }\n }\n\n private getConsoleMethod(level: string): (...args: unknown[]) => void {\n switch (level) {\n case \"DEBUG\":\n return console.debug.bind(console);\n case \"INFO\":\n return console.info.bind(console);\n case \"WARN\":\n return console.warn.bind(console);\n case \"ERROR\":\n return console.error.bind(console);\n default:\n return console.log.bind(console);\n }\n }\n\n private isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n }\n}\n","/**\n * LoggerFactoryImpl - Central factory for creating logger instances\n *\n * Implements lazy initialization pattern:\n * - createLogger() can be called at module level (before config)\n * - Real logger is created on first use\n * - External LoggerFactory can be injected via Runtime\n */\n\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { ConsoleLogger, type ConsoleLoggerOptions } from \"./ConsoleLogger\";\n\n// External factory injected via Runtime\nlet externalFactory: LoggerFactory | null = null;\n\nexport interface LoggerFactoryConfig {\n defaultImplementation?: (name: string) => Logger;\n defaultLevel?: LogLevel;\n consoleOptions?: Omit<ConsoleLoggerOptions, \"level\">;\n}\n\n/**\n * Internal LoggerFactory implementation\n *\n * Uses lazy proxy pattern to allow module-level createLogger() calls.\n */\nexport class LoggerFactoryImpl {\n private static loggers: Map<string, Logger> = new Map();\n private static config: LoggerFactoryConfig = {\n defaultLevel: \"info\",\n };\n\n static getLogger(nameOrClass: string | (new (...args: unknown[]) => unknown)): Logger {\n const name = typeof nameOrClass === \"string\" ? nameOrClass : nameOrClass.name;\n\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const lazyLogger = this.createLazyLogger(name);\n this.loggers.set(name, lazyLogger);\n return lazyLogger;\n }\n\n static configure(config: LoggerFactoryConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n static reset(): void {\n this.loggers.clear();\n this.config = { defaultLevel: \"info\" };\n externalFactory = null;\n }\n\n private static createLazyLogger(name: string): Logger {\n let realLogger: Logger | null = null;\n\n const getRealLogger = (): Logger => {\n if (!realLogger) {\n realLogger = this.createLogger(name);\n }\n return realLogger;\n };\n\n return {\n name,\n level: this.config.defaultLevel || \"info\",\n debug: (message: string, context?: LogContext) => getRealLogger().debug(message, context),\n info: (message: string, context?: LogContext) => getRealLogger().info(message, context),\n warn: (message: string, context?: LogContext) => getRealLogger().warn(message, context),\n error: (message: string | Error, context?: LogContext) =>\n getRealLogger().error(message, context),\n isDebugEnabled: () => getRealLogger().isDebugEnabled(),\n isInfoEnabled: () => getRealLogger().isInfoEnabled(),\n isWarnEnabled: () => getRealLogger().isWarnEnabled(),\n isErrorEnabled: () => getRealLogger().isErrorEnabled(),\n };\n }\n\n private static createLogger(name: string): Logger {\n if (externalFactory) {\n return externalFactory.getLogger(name);\n }\n\n if (this.config.defaultImplementation) {\n return this.config.defaultImplementation(name);\n }\n\n return new ConsoleLogger(name, {\n level: this.config.defaultLevel,\n ...this.config.consoleOptions,\n });\n }\n}\n\n/**\n * Set external LoggerFactory (called by Runtime initialization)\n */\nexport function setLoggerFactory(factory: LoggerFactory): void {\n externalFactory = factory;\n LoggerFactoryImpl.reset();\n externalFactory = factory;\n}\n\n/**\n * Create a logger instance\n *\n * Safe to call at module level before Runtime is configured.\n * Uses lazy initialization - actual logger is created on first use.\n *\n * @param name - Logger name (hierarchical, e.g., \"engine/AgentEngine\")\n * @returns Logger instance (lazy proxy)\n */\nexport function createLogger(name: string): Logger {\n return LoggerFactoryImpl.getLogger(name);\n}\n","/**\n * BusDriver - Listens to DriveableEvents and forwards to Agent\n *\n * This is the \"out\" side of agent communication:\n * - Subscribes to SystemBus at construction time\n * - Filters DriveableEvents by agentId (from event context)\n * - Converts DriveableEvent to StreamEvent\n * - Forwards to AgentEngine via callback\n *\n * Flow:\n * ```\n * ClaudeReceptor emits DriveableEvent (with context.agentId)\n * → SystemBus\n * → BusDriver filters by agentId\n * → Converts to StreamEvent\n * → Calls onStreamEvent callback\n * → AgentEngine processes\n * ```\n */\n\nimport type { StreamEvent } from \"@agentxjs/types/agent\";\nimport type { SystemBusConsumer, BusEventHandler } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemEvent, DriveableEvent } from \"@agentxjs/types/runtime\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/BusDriver\");\n\n/**\n * Callback for stream events\n */\nexport type StreamEventCallback = (event: StreamEvent) => void;\n\n/**\n * Callback when stream completes (message_stop or interrupted)\n */\nexport type StreamCompleteCallback = (reason: \"message_stop\" | \"interrupted\") => void;\n\n/**\n * BusDriver configuration\n */\nexport interface BusDriverConfig {\n agentId: string;\n onStreamEvent: StreamEventCallback;\n onStreamComplete?: StreamCompleteCallback;\n}\n\n/**\n * BusDriver - Event-driven listener for DriveableEvents\n *\n * Subscribes to SystemBus at construction and filters events\n * by agentId from the event context.\n */\nexport class BusDriver {\n readonly name = \"BusDriver\";\n readonly description = \"Driver that listens to SystemBus for DriveableEvents\";\n\n private readonly config: BusDriverConfig;\n private readonly unsubscribe: () => void;\n\n constructor(consumer: SystemBusConsumer, config: BusDriverConfig) {\n this.config = config;\n\n logger.debug(\"BusDriver created, subscribing to bus\", {\n agentId: config.agentId,\n });\n\n // Subscribe to all events at construction time\n this.unsubscribe = consumer.onAny(((event: SystemEvent) => {\n this.handleEvent(event);\n }) as BusEventHandler);\n }\n\n /**\n * Handle incoming event from bus\n */\n private handleEvent(event: SystemEvent): void {\n // Check if this is a DriveableEvent for this agent\n if (!this.isDriveableEventForThisAgent(event)) {\n return;\n }\n\n const driveableEvent = event as DriveableEvent;\n logger.debug(\"BusDriver received DriveableEvent\", {\n type: driveableEvent.type,\n agentId: this.config.agentId,\n requestId: (driveableEvent as unknown as { requestId?: string }).requestId,\n });\n\n // Convert to StreamEvent and forward\n const streamEvent = this.toStreamEvent(driveableEvent);\n this.config.onStreamEvent(streamEvent);\n\n // Notify completion if applicable\n if (driveableEvent.type === \"message_stop\") {\n this.config.onStreamComplete?.(\"message_stop\");\n } else if (driveableEvent.type === \"interrupted\") {\n this.config.onStreamComplete?.(\"interrupted\");\n }\n }\n\n /**\n * Check if event is a DriveableEvent for this agent\n *\n * Must check:\n * 1. source === \"environment\" (from Claude)\n * 2. context.agentId === this.config.agentId (for this agent)\n */\n private isDriveableEventForThisAgent(event: unknown): event is DriveableEvent {\n const driveableTypes = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_content_block_start\",\n \"text_delta\",\n \"text_content_block_stop\",\n \"tool_use_content_block_start\",\n \"input_json_delta\",\n \"tool_use_content_block_stop\",\n \"tool_call\",\n \"tool_result\",\n \"interrupted\",\n \"error_received\",\n ];\n\n if (\n event === null ||\n typeof event !== \"object\" ||\n !(\"type\" in event) ||\n typeof (event as { type: unknown }).type !== \"string\"\n ) {\n return false;\n }\n\n const e = event as {\n type: string;\n source?: string;\n context?: { agentId?: string };\n };\n\n // Must be from environment\n if (e.source !== \"environment\") {\n return false;\n }\n\n // Must be a driveable event type\n if (!driveableTypes.includes(e.type)) {\n return false;\n }\n\n // Must be for this agent (check context.agentId)\n if (e.context?.agentId !== this.config.agentId) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Convert DriveableEvent to StreamEvent\n */\n private toStreamEvent(event: DriveableEvent): StreamEvent {\n const { type, timestamp, data } = event;\n\n switch (type) {\n case \"message_start\": {\n const d = data as { message?: { id: string; model: string } };\n return {\n type: \"message_start\",\n timestamp,\n data: {\n messageId: d.message?.id ?? \"\",\n model: d.message?.model ?? \"\",\n },\n };\n }\n case \"message_stop\": {\n const d = data as { stopReason?: string };\n return {\n type: \"message_stop\",\n timestamp,\n data: {\n stopReason: d.stopReason,\n },\n } as StreamEvent;\n }\n case \"text_delta\": {\n const d = data as { text: string };\n return {\n type: \"text_delta\",\n timestamp,\n data: { text: d.text },\n };\n }\n case \"tool_use_content_block_start\": {\n const d = data as {\n id?: string;\n name?: string;\n toolCallId?: string;\n toolName?: string;\n };\n return {\n type: \"tool_use_start\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.id ?? \"\",\n toolName: d.toolName ?? d.name ?? \"\",\n },\n };\n }\n case \"input_json_delta\": {\n const d = data as { partialJson: string };\n return {\n type: \"input_json_delta\",\n timestamp,\n data: { partialJson: d.partialJson },\n };\n }\n case \"tool_use_content_block_stop\": {\n const d = data as {\n id?: string;\n name?: string;\n toolCallId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n };\n return {\n type: \"tool_use_stop\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.id ?? \"\",\n toolName: d.toolName ?? d.name ?? \"\",\n input: d.input ?? {},\n },\n };\n }\n case \"tool_result\": {\n const d = data as {\n toolUseId?: string;\n toolCallId?: string;\n result: unknown;\n isError?: boolean;\n };\n return {\n type: \"tool_result\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.toolUseId ?? \"\",\n result: d.result,\n isError: d.isError,\n },\n };\n }\n case \"interrupted\": {\n // interrupted is not part of StreamEvent type, so we convert to message_stop\n // The MealyMachine will handle this and emit conversation_end\n return {\n type: \"message_stop\",\n timestamp,\n data: { stopReason: \"end_turn\" }, // Use valid StopReason\n };\n }\n case \"error_received\": {\n const d = data as { message: string; errorCode?: string };\n return {\n type: \"error_received\",\n timestamp,\n data: {\n message: d.message,\n errorCode: d.errorCode,\n },\n } as StreamEvent;\n }\n default:\n // For other events, pass through with minimal transformation\n return { type, timestamp, data } as StreamEvent;\n }\n }\n\n /**\n * Dispose and stop listening\n */\n dispose(): void {\n logger.debug(\"BusDriver disposing\", { agentId: this.config.agentId });\n this.unsubscribe();\n }\n}\n","/**\n * AgentInteractor - Handles user interactions (input)\n *\n * Responsibilities:\n * 1. Receive user messages\n * 2. Build UserMessage objects\n * 3. Persist to Session\n * 4. Emit to Bus (trigger ClaudeEffector)\n * 5. Handle interrupt operations\n *\n * This class is the \"in\" side of the agent communication.\n * BusDriver handles the \"out\" side (DriveableEvent → StreamEvent).\n */\n\nimport type { SystemBusProducer, Session } from \"@agentxjs/types/runtime/internal\";\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { EventContext } from \"@agentxjs/types/runtime\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/AgentInteractor\");\n\n/**\n * Context for AgentInteractor\n */\nexport interface AgentInteractorContext {\n agentId: string;\n imageId: string;\n containerId: string;\n sessionId: string;\n}\n\n/**\n * AgentInteractor - Processes user input and emits events\n */\nexport class AgentInteractor {\n private readonly producer: SystemBusProducer;\n private readonly session: Session;\n private readonly context: AgentInteractorContext;\n\n constructor(producer: SystemBusProducer, session: Session, context: AgentInteractorContext) {\n this.producer = producer;\n this.session = session;\n this.context = context;\n logger.debug(\"AgentInteractor created\", { agentId: context.agentId });\n }\n\n /**\n * Receive user message\n *\n * @param content - Message content\n * @param requestId - Request ID for correlation\n */\n async receive(content: string, requestId: string): Promise<UserMessage> {\n logger.debug(\"AgentInteractor.receive\", {\n requestId,\n agentId: this.context.agentId,\n contentPreview: content.substring(0, 50),\n });\n\n // 1. Build UserMessage\n const userMessage: UserMessage = {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // 2. Persist to Session\n await this.session.addMessage(userMessage);\n logger.debug(\"UserMessage persisted\", {\n messageId: userMessage.id,\n requestId,\n });\n\n // 3. Build event context\n const eventContext: EventContext = {\n agentId: this.context.agentId,\n imageId: this.context.imageId,\n containerId: this.context.containerId,\n sessionId: this.context.sessionId,\n };\n\n // 4. Emit internal event to Bus (triggers ClaudeEffector)\n // This event is NOT broadcastable - it's for internal processing only\n this.producer.emit({\n type: \"user_message\",\n timestamp: Date.now(),\n data: userMessage,\n source: \"agent\",\n category: \"message\",\n intent: \"request\",\n requestId,\n context: eventContext,\n broadcastable: false, // Internal event for ClaudeEffector\n } as never);\n\n logger.info(\"user_message event emitted to bus\", {\n messageId: userMessage.id,\n requestId,\n agentId: this.context.agentId,\n eventType: \"user_message\",\n });\n\n return userMessage;\n }\n\n /**\n * Interrupt current operation\n *\n * @param requestId - Optional request ID for correlation\n */\n interrupt(requestId?: string): void {\n logger.debug(\"AgentInteractor.interrupt\", {\n requestId,\n agentId: this.context.agentId,\n });\n\n const eventContext: EventContext = {\n agentId: this.context.agentId,\n imageId: this.context.imageId,\n containerId: this.context.containerId,\n sessionId: this.context.sessionId,\n };\n\n this.producer.emit({\n type: \"interrupt\",\n timestamp: Date.now(),\n data: { agentId: this.context.agentId },\n source: \"agent\",\n category: \"action\",\n intent: \"request\",\n requestId,\n context: eventContext,\n broadcastable: false,\n } as never);\n }\n}\n","/**\n * Engine State Events (Lightweight)\n *\n * Lightweight state events for AgentEngine internal use.\n * Derived from full AgentStateEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentStateEvent as FullAgentStateEvent,\n ConversationQueuedEvent as FullConversationQueuedEvent,\n ConversationStartEvent as FullConversationStartEvent,\n ConversationThinkingEvent as FullConversationThinkingEvent,\n ConversationRespondingEvent as FullConversationRespondingEvent,\n ConversationEndEvent as FullConversationEndEvent,\n ConversationInterruptedEvent as FullConversationInterruptedEvent,\n ToolPlannedEvent as FullToolPlannedEvent,\n ToolExecutingEvent as FullToolExecutingEvent,\n ToolCompletedEvent as FullToolCompletedEvent,\n ToolFailedEvent as FullToolFailedEvent,\n ErrorOccurredEvent as FullErrorOccurredEvent,\n} from \"~/event/agent/state\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * StateEvent - Base type for state events\n * @deprecated Use specific event types instead\n */\nexport interface StateEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type ConversationQueuedEvent = ToEngineEvent<FullConversationQueuedEvent>;\nexport type ConversationStartEvent = ToEngineEvent<FullConversationStartEvent>;\nexport type ConversationThinkingEvent = ToEngineEvent<FullConversationThinkingEvent>;\nexport type ConversationRespondingEvent = ToEngineEvent<FullConversationRespondingEvent>;\nexport type ConversationEndEvent = ToEngineEvent<FullConversationEndEvent>;\nexport type ConversationInterruptedEvent = ToEngineEvent<FullConversationInterruptedEvent>;\nexport type ToolPlannedEvent = ToEngineEvent<FullToolPlannedEvent>;\nexport type ToolExecutingEvent = ToEngineEvent<FullToolExecutingEvent>;\nexport type ToolCompletedEvent = ToEngineEvent<FullToolCompletedEvent>;\nexport type ToolFailedEvent = ToEngineEvent<FullToolFailedEvent>;\nexport type ErrorOccurredEvent = ToEngineEvent<FullErrorOccurredEvent>;\n\n/**\n * Alias for ErrorOccurredEvent (legacy compatibility)\n */\nexport type AgentErrorOccurredEvent = ErrorOccurredEvent;\n\n/**\n * AgentStateEvent - All lightweight state events\n */\nexport type AgentStateEvent = ToEngineEventUnion<FullAgentStateEvent>;\n\n/**\n * Type guard: is this a state event?\n */\nexport function isStateEvent(event: EngineEvent): event is AgentStateEvent {\n const stateTypes = [\n \"conversation_queued\",\n \"conversation_start\",\n \"conversation_thinking\",\n \"conversation_responding\",\n \"conversation_end\",\n \"conversation_interrupted\",\n \"tool_planned\",\n \"tool_executing\",\n \"tool_completed\",\n \"tool_failed\",\n \"error_occurred\",\n ];\n return stateTypes.includes(event.type);\n}\n","/**\n * Engine Message Events (Lightweight)\n *\n * Lightweight message events for AgentEngine internal use.\n * Derived from full AgentMessageEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentMessageEvent as FullAgentMessageEvent,\n UserMessageEvent as FullUserMessageEvent,\n AssistantMessageEvent as FullAssistantMessageEvent,\n ToolCallMessageEvent as FullToolCallMessageEvent,\n ToolResultMessageEvent as FullToolResultMessageEvent,\n ErrorMessageEvent as FullErrorMessageEvent,\n} from \"~/event/agent/message\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// Re-export parts (they're not events, just types)\nexport type { ContentPart, ToolCallPart, ToolResultPart } from \"../../message/parts\";\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * MessageEvent - Base type for message events\n * @deprecated Use specific event types instead\n */\nexport interface MessageEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type UserMessageEvent = ToEngineEvent<FullUserMessageEvent>;\nexport type AssistantMessageEvent = ToEngineEvent<FullAssistantMessageEvent>;\nexport type ToolCallMessageEvent = ToEngineEvent<FullToolCallMessageEvent>;\nexport type ToolResultMessageEvent = ToEngineEvent<FullToolResultMessageEvent>;\nexport type ErrorMessageEvent = ToEngineEvent<FullErrorMessageEvent>;\n\n/**\n * AgentMessageEvent - All lightweight message events\n */\nexport type AgentMessageEvent = ToEngineEventUnion<FullAgentMessageEvent>;\n\n/**\n * Type guard: is this a message event?\n */\nexport function isMessageEvent(event: EngineEvent): event is AgentMessageEvent {\n const messageTypes = [\n \"user_message\",\n \"assistant_message\",\n \"tool_call_message\",\n \"tool_result_message\",\n \"error_message\",\n ];\n return messageTypes.includes(event.type);\n}\n","/**\n * Engine Turn Events (Lightweight)\n *\n * Lightweight turn events for AgentEngine internal use.\n * Derived from full AgentTurnEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentTurnEvent as FullAgentTurnEvent,\n TurnRequestEvent as FullTurnRequestEvent,\n TurnResponseEvent as FullTurnResponseEvent,\n TokenUsage,\n} from \"~/event/agent/turn\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// Re-export TokenUsage (it's not an event, just a type)\nexport type { TokenUsage };\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * TurnEvent - Base type for turn events\n * @deprecated Use specific event types instead\n */\nexport interface TurnEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type TurnRequestEvent = ToEngineEvent<FullTurnRequestEvent>;\nexport type TurnResponseEvent = ToEngineEvent<FullTurnResponseEvent>;\n\n/**\n * AgentTurnEvent - All lightweight turn events\n */\nexport type AgentTurnEvent = ToEngineEventUnion<FullAgentTurnEvent>;\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isTurnEvent(event: EngineEvent): event is AgentTurnEvent {\n const turnTypes = [\"turn_request\", \"turn_response\"];\n return turnTypes.includes(event.type);\n}\n","/**\n * Store - State storage interface for stream processing\n *\n * A Store abstracts state persistence, allowing processors to be stateless\n * while maintaining state externally.\n *\n * @template T - The state type to store\n *\n * @example\n * ```typescript\n * const store = new MemoryStore<AgentState>();\n * store.set('agent_123', { count: 0 });\n * const state = store.get('agent_123');\n * ```\n */\nexport interface Store<T> {\n /**\n * Get state by ID\n * @param id - Unique identifier (e.g., agentId, sessionId)\n * @returns The stored state or undefined if not found\n */\n get(id: string): T | undefined;\n\n /**\n * Set state for an ID\n * @param id - Unique identifier\n * @param state - The state to store\n */\n set(id: string, state: T): void;\n\n /**\n * Delete state for an ID\n * @param id - Unique identifier\n */\n delete(id: string): void;\n\n /**\n * Check if state exists for an ID\n * @param id - Unique identifier\n * @returns True if state exists\n */\n has(id: string): boolean;\n}\n\n/**\n * MemoryStore - In-memory implementation of Store\n *\n * Stores state in a Map. Suitable for development and single-process deployments.\n * For production multi-process scenarios, use RedisStore or PostgresStore.\n *\n * @template T - The state type to store\n *\n * @example\n * ```typescript\n * const store = new MemoryStore<MyState>();\n * store.set('session_1', { count: 0 });\n * ```\n */\nexport class MemoryStore<T> implements Store<T> {\n private states = new Map<string, T>();\n\n get(id: string): T | undefined {\n return this.states.get(id);\n }\n\n set(id: string, state: T): void {\n this.states.set(id, state);\n }\n\n delete(id: string): void {\n this.states.delete(id);\n }\n\n has(id: string): boolean {\n return this.states.has(id);\n }\n\n /**\n * Clear all stored states\n */\n clear(): void {\n this.states.clear();\n }\n\n /**\n * Get the number of stored states\n */\n get size(): number {\n return this.states.size;\n }\n\n /**\n * Get all stored IDs\n */\n keys(): IterableIterator<string> {\n return this.states.keys();\n }\n}\n","/**\n * Mealy - The Mealy Machine runtime\n *\n * A Mealy Machine is a finite-state machine where outputs depend on\n * both the current state AND the input: (state, input) => (state, output)\n *\n * This runtime orchestrates the complete processing pipeline:\n * 1. Sources receive external input (side effects)\n * 2. Processors process inputs (pure Mealy transition functions)\n * 3. Sinks produce output effects (side effects)\n *\n * Architecture:\n * - Inputs enter through Sources (input adapters)\n * - Processors transform inputs (pure functions, state is means)\n * - Sinks produce actions (output adapters)\n *\n * @template TState - The state type (accumulator, means to an end)\n * @template TInput - The input/output type for Processors\n *\n * @example\n * ```typescript\n * const mealy = createMealy({\n * processor: messageProcessor,\n * store: new MemoryStore(),\n * initialState: { text: '' },\n * sinks: [sseSink, logSink],\n * });\n *\n * // Process an input\n * mealy.process('agent_123', input);\n * ```\n */\n\nimport type { Processor } from \"./Processor\";\nimport type { Store } from \"./Store\";\nimport type { Sink, SinkDefinition } from \"./Sink\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/Mealy\");\n\n/**\n * MealyConfig - Configuration for creating a Mealy instance\n */\nexport interface MealyConfig<TState, TInput> {\n /**\n * The processor function to execute (pure Mealy transition function)\n */\n processor: Processor<TState, TInput, TInput>;\n\n /**\n * The store for state persistence\n */\n store: Store<TState>;\n\n /**\n * Initial state for new IDs\n */\n initialState: TState;\n\n /**\n * Sinks to receive outputs\n * Can be simple Sink functions or SinkDefinitions with filter/name\n */\n sinks?: (Sink<TInput> | SinkDefinition<TInput>)[];\n\n /**\n * Whether to recursively process outputs\n * If true, outputs are fed back into the processor\n *\n * @default true\n */\n recursive?: boolean;\n\n /**\n * Maximum recursion depth to prevent infinite loops\n *\n * @default 100\n */\n maxDepth?: number;\n}\n\n/**\n * ProcessResult - Result of processing an input\n */\nexport interface ProcessResult<TState, TOutput> {\n /**\n * The new state after processing\n */\n state: TState;\n\n /**\n * All outputs produced (including from recursion)\n */\n outputs: TOutput[];\n\n /**\n * Number of processor invocations (including recursion)\n */\n processCount: number;\n}\n\n/**\n * Mealy - Mealy Machine runtime\n *\n * Implements the Mealy Machine pattern: (state, input) => (state, output)\n * where output depends on both current state and input.\n */\nexport class Mealy<TState, TInput> {\n private readonly processor: Processor<TState, TInput, TInput>;\n private readonly store: Store<TState>;\n private readonly initialState: TState;\n private readonly sinks: (Sink<TInput> | SinkDefinition<TInput>)[];\n private readonly recursive: boolean;\n private readonly maxDepth: number;\n\n constructor(config: MealyConfig<TState, TInput>) {\n this.processor = config.processor;\n this.store = config.store;\n this.initialState = config.initialState;\n this.sinks = config.sinks ?? [];\n this.recursive = config.recursive ?? true;\n this.maxDepth = config.maxDepth ?? 100;\n\n logger.debug(\"Mealy instance created\", {\n sinkCount: this.sinks.length,\n recursive: this.recursive,\n maxDepth: this.maxDepth,\n });\n }\n\n /**\n * Process an input through the Mealy Machine\n *\n * @param id - Unique identifier (e.g., agentId)\n * @param input - The input to process\n * @returns Result containing new state and all outputs\n */\n process(id: string, input: TInput): ProcessResult<TState, TInput> {\n return this.processInternal(id, input, 0);\n }\n\n /**\n * Internal process with depth tracking\n */\n private processInternal(id: string, input: TInput, depth: number): ProcessResult<TState, TInput> {\n // Guard against infinite recursion\n if (depth >= this.maxDepth) {\n logger.warn(\"Max recursion depth reached\", {\n id,\n maxDepth: this.maxDepth,\n depth,\n });\n return {\n state: this.store.get(id) ?? this.initialState,\n outputs: [],\n processCount: 0,\n };\n }\n\n // 1. Get current state (or initialize)\n let state = this.store.get(id);\n if (state === undefined) {\n state = this.initialState;\n }\n\n // 2. Execute pure processor function (Mealy transition)\n const [newState, outputs] = this.processor(state, input);\n\n // 3. Save new state to store\n this.store.set(id, newState);\n\n // 4. Collect all outputs\n const allOutputs: TInput[] = [...outputs];\n let processCount = 1;\n\n // 5. Send outputs to sinks\n if (outputs.length > 0) {\n this.sendToSinks(id, outputs);\n }\n\n // 6. Optionally recurse on outputs\n if (this.recursive) {\n for (const output of outputs) {\n const result = this.processInternal(id, output, depth + 1);\n allOutputs.push(...result.outputs);\n processCount += result.processCount;\n }\n }\n\n return {\n state: newState,\n outputs: allOutputs,\n processCount,\n };\n }\n\n /**\n * Send outputs to all sinks\n */\n private sendToSinks(id: string, outputs: TInput[]): void {\n for (const sink of this.sinks) {\n // Check if sink is a function or SinkDefinition\n if (typeof sink === \"function\") {\n // Simple Sink function: (id, outputs) => void\n try {\n const result = sink(id, outputs);\n if (result instanceof Promise) {\n result.catch((error) => {\n logger.error(\"Sink error (async)\", { id, error });\n });\n }\n } catch (error) {\n logger.error(\"Sink error (sync)\", { id, error });\n }\n } else {\n // SinkDefinition with filter/name\n const filteredOutputs = sink.filter ? outputs.filter(sink.filter) : outputs;\n\n if (filteredOutputs.length === 0) {\n continue;\n }\n\n try {\n const result = sink.sink(id, filteredOutputs);\n if (result instanceof Promise) {\n result.catch((error) => {\n logger.error(\"Named sink error (async)\", {\n id,\n sinkName: sink.name,\n error,\n });\n });\n }\n } catch (error) {\n logger.error(\"Named sink error (sync)\", {\n id,\n sinkName: sink.name,\n error,\n });\n }\n }\n }\n }\n\n /**\n * Get current state for an ID (without processing)\n */\n getState(id: string): TState | undefined {\n return this.store.get(id);\n }\n\n /**\n * Check if state exists for an ID\n */\n hasState(id: string): boolean {\n return this.store.has(id);\n }\n\n /**\n * Delete state for an ID (cleanup)\n */\n cleanup(id: string): void {\n logger.debug(\"Cleaning up state\", { id });\n this.store.delete(id);\n }\n\n /**\n * Add a sink at runtime\n */\n addSink(sink: Sink<TInput> | SinkDefinition<TInput>): void {\n const sinkName = typeof sink === \"function\" ? \"(anonymous)\" : sink.name;\n logger.debug(\"Adding sink\", { sinkName });\n this.sinks.push(sink);\n }\n\n /**\n * Remove a sink by name (only works for SinkDefinitions)\n */\n removeSink(name: string): boolean {\n const index = this.sinks.findIndex((s) => typeof s !== \"function\" && s.name === name);\n if (index !== -1) {\n this.sinks.splice(index, 1);\n logger.debug(\"Removed sink\", { name });\n return true;\n }\n logger.debug(\"Sink not found for removal\", { name });\n return false;\n }\n}\n\n/**\n * createMealy - Factory function for creating Mealy Machine instances\n *\n * @example\n * ```typescript\n * const mealy = createMealy({\n * processor: myProcessor,\n * store: new MemoryStore(),\n * initialState: { count: 0 },\n * sinks: [logSink],\n * });\n * ```\n */\nexport function createMealy<TState, TInput>(\n config: MealyConfig<TState, TInput>\n): Mealy<TState, TInput> {\n return new Mealy(config);\n}\n","/**\n * Combinators - Functions to compose multiple Processors\n *\n * These utilities allow building complex stream processing pipelines\n * from simple, composable Processor functions.\n */\n\nimport type { Processor } from \"./Processor\";\n\n/**\n * combineProcessors - Combine multiple processors into one\n *\n * Each sub-processor manages its own slice of state.\n * All processors receive the same event and their outputs are merged.\n *\n * @example\n * ```typescript\n * interface CombinedState {\n * message: MessageState;\n * state: StateMachineState;\n * turn: TurnState;\n * }\n *\n * const combinedProcessor = combineProcessors<CombinedState, Event, Event>({\n * message: messageProcessor,\n * state: stateMachineProcessor,\n * turn: turnTrackerProcessor,\n * });\n * ```\n */\nexport function combineProcessors<\n TState extends Record<string, unknown>,\n TInput,\n TOutput,\n>(processors: {\n [K in keyof TState]: Processor<TState[K], TInput, TOutput>;\n}): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n const newState = {} as TState;\n const allOutputs: TOutput[] = [];\n\n for (const key in processors) {\n const processor = processors[key];\n const subState = state[key];\n const [newSubState, outputs] = processor(subState, event);\n\n newState[key] = newSubState;\n allOutputs.push(...outputs);\n }\n\n return [newState, allOutputs];\n };\n}\n\n/**\n * combineInitialStates - Helper to create initial state for combined processors\n */\nexport function combineInitialStates<TState extends Record<string, unknown>>(initialStates: {\n [K in keyof TState]: () => TState[K];\n}): () => TState {\n return () => {\n const state = {} as TState;\n for (const key in initialStates) {\n state[key] = initialStates[key]();\n }\n return state;\n };\n}\n\n/**\n * chainProcessors - Chain processors where output of one feeds into the next\n *\n * Useful for layered event processing:\n * Stream Events → Message Events → Turn Events\n *\n * @example\n * ```typescript\n * const pipeline = chainProcessors(\n * streamToMessageProcessor,\n * messageToTurnProcessor,\n * );\n * ```\n */\nexport function chainProcessors<TState, TEvent>(\n ...processors: Processor<TState, TEvent, TEvent>[]\n): Processor<TState, TEvent, TEvent> {\n return (state: Readonly<TState>, event: TEvent): [TState, TEvent[]] => {\n let currentState = state as TState;\n const finalOutputs: TEvent[] = [];\n\n // Run the event through all processors\n for (const processor of processors) {\n const [newState, outputs] = processor(currentState, event);\n currentState = newState;\n finalOutputs.push(...outputs);\n }\n\n return [currentState, finalOutputs];\n };\n}\n\n/**\n * filterProcessor - Create a processor that only processes certain events\n *\n * @example\n * ```typescript\n * const textOnlyProcessor = filterProcessor(\n * (event) => event.type === 'text_delta',\n * textProcessor,\n * );\n * ```\n */\nexport function filterProcessor<TState, TInput, TOutput>(\n predicate: (event: TInput) => boolean,\n processor: Processor<TState, TInput, TOutput>\n): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n if (predicate(event)) {\n return processor(state, event);\n }\n return [state as TState, []];\n };\n}\n\n/**\n * mapOutput - Transform output events\n *\n * @example\n * ```typescript\n * const withTimestamp = mapOutput(\n * myProcessor,\n * (output) => ({ ...output, processedAt: Date.now() }),\n * );\n * ```\n */\nexport function mapOutput<TState, TInput, TOutput, TMapped>(\n processor: Processor<TState, TInput, TOutput>,\n mapper: (output: TOutput) => TMapped\n): Processor<TState, TInput, TMapped> {\n return (state: Readonly<TState>, event: TInput): [TState, TMapped[]] => {\n const [newState, outputs] = processor(state, event);\n return [newState, outputs.map(mapper)];\n };\n}\n\n/**\n * withLogging - Add logging to a processor (for debugging)\n *\n * @example\n * ```typescript\n * const debugProcessor = withLogging(myProcessor, 'MyProcessor');\n * ```\n */\nexport function withLogging<TState, TInput, TOutput>(\n processor: Processor<TState, TInput, TOutput>,\n name: string,\n logger: {\n debug: (message: string, data?: unknown) => void;\n } = console\n): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n logger.debug(`[${name}] Input:`, { event, state });\n const [newState, outputs] = processor(state, event);\n logger.debug(`[${name}] Output:`, { newState, outputs });\n return [newState, outputs];\n };\n}\n\n/**\n * identityProcessor - A processor that does nothing (useful as default)\n */\nexport function identityProcessor<TState, TEvent>(): Processor<TState, TEvent, TEvent> {\n return (state: Readonly<TState>, _event: TEvent): [TState, TEvent[]] => {\n return [state as TState, []];\n };\n}\n","/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function that assembles complete Message Layer events\n * from Stream Layer events.\n *\n * Input Events (Stream Layer):\n * - message_start\n * - text_delta\n * - tool_use_start\n * - input_json_delta\n * - tool_use_stop\n * - tool_result\n * - message_stop\n *\n * Output Events (Message Layer):\n * - tool_call_message (Message - AI's request to call a tool)\n * - tool_result_message (Message - tool execution result)\n * - assistant_message (Message - complete assistant response)\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n TextDeltaEvent,\n ToolUseStartEvent,\n InputJsonDeltaEvent,\n ToolResultEvent,\n MessageStopEvent,\n // Output: Message events\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n ErrorMessageEvent,\n // Content parts\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"@agentxjs/types/agent\";\n\n// ===== State Types =====\n\n/**\n * Pending content accumulator\n */\nexport interface PendingContent {\n type: \"text\" | \"tool_use\";\n index: number;\n // For text content\n textDeltas?: string[];\n // For tool use\n toolId?: string;\n toolName?: string;\n toolInputJson?: string;\n}\n\n/**\n * Pending tool call info (for matching with tool_result)\n */\nexport interface PendingToolCall {\n id: string;\n name: string;\n}\n\n/**\n * MessageAssemblerState\n *\n * Tracks the state of message assembly from stream events.\n */\nexport interface MessageAssemblerState {\n /**\n * Current message ID being assembled\n */\n currentMessageId: string | null;\n\n /**\n * Timestamp when the current message started\n */\n messageStartTime: number | null;\n\n /**\n * Pending content blocks being accumulated\n * Key is the content block index\n */\n pendingContents: Record<number, PendingContent>;\n\n /**\n * Pending tool calls waiting for results\n * Key is the tool call ID\n */\n pendingToolCalls: Record<string, PendingToolCall>;\n}\n\n/**\n * Initial state factory for MessageAssembler\n */\nexport function createInitialMessageAssemblerState(): MessageAssemblerState {\n return {\n currentMessageId: null,\n messageStartTime: null,\n pendingContents: {},\n pendingToolCalls: {},\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from MessageAssembler\n */\nexport type MessageAssemblerOutput =\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Input event types for MessageAssembler\n */\nexport type MessageAssemblerInput = StreamEvent;\n\n/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function for message assembly.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const messageAssemblerProcessor: Processor<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = (state, input): [MessageAssemblerState, MessageAssemblerOutput[]] => {\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(state, input);\n\n case \"text_delta\":\n return handleTextDelta(state, input);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, input);\n\n case \"input_json_delta\":\n return handleInputJsonDelta(state, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, input);\n\n case \"tool_result\":\n return handleToolResult(state, input);\n\n case \"message_stop\":\n return handleMessageStop(state, input);\n\n case \"error_received\":\n return handleErrorReceived(state, input);\n\n default:\n // Pass through unhandled events (no state change, no output)\n return [state, []];\n }\n};\n\n/**\n * Handle message_start event\n */\nfunction handleMessageStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as MessageStartEvent[\"data\"];\n return [\n {\n ...state,\n currentMessageId: data.messageId,\n messageStartTime: event.timestamp,\n pendingContents: {},\n },\n [],\n ];\n}\n\n/**\n * Handle text_delta event\n */\nfunction handleTextDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as TextDeltaEvent[\"data\"];\n const index = 0; // Text content uses index 0\n const existingContent = state.pendingContents[index];\n\n const pendingContent: PendingContent =\n existingContent?.type === \"text\"\n ? {\n ...existingContent,\n textDeltas: [...(existingContent.textDeltas || []), data.text],\n }\n : {\n type: \"text\",\n index,\n textDeltas: [data.text],\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_start event\n */\nfunction handleToolUseStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as ToolUseStartEvent[\"data\"];\n const index = 1; // Tool use uses index 1\n\n const pendingContent: PendingContent = {\n type: \"tool_use\",\n index,\n toolId: data.toolCallId,\n toolName: data.toolName,\n toolInputJson: \"\",\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle input_json_delta event\n */\nfunction handleInputJsonDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as InputJsonDeltaEvent[\"data\"];\n const index = 1; // Tool use uses index 1\n const existingContent = state.pendingContents[index];\n\n if (!existingContent || existingContent.type !== \"tool_use\") {\n // No pending tool_use content, ignore\n return [state, []];\n }\n\n const pendingContent: PendingContent = {\n ...existingContent,\n toolInputJson: (existingContent.toolInputJson || \"\") + data.partialJson,\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Emits:\n * - tool_call_message (Message Event) - for UI display and tool execution\n */\nfunction handleToolUseStop(\n state: Readonly<MessageAssemblerState>,\n _event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const index = 1;\n const pendingContent = state.pendingContents[index];\n\n if (!pendingContent || pendingContent.type !== \"tool_use\") {\n return [state, []];\n }\n\n // Get tool info from pendingContent (saved during tool_use_start)\n const toolId = pendingContent.toolId || \"\";\n const toolName = pendingContent.toolName || \"\";\n\n // Parse tool input JSON (accumulated during input_json_delta)\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};\n } catch {\n // Failed to parse, use empty object\n toolInput = {};\n }\n\n // Create ToolCallPart\n const toolCall: ToolCallPart = {\n type: \"tool-call\",\n id: toolId,\n name: toolName,\n input: toolInput,\n };\n\n // Emit tool_call_message event (Agent layer event structure)\n const toolCallMessageEvent: ToolCallMessageEvent = {\n type: \"tool_call_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n toolCalls: [toolCall],\n timestamp: Date.now(),\n },\n };\n\n // Remove from pending contents, add to pending tool calls\n const { [index]: _, ...remainingContents } = state.pendingContents;\n\n return [\n {\n ...state,\n pendingContents: remainingContents,\n pendingToolCalls: {\n ...state.pendingToolCalls,\n [toolId]: { id: toolId, name: toolName },\n },\n },\n [toolCallMessageEvent],\n ];\n}\n\n/**\n * Handle tool_result event\n *\n * Emits:\n * - tool_result_message (Message Event) - for UI display\n */\nfunction handleToolResult(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as ToolResultEvent[\"data\"];\n const { toolCallId, result, isError } = data;\n\n // Find pending tool call\n const pendingToolCall = state.pendingToolCalls[toolCallId];\n const toolName = pendingToolCall?.name || \"unknown\";\n\n // Create tool result part\n const toolResult: ToolResultPart = {\n type: \"tool-result\",\n id: toolCallId,\n name: toolName,\n output: {\n type: isError ? \"error-text\" : \"text\",\n value: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n };\n\n // Emit tool_result_message event (Agent layer event structure)\n const toolResultMessageEvent: ToolResultMessageEvent = {\n type: \"tool_result_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n results: [toolResult],\n timestamp: Date.now(),\n },\n };\n\n // Remove from pending tool calls\n const { [toolCallId]: _, ...remainingToolCalls } = state.pendingToolCalls;\n\n return [\n {\n ...state,\n pendingToolCalls: remainingToolCalls,\n },\n [toolResultMessageEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as MessageStopEvent[\"data\"];\n\n if (!state.currentMessageId) {\n return [state, []];\n }\n\n // Assemble all text content\n const textParts: string[] = [];\n const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);\n\n for (const pending of sortedContents) {\n if (pending.type === \"text\" && pending.textDeltas) {\n textParts.push(pending.textDeltas.join(\"\"));\n }\n }\n\n const textContent = textParts.join(\"\");\n\n // Skip empty messages (but preserve pendingToolCalls if stopReason is \"tool_use\")\n const stopReason = data.stopReason;\n if (!textContent || textContent.trim().length === 0) {\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [],\n ];\n }\n\n // Create content parts (new structure uses ContentPart[])\n const contentParts: TextPart[] = [\n {\n type: \"text\",\n text: textContent,\n },\n ];\n\n // Emit AssistantMessageEvent (Agent layer event structure)\n const assistantEvent: AssistantMessageEvent = {\n type: \"assistant_message\",\n timestamp: Date.now(),\n data: {\n messageId: state.currentMessageId,\n content: contentParts,\n stopReason: stopReason,\n timestamp: state.messageStartTime || Date.now(),\n },\n };\n\n // Reset state, but preserve pendingToolCalls if stopReason is \"tool_use\"\n // (tool_result events arrive after message_stop in tool call scenarios)\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [assistantEvent],\n ];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_message (Message Event) - for UI display\n */\nfunction handleErrorReceived(\n _state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n const errorMessageEvent: ErrorMessageEvent = {\n type: \"error_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n content: data.message,\n errorCode: data.errorCode,\n timestamp: Date.now(),\n },\n };\n\n // Reset state on error\n return [createInitialMessageAssemblerState(), [errorMessageEvent]];\n}\n\n/**\n * MessageAssembler Processor Definition\n */\nexport const messageAssemblerProcessorDef: ProcessorDefinition<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = {\n name: \"MessageAssembler\",\n description: \"Assembles complete messages from stream events\",\n initialState: createInitialMessageAssemblerState,\n processor: messageAssemblerProcessor,\n};\n","/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Input Events (Stream Layer):\n * - message_start\n * - message_stop\n * - text_delta (triggers responding state)\n * - tool_use_start\n * - tool_use_stop\n *\n * Output Events (State Layer):\n * - conversation_start\n * - conversation_responding\n * - conversation_end\n * - tool_planned\n * - tool_executing\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n MessageStopEvent,\n ToolUseStartEvent,\n // Output: State events\n ConversationStartEvent,\n ConversationRespondingEvent,\n ConversationEndEvent,\n ConversationInterruptedEvent,\n ToolPlannedEvent,\n ToolExecutingEvent,\n ErrorOccurredEvent,\n} from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/stateEventProcessor\");\n\n// ===== State Types =====\n\n/**\n * StateEventProcessorContext\n *\n * Minimal context needed for event transformation logic.\n * Does NOT track agent state - only auxiliary info for decision-making.\n *\n * Currently empty - no context needed as all information comes from events.\n */\nexport interface StateEventProcessorContext {\n // Empty - all information comes from events\n}\n\n/**\n * Initial context factory for StateEventProcessor\n */\nexport function createInitialStateEventProcessorContext(): StateEventProcessorContext {\n return {};\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Output event types from StateEventProcessor\n */\nexport type StateEventProcessorOutput =\n | ConversationStartEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ErrorOccurredEvent;\n\n/**\n * Input event types for StateEventProcessor\n */\nexport type StateEventProcessorInput = StreamEvent;\n\n/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Design:\n * - Does NOT track agent state (that's StateMachine's job)\n * - Only maintains auxiliary context (timestamps, etc.)\n * - Emits State Events that StateMachine consumes\n *\n * Pattern: (context, input) => [newContext, outputs]\n */\nexport const stateEventProcessor: Processor<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = (context, input): [StateEventProcessorContext, StateEventProcessorOutput[]] => {\n // Log all incoming Stream Events\n logger.debug(`[Stream Event] ${input.type}`, {\n context,\n eventData: \"data\" in input ? input.data : undefined,\n });\n\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(context, input);\n\n case \"message_delta\":\n return handleMessageDelta(context);\n\n case \"message_stop\":\n return handleMessageStop(context, input);\n\n case \"text_delta\":\n return handleTextDelta(context);\n\n case \"tool_use_start\":\n return handleToolUseStart(context, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(context);\n\n case \"error_received\":\n return handleErrorReceived(context, input);\n\n default:\n // Pass through unhandled events\n logger.debug(`[Stream Event] ${input.type} (unhandled)`);\n return [context, []];\n }\n};\n\n/**\n * Handle message_start event\n *\n * Emits: conversation_start\n */\nfunction handleMessageStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as MessageStartEvent[\"data\"];\n\n const conversationStartEvent: ConversationStartEvent = {\n type: \"conversation_start\",\n timestamp: Date.now(),\n data: {\n messageId: data.messageId,\n },\n };\n\n return [context, [conversationStartEvent]];\n}\n\n/**\n * Handle message_delta event\n *\n * No longer needed as stopReason is now in message_stop event.\n * Kept for compatibility with event routing.\n */\nfunction handleMessageDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // No-op: stopReason now comes from message_stop\n return [context, []];\n}\n\n/**\n * Handle message_stop event\n *\n * Emits: conversation_end (only if stopReason is NOT \"tool_use\")\n *\n * This event signals that Claude has finished streaming a message.\n * However, if stopReason is \"tool_use\", the conversation continues\n * because Claude will execute tools and send more messages.\n */\nfunction handleMessageStop(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as MessageStopEvent[\"data\"];\n const stopReason = data.stopReason;\n\n logger.debug(\"message_stop received\", { stopReason });\n\n // If stopReason is \"tool_use\", don't emit conversation_end\n // The conversation continues after tool execution\n if (stopReason === \"tool_use\") {\n logger.debug(\"Skipping conversation_end (tool_use in progress)\");\n return [context, []];\n }\n\n // For all other cases (end_turn, max_tokens, etc.), emit conversation_end\n const conversationEndEvent: ConversationEndEvent = {\n type: \"conversation_end\",\n timestamp: Date.now(),\n data: {\n reason: \"completed\",\n },\n };\n\n return [context, [conversationEndEvent]];\n}\n\n/**\n * Handle text_delta event\n *\n * Emits: conversation_responding\n */\nfunction handleTextDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const respondingEvent: ConversationRespondingEvent = {\n type: \"conversation_responding\",\n timestamp: Date.now(),\n data: {},\n };\n\n return [context, [respondingEvent]];\n}\n\n/**\n * Handle tool_use_start event\n *\n * Emits: tool_planned, tool_executing\n */\nfunction handleToolUseStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as ToolUseStartEvent[\"data\"];\n const outputs: StateEventProcessorOutput[] = [];\n\n // Emit ToolPlannedEvent\n const toolPlannedEvent: ToolPlannedEvent = {\n type: \"tool_planned\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n },\n };\n outputs.push(toolPlannedEvent);\n\n // Emit ToolExecutingEvent\n const toolExecutingEvent: ToolExecutingEvent = {\n type: \"tool_executing\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n input: {},\n },\n };\n outputs.push(toolExecutingEvent);\n\n return [context, outputs];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Pass through - no State Event emitted.\n * StateMachine handles the state transition internally.\n */\nfunction handleToolUseStop(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // Pass through - no State Event\n return [context, []];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_occurred\n */\nfunction handleErrorReceived(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n const errorOccurredEvent: ErrorOccurredEvent = {\n type: \"error_occurred\",\n timestamp: Date.now(),\n data: {\n code: data.errorCode || \"unknown_error\",\n message: data.message,\n recoverable: true,\n },\n };\n\n return [context, [errorOccurredEvent]];\n}\n\n/**\n * StateEvent Processor Definition\n *\n * Stateless event transformer: Stream Events → State Events\n */\nexport const stateEventProcessorDef: ProcessorDefinition<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = {\n name: \"StateEventProcessor\",\n description: \"Transform Stream Events into State Events\",\n initialState: createInitialStateEventProcessorContext,\n processor: stateEventProcessor,\n};\n","/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function that tracks request-response turn pairs.\n *\n * Input Events:\n * - user_message (Message Layer)\n * - message_stop (Stream Layer - contains stop reason)\n * - assistant_message (Message Layer)\n *\n * Output Events (Turn Layer):\n * - turn_request\n * - turn_response\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: combined stream and message events\n StreamEvent,\n AgentMessageEvent,\n MessageStopEvent,\n UserMessageEvent,\n // Output: Turn events\n TurnRequestEvent,\n TurnResponseEvent,\n // Data types\n TokenUsage,\n} from \"@agentxjs/types/agent\";\n\n// ===== State Types =====\n\n/**\n * Pending turn tracking\n */\nexport interface PendingTurn {\n turnId: string;\n messageId: string;\n content: string;\n requestedAt: number;\n}\n\n/**\n * TurnTrackerState\n *\n * Tracks the current turn state.\n */\nexport interface TurnTrackerState {\n /**\n * Currently pending turn (waiting for response)\n */\n pendingTurn: PendingTurn | null;\n\n /**\n * Cost per input token (USD)\n */\n costPerInputToken: number;\n\n /**\n * Cost per output token (USD)\n */\n costPerOutputToken: number;\n}\n\n/**\n * Initial state factory for TurnTracker\n */\nexport function createInitialTurnTrackerState(): TurnTrackerState {\n return {\n pendingTurn: null,\n costPerInputToken: 0.000003, // $3 per 1M tokens\n costPerOutputToken: 0.000015, // $15 per 1M tokens\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from TurnTracker\n */\nexport type TurnTrackerOutput = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Input event types for TurnTracker\n * Accepts both Stream and Message layer events\n */\nexport type TurnTrackerInput = StreamEvent | AgentMessageEvent;\n\n/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function for turn tracking.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const turnTrackerProcessor: Processor<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = (state, input): [TurnTrackerState, TurnTrackerOutput[]] => {\n switch (input.type) {\n case \"user_message\":\n return handleUserMessage(state, input as AgentMessageEvent);\n\n case \"message_stop\":\n return handleMessageStop(state, input as StreamEvent);\n\n case \"assistant_message\":\n // Turn completion is handled in message_stop\n // This handler is kept for potential future use\n return [state, []];\n\n default:\n return [state, []];\n }\n};\n\n/**\n * Handle user_message event\n */\nfunction handleUserMessage(\n state: Readonly<TurnTrackerState>,\n event: AgentMessageEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n const data = event.data as UserMessageEvent[\"data\"];\n const turnId = generateId();\n\n const pendingTurn: PendingTurn = {\n turnId,\n messageId: data.messageId,\n content: data.content,\n requestedAt: event.timestamp,\n };\n\n const turnRequestEvent: TurnRequestEvent = {\n type: \"turn_request\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId: data.messageId,\n content: data.content,\n timestamp: event.timestamp,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn,\n },\n [turnRequestEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<TurnTrackerState>,\n event: StreamEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const data = event.data as MessageStopEvent[\"data\"];\n const stopReason = data.stopReason;\n\n // Complete turn based on stop reason\n // - \"end_turn\": Normal completion (no tool use)\n // - \"tool_use\": Tool calling in progress, DON'T complete yet\n // - \"max_tokens\": Hit token limit, complete turn\n // - \"stop_sequence\": Hit stop sequence, complete turn\n if (stopReason === \"end_turn\" || stopReason === \"max_tokens\" || stopReason === \"stop_sequence\") {\n return completeTurn(state, event.timestamp);\n }\n\n // For tool_use, don't complete turn yet\n return [state, []];\n}\n\n/**\n * Complete the turn and emit TurnResponseEvent\n */\nfunction completeTurn(\n state: Readonly<TurnTrackerState>,\n completedAt: number\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { turnId, messageId, requestedAt } = state.pendingTurn;\n const duration = completedAt - requestedAt;\n\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const turnResponseEvent: TurnResponseEvent = {\n type: \"turn_response\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId,\n duration,\n usage,\n timestamp: completedAt,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn: null,\n },\n [turnResponseEvent],\n ];\n}\n\n/**\n * TurnTracker Processor Definition\n */\nexport const turnTrackerProcessorDef: ProcessorDefinition<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = {\n name: \"TurnTracker\",\n description: \"Tracks request-response turn pairs\",\n initialState: createInitialTurnTrackerState,\n processor: turnTrackerProcessor,\n};\n","/**\n * AgentProcessor\n *\n * Combined Mealy processor for the full AgentX engine.\n * Composes MessageAssembler, StateMachine, and TurnTracker processors.\n */\n\nimport { combineProcessors, combineInitialStates, type Processor } from \"~/engine/mealy\";\n// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)\n// They flow through the system but AgentProcessor doesn't need to import them directly\nimport {\n messageAssemblerProcessor,\n stateEventProcessor,\n turnTrackerProcessor,\n createInitialMessageAssemblerState,\n createInitialStateEventProcessorContext,\n createInitialTurnTrackerState,\n type MessageAssemblerState,\n type StateEventProcessorContext,\n type TurnTrackerState,\n type MessageAssemblerOutput,\n type StateEventProcessorOutput,\n type TurnTrackerOutput,\n} from \"./internal\";\nimport type { AgentOutput } from \"@agentxjs/types/agent\";\n\n/**\n * Combined state type for the full agent engine\n */\nexport type AgentEngineState = {\n messageAssembler: MessageAssemblerState;\n stateEventProcessor: StateEventProcessorContext;\n turnTracker: TurnTrackerState;\n};\n\n/**\n * Input event type for AgentProcessor\n *\n * Accepts:\n * - StreamEventType: Raw stream events from Driver\n * - MessageEventType: Re-injected message events (for TurnTracker)\n *\n * Note: AgentOutput is used because re-injected events can be any output type\n */\nexport type AgentProcessorInput = AgentOutput;\n\n/**\n * Output event type from AgentProcessor\n *\n * Produces:\n * - MessageAssemblerOutput: Assembled message events\n * - StateEventProcessorOutput: State transition events\n * - TurnTrackerOutput: Turn analytics events\n *\n * Note: StreamEventType is NOT in output - it's passed through by AgentEngine\n */\nexport type AgentProcessorOutput =\n | MessageAssemblerOutput\n | StateEventProcessorOutput\n | TurnTrackerOutput;\n\n/**\n * Combined processor for the full agent engine\n *\n * This combines:\n * - MessageAssembler: Stream → Message events\n * - StateEventProcessor: Stream → State events\n * - TurnTracker: Message → Turn events\n *\n * Pattern: (state, input) => [newState, outputs]\n * Key insight: State is means, outputs are the goal (Mealy Machine)\n *\n * Note: Raw StreamEvents are NOT output by this processor.\n * The AgentEngine handles pass-through of original events.\n */\nexport const agentProcessor = combineProcessors<\n AgentEngineState,\n AgentProcessorInput,\n AgentProcessorOutput\n>({\n messageAssembler: messageAssemblerProcessor as unknown as Processor<\n AgentEngineState[\"messageAssembler\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n stateEventProcessor: stateEventProcessor as unknown as Processor<\n AgentEngineState[\"stateEventProcessor\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n turnTracker: turnTrackerProcessor as unknown as Processor<\n AgentEngineState[\"turnTracker\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n});\n\n/**\n * Initial state factory for the full agent engine\n */\nexport const createInitialAgentEngineState = combineInitialStates<AgentEngineState>({\n messageAssembler: createInitialMessageAssemblerState,\n stateEventProcessor: createInitialStateEventProcessorContext,\n turnTracker: createInitialTurnTrackerState,\n});\n","/**\n * MealyMachine - Pure Mealy Machine Event Processor\n *\n * MealyMachine is a stateless event processor that transforms StreamEvents\n * into higher-level events (state, message, turn events).\n *\n * Key Design:\n * - Engine is a pure Mealy Machine: process(agentId, event) → outputs\n * - Engine does NOT hold driver or presenters (those belong to AgentEngine layer)\n * - Engine manages intermediate processing state per agentId\n * - Multiple agents can share the same MealyMachine instance\n *\n * Type Relationship:\n * ```\n * StreamEvent (from Driver)\n * │\n * └── message_start, text_delta, tool_use_start, message_stop...\n * ↓ MealyMachine processes\n * AgentOutput (to AgentEngine/Presenter)\n * │\n * ├── StateEvent (conversation_start, conversation_end...)\n * ├── MessageEvent (assistant_message, tool_call_message...)\n * └── TurnEvent (turn_request, turn_response)\n * ```\n *\n * State Management:\n * - Processing state (pendingContents, etc.) is managed internally per agentId\n * - Business data persistence is NOT handled here - that's AgentEngine layer's job\n *\n * Usage:\n * ```typescript\n * const machine = new MealyMachine();\n *\n * // AgentEngine layer coordinates:\n * // 1. Driver produces StreamEvents\n * // 2. MealyMachine processes events\n * // 3. Presenters handle outputs\n *\n * for await (const streamEvent of driver.receive(message)) {\n * const outputs = machine.process(agentId, streamEvent);\n * for (const output of outputs) {\n * presenters.forEach(p => p.present(agentId, output));\n * }\n * }\n * ```\n */\n\nimport {\n agentProcessor,\n createInitialAgentEngineState,\n type AgentEngineState,\n} from \"./AgentProcessor\";\nimport { MemoryStore } from \"~/engine/mealy\";\nimport type { AgentOutput, StreamEvent } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/MealyMachine\");\n\n/**\n * MealyMachine - Pure Mealy Machine for event processing\n *\n * - Input: StreamEvent (from Driver)\n * - Output: AgentOutput[] (state, message, turn events)\n * - State: Managed internally per agentId\n */\nexport class MealyMachine {\n private readonly store: MemoryStore<AgentEngineState>;\n\n constructor() {\n this.store = new MemoryStore<AgentEngineState>();\n logger.debug(\"MealyMachine initialized\");\n }\n\n /**\n * Process a single driveable event and return output events\n *\n * This is the core Mealy Machine operation:\n * process(agentId, event) → outputs[]\n *\n * @param agentId - The agent identifier (for state isolation)\n * @param event - StreamEvent to process\n * @returns Array of output events (state, message, turn events)\n */\n process(agentId: string, event: StreamEvent): AgentOutput[] {\n const eventType = (event as any).type || \"unknown\";\n logger.debug(\"Processing event\", { agentId, eventType });\n\n // Get current state or create initial state\n const isNewState = !this.store.has(agentId);\n let state = this.store.get(agentId) ?? createInitialAgentEngineState();\n\n if (isNewState) {\n logger.debug(\"Created initial state for agent\", { agentId });\n }\n\n // Collect all outputs\n const allOutputs: AgentOutput[] = [];\n\n // Pass-through: original stream event is also an output\n allOutputs.push(event);\n\n // Process through Mealy Machine\n const [newState, outputs] = agentProcessor(state, event);\n state = newState;\n\n // Collect processor outputs\n for (const output of outputs) {\n allOutputs.push(output);\n\n // Re-inject for event chaining (e.g., TurnTracker needs MessageEvents)\n const [chainedState, chainedOutputs] = this.processChained(state, output);\n state = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n // Store updated state\n this.store.set(agentId, state);\n\n if (outputs.length > 0) {\n logger.debug(\"Produced outputs\", {\n agentId,\n inputEvent: eventType,\n outputCount: allOutputs.length,\n processorOutputs: outputs.length,\n });\n }\n\n return allOutputs;\n }\n\n /**\n * Process chained events recursively\n *\n * Some processors produce events that trigger other processors:\n * - MessageAssembler produces MessageEvents\n * - TurnTracker consumes MessageEvents to produce TurnEvents\n */\n private processChained(\n state: AgentEngineState,\n event: AgentOutput\n ): [AgentEngineState, AgentOutput[]] {\n const [newState, outputs] = agentProcessor(state, event);\n\n if (outputs.length === 0) {\n return [newState, []];\n }\n\n // Process outputs recursively\n const allOutputs: AgentOutput[] = [...outputs];\n let currentState = newState;\n\n for (const output of outputs) {\n const [chainedState, chainedOutputs] = this.processChained(currentState, output);\n currentState = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n return [currentState, allOutputs];\n }\n\n /**\n * Clear state for an agent\n *\n * Call this when an agent is destroyed to free memory.\n */\n clearState(agentId: string): void {\n logger.debug(\"Clearing state\", { agentId });\n this.store.delete(agentId);\n }\n\n /**\n * Check if state exists for an agent\n */\n hasState(agentId: string): boolean {\n return this.store.has(agentId);\n }\n}\n\n/**\n * Factory function to create MealyMachine\n */\nexport function createMealyMachine(): MealyMachine {\n return new MealyMachine();\n}\n","/**\n * AgentStateMachine - State management driven by StateEvents\n *\n * Manages agent state transitions driven by StateEvents.\n * Single source of truth for agent state in AgentEngine.\n *\n * Flow:\n * StreamEvent → MealyMachine → StateEvent → AgentStateMachine → state update\n *\n * Responsibilities:\n * - Process StateEvents\n * - Maintain current AgentState\n * - Notify state change subscribers\n */\n\nimport type {\n AgentState,\n StateChange,\n StateChangeHandler,\n Unsubscribe,\n AgentOutput,\n} from \"@agentxjs/types/agent\";\nimport { isStateEvent } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agent/AgentStateMachine\");\n\n/**\n * AgentStateMachine implementation\n */\nexport class AgentStateMachine {\n private _state: AgentState = \"idle\";\n private readonly handlers = new Set<StateChangeHandler>();\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this._state;\n }\n\n /**\n * Process an event and update internal state if it's a StateEvent\n *\n * @param event - Event from MealyMachine (could be any AgentOutput)\n */\n process(event: AgentOutput): void {\n // Only process StateEvents\n if (!isStateEvent(event)) {\n return;\n }\n\n const prev = this._state;\n const next = this.mapEventToState(event);\n\n if (next !== null && prev !== next) {\n this._state = next;\n logger.debug(\"State transition\", {\n eventType: event.type,\n from: prev,\n to: next,\n });\n this.notifyHandlers({ prev, current: next });\n }\n }\n\n /**\n * Subscribe to state changes\n *\n * @param handler - Callback receiving { prev, current } state change\n * @returns Unsubscribe function\n */\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n this.handlers.add(handler);\n return () => {\n this.handlers.delete(handler);\n };\n }\n\n /**\n * Reset state machine (used on destroy)\n */\n reset(): void {\n const prev = this._state;\n this._state = \"idle\";\n\n // Notify handlers of reset to idle\n if (prev !== \"idle\") {\n this.notifyHandlers({ prev, current: \"idle\" });\n }\n\n this.handlers.clear();\n }\n\n /**\n * Map StateEvent type to AgentState\n *\n * @param event - StateEvent from MealyMachine\n * @returns New AgentState or null if no transition needed\n */\n private mapEventToState(event: AgentOutput): AgentState | null {\n switch (event.type) {\n // Conversation lifecycle\n case \"conversation_start\":\n return \"thinking\";\n case \"conversation_thinking\":\n return \"thinking\";\n case \"conversation_responding\":\n return \"responding\";\n case \"conversation_end\":\n return \"idle\";\n case \"conversation_interrupted\":\n return \"idle\";\n\n // Tool lifecycle\n case \"tool_planned\":\n return \"planning_tool\";\n case \"tool_executing\":\n return \"awaiting_tool_result\";\n case \"tool_completed\":\n return \"responding\";\n case \"tool_failed\":\n return \"responding\";\n\n // Error\n case \"error_occurred\":\n return \"error\";\n\n default:\n // Unknown event type, no state change\n return null;\n }\n }\n\n /**\n * Notify all registered handlers of state change\n */\n private notifyHandlers(change: StateChange): void {\n for (const handler of this.handlers) {\n try {\n handler(change);\n } catch (error) {\n logger.error(\"State change handler error\", {\n from: change.prev,\n to: change.current,\n error,\n });\n }\n }\n }\n}\n","/**\n * createAgent - Factory function to create an AgentEngine\n *\n * Creates a standalone AgentEngine instance with:\n * - Driver: produces StreamEvents\n * - Presenter: consumes AgentOutput\n *\n * AgentEngine is independent of Runtime (Container, Session, Bus).\n * It can be tested in isolation with mock Driver and Presenter.\n */\n\nimport type {\n AgentEngine,\n AgentState,\n AgentOutputCallback,\n Unsubscribe,\n UserMessage,\n MessageQueue,\n StateChangeHandler,\n EventHandlerMap,\n ReactHandlerMap,\n AgentOutput,\n CreateAgentOptions,\n StreamEvent,\n} from \"@agentxjs/types/agent\";\nimport type { AgentMiddleware, AgentInterceptor } from \"@agentxjs/types/agent/internal\";\nimport { MealyMachine } from \"./engine/MealyMachine\";\nimport { AgentStateMachine } from \"./AgentStateMachine\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agent/SimpleAgent\");\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Simple MessageQueue implementation\n */\nclass SimpleMessageQueue implements MessageQueue {\n private queue: UserMessage[] = [];\n\n get length(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n enqueue(message: UserMessage): void {\n this.queue.push(message);\n }\n\n dequeue(): UserMessage | undefined {\n return this.queue.shift();\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * SimpleAgent - Minimal AgentEngine implementation\n */\nclass SimpleAgent implements AgentEngine {\n readonly agentId: string;\n readonly createdAt: number;\n readonly messageQueue: MessageQueue;\n\n private readonly _messageQueue = new SimpleMessageQueue();\n\n private readonly driver: CreateAgentOptions[\"driver\"];\n private readonly presenter: CreateAgentOptions[\"presenter\"];\n private readonly machine: MealyMachine;\n private readonly stateMachine: AgentStateMachine;\n\n private readonly handlers: Set<AgentOutputCallback> = new Set();\n private readonly typeHandlers: Map<string, Set<AgentOutputCallback>> = new Map();\n private readonly readyHandlers: Set<() => void> = new Set();\n private readonly destroyHandlers: Set<() => void> = new Set();\n private readonly middlewares: AgentMiddleware[] = [];\n private readonly interceptors: AgentInterceptor[] = [];\n\n private isProcessing = false;\n\n constructor(options: CreateAgentOptions) {\n this.agentId = generateAgentId();\n this.createdAt = Date.now();\n this.messageQueue = this._messageQueue;\n this.driver = options.driver;\n this.presenter = options.presenter;\n this.machine = new MealyMachine();\n this.stateMachine = new AgentStateMachine();\n }\n\n get state(): AgentState {\n return this.stateMachine.state;\n }\n\n async receive(message: string | UserMessage): Promise<void> {\n console.log(\n \"[SimpleAgent.receive] CALLED with message:\",\n typeof message === \"string\" ? message : message.content\n );\n\n const userMessage: UserMessage =\n typeof message === \"string\"\n ? {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content: message,\n timestamp: Date.now(),\n }\n : message;\n\n // Queue the message\n this._messageQueue.enqueue(userMessage);\n\n console.log(\"[SimpleAgent.receive] Message queued, isProcessing:\", this.isProcessing);\n\n // If already processing, just queue and return a promise that resolves when this message completes\n if (this.isProcessing) {\n return new Promise((resolve, reject) => {\n // Store resolve/reject to call when this message is processed\n (userMessage as any)._resolve = resolve;\n (userMessage as any)._reject = reject;\n });\n }\n\n // Start processing\n console.log(\"[SimpleAgent.receive] Starting processQueue\");\n await this.processQueue();\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n console.log(\"[SimpleAgent.processQueue] Starting, queue size:\", this._messageQueue.length);\n\n while (!this._messageQueue.isEmpty) {\n const message = this._messageQueue.dequeue();\n if (!message) break;\n\n console.log(\"[SimpleAgent.processQueue] Processing message:\", message.id);\n\n try {\n await this.processMessage(message);\n // Resolve the promise if exists\n if ((message as any)._resolve) {\n (message as any)._resolve();\n }\n } catch (error) {\n // Reject the promise if exists\n if ((message as any)._reject) {\n (message as any)._reject(error);\n }\n throw error;\n }\n }\n\n this.isProcessing = false;\n console.log(\"[SimpleAgent.processQueue] Finished\");\n }\n\n private async processMessage(message: UserMessage): Promise<void> {\n console.log(\"[SimpleAgent.processMessage] START, message:\", message.id);\n\n // Run through middleware chain\n let processedMessage = message;\n for (const middleware of this.middlewares) {\n let nextCalled = false;\n await middleware(processedMessage, async (msg) => {\n nextCalled = true;\n processedMessage = msg;\n });\n if (!nextCalled) {\n // Middleware blocked the message\n console.log(\"[SimpleAgent.processMessage] Middleware blocked message\");\n return;\n }\n }\n\n console.log(\"[SimpleAgent.processMessage] Getting driver stream...\");\n const driverStream = this.driver.receive(processedMessage);\n console.log(\"[SimpleAgent.processMessage] Driver stream:\", driverStream);\n\n try {\n console.log(\"[SimpleAgent.processMessage] Starting for-await loop...\");\n for await (const streamEvent of driverStream) {\n this.handleStreamEvent(streamEvent);\n }\n console.log(\"[SimpleAgent.processMessage] For-await loop completed\");\n } catch (error) {\n console.log(\"[SimpleAgent.processMessage] ERROR:\", error);\n // On error, state will be reset by error_occurred StateEvent\n throw error;\n }\n console.log(\"[SimpleAgent.processMessage] END\");\n }\n\n /**\n * Handle a stream event from the driver (push-based API)\n *\n * This method processes a single StreamEvent through the MealyMachine\n * and emits all resulting outputs to presenter and handlers.\n */\n handleStreamEvent(event: StreamEvent): void {\n logger.info(\"handleStreamEvent\", { type: event.type });\n\n // Process through MealyMachine to get all outputs\n // (stream + message + state + turn events)\n const outputs = this.machine.process(this.agentId, event);\n\n logger.info(\"MealyMachine outputs\", {\n count: outputs.length,\n types: outputs.map((o) => o.type),\n });\n\n // Emit all outputs\n for (const output of outputs) {\n // Let StateMachine process StateEvents first\n this.stateMachine.process(output);\n\n // Emit output to presenter and handlers\n this.emitOutput(output);\n }\n }\n\n private emitOutput(output: AgentOutput): void {\n // Run through interceptor chain\n let currentOutput: AgentOutput | null = output;\n\n const runInterceptor = (index: number, out: AgentOutput): void => {\n if (index >= this.interceptors.length) {\n currentOutput = out;\n return;\n }\n this.interceptors[index](out, (nextOut) => {\n runInterceptor(index + 1, nextOut);\n });\n };\n\n runInterceptor(0, output);\n\n if (!currentOutput) return;\n\n // Send to presenter\n this.presenter.present(this.agentId, currentOutput);\n\n // Notify handlers\n for (const handler of this.handlers) {\n try {\n handler(currentOutput);\n } catch (e) {\n console.error(\"Event handler error:\", e);\n }\n }\n\n // Notify type-specific handlers\n const typeSet = this.typeHandlers.get(currentOutput.type);\n if (typeSet) {\n for (const handler of typeSet) {\n try {\n handler(currentOutput);\n } catch (e) {\n console.error(\"Event handler error:\", e);\n }\n }\n }\n }\n\n on(handler: AgentOutputCallback): Unsubscribe;\n on(handlers: EventHandlerMap): Unsubscribe;\n on(type: string, handler: AgentOutputCallback): Unsubscribe;\n on(types: string[], handler: AgentOutputCallback): Unsubscribe;\n on(\n typeOrHandler: string | string[] | AgentOutputCallback | EventHandlerMap,\n handler?: AgentOutputCallback\n ): Unsubscribe {\n // on(handler) - subscribe to all\n if (typeof typeOrHandler === \"function\") {\n this.handlers.add(typeOrHandler);\n return () => this.handlers.delete(typeOrHandler);\n }\n\n // on(handlers: EventHandlerMap)\n if (typeof typeOrHandler === \"object\" && !Array.isArray(typeOrHandler)) {\n const unsubscribes: Unsubscribe[] = [];\n for (const [type, h] of Object.entries(typeOrHandler)) {\n if (h) {\n unsubscribes.push(this.on(type, h));\n }\n }\n return () => unsubscribes.forEach((u) => u());\n }\n\n // on(type, handler) or on(types, handler)\n const types = Array.isArray(typeOrHandler) ? typeOrHandler : [typeOrHandler];\n const h = handler!;\n\n for (const type of types) {\n if (!this.typeHandlers.has(type)) {\n this.typeHandlers.set(type, new Set());\n }\n this.typeHandlers.get(type)!.add(h);\n }\n\n return () => {\n for (const type of types) {\n this.typeHandlers.get(type)?.delete(h);\n }\n };\n }\n\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n return this.stateMachine.onStateChange(handler);\n }\n\n react(handlers: ReactHandlerMap): Unsubscribe {\n // Convert onXxx to event types\n const eventHandlerMap: EventHandlerMap = {};\n for (const [key, handler] of Object.entries(handlers)) {\n if (handler && key.startsWith(\"on\")) {\n // onTextDelta -> text_delta\n const eventType = key\n .slice(2)\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .slice(1);\n eventHandlerMap[eventType] = handler;\n }\n }\n return this.on(eventHandlerMap);\n }\n\n onReady(handler: () => void): Unsubscribe {\n // Call immediately since agent is ready upon creation\n try {\n handler();\n } catch (e) {\n console.error(\"onReady handler error:\", e);\n }\n this.readyHandlers.add(handler);\n return () => this.readyHandlers.delete(handler);\n }\n\n onDestroy(handler: () => void): Unsubscribe {\n this.destroyHandlers.add(handler);\n return () => this.destroyHandlers.delete(handler);\n }\n\n use(middleware: AgentMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n intercept(interceptor: AgentInterceptor): Unsubscribe {\n this.interceptors.push(interceptor);\n return () => {\n const index = this.interceptors.indexOf(interceptor);\n if (index >= 0) {\n this.interceptors.splice(index, 1);\n }\n };\n }\n\n interrupt(): void {\n if (this.state === \"idle\") {\n return;\n }\n this.driver.interrupt();\n // State will be updated by conversation_interrupted StateEvent from driver\n }\n\n async destroy(): Promise<void> {\n // If processing, interrupt first\n if (this.state !== \"idle\") {\n this.interrupt();\n }\n\n // Notify destroy handlers\n for (const handler of this.destroyHandlers) {\n try {\n handler();\n } catch (e) {\n console.error(\"onDestroy handler error:\", e);\n }\n }\n\n // Clear MealyMachine state for this agent\n this.machine.clearState(this.agentId);\n\n // Reset StateMachine\n this.stateMachine.reset();\n\n this._messageQueue.clear();\n this.handlers.clear();\n this.typeHandlers.clear();\n this.readyHandlers.clear();\n this.destroyHandlers.clear();\n this.middlewares.length = 0;\n this.interceptors.length = 0;\n }\n}\n\n/**\n * Create an AgentEngine instance\n */\nexport function createAgent(options: CreateAgentOptions): AgentEngine {\n return new SimpleAgent(options);\n}\n","/**\n * ClaudeReceptor - Perceives Claude SDK responses and emits to SystemBus\n *\n * Converts Claude SDK stream events to DriveableEvents.\n * DriveableEvents are the subset of EnvironmentEvents that can drive Agent.\n *\n * Type Relationship:\n * ```\n * EnvironmentEvent\n * ├── DriveableEvent ← ClaudeReceptor outputs this\n * │ └── message_start, text_delta, message_stop, interrupted...\n * └── ConnectionEvent\n * ```\n */\n\nimport type { Receptor, SystemBusProducer } from \"@agentxjs/types/runtime/internal\";\nimport type {\n DriveableEvent,\n MessageStartEvent,\n MessageStopEvent,\n TextContentBlockStartEvent,\n TextDeltaEvent,\n TextContentBlockStopEvent,\n ToolUseContentBlockStartEvent,\n InputJsonDeltaEvent,\n ToolUseContentBlockStopEvent,\n ToolResultEvent,\n InterruptedEvent,\n ErrorReceivedEvent,\n EventContext,\n} from \"@agentxjs/types/runtime\";\nimport type { SDKPartialAssistantMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { createLogger } from \"@agentxjs/common\";\n\n/**\n * Context for tracking content block state across events\n */\ninterface ContentBlockContext {\n currentBlockType: \"text\" | \"tool_use\" | null;\n currentBlockIndex: number;\n currentToolId: string | null;\n currentToolName: string | null;\n lastStopReason: string | null;\n lastStopSequence: string | null;\n}\n\n/**\n * Metadata passed with each SDK message for event correlation\n */\nexport interface ReceptorMeta {\n requestId: string;\n context: EventContext;\n}\n\nconst logger = createLogger(\"ecosystem/ClaudeReceptor\");\n\n/**\n * ClaudeReceptor - Perceives Claude SDK and emits DriveableEvents to SystemBus\n *\n * Uses SystemBusProducer (write-only) because Receptor only emits events.\n */\nexport class ClaudeReceptor implements Receptor {\n private producer: SystemBusProducer | null = null;\n private currentMeta: ReceptorMeta | null = null;\n\n /** Context for tracking content block state */\n private blockContext: ContentBlockContext = {\n currentBlockType: null,\n currentBlockIndex: 0,\n currentToolId: null,\n currentToolName: null,\n lastStopReason: null,\n lastStopSequence: null,\n };\n\n /**\n * Connect to SystemBus producer to emit events\n */\n connect(producer: SystemBusProducer): void {\n this.producer = producer;\n logger.debug(\"ClaudeReceptor connected to SystemBusProducer\");\n }\n\n /**\n * Feed SDK message to receptor with correlation metadata\n * @param sdkMsg - SDK message from Claude\n * @param meta - Request metadata for event correlation\n */\n feed(sdkMsg: SDKPartialAssistantMessage, meta: ReceptorMeta): void {\n this.currentMeta = meta;\n this.processStreamEvent(sdkMsg);\n }\n\n /**\n * Emit interrupted event\n */\n emitInterrupted(\n reason: \"user_interrupt\" | \"timeout\" | \"error\" | \"system\",\n meta?: ReceptorMeta\n ): void {\n const eventMeta = meta || this.currentMeta;\n this.emitToBus({\n type: \"interrupted\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId: eventMeta?.requestId,\n context: eventMeta?.context,\n data: { reason },\n } as InterruptedEvent);\n }\n\n /**\n * Emit error_received event\n *\n * Used when an error is received from the environment (e.g., Claude API error).\n * This drives the MealyMachine to produce error_occurred + error_message events.\n */\n emitError(message: string, errorCode?: string, meta?: ReceptorMeta): void {\n const eventMeta = meta || this.currentMeta;\n this.emitToBus({\n type: \"error_received\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId: eventMeta?.requestId,\n context: eventMeta?.context,\n data: { message, errorCode },\n } as ErrorReceivedEvent);\n }\n\n /**\n * Feed SDK user message (contains tool_result) to receptor\n * @param sdkMsg - SDK user message from Claude\n * @param meta - Request metadata for event correlation\n */\n feedUserMessage(sdkMsg: { message?: { content?: unknown[] } }, meta: ReceptorMeta): void {\n this.currentMeta = meta;\n const { requestId, context } = meta;\n\n if (!sdkMsg.message || !Array.isArray(sdkMsg.message.content)) {\n return;\n }\n\n for (const block of sdkMsg.message.content) {\n if (block && typeof block === \"object\" && \"type\" in block && block.type === \"tool_result\") {\n const toolResultBlock = block as unknown as {\n tool_use_id: string;\n content: unknown;\n is_error?: boolean;\n };\n\n this.emitToBus({\n type: \"tool_result\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n toolUseId: toolResultBlock.tool_use_id,\n result: toolResultBlock.content,\n isError: toolResultBlock.is_error || false,\n },\n } as ToolResultEvent);\n }\n }\n }\n\n /**\n * Process stream_event from SDK and emit corresponding DriveableEvent\n *\n * Uses currentMeta for requestId and context correlation.\n */\n private processStreamEvent(sdkMsg: SDKPartialAssistantMessage): void {\n const event = sdkMsg.event;\n const { requestId, context } = this.currentMeta || {};\n\n // All DriveableEvents are internal-only (broadcastable: false)\n // They are consumed by BusDriver and processed through MealyMachine\n // BusPresenter will emit the transformed SystemEvents to clients\n\n switch (event.type) {\n case \"message_start\":\n // Reset context on new message\n this.blockContext = {\n currentBlockType: null,\n currentBlockIndex: 0,\n currentToolId: null,\n currentToolName: null,\n lastStopReason: null,\n lastStopSequence: null,\n };\n\n this.emitToBus({\n type: \"message_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n message: {\n id: event.message.id,\n model: event.message.model,\n },\n },\n } as MessageStartEvent);\n break;\n\n case \"content_block_start\": {\n const contentBlock = event.content_block as { type: string; id?: string; name?: string };\n this.blockContext.currentBlockIndex = event.index;\n logger.debug(\"content_block_start received\", { contentBlock, index: event.index });\n\n if (contentBlock.type === \"text\") {\n this.blockContext.currentBlockType = \"text\";\n this.emitToBus({\n type: \"text_content_block_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: event.index,\n requestId,\n context,\n data: {},\n } as TextContentBlockStartEvent);\n } else if (contentBlock.type === \"tool_use\") {\n this.blockContext.currentBlockType = \"tool_use\";\n this.blockContext.currentToolId = contentBlock.id || null;\n this.blockContext.currentToolName = contentBlock.name || null;\n this.emitToBus({\n type: \"tool_use_content_block_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: event.index,\n requestId,\n context,\n data: {\n id: contentBlock.id || \"\",\n name: contentBlock.name || \"\",\n },\n } as ToolUseContentBlockStartEvent);\n }\n break;\n }\n\n case \"content_block_delta\": {\n const delta = event.delta as { type: string; text?: string; partial_json?: string };\n\n if (delta.type === \"text_delta\") {\n this.emitToBus({\n type: \"text_delta\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: { text: delta.text || \"\" },\n } as TextDeltaEvent);\n } else if (delta.type === \"input_json_delta\") {\n this.emitToBus({\n type: \"input_json_delta\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: { partialJson: delta.partial_json || \"\" },\n } as InputJsonDeltaEvent);\n }\n break;\n }\n\n case \"content_block_stop\":\n if (this.blockContext.currentBlockType === \"tool_use\" && this.blockContext.currentToolId) {\n this.emitToBus({\n type: \"tool_use_content_block_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: {},\n } as ToolUseContentBlockStopEvent);\n } else {\n this.emitToBus({\n type: \"text_content_block_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: {},\n } as TextContentBlockStopEvent);\n }\n // Reset current block type after stop\n this.blockContext.currentBlockType = null;\n this.blockContext.currentToolId = null;\n this.blockContext.currentToolName = null;\n break;\n\n case \"message_delta\": {\n const msgDelta = event.delta as { stop_reason?: string; stop_sequence?: string };\n if (msgDelta.stop_reason) {\n this.blockContext.lastStopReason = msgDelta.stop_reason;\n this.blockContext.lastStopSequence = msgDelta.stop_sequence || null;\n }\n break;\n }\n\n case \"message_stop\":\n this.emitToBus({\n type: \"message_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n stopReason:\n (this.blockContext.lastStopReason as\n | \"end_turn\"\n | \"tool_use\"\n | \"max_tokens\"\n | \"stop_sequence\") || \"end_turn\",\n stopSequence: this.blockContext.lastStopSequence || undefined,\n },\n } as MessageStopEvent);\n // Reset after emitting\n this.blockContext.lastStopReason = null;\n this.blockContext.lastStopSequence = null;\n break;\n }\n }\n\n private emitToBus(event: DriveableEvent): void {\n if (this.producer) {\n this.producer.emit(event);\n }\n }\n}\n","/**\n * ClaudeEffector - Listens to SystemBus and sends to Claude SDK\n *\n * Subscribes to user_message events on SystemBus and sends to Claude SDK.\n */\n\nimport type { Effector, SystemBusConsumer } from \"@agentxjs/types/runtime/internal\";\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { EventContext } from \"@agentxjs/types/runtime\";\nimport { query, type SDKUserMessage, type Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Subject } from \"rxjs\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { buildOptions, type EnvironmentContext } from \"./buildOptions\";\nimport { buildSDKUserMessage } from \"./helpers\";\nimport { observableToAsyncIterable } from \"./observableToAsyncIterable\";\nimport type { ClaudeReceptor, ReceptorMeta } from \"./ClaudeReceptor\";\n\nconst logger = createLogger(\"ecosystem/ClaudeEffector\");\n\n/** Default timeout in milliseconds (30 seconds) */\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * ClaudeEffector configuration\n */\nexport interface ClaudeEffectorConfig {\n /** Agent ID for filtering events (required) */\n agentId: string;\n apiKey: string;\n baseUrl?: string;\n model?: string;\n systemPrompt?: string;\n cwd?: string;\n sessionId?: string;\n resumeSessionId?: string;\n onSessionIdCaptured?: (sessionId: string) => void;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * ClaudeEffector - Subscribes to SystemBus and sends to Claude SDK\n *\n * Uses SystemBusConsumer (read-only) because Effector only subscribes to events.\n */\nexport class ClaudeEffector implements Effector {\n private readonly config: ClaudeEffectorConfig;\n private readonly receptor: ClaudeReceptor;\n\n private promptSubject = new Subject<SDKUserMessage>();\n private currentAbortController: AbortController | null = null;\n private claudeQuery: Query | null = null;\n private isInitialized = false;\n private wasInterrupted = false;\n private currentMeta: ReceptorMeta | null = null;\n\n constructor(config: ClaudeEffectorConfig, receptor: ClaudeReceptor) {\n this.config = config;\n this.receptor = receptor;\n }\n\n /**\n * Connect to SystemBus consumer to subscribe to events\n */\n connect(consumer: SystemBusConsumer): void {\n logger.debug(\"ClaudeEffector connected to SystemBusConsumer\", {\n agentId: this.config.agentId,\n });\n\n // Listen for user_message events (with requestId and context)\n // Filter by agentId to only process messages for this agent\n consumer.on(\"user_message\", async (event) => {\n const typedEvent = event as {\n type: string;\n data: UserMessage;\n requestId?: string;\n context?: EventContext;\n };\n\n logger.debug(\"user_message event received\", {\n eventAgentId: typedEvent.context?.agentId,\n myAgentId: this.config.agentId,\n matches: typedEvent.context?.agentId === this.config.agentId,\n });\n\n // Filter by agentId - only process messages for this agent\n if (typedEvent.context?.agentId !== this.config.agentId) {\n return;\n }\n\n const message = typedEvent.data;\n const meta: ReceptorMeta = {\n requestId: typedEvent.requestId || \"\",\n context: typedEvent.context || {},\n };\n await this.send(message, meta);\n });\n\n // Listen for interrupt events\n // Filter by agentId to only process interrupts for this agent\n consumer.on(\"interrupt\", (event) => {\n const typedEvent = event as {\n type: string;\n requestId?: string;\n context?: EventContext;\n };\n\n // Filter by agentId - only process interrupts for this agent\n if (typedEvent.context?.agentId !== this.config.agentId) {\n return;\n }\n\n const meta: ReceptorMeta = {\n requestId: typedEvent.requestId || \"\",\n context: typedEvent.context || {},\n };\n this.interrupt(meta);\n });\n }\n\n /**\n * Send a message to Claude SDK\n */\n private async send(message: UserMessage, meta: ReceptorMeta): Promise<void> {\n this.wasInterrupted = false;\n this.currentAbortController = new AbortController();\n this.currentMeta = meta; // Store for background listener\n\n const timeout = this.config.timeout ?? DEFAULT_TIMEOUT;\n const timeoutId = setTimeout(() => {\n logger.warn(\"Request timeout\", { timeout });\n this.currentAbortController?.abort(new Error(`Request timeout after ${timeout}ms`));\n }, timeout);\n\n try {\n await this.initialize(this.currentAbortController);\n\n const sessionId = this.config.sessionId || \"default\";\n const sdkUserMessage = buildSDKUserMessage(message, sessionId);\n\n logger.debug(\"Sending message to Claude\", {\n content:\n typeof message.content === \"string\" ? message.content.substring(0, 80) : \"[structured]\",\n timeout,\n requestId: meta.requestId,\n });\n\n this.promptSubject.next(sdkUserMessage);\n\n // Process SDK responses\n // Note: We don't await here - background listener handles responses\n // currentMeta stays set until the next send() call\n } finally {\n clearTimeout(timeoutId);\n this.currentAbortController = null;\n this.wasInterrupted = false;\n // Don't clear currentMeta - it's needed by background listener\n // this.currentMeta = null;\n }\n }\n\n /**\n * Interrupt current operation\n */\n private interrupt(meta?: ReceptorMeta): void {\n if (this.claudeQuery) {\n logger.debug(\"Interrupting Claude query\", { requestId: meta?.requestId });\n this.wasInterrupted = true;\n // Store meta for interrupted event\n if (meta) {\n this.currentMeta = meta;\n }\n this.claudeQuery.interrupt().catch((err) => {\n logger.debug(\"SDK interrupt() error (may be expected)\", { error: err });\n });\n }\n }\n\n /**\n * Initialize the Claude SDK query (lazy initialization)\n */\n private async initialize(abortController: AbortController): Promise<void> {\n if (this.isInitialized) return;\n\n logger.info(\"Initializing ClaudeEffector\");\n\n const context: EnvironmentContext = {\n apiKey: this.config.apiKey,\n baseUrl: this.config.baseUrl,\n model: this.config.model,\n systemPrompt: this.config.systemPrompt,\n cwd: this.config.cwd,\n resume: this.config.resumeSessionId,\n };\n\n const sdkOptions = buildOptions(context, abortController);\n const promptStream = observableToAsyncIterable<SDKUserMessage>(this.promptSubject);\n\n this.claudeQuery = query({\n prompt: promptStream,\n options: sdkOptions,\n });\n\n this.isInitialized = true;\n\n // Background listener for SDK responses\n this.startBackgroundListener();\n\n logger.info(\"ClaudeEffector initialized\");\n }\n\n /**\n * Start background listener for SDK responses\n */\n private startBackgroundListener(): void {\n (async () => {\n try {\n for await (const sdkMsg of this.claudeQuery!) {\n // Log all SDK messages for debugging\n logger.debug(\"SDK message received\", {\n type: sdkMsg.type,\n subtype: (sdkMsg as { subtype?: string }).subtype,\n sessionId: sdkMsg.session_id,\n hasCurrentMeta: !!this.currentMeta,\n });\n\n // Forward stream_event to receptor for emission with current meta\n if (sdkMsg.type === \"stream_event\" && this.currentMeta) {\n this.receptor.feed(sdkMsg, this.currentMeta);\n }\n\n // Forward user message (contains tool_result) to receptor\n if (sdkMsg.type === \"user\" && this.currentMeta) {\n this.receptor.feedUserMessage(sdkMsg, this.currentMeta);\n }\n\n // Capture session ID\n if (sdkMsg.session_id && this.config.onSessionIdCaptured) {\n this.config.onSessionIdCaptured(sdkMsg.session_id);\n }\n\n // Handle result\n if (sdkMsg.type === \"result\") {\n const resultMsg = sdkMsg as {\n subtype: string;\n is_error?: boolean;\n errors?: string[];\n error?: { message?: string; type?: string };\n };\n // Log full result object for debugging\n logger.info(\"SDK result received (full)\", {\n fullResult: JSON.stringify(sdkMsg, null, 2),\n });\n logger.info(\"SDK result received\", {\n subtype: resultMsg.subtype,\n isError: resultMsg.is_error,\n errors: resultMsg.errors,\n wasInterrupted: this.wasInterrupted,\n });\n\n // Handle user interrupt\n if (resultMsg.subtype === \"error_during_execution\" && this.wasInterrupted) {\n this.receptor.emitInterrupted(\"user_interrupt\", this.currentMeta || undefined);\n }\n // Handle SDK errors (API errors, rate limits, etc.)\n else if (resultMsg.is_error && this.currentMeta) {\n const fullResult = sdkMsg as {\n result?: string;\n error?: { message?: string; type?: string };\n errors?: string[];\n };\n const errorMessage =\n fullResult.error?.message ||\n fullResult.errors?.join(\", \") ||\n (typeof fullResult.result === \"string\" ? fullResult.result : null) ||\n \"An error occurred\";\n const errorCode = fullResult.error?.type || resultMsg.subtype || \"api_error\";\n this.receptor.emitError(errorMessage, errorCode, this.currentMeta);\n }\n }\n }\n } catch (error) {\n if (this.isAbortError(error)) {\n logger.debug(\"Background listener aborted (expected during interrupt)\");\n this.resetState();\n } else {\n logger.error(\"Background listener error\", { error });\n // Emit error to receptor so it can be displayed in chat\n if (this.currentMeta) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n this.receptor.emitError(errorMessage, \"runtime_error\", this.currentMeta);\n }\n }\n }\n })();\n }\n\n /**\n * Check if an error is an abort error\n */\n private isAbortError(error: unknown): boolean {\n if (error instanceof Error) {\n if (error.name === \"AbortError\") return true;\n if (error.message.includes(\"aborted\")) return true;\n if (error.message.includes(\"abort\")) return true;\n }\n return false;\n }\n\n /**\n * Reset state after abort\n */\n private resetState(): void {\n this.isInitialized = false;\n this.claudeQuery = null;\n this.promptSubject = new Subject<SDKUserMessage>();\n }\n\n /**\n * Dispose and cleanup resources\n */\n dispose(): void {\n logger.debug(\"Disposing ClaudeEffector\");\n\n // Abort any ongoing request\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n // Complete the prompt subject\n this.promptSubject.complete();\n\n // Reset state\n this.resetState();\n }\n}\n","/**\n * Build Claude SDK Options from Environment Config\n *\n * Converts environment configuration to Claude SDK Options format.\n */\n\nimport type { Options } from \"@anthropic-ai/claude-agent-sdk\";\n\n/**\n * Environment context for Claude SDK\n */\nexport interface EnvironmentContext {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n systemPrompt?: string;\n cwd?: string;\n permissionMode?: \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"plan\";\n resume?: string;\n maxTurns?: number;\n maxThinkingTokens?: number;\n}\n\n/**\n * Build Claude SDK options from environment context\n */\nexport function buildOptions(\n context: EnvironmentContext,\n abortController: AbortController\n): Options {\n const options: Options = {\n abortController,\n includePartialMessages: true,\n };\n\n // Working directory\n if (context.cwd) {\n options.cwd = context.cwd;\n }\n\n // Environment variables\n const env: Record<string, string> = {\n ...(process.env as Record<string, string>),\n };\n if (context.baseUrl) {\n env.ANTHROPIC_BASE_URL = context.baseUrl;\n }\n if (context.apiKey) {\n env.ANTHROPIC_API_KEY = context.apiKey;\n }\n options.env = env;\n\n // Note: We don't set options.executable - SDK defaults to 'node' or 'bun'\n // The SDK will automatically find the claude-code CLI\n\n // Model configuration\n if (context.model) options.model = context.model;\n if (context.systemPrompt) options.systemPrompt = context.systemPrompt;\n if (context.maxTurns) options.maxTurns = context.maxTurns;\n if (context.maxThinkingTokens) options.maxThinkingTokens = context.maxThinkingTokens;\n\n // Session control\n if (context.resume) options.resume = context.resume;\n\n // Permission system\n if (context.permissionMode) {\n options.permissionMode = context.permissionMode;\n // Required when using bypassPermissions mode\n if (context.permissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n } else {\n // Default to bypass permissions (agent runs autonomously)\n options.permissionMode = \"bypassPermissions\";\n options.allowDangerouslySkipPermissions = true;\n }\n\n return options;\n}\n","/**\n * Helper functions for Claude Environment\n */\n\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\n\n/**\n * Build prompt string from UserMessage\n */\nexport function buildPrompt(message: UserMessage): string {\n if (typeof message.content === \"string\") {\n return message.content;\n }\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: { type: string }) => part.type === \"text\")\n .map((part: { type: string; text?: string }) => part.text ?? \"\")\n .join(\"\\n\");\n }\n return \"\";\n}\n\n/**\n * Build SDK UserMessage from AgentX UserMessage\n */\nexport function buildSDKUserMessage(message: UserMessage, sessionId: string): SDKUserMessage {\n return {\n type: \"user\",\n message: { role: \"user\", content: buildPrompt(message) },\n parent_tool_use_id: null,\n session_id: sessionId,\n };\n}\n","/**\n * Convert RxJS Observable to AsyncIterable\n *\n * Utility for converting Observable streams to AsyncIterable\n * for use with SDKs that accept AsyncIterable input.\n */\n\nimport type { Observable } from \"rxjs\";\n\nexport async function* observableToAsyncIterable<T>(observable: Observable<T>): AsyncIterable<T> {\n const queue: T[] = [];\n let resolve: ((value: IteratorResult<T>) => void) | null = null;\n let reject: ((error: Error) => void) | null = null;\n let done = false;\n let error: Error | null = null;\n\n const subscription = observable.subscribe({\n next: (value) => {\n if (resolve) {\n resolve({ value, done: false });\n resolve = null;\n reject = null;\n } else {\n queue.push(value);\n }\n },\n error: (err) => {\n error = err instanceof Error ? err : new Error(String(err));\n done = true;\n if (reject) {\n reject(error);\n resolve = null;\n reject = null;\n }\n },\n complete: () => {\n done = true;\n if (resolve) {\n resolve({ value: undefined as any, done: true });\n resolve = null;\n reject = null;\n }\n },\n });\n\n try {\n while (!done || queue.length > 0) {\n if (error) {\n throw error;\n }\n\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (!done) {\n const result = await new Promise<{ value: T; done: false } | { done: true }>((res, rej) => {\n resolve = (iterResult) => {\n if (iterResult.done) {\n done = true;\n res({ done: true });\n } else {\n res({ value: iterResult.value, done: false });\n }\n };\n reject = rej;\n });\n\n if (!result.done) {\n yield result.value;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n}\n","/**\n * ClaudeEnvironment - Claude SDK Environment (Receptor + Effector)\n *\n * Combines:\n * - ClaudeReceptor: Perceives Claude SDK responses → emits to SystemBus\n * - ClaudeEffector: Subscribes to SystemBus → sends to Claude SDK\n *\n * @see packages/types/src/ecosystem/Environment.ts\n */\n\nimport type { Environment, Receptor, Effector } from \"@agentxjs/types/runtime/internal\";\nimport { ClaudeReceptor } from \"./ClaudeReceptor\";\nimport { ClaudeEffector, type ClaudeEffectorConfig } from \"./ClaudeEffector\";\n\n/**\n * ClaudeEnvironment configuration\n */\nexport interface ClaudeEnvironmentConfig extends ClaudeEffectorConfig {}\n\n/**\n * ClaudeEnvironment - Claude SDK Environment\n */\nexport class ClaudeEnvironment implements Environment {\n readonly name = \"claude\";\n readonly receptor: Receptor;\n readonly effector: Effector;\n\n private readonly claudeEffector: ClaudeEffector;\n\n constructor(config: ClaudeEnvironmentConfig) {\n const claudeReceptor = new ClaudeReceptor();\n const claudeEffector = new ClaudeEffector(config, claudeReceptor);\n\n this.receptor = claudeReceptor;\n this.effector = claudeEffector;\n this.claudeEffector = claudeEffector;\n }\n\n /**\n * Dispose environment resources\n */\n dispose(): void {\n this.claudeEffector.dispose();\n }\n}\n","/**\n * RuntimeAgent - Full Agent implementation\n *\n * Combines:\n * - Interactor: User input handling (in)\n * - Driver: DriveableEvent listening (out)\n * - Engine: Event processing (MealyMachine)\n * - Presenter: Event output and persistence\n * - Session: Message storage\n *\n * Architecture:\n * ```\n * AgentInteractor (in) BusDriver (out)\n * │ │\n * │ emit user_message │ listen DriveableEvent\n * ▼ ▼\n * SystemBus ─────────────────────────────────────────\n * │ │\n * ▼ │\n * ClaudeEffector │\n * │ │\n * ▼ │\n * Claude SDK │\n * │ │\n * ▼ │\n * ClaudeReceptor ──────────────────────┘\n * │\n * ▼\n * AgentEngine.handleStreamEvent()\n * │\n * ▼\n * BusPresenter (persist + emit)\n * ```\n */\n\nimport type {\n Agent as RuntimeAgentInterface,\n AgentLifecycle,\n AgentConfig,\n SystemEvent,\n EventCategory,\n ClaudeLLMConfig,\n} from \"@agentxjs/types/runtime\";\nimport type {\n AgentEngine,\n AgentPresenter,\n AgentOutput,\n Message,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n ContentPart,\n ToolCallPart,\n ToolResultPart,\n} from \"@agentxjs/types/agent\";\nimport type {\n SystemBus,\n SystemBusProducer,\n Sandbox,\n Session,\n ImageRepository,\n ImageRecord,\n} from \"@agentxjs/types/runtime/internal\";\nimport { createAgent } from \"@agentxjs/agent\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { BusDriver } from \"./BusDriver\";\nimport { AgentInteractor } from \"./AgentInteractor\";\nimport { ClaudeEnvironment } from \"../environment\";\n\nconst logger = createLogger(\"runtime/RuntimeAgent\");\n\n/**\n * RuntimeAgent configuration\n */\nexport interface RuntimeAgentConfig {\n agentId: string;\n imageId: string;\n containerId: string;\n config: AgentConfig;\n bus: SystemBus;\n sandbox: Sandbox;\n session: Session;\n /** LLM configuration for this agent's environment */\n llmConfig: ClaudeLLMConfig;\n /** Full image record for metadata access */\n image: ImageRecord;\n /** Image repository for persisting metadata */\n imageRepository: ImageRepository;\n}\n\n/**\n * BusPresenter - Forwards AgentOutput to SystemBus as proper SystemEvent\n *\n * Responsibilities:\n * 1. Filter out Stream layer events (already sent via DriveableEvent)\n * 2. Convert State/Message/Turn layer events to SystemEvent format\n * 3. Transform Message layer data to proper Message type for persistence\n *\n * Event Flow:\n * - Stream layer: SKIP (DriveableEvent already handles this)\n * - State layer: Convert to SystemEvent, emit\n * - Message layer: Convert data to Message type, emit, persist\n * - Turn layer: Convert to SystemEvent, emit\n *\n * Note: user_message is now persisted by AgentInteractor, not here.\n */\nclass BusPresenter implements AgentPresenter {\n readonly name = \"BusPresenter\";\n readonly description = \"Forwards AgentOutput to SystemBus and collects messages\";\n\n constructor(\n private readonly producer: SystemBusProducer,\n private readonly session: Session,\n private readonly agentId: string,\n private readonly imageId: string,\n private readonly containerId: string\n ) {}\n\n present(_agentId: string, output: AgentOutput): void {\n const category = this.getCategoryForOutput(output);\n\n // Skip user_message - it's now handled by AgentInteractor\n if (output.type === \"user_message\") {\n return;\n }\n\n // Convert data format based on category\n let data: unknown = output.data;\n if (category === \"message\") {\n data = this.convertToMessage(output);\n }\n\n // Build complete SystemEvent with full context\n // All events from BusPresenter are broadcastable (including stream events for frontend)\n const systemEvent: SystemEvent = {\n type: output.type,\n timestamp: output.timestamp,\n data,\n source: \"agent\",\n category,\n intent: \"notification\",\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n };\n\n this.producer.emit(systemEvent);\n\n // Persist Message layer events to session (except user_message)\n if (category === \"message\") {\n this.session.addMessage(data as Message).catch((err) => {\n logger.error(\"Failed to persist message\", { error: err, messageType: output.type });\n });\n }\n }\n\n /**\n * Convert AgentOutput to proper Message type for persistence\n */\n private convertToMessage(output: AgentOutput): Message {\n const eventData = output.data as Record<string, unknown>;\n const messageId = (eventData.messageId ?? eventData.id) as string;\n const timestamp = (eventData.timestamp as number) || output.timestamp;\n\n switch (output.type) {\n case \"assistant_message\": {\n const content = eventData.content as ContentPart[];\n return {\n id: messageId,\n role: \"assistant\",\n subtype: \"assistant\",\n content,\n timestamp,\n } as AssistantMessage;\n }\n\n case \"tool_call_message\": {\n const toolCalls = eventData.toolCalls as ToolCallPart[];\n const toolCall = toolCalls[0];\n return {\n id: messageId,\n role: \"assistant\",\n subtype: \"tool-call\",\n toolCall,\n timestamp,\n } as ToolCallMessage;\n }\n\n case \"tool_result_message\": {\n const results = eventData.results as ToolResultPart[];\n const toolResult = results[0];\n return {\n id: messageId,\n role: \"tool\",\n subtype: \"tool-result\",\n toolCallId: toolResult.id,\n toolResult,\n timestamp,\n } as ToolResultMessage;\n }\n\n case \"error_message\": {\n const content = eventData.content as string;\n const errorCode = eventData.errorCode as string | undefined;\n return {\n id: messageId,\n role: \"error\",\n subtype: \"error\",\n content,\n errorCode,\n timestamp,\n } as ErrorMessage;\n }\n\n default:\n logger.warn(\"Unknown message type, passing through\", { type: output.type });\n return eventData as unknown as Message;\n }\n }\n\n /**\n * Determine event category from output type\n */\n private getCategoryForOutput(output: AgentOutput): EventCategory {\n const type = output.type;\n\n // Stream events - SKIP these\n if (\n type === \"message_start\" ||\n type === \"message_delta\" ||\n type === \"message_stop\" ||\n type === \"text_delta\" ||\n type === \"tool_use_start\" ||\n type === \"input_json_delta\" ||\n type === \"tool_use_stop\" ||\n type === \"tool_result\"\n ) {\n return \"stream\";\n }\n\n // Message events\n if (\n type === \"user_message\" ||\n type === \"assistant_message\" ||\n type === \"tool_call_message\" ||\n type === \"tool_result_message\" ||\n type === \"error_message\"\n ) {\n return \"message\";\n }\n\n // Turn events\n if (type === \"turn_request\" || type === \"turn_response\") {\n return \"turn\";\n }\n\n // State events (default)\n return \"state\";\n }\n}\n\n/**\n * RuntimeAgent - Full Agent with Interactor + Driver + Engine + Session\n */\nexport class RuntimeAgent implements RuntimeAgentInterface {\n readonly agentId: string;\n readonly imageId: string;\n readonly name: string;\n readonly containerId: string;\n readonly createdAt: number;\n\n private _lifecycle: AgentLifecycle = \"running\";\n private readonly interactor: AgentInteractor;\n private readonly driver: BusDriver;\n private readonly engine: AgentEngine;\n private readonly producer: SystemBusProducer;\n private readonly environment: ClaudeEnvironment;\n private readonly imageRepository: ImageRepository;\n readonly session: Session;\n readonly config: AgentConfig;\n\n constructor(config: RuntimeAgentConfig) {\n this.agentId = config.agentId;\n this.imageId = config.imageId;\n this.name = config.config.name ?? `agent-${config.agentId}`;\n this.containerId = config.containerId;\n this.createdAt = Date.now();\n this.producer = config.bus.asProducer();\n this.session = config.session;\n this.config = config.config;\n this.imageRepository = config.imageRepository;\n\n // Create this agent's own ClaudeEnvironment\n // Resume using stored sdkSessionId if available\n const resumeSessionId = config.image.metadata?.claudeSdkSessionId;\n this.environment = new ClaudeEnvironment({\n agentId: this.agentId,\n apiKey: config.llmConfig.apiKey,\n baseUrl: config.llmConfig.baseUrl,\n model: config.llmConfig.model,\n systemPrompt: config.config.systemPrompt,\n resumeSessionId,\n onSessionIdCaptured: (sdkSessionId) => {\n // Persist sdkSessionId to image metadata for future resume\n this.saveSessionId(sdkSessionId);\n },\n });\n\n // Connect environment to bus\n this.environment.receptor.connect(config.bus.asProducer());\n this.environment.effector.connect(config.bus.asConsumer());\n\n logger.info(\"ClaudeEnvironment created for agent\", {\n agentId: this.agentId,\n imageId: this.imageId,\n resumeSessionId: resumeSessionId ?? \"none\",\n isResume: !!resumeSessionId,\n imageMetadata: config.image.metadata,\n });\n\n // Create Presenter (forwards to bus + persists to session)\n const presenter = new BusPresenter(\n this.producer,\n config.session,\n this.agentId,\n this.imageId,\n this.containerId\n );\n\n // Create Engine (from @agentxjs/agent) - no driver needed for push mode\n // We use a dummy driver since we're using push-based handleStreamEvent\n this.engine = createAgent({\n driver: {\n name: \"DummyDriver\",\n description: \"Placeholder driver for push-based event handling\",\n receive: async function* () {\n // Not used - events are pushed via handleStreamEvent\n },\n interrupt: () => {},\n },\n presenter,\n });\n\n // Create Interactor (handles user input - the \"in\" side)\n this.interactor = new AgentInteractor(this.producer, config.session, {\n agentId: this.agentId,\n imageId: this.imageId,\n containerId: this.containerId,\n sessionId: config.session.sessionId,\n });\n\n // Create Driver (listens for DriveableEvents - the \"out\" side)\n // It pushes events to engine.handleStreamEvent\n this.driver = new BusDriver(config.bus.asConsumer(), {\n agentId: this.agentId,\n onStreamEvent: (event) => {\n logger.debug(\"BusDriver → Engine.handleStreamEvent\", { type: event.type });\n this.engine.handleStreamEvent(event);\n },\n onStreamComplete: (reason) => {\n logger.debug(\"Stream completed\", { reason, agentId: this.agentId });\n },\n });\n\n logger.debug(\"RuntimeAgent created\", {\n agentId: this.agentId,\n imageId: this.imageId,\n });\n }\n\n /**\n * Save SDK session ID to image metadata for future resume\n */\n private saveSessionId(sdkSessionId: string): void {\n logger.info(\"Saving SDK session ID to image metadata\", {\n agentId: this.agentId,\n imageId: this.imageId,\n sdkSessionId,\n });\n this.imageRepository\n .updateMetadata(this.imageId, { claudeSdkSessionId: sdkSessionId })\n .catch((err) => {\n logger.error(\"Failed to save SDK session ID\", { error: err, imageId: this.imageId });\n });\n }\n\n get lifecycle(): AgentLifecycle {\n return this._lifecycle;\n }\n\n /**\n * Receive a message from user\n *\n * @param content - Message content\n * @param requestId - Request ID for correlation\n */\n async receive(content: string, requestId?: string): Promise<void> {\n logger.debug(\"RuntimeAgent.receive called\", {\n agentId: this.agentId,\n contentPreview: content.substring(0, 50),\n requestId,\n });\n\n if (this._lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${this._lifecycle} agent`);\n }\n\n // Use Interactor to handle user input\n // This will: build UserMessage, persist, emit to bus\n // BusDriver will receive DriveableEvents when Claude responds\n await this.interactor.receive(content, requestId || `req_${Date.now()}`);\n\n logger.debug(\"RuntimeAgent.receive completed\", { agentId: this.agentId });\n }\n\n /**\n * Interrupt current operation\n */\n interrupt(requestId?: string): void {\n logger.debug(\"RuntimeAgent.interrupt called\", { agentId: this.agentId, requestId });\n\n // Use Interactor to send interrupt\n this.interactor.interrupt(requestId);\n\n // Emit interrupted event\n this.producer.emit({\n type: \"interrupted\",\n timestamp: Date.now(),\n source: \"agent\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n\n async stop(): Promise<void> {\n if (this._lifecycle === \"destroyed\") {\n throw new Error(\"Cannot stop destroyed agent\");\n }\n this._lifecycle = \"stopped\";\n }\n\n async resume(): Promise<void> {\n if (this._lifecycle === \"destroyed\") {\n throw new Error(\"Cannot resume destroyed agent\");\n }\n this._lifecycle = \"running\";\n\n // Emit session_resumed event\n this.producer.emit({\n type: \"session_resumed\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.session.sessionId,\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n\n async destroy(): Promise<void> {\n if (this._lifecycle !== \"destroyed\") {\n // Dispose driver (stop listening)\n this.driver.dispose();\n\n // Dispose environment (cleanup SDK resources)\n this.environment.dispose();\n\n // Destroy engine\n await this.engine.destroy();\n this._lifecycle = \"destroyed\";\n\n // Emit session_destroyed event\n this.producer.emit({\n type: \"session_destroyed\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.session.sessionId,\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n }\n}\n","/**\n * RuntimeSession - Session implementation\n *\n * Collects messages from Agent and persists to storage.\n */\n\nimport type {\n Session,\n SystemBusProducer,\n SessionRepository,\n SessionRecord,\n} from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\n\n/**\n * RuntimeSession configuration\n */\nexport interface RuntimeSessionConfig {\n sessionId: string;\n imageId: string;\n containerId: string;\n repository: SessionRepository;\n /** Producer for emitting session lifecycle events */\n producer: SystemBusProducer;\n}\n\n/**\n * RuntimeSession - Collects and stores messages\n */\nexport class RuntimeSession implements Session {\n readonly sessionId: string;\n readonly imageId: string;\n readonly containerId: string;\n readonly createdAt: number;\n\n private readonly repository: SessionRepository;\n private readonly producer: SystemBusProducer;\n\n constructor(config: RuntimeSessionConfig) {\n this.sessionId = config.sessionId;\n this.imageId = config.imageId;\n this.containerId = config.containerId;\n this.createdAt = Date.now();\n this.repository = config.repository;\n this.producer = config.producer;\n }\n\n /**\n * Initialize session in storage\n */\n async initialize(): Promise<void> {\n const record: SessionRecord = {\n sessionId: this.sessionId,\n imageId: this.imageId,\n containerId: this.containerId,\n createdAt: this.createdAt,\n updatedAt: this.createdAt,\n };\n await this.repository.saveSession(record);\n\n // Emit session_created event\n this.producer.emit({\n type: \"session_created\",\n timestamp: this.createdAt,\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.sessionId,\n imageId: this.imageId,\n containerId: this.containerId,\n createdAt: this.createdAt,\n },\n context: {\n containerId: this.containerId,\n sessionId: this.sessionId,\n },\n });\n }\n\n async addMessage(message: Message): Promise<void> {\n await this.repository.addMessage(this.sessionId, message);\n\n // Emit message_persisted event\n this.producer.emit({\n type: \"message_persisted\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"persist\",\n intent: \"result\",\n data: {\n sessionId: this.sessionId,\n messageId: message.id,\n savedAt: Date.now(),\n },\n context: {\n containerId: this.containerId,\n sessionId: this.sessionId,\n },\n });\n }\n\n async getMessages(): Promise<Message[]> {\n return this.repository.getMessages(this.sessionId);\n }\n\n async clear(): Promise<void> {\n await this.repository.clearMessages(this.sessionId);\n }\n}\n","/**\n * RuntimeSandbox - Sandbox implementation\n *\n * Provides isolated environment for an Agent:\n * - Workdir: Isolated working directory (create, ensure exists)\n * - MCP: Model Context Protocol tools (future)\n */\n\nimport type { Sandbox, Workdir } from \"@agentxjs/types/runtime/internal\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * RuntimeSandbox configuration\n */\nexport interface RuntimeSandboxConfig {\n agentId: string;\n containerId: string;\n basePath: string;\n}\n\n/**\n * RuntimeWorkdir - Workdir implementation\n */\nclass RuntimeWorkdir implements Workdir {\n readonly id: string;\n readonly name: string;\n readonly path: string;\n\n constructor(agentId: string, path: string) {\n this.id = agentId;\n this.name = `workdir_${agentId}`;\n this.path = path;\n }\n}\n\n/**\n * RuntimeSandbox - Full Sandbox implementation\n */\nexport class RuntimeSandbox implements Sandbox {\n readonly name: string;\n readonly workdir: Workdir;\n\n private initialized = false;\n\n constructor(config: RuntimeSandboxConfig) {\n this.name = `sandbox_${config.agentId}`;\n\n const workdirPath = join(\n config.basePath,\n \"containers\",\n config.containerId,\n \"workdirs\",\n config.agentId\n );\n this.workdir = new RuntimeWorkdir(config.agentId, workdirPath);\n }\n\n /**\n * Initialize sandbox - create directories\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Create workdir\n await mkdir(this.workdir.path, { recursive: true });\n\n this.initialized = true;\n }\n\n /**\n * Cleanup sandbox - remove directories (optional)\n */\n async cleanup(): Promise<void> {\n // Note: We don't delete by default (data preservation)\n // Could add a force delete option if needed\n }\n}\n","/**\n * RuntimeImage - Persistent conversation entity\n *\n * Image is the primary entity that users interact with (displayed as \"conversation\").\n * Agent is a transient runtime instance created from Image.\n *\n * Lifecycle:\n * - create() → ImageRecord (persistent) + SessionRecord (for messages)\n * - run() → Agent (runtime, in-memory)\n * - stop() / server restart → Agent destroyed, Image remains\n */\n\nimport type {\n ImageRecord,\n ImageRepository,\n SessionRepository,\n} from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/RuntimeImage\");\n\n/**\n * Context needed by RuntimeImage\n */\nexport interface RuntimeImageContext {\n imageRepository: ImageRepository;\n sessionRepository: SessionRepository;\n}\n\n/**\n * Configuration for creating a new image\n */\nexport interface ImageCreateConfig {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n}\n\n/**\n * RuntimeImage - Manages conversation persistence\n */\nexport class RuntimeImage {\n private constructor(\n private readonly record: ImageRecord,\n private readonly context: RuntimeImageContext\n ) {}\n\n // ==================== Getters ====================\n\n get imageId(): string {\n return this.record.imageId;\n }\n\n get containerId(): string {\n return this.record.containerId;\n }\n\n get sessionId(): string {\n return this.record.sessionId;\n }\n\n get name(): string {\n return this.record.name;\n }\n\n get description(): string | undefined {\n return this.record.description;\n }\n\n get systemPrompt(): string | undefined {\n return this.record.systemPrompt;\n }\n\n get createdAt(): number {\n return this.record.createdAt;\n }\n\n get updatedAt(): number {\n return this.record.updatedAt;\n }\n\n // ==================== Static Factory Methods ====================\n\n /**\n * Create a new image (conversation)\n */\n static async create(\n config: ImageCreateConfig,\n context: RuntimeImageContext\n ): Promise<RuntimeImage> {\n const now = Date.now();\n const imageId = RuntimeImage.generateImageId();\n const sessionId = RuntimeImage.generateSessionId();\n\n // Create image record\n const record: ImageRecord = {\n imageId,\n containerId: config.containerId,\n sessionId,\n name: config.name ?? \"New Conversation\",\n description: config.description,\n systemPrompt: config.systemPrompt,\n createdAt: now,\n updatedAt: now,\n };\n\n // Persist image\n await context.imageRepository.saveImage(record);\n\n // Create associated session (for message storage)\n await context.sessionRepository.saveSession({\n sessionId,\n imageId,\n containerId: config.containerId,\n createdAt: now,\n updatedAt: now,\n });\n\n logger.info(\"Image created\", {\n imageId,\n sessionId,\n containerId: config.containerId,\n name: record.name,\n });\n return new RuntimeImage(record, context);\n }\n\n /**\n * Load an existing image from storage\n */\n static async load(imageId: string, context: RuntimeImageContext): Promise<RuntimeImage | null> {\n const record = await context.imageRepository.findImageById(imageId);\n if (!record) {\n logger.debug(\"Image not found\", { imageId });\n return null;\n }\n\n logger.debug(\"Image loaded\", { imageId, name: record.name });\n return new RuntimeImage(record, context);\n }\n\n /**\n * List all images in a container\n */\n static async listByContainer(\n containerId: string,\n context: RuntimeImageContext\n ): Promise<ImageRecord[]> {\n return context.imageRepository.findImagesByContainerId(containerId);\n }\n\n /**\n * List all images\n */\n static async listAll(context: RuntimeImageContext): Promise<ImageRecord[]> {\n return context.imageRepository.findAllImages();\n }\n\n // ==================== Instance Methods ====================\n\n /**\n * Get messages for this conversation\n */\n async getMessages(): Promise<Message[]> {\n return this.context.sessionRepository.getMessages(this.sessionId);\n }\n\n /**\n * Update image metadata\n */\n async update(updates: { name?: string; description?: string }): Promise<RuntimeImage> {\n const now = Date.now();\n const updatedRecord: ImageRecord = {\n ...this.record,\n name: updates.name ?? this.record.name,\n description: updates.description ?? this.record.description,\n updatedAt: now,\n };\n\n await this.context.imageRepository.saveImage(updatedRecord);\n\n logger.info(\"Image updated\", { imageId: this.imageId, updates });\n return new RuntimeImage(updatedRecord, this.context);\n }\n\n /**\n * Delete this image and its session\n */\n async delete(): Promise<void> {\n // Delete session first (including messages)\n await this.context.sessionRepository.deleteSession(this.sessionId);\n\n // Delete image\n await this.context.imageRepository.deleteImage(this.imageId);\n\n logger.info(\"Image deleted\", { imageId: this.imageId, sessionId: this.sessionId });\n }\n\n /**\n * Get the underlying record\n */\n toRecord(): ImageRecord {\n return { ...this.record };\n }\n\n // ==================== Private Helpers ====================\n\n private static generateImageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `img_${timestamp}_${random}`;\n }\n\n private static generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `sess_${timestamp}_${random}`;\n }\n}\n","/**\n * RuntimeContainer - Container implementation with agent management\n *\n * Container is an object with behavior. It manages agents internally.\n * In the new Image-First model:\n * - Image is the persistent entity (conversation)\n * - Agent is a transient runtime instance of an Image\n * - Container tracks imageId → agentId mapping\n */\n\nimport type { Container, Agent, ClaudeLLMConfig } from \"@agentxjs/types/runtime\";\nimport type { Persistence, ContainerRecord, ImageRecord } from \"@agentxjs/types\";\nimport type { SystemBus } from \"@agentxjs/types/runtime/internal\";\nimport { RuntimeAgent } from \"./RuntimeAgent\";\nimport { RuntimeSession } from \"./RuntimeSession\";\nimport { RuntimeSandbox } from \"./RuntimeSandbox\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/RuntimeContainer\");\n\n/**\n * Context needed by RuntimeContainer to operate\n */\nexport interface RuntimeContainerContext {\n persistence: Persistence;\n bus: SystemBus;\n /** LLM configuration for creating agent environments */\n llmConfig: ClaudeLLMConfig;\n basePath: string;\n /** Callback when container is disposed */\n onDisposed?: (containerId: string) => void;\n}\n\n/**\n * RuntimeContainer - Full Container implementation\n */\nexport class RuntimeContainer implements Container {\n readonly containerId: string;\n readonly createdAt: number;\n\n /** Map of agentId → RuntimeAgent */\n private readonly agents = new Map<string, RuntimeAgent>();\n /** Map of imageId → agentId (for quick lookup) */\n private readonly imageToAgent = new Map<string, string>();\n private readonly context: RuntimeContainerContext;\n\n private constructor(containerId: string, createdAt: number, context: RuntimeContainerContext) {\n this.containerId = containerId;\n this.createdAt = createdAt;\n this.context = context;\n }\n\n /**\n * Create a new container and persist it\n */\n static async create(\n containerId: string,\n context: RuntimeContainerContext\n ): Promise<RuntimeContainer> {\n const now = Date.now();\n\n // Persist container record\n const record: ContainerRecord = {\n containerId,\n createdAt: now,\n updatedAt: now,\n };\n await context.persistence.containers.saveContainer(record);\n\n const container = new RuntimeContainer(containerId, now, context);\n\n // Emit container_created event\n context.bus.emit({\n type: \"container_created\",\n timestamp: now,\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId,\n createdAt: now,\n },\n context: {\n containerId,\n },\n });\n\n logger.info(\"Container created\", { containerId });\n return container;\n }\n\n /**\n * Load an existing container from persistence\n */\n static async load(\n containerId: string,\n context: RuntimeContainerContext\n ): Promise<RuntimeContainer | null> {\n const record = await context.persistence.containers.findContainerById(containerId);\n if (!record) return null;\n\n logger.info(\"Container loaded\", { containerId });\n return new RuntimeContainer(containerId, record.createdAt, context);\n }\n\n // ==================== Image → Agent Lifecycle ====================\n\n /**\n * Run an image - create or reuse an Agent for the given Image\n * @returns { agent, reused } - the agent and whether it was reused\n */\n async runImage(image: ImageRecord): Promise<{ agent: Agent; reused: boolean }> {\n // Check if agent already exists for this image\n const existingAgentId = this.imageToAgent.get(image.imageId);\n if (existingAgentId) {\n const existingAgent = this.agents.get(existingAgentId);\n if (existingAgent) {\n logger.info(\"Reusing existing agent for image\", {\n containerId: this.containerId,\n imageId: image.imageId,\n agentId: existingAgentId,\n });\n return { agent: existingAgent, reused: true };\n }\n // Agent was destroyed but mapping still exists, clean up\n this.imageToAgent.delete(image.imageId);\n }\n\n // Create new agent for this image\n const agentId = this.generateAgentId();\n\n // Create and initialize Sandbox\n const sandbox = new RuntimeSandbox({\n agentId,\n containerId: this.containerId,\n basePath: this.context.basePath,\n });\n await sandbox.initialize();\n\n // Create Session wrapper (uses existing sessionId from Image)\n const session = new RuntimeSession({\n sessionId: image.sessionId,\n imageId: image.imageId,\n containerId: this.containerId,\n repository: this.context.persistence.sessions,\n producer: this.context.bus.asProducer(),\n });\n // Note: Don't call initialize() - session already exists in storage\n\n // Create RuntimeAgent with its own Environment\n const agent = new RuntimeAgent({\n agentId,\n imageId: image.imageId,\n containerId: this.containerId,\n config: {\n name: image.name,\n description: image.description,\n systemPrompt: image.systemPrompt,\n },\n bus: this.context.bus,\n sandbox,\n session,\n llmConfig: this.context.llmConfig,\n image, // Pass full image record for metadata access\n imageRepository: this.context.persistence.images,\n });\n\n // Register agent and mapping\n this.agents.set(agentId, agent);\n this.imageToAgent.set(image.imageId, agentId);\n\n // Emit agent_registered event\n this.context.bus.emit({\n type: \"agent_registered\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentId,\n definitionName: image.name,\n registeredAt: Date.now(),\n },\n context: {\n containerId: this.containerId,\n agentId,\n },\n });\n\n logger.info(\"Agent created for image\", {\n containerId: this.containerId,\n imageId: image.imageId,\n agentId,\n });\n return { agent, reused: false };\n }\n\n /**\n * Stop an image - destroy the Agent but keep the Image\n */\n async stopImage(imageId: string): Promise<boolean> {\n const agentId = this.imageToAgent.get(imageId);\n if (!agentId) {\n logger.debug(\"Image not running, nothing to stop\", {\n imageId,\n containerId: this.containerId,\n });\n return false;\n }\n\n logger.info(\"Stopping image\", { imageId, agentId, containerId: this.containerId });\n const success = await this.destroyAgent(agentId);\n if (success) {\n this.imageToAgent.delete(imageId);\n logger.info(\"Image stopped\", { imageId, agentId, containerId: this.containerId });\n }\n return success;\n }\n\n /**\n * Get agent ID for an image (if running)\n */\n getAgentIdForImage(imageId: string): string | undefined {\n return this.imageToAgent.get(imageId);\n }\n\n /**\n * Check if an image has a running agent\n */\n isImageOnline(imageId: string): boolean {\n const agentId = this.imageToAgent.get(imageId);\n return agentId !== undefined && this.agents.has(agentId);\n }\n\n /**\n * Get imageId for an agent (reverse lookup)\n */\n getImageIdForAgent(agentId: string): string | undefined {\n for (const [imageId, mappedAgentId] of this.imageToAgent.entries()) {\n if (mappedAgentId === agentId) {\n return imageId;\n }\n }\n return undefined;\n }\n\n getAgent(agentId: string): Agent | undefined {\n return this.agents.get(agentId);\n }\n\n listAgents(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n get agentCount(): number {\n return this.agents.size;\n }\n\n async destroyAgent(agentId: string): Promise<boolean> {\n const agent = this.agents.get(agentId);\n if (!agent) return false;\n\n // Call agent's destroy\n await agent.destroy();\n\n // Remove from registry\n this.agents.delete(agentId);\n\n // Emit agent_unregistered event\n this.context.bus.emit({\n type: \"agent_unregistered\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentId,\n },\n context: {\n containerId: this.containerId,\n agentId,\n },\n });\n\n logger.info(\"Agent destroyed\", { containerId: this.containerId, agentId });\n return true;\n }\n\n async destroyAllAgents(): Promise<void> {\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n }\n\n // ==================== Container Lifecycle ====================\n\n async dispose(): Promise<void> {\n const agentCount = this.agents.size;\n\n // Destroy all agents\n await this.destroyAllAgents();\n\n // Emit container_destroyed event\n this.context.bus.emit({\n type: \"container_destroyed\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentCount,\n },\n context: {\n containerId: this.containerId,\n },\n });\n\n // Notify runtime that this container is disposed\n this.context.onDisposed?.(this.containerId);\n\n logger.info(\"Container disposed\", { containerId: this.containerId, agentCount });\n // Note: Container record stays in persistence (dispose != delete)\n }\n\n // ==================== Private Helpers ====================\n\n private generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `agent_${timestamp}_${random}`;\n }\n}\n","/**\n * BaseEventHandler - Base class for all event handlers\n *\n * Provides unified error handling and event subscription management.\n * All handlers should extend this class to get automatic error boundary.\n *\n * Pattern:\n * ```\n * class MyHandler extends BaseEventHandler {\n * protected bindHandlers() {\n * this.subscribe(\n * this.bus.on(\"some_event\", (e) => this.handleSomeEvent(e))\n * );\n * }\n *\n * private async handleSomeEvent(event) {\n * await this.safeHandleAsync(\n * async () => {\n * // Business logic\n * },\n * {\n * requestId: event.data.requestId,\n * operation: \"some_operation\",\n * }\n * );\n * }\n * }\n * ```\n */\n\nimport type { SystemBus, Unsubscribe, ErrorContext } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemError } from \"@agentxjs/types/event\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/BaseEventHandler\");\n\n/**\n * BaseEventHandler - Abstract base class for event handlers\n */\nexport abstract class BaseEventHandler {\n protected readonly bus: SystemBus;\n private unsubscribes: Unsubscribe[] = [];\n\n constructor(bus: SystemBus) {\n this.bus = bus;\n }\n\n /**\n * Subclasses must implement this to bind event handlers\n */\n protected abstract bindHandlers(): void;\n\n /**\n * Safe execution wrapper for synchronous handlers\n *\n * Automatically catches errors and emits ErrorEvent.\n */\n protected safeHandle<T>(handler: () => T, context: ErrorContext): T | undefined {\n try {\n return handler();\n } catch (err) {\n this.handleError(err, context);\n return undefined;\n }\n }\n\n /**\n * Safe execution wrapper for asynchronous handlers\n *\n * Automatically catches errors and emits ErrorEvent.\n */\n protected async safeHandleAsync<T>(\n handler: () => Promise<T>,\n context: ErrorContext\n ): Promise<T | undefined> {\n try {\n return await handler();\n } catch (err) {\n this.handleError(err, context);\n return undefined;\n }\n }\n\n /**\n * Handle error: log + emit ErrorEvent + optional callback\n */\n protected handleError(err: unknown, context: ErrorContext): void {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n\n // Log error\n logger.error(`Error in ${context.operation || \"handler\"}`, {\n message,\n requestId: context.requestId,\n details: context.details,\n });\n\n // Emit ErrorEvent\n const errorEvent: SystemError = {\n type: \"system_error\",\n timestamp: Date.now(),\n source: context.source || \"command\",\n category: \"error\",\n intent: \"notification\",\n data: {\n message,\n requestId: context.requestId,\n severity: context.severity || \"error\",\n details: {\n operation: context.operation,\n stack,\n ...context.details,\n },\n },\n };\n this.bus.emit(errorEvent);\n\n // Optional error callback (e.g., emit error response)\n if (context.onError) {\n try {\n context.onError(err);\n } catch (callbackErr) {\n logger.error(\"Error in onError callback\", { error: callbackErr });\n }\n }\n }\n\n /**\n * Register subscription and track for cleanup\n */\n protected subscribe(unsubscribe: Unsubscribe): void {\n this.unsubscribes.push(unsubscribe);\n }\n\n /**\n * Dispose handler and cleanup all subscriptions\n */\n dispose(): void {\n for (const unsubscribe of this.unsubscribes) {\n unsubscribe();\n }\n this.unsubscribes = [];\n logger.debug(`${this.constructor.name} disposed`);\n }\n}\n","/**\n * CommandHandler - Handles CommandEvent request/response\n *\n * Listens to command request events on the bus and emits response events.\n * This separates event handling logic from RuntimeImpl resource management.\n *\n * Pattern:\n * ```\n * Bus.emit(container_create_request)\n * → CommandHandler.handleContainerCreate()\n * → Bus.emit(container_create_response)\n * ```\n */\n\nimport type { SystemBus } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemEvent } from \"@agentxjs/types/event\";\nimport { BaseEventHandler } from \"./BaseEventHandler\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/CommandHandler\");\n\n/**\n * Image list item with online status\n */\nexport interface ImageListItemResult {\n imageId: string;\n containerId: string;\n sessionId: string;\n name: string;\n description?: string;\n systemPrompt?: string;\n createdAt: number;\n updatedAt: number;\n online: boolean;\n agentId?: string;\n}\n\n/**\n * Runtime operations interface - what CommandHandler needs to execute commands\n */\nexport interface RuntimeOperations {\n // Container operations\n createContainer(containerId: string): Promise<{ containerId: string }>;\n getContainer(containerId: string): { containerId: string } | undefined;\n listContainers(): { containerId: string }[];\n\n // Agent operations (by agentId)\n getAgent(agentId: string): { agentId: string; containerId: string; imageId: string } | undefined;\n listAgents(containerId: string): { agentId: string; containerId: string; imageId: string }[];\n destroyAgent(agentId: string): Promise<boolean>;\n destroyAllAgents(containerId: string): Promise<void>;\n\n // Agent operations (by imageId - with auto-activation)\n receiveMessage(\n imageId: string | undefined,\n agentId: string | undefined,\n content: string,\n requestId: string\n ): Promise<{ agentId: string; imageId?: string }>;\n interruptAgent(\n imageId: string | undefined,\n agentId: string | undefined,\n requestId?: string\n ): { agentId?: string; imageId?: string };\n\n // Image operations (new model)\n createImage(\n containerId: string,\n config: { name?: string; description?: string; systemPrompt?: string }\n ): Promise<ImageListItemResult>;\n runImage(imageId: string): Promise<{ imageId: string; agentId: string; reused: boolean }>;\n stopImage(imageId: string): Promise<void>;\n updateImage(\n imageId: string,\n updates: { name?: string; description?: string }\n ): Promise<ImageListItemResult>;\n listImages(containerId?: string): Promise<ImageListItemResult[]>;\n getImage(imageId: string): Promise<ImageListItemResult | null>;\n deleteImage(imageId: string): Promise<void>;\n getImageMessages(\n imageId: string\n ): Promise<Array<{ id: string; role: string; content: unknown; timestamp: number }>>;\n}\n\n/**\n * Helper to create a command response event\n */\nfunction createResponse<T extends string, D>(type: T, data: D): SystemEvent {\n return {\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: \"response\",\n intent: \"result\",\n } as SystemEvent;\n}\n\n/**\n * Helper to create a system_error event\n */\nfunction createSystemError(\n message: string,\n requestId: string,\n context: Record<string, unknown>,\n stack?: string\n): SystemEvent {\n return {\n type: \"system_error\",\n timestamp: Date.now(),\n source: \"command\",\n category: \"error\",\n intent: \"notification\",\n data: {\n message,\n requestId,\n severity: \"error\",\n details: stack,\n },\n context,\n } as SystemEvent;\n}\n\n/**\n * CommandHandler - Event handler for command events\n */\nexport class CommandHandler extends BaseEventHandler {\n private readonly ops: RuntimeOperations;\n\n constructor(bus: SystemBus, operations: RuntimeOperations) {\n super(bus);\n this.ops = operations;\n this.bindHandlers();\n logger.debug(\"CommandHandler created\");\n }\n\n /**\n * Log error and emit system_error event\n */\n private emitError(\n operation: string,\n err: unknown,\n requestId: string,\n context: Record<string, unknown>\n ): void {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n\n logger.error(operation, {\n requestId,\n ...context,\n error: errorMessage,\n stack,\n });\n\n this.bus.emit(createSystemError(errorMessage, requestId, context, stack));\n }\n\n /**\n * Bind all command handlers to the bus\n */\n protected bindHandlers(): void {\n // Container commands\n this.subscribe(\n this.bus.onCommand(\"container_create_request\", (event) => this.handleContainerCreate(event))\n );\n this.subscribe(\n this.bus.onCommand(\"container_get_request\", (event) => this.handleContainerGet(event))\n );\n this.subscribe(\n this.bus.onCommand(\"container_list_request\", (event) => this.handleContainerList(event))\n );\n\n // Agent commands\n this.subscribe(this.bus.onCommand(\"agent_get_request\", (event) => this.handleAgentGet(event)));\n this.subscribe(\n this.bus.onCommand(\"agent_list_request\", (event) => this.handleAgentList(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_destroy_request\", (event) => this.handleAgentDestroy(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_destroy_all_request\", (event) => this.handleAgentDestroyAll(event))\n );\n this.subscribe(\n this.bus.onCommand(\"message_send_request\", (event) => this.handleMessageSend(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_interrupt_request\", (event) => this.handleAgentInterrupt(event))\n );\n\n // Image commands\n this.subscribe(\n this.bus.onCommand(\"image_create_request\", (event) => this.handleImageCreate(event))\n );\n this.subscribe(this.bus.onCommand(\"image_run_request\", (event) => this.handleImageRun(event)));\n this.subscribe(\n this.bus.onCommand(\"image_stop_request\", (event) => this.handleImageStop(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_update_request\", (event) => this.handleImageUpdate(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_list_request\", (event) => this.handleImageList(event))\n );\n this.subscribe(this.bus.onCommand(\"image_get_request\", (event) => this.handleImageGet(event)));\n this.subscribe(\n this.bus.onCommand(\"image_delete_request\", (event) => this.handleImageDelete(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_messages_request\", (event) => this.handleImageMessages(event))\n );\n\n logger.debug(\"Command handlers bound\");\n }\n\n // ==================== Container Handlers ====================\n\n private async handleContainerCreate(event: {\n data: { requestId: string; containerId: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling container_create_request\", { requestId, containerId });\n\n try {\n await this.ops.createContainer(containerId);\n this.bus.emit(\n createResponse(\"container_create_response\", {\n requestId,\n containerId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to create container\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"container_create_response\", {\n requestId,\n containerId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private handleContainerGet(event: { data: { requestId: string; containerId: string } }): void {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling container_get_request\", { requestId, containerId });\n\n const container = this.ops.getContainer(containerId);\n this.bus.emit(\n createResponse(\"container_get_response\", {\n requestId,\n containerId: container?.containerId,\n exists: !!container,\n })\n );\n }\n\n private handleContainerList(event: { data: { requestId: string } }): void {\n const { requestId } = event.data;\n logger.debug(\"Handling container_list_request\", { requestId });\n\n const containers = this.ops.listContainers();\n this.bus.emit(\n createResponse(\"container_list_response\", {\n requestId,\n containerIds: containers.map((c) => c.containerId),\n })\n );\n }\n\n // ==================== Agent Handlers ====================\n\n private handleAgentGet(event: { data: { requestId: string; agentId: string } }): void {\n const { requestId, agentId } = event.data;\n logger.debug(\"Handling agent_get_request\", { requestId, agentId });\n\n const agent = this.ops.getAgent(agentId);\n this.bus.emit(\n createResponse(\"agent_get_response\", {\n requestId,\n agentId: agent?.agentId,\n containerId: agent?.containerId,\n exists: !!agent,\n })\n );\n }\n\n private handleAgentList(event: { data: { requestId: string; containerId: string } }): void {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling agent_list_request\", { requestId, containerId });\n\n const agents = this.ops.listAgents(containerId);\n this.bus.emit(\n createResponse(\"agent_list_response\", {\n requestId,\n agents: agents.map((a) => ({\n agentId: a.agentId,\n containerId: a.containerId,\n imageId: a.imageId,\n })),\n })\n );\n }\n\n private async handleAgentDestroy(event: {\n data: { requestId: string; agentId: string };\n }): Promise<void> {\n const { requestId, agentId } = event.data;\n logger.debug(\"Handling agent_destroy_request\", { requestId, agentId });\n\n try {\n const success = await this.ops.destroyAgent(agentId);\n this.bus.emit(\n createResponse(\"agent_destroy_response\", {\n requestId,\n agentId,\n success,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to destroy agent\", err, requestId, { agentId });\n this.bus.emit(\n createResponse(\"agent_destroy_response\", {\n requestId,\n agentId,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleAgentDestroyAll(event: {\n data: { requestId: string; containerId: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling agent_destroy_all_request\", { requestId, containerId });\n\n try {\n await this.ops.destroyAllAgents(containerId);\n this.bus.emit(\n createResponse(\"agent_destroy_all_response\", {\n requestId,\n containerId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to destroy all agents\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"agent_destroy_all_response\", {\n requestId,\n containerId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleMessageSend(event: {\n data: { requestId: string; imageId?: string; agentId?: string; content: string };\n }): Promise<void> {\n const { requestId, imageId, agentId, content } = event.data;\n logger.debug(\"Handling message_send_request\", { requestId, imageId, agentId });\n\n try {\n // Pass requestId for event correlation\n const result = await this.ops.receiveMessage(imageId, agentId, content, requestId);\n this.bus.emit(\n createResponse(\"message_send_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to send message\", err, requestId, { imageId, agentId });\n this.bus.emit(\n createResponse(\"message_send_response\", {\n requestId,\n imageId,\n agentId: agentId ?? \"\",\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private handleAgentInterrupt(event: {\n data: { requestId: string; imageId?: string; agentId?: string };\n }): void {\n const { requestId, imageId, agentId } = event.data;\n logger.debug(\"Handling agent_interrupt_request\", { requestId, imageId, agentId });\n\n try {\n // Pass requestId for event correlation\n const result = this.ops.interruptAgent(imageId, agentId, requestId);\n this.bus.emit(\n createResponse(\"agent_interrupt_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to interrupt agent\", err, requestId, { imageId, agentId });\n this.bus.emit(\n createResponse(\"agent_interrupt_response\", {\n requestId,\n imageId,\n agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n // ==================== Image Handlers ====================\n\n private async handleImageCreate(event: {\n data: {\n requestId: string;\n containerId: string;\n config: { name?: string; description?: string; systemPrompt?: string };\n };\n }): Promise<void> {\n const { requestId, containerId, config } = event.data;\n logger.debug(\"Handling image_create_request\", { requestId, containerId });\n\n try {\n const record = await this.ops.createImage(containerId, config);\n this.bus.emit(\n createResponse(\"image_create_response\", {\n requestId,\n record,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to create image\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"image_create_response\", {\n requestId,\n record: null as unknown as ImageListItemResult,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageRun(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_run_request\", { requestId, imageId });\n\n try {\n const result = await this.ops.runImage(imageId);\n this.bus.emit(\n createResponse(\"image_run_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n reused: result.reused,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to run image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_run_response\", {\n requestId,\n imageId,\n agentId: \"\",\n reused: false,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageStop(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_stop_request\", { requestId, imageId });\n\n try {\n await this.ops.stopImage(imageId);\n this.bus.emit(\n createResponse(\"image_stop_response\", {\n requestId,\n imageId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to stop image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_stop_response\", {\n requestId,\n imageId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageUpdate(event: {\n data: { requestId: string; imageId: string; updates: { name?: string; description?: string } };\n }): Promise<void> {\n const { requestId, imageId, updates } = event.data;\n logger.debug(\"Handling image_update_request\", { requestId, imageId });\n\n try {\n const record = await this.ops.updateImage(imageId, updates);\n this.bus.emit(\n createResponse(\"image_update_response\", {\n requestId,\n record,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to update image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_update_response\", {\n requestId,\n record: null as unknown as ImageListItemResult,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageList(event: {\n data: { requestId: string; containerId?: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling image_list_request\", { requestId, containerId });\n\n try {\n const images = await this.ops.listImages(containerId);\n this.bus.emit(\n createResponse(\"image_list_response\", {\n requestId,\n records: images,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to list images\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"image_list_response\", {\n requestId,\n records: [],\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageGet(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_get_request\", { requestId, imageId });\n\n try {\n const image = await this.ops.getImage(imageId);\n this.bus.emit(\n createResponse(\"image_get_response\", {\n requestId,\n record: image,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to get image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_get_response\", {\n requestId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageDelete(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_delete_request\", { requestId, imageId });\n\n try {\n await this.ops.deleteImage(imageId);\n this.bus.emit(\n createResponse(\"image_delete_response\", {\n requestId,\n imageId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to delete image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_delete_response\", {\n requestId,\n imageId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageMessages(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.info(\"Handling image_messages_request\", { requestId, imageId });\n\n try {\n const messages = await this.ops.getImageMessages(imageId);\n logger.info(\"Got messages for image\", { imageId, count: messages.length });\n this.bus.emit(\n createResponse(\"image_messages_response\", {\n requestId,\n imageId,\n messages,\n })\n );\n logger.info(\"Emitted image_messages_response\", { requestId, imageId });\n } catch (err) {\n this.emitError(\"Failed to get image messages\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_messages_response\", {\n requestId,\n imageId,\n messages: [],\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n // Lifecycle is handled by BaseEventHandler.dispose()\n}\n","/**\n * RuntimeImpl - Event-driven Runtime implementation\n *\n * All operations are delegated to SystemBus. CommandHandler listens\n * for command events and executes the actual operations.\n *\n * Architecture:\n * ```\n * RuntimeImpl (implements Runtime extends SystemBus)\n * │\n * ├── emit/on/onCommand/emitCommand/request ← public API\n * │\n * ├── bus: SystemBusImpl ← actual event handling\n * │\n * └── commandHandler: CommandHandler ← listens for commands, executes operations\n * ```\n */\n\nimport type { Persistence } from \"@agentxjs/types\";\nimport type { Runtime, ClaudeLLMConfig, LLMProvider } from \"@agentxjs/types/runtime\";\nimport type { Agent } from \"@agentxjs/types/runtime\";\nimport type {\n BusEventHandler,\n SubscribeOptions,\n Unsubscribe,\n} from \"@agentxjs/types/runtime/internal\";\nimport type {\n SystemEvent,\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n} from \"@agentxjs/types/event\";\nimport type { RuntimeConfig } from \"./createRuntime\";\nimport type { RuntimeImageContext, RuntimeContainerContext } from \"./internal\";\nimport type { ImageListItemResult } from \"./internal/CommandHandler\";\nimport {\n SystemBusImpl,\n RuntimeImage,\n RuntimeContainer,\n CommandHandler,\n type RuntimeOperations,\n} from \"./internal\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst logger = createLogger(\"runtime/RuntimeImpl\");\n\n/**\n * RuntimeImpl - Implementation of Runtime interface\n *\n * Delegates all SystemBus methods to internal bus instance.\n */\nexport class RuntimeImpl implements Runtime {\n private readonly persistence: Persistence;\n private readonly llmProvider: LLMProvider<ClaudeLLMConfig>;\n private readonly bus: SystemBusImpl;\n private readonly llmConfig: ClaudeLLMConfig;\n private readonly basePath: string;\n private readonly commandHandler: CommandHandler;\n\n /** Container registry: containerId -> RuntimeContainer */\n private readonly containerRegistry = new Map<string, RuntimeContainer>();\n\n constructor(config: RuntimeConfig) {\n logger.info(\"RuntimeImpl constructor start\");\n this.persistence = config.persistence;\n this.llmProvider = config.llmProvider;\n this.basePath = join(homedir(), \".agentx\");\n\n // Create SystemBus\n logger.info(\"Creating SystemBus\");\n this.bus = new SystemBusImpl();\n\n // Get LLM config (each Agent will create its own Environment)\n this.llmConfig = this.llmProvider.provide();\n logger.info(\"LLM config loaded\", {\n hasApiKey: !!this.llmConfig.apiKey,\n model: this.llmConfig.model,\n });\n\n // Create CommandHandler to handle command events\n logger.info(\"Creating CommandHandler\");\n this.commandHandler = new CommandHandler(this.bus, this.createRuntimeOperations());\n\n logger.info(\"RuntimeImpl constructor done\");\n }\n\n // ==================== SystemBus delegation ====================\n\n emit(event: SystemEvent): void {\n this.bus.emit(event);\n }\n\n emitBatch(events: SystemEvent[]): void {\n this.bus.emitBatch(events);\n }\n\n on<T extends string>(\n typeOrTypes: T | string[],\n handler: BusEventHandler<SystemEvent & { type: T }>,\n options?: SubscribeOptions<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.bus.on(typeOrTypes, handler, options);\n }\n\n onAny(handler: BusEventHandler, options?: SubscribeOptions): Unsubscribe {\n return this.bus.onAny(handler, options);\n }\n\n once<T extends string>(\n type: T,\n handler: BusEventHandler<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.bus.once(type, handler);\n }\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n return this.bus.onCommand(type, handler);\n }\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n this.bus.emitCommand(type, data);\n }\n\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout?: number\n ): Promise<ResponseEventFor<T>> {\n return this.bus.request(type, data, timeout);\n }\n\n asConsumer() {\n return this.bus.asConsumer();\n }\n\n asProducer() {\n return this.bus.asProducer();\n }\n\n destroy(): void {\n this.bus.destroy();\n }\n\n // ==================== Runtime Operations (for CommandHandler) ====================\n\n private createRuntimeOperations(): RuntimeOperations {\n return {\n // Container operations\n createContainer: async (containerId: string) => {\n const container = await this.getOrCreateContainer(containerId);\n return { containerId: container.containerId };\n },\n getContainer: (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n return container ? { containerId: container.containerId } : undefined;\n },\n listContainers: () => {\n return Array.from(this.containerRegistry.values()).map((c) => ({\n containerId: c.containerId,\n }));\n },\n\n // Agent operations (by agentId)\n getAgent: (agentId: string) => {\n const agent = this.findAgent(agentId);\n if (!agent) return undefined;\n // Find imageId for this agent\n const imageId = this.findImageIdForAgent(agentId);\n return { agentId: agent.agentId, containerId: agent.containerId, imageId: imageId ?? \"\" };\n },\n listAgents: (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n if (!container) return [];\n return container.listAgents().map((a) => {\n const imageId = this.findImageIdForAgent(a.agentId);\n return { agentId: a.agentId, containerId: a.containerId, imageId: imageId ?? \"\" };\n });\n },\n destroyAgent: async (agentId: string) => {\n for (const container of this.containerRegistry.values()) {\n if (container.getAgent(agentId)) {\n return container.destroyAgent(agentId);\n }\n }\n return false;\n },\n destroyAllAgents: async (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n await container?.destroyAllAgents();\n },\n\n // Agent operations (by imageId - with auto-activation)\n receiveMessage: async (\n imageId: string | undefined,\n agentId: string | undefined,\n content: string,\n requestId: string\n ) => {\n // If imageId provided, auto-activate the image\n if (imageId) {\n logger.debug(\"Receiving message by imageId\", {\n imageId,\n contentLength: content.length,\n requestId,\n });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = await this.getOrCreateContainer(record.containerId);\n const { agent, reused } = await container.runImage(record);\n logger.info(\"Message routed to agent\", {\n imageId,\n agentId: agent.agentId,\n reused,\n requestId,\n });\n // Pass requestId for event correlation\n await agent.receive(content, requestId);\n return { agentId: agent.agentId, imageId };\n }\n\n // Fallback to agentId (legacy)\n if (agentId) {\n logger.debug(\"Receiving message by agentId (legacy)\", {\n agentId,\n contentLength: content.length,\n requestId,\n });\n const agent = this.findAgent(agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n // Pass requestId for event correlation\n await agent.receive(content, requestId);\n const foundImageId = this.findImageIdForAgent(agentId);\n return { agentId, imageId: foundImageId };\n }\n\n throw new Error(\"Either imageId or agentId must be provided\");\n },\n interruptAgent: (\n imageId: string | undefined,\n agentId: string | undefined,\n requestId?: string\n ) => {\n // If imageId provided, find agent for that image\n if (imageId) {\n const foundAgentId = this.findAgentIdForImage(imageId);\n if (!foundAgentId) {\n logger.debug(\"Image is offline, nothing to interrupt\", { imageId });\n return { imageId, agentId: undefined };\n }\n const agent = this.findAgent(foundAgentId);\n if (agent) {\n logger.info(\"Interrupting agent by imageId\", {\n imageId,\n agentId: foundAgentId,\n requestId,\n });\n // Pass requestId for event correlation\n agent.interrupt(requestId);\n }\n return { imageId, agentId: foundAgentId };\n }\n\n // Fallback to agentId (legacy)\n if (agentId) {\n const agent = this.findAgent(agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n logger.info(\"Interrupting agent by agentId (legacy)\", { agentId, requestId });\n // Pass requestId for event correlation\n agent.interrupt(requestId);\n const foundImageId = this.findImageIdForAgent(agentId);\n return { agentId, imageId: foundImageId };\n }\n\n throw new Error(\"Either imageId or agentId must be provided\");\n },\n\n // Image operations (new model)\n createImage: async (\n containerId: string,\n config: { name?: string; description?: string; systemPrompt?: string }\n ) => {\n logger.debug(\"Creating image\", { containerId, name: config.name });\n // Ensure container exists\n await this.getOrCreateContainer(containerId);\n\n // Create image\n const image = await RuntimeImage.create(\n { containerId, ...config },\n this.createImageContext()\n );\n\n logger.info(\"Image created via RuntimeOps\", { imageId: image.imageId, containerId });\n return this.toImageListItemResult(image.toRecord(), false);\n },\n runImage: async (imageId: string) => {\n logger.debug(\"Running image\", { imageId });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = await this.getOrCreateContainer(record.containerId);\n const { agent, reused } = await container.runImage(record);\n logger.info(\"Image running\", { imageId, agentId: agent.agentId, reused });\n return { imageId, agentId: agent.agentId, reused };\n },\n stopImage: async (imageId: string) => {\n logger.debug(\"Stopping image\", { imageId });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = this.containerRegistry.get(record.containerId);\n if (container) {\n await container.stopImage(imageId);\n logger.info(\"Image stopped via RuntimeOps\", { imageId });\n }\n },\n updateImage: async (imageId: string, updates: { name?: string; description?: string }) => {\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (!image) throw new Error(`Image not found: ${imageId}`);\n\n const updatedImage = await image.update(updates);\n const online = this.isImageOnline(imageId);\n return this.toImageListItemResult(updatedImage.toRecord(), online);\n },\n listImages: async (containerId?: string) => {\n const records = containerId\n ? await RuntimeImage.listByContainer(containerId, this.createImageContext())\n : await RuntimeImage.listAll(this.createImageContext());\n\n return records.map((r) => {\n const online = this.isImageOnline(r.imageId);\n return this.toImageListItemResult(r, online);\n });\n },\n getImage: async (imageId: string) => {\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) return null;\n\n const online = this.isImageOnline(imageId);\n return this.toImageListItemResult(record, online);\n },\n deleteImage: async (imageId: string) => {\n logger.debug(\"Deleting image\", { imageId });\n // Stop agent if running\n const agentId = this.findAgentIdForImage(imageId);\n if (agentId) {\n logger.debug(\"Stopping running agent before delete\", { imageId, agentId });\n for (const container of this.containerRegistry.values()) {\n if (container.getAgent(agentId)) {\n await container.destroyAgent(agentId);\n break;\n }\n }\n }\n\n // Delete image (and session)\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (image) {\n await image.delete();\n logger.info(\"Image deleted via RuntimeOps\", { imageId });\n }\n },\n getImageMessages: async (imageId: string) => {\n logger.debug(\"Getting messages for image\", { imageId });\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const messages = await image.getMessages();\n logger.debug(\"Got messages from storage\", { imageId, count: messages.length });\n return messages.map((m) => {\n // Extract content based on message subtype\n let content: unknown;\n let role: string = m.role;\n let errorCode: string | undefined;\n\n if (m.subtype === \"user\" || m.subtype === \"assistant\") {\n content = (m as { content: unknown }).content;\n } else if (m.subtype === \"tool-call\") {\n content = (m as { toolCall: unknown }).toolCall;\n role = \"tool_call\";\n } else if (m.subtype === \"tool-result\") {\n content = (m as { toolResult: unknown }).toolResult;\n role = \"tool_result\";\n } else if (m.subtype === \"error\") {\n content = (m as { content: string }).content;\n role = \"error\";\n errorCode = (m as { errorCode?: string }).errorCode;\n }\n\n return {\n id: m.id,\n role,\n content,\n timestamp: m.timestamp,\n errorCode,\n };\n });\n },\n };\n }\n\n // ==================== Internal Helpers ====================\n\n private async getOrCreateContainer(containerId: string): Promise<RuntimeContainer> {\n // Check if already in memory\n const existing = this.containerRegistry.get(containerId);\n if (existing) return existing;\n\n // Try to load from persistence\n const loaded = await RuntimeContainer.load(containerId, this.createContainerContext());\n if (loaded) {\n this.containerRegistry.set(containerId, loaded);\n return loaded;\n }\n\n // Create new container\n const container = await RuntimeContainer.create(containerId, this.createContainerContext());\n this.containerRegistry.set(containerId, container);\n return container;\n }\n\n private findAgent(agentId: string): Agent | undefined {\n for (const container of this.containerRegistry.values()) {\n const agent = container.getAgent(agentId);\n if (agent) return agent;\n }\n return undefined;\n }\n\n /**\n * Find imageId for a given agentId (reverse lookup)\n */\n private findImageIdForAgent(agentId: string): string | undefined {\n for (const container of this.containerRegistry.values()) {\n const imageId = container.getImageIdForAgent(agentId);\n if (imageId) return imageId;\n }\n return undefined;\n }\n\n /**\n * Find agentId for a given imageId\n */\n private findAgentIdForImage(imageId: string): string | undefined {\n for (const container of this.containerRegistry.values()) {\n const agentId = container.getAgentIdForImage(imageId);\n if (agentId) return agentId;\n }\n return undefined;\n }\n\n /**\n * Check if an image has a running agent\n */\n private isImageOnline(imageId: string): boolean {\n for (const container of this.containerRegistry.values()) {\n if (container.isImageOnline(imageId)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Convert ImageRecord to ImageListItemResult\n */\n private toImageListItemResult(\n record: import(\"@agentxjs/types\").ImageRecord,\n online: boolean\n ): ImageListItemResult {\n const agentId = online ? this.findAgentIdForImage(record.imageId) : undefined;\n return {\n imageId: record.imageId,\n containerId: record.containerId,\n sessionId: record.sessionId,\n name: record.name,\n description: record.description,\n systemPrompt: record.systemPrompt,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n online,\n agentId,\n };\n }\n\n private createContainerContext(): RuntimeContainerContext {\n return {\n persistence: this.persistence,\n bus: this.bus,\n llmConfig: this.llmConfig,\n basePath: this.basePath,\n onDisposed: (containerId) => {\n this.containerRegistry.delete(containerId);\n },\n };\n }\n\n private createImageContext(): RuntimeImageContext {\n return {\n imageRepository: this.persistence.images,\n sessionRepository: this.persistence.sessions,\n };\n }\n\n // ==================== Lifecycle ====================\n\n async dispose(): Promise<void> {\n logger.info(\"Disposing RuntimeImpl\");\n\n // Dispose CommandHandler\n this.commandHandler.dispose();\n\n // Dispose all containers (which destroys all agents and their environments)\n for (const container of this.containerRegistry.values()) {\n await container.dispose();\n }\n\n // Destroy bus\n this.bus.destroy();\n\n // Clear all state\n this.containerRegistry.clear();\n\n logger.info(\"RuntimeImpl disposed\");\n }\n}\n","/**\n * createRuntime - Factory for creating Runtime instances\n */\n\nimport type { Persistence } from \"@agentxjs/types\";\nimport type { Runtime, LLMProvider, ClaudeLLMConfig } from \"@agentxjs/types/runtime\";\nimport type { Environment } from \"@agentxjs/types/runtime/internal\";\nimport { RuntimeImpl } from \"./RuntimeImpl\";\n\n/**\n * Runtime configuration\n */\nexport interface RuntimeConfig {\n /**\n * Persistence layer for data storage\n */\n persistence: Persistence;\n\n /**\n * LLM provider for AI model access\n */\n llmProvider: LLMProvider<ClaudeLLMConfig>;\n\n /**\n * Optional custom environment (for testing)\n * If not provided, ClaudeEnvironment will be created from llmProvider\n */\n environment?: Environment;\n}\n\n/**\n * Create a Runtime instance\n *\n * @param config - Runtime configuration\n * @returns Runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new RuntimeImpl(config);\n}\n","/**\n * PersistenceImpl - Multi-backend Persistence implementation\n *\n * Uses unstorage for backend-agnostic storage.\n * Supports: Memory, FileSystem, Redis, MongoDB, SQLite, MySQL, PostgreSQL\n *\n * @example\n * ```typescript\n * // Memory (default)\n * const persistence = await createPersistence();\n *\n * // SQLite\n * const persistence = await createPersistence({\n * driver: \"sqlite\",\n * path: \"./data.db\",\n * });\n *\n * // PostgreSQL\n * const persistence = await createPersistence({\n * driver: \"postgresql\",\n * url: \"postgres://user:pass@localhost:5432/agentx\",\n * });\n *\n * // Redis\n * const persistence = await createPersistence({\n * driver: \"redis\",\n * url: \"redis://localhost:6379\",\n * });\n * ```\n */\n\nimport { createStorage, type Storage } from \"unstorage\";\nimport type {\n Persistence,\n ImageRepository,\n ContainerRepository,\n SessionRepository,\n} from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\nimport {\n StorageImageRepository,\n StorageContainerRepository,\n StorageSessionRepository,\n} from \"./repository\";\n\nconst logger = createLogger(\"persistence/Persistence\");\n\n/**\n * Storage driver type\n */\nexport type StorageDriver =\n | \"memory\"\n | \"fs\"\n | \"redis\"\n | \"mongodb\"\n | \"sqlite\"\n | \"mysql\"\n | \"postgresql\";\n\n/**\n * Persistence configuration\n */\nexport interface PersistenceConfig {\n /**\n * Storage driver (default: \"memory\")\n */\n driver?: StorageDriver;\n\n /**\n * File path (for sqlite, fs drivers)\n * @example \"./data.db\" for sqlite\n * @example \"./data\" for fs\n */\n path?: string;\n\n /**\n * Connection URL (for redis, mongodb, mysql, postgresql)\n * @example \"redis://localhost:6379\"\n * @example \"mongodb://localhost:27017/agentx\"\n * @example \"mysql://user:pass@localhost:3306/agentx\"\n * @example \"postgres://user:pass@localhost:5432/agentx\"\n */\n url?: string;\n\n /**\n * Custom unstorage instance (advanced)\n */\n storage?: Storage;\n}\n\n/**\n * PersistenceImpl - Multi-backend Persistence implementation\n */\nexport class PersistenceImpl implements Persistence {\n readonly images: ImageRepository;\n readonly containers: ContainerRepository;\n readonly sessions: SessionRepository;\n\n private readonly storage: Storage;\n\n /**\n * Private constructor - use createPersistence() factory function\n */\n private constructor(storage: Storage, driverName: string) {\n this.storage = storage;\n\n // Create repositories\n this.images = new StorageImageRepository(this.storage);\n this.containers = new StorageContainerRepository(this.storage);\n this.sessions = new StorageSessionRepository(this.storage);\n\n logger.info(\"Persistence created\", { driver: driverName });\n }\n\n /**\n * Create a PersistenceImpl instance (async factory)\n */\n static async create(config: PersistenceConfig = {}): Promise<PersistenceImpl> {\n const driverName = config.driver ?? \"memory\";\n const storage = config.storage ?? (await createStorageFromConfig(config));\n return new PersistenceImpl(storage, driverName);\n }\n\n /**\n * Get the underlying storage instance\n */\n getStorage(): Storage {\n return this.storage;\n }\n\n /**\n * Dispose and cleanup resources\n */\n async dispose(): Promise<void> {\n await this.storage.dispose();\n logger.info(\"Persistence disposed\");\n }\n}\n\n/**\n * Create storage instance from config (async for ESM dynamic imports)\n */\nasync function createStorageFromConfig(config: PersistenceConfig): Promise<Storage> {\n const driver = config.driver ?? \"memory\";\n\n switch (driver) {\n case \"memory\":\n return createStorage();\n\n case \"fs\": {\n const { default: fsDriver } = await import(\"unstorage/drivers/fs\");\n return createStorage({\n driver: fsDriver({ base: config.path ?? \"./data\" }),\n });\n }\n\n case \"redis\": {\n const { default: redisDriver } = await import(\"unstorage/drivers/redis\");\n return createStorage({\n driver: redisDriver({ url: config.url ?? \"redis://localhost:6379\" }),\n });\n }\n\n case \"mongodb\": {\n const { default: mongoDriver } = await import(\"unstorage/drivers/mongodb\");\n return createStorage({\n driver: mongoDriver({\n connectionString: config.url ?? \"mongodb://localhost:27017\",\n databaseName: \"agentx\",\n collectionName: \"storage\",\n }),\n });\n }\n\n case \"sqlite\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: sqliteConnector } = await import(\"db0/connectors/better-sqlite3\");\n const database = createDatabase(sqliteConnector({ path: config.path ?? \"./data.db\" }));\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n case \"mysql\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: mysqlConnector } = await import(\"db0/connectors/mysql2\");\n const database = createDatabase(\n mysqlConnector({ uri: config.url ?? \"mysql://localhost:3306/agentx\" })\n );\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n case \"postgresql\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: pgConnector } = await import(\"db0/connectors/postgresql\");\n const database = createDatabase(\n pgConnector({ connectionString: config.url ?? \"postgres://localhost:5432/agentx\" })\n );\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n default:\n throw new Error(`Unknown storage driver: ${driver}`);\n }\n}\n\n/**\n * Create Persistence instance (async)\n *\n * @param config - Configuration options\n * @returns Promise<Persistence> instance\n */\nexport async function createPersistence(config?: PersistenceConfig): Promise<PersistenceImpl> {\n return PersistenceImpl.create(config);\n}\n","/**\n * StorageImageRepository - unstorage-based ImageRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { ImageRepository, ImageRecord, ImageMetadata } from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/ImageRepository\");\n\n/** Key prefix for images */\nconst PREFIX = \"images\";\n\n/** Index prefix for name lookup */\nconst INDEX_BY_NAME = \"idx:images:name\";\n\n/** Index prefix for container lookup */\nconst INDEX_BY_CONTAINER = \"idx:images:container\";\n\n/**\n * StorageImageRepository - unstorage implementation\n */\nexport class StorageImageRepository implements ImageRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(imageId: string): string {\n return `${PREFIX}:${imageId}`;\n }\n\n private nameIndexKey(name: string, imageId: string): string {\n return `${INDEX_BY_NAME}:${name}:${imageId}`;\n }\n\n private containerIndexKey(containerId: string, imageId: string): string {\n return `${INDEX_BY_CONTAINER}:${containerId}:${imageId}`;\n }\n\n async saveImage(record: ImageRecord): Promise<void> {\n // Save main record\n await this.storage.setItem(this.key(record.imageId), record);\n\n // Save index for name lookup\n await this.storage.setItem(this.nameIndexKey(record.name, record.imageId), record.imageId);\n\n // Save index for container lookup\n await this.storage.setItem(\n this.containerIndexKey(record.containerId, record.imageId),\n record.imageId\n );\n\n logger.debug(\"Image saved\", { imageId: record.imageId });\n }\n\n async findImageById(imageId: string): Promise<ImageRecord | null> {\n const record = await this.storage.getItem<ImageRecord>(this.key(imageId));\n return record ?? null;\n }\n\n async findAllImages(): Promise<ImageRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n // Skip index keys\n if (key.startsWith(\"idx:\")) continue;\n\n const record = await this.storage.getItem<ImageRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findImagesByName(name: string): Promise<ImageRecord[]> {\n const indexPrefix = `${INDEX_BY_NAME}:${name}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n const imageId = await this.storage.getItem<string>(key);\n if (imageId) {\n const record = await this.findImageById(imageId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findImagesByContainerId(containerId: string): Promise<ImageRecord[]> {\n const indexPrefix = `${INDEX_BY_CONTAINER}:${containerId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n const imageId = await this.storage.getItem<string>(key);\n if (imageId) {\n const record = await this.findImageById(imageId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteImage(imageId: string): Promise<void> {\n // Get record to find name and containerId for index cleanup\n const record = await this.findImageById(imageId);\n\n // Delete main record\n await this.storage.removeItem(this.key(imageId));\n\n // Delete indexes\n if (record) {\n await this.storage.removeItem(this.nameIndexKey(record.name, imageId));\n await this.storage.removeItem(this.containerIndexKey(record.containerId, imageId));\n }\n\n logger.debug(\"Image deleted\", { imageId });\n }\n\n async imageExists(imageId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(imageId));\n }\n\n async updateMetadata(imageId: string, metadata: Partial<ImageMetadata>): Promise<void> {\n const record = await this.findImageById(imageId);\n if (!record) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Merge metadata\n const updatedRecord: ImageRecord = {\n ...record,\n metadata: {\n ...record.metadata,\n ...metadata,\n },\n updatedAt: Date.now(),\n };\n\n await this.storage.setItem(this.key(imageId), updatedRecord);\n logger.debug(\"Image metadata updated\", { imageId, metadata });\n }\n}\n","/**\n * StorageContainerRepository - unstorage-based ContainerRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { ContainerRepository, ContainerRecord } from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/ContainerRepository\");\n\n/** Key prefix for containers */\nconst PREFIX = \"containers\";\n\n/**\n * StorageContainerRepository - unstorage implementation\n */\nexport class StorageContainerRepository implements ContainerRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(containerId: string): string {\n return `${PREFIX}:${containerId}`;\n }\n\n async saveContainer(record: ContainerRecord): Promise<void> {\n await this.storage.setItem(this.key(record.containerId), record);\n logger.debug(\"Container saved\", { containerId: record.containerId });\n }\n\n async findContainerById(containerId: string): Promise<ContainerRecord | null> {\n const record = await this.storage.getItem<ContainerRecord>(this.key(containerId));\n return record ?? null;\n }\n\n async findAllContainers(): Promise<ContainerRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: ContainerRecord[] = [];\n\n for (const key of keys) {\n const record = await this.storage.getItem<ContainerRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n await this.storage.removeItem(this.key(containerId));\n logger.debug(\"Container deleted\", { containerId });\n }\n\n async containerExists(containerId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(containerId));\n }\n}\n","/**\n * StorageSessionRepository - unstorage-based SessionRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { SessionRepository, SessionRecord } from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/SessionRepository\");\n\n/** Key prefix for sessions */\nconst PREFIX = \"sessions\";\n\n/** Key prefix for messages */\nconst MESSAGES_PREFIX = \"messages\";\n\n/** Index prefix for image lookup */\nconst INDEX_BY_IMAGE = \"idx:sessions:image\";\n\n/** Index prefix for container lookup */\nconst INDEX_BY_CONTAINER = \"idx:sessions:container\";\n\n/**\n * StorageSessionRepository - unstorage implementation\n */\nexport class StorageSessionRepository implements SessionRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(sessionId: string): string {\n return `${PREFIX}:${sessionId}`;\n }\n\n private messagesKey(sessionId: string): string {\n return `${MESSAGES_PREFIX}:${sessionId}`;\n }\n\n private imageIndexKey(imageId: string, sessionId: string): string {\n return `${INDEX_BY_IMAGE}:${imageId}:${sessionId}`;\n }\n\n private containerIndexKey(containerId: string, sessionId: string): string {\n return `${INDEX_BY_CONTAINER}:${containerId}:${sessionId}`;\n }\n\n async saveSession(record: SessionRecord): Promise<void> {\n // Save main record\n await this.storage.setItem(this.key(record.sessionId), record);\n\n // Save index for image lookup\n await this.storage.setItem(\n this.imageIndexKey(record.imageId, record.sessionId),\n record.sessionId\n );\n\n // Save index for container lookup\n await this.storage.setItem(\n this.containerIndexKey(record.containerId, record.sessionId),\n record.sessionId\n );\n\n logger.debug(\"Session saved\", { sessionId: record.sessionId });\n }\n\n async findSessionById(sessionId: string): Promise<SessionRecord | null> {\n const record = await this.storage.getItem<SessionRecord>(this.key(sessionId));\n return record ?? null;\n }\n\n async findSessionByImageId(imageId: string): Promise<SessionRecord | null> {\n const indexPrefix = `${INDEX_BY_IMAGE}:${imageId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n\n if (keys.length === 0) return null;\n\n // Return the first (most recent) session for this image\n const sessionId = await this.storage.getItem<string>(keys[0]);\n if (!sessionId) return null;\n\n return this.findSessionById(sessionId);\n }\n\n async findSessionsByContainerId(containerId: string): Promise<SessionRecord[]> {\n const indexPrefix = `${INDEX_BY_CONTAINER}:${containerId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: SessionRecord[] = [];\n\n for (const key of keys) {\n const sessionId = await this.storage.getItem<string>(key);\n if (sessionId) {\n const record = await this.findSessionById(sessionId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findAllSessions(): Promise<SessionRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: SessionRecord[] = [];\n\n for (const key of keys) {\n // Skip index keys\n if (key.startsWith(\"idx:\")) continue;\n\n const record = await this.storage.getItem<SessionRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n // Get record for index cleanup\n const record = await this.findSessionById(sessionId);\n\n // Delete main record\n await this.storage.removeItem(this.key(sessionId));\n\n // Delete messages\n await this.storage.removeItem(this.messagesKey(sessionId));\n\n // Delete indexes\n if (record) {\n await this.storage.removeItem(this.imageIndexKey(record.imageId, sessionId));\n await this.storage.removeItem(this.containerIndexKey(record.containerId, sessionId));\n }\n\n logger.debug(\"Session deleted\", { sessionId });\n }\n\n async sessionExists(sessionId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(sessionId));\n }\n\n // ==================== Message Operations ====================\n\n async addMessage(sessionId: string, message: Message): Promise<void> {\n const messages = await this.getMessages(sessionId);\n messages.push(message);\n await this.storage.setItem(this.messagesKey(sessionId), messages);\n logger.debug(\"Message added to session\", { sessionId, subtype: message.subtype });\n }\n\n async getMessages(sessionId: string): Promise<Message[]> {\n const messages = await this.storage.getItem<Message[]>(this.messagesKey(sessionId));\n // Ensure we always return an array (handle corrupted data)\n if (!messages || !Array.isArray(messages)) {\n if (messages) {\n logger.warn(\"Messages data is not an array, resetting\", {\n sessionId,\n type: typeof messages,\n });\n }\n return [];\n }\n return messages;\n }\n\n async clearMessages(sessionId: string): Promise<void> {\n await this.storage.removeItem(this.messagesKey(sessionId));\n logger.debug(\"Messages cleared for session\", { sessionId });\n }\n}\n"],"mappings":"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","names":["_ConsoleLogger","logger","logger","shouldPreserveToolCalls","logger","createLogger","handleMessageStart","handleMessageStop","handleTextDelta","handleToolUseStart","handleToolUseStop","handleErrorReceived","generateId","handleMessageStop","logger","createLogger","logger","createLogger","h","logger","import_rxjs","logger","logger","logger","logger","logger","logger","import_node_path","logger","logger","logger","PREFIX","logger","PREFIX","INDEX_BY_CONTAINER","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/internal/SystemBusImpl.ts","../../common/src/logger/ConsoleLogger.ts","../../common/src/logger/LoggerFactoryImpl.ts","../src/internal/BusDriver.ts","../src/internal/AgentInteractor.ts","../../types/src/agent/event/state/index.ts","../../types/src/agent/event/message/index.ts","../../types/src/agent/event/turn/index.ts","../../agent/src/engine/mealy/Store.ts","../../agent/src/engine/mealy/Mealy.ts","../../agent/src/engine/mealy/combinators.ts","../../agent/src/engine/internal/messageAssemblerProcessor.ts","../../agent/src/engine/internal/stateEventProcessor.ts","../../agent/src/engine/internal/turnTrackerProcessor.ts","../../agent/src/engine/AgentProcessor.ts","../../agent/src/engine/MealyMachine.ts","../../agent/src/AgentStateMachine.ts","../../agent/src/createAgent.ts","../src/environment/ClaudeReceptor.ts","../src/environment/ClaudeEffector.ts","../src/environment/buildOptions.ts","../src/environment/helpers.ts","../src/environment/observableToAsyncIterable.ts","../src/environment/ClaudeEnvironment.ts","../src/internal/RuntimeAgent.ts","../src/internal/RuntimeSession.ts","../src/internal/RuntimeSandbox.ts","../src/internal/RuntimeImage.ts","../src/internal/RuntimeContainer.ts","../src/internal/BaseEventHandler.ts","../src/internal/CommandHandler.ts","../src/RuntimeImpl.ts","../src/createRuntime.ts","../src/internal/persistence/PersistenceImpl.ts","../src/internal/persistence/repository/StorageImageRepository.ts","../src/internal/persistence/repository/StorageContainerRepository.ts","../src/internal/persistence/repository/StorageSessionRepository.ts"],"sourcesContent":["/**\n * @agentxjs/runtime - Runtime for AI Agents\n *\n * @example\n * ```typescript\n * import { createRuntime, createPersistence } from \"@agentxjs/runtime\";\n *\n * const runtime = createRuntime({\n * persistence: createPersistence(),\n * });\n *\n * // Use request/response pattern\n * const res = await runtime.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n *\n * runtime.on(\"text_delta\", (e) => console.log(e.data.text));\n *\n * await runtime.dispose();\n * ```\n *\n * @packageDocumentation\n */\n\nexport { createRuntime, type RuntimeConfig } from \"./createRuntime\";\nexport {\n createPersistence,\n type PersistenceConfig,\n type StorageDriver,\n} from \"./internal/persistence\";\n","/**\n * SystemBusImpl - Central event bus implementation\n *\n * Pub/Sub event bus for runtime communication.\n */\n\nimport type {\n SystemBus,\n SystemBusProducer,\n SystemBusConsumer,\n BusEventHandler,\n SubscribeOptions,\n Unsubscribe,\n} from \"@agentxjs/types/runtime/internal\";\nimport type {\n SystemEvent,\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n CommandRequestResponseMap,\n} from \"@agentxjs/types/event\";\nimport { Subject } from \"rxjs\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/SystemBusImpl\");\n\n/**\n * Internal subscription record\n */\ninterface Subscription {\n id: number;\n type: string | string[] | \"*\";\n handler: BusEventHandler;\n filter?: (event: SystemEvent) => boolean;\n priority: number;\n once: boolean;\n}\n\n/**\n * SystemBus implementation using RxJS Subject\n */\nexport class SystemBusImpl implements SystemBus {\n private readonly subject = new Subject<SystemEvent>();\n private subscriptions: Subscription[] = [];\n private nextId = 0;\n private isDestroyed = false;\n\n // Cached restricted views\n private producerView: SystemBusProducer | null = null;\n private consumerView: SystemBusConsumer | null = null;\n\n constructor() {\n this.subject.subscribe((event) => {\n this.dispatch(event);\n });\n }\n\n emit(event: SystemEvent): void {\n if (this.isDestroyed) return;\n this.subject.next(event);\n }\n\n emitBatch(events: SystemEvent[]): void {\n for (const event of events) {\n this.emit(event);\n }\n }\n\n on<T extends string>(\n typeOrTypes: T | string[],\n handler: BusEventHandler<SystemEvent & { type: T }>,\n options?: SubscribeOptions<SystemEvent & { type: T }>\n ): Unsubscribe {\n if (this.isDestroyed) return () => {};\n\n const subscription: Subscription = {\n id: this.nextId++,\n type: typeOrTypes,\n handler: handler as BusEventHandler,\n filter: options?.filter as ((event: SystemEvent) => boolean) | undefined,\n priority: options?.priority ?? 0,\n once: options?.once ?? false,\n };\n\n this.subscriptions.push(subscription);\n this.sortByPriority();\n\n return () => this.removeSubscription(subscription.id);\n }\n\n onAny(handler: BusEventHandler, options?: SubscribeOptions): Unsubscribe {\n if (this.isDestroyed) return () => {};\n\n const subscription: Subscription = {\n id: this.nextId++,\n type: \"*\",\n handler,\n filter: options?.filter as ((event: SystemEvent) => boolean) | undefined,\n priority: options?.priority ?? 0,\n once: options?.once ?? false,\n };\n\n this.subscriptions.push(subscription);\n this.sortByPriority();\n\n return () => this.removeSubscription(subscription.id);\n }\n\n once<T extends string>(\n type: T,\n handler: BusEventHandler<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.on(type, handler, { once: true });\n }\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n // Reuse the existing on() implementation with type casting\n return this.on(type as string, handler as BusEventHandler);\n }\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n this.emit({\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: type.endsWith(\"_response\") ? \"response\" : \"request\",\n intent: type.endsWith(\"_response\") ? \"result\" : \"request\",\n } as SystemEvent);\n }\n\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout: number = 30000\n ): Promise<ResponseEventFor<T>> {\n return new Promise((resolve, reject) => {\n const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n // Get response type from request type\n const responseType = type.replace(\"_request\", \"_response\") as CommandRequestResponseMap[T];\n\n // Set up timeout\n const timer = setTimeout(() => {\n unsubscribe();\n reject(new Error(`Request timeout: ${type}`));\n }, timeout);\n\n // Listen for response\n const unsubscribe = this.onCommand(responseType, (event) => {\n // Match by requestId\n if ((event.data as { requestId: string }).requestId === requestId) {\n clearTimeout(timer);\n unsubscribe();\n resolve(event as ResponseEventFor<T>);\n }\n });\n\n // Emit request with generated requestId\n this.emitCommand(type, { ...data, requestId } as CommandEventMap[T][\"data\"]);\n });\n }\n\n destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n this.subscriptions = [];\n this.subject.complete();\n }\n\n private dispatch(event: SystemEvent): void {\n const toRemove: number[] = [];\n\n for (const sub of this.subscriptions) {\n if (!this.matchesType(sub.type, event.type)) continue;\n if (sub.filter && !sub.filter(event)) continue;\n\n try {\n sub.handler(event);\n } catch (err) {\n logger.error(\"Event handler error\", {\n eventType: event.type,\n subscriptionType: sub.type,\n error: err instanceof Error ? err.message : String(err),\n stack: err instanceof Error ? err.stack : undefined,\n });\n }\n\n if (sub.once) {\n toRemove.push(sub.id);\n }\n }\n\n for (const id of toRemove) {\n this.removeSubscription(id);\n }\n }\n\n private matchesType(subscriptionType: string | string[] | \"*\", eventType: string): boolean {\n if (subscriptionType === \"*\") return true;\n if (Array.isArray(subscriptionType)) return subscriptionType.includes(eventType);\n return subscriptionType === eventType;\n }\n\n private sortByPriority(): void {\n this.subscriptions.sort((a, b) => b.priority - a.priority);\n }\n\n private removeSubscription(id: number): void {\n this.subscriptions = this.subscriptions.filter((s) => s.id !== id);\n }\n\n /**\n * Get a read-only consumer view (only subscribe methods)\n */\n asConsumer(): SystemBusConsumer {\n if (!this.consumerView) {\n this.consumerView = {\n on: this.on.bind(this),\n onAny: this.onAny.bind(this),\n once: this.once.bind(this),\n onCommand: this.onCommand.bind(this),\n request: this.request.bind(this),\n };\n }\n return this.consumerView;\n }\n\n /**\n * Get a write-only producer view (only emit methods)\n */\n asProducer(): SystemBusProducer {\n if (!this.producerView) {\n this.producerView = {\n emit: this.emit.bind(this),\n emitBatch: this.emitBatch.bind(this),\n emitCommand: this.emitCommand.bind(this),\n };\n }\n return this.producerView;\n }\n}\n","/**\n * ConsoleLogger - Default logger implementation\n *\n * Simple console-based logger with color support.\n * Used as fallback when no custom LoggerFactory is provided.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\n\nexport interface ConsoleLoggerOptions {\n level?: LogLevel;\n colors?: boolean;\n timestamps?: boolean;\n}\n\nexport class ConsoleLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly colors: boolean;\n private readonly timestamps: boolean;\n\n private static readonly COLORS = {\n DEBUG: \"\\x1b[36m\",\n INFO: \"\\x1b[32m\",\n WARN: \"\\x1b[33m\",\n ERROR: \"\\x1b[31m\",\n RESET: \"\\x1b[0m\",\n };\n\n constructor(name: string, options: ConsoleLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? \"info\";\n this.colors = options.colors ?? this.isNodeEnvironment();\n this.timestamps = options.timestamps ?? true;\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.isDebugEnabled()) {\n this.log(\"DEBUG\", message, context);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.isInfoEnabled()) {\n this.log(\"INFO\", message, context);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.isWarnEnabled()) {\n this.log(\"WARN\", message, context);\n }\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (this.isErrorEnabled()) {\n if (message instanceof Error) {\n this.log(\"ERROR\", message.message, { ...context, stack: message.stack });\n } else {\n this.log(\"ERROR\", message, context);\n }\n }\n }\n\n isDebugEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"error\");\n }\n\n private getLevelValue(level: LogLevel): number {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n };\n return levels[level];\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const parts: string[] = [];\n\n if (this.timestamps) {\n parts.push(new Date().toISOString());\n }\n\n if (this.colors) {\n const color = ConsoleLogger.COLORS[level as keyof typeof ConsoleLogger.COLORS];\n parts.push(`${color}${level.padEnd(5)}${ConsoleLogger.COLORS.RESET}`);\n } else {\n parts.push(level.padEnd(5));\n }\n\n parts.push(`[${this.name}]`);\n parts.push(message);\n\n const logLine = parts.join(\" \");\n const consoleMethod = this.getConsoleMethod(level);\n\n if (context && Object.keys(context).length > 0) {\n consoleMethod(logLine, context);\n } else {\n consoleMethod(logLine);\n }\n }\n\n private getConsoleMethod(level: string): (...args: unknown[]) => void {\n switch (level) {\n case \"DEBUG\":\n return console.debug.bind(console);\n case \"INFO\":\n return console.info.bind(console);\n case \"WARN\":\n return console.warn.bind(console);\n case \"ERROR\":\n return console.error.bind(console);\n default:\n return console.log.bind(console);\n }\n }\n\n private isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n }\n}\n","/**\n * LoggerFactoryImpl - Central factory for creating logger instances\n *\n * Implements lazy initialization pattern:\n * - createLogger() can be called at module level (before config)\n * - Real logger is created on first use\n * - External LoggerFactory can be injected via Runtime\n */\n\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { ConsoleLogger, type ConsoleLoggerOptions } from \"./ConsoleLogger\";\n\n// External factory injected via Runtime\nlet externalFactory: LoggerFactory | null = null;\n\nexport interface LoggerFactoryConfig {\n defaultImplementation?: (name: string) => Logger;\n defaultLevel?: LogLevel;\n consoleOptions?: Omit<ConsoleLoggerOptions, \"level\">;\n}\n\n/**\n * Internal LoggerFactory implementation\n *\n * Uses lazy proxy pattern to allow module-level createLogger() calls.\n */\nexport class LoggerFactoryImpl {\n private static loggers: Map<string, Logger> = new Map();\n private static config: LoggerFactoryConfig = {\n defaultLevel: \"info\",\n };\n\n static getLogger(nameOrClass: string | (new (...args: unknown[]) => unknown)): Logger {\n const name = typeof nameOrClass === \"string\" ? nameOrClass : nameOrClass.name;\n\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const lazyLogger = this.createLazyLogger(name);\n this.loggers.set(name, lazyLogger);\n return lazyLogger;\n }\n\n static configure(config: LoggerFactoryConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n static reset(): void {\n this.loggers.clear();\n this.config = { defaultLevel: \"info\" };\n externalFactory = null;\n }\n\n private static createLazyLogger(name: string): Logger {\n let realLogger: Logger | null = null;\n\n const getRealLogger = (): Logger => {\n if (!realLogger) {\n realLogger = this.createLogger(name);\n }\n return realLogger;\n };\n\n return {\n name,\n level: this.config.defaultLevel || \"info\",\n debug: (message: string, context?: LogContext) => getRealLogger().debug(message, context),\n info: (message: string, context?: LogContext) => getRealLogger().info(message, context),\n warn: (message: string, context?: LogContext) => getRealLogger().warn(message, context),\n error: (message: string | Error, context?: LogContext) =>\n getRealLogger().error(message, context),\n isDebugEnabled: () => getRealLogger().isDebugEnabled(),\n isInfoEnabled: () => getRealLogger().isInfoEnabled(),\n isWarnEnabled: () => getRealLogger().isWarnEnabled(),\n isErrorEnabled: () => getRealLogger().isErrorEnabled(),\n };\n }\n\n private static createLogger(name: string): Logger {\n if (externalFactory) {\n return externalFactory.getLogger(name);\n }\n\n if (this.config.defaultImplementation) {\n return this.config.defaultImplementation(name);\n }\n\n return new ConsoleLogger(name, {\n level: this.config.defaultLevel,\n ...this.config.consoleOptions,\n });\n }\n}\n\n/**\n * Set external LoggerFactory (called by Runtime initialization)\n */\nexport function setLoggerFactory(factory: LoggerFactory): void {\n externalFactory = factory;\n LoggerFactoryImpl.reset();\n externalFactory = factory;\n}\n\n/**\n * Create a logger instance\n *\n * Safe to call at module level before Runtime is configured.\n * Uses lazy initialization - actual logger is created on first use.\n *\n * @param name - Logger name (hierarchical, e.g., \"engine/AgentEngine\")\n * @returns Logger instance (lazy proxy)\n */\nexport function createLogger(name: string): Logger {\n return LoggerFactoryImpl.getLogger(name);\n}\n","/**\n * BusDriver - Listens to DriveableEvents and forwards to Agent\n *\n * This is the \"out\" side of agent communication:\n * - Subscribes to SystemBus at construction time\n * - Filters DriveableEvents by agentId (from event context)\n * - Converts DriveableEvent to StreamEvent\n * - Forwards to AgentEngine via callback\n *\n * Flow:\n * ```\n * ClaudeReceptor emits DriveableEvent (with context.agentId)\n * → SystemBus\n * → BusDriver filters by agentId\n * → Converts to StreamEvent\n * → Calls onStreamEvent callback\n * → AgentEngine processes\n * ```\n */\n\nimport type { StreamEvent } from \"@agentxjs/types/agent\";\nimport type { SystemBusConsumer, BusEventHandler } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemEvent, DriveableEvent } from \"@agentxjs/types/runtime\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/BusDriver\");\n\n/**\n * Callback for stream events\n */\nexport type StreamEventCallback = (event: StreamEvent) => void;\n\n/**\n * Callback when stream completes (message_stop or interrupted)\n */\nexport type StreamCompleteCallback = (reason: \"message_stop\" | \"interrupted\") => void;\n\n/**\n * BusDriver configuration\n */\nexport interface BusDriverConfig {\n agentId: string;\n onStreamEvent: StreamEventCallback;\n onStreamComplete?: StreamCompleteCallback;\n}\n\n/**\n * BusDriver - Event-driven listener for DriveableEvents\n *\n * Subscribes to SystemBus at construction and filters events\n * by agentId from the event context.\n */\nexport class BusDriver {\n readonly name = \"BusDriver\";\n readonly description = \"Driver that listens to SystemBus for DriveableEvents\";\n\n private readonly config: BusDriverConfig;\n private readonly unsubscribe: () => void;\n\n constructor(consumer: SystemBusConsumer, config: BusDriverConfig) {\n this.config = config;\n\n logger.debug(\"BusDriver created, subscribing to bus\", {\n agentId: config.agentId,\n });\n\n // Subscribe to all events at construction time\n this.unsubscribe = consumer.onAny(((event: SystemEvent) => {\n this.handleEvent(event);\n }) as BusEventHandler);\n }\n\n /**\n * Handle incoming event from bus\n */\n private handleEvent(event: SystemEvent): void {\n // Check if this is a DriveableEvent for this agent\n if (!this.isDriveableEventForThisAgent(event)) {\n return;\n }\n\n const driveableEvent = event as DriveableEvent;\n logger.debug(\"BusDriver received DriveableEvent\", {\n type: driveableEvent.type,\n agentId: this.config.agentId,\n requestId: (driveableEvent as unknown as { requestId?: string }).requestId,\n });\n\n // Convert to StreamEvent and forward\n const streamEvent = this.toStreamEvent(driveableEvent);\n this.config.onStreamEvent(streamEvent);\n\n // Notify completion if applicable\n if (driveableEvent.type === \"message_stop\") {\n this.config.onStreamComplete?.(\"message_stop\");\n } else if (driveableEvent.type === \"interrupted\") {\n this.config.onStreamComplete?.(\"interrupted\");\n }\n }\n\n /**\n * Check if event is a DriveableEvent for this agent\n *\n * Must check:\n * 1. source === \"environment\" (from Claude)\n * 2. context.agentId === this.config.agentId (for this agent)\n */\n private isDriveableEventForThisAgent(event: unknown): event is DriveableEvent {\n const driveableTypes = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_content_block_start\",\n \"text_delta\",\n \"text_content_block_stop\",\n \"tool_use_content_block_start\",\n \"input_json_delta\",\n \"tool_use_content_block_stop\",\n \"tool_call\",\n \"tool_result\",\n \"interrupted\",\n \"error_received\",\n ];\n\n if (\n event === null ||\n typeof event !== \"object\" ||\n !(\"type\" in event) ||\n typeof (event as { type: unknown }).type !== \"string\"\n ) {\n return false;\n }\n\n const e = event as {\n type: string;\n source?: string;\n context?: { agentId?: string };\n };\n\n // Must be from environment\n if (e.source !== \"environment\") {\n return false;\n }\n\n // Must be a driveable event type\n if (!driveableTypes.includes(e.type)) {\n return false;\n }\n\n // Must be for this agent (check context.agentId)\n if (e.context?.agentId !== this.config.agentId) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Convert DriveableEvent to StreamEvent\n */\n private toStreamEvent(event: DriveableEvent): StreamEvent {\n const { type, timestamp, data } = event;\n\n switch (type) {\n case \"message_start\": {\n const d = data as { message?: { id: string; model: string } };\n return {\n type: \"message_start\",\n timestamp,\n data: {\n messageId: d.message?.id ?? \"\",\n model: d.message?.model ?? \"\",\n },\n };\n }\n case \"message_stop\": {\n const d = data as { stopReason?: string };\n return {\n type: \"message_stop\",\n timestamp,\n data: {\n stopReason: d.stopReason,\n },\n } as StreamEvent;\n }\n case \"text_delta\": {\n const d = data as { text: string };\n return {\n type: \"text_delta\",\n timestamp,\n data: { text: d.text },\n };\n }\n case \"tool_use_content_block_start\": {\n const d = data as {\n id?: string;\n name?: string;\n toolCallId?: string;\n toolName?: string;\n };\n return {\n type: \"tool_use_start\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.id ?? \"\",\n toolName: d.toolName ?? d.name ?? \"\",\n },\n };\n }\n case \"input_json_delta\": {\n const d = data as { partialJson: string };\n return {\n type: \"input_json_delta\",\n timestamp,\n data: { partialJson: d.partialJson },\n };\n }\n case \"tool_use_content_block_stop\": {\n const d = data as {\n id?: string;\n name?: string;\n toolCallId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n };\n return {\n type: \"tool_use_stop\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.id ?? \"\",\n toolName: d.toolName ?? d.name ?? \"\",\n input: d.input ?? {},\n },\n };\n }\n case \"tool_result\": {\n const d = data as {\n toolUseId?: string;\n toolCallId?: string;\n result: unknown;\n isError?: boolean;\n };\n return {\n type: \"tool_result\",\n timestamp,\n data: {\n toolCallId: d.toolCallId ?? d.toolUseId ?? \"\",\n result: d.result,\n isError: d.isError,\n },\n };\n }\n case \"interrupted\": {\n // interrupted is not part of StreamEvent type, so we convert to message_stop\n // The MealyMachine will handle this and emit conversation_end\n return {\n type: \"message_stop\",\n timestamp,\n data: { stopReason: \"end_turn\" }, // Use valid StopReason\n };\n }\n case \"error_received\": {\n const d = data as { message: string; errorCode?: string };\n return {\n type: \"error_received\",\n timestamp,\n data: {\n message: d.message,\n errorCode: d.errorCode,\n },\n } as StreamEvent;\n }\n default:\n // For other events, pass through with minimal transformation\n return { type, timestamp, data } as StreamEvent;\n }\n }\n\n /**\n * Dispose and stop listening\n */\n dispose(): void {\n logger.debug(\"BusDriver disposing\", { agentId: this.config.agentId });\n this.unsubscribe();\n }\n}\n","/**\n * AgentInteractor - Handles user interactions (input)\n *\n * Responsibilities:\n * 1. Receive user messages\n * 2. Build UserMessage objects\n * 3. Persist to Session\n * 4. Emit to Bus (trigger ClaudeEffector)\n * 5. Handle interrupt operations\n *\n * This class is the \"in\" side of the agent communication.\n * BusDriver handles the \"out\" side (DriveableEvent → StreamEvent).\n */\n\nimport type { SystemBusProducer, Session } from \"@agentxjs/types/runtime/internal\";\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { EventContext } from \"@agentxjs/types/runtime\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/AgentInteractor\");\n\n/**\n * Context for AgentInteractor\n */\nexport interface AgentInteractorContext {\n agentId: string;\n imageId: string;\n containerId: string;\n sessionId: string;\n}\n\n/**\n * AgentInteractor - Processes user input and emits events\n */\nexport class AgentInteractor {\n private readonly producer: SystemBusProducer;\n private readonly session: Session;\n private readonly context: AgentInteractorContext;\n\n constructor(producer: SystemBusProducer, session: Session, context: AgentInteractorContext) {\n this.producer = producer;\n this.session = session;\n this.context = context;\n logger.debug(\"AgentInteractor created\", { agentId: context.agentId });\n }\n\n /**\n * Receive user message\n *\n * @param content - Message content\n * @param requestId - Request ID for correlation\n */\n async receive(content: string, requestId: string): Promise<UserMessage> {\n logger.debug(\"AgentInteractor.receive\", {\n requestId,\n agentId: this.context.agentId,\n contentPreview: content.substring(0, 50),\n });\n\n // 1. Build UserMessage\n const userMessage: UserMessage = {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // 2. Persist to Session\n await this.session.addMessage(userMessage);\n logger.debug(\"UserMessage persisted\", {\n messageId: userMessage.id,\n requestId,\n });\n\n // 3. Build event context\n const eventContext: EventContext = {\n agentId: this.context.agentId,\n imageId: this.context.imageId,\n containerId: this.context.containerId,\n sessionId: this.context.sessionId,\n };\n\n // 4. Emit internal event to Bus (triggers ClaudeEffector)\n // This event is NOT broadcastable - it's for internal processing only\n this.producer.emit({\n type: \"user_message\",\n timestamp: Date.now(),\n data: userMessage,\n source: \"agent\",\n category: \"message\",\n intent: \"request\",\n requestId,\n context: eventContext,\n broadcastable: false, // Internal event for ClaudeEffector\n } as never);\n\n logger.info(\"user_message event emitted to bus\", {\n messageId: userMessage.id,\n requestId,\n agentId: this.context.agentId,\n eventType: \"user_message\",\n });\n\n return userMessage;\n }\n\n /**\n * Interrupt current operation\n *\n * @param requestId - Optional request ID for correlation\n */\n interrupt(requestId?: string): void {\n logger.debug(\"AgentInteractor.interrupt\", {\n requestId,\n agentId: this.context.agentId,\n });\n\n const eventContext: EventContext = {\n agentId: this.context.agentId,\n imageId: this.context.imageId,\n containerId: this.context.containerId,\n sessionId: this.context.sessionId,\n };\n\n this.producer.emit({\n type: \"interrupt\",\n timestamp: Date.now(),\n data: { agentId: this.context.agentId },\n source: \"agent\",\n category: \"action\",\n intent: \"request\",\n requestId,\n context: eventContext,\n broadcastable: false,\n } as never);\n }\n}\n","/**\n * Engine State Events (Lightweight)\n *\n * Lightweight state events for AgentEngine internal use.\n * Derived from full AgentStateEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentStateEvent as FullAgentStateEvent,\n ConversationQueuedEvent as FullConversationQueuedEvent,\n ConversationStartEvent as FullConversationStartEvent,\n ConversationThinkingEvent as FullConversationThinkingEvent,\n ConversationRespondingEvent as FullConversationRespondingEvent,\n ConversationEndEvent as FullConversationEndEvent,\n ConversationInterruptedEvent as FullConversationInterruptedEvent,\n ToolPlannedEvent as FullToolPlannedEvent,\n ToolExecutingEvent as FullToolExecutingEvent,\n ToolCompletedEvent as FullToolCompletedEvent,\n ToolFailedEvent as FullToolFailedEvent,\n ErrorOccurredEvent as FullErrorOccurredEvent,\n} from \"~/event/agent/state\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * StateEvent - Base type for state events\n * @deprecated Use specific event types instead\n */\nexport interface StateEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type ConversationQueuedEvent = ToEngineEvent<FullConversationQueuedEvent>;\nexport type ConversationStartEvent = ToEngineEvent<FullConversationStartEvent>;\nexport type ConversationThinkingEvent = ToEngineEvent<FullConversationThinkingEvent>;\nexport type ConversationRespondingEvent = ToEngineEvent<FullConversationRespondingEvent>;\nexport type ConversationEndEvent = ToEngineEvent<FullConversationEndEvent>;\nexport type ConversationInterruptedEvent = ToEngineEvent<FullConversationInterruptedEvent>;\nexport type ToolPlannedEvent = ToEngineEvent<FullToolPlannedEvent>;\nexport type ToolExecutingEvent = ToEngineEvent<FullToolExecutingEvent>;\nexport type ToolCompletedEvent = ToEngineEvent<FullToolCompletedEvent>;\nexport type ToolFailedEvent = ToEngineEvent<FullToolFailedEvent>;\nexport type ErrorOccurredEvent = ToEngineEvent<FullErrorOccurredEvent>;\n\n/**\n * Alias for ErrorOccurredEvent (legacy compatibility)\n */\nexport type AgentErrorOccurredEvent = ErrorOccurredEvent;\n\n/**\n * AgentStateEvent - All lightweight state events\n */\nexport type AgentStateEvent = ToEngineEventUnion<FullAgentStateEvent>;\n\n/**\n * Type guard: is this a state event?\n */\nexport function isStateEvent(event: EngineEvent): event is AgentStateEvent {\n const stateTypes = [\n \"conversation_queued\",\n \"conversation_start\",\n \"conversation_thinking\",\n \"conversation_responding\",\n \"conversation_end\",\n \"conversation_interrupted\",\n \"tool_planned\",\n \"tool_executing\",\n \"tool_completed\",\n \"tool_failed\",\n \"error_occurred\",\n ];\n return stateTypes.includes(event.type);\n}\n","/**\n * Engine Message Events (Lightweight)\n *\n * Lightweight message events for AgentEngine internal use.\n * Derived from full AgentMessageEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentMessageEvent as FullAgentMessageEvent,\n UserMessageEvent as FullUserMessageEvent,\n AssistantMessageEvent as FullAssistantMessageEvent,\n ToolCallMessageEvent as FullToolCallMessageEvent,\n ToolResultMessageEvent as FullToolResultMessageEvent,\n ErrorMessageEvent as FullErrorMessageEvent,\n} from \"~/event/agent/message\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// Re-export parts (they're not events, just types)\nexport type { ContentPart, ToolCallPart, ToolResultPart } from \"../../message/parts\";\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * MessageEvent - Base type for message events\n * @deprecated Use specific event types instead\n */\nexport interface MessageEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type UserMessageEvent = ToEngineEvent<FullUserMessageEvent>;\nexport type AssistantMessageEvent = ToEngineEvent<FullAssistantMessageEvent>;\nexport type ToolCallMessageEvent = ToEngineEvent<FullToolCallMessageEvent>;\nexport type ToolResultMessageEvent = ToEngineEvent<FullToolResultMessageEvent>;\nexport type ErrorMessageEvent = ToEngineEvent<FullErrorMessageEvent>;\n\n/**\n * AgentMessageEvent - All lightweight message events\n */\nexport type AgentMessageEvent = ToEngineEventUnion<FullAgentMessageEvent>;\n\n/**\n * Type guard: is this a message event?\n */\nexport function isMessageEvent(event: EngineEvent): event is AgentMessageEvent {\n const messageTypes = [\n \"user_message\",\n \"assistant_message\",\n \"tool_call_message\",\n \"tool_result_message\",\n \"error_message\",\n ];\n return messageTypes.includes(event.type);\n}\n","/**\n * Engine Turn Events (Lightweight)\n *\n * Lightweight turn events for AgentEngine internal use.\n * Derived from full AgentTurnEvent in @agentxjs/types/event/agent.\n */\n\nimport type {\n AgentTurnEvent as FullAgentTurnEvent,\n TurnRequestEvent as FullTurnRequestEvent,\n TurnResponseEvent as FullTurnResponseEvent,\n TokenUsage,\n} from \"~/event/agent/turn\";\nimport type { EngineEvent, ToEngineEvent, ToEngineEventUnion } from \"../EngineEvent\";\n\n// Re-export TokenUsage (it's not an event, just a type)\nexport type { TokenUsage };\n\n// ============================================================================\n// Base Type (for backward compatibility)\n// ============================================================================\n\n/**\n * TurnEvent - Base type for turn events\n * @deprecated Use specific event types instead\n */\nexport interface TurnEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// ============================================================================\n// Lightweight Event Types\n// ============================================================================\n\nexport type TurnRequestEvent = ToEngineEvent<FullTurnRequestEvent>;\nexport type TurnResponseEvent = ToEngineEvent<FullTurnResponseEvent>;\n\n/**\n * AgentTurnEvent - All lightweight turn events\n */\nexport type AgentTurnEvent = ToEngineEventUnion<FullAgentTurnEvent>;\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isTurnEvent(event: EngineEvent): event is AgentTurnEvent {\n const turnTypes = [\"turn_request\", \"turn_response\"];\n return turnTypes.includes(event.type);\n}\n","/**\n * Store - State storage interface for stream processing\n *\n * A Store abstracts state persistence, allowing processors to be stateless\n * while maintaining state externally.\n *\n * @template T - The state type to store\n *\n * @example\n * ```typescript\n * const store = new MemoryStore<AgentState>();\n * store.set('agent_123', { count: 0 });\n * const state = store.get('agent_123');\n * ```\n */\nexport interface Store<T> {\n /**\n * Get state by ID\n * @param id - Unique identifier (e.g., agentId, sessionId)\n * @returns The stored state or undefined if not found\n */\n get(id: string): T | undefined;\n\n /**\n * Set state for an ID\n * @param id - Unique identifier\n * @param state - The state to store\n */\n set(id: string, state: T): void;\n\n /**\n * Delete state for an ID\n * @param id - Unique identifier\n */\n delete(id: string): void;\n\n /**\n * Check if state exists for an ID\n * @param id - Unique identifier\n * @returns True if state exists\n */\n has(id: string): boolean;\n}\n\n/**\n * MemoryStore - In-memory implementation of Store\n *\n * Stores state in a Map. Suitable for development and single-process deployments.\n * For production multi-process scenarios, use RedisStore or PostgresStore.\n *\n * @template T - The state type to store\n *\n * @example\n * ```typescript\n * const store = new MemoryStore<MyState>();\n * store.set('session_1', { count: 0 });\n * ```\n */\nexport class MemoryStore<T> implements Store<T> {\n private states = new Map<string, T>();\n\n get(id: string): T | undefined {\n return this.states.get(id);\n }\n\n set(id: string, state: T): void {\n this.states.set(id, state);\n }\n\n delete(id: string): void {\n this.states.delete(id);\n }\n\n has(id: string): boolean {\n return this.states.has(id);\n }\n\n /**\n * Clear all stored states\n */\n clear(): void {\n this.states.clear();\n }\n\n /**\n * Get the number of stored states\n */\n get size(): number {\n return this.states.size;\n }\n\n /**\n * Get all stored IDs\n */\n keys(): IterableIterator<string> {\n return this.states.keys();\n }\n}\n","/**\n * Mealy - The Mealy Machine runtime\n *\n * A Mealy Machine is a finite-state machine where outputs depend on\n * both the current state AND the input: (state, input) => (state, output)\n *\n * This runtime orchestrates the complete processing pipeline:\n * 1. Sources receive external input (side effects)\n * 2. Processors process inputs (pure Mealy transition functions)\n * 3. Sinks produce output effects (side effects)\n *\n * Architecture:\n * - Inputs enter through Sources (input adapters)\n * - Processors transform inputs (pure functions, state is means)\n * - Sinks produce actions (output adapters)\n *\n * @template TState - The state type (accumulator, means to an end)\n * @template TInput - The input/output type for Processors\n *\n * @example\n * ```typescript\n * const mealy = createMealy({\n * processor: messageProcessor,\n * store: new MemoryStore(),\n * initialState: { text: '' },\n * sinks: [sseSink, logSink],\n * });\n *\n * // Process an input\n * mealy.process('agent_123', input);\n * ```\n */\n\nimport type { Processor } from \"./Processor\";\nimport type { Store } from \"./Store\";\nimport type { Sink, SinkDefinition } from \"./Sink\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/Mealy\");\n\n/**\n * MealyConfig - Configuration for creating a Mealy instance\n */\nexport interface MealyConfig<TState, TInput> {\n /**\n * The processor function to execute (pure Mealy transition function)\n */\n processor: Processor<TState, TInput, TInput>;\n\n /**\n * The store for state persistence\n */\n store: Store<TState>;\n\n /**\n * Initial state for new IDs\n */\n initialState: TState;\n\n /**\n * Sinks to receive outputs\n * Can be simple Sink functions or SinkDefinitions with filter/name\n */\n sinks?: (Sink<TInput> | SinkDefinition<TInput>)[];\n\n /**\n * Whether to recursively process outputs\n * If true, outputs are fed back into the processor\n *\n * @default true\n */\n recursive?: boolean;\n\n /**\n * Maximum recursion depth to prevent infinite loops\n *\n * @default 100\n */\n maxDepth?: number;\n}\n\n/**\n * ProcessResult - Result of processing an input\n */\nexport interface ProcessResult<TState, TOutput> {\n /**\n * The new state after processing\n */\n state: TState;\n\n /**\n * All outputs produced (including from recursion)\n */\n outputs: TOutput[];\n\n /**\n * Number of processor invocations (including recursion)\n */\n processCount: number;\n}\n\n/**\n * Mealy - Mealy Machine runtime\n *\n * Implements the Mealy Machine pattern: (state, input) => (state, output)\n * where output depends on both current state and input.\n */\nexport class Mealy<TState, TInput> {\n private readonly processor: Processor<TState, TInput, TInput>;\n private readonly store: Store<TState>;\n private readonly initialState: TState;\n private readonly sinks: (Sink<TInput> | SinkDefinition<TInput>)[];\n private readonly recursive: boolean;\n private readonly maxDepth: number;\n\n constructor(config: MealyConfig<TState, TInput>) {\n this.processor = config.processor;\n this.store = config.store;\n this.initialState = config.initialState;\n this.sinks = config.sinks ?? [];\n this.recursive = config.recursive ?? true;\n this.maxDepth = config.maxDepth ?? 100;\n\n logger.debug(\"Mealy instance created\", {\n sinkCount: this.sinks.length,\n recursive: this.recursive,\n maxDepth: this.maxDepth,\n });\n }\n\n /**\n * Process an input through the Mealy Machine\n *\n * @param id - Unique identifier (e.g., agentId)\n * @param input - The input to process\n * @returns Result containing new state and all outputs\n */\n process(id: string, input: TInput): ProcessResult<TState, TInput> {\n return this.processInternal(id, input, 0);\n }\n\n /**\n * Internal process with depth tracking\n */\n private processInternal(id: string, input: TInput, depth: number): ProcessResult<TState, TInput> {\n // Guard against infinite recursion\n if (depth >= this.maxDepth) {\n logger.warn(\"Max recursion depth reached\", {\n id,\n maxDepth: this.maxDepth,\n depth,\n });\n return {\n state: this.store.get(id) ?? this.initialState,\n outputs: [],\n processCount: 0,\n };\n }\n\n // 1. Get current state (or initialize)\n let state = this.store.get(id);\n if (state === undefined) {\n state = this.initialState;\n }\n\n // 2. Execute pure processor function (Mealy transition)\n const [newState, outputs] = this.processor(state, input);\n\n // 3. Save new state to store\n this.store.set(id, newState);\n\n // 4. Collect all outputs\n const allOutputs: TInput[] = [...outputs];\n let processCount = 1;\n\n // 5. Send outputs to sinks\n if (outputs.length > 0) {\n this.sendToSinks(id, outputs);\n }\n\n // 6. Optionally recurse on outputs\n if (this.recursive) {\n for (const output of outputs) {\n const result = this.processInternal(id, output, depth + 1);\n allOutputs.push(...result.outputs);\n processCount += result.processCount;\n }\n }\n\n return {\n state: newState,\n outputs: allOutputs,\n processCount,\n };\n }\n\n /**\n * Send outputs to all sinks\n */\n private sendToSinks(id: string, outputs: TInput[]): void {\n for (const sink of this.sinks) {\n // Check if sink is a function or SinkDefinition\n if (typeof sink === \"function\") {\n // Simple Sink function: (id, outputs) => void\n try {\n const result = sink(id, outputs);\n if (result instanceof Promise) {\n result.catch((error) => {\n logger.error(\"Sink error (async)\", { id, error });\n });\n }\n } catch (error) {\n logger.error(\"Sink error (sync)\", { id, error });\n }\n } else {\n // SinkDefinition with filter/name\n const filteredOutputs = sink.filter ? outputs.filter(sink.filter) : outputs;\n\n if (filteredOutputs.length === 0) {\n continue;\n }\n\n try {\n const result = sink.sink(id, filteredOutputs);\n if (result instanceof Promise) {\n result.catch((error) => {\n logger.error(\"Named sink error (async)\", {\n id,\n sinkName: sink.name,\n error,\n });\n });\n }\n } catch (error) {\n logger.error(\"Named sink error (sync)\", {\n id,\n sinkName: sink.name,\n error,\n });\n }\n }\n }\n }\n\n /**\n * Get current state for an ID (without processing)\n */\n getState(id: string): TState | undefined {\n return this.store.get(id);\n }\n\n /**\n * Check if state exists for an ID\n */\n hasState(id: string): boolean {\n return this.store.has(id);\n }\n\n /**\n * Delete state for an ID (cleanup)\n */\n cleanup(id: string): void {\n logger.debug(\"Cleaning up state\", { id });\n this.store.delete(id);\n }\n\n /**\n * Add a sink at runtime\n */\n addSink(sink: Sink<TInput> | SinkDefinition<TInput>): void {\n const sinkName = typeof sink === \"function\" ? \"(anonymous)\" : sink.name;\n logger.debug(\"Adding sink\", { sinkName });\n this.sinks.push(sink);\n }\n\n /**\n * Remove a sink by name (only works for SinkDefinitions)\n */\n removeSink(name: string): boolean {\n const index = this.sinks.findIndex((s) => typeof s !== \"function\" && s.name === name);\n if (index !== -1) {\n this.sinks.splice(index, 1);\n logger.debug(\"Removed sink\", { name });\n return true;\n }\n logger.debug(\"Sink not found for removal\", { name });\n return false;\n }\n}\n\n/**\n * createMealy - Factory function for creating Mealy Machine instances\n *\n * @example\n * ```typescript\n * const mealy = createMealy({\n * processor: myProcessor,\n * store: new MemoryStore(),\n * initialState: { count: 0 },\n * sinks: [logSink],\n * });\n * ```\n */\nexport function createMealy<TState, TInput>(\n config: MealyConfig<TState, TInput>\n): Mealy<TState, TInput> {\n return new Mealy(config);\n}\n","/**\n * Combinators - Functions to compose multiple Processors\n *\n * These utilities allow building complex stream processing pipelines\n * from simple, composable Processor functions.\n */\n\nimport type { Processor } from \"./Processor\";\n\n/**\n * combineProcessors - Combine multiple processors into one\n *\n * Each sub-processor manages its own slice of state.\n * All processors receive the same event and their outputs are merged.\n *\n * @example\n * ```typescript\n * interface CombinedState {\n * message: MessageState;\n * state: StateMachineState;\n * turn: TurnState;\n * }\n *\n * const combinedProcessor = combineProcessors<CombinedState, Event, Event>({\n * message: messageProcessor,\n * state: stateMachineProcessor,\n * turn: turnTrackerProcessor,\n * });\n * ```\n */\nexport function combineProcessors<\n TState extends Record<string, unknown>,\n TInput,\n TOutput,\n>(processors: {\n [K in keyof TState]: Processor<TState[K], TInput, TOutput>;\n}): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n const newState = {} as TState;\n const allOutputs: TOutput[] = [];\n\n for (const key in processors) {\n const processor = processors[key];\n const subState = state[key];\n const [newSubState, outputs] = processor(subState, event);\n\n newState[key] = newSubState;\n allOutputs.push(...outputs);\n }\n\n return [newState, allOutputs];\n };\n}\n\n/**\n * combineInitialStates - Helper to create initial state for combined processors\n */\nexport function combineInitialStates<TState extends Record<string, unknown>>(initialStates: {\n [K in keyof TState]: () => TState[K];\n}): () => TState {\n return () => {\n const state = {} as TState;\n for (const key in initialStates) {\n state[key] = initialStates[key]();\n }\n return state;\n };\n}\n\n/**\n * chainProcessors - Chain processors where output of one feeds into the next\n *\n * Useful for layered event processing:\n * Stream Events → Message Events → Turn Events\n *\n * @example\n * ```typescript\n * const pipeline = chainProcessors(\n * streamToMessageProcessor,\n * messageToTurnProcessor,\n * );\n * ```\n */\nexport function chainProcessors<TState, TEvent>(\n ...processors: Processor<TState, TEvent, TEvent>[]\n): Processor<TState, TEvent, TEvent> {\n return (state: Readonly<TState>, event: TEvent): [TState, TEvent[]] => {\n let currentState = state as TState;\n const finalOutputs: TEvent[] = [];\n\n // Run the event through all processors\n for (const processor of processors) {\n const [newState, outputs] = processor(currentState, event);\n currentState = newState;\n finalOutputs.push(...outputs);\n }\n\n return [currentState, finalOutputs];\n };\n}\n\n/**\n * filterProcessor - Create a processor that only processes certain events\n *\n * @example\n * ```typescript\n * const textOnlyProcessor = filterProcessor(\n * (event) => event.type === 'text_delta',\n * textProcessor,\n * );\n * ```\n */\nexport function filterProcessor<TState, TInput, TOutput>(\n predicate: (event: TInput) => boolean,\n processor: Processor<TState, TInput, TOutput>\n): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n if (predicate(event)) {\n return processor(state, event);\n }\n return [state as TState, []];\n };\n}\n\n/**\n * mapOutput - Transform output events\n *\n * @example\n * ```typescript\n * const withTimestamp = mapOutput(\n * myProcessor,\n * (output) => ({ ...output, processedAt: Date.now() }),\n * );\n * ```\n */\nexport function mapOutput<TState, TInput, TOutput, TMapped>(\n processor: Processor<TState, TInput, TOutput>,\n mapper: (output: TOutput) => TMapped\n): Processor<TState, TInput, TMapped> {\n return (state: Readonly<TState>, event: TInput): [TState, TMapped[]] => {\n const [newState, outputs] = processor(state, event);\n return [newState, outputs.map(mapper)];\n };\n}\n\n/**\n * withLogging - Add logging to a processor (for debugging)\n *\n * @example\n * ```typescript\n * const debugProcessor = withLogging(myProcessor, 'MyProcessor');\n * ```\n */\nexport function withLogging<TState, TInput, TOutput>(\n processor: Processor<TState, TInput, TOutput>,\n name: string,\n logger: {\n debug: (message: string, data?: unknown) => void;\n } = console\n): Processor<TState, TInput, TOutput> {\n return (state: Readonly<TState>, event: TInput): [TState, TOutput[]] => {\n logger.debug(`[${name}] Input:`, { event, state });\n const [newState, outputs] = processor(state, event);\n logger.debug(`[${name}] Output:`, { newState, outputs });\n return [newState, outputs];\n };\n}\n\n/**\n * identityProcessor - A processor that does nothing (useful as default)\n */\nexport function identityProcessor<TState, TEvent>(): Processor<TState, TEvent, TEvent> {\n return (state: Readonly<TState>, _event: TEvent): [TState, TEvent[]] => {\n return [state as TState, []];\n };\n}\n","/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function that assembles complete Message Layer events\n * from Stream Layer events.\n *\n * Input Events (Stream Layer):\n * - message_start\n * - text_delta\n * - tool_use_start\n * - input_json_delta\n * - tool_use_stop\n * - tool_result\n * - message_stop\n *\n * Output Events (Message Layer):\n * - tool_call_message (Message - AI's request to call a tool)\n * - tool_result_message (Message - tool execution result)\n * - assistant_message (Message - complete assistant response)\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n TextDeltaEvent,\n ToolUseStartEvent,\n InputJsonDeltaEvent,\n ToolResultEvent,\n MessageStopEvent,\n // Output: Message events\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n ErrorMessageEvent,\n // Content parts\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"@agentxjs/types/agent\";\n\n// ===== State Types =====\n\n/**\n * Pending content accumulator\n */\nexport interface PendingContent {\n type: \"text\" | \"tool_use\";\n index: number;\n // For text content\n textDeltas?: string[];\n // For tool use\n toolId?: string;\n toolName?: string;\n toolInputJson?: string;\n}\n\n/**\n * Pending tool call info (for matching with tool_result)\n */\nexport interface PendingToolCall {\n id: string;\n name: string;\n}\n\n/**\n * MessageAssemblerState\n *\n * Tracks the state of message assembly from stream events.\n */\nexport interface MessageAssemblerState {\n /**\n * Current message ID being assembled\n */\n currentMessageId: string | null;\n\n /**\n * Timestamp when the current message started\n */\n messageStartTime: number | null;\n\n /**\n * Pending content blocks being accumulated\n * Key is the content block index\n */\n pendingContents: Record<number, PendingContent>;\n\n /**\n * Pending tool calls waiting for results\n * Key is the tool call ID\n */\n pendingToolCalls: Record<string, PendingToolCall>;\n}\n\n/**\n * Initial state factory for MessageAssembler\n */\nexport function createInitialMessageAssemblerState(): MessageAssemblerState {\n return {\n currentMessageId: null,\n messageStartTime: null,\n pendingContents: {},\n pendingToolCalls: {},\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from MessageAssembler\n */\nexport type MessageAssemblerOutput =\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Input event types for MessageAssembler\n */\nexport type MessageAssemblerInput = StreamEvent;\n\n/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function for message assembly.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const messageAssemblerProcessor: Processor<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = (state, input): [MessageAssemblerState, MessageAssemblerOutput[]] => {\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(state, input);\n\n case \"text_delta\":\n return handleTextDelta(state, input);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, input);\n\n case \"input_json_delta\":\n return handleInputJsonDelta(state, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, input);\n\n case \"tool_result\":\n return handleToolResult(state, input);\n\n case \"message_stop\":\n return handleMessageStop(state, input);\n\n case \"error_received\":\n return handleErrorReceived(state, input);\n\n default:\n // Pass through unhandled events (no state change, no output)\n return [state, []];\n }\n};\n\n/**\n * Handle message_start event\n */\nfunction handleMessageStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as MessageStartEvent[\"data\"];\n return [\n {\n ...state,\n currentMessageId: data.messageId,\n messageStartTime: event.timestamp,\n pendingContents: {},\n },\n [],\n ];\n}\n\n/**\n * Handle text_delta event\n */\nfunction handleTextDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as TextDeltaEvent[\"data\"];\n const index = 0; // Text content uses index 0\n const existingContent = state.pendingContents[index];\n\n const pendingContent: PendingContent =\n existingContent?.type === \"text\"\n ? {\n ...existingContent,\n textDeltas: [...(existingContent.textDeltas || []), data.text],\n }\n : {\n type: \"text\",\n index,\n textDeltas: [data.text],\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_start event\n */\nfunction handleToolUseStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as ToolUseStartEvent[\"data\"];\n const index = 1; // Tool use uses index 1\n\n const pendingContent: PendingContent = {\n type: \"tool_use\",\n index,\n toolId: data.toolCallId,\n toolName: data.toolName,\n toolInputJson: \"\",\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle input_json_delta event\n */\nfunction handleInputJsonDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as InputJsonDeltaEvent[\"data\"];\n const index = 1; // Tool use uses index 1\n const existingContent = state.pendingContents[index];\n\n if (!existingContent || existingContent.type !== \"tool_use\") {\n // No pending tool_use content, ignore\n return [state, []];\n }\n\n const pendingContent: PendingContent = {\n ...existingContent,\n toolInputJson: (existingContent.toolInputJson || \"\") + data.partialJson,\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Emits:\n * - tool_call_message (Message Event) - for UI display and tool execution\n */\nfunction handleToolUseStop(\n state: Readonly<MessageAssemblerState>,\n _event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const index = 1;\n const pendingContent = state.pendingContents[index];\n\n if (!pendingContent || pendingContent.type !== \"tool_use\") {\n return [state, []];\n }\n\n // Get tool info from pendingContent (saved during tool_use_start)\n const toolId = pendingContent.toolId || \"\";\n const toolName = pendingContent.toolName || \"\";\n\n // Parse tool input JSON (accumulated during input_json_delta)\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};\n } catch {\n // Failed to parse, use empty object\n toolInput = {};\n }\n\n // Create ToolCallPart\n const toolCall: ToolCallPart = {\n type: \"tool-call\",\n id: toolId,\n name: toolName,\n input: toolInput,\n };\n\n // Emit tool_call_message event (Agent layer event structure)\n const toolCallMessageEvent: ToolCallMessageEvent = {\n type: \"tool_call_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n toolCalls: [toolCall],\n timestamp: Date.now(),\n },\n };\n\n // Remove from pending contents, add to pending tool calls\n const { [index]: _, ...remainingContents } = state.pendingContents;\n\n return [\n {\n ...state,\n pendingContents: remainingContents,\n pendingToolCalls: {\n ...state.pendingToolCalls,\n [toolId]: { id: toolId, name: toolName },\n },\n },\n [toolCallMessageEvent],\n ];\n}\n\n/**\n * Handle tool_result event\n *\n * Emits:\n * - tool_result_message (Message Event) - for UI display\n */\nfunction handleToolResult(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as ToolResultEvent[\"data\"];\n const { toolCallId, result, isError } = data;\n\n // Find pending tool call\n const pendingToolCall = state.pendingToolCalls[toolCallId];\n const toolName = pendingToolCall?.name || \"unknown\";\n\n // Create tool result part\n const toolResult: ToolResultPart = {\n type: \"tool-result\",\n id: toolCallId,\n name: toolName,\n output: {\n type: isError ? \"error-text\" : \"text\",\n value: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n };\n\n // Emit tool_result_message event (Agent layer event structure)\n const toolResultMessageEvent: ToolResultMessageEvent = {\n type: \"tool_result_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n results: [toolResult],\n timestamp: Date.now(),\n },\n };\n\n // Remove from pending tool calls\n const { [toolCallId]: _, ...remainingToolCalls } = state.pendingToolCalls;\n\n return [\n {\n ...state,\n pendingToolCalls: remainingToolCalls,\n },\n [toolResultMessageEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as MessageStopEvent[\"data\"];\n\n if (!state.currentMessageId) {\n return [state, []];\n }\n\n // Assemble all text content\n const textParts: string[] = [];\n const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);\n\n for (const pending of sortedContents) {\n if (pending.type === \"text\" && pending.textDeltas) {\n textParts.push(pending.textDeltas.join(\"\"));\n }\n }\n\n const textContent = textParts.join(\"\");\n\n // Skip empty messages (but preserve pendingToolCalls if stopReason is \"tool_use\")\n const stopReason = data.stopReason;\n if (!textContent || textContent.trim().length === 0) {\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [],\n ];\n }\n\n // Create content parts (new structure uses ContentPart[])\n const contentParts: TextPart[] = [\n {\n type: \"text\",\n text: textContent,\n },\n ];\n\n // Emit AssistantMessageEvent (Agent layer event structure)\n const assistantEvent: AssistantMessageEvent = {\n type: \"assistant_message\",\n timestamp: Date.now(),\n data: {\n messageId: state.currentMessageId,\n content: contentParts,\n stopReason: stopReason,\n timestamp: state.messageStartTime || Date.now(),\n },\n };\n\n // Reset state, but preserve pendingToolCalls if stopReason is \"tool_use\"\n // (tool_result events arrive after message_stop in tool call scenarios)\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [assistantEvent],\n ];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_message (Message Event) - for UI display\n */\nfunction handleErrorReceived(\n _state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n const errorMessageEvent: ErrorMessageEvent = {\n type: \"error_message\",\n timestamp: Date.now(),\n data: {\n messageId: generateId(),\n content: data.message,\n errorCode: data.errorCode,\n timestamp: Date.now(),\n },\n };\n\n // Reset state on error\n return [createInitialMessageAssemblerState(), [errorMessageEvent]];\n}\n\n/**\n * MessageAssembler Processor Definition\n */\nexport const messageAssemblerProcessorDef: ProcessorDefinition<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = {\n name: \"MessageAssembler\",\n description: \"Assembles complete messages from stream events\",\n initialState: createInitialMessageAssemblerState,\n processor: messageAssemblerProcessor,\n};\n","/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Input Events (Stream Layer):\n * - message_start\n * - message_stop\n * - text_delta (triggers responding state)\n * - tool_use_start\n * - tool_use_stop\n *\n * Output Events (State Layer):\n * - conversation_start\n * - conversation_responding\n * - conversation_end\n * - tool_planned\n * - tool_executing\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n MessageStopEvent,\n ToolUseStartEvent,\n // Output: State events\n ConversationStartEvent,\n ConversationRespondingEvent,\n ConversationEndEvent,\n ConversationInterruptedEvent,\n ToolPlannedEvent,\n ToolExecutingEvent,\n ErrorOccurredEvent,\n} from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/stateEventProcessor\");\n\n// ===== State Types =====\n\n/**\n * StateEventProcessorContext\n *\n * Minimal context needed for event transformation logic.\n * Does NOT track agent state - only auxiliary info for decision-making.\n *\n * Currently empty - no context needed as all information comes from events.\n */\nexport interface StateEventProcessorContext {\n // Empty - all information comes from events\n}\n\n/**\n * Initial context factory for StateEventProcessor\n */\nexport function createInitialStateEventProcessorContext(): StateEventProcessorContext {\n return {};\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Output event types from StateEventProcessor\n */\nexport type StateEventProcessorOutput =\n | ConversationStartEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ErrorOccurredEvent;\n\n/**\n * Input event types for StateEventProcessor\n */\nexport type StateEventProcessorInput = StreamEvent;\n\n/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Design:\n * - Does NOT track agent state (that's StateMachine's job)\n * - Only maintains auxiliary context (timestamps, etc.)\n * - Emits State Events that StateMachine consumes\n *\n * Pattern: (context, input) => [newContext, outputs]\n */\nexport const stateEventProcessor: Processor<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = (context, input): [StateEventProcessorContext, StateEventProcessorOutput[]] => {\n // Log all incoming Stream Events\n logger.debug(`[Stream Event] ${input.type}`, {\n context,\n eventData: \"data\" in input ? input.data : undefined,\n });\n\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(context, input);\n\n case \"message_delta\":\n return handleMessageDelta(context);\n\n case \"message_stop\":\n return handleMessageStop(context, input);\n\n case \"text_delta\":\n return handleTextDelta(context);\n\n case \"tool_use_start\":\n return handleToolUseStart(context, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(context);\n\n case \"error_received\":\n return handleErrorReceived(context, input);\n\n default:\n // Pass through unhandled events\n logger.debug(`[Stream Event] ${input.type} (unhandled)`);\n return [context, []];\n }\n};\n\n/**\n * Handle message_start event\n *\n * Emits: conversation_start\n */\nfunction handleMessageStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as MessageStartEvent[\"data\"];\n\n const conversationStartEvent: ConversationStartEvent = {\n type: \"conversation_start\",\n timestamp: Date.now(),\n data: {\n messageId: data.messageId,\n },\n };\n\n return [context, [conversationStartEvent]];\n}\n\n/**\n * Handle message_delta event\n *\n * No longer needed as stopReason is now in message_stop event.\n * Kept for compatibility with event routing.\n */\nfunction handleMessageDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // No-op: stopReason now comes from message_stop\n return [context, []];\n}\n\n/**\n * Handle message_stop event\n *\n * Emits: conversation_end (only if stopReason is NOT \"tool_use\")\n *\n * This event signals that Claude has finished streaming a message.\n * However, if stopReason is \"tool_use\", the conversation continues\n * because Claude will execute tools and send more messages.\n */\nfunction handleMessageStop(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as MessageStopEvent[\"data\"];\n const stopReason = data.stopReason;\n\n logger.debug(\"message_stop received\", { stopReason });\n\n // If stopReason is \"tool_use\", don't emit conversation_end\n // The conversation continues after tool execution\n if (stopReason === \"tool_use\") {\n logger.debug(\"Skipping conversation_end (tool_use in progress)\");\n return [context, []];\n }\n\n // For all other cases (end_turn, max_tokens, etc.), emit conversation_end\n const conversationEndEvent: ConversationEndEvent = {\n type: \"conversation_end\",\n timestamp: Date.now(),\n data: {\n reason: \"completed\",\n },\n };\n\n return [context, [conversationEndEvent]];\n}\n\n/**\n * Handle text_delta event\n *\n * Emits: conversation_responding\n */\nfunction handleTextDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const respondingEvent: ConversationRespondingEvent = {\n type: \"conversation_responding\",\n timestamp: Date.now(),\n data: {},\n };\n\n return [context, [respondingEvent]];\n}\n\n/**\n * Handle tool_use_start event\n *\n * Emits: tool_planned, tool_executing\n */\nfunction handleToolUseStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as ToolUseStartEvent[\"data\"];\n const outputs: StateEventProcessorOutput[] = [];\n\n // Emit ToolPlannedEvent\n const toolPlannedEvent: ToolPlannedEvent = {\n type: \"tool_planned\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n },\n };\n outputs.push(toolPlannedEvent);\n\n // Emit ToolExecutingEvent\n const toolExecutingEvent: ToolExecutingEvent = {\n type: \"tool_executing\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n input: {},\n },\n };\n outputs.push(toolExecutingEvent);\n\n return [context, outputs];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Pass through - no State Event emitted.\n * StateMachine handles the state transition internally.\n */\nfunction handleToolUseStop(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // Pass through - no State Event\n return [context, []];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_occurred\n */\nfunction handleErrorReceived(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n const errorOccurredEvent: ErrorOccurredEvent = {\n type: \"error_occurred\",\n timestamp: Date.now(),\n data: {\n code: data.errorCode || \"unknown_error\",\n message: data.message,\n recoverable: true,\n },\n };\n\n return [context, [errorOccurredEvent]];\n}\n\n/**\n * StateEvent Processor Definition\n *\n * Stateless event transformer: Stream Events → State Events\n */\nexport const stateEventProcessorDef: ProcessorDefinition<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = {\n name: \"StateEventProcessor\",\n description: \"Transform Stream Events into State Events\",\n initialState: createInitialStateEventProcessorContext,\n processor: stateEventProcessor,\n};\n","/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function that tracks request-response turn pairs.\n *\n * Input Events:\n * - user_message (Message Layer)\n * - message_stop (Stream Layer - contains stop reason)\n * - assistant_message (Message Layer)\n *\n * Output Events (Turn Layer):\n * - turn_request\n * - turn_response\n */\n\nimport type { Processor, ProcessorDefinition } from \"~/engine/mealy\";\nimport type {\n // Input: combined stream and message events\n StreamEvent,\n AgentMessageEvent,\n MessageStopEvent,\n UserMessageEvent,\n // Output: Turn events\n TurnRequestEvent,\n TurnResponseEvent,\n // Data types\n TokenUsage,\n} from \"@agentxjs/types/agent\";\n\n// ===== State Types =====\n\n/**\n * Pending turn tracking\n */\nexport interface PendingTurn {\n turnId: string;\n messageId: string;\n content: string;\n requestedAt: number;\n}\n\n/**\n * TurnTrackerState\n *\n * Tracks the current turn state.\n */\nexport interface TurnTrackerState {\n /**\n * Currently pending turn (waiting for response)\n */\n pendingTurn: PendingTurn | null;\n\n /**\n * Cost per input token (USD)\n */\n costPerInputToken: number;\n\n /**\n * Cost per output token (USD)\n */\n costPerOutputToken: number;\n}\n\n/**\n * Initial state factory for TurnTracker\n */\nexport function createInitialTurnTrackerState(): TurnTrackerState {\n return {\n pendingTurn: null,\n costPerInputToken: 0.000003, // $3 per 1M tokens\n costPerOutputToken: 0.000015, // $15 per 1M tokens\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from TurnTracker\n */\nexport type TurnTrackerOutput = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Input event types for TurnTracker\n * Accepts both Stream and Message layer events\n */\nexport type TurnTrackerInput = StreamEvent | AgentMessageEvent;\n\n/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function for turn tracking.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const turnTrackerProcessor: Processor<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = (state, input): [TurnTrackerState, TurnTrackerOutput[]] => {\n switch (input.type) {\n case \"user_message\":\n return handleUserMessage(state, input as AgentMessageEvent);\n\n case \"message_stop\":\n return handleMessageStop(state, input as StreamEvent);\n\n case \"assistant_message\":\n // Turn completion is handled in message_stop\n // This handler is kept for potential future use\n return [state, []];\n\n default:\n return [state, []];\n }\n};\n\n/**\n * Handle user_message event\n */\nfunction handleUserMessage(\n state: Readonly<TurnTrackerState>,\n event: AgentMessageEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n const data = event.data as UserMessageEvent[\"data\"];\n const turnId = generateId();\n\n const pendingTurn: PendingTurn = {\n turnId,\n messageId: data.messageId,\n content: data.content,\n requestedAt: event.timestamp,\n };\n\n const turnRequestEvent: TurnRequestEvent = {\n type: \"turn_request\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId: data.messageId,\n content: data.content,\n timestamp: event.timestamp,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn,\n },\n [turnRequestEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<TurnTrackerState>,\n event: StreamEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const data = event.data as MessageStopEvent[\"data\"];\n const stopReason = data.stopReason;\n\n // Complete turn based on stop reason\n // - \"end_turn\": Normal completion (no tool use)\n // - \"tool_use\": Tool calling in progress, DON'T complete yet\n // - \"max_tokens\": Hit token limit, complete turn\n // - \"stop_sequence\": Hit stop sequence, complete turn\n if (stopReason === \"end_turn\" || stopReason === \"max_tokens\" || stopReason === \"stop_sequence\") {\n return completeTurn(state, event.timestamp);\n }\n\n // For tool_use, don't complete turn yet\n return [state, []];\n}\n\n/**\n * Complete the turn and emit TurnResponseEvent\n */\nfunction completeTurn(\n state: Readonly<TurnTrackerState>,\n completedAt: number\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { turnId, messageId, requestedAt } = state.pendingTurn;\n const duration = completedAt - requestedAt;\n\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const turnResponseEvent: TurnResponseEvent = {\n type: \"turn_response\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId,\n duration,\n usage,\n timestamp: completedAt,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn: null,\n },\n [turnResponseEvent],\n ];\n}\n\n/**\n * TurnTracker Processor Definition\n */\nexport const turnTrackerProcessorDef: ProcessorDefinition<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = {\n name: \"TurnTracker\",\n description: \"Tracks request-response turn pairs\",\n initialState: createInitialTurnTrackerState,\n processor: turnTrackerProcessor,\n};\n","/**\n * AgentProcessor\n *\n * Combined Mealy processor for the full AgentX engine.\n * Composes MessageAssembler, StateMachine, and TurnTracker processors.\n */\n\nimport { combineProcessors, combineInitialStates, type Processor } from \"~/engine/mealy\";\n// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)\n// They flow through the system but AgentProcessor doesn't need to import them directly\nimport {\n messageAssemblerProcessor,\n stateEventProcessor,\n turnTrackerProcessor,\n createInitialMessageAssemblerState,\n createInitialStateEventProcessorContext,\n createInitialTurnTrackerState,\n type MessageAssemblerState,\n type StateEventProcessorContext,\n type TurnTrackerState,\n type MessageAssemblerOutput,\n type StateEventProcessorOutput,\n type TurnTrackerOutput,\n} from \"./internal\";\nimport type { AgentOutput } from \"@agentxjs/types/agent\";\n\n/**\n * Combined state type for the full agent engine\n */\nexport type AgentEngineState = {\n messageAssembler: MessageAssemblerState;\n stateEventProcessor: StateEventProcessorContext;\n turnTracker: TurnTrackerState;\n};\n\n/**\n * Input event type for AgentProcessor\n *\n * Accepts:\n * - StreamEventType: Raw stream events from Driver\n * - MessageEventType: Re-injected message events (for TurnTracker)\n *\n * Note: AgentOutput is used because re-injected events can be any output type\n */\nexport type AgentProcessorInput = AgentOutput;\n\n/**\n * Output event type from AgentProcessor\n *\n * Produces:\n * - MessageAssemblerOutput: Assembled message events\n * - StateEventProcessorOutput: State transition events\n * - TurnTrackerOutput: Turn analytics events\n *\n * Note: StreamEventType is NOT in output - it's passed through by AgentEngine\n */\nexport type AgentProcessorOutput =\n | MessageAssemblerOutput\n | StateEventProcessorOutput\n | TurnTrackerOutput;\n\n/**\n * Combined processor for the full agent engine\n *\n * This combines:\n * - MessageAssembler: Stream → Message events\n * - StateEventProcessor: Stream → State events\n * - TurnTracker: Message → Turn events\n *\n * Pattern: (state, input) => [newState, outputs]\n * Key insight: State is means, outputs are the goal (Mealy Machine)\n *\n * Note: Raw StreamEvents are NOT output by this processor.\n * The AgentEngine handles pass-through of original events.\n */\nexport const agentProcessor = combineProcessors<\n AgentEngineState,\n AgentProcessorInput,\n AgentProcessorOutput\n>({\n messageAssembler: messageAssemblerProcessor as unknown as Processor<\n AgentEngineState[\"messageAssembler\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n stateEventProcessor: stateEventProcessor as unknown as Processor<\n AgentEngineState[\"stateEventProcessor\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n turnTracker: turnTrackerProcessor as unknown as Processor<\n AgentEngineState[\"turnTracker\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n});\n\n/**\n * Initial state factory for the full agent engine\n */\nexport const createInitialAgentEngineState = combineInitialStates<AgentEngineState>({\n messageAssembler: createInitialMessageAssemblerState,\n stateEventProcessor: createInitialStateEventProcessorContext,\n turnTracker: createInitialTurnTrackerState,\n});\n","/**\n * MealyMachine - Pure Mealy Machine Event Processor\n *\n * MealyMachine is a stateless event processor that transforms StreamEvents\n * into higher-level events (state, message, turn events).\n *\n * Key Design:\n * - Engine is a pure Mealy Machine: process(agentId, event) → outputs\n * - Engine does NOT hold driver or presenters (those belong to AgentEngine layer)\n * - Engine manages intermediate processing state per agentId\n * - Multiple agents can share the same MealyMachine instance\n *\n * Type Relationship:\n * ```\n * StreamEvent (from Driver)\n * │\n * └── message_start, text_delta, tool_use_start, message_stop...\n * ↓ MealyMachine processes\n * AgentOutput (to AgentEngine/Presenter)\n * │\n * ├── StateEvent (conversation_start, conversation_end...)\n * ├── MessageEvent (assistant_message, tool_call_message...)\n * └── TurnEvent (turn_request, turn_response)\n * ```\n *\n * State Management:\n * - Processing state (pendingContents, etc.) is managed internally per agentId\n * - Business data persistence is NOT handled here - that's AgentEngine layer's job\n *\n * Usage:\n * ```typescript\n * const machine = new MealyMachine();\n *\n * // AgentEngine layer coordinates:\n * // 1. Driver produces StreamEvents\n * // 2. MealyMachine processes events\n * // 3. Presenters handle outputs\n *\n * for await (const streamEvent of driver.receive(message)) {\n * const outputs = machine.process(agentId, streamEvent);\n * for (const output of outputs) {\n * presenters.forEach(p => p.present(agentId, output));\n * }\n * }\n * ```\n */\n\nimport {\n agentProcessor,\n createInitialAgentEngineState,\n type AgentEngineState,\n} from \"./AgentProcessor\";\nimport { MemoryStore } from \"~/engine/mealy\";\nimport type { AgentOutput, StreamEvent } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"engine/MealyMachine\");\n\n/**\n * MealyMachine - Pure Mealy Machine for event processing\n *\n * - Input: StreamEvent (from Driver)\n * - Output: AgentOutput[] (state, message, turn events)\n * - State: Managed internally per agentId\n */\nexport class MealyMachine {\n private readonly store: MemoryStore<AgentEngineState>;\n\n constructor() {\n this.store = new MemoryStore<AgentEngineState>();\n logger.debug(\"MealyMachine initialized\");\n }\n\n /**\n * Process a single driveable event and return output events\n *\n * This is the core Mealy Machine operation:\n * process(agentId, event) → outputs[]\n *\n * @param agentId - The agent identifier (for state isolation)\n * @param event - StreamEvent to process\n * @returns Array of output events (state, message, turn events)\n */\n process(agentId: string, event: StreamEvent): AgentOutput[] {\n const eventType = (event as any).type || \"unknown\";\n logger.debug(\"Processing event\", { agentId, eventType });\n\n // Get current state or create initial state\n const isNewState = !this.store.has(agentId);\n let state = this.store.get(agentId) ?? createInitialAgentEngineState();\n\n if (isNewState) {\n logger.debug(\"Created initial state for agent\", { agentId });\n }\n\n // Collect all outputs\n const allOutputs: AgentOutput[] = [];\n\n // Pass-through: original stream event is also an output\n allOutputs.push(event);\n\n // Process through Mealy Machine\n const [newState, outputs] = agentProcessor(state, event);\n state = newState;\n\n // Collect processor outputs\n for (const output of outputs) {\n allOutputs.push(output);\n\n // Re-inject for event chaining (e.g., TurnTracker needs MessageEvents)\n const [chainedState, chainedOutputs] = this.processChained(state, output);\n state = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n // Store updated state\n this.store.set(agentId, state);\n\n if (outputs.length > 0) {\n logger.debug(\"Produced outputs\", {\n agentId,\n inputEvent: eventType,\n outputCount: allOutputs.length,\n processorOutputs: outputs.length,\n });\n }\n\n return allOutputs;\n }\n\n /**\n * Process chained events recursively\n *\n * Some processors produce events that trigger other processors:\n * - MessageAssembler produces MessageEvents\n * - TurnTracker consumes MessageEvents to produce TurnEvents\n */\n private processChained(\n state: AgentEngineState,\n event: AgentOutput\n ): [AgentEngineState, AgentOutput[]] {\n const [newState, outputs] = agentProcessor(state, event);\n\n if (outputs.length === 0) {\n return [newState, []];\n }\n\n // Process outputs recursively\n const allOutputs: AgentOutput[] = [...outputs];\n let currentState = newState;\n\n for (const output of outputs) {\n const [chainedState, chainedOutputs] = this.processChained(currentState, output);\n currentState = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n return [currentState, allOutputs];\n }\n\n /**\n * Clear state for an agent\n *\n * Call this when an agent is destroyed to free memory.\n */\n clearState(agentId: string): void {\n logger.debug(\"Clearing state\", { agentId });\n this.store.delete(agentId);\n }\n\n /**\n * Check if state exists for an agent\n */\n hasState(agentId: string): boolean {\n return this.store.has(agentId);\n }\n}\n\n/**\n * Factory function to create MealyMachine\n */\nexport function createMealyMachine(): MealyMachine {\n return new MealyMachine();\n}\n","/**\n * AgentStateMachine - State management driven by StateEvents\n *\n * Manages agent state transitions driven by StateEvents.\n * Single source of truth for agent state in AgentEngine.\n *\n * Flow:\n * StreamEvent → MealyMachine → StateEvent → AgentStateMachine → state update\n *\n * Responsibilities:\n * - Process StateEvents\n * - Maintain current AgentState\n * - Notify state change subscribers\n */\n\nimport type {\n AgentState,\n StateChange,\n StateChangeHandler,\n Unsubscribe,\n AgentOutput,\n} from \"@agentxjs/types/agent\";\nimport { isStateEvent } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agent/AgentStateMachine\");\n\n/**\n * AgentStateMachine implementation\n */\nexport class AgentStateMachine {\n private _state: AgentState = \"idle\";\n private readonly handlers = new Set<StateChangeHandler>();\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this._state;\n }\n\n /**\n * Process an event and update internal state if it's a StateEvent\n *\n * @param event - Event from MealyMachine (could be any AgentOutput)\n */\n process(event: AgentOutput): void {\n // Only process StateEvents\n if (!isStateEvent(event)) {\n return;\n }\n\n const prev = this._state;\n const next = this.mapEventToState(event);\n\n if (next !== null && prev !== next) {\n this._state = next;\n logger.debug(\"State transition\", {\n eventType: event.type,\n from: prev,\n to: next,\n });\n this.notifyHandlers({ prev, current: next });\n }\n }\n\n /**\n * Subscribe to state changes\n *\n * @param handler - Callback receiving { prev, current } state change\n * @returns Unsubscribe function\n */\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n this.handlers.add(handler);\n return () => {\n this.handlers.delete(handler);\n };\n }\n\n /**\n * Reset state machine (used on destroy)\n */\n reset(): void {\n const prev = this._state;\n this._state = \"idle\";\n\n // Notify handlers of reset to idle\n if (prev !== \"idle\") {\n this.notifyHandlers({ prev, current: \"idle\" });\n }\n\n this.handlers.clear();\n }\n\n /**\n * Map StateEvent type to AgentState\n *\n * @param event - StateEvent from MealyMachine\n * @returns New AgentState or null if no transition needed\n */\n private mapEventToState(event: AgentOutput): AgentState | null {\n switch (event.type) {\n // Conversation lifecycle\n case \"conversation_start\":\n return \"thinking\";\n case \"conversation_thinking\":\n return \"thinking\";\n case \"conversation_responding\":\n return \"responding\";\n case \"conversation_end\":\n return \"idle\";\n case \"conversation_interrupted\":\n return \"idle\";\n\n // Tool lifecycle\n case \"tool_planned\":\n return \"planning_tool\";\n case \"tool_executing\":\n return \"awaiting_tool_result\";\n case \"tool_completed\":\n return \"responding\";\n case \"tool_failed\":\n return \"responding\";\n\n // Error\n case \"error_occurred\":\n return \"error\";\n\n default:\n // Unknown event type, no state change\n return null;\n }\n }\n\n /**\n * Notify all registered handlers of state change\n */\n private notifyHandlers(change: StateChange): void {\n for (const handler of this.handlers) {\n try {\n handler(change);\n } catch (error) {\n logger.error(\"State change handler error\", {\n from: change.prev,\n to: change.current,\n error,\n });\n }\n }\n }\n}\n","/**\n * createAgent - Factory function to create an AgentEngine\n *\n * Creates a standalone AgentEngine instance with:\n * - Driver: produces StreamEvents\n * - Presenter: consumes AgentOutput\n *\n * AgentEngine is independent of Runtime (Container, Session, Bus).\n * It can be tested in isolation with mock Driver and Presenter.\n */\n\nimport type {\n AgentEngine,\n AgentState,\n AgentOutputCallback,\n Unsubscribe,\n UserMessage,\n MessageQueue,\n StateChangeHandler,\n EventHandlerMap,\n ReactHandlerMap,\n AgentOutput,\n CreateAgentOptions,\n StreamEvent,\n} from \"@agentxjs/types/agent\";\nimport type { AgentMiddleware, AgentInterceptor } from \"@agentxjs/types/agent/internal\";\nimport { MealyMachine } from \"./engine/MealyMachine\";\nimport { AgentStateMachine } from \"./AgentStateMachine\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agent/SimpleAgent\");\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Simple MessageQueue implementation\n */\nclass SimpleMessageQueue implements MessageQueue {\n private queue: UserMessage[] = [];\n\n get length(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n enqueue(message: UserMessage): void {\n this.queue.push(message);\n }\n\n dequeue(): UserMessage | undefined {\n return this.queue.shift();\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * SimpleAgent - Minimal AgentEngine implementation\n */\nclass SimpleAgent implements AgentEngine {\n readonly agentId: string;\n readonly createdAt: number;\n readonly messageQueue: MessageQueue;\n\n private readonly _messageQueue = new SimpleMessageQueue();\n\n private readonly driver: CreateAgentOptions[\"driver\"];\n private readonly presenter: CreateAgentOptions[\"presenter\"];\n private readonly machine: MealyMachine;\n private readonly stateMachine: AgentStateMachine;\n\n private readonly handlers: Set<AgentOutputCallback> = new Set();\n private readonly typeHandlers: Map<string, Set<AgentOutputCallback>> = new Map();\n private readonly readyHandlers: Set<() => void> = new Set();\n private readonly destroyHandlers: Set<() => void> = new Set();\n private readonly middlewares: AgentMiddleware[] = [];\n private readonly interceptors: AgentInterceptor[] = [];\n\n private isProcessing = false;\n\n constructor(options: CreateAgentOptions) {\n this.agentId = generateAgentId();\n this.createdAt = Date.now();\n this.messageQueue = this._messageQueue;\n this.driver = options.driver;\n this.presenter = options.presenter;\n this.machine = new MealyMachine();\n this.stateMachine = new AgentStateMachine();\n }\n\n get state(): AgentState {\n return this.stateMachine.state;\n }\n\n async receive(message: string | UserMessage): Promise<void> {\n console.log(\n \"[SimpleAgent.receive] CALLED with message:\",\n typeof message === \"string\" ? message : message.content\n );\n\n const userMessage: UserMessage =\n typeof message === \"string\"\n ? {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content: message,\n timestamp: Date.now(),\n }\n : message;\n\n // Queue the message\n this._messageQueue.enqueue(userMessage);\n\n console.log(\"[SimpleAgent.receive] Message queued, isProcessing:\", this.isProcessing);\n\n // If already processing, just queue and return a promise that resolves when this message completes\n if (this.isProcessing) {\n return new Promise((resolve, reject) => {\n // Store resolve/reject to call when this message is processed\n (userMessage as any)._resolve = resolve;\n (userMessage as any)._reject = reject;\n });\n }\n\n // Start processing\n console.log(\"[SimpleAgent.receive] Starting processQueue\");\n await this.processQueue();\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n console.log(\"[SimpleAgent.processQueue] Starting, queue size:\", this._messageQueue.length);\n\n while (!this._messageQueue.isEmpty) {\n const message = this._messageQueue.dequeue();\n if (!message) break;\n\n console.log(\"[SimpleAgent.processQueue] Processing message:\", message.id);\n\n try {\n await this.processMessage(message);\n // Resolve the promise if exists\n if ((message as any)._resolve) {\n (message as any)._resolve();\n }\n } catch (error) {\n // Reject the promise if exists\n if ((message as any)._reject) {\n (message as any)._reject(error);\n }\n throw error;\n }\n }\n\n this.isProcessing = false;\n console.log(\"[SimpleAgent.processQueue] Finished\");\n }\n\n private async processMessage(message: UserMessage): Promise<void> {\n console.log(\"[SimpleAgent.processMessage] START, message:\", message.id);\n\n // Run through middleware chain\n let processedMessage = message;\n for (const middleware of this.middlewares) {\n let nextCalled = false;\n await middleware(processedMessage, async (msg) => {\n nextCalled = true;\n processedMessage = msg;\n });\n if (!nextCalled) {\n // Middleware blocked the message\n console.log(\"[SimpleAgent.processMessage] Middleware blocked message\");\n return;\n }\n }\n\n console.log(\"[SimpleAgent.processMessage] Getting driver stream...\");\n const driverStream = this.driver.receive(processedMessage);\n console.log(\"[SimpleAgent.processMessage] Driver stream:\", driverStream);\n\n try {\n console.log(\"[SimpleAgent.processMessage] Starting for-await loop...\");\n for await (const streamEvent of driverStream) {\n this.handleStreamEvent(streamEvent);\n }\n console.log(\"[SimpleAgent.processMessage] For-await loop completed\");\n } catch (error) {\n console.log(\"[SimpleAgent.processMessage] ERROR:\", error);\n // On error, state will be reset by error_occurred StateEvent\n throw error;\n }\n console.log(\"[SimpleAgent.processMessage] END\");\n }\n\n /**\n * Handle a stream event from the driver (push-based API)\n *\n * This method processes a single StreamEvent through the MealyMachine\n * and emits all resulting outputs to presenter and handlers.\n */\n handleStreamEvent(event: StreamEvent): void {\n logger.info(\"handleStreamEvent\", { type: event.type });\n\n // Process through MealyMachine to get all outputs\n // (stream + message + state + turn events)\n const outputs = this.machine.process(this.agentId, event);\n\n logger.info(\"MealyMachine outputs\", {\n count: outputs.length,\n types: outputs.map((o) => o.type),\n });\n\n // Emit all outputs\n for (const output of outputs) {\n // Let StateMachine process StateEvents first\n this.stateMachine.process(output);\n\n // Emit output to presenter and handlers\n this.emitOutput(output);\n }\n }\n\n private emitOutput(output: AgentOutput): void {\n // Run through interceptor chain\n let currentOutput: AgentOutput | null = output;\n\n const runInterceptor = (index: number, out: AgentOutput): void => {\n if (index >= this.interceptors.length) {\n currentOutput = out;\n return;\n }\n this.interceptors[index](out, (nextOut) => {\n runInterceptor(index + 1, nextOut);\n });\n };\n\n runInterceptor(0, output);\n\n if (!currentOutput) return;\n\n // Send to presenter\n this.presenter.present(this.agentId, currentOutput);\n\n // Notify handlers\n for (const handler of this.handlers) {\n try {\n handler(currentOutput);\n } catch (e) {\n console.error(\"Event handler error:\", e);\n }\n }\n\n // Notify type-specific handlers\n const typeSet = this.typeHandlers.get(currentOutput.type);\n if (typeSet) {\n for (const handler of typeSet) {\n try {\n handler(currentOutput);\n } catch (e) {\n console.error(\"Event handler error:\", e);\n }\n }\n }\n }\n\n on(handler: AgentOutputCallback): Unsubscribe;\n on(handlers: EventHandlerMap): Unsubscribe;\n on(type: string, handler: AgentOutputCallback): Unsubscribe;\n on(types: string[], handler: AgentOutputCallback): Unsubscribe;\n on(\n typeOrHandler: string | string[] | AgentOutputCallback | EventHandlerMap,\n handler?: AgentOutputCallback\n ): Unsubscribe {\n // on(handler) - subscribe to all\n if (typeof typeOrHandler === \"function\") {\n this.handlers.add(typeOrHandler);\n return () => this.handlers.delete(typeOrHandler);\n }\n\n // on(handlers: EventHandlerMap)\n if (typeof typeOrHandler === \"object\" && !Array.isArray(typeOrHandler)) {\n const unsubscribes: Unsubscribe[] = [];\n for (const [type, h] of Object.entries(typeOrHandler)) {\n if (h) {\n unsubscribes.push(this.on(type, h));\n }\n }\n return () => unsubscribes.forEach((u) => u());\n }\n\n // on(type, handler) or on(types, handler)\n const types = Array.isArray(typeOrHandler) ? typeOrHandler : [typeOrHandler];\n const h = handler!;\n\n for (const type of types) {\n if (!this.typeHandlers.has(type)) {\n this.typeHandlers.set(type, new Set());\n }\n this.typeHandlers.get(type)!.add(h);\n }\n\n return () => {\n for (const type of types) {\n this.typeHandlers.get(type)?.delete(h);\n }\n };\n }\n\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n return this.stateMachine.onStateChange(handler);\n }\n\n react(handlers: ReactHandlerMap): Unsubscribe {\n // Convert onXxx to event types\n const eventHandlerMap: EventHandlerMap = {};\n for (const [key, handler] of Object.entries(handlers)) {\n if (handler && key.startsWith(\"on\")) {\n // onTextDelta -> text_delta\n const eventType = key\n .slice(2)\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .slice(1);\n eventHandlerMap[eventType] = handler;\n }\n }\n return this.on(eventHandlerMap);\n }\n\n onReady(handler: () => void): Unsubscribe {\n // Call immediately since agent is ready upon creation\n try {\n handler();\n } catch (e) {\n console.error(\"onReady handler error:\", e);\n }\n this.readyHandlers.add(handler);\n return () => this.readyHandlers.delete(handler);\n }\n\n onDestroy(handler: () => void): Unsubscribe {\n this.destroyHandlers.add(handler);\n return () => this.destroyHandlers.delete(handler);\n }\n\n use(middleware: AgentMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n intercept(interceptor: AgentInterceptor): Unsubscribe {\n this.interceptors.push(interceptor);\n return () => {\n const index = this.interceptors.indexOf(interceptor);\n if (index >= 0) {\n this.interceptors.splice(index, 1);\n }\n };\n }\n\n interrupt(): void {\n if (this.state === \"idle\") {\n return;\n }\n this.driver.interrupt();\n // State will be updated by conversation_interrupted StateEvent from driver\n }\n\n async destroy(): Promise<void> {\n // If processing, interrupt first\n if (this.state !== \"idle\") {\n this.interrupt();\n }\n\n // Notify destroy handlers\n for (const handler of this.destroyHandlers) {\n try {\n handler();\n } catch (e) {\n console.error(\"onDestroy handler error:\", e);\n }\n }\n\n // Clear MealyMachine state for this agent\n this.machine.clearState(this.agentId);\n\n // Reset StateMachine\n this.stateMachine.reset();\n\n this._messageQueue.clear();\n this.handlers.clear();\n this.typeHandlers.clear();\n this.readyHandlers.clear();\n this.destroyHandlers.clear();\n this.middlewares.length = 0;\n this.interceptors.length = 0;\n }\n}\n\n/**\n * Create an AgentEngine instance\n */\nexport function createAgent(options: CreateAgentOptions): AgentEngine {\n return new SimpleAgent(options);\n}\n","/**\n * ClaudeReceptor - Perceives Claude SDK responses and emits to SystemBus\n *\n * Converts Claude SDK stream events to DriveableEvents.\n * DriveableEvents are the subset of EnvironmentEvents that can drive Agent.\n *\n * Type Relationship:\n * ```\n * EnvironmentEvent\n * ├── DriveableEvent ← ClaudeReceptor outputs this\n * │ └── message_start, text_delta, message_stop, interrupted...\n * └── ConnectionEvent\n * ```\n */\n\nimport type { Receptor, SystemBusProducer } from \"@agentxjs/types/runtime/internal\";\nimport type {\n DriveableEvent,\n MessageStartEvent,\n MessageStopEvent,\n TextContentBlockStartEvent,\n TextDeltaEvent,\n TextContentBlockStopEvent,\n ToolUseContentBlockStartEvent,\n InputJsonDeltaEvent,\n ToolUseContentBlockStopEvent,\n ToolResultEvent,\n InterruptedEvent,\n ErrorReceivedEvent,\n EventContext,\n} from \"@agentxjs/types/runtime\";\nimport type { SDKPartialAssistantMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport { createLogger } from \"@agentxjs/common\";\n\n/**\n * Context for tracking content block state across events\n */\ninterface ContentBlockContext {\n currentBlockType: \"text\" | \"tool_use\" | null;\n currentBlockIndex: number;\n currentToolId: string | null;\n currentToolName: string | null;\n lastStopReason: string | null;\n lastStopSequence: string | null;\n}\n\n/**\n * Metadata passed with each SDK message for event correlation\n */\nexport interface ReceptorMeta {\n requestId: string;\n context: EventContext;\n}\n\nconst logger = createLogger(\"ecosystem/ClaudeReceptor\");\n\n/**\n * ClaudeReceptor - Perceives Claude SDK and emits DriveableEvents to SystemBus\n *\n * Uses SystemBusProducer (write-only) because Receptor only emits events.\n */\nexport class ClaudeReceptor implements Receptor {\n private producer: SystemBusProducer | null = null;\n private currentMeta: ReceptorMeta | null = null;\n\n /** Context for tracking content block state */\n private blockContext: ContentBlockContext = {\n currentBlockType: null,\n currentBlockIndex: 0,\n currentToolId: null,\n currentToolName: null,\n lastStopReason: null,\n lastStopSequence: null,\n };\n\n /**\n * Connect to SystemBus producer to emit events\n */\n connect(producer: SystemBusProducer): void {\n this.producer = producer;\n logger.debug(\"ClaudeReceptor connected to SystemBusProducer\");\n }\n\n /**\n * Feed SDK message to receptor with correlation metadata\n * @param sdkMsg - SDK message from Claude\n * @param meta - Request metadata for event correlation\n */\n feed(sdkMsg: SDKPartialAssistantMessage, meta: ReceptorMeta): void {\n this.currentMeta = meta;\n this.processStreamEvent(sdkMsg);\n }\n\n /**\n * Emit interrupted event\n */\n emitInterrupted(\n reason: \"user_interrupt\" | \"timeout\" | \"error\" | \"system\",\n meta?: ReceptorMeta\n ): void {\n const eventMeta = meta || this.currentMeta;\n this.emitToBus({\n type: \"interrupted\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId: eventMeta?.requestId,\n context: eventMeta?.context,\n data: { reason },\n } as InterruptedEvent);\n }\n\n /**\n * Emit error_received event\n *\n * Used when an error is received from the environment (e.g., Claude API error).\n * This drives the MealyMachine to produce error_occurred + error_message events.\n */\n emitError(message: string, errorCode?: string, meta?: ReceptorMeta): void {\n const eventMeta = meta || this.currentMeta;\n this.emitToBus({\n type: \"error_received\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId: eventMeta?.requestId,\n context: eventMeta?.context,\n data: { message, errorCode },\n } as ErrorReceivedEvent);\n }\n\n /**\n * Feed SDK user message (contains tool_result) to receptor\n * @param sdkMsg - SDK user message from Claude\n * @param meta - Request metadata for event correlation\n */\n feedUserMessage(sdkMsg: { message?: { content?: unknown[] } }, meta: ReceptorMeta): void {\n this.currentMeta = meta;\n const { requestId, context } = meta;\n\n if (!sdkMsg.message || !Array.isArray(sdkMsg.message.content)) {\n return;\n }\n\n for (const block of sdkMsg.message.content) {\n if (block && typeof block === \"object\" && \"type\" in block && block.type === \"tool_result\") {\n const toolResultBlock = block as unknown as {\n tool_use_id: string;\n content: unknown;\n is_error?: boolean;\n };\n\n this.emitToBus({\n type: \"tool_result\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n toolUseId: toolResultBlock.tool_use_id,\n result: toolResultBlock.content,\n isError: toolResultBlock.is_error || false,\n },\n } as ToolResultEvent);\n }\n }\n }\n\n /**\n * Process stream_event from SDK and emit corresponding DriveableEvent\n *\n * Uses currentMeta for requestId and context correlation.\n */\n private processStreamEvent(sdkMsg: SDKPartialAssistantMessage): void {\n const event = sdkMsg.event;\n const { requestId, context } = this.currentMeta || {};\n\n // All DriveableEvents are internal-only (broadcastable: false)\n // They are consumed by BusDriver and processed through MealyMachine\n // BusPresenter will emit the transformed SystemEvents to clients\n\n switch (event.type) {\n case \"message_start\":\n // Reset context on new message\n this.blockContext = {\n currentBlockType: null,\n currentBlockIndex: 0,\n currentToolId: null,\n currentToolName: null,\n lastStopReason: null,\n lastStopSequence: null,\n };\n\n this.emitToBus({\n type: \"message_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n message: {\n id: event.message.id,\n model: event.message.model,\n },\n },\n } as MessageStartEvent);\n break;\n\n case \"content_block_start\": {\n const contentBlock = event.content_block as { type: string; id?: string; name?: string };\n this.blockContext.currentBlockIndex = event.index;\n logger.debug(\"content_block_start received\", { contentBlock, index: event.index });\n\n if (contentBlock.type === \"text\") {\n this.blockContext.currentBlockType = \"text\";\n this.emitToBus({\n type: \"text_content_block_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: event.index,\n requestId,\n context,\n data: {},\n } as TextContentBlockStartEvent);\n } else if (contentBlock.type === \"tool_use\") {\n this.blockContext.currentBlockType = \"tool_use\";\n this.blockContext.currentToolId = contentBlock.id || null;\n this.blockContext.currentToolName = contentBlock.name || null;\n this.emitToBus({\n type: \"tool_use_content_block_start\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: event.index,\n requestId,\n context,\n data: {\n id: contentBlock.id || \"\",\n name: contentBlock.name || \"\",\n },\n } as ToolUseContentBlockStartEvent);\n }\n break;\n }\n\n case \"content_block_delta\": {\n const delta = event.delta as { type: string; text?: string; partial_json?: string };\n\n if (delta.type === \"text_delta\") {\n this.emitToBus({\n type: \"text_delta\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: { text: delta.text || \"\" },\n } as TextDeltaEvent);\n } else if (delta.type === \"input_json_delta\") {\n this.emitToBus({\n type: \"input_json_delta\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: { partialJson: delta.partial_json || \"\" },\n } as InputJsonDeltaEvent);\n }\n break;\n }\n\n case \"content_block_stop\":\n if (this.blockContext.currentBlockType === \"tool_use\" && this.blockContext.currentToolId) {\n this.emitToBus({\n type: \"tool_use_content_block_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: {},\n } as ToolUseContentBlockStopEvent);\n } else {\n this.emitToBus({\n type: \"text_content_block_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n index: this.blockContext.currentBlockIndex,\n requestId,\n context,\n data: {},\n } as TextContentBlockStopEvent);\n }\n // Reset current block type after stop\n this.blockContext.currentBlockType = null;\n this.blockContext.currentToolId = null;\n this.blockContext.currentToolName = null;\n break;\n\n case \"message_delta\": {\n const msgDelta = event.delta as { stop_reason?: string; stop_sequence?: string };\n if (msgDelta.stop_reason) {\n this.blockContext.lastStopReason = msgDelta.stop_reason;\n this.blockContext.lastStopSequence = msgDelta.stop_sequence || null;\n }\n break;\n }\n\n case \"message_stop\":\n this.emitToBus({\n type: \"message_stop\",\n timestamp: Date.now(),\n source: \"environment\",\n category: \"stream\",\n intent: \"notification\",\n broadcastable: false,\n requestId,\n context,\n data: {\n stopReason:\n (this.blockContext.lastStopReason as\n | \"end_turn\"\n | \"tool_use\"\n | \"max_tokens\"\n | \"stop_sequence\") || \"end_turn\",\n stopSequence: this.blockContext.lastStopSequence || undefined,\n },\n } as MessageStopEvent);\n // Reset after emitting\n this.blockContext.lastStopReason = null;\n this.blockContext.lastStopSequence = null;\n break;\n }\n }\n\n private emitToBus(event: DriveableEvent): void {\n if (this.producer) {\n this.producer.emit(event);\n }\n }\n}\n","/**\n * ClaudeEffector - Listens to SystemBus and sends to Claude SDK\n *\n * Subscribes to user_message events on SystemBus and sends to Claude SDK.\n */\n\nimport type { Effector, SystemBusConsumer } from \"@agentxjs/types/runtime/internal\";\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { EventContext } from \"@agentxjs/types/runtime\";\nimport { query, type SDKUserMessage, type Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Subject } from \"rxjs\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { buildOptions, type EnvironmentContext } from \"./buildOptions\";\nimport { buildSDKUserMessage } from \"./helpers\";\nimport { observableToAsyncIterable } from \"./observableToAsyncIterable\";\nimport type { ClaudeReceptor, ReceptorMeta } from \"./ClaudeReceptor\";\n\nconst logger = createLogger(\"ecosystem/ClaudeEffector\");\n\n/** Default timeout in milliseconds (30 seconds) */\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * ClaudeEffector configuration\n */\nexport interface ClaudeEffectorConfig {\n /** Agent ID for filtering events (required) */\n agentId: string;\n apiKey: string;\n baseUrl?: string;\n model?: string;\n systemPrompt?: string;\n cwd?: string;\n sessionId?: string;\n resumeSessionId?: string;\n onSessionIdCaptured?: (sessionId: string) => void;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * ClaudeEffector - Subscribes to SystemBus and sends to Claude SDK\n *\n * Uses SystemBusConsumer (read-only) because Effector only subscribes to events.\n */\nexport class ClaudeEffector implements Effector {\n private readonly config: ClaudeEffectorConfig;\n private readonly receptor: ClaudeReceptor;\n\n private promptSubject = new Subject<SDKUserMessage>();\n private currentAbortController: AbortController | null = null;\n private claudeQuery: Query | null = null;\n private isInitialized = false;\n private wasInterrupted = false;\n private currentMeta: ReceptorMeta | null = null;\n\n constructor(config: ClaudeEffectorConfig, receptor: ClaudeReceptor) {\n this.config = config;\n this.receptor = receptor;\n }\n\n /**\n * Connect to SystemBus consumer to subscribe to events\n */\n connect(consumer: SystemBusConsumer): void {\n logger.debug(\"ClaudeEffector connected to SystemBusConsumer\", {\n agentId: this.config.agentId,\n });\n\n // Listen for user_message events (with requestId and context)\n // Filter by agentId to only process messages for this agent\n consumer.on(\"user_message\", async (event) => {\n const typedEvent = event as {\n type: string;\n data: UserMessage;\n requestId?: string;\n context?: EventContext;\n };\n\n logger.debug(\"user_message event received\", {\n eventAgentId: typedEvent.context?.agentId,\n myAgentId: this.config.agentId,\n matches: typedEvent.context?.agentId === this.config.agentId,\n });\n\n // Filter by agentId - only process messages for this agent\n if (typedEvent.context?.agentId !== this.config.agentId) {\n return;\n }\n\n const message = typedEvent.data;\n const meta: ReceptorMeta = {\n requestId: typedEvent.requestId || \"\",\n context: typedEvent.context || {},\n };\n await this.send(message, meta);\n });\n\n // Listen for interrupt events\n // Filter by agentId to only process interrupts for this agent\n consumer.on(\"interrupt\", (event) => {\n const typedEvent = event as {\n type: string;\n requestId?: string;\n context?: EventContext;\n };\n\n // Filter by agentId - only process interrupts for this agent\n if (typedEvent.context?.agentId !== this.config.agentId) {\n return;\n }\n\n const meta: ReceptorMeta = {\n requestId: typedEvent.requestId || \"\",\n context: typedEvent.context || {},\n };\n this.interrupt(meta);\n });\n }\n\n /**\n * Send a message to Claude SDK\n */\n private async send(message: UserMessage, meta: ReceptorMeta): Promise<void> {\n this.wasInterrupted = false;\n this.currentAbortController = new AbortController();\n this.currentMeta = meta; // Store for background listener\n\n const timeout = this.config.timeout ?? DEFAULT_TIMEOUT;\n const timeoutId = setTimeout(() => {\n logger.warn(\"Request timeout\", { timeout });\n this.currentAbortController?.abort(new Error(`Request timeout after ${timeout}ms`));\n }, timeout);\n\n try {\n await this.initialize(this.currentAbortController);\n\n const sessionId = this.config.sessionId || \"default\";\n const sdkUserMessage = buildSDKUserMessage(message, sessionId);\n\n logger.debug(\"Sending message to Claude\", {\n content:\n typeof message.content === \"string\" ? message.content.substring(0, 80) : \"[structured]\",\n timeout,\n requestId: meta.requestId,\n });\n\n this.promptSubject.next(sdkUserMessage);\n\n // Process SDK responses\n // Note: We don't await here - background listener handles responses\n // currentMeta stays set until the next send() call\n } finally {\n clearTimeout(timeoutId);\n this.currentAbortController = null;\n this.wasInterrupted = false;\n // Don't clear currentMeta - it's needed by background listener\n // this.currentMeta = null;\n }\n }\n\n /**\n * Interrupt current operation\n */\n private interrupt(meta?: ReceptorMeta): void {\n if (this.claudeQuery) {\n logger.debug(\"Interrupting Claude query\", { requestId: meta?.requestId });\n this.wasInterrupted = true;\n // Store meta for interrupted event\n if (meta) {\n this.currentMeta = meta;\n }\n this.claudeQuery.interrupt().catch((err) => {\n logger.debug(\"SDK interrupt() error (may be expected)\", { error: err });\n });\n }\n }\n\n /**\n * Initialize the Claude SDK query (lazy initialization)\n */\n private async initialize(abortController: AbortController): Promise<void> {\n if (this.isInitialized) return;\n\n logger.info(\"Initializing ClaudeEffector\");\n\n const context: EnvironmentContext = {\n apiKey: this.config.apiKey,\n baseUrl: this.config.baseUrl,\n model: this.config.model,\n systemPrompt: this.config.systemPrompt,\n cwd: this.config.cwd,\n resume: this.config.resumeSessionId,\n };\n\n const sdkOptions = buildOptions(context, abortController);\n const promptStream = observableToAsyncIterable<SDKUserMessage>(this.promptSubject);\n\n this.claudeQuery = query({\n prompt: promptStream,\n options: sdkOptions,\n });\n\n this.isInitialized = true;\n\n // Background listener for SDK responses\n this.startBackgroundListener();\n\n logger.info(\"ClaudeEffector initialized\");\n }\n\n /**\n * Start background listener for SDK responses\n */\n private startBackgroundListener(): void {\n (async () => {\n try {\n for await (const sdkMsg of this.claudeQuery!) {\n // Log all SDK messages for debugging\n logger.debug(\"SDK message received\", {\n type: sdkMsg.type,\n subtype: (sdkMsg as { subtype?: string }).subtype,\n sessionId: sdkMsg.session_id,\n hasCurrentMeta: !!this.currentMeta,\n });\n\n // Forward stream_event to receptor for emission with current meta\n if (sdkMsg.type === \"stream_event\" && this.currentMeta) {\n this.receptor.feed(sdkMsg, this.currentMeta);\n }\n\n // Forward user message (contains tool_result) to receptor\n if (sdkMsg.type === \"user\" && this.currentMeta) {\n this.receptor.feedUserMessage(sdkMsg, this.currentMeta);\n }\n\n // Capture session ID\n if (sdkMsg.session_id && this.config.onSessionIdCaptured) {\n this.config.onSessionIdCaptured(sdkMsg.session_id);\n }\n\n // Handle result\n if (sdkMsg.type === \"result\") {\n const resultMsg = sdkMsg as {\n subtype: string;\n is_error?: boolean;\n errors?: string[];\n error?: { message?: string; type?: string };\n };\n // Log full result object for debugging\n logger.info(\"SDK result received (full)\", {\n fullResult: JSON.stringify(sdkMsg, null, 2),\n });\n logger.info(\"SDK result received\", {\n subtype: resultMsg.subtype,\n isError: resultMsg.is_error,\n errors: resultMsg.errors,\n wasInterrupted: this.wasInterrupted,\n });\n\n // Handle user interrupt\n if (resultMsg.subtype === \"error_during_execution\" && this.wasInterrupted) {\n this.receptor.emitInterrupted(\"user_interrupt\", this.currentMeta || undefined);\n }\n // Handle SDK errors (API errors, rate limits, etc.)\n else if (resultMsg.is_error && this.currentMeta) {\n const fullResult = sdkMsg as {\n result?: string;\n error?: { message?: string; type?: string };\n errors?: string[];\n };\n const errorMessage =\n fullResult.error?.message ||\n fullResult.errors?.join(\", \") ||\n (typeof fullResult.result === \"string\" ? fullResult.result : null) ||\n \"An error occurred\";\n const errorCode = fullResult.error?.type || resultMsg.subtype || \"api_error\";\n this.receptor.emitError(errorMessage, errorCode, this.currentMeta);\n }\n }\n }\n } catch (error) {\n if (this.isAbortError(error)) {\n logger.debug(\"Background listener aborted (expected during interrupt)\");\n this.resetState();\n } else {\n logger.error(\"Background listener error\", { error });\n // Emit error to receptor so it can be displayed in chat\n if (this.currentMeta) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n this.receptor.emitError(errorMessage, \"runtime_error\", this.currentMeta);\n }\n }\n }\n })();\n }\n\n /**\n * Check if an error is an abort error\n */\n private isAbortError(error: unknown): boolean {\n if (error instanceof Error) {\n if (error.name === \"AbortError\") return true;\n if (error.message.includes(\"aborted\")) return true;\n if (error.message.includes(\"abort\")) return true;\n }\n return false;\n }\n\n /**\n * Reset state after abort\n */\n private resetState(): void {\n this.isInitialized = false;\n this.claudeQuery = null;\n this.promptSubject = new Subject<SDKUserMessage>();\n }\n\n /**\n * Dispose and cleanup resources\n */\n dispose(): void {\n logger.debug(\"Disposing ClaudeEffector\");\n\n // Abort any ongoing request\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n // Complete the prompt subject\n this.promptSubject.complete();\n\n // Reset state\n this.resetState();\n }\n}\n","/**\n * Build Claude SDK Options from Environment Config\n *\n * Converts environment configuration to Claude SDK Options format.\n */\n\nimport type { Options } from \"@anthropic-ai/claude-agent-sdk\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"environment/buildOptions\");\n\n/**\n * Environment context for Claude SDK\n */\nexport interface EnvironmentContext {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n systemPrompt?: string;\n cwd?: string;\n permissionMode?: \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"plan\";\n resume?: string;\n maxTurns?: number;\n maxThinkingTokens?: number;\n}\n\n/**\n * Build Claude SDK options from environment context\n */\nexport function buildOptions(\n context: EnvironmentContext,\n abortController: AbortController\n): Options {\n const options: Options = {\n abortController,\n includePartialMessages: true,\n };\n\n // Working directory\n if (context.cwd) {\n options.cwd = context.cwd;\n }\n\n // Environment variables - must include PATH for subprocess to find node\n const env: Record<string, string> = {};\n // Copy all process.env values, filtering out undefined\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n env[key] = value;\n }\n }\n // Ensure PATH is set (critical for subprocess to find node)\n if (!env.PATH && process.env.PATH) {\n env.PATH = process.env.PATH;\n }\n if (context.baseUrl) {\n env.ANTHROPIC_BASE_URL = context.baseUrl;\n }\n if (context.apiKey) {\n env.ANTHROPIC_API_KEY = context.apiKey;\n }\n options.env = env;\n\n logger.info(\"buildOptions called\", {\n hasPath: !!env.PATH,\n pathLength: env.PATH?.length,\n hasApiKey: !!env.ANTHROPIC_API_KEY,\n hasBaseUrl: !!env.ANTHROPIC_BASE_URL,\n baseUrl: env.ANTHROPIC_BASE_URL,\n model: context.model,\n permissionMode: context.permissionMode || \"bypassPermissions\",\n cwd: context.cwd,\n });\n\n // Capture stderr from SDK subprocess for debugging\n options.stderr = (data: string) => {\n logger.info(\"SDK stderr\", { data: data.trim() });\n };\n\n // Note: We don't set options.executable - SDK defaults to 'node' or 'bun'\n // The SDK will automatically find the claude-code CLI\n\n // Model configuration\n if (context.model) options.model = context.model;\n if (context.systemPrompt) options.systemPrompt = context.systemPrompt;\n if (context.maxTurns) options.maxTurns = context.maxTurns;\n if (context.maxThinkingTokens) options.maxThinkingTokens = context.maxThinkingTokens;\n\n // Session control\n if (context.resume) options.resume = context.resume;\n\n // Permission system\n if (context.permissionMode) {\n options.permissionMode = context.permissionMode;\n // Required when using bypassPermissions mode\n if (context.permissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n } else {\n // Default to bypass permissions (agent runs autonomously)\n options.permissionMode = \"bypassPermissions\";\n options.allowDangerouslySkipPermissions = true;\n }\n\n return options;\n}\n","/**\n * Helper functions for Claude Environment\n */\n\nimport type { UserMessage } from \"@agentxjs/types/agent\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\n\n/**\n * Build prompt string from UserMessage\n */\nexport function buildPrompt(message: UserMessage): string {\n if (typeof message.content === \"string\") {\n return message.content;\n }\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: { type: string }) => part.type === \"text\")\n .map((part: { type: string; text?: string }) => part.text ?? \"\")\n .join(\"\\n\");\n }\n return \"\";\n}\n\n/**\n * Build SDK UserMessage from AgentX UserMessage\n */\nexport function buildSDKUserMessage(message: UserMessage, sessionId: string): SDKUserMessage {\n return {\n type: \"user\",\n message: { role: \"user\", content: buildPrompt(message) },\n parent_tool_use_id: null,\n session_id: sessionId,\n };\n}\n","/**\n * Convert RxJS Observable to AsyncIterable\n *\n * Utility for converting Observable streams to AsyncIterable\n * for use with SDKs that accept AsyncIterable input.\n */\n\nimport type { Observable } from \"rxjs\";\n\nexport async function* observableToAsyncIterable<T>(observable: Observable<T>): AsyncIterable<T> {\n const queue: T[] = [];\n let resolve: ((value: IteratorResult<T>) => void) | null = null;\n let reject: ((error: Error) => void) | null = null;\n let done = false;\n let error: Error | null = null;\n\n const subscription = observable.subscribe({\n next: (value) => {\n if (resolve) {\n resolve({ value, done: false });\n resolve = null;\n reject = null;\n } else {\n queue.push(value);\n }\n },\n error: (err) => {\n error = err instanceof Error ? err : new Error(String(err));\n done = true;\n if (reject) {\n reject(error);\n resolve = null;\n reject = null;\n }\n },\n complete: () => {\n done = true;\n if (resolve) {\n resolve({ value: undefined as any, done: true });\n resolve = null;\n reject = null;\n }\n },\n });\n\n try {\n while (!done || queue.length > 0) {\n if (error) {\n throw error;\n }\n\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (!done) {\n const result = await new Promise<{ value: T; done: false } | { done: true }>((res, rej) => {\n resolve = (iterResult) => {\n if (iterResult.done) {\n done = true;\n res({ done: true });\n } else {\n res({ value: iterResult.value, done: false });\n }\n };\n reject = rej;\n });\n\n if (!result.done) {\n yield result.value;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n}\n","/**\n * ClaudeEnvironment - Claude SDK Environment (Receptor + Effector)\n *\n * Combines:\n * - ClaudeReceptor: Perceives Claude SDK responses → emits to SystemBus\n * - ClaudeEffector: Subscribes to SystemBus → sends to Claude SDK\n *\n * @see packages/types/src/ecosystem/Environment.ts\n */\n\nimport type { Environment, Receptor, Effector } from \"@agentxjs/types/runtime/internal\";\nimport { ClaudeReceptor } from \"./ClaudeReceptor\";\nimport { ClaudeEffector, type ClaudeEffectorConfig } from \"./ClaudeEffector\";\n\n/**\n * ClaudeEnvironment configuration\n */\nexport interface ClaudeEnvironmentConfig extends ClaudeEffectorConfig {}\n\n/**\n * ClaudeEnvironment - Claude SDK Environment\n */\nexport class ClaudeEnvironment implements Environment {\n readonly name = \"claude\";\n readonly receptor: Receptor;\n readonly effector: Effector;\n\n private readonly claudeEffector: ClaudeEffector;\n\n constructor(config: ClaudeEnvironmentConfig) {\n const claudeReceptor = new ClaudeReceptor();\n const claudeEffector = new ClaudeEffector(config, claudeReceptor);\n\n this.receptor = claudeReceptor;\n this.effector = claudeEffector;\n this.claudeEffector = claudeEffector;\n }\n\n /**\n * Dispose environment resources\n */\n dispose(): void {\n this.claudeEffector.dispose();\n }\n}\n","/**\n * RuntimeAgent - Full Agent implementation\n *\n * Combines:\n * - Interactor: User input handling (in)\n * - Driver: DriveableEvent listening (out)\n * - Engine: Event processing (MealyMachine)\n * - Presenter: Event output and persistence\n * - Session: Message storage\n *\n * Architecture:\n * ```\n * AgentInteractor (in) BusDriver (out)\n * │ │\n * │ emit user_message │ listen DriveableEvent\n * ▼ ▼\n * SystemBus ─────────────────────────────────────────\n * │ │\n * ▼ │\n * ClaudeEffector │\n * │ │\n * ▼ │\n * Claude SDK │\n * │ │\n * ▼ │\n * ClaudeReceptor ──────────────────────┘\n * │\n * ▼\n * AgentEngine.handleStreamEvent()\n * │\n * ▼\n * BusPresenter (persist + emit)\n * ```\n */\n\nimport type {\n Agent as RuntimeAgentInterface,\n AgentLifecycle,\n AgentConfig,\n SystemEvent,\n EventCategory,\n ClaudeLLMConfig,\n} from \"@agentxjs/types/runtime\";\nimport type {\n AgentEngine,\n AgentPresenter,\n AgentOutput,\n Message,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n ContentPart,\n ToolCallPart,\n ToolResultPart,\n} from \"@agentxjs/types/agent\";\nimport type {\n SystemBus,\n SystemBusProducer,\n Sandbox,\n Session,\n ImageRepository,\n ImageRecord,\n} from \"@agentxjs/types/runtime/internal\";\nimport { createAgent } from \"@agentxjs/agent\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { BusDriver } from \"./BusDriver\";\nimport { AgentInteractor } from \"./AgentInteractor\";\nimport { ClaudeEnvironment } from \"../environment\";\n\nconst logger = createLogger(\"runtime/RuntimeAgent\");\n\n/**\n * RuntimeAgent configuration\n */\nexport interface RuntimeAgentConfig {\n agentId: string;\n imageId: string;\n containerId: string;\n config: AgentConfig;\n bus: SystemBus;\n sandbox: Sandbox;\n session: Session;\n /** LLM configuration for this agent's environment */\n llmConfig: ClaudeLLMConfig;\n /** Full image record for metadata access */\n image: ImageRecord;\n /** Image repository for persisting metadata */\n imageRepository: ImageRepository;\n}\n\n/**\n * BusPresenter - Forwards AgentOutput to SystemBus as proper SystemEvent\n *\n * Responsibilities:\n * 1. Filter out Stream layer events (already sent via DriveableEvent)\n * 2. Convert State/Message/Turn layer events to SystemEvent format\n * 3. Transform Message layer data to proper Message type for persistence\n *\n * Event Flow:\n * - Stream layer: SKIP (DriveableEvent already handles this)\n * - State layer: Convert to SystemEvent, emit\n * - Message layer: Convert data to Message type, emit, persist\n * - Turn layer: Convert to SystemEvent, emit\n *\n * Note: user_message is now persisted by AgentInteractor, not here.\n */\nclass BusPresenter implements AgentPresenter {\n readonly name = \"BusPresenter\";\n readonly description = \"Forwards AgentOutput to SystemBus and collects messages\";\n\n constructor(\n private readonly producer: SystemBusProducer,\n private readonly session: Session,\n private readonly agentId: string,\n private readonly imageId: string,\n private readonly containerId: string\n ) {}\n\n present(_agentId: string, output: AgentOutput): void {\n const category = this.getCategoryForOutput(output);\n\n // Skip user_message - it's now handled by AgentInteractor\n if (output.type === \"user_message\") {\n return;\n }\n\n // Convert data format based on category\n let data: unknown = output.data;\n if (category === \"message\") {\n data = this.convertToMessage(output);\n }\n\n // Build complete SystemEvent with full context\n // All events from BusPresenter are broadcastable (including stream events for frontend)\n const systemEvent: SystemEvent = {\n type: output.type,\n timestamp: output.timestamp,\n data,\n source: \"agent\",\n category,\n intent: \"notification\",\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n };\n\n this.producer.emit(systemEvent);\n\n // Persist Message layer events to session (except user_message)\n if (category === \"message\") {\n this.session.addMessage(data as Message).catch((err) => {\n logger.error(\"Failed to persist message\", { error: err, messageType: output.type });\n });\n }\n }\n\n /**\n * Convert AgentOutput to proper Message type for persistence\n */\n private convertToMessage(output: AgentOutput): Message {\n const eventData = output.data as Record<string, unknown>;\n const messageId = (eventData.messageId ?? eventData.id) as string;\n const timestamp = (eventData.timestamp as number) || output.timestamp;\n\n switch (output.type) {\n case \"assistant_message\": {\n const content = eventData.content as ContentPart[];\n return {\n id: messageId,\n role: \"assistant\",\n subtype: \"assistant\",\n content,\n timestamp,\n } as AssistantMessage;\n }\n\n case \"tool_call_message\": {\n const toolCalls = eventData.toolCalls as ToolCallPart[];\n const toolCall = toolCalls[0];\n return {\n id: messageId,\n role: \"assistant\",\n subtype: \"tool-call\",\n toolCall,\n timestamp,\n } as ToolCallMessage;\n }\n\n case \"tool_result_message\": {\n const results = eventData.results as ToolResultPart[];\n const toolResult = results[0];\n return {\n id: messageId,\n role: \"tool\",\n subtype: \"tool-result\",\n toolCallId: toolResult.id,\n toolResult,\n timestamp,\n } as ToolResultMessage;\n }\n\n case \"error_message\": {\n const content = eventData.content as string;\n const errorCode = eventData.errorCode as string | undefined;\n return {\n id: messageId,\n role: \"error\",\n subtype: \"error\",\n content,\n errorCode,\n timestamp,\n } as ErrorMessage;\n }\n\n default:\n logger.warn(\"Unknown message type, passing through\", { type: output.type });\n return eventData as unknown as Message;\n }\n }\n\n /**\n * Determine event category from output type\n */\n private getCategoryForOutput(output: AgentOutput): EventCategory {\n const type = output.type;\n\n // Stream events - SKIP these\n if (\n type === \"message_start\" ||\n type === \"message_delta\" ||\n type === \"message_stop\" ||\n type === \"text_delta\" ||\n type === \"tool_use_start\" ||\n type === \"input_json_delta\" ||\n type === \"tool_use_stop\" ||\n type === \"tool_result\"\n ) {\n return \"stream\";\n }\n\n // Message events\n if (\n type === \"user_message\" ||\n type === \"assistant_message\" ||\n type === \"tool_call_message\" ||\n type === \"tool_result_message\" ||\n type === \"error_message\"\n ) {\n return \"message\";\n }\n\n // Turn events\n if (type === \"turn_request\" || type === \"turn_response\") {\n return \"turn\";\n }\n\n // State events (default)\n return \"state\";\n }\n}\n\n/**\n * RuntimeAgent - Full Agent with Interactor + Driver + Engine + Session\n */\nexport class RuntimeAgent implements RuntimeAgentInterface {\n readonly agentId: string;\n readonly imageId: string;\n readonly name: string;\n readonly containerId: string;\n readonly createdAt: number;\n\n private _lifecycle: AgentLifecycle = \"running\";\n private readonly interactor: AgentInteractor;\n private readonly driver: BusDriver;\n private readonly engine: AgentEngine;\n private readonly producer: SystemBusProducer;\n private readonly environment: ClaudeEnvironment;\n private readonly imageRepository: ImageRepository;\n readonly session: Session;\n readonly config: AgentConfig;\n\n constructor(config: RuntimeAgentConfig) {\n this.agentId = config.agentId;\n this.imageId = config.imageId;\n this.name = config.config.name ?? `agent-${config.agentId}`;\n this.containerId = config.containerId;\n this.createdAt = Date.now();\n this.producer = config.bus.asProducer();\n this.session = config.session;\n this.config = config.config;\n this.imageRepository = config.imageRepository;\n\n // Create this agent's own ClaudeEnvironment\n // Resume using stored sdkSessionId if available\n const resumeSessionId = config.image.metadata?.claudeSdkSessionId;\n this.environment = new ClaudeEnvironment({\n agentId: this.agentId,\n apiKey: config.llmConfig.apiKey,\n baseUrl: config.llmConfig.baseUrl,\n model: config.llmConfig.model,\n systemPrompt: config.config.systemPrompt,\n resumeSessionId,\n onSessionIdCaptured: (sdkSessionId) => {\n // Persist sdkSessionId to image metadata for future resume\n this.saveSessionId(sdkSessionId);\n },\n });\n\n // Connect environment to bus\n this.environment.receptor.connect(config.bus.asProducer());\n this.environment.effector.connect(config.bus.asConsumer());\n\n logger.info(\"ClaudeEnvironment created for agent\", {\n agentId: this.agentId,\n imageId: this.imageId,\n resumeSessionId: resumeSessionId ?? \"none\",\n isResume: !!resumeSessionId,\n imageMetadata: config.image.metadata,\n });\n\n // Create Presenter (forwards to bus + persists to session)\n const presenter = new BusPresenter(\n this.producer,\n config.session,\n this.agentId,\n this.imageId,\n this.containerId\n );\n\n // Create Engine (from @agentxjs/agent) - no driver needed for push mode\n // We use a dummy driver since we're using push-based handleStreamEvent\n this.engine = createAgent({\n driver: {\n name: \"DummyDriver\",\n description: \"Placeholder driver for push-based event handling\",\n receive: async function* () {\n // Not used - events are pushed via handleStreamEvent\n },\n interrupt: () => {},\n },\n presenter,\n });\n\n // Create Interactor (handles user input - the \"in\" side)\n this.interactor = new AgentInteractor(this.producer, config.session, {\n agentId: this.agentId,\n imageId: this.imageId,\n containerId: this.containerId,\n sessionId: config.session.sessionId,\n });\n\n // Create Driver (listens for DriveableEvents - the \"out\" side)\n // It pushes events to engine.handleStreamEvent\n this.driver = new BusDriver(config.bus.asConsumer(), {\n agentId: this.agentId,\n onStreamEvent: (event) => {\n logger.debug(\"BusDriver → Engine.handleStreamEvent\", { type: event.type });\n this.engine.handleStreamEvent(event);\n },\n onStreamComplete: (reason) => {\n logger.debug(\"Stream completed\", { reason, agentId: this.agentId });\n },\n });\n\n logger.debug(\"RuntimeAgent created\", {\n agentId: this.agentId,\n imageId: this.imageId,\n });\n }\n\n /**\n * Save SDK session ID to image metadata for future resume\n */\n private saveSessionId(sdkSessionId: string): void {\n logger.info(\"Saving SDK session ID to image metadata\", {\n agentId: this.agentId,\n imageId: this.imageId,\n sdkSessionId,\n });\n this.imageRepository\n .updateMetadata(this.imageId, { claudeSdkSessionId: sdkSessionId })\n .catch((err) => {\n logger.error(\"Failed to save SDK session ID\", { error: err, imageId: this.imageId });\n });\n }\n\n get lifecycle(): AgentLifecycle {\n return this._lifecycle;\n }\n\n /**\n * Receive a message from user\n *\n * @param content - Message content\n * @param requestId - Request ID for correlation\n */\n async receive(content: string, requestId?: string): Promise<void> {\n logger.debug(\"RuntimeAgent.receive called\", {\n agentId: this.agentId,\n contentPreview: content.substring(0, 50),\n requestId,\n });\n\n if (this._lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${this._lifecycle} agent`);\n }\n\n // Use Interactor to handle user input\n // This will: build UserMessage, persist, emit to bus\n // BusDriver will receive DriveableEvents when Claude responds\n await this.interactor.receive(content, requestId || `req_${Date.now()}`);\n\n logger.debug(\"RuntimeAgent.receive completed\", { agentId: this.agentId });\n }\n\n /**\n * Interrupt current operation\n */\n interrupt(requestId?: string): void {\n logger.debug(\"RuntimeAgent.interrupt called\", { agentId: this.agentId, requestId });\n\n // Use Interactor to send interrupt\n this.interactor.interrupt(requestId);\n\n // Emit interrupted event\n this.producer.emit({\n type: \"interrupted\",\n timestamp: Date.now(),\n source: \"agent\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n\n async stop(): Promise<void> {\n if (this._lifecycle === \"destroyed\") {\n throw new Error(\"Cannot stop destroyed agent\");\n }\n this._lifecycle = \"stopped\";\n }\n\n async resume(): Promise<void> {\n if (this._lifecycle === \"destroyed\") {\n throw new Error(\"Cannot resume destroyed agent\");\n }\n this._lifecycle = \"running\";\n\n // Emit session_resumed event\n this.producer.emit({\n type: \"session_resumed\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.session.sessionId,\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n\n async destroy(): Promise<void> {\n if (this._lifecycle !== \"destroyed\") {\n // Dispose driver (stop listening)\n this.driver.dispose();\n\n // Dispose environment (cleanup SDK resources)\n this.environment.dispose();\n\n // Destroy engine\n await this.engine.destroy();\n this._lifecycle = \"destroyed\";\n\n // Emit session_destroyed event\n this.producer.emit({\n type: \"session_destroyed\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.session.sessionId,\n agentId: this.agentId,\n containerId: this.containerId,\n },\n context: {\n containerId: this.containerId,\n imageId: this.imageId,\n agentId: this.agentId,\n sessionId: this.session.sessionId,\n },\n });\n }\n }\n}\n","/**\n * RuntimeSession - Session implementation\n *\n * Collects messages from Agent and persists to storage.\n */\n\nimport type {\n Session,\n SystemBusProducer,\n SessionRepository,\n SessionRecord,\n} from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\n\n/**\n * RuntimeSession configuration\n */\nexport interface RuntimeSessionConfig {\n sessionId: string;\n imageId: string;\n containerId: string;\n repository: SessionRepository;\n /** Producer for emitting session lifecycle events */\n producer: SystemBusProducer;\n}\n\n/**\n * RuntimeSession - Collects and stores messages\n */\nexport class RuntimeSession implements Session {\n readonly sessionId: string;\n readonly imageId: string;\n readonly containerId: string;\n readonly createdAt: number;\n\n private readonly repository: SessionRepository;\n private readonly producer: SystemBusProducer;\n\n constructor(config: RuntimeSessionConfig) {\n this.sessionId = config.sessionId;\n this.imageId = config.imageId;\n this.containerId = config.containerId;\n this.createdAt = Date.now();\n this.repository = config.repository;\n this.producer = config.producer;\n }\n\n /**\n * Initialize session in storage\n */\n async initialize(): Promise<void> {\n const record: SessionRecord = {\n sessionId: this.sessionId,\n imageId: this.imageId,\n containerId: this.containerId,\n createdAt: this.createdAt,\n updatedAt: this.createdAt,\n };\n await this.repository.saveSession(record);\n\n // Emit session_created event\n this.producer.emit({\n type: \"session_created\",\n timestamp: this.createdAt,\n source: \"session\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n sessionId: this.sessionId,\n imageId: this.imageId,\n containerId: this.containerId,\n createdAt: this.createdAt,\n },\n context: {\n containerId: this.containerId,\n sessionId: this.sessionId,\n },\n });\n }\n\n async addMessage(message: Message): Promise<void> {\n await this.repository.addMessage(this.sessionId, message);\n\n // Emit message_persisted event\n this.producer.emit({\n type: \"message_persisted\",\n timestamp: Date.now(),\n source: \"session\",\n category: \"persist\",\n intent: \"result\",\n data: {\n sessionId: this.sessionId,\n messageId: message.id,\n savedAt: Date.now(),\n },\n context: {\n containerId: this.containerId,\n sessionId: this.sessionId,\n },\n });\n }\n\n async getMessages(): Promise<Message[]> {\n return this.repository.getMessages(this.sessionId);\n }\n\n async clear(): Promise<void> {\n await this.repository.clearMessages(this.sessionId);\n }\n}\n","/**\n * RuntimeSandbox - Sandbox implementation\n *\n * Provides isolated environment for an Agent:\n * - Workdir: Isolated working directory (create, ensure exists)\n * - MCP: Model Context Protocol tools (future)\n */\n\nimport type { Sandbox, Workdir } from \"@agentxjs/types/runtime/internal\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * RuntimeSandbox configuration\n */\nexport interface RuntimeSandboxConfig {\n agentId: string;\n containerId: string;\n basePath: string;\n}\n\n/**\n * RuntimeWorkdir - Workdir implementation\n */\nclass RuntimeWorkdir implements Workdir {\n readonly id: string;\n readonly name: string;\n readonly path: string;\n\n constructor(agentId: string, path: string) {\n this.id = agentId;\n this.name = `workdir_${agentId}`;\n this.path = path;\n }\n}\n\n/**\n * RuntimeSandbox - Full Sandbox implementation\n */\nexport class RuntimeSandbox implements Sandbox {\n readonly name: string;\n readonly workdir: Workdir;\n\n private initialized = false;\n\n constructor(config: RuntimeSandboxConfig) {\n this.name = `sandbox_${config.agentId}`;\n\n const workdirPath = join(\n config.basePath,\n \"containers\",\n config.containerId,\n \"workdirs\",\n config.agentId\n );\n this.workdir = new RuntimeWorkdir(config.agentId, workdirPath);\n }\n\n /**\n * Initialize sandbox - create directories\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Create workdir\n await mkdir(this.workdir.path, { recursive: true });\n\n this.initialized = true;\n }\n\n /**\n * Cleanup sandbox - remove directories (optional)\n */\n async cleanup(): Promise<void> {\n // Note: We don't delete by default (data preservation)\n // Could add a force delete option if needed\n }\n}\n","/**\n * RuntimeImage - Persistent conversation entity\n *\n * Image is the primary entity that users interact with (displayed as \"conversation\").\n * Agent is a transient runtime instance created from Image.\n *\n * Lifecycle:\n * - create() → ImageRecord (persistent) + SessionRecord (for messages)\n * - run() → Agent (runtime, in-memory)\n * - stop() / server restart → Agent destroyed, Image remains\n */\n\nimport type {\n ImageRecord,\n ImageRepository,\n SessionRepository,\n} from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/RuntimeImage\");\n\n/**\n * Context needed by RuntimeImage\n */\nexport interface RuntimeImageContext {\n imageRepository: ImageRepository;\n sessionRepository: SessionRepository;\n}\n\n/**\n * Configuration for creating a new image\n */\nexport interface ImageCreateConfig {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n}\n\n/**\n * RuntimeImage - Manages conversation persistence\n */\nexport class RuntimeImage {\n private constructor(\n private readonly record: ImageRecord,\n private readonly context: RuntimeImageContext\n ) {}\n\n // ==================== Getters ====================\n\n get imageId(): string {\n return this.record.imageId;\n }\n\n get containerId(): string {\n return this.record.containerId;\n }\n\n get sessionId(): string {\n return this.record.sessionId;\n }\n\n get name(): string {\n return this.record.name;\n }\n\n get description(): string | undefined {\n return this.record.description;\n }\n\n get systemPrompt(): string | undefined {\n return this.record.systemPrompt;\n }\n\n get createdAt(): number {\n return this.record.createdAt;\n }\n\n get updatedAt(): number {\n return this.record.updatedAt;\n }\n\n // ==================== Static Factory Methods ====================\n\n /**\n * Create a new image (conversation)\n */\n static async create(\n config: ImageCreateConfig,\n context: RuntimeImageContext\n ): Promise<RuntimeImage> {\n const now = Date.now();\n const imageId = RuntimeImage.generateImageId();\n const sessionId = RuntimeImage.generateSessionId();\n\n // Create image record\n const record: ImageRecord = {\n imageId,\n containerId: config.containerId,\n sessionId,\n name: config.name ?? \"New Conversation\",\n description: config.description,\n systemPrompt: config.systemPrompt,\n createdAt: now,\n updatedAt: now,\n };\n\n // Persist image\n await context.imageRepository.saveImage(record);\n\n // Create associated session (for message storage)\n await context.sessionRepository.saveSession({\n sessionId,\n imageId,\n containerId: config.containerId,\n createdAt: now,\n updatedAt: now,\n });\n\n logger.info(\"Image created\", {\n imageId,\n sessionId,\n containerId: config.containerId,\n name: record.name,\n });\n return new RuntimeImage(record, context);\n }\n\n /**\n * Load an existing image from storage\n */\n static async load(imageId: string, context: RuntimeImageContext): Promise<RuntimeImage | null> {\n const record = await context.imageRepository.findImageById(imageId);\n if (!record) {\n logger.debug(\"Image not found\", { imageId });\n return null;\n }\n\n logger.debug(\"Image loaded\", { imageId, name: record.name });\n return new RuntimeImage(record, context);\n }\n\n /**\n * List all images in a container\n */\n static async listByContainer(\n containerId: string,\n context: RuntimeImageContext\n ): Promise<ImageRecord[]> {\n return context.imageRepository.findImagesByContainerId(containerId);\n }\n\n /**\n * List all images\n */\n static async listAll(context: RuntimeImageContext): Promise<ImageRecord[]> {\n return context.imageRepository.findAllImages();\n }\n\n // ==================== Instance Methods ====================\n\n /**\n * Get messages for this conversation\n */\n async getMessages(): Promise<Message[]> {\n return this.context.sessionRepository.getMessages(this.sessionId);\n }\n\n /**\n * Update image metadata\n */\n async update(updates: { name?: string; description?: string }): Promise<RuntimeImage> {\n const now = Date.now();\n const updatedRecord: ImageRecord = {\n ...this.record,\n name: updates.name ?? this.record.name,\n description: updates.description ?? this.record.description,\n updatedAt: now,\n };\n\n await this.context.imageRepository.saveImage(updatedRecord);\n\n logger.info(\"Image updated\", { imageId: this.imageId, updates });\n return new RuntimeImage(updatedRecord, this.context);\n }\n\n /**\n * Delete this image and its session\n */\n async delete(): Promise<void> {\n // Delete session first (including messages)\n await this.context.sessionRepository.deleteSession(this.sessionId);\n\n // Delete image\n await this.context.imageRepository.deleteImage(this.imageId);\n\n logger.info(\"Image deleted\", { imageId: this.imageId, sessionId: this.sessionId });\n }\n\n /**\n * Get the underlying record\n */\n toRecord(): ImageRecord {\n return { ...this.record };\n }\n\n // ==================== Private Helpers ====================\n\n private static generateImageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `img_${timestamp}_${random}`;\n }\n\n private static generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `sess_${timestamp}_${random}`;\n }\n}\n","/**\n * RuntimeContainer - Container implementation with agent management\n *\n * Container is an object with behavior. It manages agents internally.\n * In the new Image-First model:\n * - Image is the persistent entity (conversation)\n * - Agent is a transient runtime instance of an Image\n * - Container tracks imageId → agentId mapping\n */\n\nimport type { Container, Agent, ClaudeLLMConfig } from \"@agentxjs/types/runtime\";\nimport type { Persistence, ContainerRecord, ImageRecord } from \"@agentxjs/types\";\nimport type { SystemBus } from \"@agentxjs/types/runtime/internal\";\nimport { RuntimeAgent } from \"./RuntimeAgent\";\nimport { RuntimeSession } from \"./RuntimeSession\";\nimport { RuntimeSandbox } from \"./RuntimeSandbox\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/RuntimeContainer\");\n\n/**\n * Context needed by RuntimeContainer to operate\n */\nexport interface RuntimeContainerContext {\n persistence: Persistence;\n bus: SystemBus;\n /** LLM configuration for creating agent environments */\n llmConfig: ClaudeLLMConfig;\n basePath: string;\n /** Callback when container is disposed */\n onDisposed?: (containerId: string) => void;\n}\n\n/**\n * RuntimeContainer - Full Container implementation\n */\nexport class RuntimeContainer implements Container {\n readonly containerId: string;\n readonly createdAt: number;\n\n /** Map of agentId → RuntimeAgent */\n private readonly agents = new Map<string, RuntimeAgent>();\n /** Map of imageId → agentId (for quick lookup) */\n private readonly imageToAgent = new Map<string, string>();\n private readonly context: RuntimeContainerContext;\n\n private constructor(containerId: string, createdAt: number, context: RuntimeContainerContext) {\n this.containerId = containerId;\n this.createdAt = createdAt;\n this.context = context;\n }\n\n /**\n * Create a new container and persist it\n */\n static async create(\n containerId: string,\n context: RuntimeContainerContext\n ): Promise<RuntimeContainer> {\n const now = Date.now();\n\n // Persist container record\n const record: ContainerRecord = {\n containerId,\n createdAt: now,\n updatedAt: now,\n };\n await context.persistence.containers.saveContainer(record);\n\n const container = new RuntimeContainer(containerId, now, context);\n\n // Emit container_created event\n context.bus.emit({\n type: \"container_created\",\n timestamp: now,\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId,\n createdAt: now,\n },\n context: {\n containerId,\n },\n });\n\n logger.info(\"Container created\", { containerId });\n return container;\n }\n\n /**\n * Load an existing container from persistence\n */\n static async load(\n containerId: string,\n context: RuntimeContainerContext\n ): Promise<RuntimeContainer | null> {\n const record = await context.persistence.containers.findContainerById(containerId);\n if (!record) return null;\n\n logger.info(\"Container loaded\", { containerId });\n return new RuntimeContainer(containerId, record.createdAt, context);\n }\n\n // ==================== Image → Agent Lifecycle ====================\n\n /**\n * Run an image - create or reuse an Agent for the given Image\n * @returns { agent, reused } - the agent and whether it was reused\n */\n async runImage(image: ImageRecord): Promise<{ agent: Agent; reused: boolean }> {\n // Check if agent already exists for this image\n const existingAgentId = this.imageToAgent.get(image.imageId);\n if (existingAgentId) {\n const existingAgent = this.agents.get(existingAgentId);\n if (existingAgent) {\n logger.info(\"Reusing existing agent for image\", {\n containerId: this.containerId,\n imageId: image.imageId,\n agentId: existingAgentId,\n });\n return { agent: existingAgent, reused: true };\n }\n // Agent was destroyed but mapping still exists, clean up\n this.imageToAgent.delete(image.imageId);\n }\n\n // Create new agent for this image\n const agentId = this.generateAgentId();\n\n // Create and initialize Sandbox\n const sandbox = new RuntimeSandbox({\n agentId,\n containerId: this.containerId,\n basePath: this.context.basePath,\n });\n await sandbox.initialize();\n\n // Create Session wrapper (uses existing sessionId from Image)\n const session = new RuntimeSession({\n sessionId: image.sessionId,\n imageId: image.imageId,\n containerId: this.containerId,\n repository: this.context.persistence.sessions,\n producer: this.context.bus.asProducer(),\n });\n // Note: Don't call initialize() - session already exists in storage\n\n // Create RuntimeAgent with its own Environment\n const agent = new RuntimeAgent({\n agentId,\n imageId: image.imageId,\n containerId: this.containerId,\n config: {\n name: image.name,\n description: image.description,\n systemPrompt: image.systemPrompt,\n },\n bus: this.context.bus,\n sandbox,\n session,\n llmConfig: this.context.llmConfig,\n image, // Pass full image record for metadata access\n imageRepository: this.context.persistence.images,\n });\n\n // Register agent and mapping\n this.agents.set(agentId, agent);\n this.imageToAgent.set(image.imageId, agentId);\n\n // Emit agent_registered event\n this.context.bus.emit({\n type: \"agent_registered\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentId,\n definitionName: image.name,\n registeredAt: Date.now(),\n },\n context: {\n containerId: this.containerId,\n agentId,\n },\n });\n\n logger.info(\"Agent created for image\", {\n containerId: this.containerId,\n imageId: image.imageId,\n agentId,\n });\n return { agent, reused: false };\n }\n\n /**\n * Stop an image - destroy the Agent but keep the Image\n */\n async stopImage(imageId: string): Promise<boolean> {\n const agentId = this.imageToAgent.get(imageId);\n if (!agentId) {\n logger.debug(\"Image not running, nothing to stop\", {\n imageId,\n containerId: this.containerId,\n });\n return false;\n }\n\n logger.info(\"Stopping image\", { imageId, agentId, containerId: this.containerId });\n const success = await this.destroyAgent(agentId);\n if (success) {\n this.imageToAgent.delete(imageId);\n logger.info(\"Image stopped\", { imageId, agentId, containerId: this.containerId });\n }\n return success;\n }\n\n /**\n * Get agent ID for an image (if running)\n */\n getAgentIdForImage(imageId: string): string | undefined {\n return this.imageToAgent.get(imageId);\n }\n\n /**\n * Check if an image has a running agent\n */\n isImageOnline(imageId: string): boolean {\n const agentId = this.imageToAgent.get(imageId);\n return agentId !== undefined && this.agents.has(agentId);\n }\n\n /**\n * Get imageId for an agent (reverse lookup)\n */\n getImageIdForAgent(agentId: string): string | undefined {\n for (const [imageId, mappedAgentId] of this.imageToAgent.entries()) {\n if (mappedAgentId === agentId) {\n return imageId;\n }\n }\n return undefined;\n }\n\n getAgent(agentId: string): Agent | undefined {\n return this.agents.get(agentId);\n }\n\n listAgents(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n get agentCount(): number {\n return this.agents.size;\n }\n\n async destroyAgent(agentId: string): Promise<boolean> {\n const agent = this.agents.get(agentId);\n if (!agent) return false;\n\n // Call agent's destroy\n await agent.destroy();\n\n // Remove from registry\n this.agents.delete(agentId);\n\n // Emit agent_unregistered event\n this.context.bus.emit({\n type: \"agent_unregistered\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentId,\n },\n context: {\n containerId: this.containerId,\n agentId,\n },\n });\n\n logger.info(\"Agent destroyed\", { containerId: this.containerId, agentId });\n return true;\n }\n\n async destroyAllAgents(): Promise<void> {\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n }\n\n // ==================== Container Lifecycle ====================\n\n async dispose(): Promise<void> {\n const agentCount = this.agents.size;\n\n // Destroy all agents\n await this.destroyAllAgents();\n\n // Emit container_destroyed event\n this.context.bus.emit({\n type: \"container_destroyed\",\n timestamp: Date.now(),\n source: \"container\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n containerId: this.containerId,\n agentCount,\n },\n context: {\n containerId: this.containerId,\n },\n });\n\n // Notify runtime that this container is disposed\n this.context.onDisposed?.(this.containerId);\n\n logger.info(\"Container disposed\", { containerId: this.containerId, agentCount });\n // Note: Container record stays in persistence (dispose != delete)\n }\n\n // ==================== Private Helpers ====================\n\n private generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `agent_${timestamp}_${random}`;\n }\n}\n","/**\n * BaseEventHandler - Base class for all event handlers\n *\n * Provides unified error handling and event subscription management.\n * All handlers should extend this class to get automatic error boundary.\n *\n * Pattern:\n * ```\n * class MyHandler extends BaseEventHandler {\n * protected bindHandlers() {\n * this.subscribe(\n * this.bus.on(\"some_event\", (e) => this.handleSomeEvent(e))\n * );\n * }\n *\n * private async handleSomeEvent(event) {\n * await this.safeHandleAsync(\n * async () => {\n * // Business logic\n * },\n * {\n * requestId: event.data.requestId,\n * operation: \"some_operation\",\n * }\n * );\n * }\n * }\n * ```\n */\n\nimport type { SystemBus, Unsubscribe, ErrorContext } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemError } from \"@agentxjs/types/event\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/BaseEventHandler\");\n\n/**\n * BaseEventHandler - Abstract base class for event handlers\n */\nexport abstract class BaseEventHandler {\n protected readonly bus: SystemBus;\n private unsubscribes: Unsubscribe[] = [];\n\n constructor(bus: SystemBus) {\n this.bus = bus;\n }\n\n /**\n * Subclasses must implement this to bind event handlers\n */\n protected abstract bindHandlers(): void;\n\n /**\n * Safe execution wrapper for synchronous handlers\n *\n * Automatically catches errors and emits ErrorEvent.\n */\n protected safeHandle<T>(handler: () => T, context: ErrorContext): T | undefined {\n try {\n return handler();\n } catch (err) {\n this.handleError(err, context);\n return undefined;\n }\n }\n\n /**\n * Safe execution wrapper for asynchronous handlers\n *\n * Automatically catches errors and emits ErrorEvent.\n */\n protected async safeHandleAsync<T>(\n handler: () => Promise<T>,\n context: ErrorContext\n ): Promise<T | undefined> {\n try {\n return await handler();\n } catch (err) {\n this.handleError(err, context);\n return undefined;\n }\n }\n\n /**\n * Handle error: log + emit ErrorEvent + optional callback\n */\n protected handleError(err: unknown, context: ErrorContext): void {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n\n // Log error\n logger.error(`Error in ${context.operation || \"handler\"}`, {\n message,\n requestId: context.requestId,\n details: context.details,\n });\n\n // Emit ErrorEvent\n const errorEvent: SystemError = {\n type: \"system_error\",\n timestamp: Date.now(),\n source: context.source || \"command\",\n category: \"error\",\n intent: \"notification\",\n data: {\n message,\n requestId: context.requestId,\n severity: context.severity || \"error\",\n details: {\n operation: context.operation,\n stack,\n ...context.details,\n },\n },\n };\n this.bus.emit(errorEvent);\n\n // Optional error callback (e.g., emit error response)\n if (context.onError) {\n try {\n context.onError(err);\n } catch (callbackErr) {\n logger.error(\"Error in onError callback\", { error: callbackErr });\n }\n }\n }\n\n /**\n * Register subscription and track for cleanup\n */\n protected subscribe(unsubscribe: Unsubscribe): void {\n this.unsubscribes.push(unsubscribe);\n }\n\n /**\n * Dispose handler and cleanup all subscriptions\n */\n dispose(): void {\n for (const unsubscribe of this.unsubscribes) {\n unsubscribe();\n }\n this.unsubscribes = [];\n logger.debug(`${this.constructor.name} disposed`);\n }\n}\n","/**\n * CommandHandler - Handles CommandEvent request/response\n *\n * Listens to command request events on the bus and emits response events.\n * This separates event handling logic from RuntimeImpl resource management.\n *\n * Pattern:\n * ```\n * Bus.emit(container_create_request)\n * → CommandHandler.handleContainerCreate()\n * → Bus.emit(container_create_response)\n * ```\n */\n\nimport type { SystemBus } from \"@agentxjs/types/runtime/internal\";\nimport type { SystemEvent } from \"@agentxjs/types/event\";\nimport { BaseEventHandler } from \"./BaseEventHandler\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"runtime/CommandHandler\");\n\n/**\n * Image list item with online status\n */\nexport interface ImageListItemResult {\n imageId: string;\n containerId: string;\n sessionId: string;\n name: string;\n description?: string;\n systemPrompt?: string;\n createdAt: number;\n updatedAt: number;\n online: boolean;\n agentId?: string;\n}\n\n/**\n * Runtime operations interface - what CommandHandler needs to execute commands\n */\nexport interface RuntimeOperations {\n // Container operations\n createContainer(containerId: string): Promise<{ containerId: string }>;\n getContainer(containerId: string): { containerId: string } | undefined;\n listContainers(): { containerId: string }[];\n\n // Agent operations (by agentId)\n getAgent(agentId: string): { agentId: string; containerId: string; imageId: string } | undefined;\n listAgents(containerId: string): { agentId: string; containerId: string; imageId: string }[];\n destroyAgent(agentId: string): Promise<boolean>;\n destroyAllAgents(containerId: string): Promise<void>;\n\n // Agent operations (by imageId - with auto-activation)\n receiveMessage(\n imageId: string | undefined,\n agentId: string | undefined,\n content: string,\n requestId: string\n ): Promise<{ agentId: string; imageId?: string }>;\n interruptAgent(\n imageId: string | undefined,\n agentId: string | undefined,\n requestId?: string\n ): { agentId?: string; imageId?: string };\n\n // Image operations (new model)\n createImage(\n containerId: string,\n config: { name?: string; description?: string; systemPrompt?: string }\n ): Promise<ImageListItemResult>;\n runImage(imageId: string): Promise<{ imageId: string; agentId: string; reused: boolean }>;\n stopImage(imageId: string): Promise<void>;\n updateImage(\n imageId: string,\n updates: { name?: string; description?: string }\n ): Promise<ImageListItemResult>;\n listImages(containerId?: string): Promise<ImageListItemResult[]>;\n getImage(imageId: string): Promise<ImageListItemResult | null>;\n deleteImage(imageId: string): Promise<void>;\n getImageMessages(\n imageId: string\n ): Promise<Array<{ id: string; role: string; content: unknown; timestamp: number }>>;\n}\n\n/**\n * Helper to create a command response event\n */\nfunction createResponse<T extends string, D>(type: T, data: D): SystemEvent {\n return {\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: \"response\",\n intent: \"result\",\n } as SystemEvent;\n}\n\n/**\n * Helper to create a system_error event\n */\nfunction createSystemError(\n message: string,\n requestId: string,\n context: Record<string, unknown>,\n stack?: string\n): SystemEvent {\n return {\n type: \"system_error\",\n timestamp: Date.now(),\n source: \"command\",\n category: \"error\",\n intent: \"notification\",\n data: {\n message,\n requestId,\n severity: \"error\",\n details: stack,\n },\n context,\n } as SystemEvent;\n}\n\n/**\n * CommandHandler - Event handler for command events\n */\nexport class CommandHandler extends BaseEventHandler {\n private readonly ops: RuntimeOperations;\n\n constructor(bus: SystemBus, operations: RuntimeOperations) {\n super(bus);\n this.ops = operations;\n this.bindHandlers();\n logger.debug(\"CommandHandler created\");\n }\n\n /**\n * Log error and emit system_error event\n */\n private emitError(\n operation: string,\n err: unknown,\n requestId: string,\n context: Record<string, unknown>\n ): void {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n\n logger.error(operation, {\n requestId,\n ...context,\n error: errorMessage,\n stack,\n });\n\n this.bus.emit(createSystemError(errorMessage, requestId, context, stack));\n }\n\n /**\n * Bind all command handlers to the bus\n */\n protected bindHandlers(): void {\n // Container commands\n this.subscribe(\n this.bus.onCommand(\"container_create_request\", (event) => this.handleContainerCreate(event))\n );\n this.subscribe(\n this.bus.onCommand(\"container_get_request\", (event) => this.handleContainerGet(event))\n );\n this.subscribe(\n this.bus.onCommand(\"container_list_request\", (event) => this.handleContainerList(event))\n );\n\n // Agent commands\n this.subscribe(this.bus.onCommand(\"agent_get_request\", (event) => this.handleAgentGet(event)));\n this.subscribe(\n this.bus.onCommand(\"agent_list_request\", (event) => this.handleAgentList(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_destroy_request\", (event) => this.handleAgentDestroy(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_destroy_all_request\", (event) => this.handleAgentDestroyAll(event))\n );\n this.subscribe(\n this.bus.onCommand(\"message_send_request\", (event) => this.handleMessageSend(event))\n );\n this.subscribe(\n this.bus.onCommand(\"agent_interrupt_request\", (event) => this.handleAgentInterrupt(event))\n );\n\n // Image commands\n this.subscribe(\n this.bus.onCommand(\"image_create_request\", (event) => this.handleImageCreate(event))\n );\n this.subscribe(this.bus.onCommand(\"image_run_request\", (event) => this.handleImageRun(event)));\n this.subscribe(\n this.bus.onCommand(\"image_stop_request\", (event) => this.handleImageStop(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_update_request\", (event) => this.handleImageUpdate(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_list_request\", (event) => this.handleImageList(event))\n );\n this.subscribe(this.bus.onCommand(\"image_get_request\", (event) => this.handleImageGet(event)));\n this.subscribe(\n this.bus.onCommand(\"image_delete_request\", (event) => this.handleImageDelete(event))\n );\n this.subscribe(\n this.bus.onCommand(\"image_messages_request\", (event) => this.handleImageMessages(event))\n );\n\n logger.debug(\"Command handlers bound\");\n }\n\n // ==================== Container Handlers ====================\n\n private async handleContainerCreate(event: {\n data: { requestId: string; containerId: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling container_create_request\", { requestId, containerId });\n\n try {\n await this.ops.createContainer(containerId);\n this.bus.emit(\n createResponse(\"container_create_response\", {\n requestId,\n containerId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to create container\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"container_create_response\", {\n requestId,\n containerId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private handleContainerGet(event: { data: { requestId: string; containerId: string } }): void {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling container_get_request\", { requestId, containerId });\n\n const container = this.ops.getContainer(containerId);\n this.bus.emit(\n createResponse(\"container_get_response\", {\n requestId,\n containerId: container?.containerId,\n exists: !!container,\n })\n );\n }\n\n private handleContainerList(event: { data: { requestId: string } }): void {\n const { requestId } = event.data;\n logger.debug(\"Handling container_list_request\", { requestId });\n\n const containers = this.ops.listContainers();\n this.bus.emit(\n createResponse(\"container_list_response\", {\n requestId,\n containerIds: containers.map((c) => c.containerId),\n })\n );\n }\n\n // ==================== Agent Handlers ====================\n\n private handleAgentGet(event: { data: { requestId: string; agentId: string } }): void {\n const { requestId, agentId } = event.data;\n logger.debug(\"Handling agent_get_request\", { requestId, agentId });\n\n const agent = this.ops.getAgent(agentId);\n this.bus.emit(\n createResponse(\"agent_get_response\", {\n requestId,\n agentId: agent?.agentId,\n containerId: agent?.containerId,\n exists: !!agent,\n })\n );\n }\n\n private handleAgentList(event: { data: { requestId: string; containerId: string } }): void {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling agent_list_request\", { requestId, containerId });\n\n const agents = this.ops.listAgents(containerId);\n this.bus.emit(\n createResponse(\"agent_list_response\", {\n requestId,\n agents: agents.map((a) => ({\n agentId: a.agentId,\n containerId: a.containerId,\n imageId: a.imageId,\n })),\n })\n );\n }\n\n private async handleAgentDestroy(event: {\n data: { requestId: string; agentId: string };\n }): Promise<void> {\n const { requestId, agentId } = event.data;\n logger.debug(\"Handling agent_destroy_request\", { requestId, agentId });\n\n try {\n const success = await this.ops.destroyAgent(agentId);\n this.bus.emit(\n createResponse(\"agent_destroy_response\", {\n requestId,\n agentId,\n success,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to destroy agent\", err, requestId, { agentId });\n this.bus.emit(\n createResponse(\"agent_destroy_response\", {\n requestId,\n agentId,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleAgentDestroyAll(event: {\n data: { requestId: string; containerId: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling agent_destroy_all_request\", { requestId, containerId });\n\n try {\n await this.ops.destroyAllAgents(containerId);\n this.bus.emit(\n createResponse(\"agent_destroy_all_response\", {\n requestId,\n containerId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to destroy all agents\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"agent_destroy_all_response\", {\n requestId,\n containerId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleMessageSend(event: {\n data: { requestId: string; imageId?: string; agentId?: string; content: string };\n }): Promise<void> {\n const { requestId, imageId, agentId, content } = event.data;\n logger.debug(\"Handling message_send_request\", { requestId, imageId, agentId });\n\n try {\n // Pass requestId for event correlation\n const result = await this.ops.receiveMessage(imageId, agentId, content, requestId);\n this.bus.emit(\n createResponse(\"message_send_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to send message\", err, requestId, { imageId, agentId });\n this.bus.emit(\n createResponse(\"message_send_response\", {\n requestId,\n imageId,\n agentId: agentId ?? \"\",\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private handleAgentInterrupt(event: {\n data: { requestId: string; imageId?: string; agentId?: string };\n }): void {\n const { requestId, imageId, agentId } = event.data;\n logger.debug(\"Handling agent_interrupt_request\", { requestId, imageId, agentId });\n\n try {\n // Pass requestId for event correlation\n const result = this.ops.interruptAgent(imageId, agentId, requestId);\n this.bus.emit(\n createResponse(\"agent_interrupt_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to interrupt agent\", err, requestId, { imageId, agentId });\n this.bus.emit(\n createResponse(\"agent_interrupt_response\", {\n requestId,\n imageId,\n agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n // ==================== Image Handlers ====================\n\n private async handleImageCreate(event: {\n data: {\n requestId: string;\n containerId: string;\n config: { name?: string; description?: string; systemPrompt?: string };\n };\n }): Promise<void> {\n const { requestId, containerId, config } = event.data;\n logger.debug(\"Handling image_create_request\", { requestId, containerId });\n\n try {\n const record = await this.ops.createImage(containerId, config);\n this.bus.emit(\n createResponse(\"image_create_response\", {\n requestId,\n record,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to create image\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"image_create_response\", {\n requestId,\n record: null as unknown as ImageListItemResult,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageRun(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_run_request\", { requestId, imageId });\n\n try {\n const result = await this.ops.runImage(imageId);\n this.bus.emit(\n createResponse(\"image_run_response\", {\n requestId,\n imageId: result.imageId,\n agentId: result.agentId,\n reused: result.reused,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to run image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_run_response\", {\n requestId,\n imageId,\n agentId: \"\",\n reused: false,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageStop(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_stop_request\", { requestId, imageId });\n\n try {\n await this.ops.stopImage(imageId);\n this.bus.emit(\n createResponse(\"image_stop_response\", {\n requestId,\n imageId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to stop image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_stop_response\", {\n requestId,\n imageId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageUpdate(event: {\n data: { requestId: string; imageId: string; updates: { name?: string; description?: string } };\n }): Promise<void> {\n const { requestId, imageId, updates } = event.data;\n logger.debug(\"Handling image_update_request\", { requestId, imageId });\n\n try {\n const record = await this.ops.updateImage(imageId, updates);\n this.bus.emit(\n createResponse(\"image_update_response\", {\n requestId,\n record,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to update image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_update_response\", {\n requestId,\n record: null as unknown as ImageListItemResult,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageList(event: {\n data: { requestId: string; containerId?: string };\n }): Promise<void> {\n const { requestId, containerId } = event.data;\n logger.debug(\"Handling image_list_request\", { requestId, containerId });\n\n try {\n const images = await this.ops.listImages(containerId);\n this.bus.emit(\n createResponse(\"image_list_response\", {\n requestId,\n records: images,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to list images\", err, requestId, { containerId });\n this.bus.emit(\n createResponse(\"image_list_response\", {\n requestId,\n records: [],\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageGet(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_get_request\", { requestId, imageId });\n\n try {\n const image = await this.ops.getImage(imageId);\n this.bus.emit(\n createResponse(\"image_get_response\", {\n requestId,\n record: image,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to get image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_get_response\", {\n requestId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageDelete(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.debug(\"Handling image_delete_request\", { requestId, imageId });\n\n try {\n await this.ops.deleteImage(imageId);\n this.bus.emit(\n createResponse(\"image_delete_response\", {\n requestId,\n imageId,\n })\n );\n } catch (err) {\n this.emitError(\"Failed to delete image\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_delete_response\", {\n requestId,\n imageId,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n private async handleImageMessages(event: {\n data: { requestId: string; imageId: string };\n }): Promise<void> {\n const { requestId, imageId } = event.data;\n logger.info(\"Handling image_messages_request\", { requestId, imageId });\n\n try {\n const messages = await this.ops.getImageMessages(imageId);\n logger.info(\"Got messages for image\", { imageId, count: messages.length });\n this.bus.emit(\n createResponse(\"image_messages_response\", {\n requestId,\n imageId,\n messages,\n })\n );\n logger.info(\"Emitted image_messages_response\", { requestId, imageId });\n } catch (err) {\n this.emitError(\"Failed to get image messages\", err, requestId, { imageId });\n this.bus.emit(\n createResponse(\"image_messages_response\", {\n requestId,\n imageId,\n messages: [],\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n }\n\n // Lifecycle is handled by BaseEventHandler.dispose()\n}\n","/**\n * RuntimeImpl - Event-driven Runtime implementation\n *\n * All operations are delegated to SystemBus. CommandHandler listens\n * for command events and executes the actual operations.\n *\n * Architecture:\n * ```\n * RuntimeImpl (implements Runtime extends SystemBus)\n * │\n * ├── emit/on/onCommand/emitCommand/request ← public API\n * │\n * ├── bus: SystemBusImpl ← actual event handling\n * │\n * └── commandHandler: CommandHandler ← listens for commands, executes operations\n * ```\n */\n\nimport type { Persistence } from \"@agentxjs/types\";\nimport type { Runtime, ClaudeLLMConfig, LLMProvider } from \"@agentxjs/types/runtime\";\nimport type { Agent } from \"@agentxjs/types/runtime\";\nimport type {\n BusEventHandler,\n SubscribeOptions,\n Unsubscribe,\n} from \"@agentxjs/types/runtime/internal\";\nimport type {\n SystemEvent,\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n} from \"@agentxjs/types/event\";\nimport type { RuntimeConfig } from \"./createRuntime\";\nimport type { RuntimeImageContext, RuntimeContainerContext } from \"./internal\";\nimport type { ImageListItemResult } from \"./internal/CommandHandler\";\nimport {\n SystemBusImpl,\n RuntimeImage,\n RuntimeContainer,\n CommandHandler,\n type RuntimeOperations,\n} from \"./internal\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst logger = createLogger(\"runtime/RuntimeImpl\");\n\n/**\n * RuntimeImpl - Implementation of Runtime interface\n *\n * Delegates all SystemBus methods to internal bus instance.\n */\nexport class RuntimeImpl implements Runtime {\n private readonly persistence: Persistence;\n private readonly llmProvider: LLMProvider<ClaudeLLMConfig>;\n private readonly bus: SystemBusImpl;\n private readonly llmConfig: ClaudeLLMConfig;\n private readonly basePath: string;\n private readonly commandHandler: CommandHandler;\n\n /** Container registry: containerId -> RuntimeContainer */\n private readonly containerRegistry = new Map<string, RuntimeContainer>();\n\n constructor(config: RuntimeConfig) {\n logger.info(\"RuntimeImpl constructor start\");\n this.persistence = config.persistence;\n this.llmProvider = config.llmProvider;\n this.basePath = join(homedir(), \".agentx\");\n\n // Create SystemBus\n logger.info(\"Creating SystemBus\");\n this.bus = new SystemBusImpl();\n\n // Get LLM config (each Agent will create its own Environment)\n this.llmConfig = this.llmProvider.provide();\n logger.info(\"LLM config loaded\", {\n hasApiKey: !!this.llmConfig.apiKey,\n model: this.llmConfig.model,\n });\n\n // Create CommandHandler to handle command events\n logger.info(\"Creating CommandHandler\");\n this.commandHandler = new CommandHandler(this.bus, this.createRuntimeOperations());\n\n logger.info(\"RuntimeImpl constructor done\");\n }\n\n // ==================== SystemBus delegation ====================\n\n emit(event: SystemEvent): void {\n this.bus.emit(event);\n }\n\n emitBatch(events: SystemEvent[]): void {\n this.bus.emitBatch(events);\n }\n\n on<T extends string>(\n typeOrTypes: T | string[],\n handler: BusEventHandler<SystemEvent & { type: T }>,\n options?: SubscribeOptions<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.bus.on(typeOrTypes, handler, options);\n }\n\n onAny(handler: BusEventHandler, options?: SubscribeOptions): Unsubscribe {\n return this.bus.onAny(handler, options);\n }\n\n once<T extends string>(\n type: T,\n handler: BusEventHandler<SystemEvent & { type: T }>\n ): Unsubscribe {\n return this.bus.once(type, handler);\n }\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n return this.bus.onCommand(type, handler);\n }\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n this.bus.emitCommand(type, data);\n }\n\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout?: number\n ): Promise<ResponseEventFor<T>> {\n return this.bus.request(type, data, timeout);\n }\n\n asConsumer() {\n return this.bus.asConsumer();\n }\n\n asProducer() {\n return this.bus.asProducer();\n }\n\n destroy(): void {\n this.bus.destroy();\n }\n\n // ==================== Runtime Operations (for CommandHandler) ====================\n\n private createRuntimeOperations(): RuntimeOperations {\n return {\n // Container operations\n createContainer: async (containerId: string) => {\n const container = await this.getOrCreateContainer(containerId);\n return { containerId: container.containerId };\n },\n getContainer: (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n return container ? { containerId: container.containerId } : undefined;\n },\n listContainers: () => {\n return Array.from(this.containerRegistry.values()).map((c) => ({\n containerId: c.containerId,\n }));\n },\n\n // Agent operations (by agentId)\n getAgent: (agentId: string) => {\n const agent = this.findAgent(agentId);\n if (!agent) return undefined;\n // Find imageId for this agent\n const imageId = this.findImageIdForAgent(agentId);\n return { agentId: agent.agentId, containerId: agent.containerId, imageId: imageId ?? \"\" };\n },\n listAgents: (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n if (!container) return [];\n return container.listAgents().map((a) => {\n const imageId = this.findImageIdForAgent(a.agentId);\n return { agentId: a.agentId, containerId: a.containerId, imageId: imageId ?? \"\" };\n });\n },\n destroyAgent: async (agentId: string) => {\n for (const container of this.containerRegistry.values()) {\n if (container.getAgent(agentId)) {\n return container.destroyAgent(agentId);\n }\n }\n return false;\n },\n destroyAllAgents: async (containerId: string) => {\n const container = this.containerRegistry.get(containerId);\n await container?.destroyAllAgents();\n },\n\n // Agent operations (by imageId - with auto-activation)\n receiveMessage: async (\n imageId: string | undefined,\n agentId: string | undefined,\n content: string,\n requestId: string\n ) => {\n // If imageId provided, auto-activate the image\n if (imageId) {\n logger.debug(\"Receiving message by imageId\", {\n imageId,\n contentLength: content.length,\n requestId,\n });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = await this.getOrCreateContainer(record.containerId);\n const { agent, reused } = await container.runImage(record);\n logger.info(\"Message routed to agent\", {\n imageId,\n agentId: agent.agentId,\n reused,\n requestId,\n });\n // Pass requestId for event correlation\n await agent.receive(content, requestId);\n return { agentId: agent.agentId, imageId };\n }\n\n // Fallback to agentId (legacy)\n if (agentId) {\n logger.debug(\"Receiving message by agentId (legacy)\", {\n agentId,\n contentLength: content.length,\n requestId,\n });\n const agent = this.findAgent(agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n // Pass requestId for event correlation\n await agent.receive(content, requestId);\n const foundImageId = this.findImageIdForAgent(agentId);\n return { agentId, imageId: foundImageId };\n }\n\n throw new Error(\"Either imageId or agentId must be provided\");\n },\n interruptAgent: (\n imageId: string | undefined,\n agentId: string | undefined,\n requestId?: string\n ) => {\n // If imageId provided, find agent for that image\n if (imageId) {\n const foundAgentId = this.findAgentIdForImage(imageId);\n if (!foundAgentId) {\n logger.debug(\"Image is offline, nothing to interrupt\", { imageId });\n return { imageId, agentId: undefined };\n }\n const agent = this.findAgent(foundAgentId);\n if (agent) {\n logger.info(\"Interrupting agent by imageId\", {\n imageId,\n agentId: foundAgentId,\n requestId,\n });\n // Pass requestId for event correlation\n agent.interrupt(requestId);\n }\n return { imageId, agentId: foundAgentId };\n }\n\n // Fallback to agentId (legacy)\n if (agentId) {\n const agent = this.findAgent(agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n logger.info(\"Interrupting agent by agentId (legacy)\", { agentId, requestId });\n // Pass requestId for event correlation\n agent.interrupt(requestId);\n const foundImageId = this.findImageIdForAgent(agentId);\n return { agentId, imageId: foundImageId };\n }\n\n throw new Error(\"Either imageId or agentId must be provided\");\n },\n\n // Image operations (new model)\n createImage: async (\n containerId: string,\n config: { name?: string; description?: string; systemPrompt?: string }\n ) => {\n logger.debug(\"Creating image\", { containerId, name: config.name });\n // Ensure container exists\n await this.getOrCreateContainer(containerId);\n\n // Create image\n const image = await RuntimeImage.create(\n { containerId, ...config },\n this.createImageContext()\n );\n\n logger.info(\"Image created via RuntimeOps\", { imageId: image.imageId, containerId });\n return this.toImageListItemResult(image.toRecord(), false);\n },\n runImage: async (imageId: string) => {\n logger.debug(\"Running image\", { imageId });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = await this.getOrCreateContainer(record.containerId);\n const { agent, reused } = await container.runImage(record);\n logger.info(\"Image running\", { imageId, agentId: agent.agentId, reused });\n return { imageId, agentId: agent.agentId, reused };\n },\n stopImage: async (imageId: string) => {\n logger.debug(\"Stopping image\", { imageId });\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) throw new Error(`Image not found: ${imageId}`);\n\n const container = this.containerRegistry.get(record.containerId);\n if (container) {\n await container.stopImage(imageId);\n logger.info(\"Image stopped via RuntimeOps\", { imageId });\n }\n },\n updateImage: async (imageId: string, updates: { name?: string; description?: string }) => {\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (!image) throw new Error(`Image not found: ${imageId}`);\n\n const updatedImage = await image.update(updates);\n const online = this.isImageOnline(imageId);\n return this.toImageListItemResult(updatedImage.toRecord(), online);\n },\n listImages: async (containerId?: string) => {\n const records = containerId\n ? await RuntimeImage.listByContainer(containerId, this.createImageContext())\n : await RuntimeImage.listAll(this.createImageContext());\n\n return records.map((r) => {\n const online = this.isImageOnline(r.imageId);\n return this.toImageListItemResult(r, online);\n });\n },\n getImage: async (imageId: string) => {\n const record = await this.persistence.images.findImageById(imageId);\n if (!record) return null;\n\n const online = this.isImageOnline(imageId);\n return this.toImageListItemResult(record, online);\n },\n deleteImage: async (imageId: string) => {\n logger.debug(\"Deleting image\", { imageId });\n // Stop agent if running\n const agentId = this.findAgentIdForImage(imageId);\n if (agentId) {\n logger.debug(\"Stopping running agent before delete\", { imageId, agentId });\n for (const container of this.containerRegistry.values()) {\n if (container.getAgent(agentId)) {\n await container.destroyAgent(agentId);\n break;\n }\n }\n }\n\n // Delete image (and session)\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (image) {\n await image.delete();\n logger.info(\"Image deleted via RuntimeOps\", { imageId });\n }\n },\n getImageMessages: async (imageId: string) => {\n logger.debug(\"Getting messages for image\", { imageId });\n const image = await RuntimeImage.load(imageId, this.createImageContext());\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const messages = await image.getMessages();\n logger.debug(\"Got messages from storage\", { imageId, count: messages.length });\n return messages.map((m) => {\n // Extract content based on message subtype\n let content: unknown;\n let role: string = m.role;\n let errorCode: string | undefined;\n\n if (m.subtype === \"user\" || m.subtype === \"assistant\") {\n content = (m as { content: unknown }).content;\n } else if (m.subtype === \"tool-call\") {\n content = (m as { toolCall: unknown }).toolCall;\n role = \"tool_call\";\n } else if (m.subtype === \"tool-result\") {\n content = (m as { toolResult: unknown }).toolResult;\n role = \"tool_result\";\n } else if (m.subtype === \"error\") {\n content = (m as { content: string }).content;\n role = \"error\";\n errorCode = (m as { errorCode?: string }).errorCode;\n }\n\n return {\n id: m.id,\n role,\n content,\n timestamp: m.timestamp,\n errorCode,\n };\n });\n },\n };\n }\n\n // ==================== Internal Helpers ====================\n\n private async getOrCreateContainer(containerId: string): Promise<RuntimeContainer> {\n // Check if already in memory\n const existing = this.containerRegistry.get(containerId);\n if (existing) return existing;\n\n // Try to load from persistence\n const loaded = await RuntimeContainer.load(containerId, this.createContainerContext());\n if (loaded) {\n this.containerRegistry.set(containerId, loaded);\n return loaded;\n }\n\n // Create new container\n const container = await RuntimeContainer.create(containerId, this.createContainerContext());\n this.containerRegistry.set(containerId, container);\n return container;\n }\n\n private findAgent(agentId: string): Agent | undefined {\n for (const container of this.containerRegistry.values()) {\n const agent = container.getAgent(agentId);\n if (agent) return agent;\n }\n return undefined;\n }\n\n /**\n * Find imageId for a given agentId (reverse lookup)\n */\n private findImageIdForAgent(agentId: string): string | undefined {\n for (const container of this.containerRegistry.values()) {\n const imageId = container.getImageIdForAgent(agentId);\n if (imageId) return imageId;\n }\n return undefined;\n }\n\n /**\n * Find agentId for a given imageId\n */\n private findAgentIdForImage(imageId: string): string | undefined {\n for (const container of this.containerRegistry.values()) {\n const agentId = container.getAgentIdForImage(imageId);\n if (agentId) return agentId;\n }\n return undefined;\n }\n\n /**\n * Check if an image has a running agent\n */\n private isImageOnline(imageId: string): boolean {\n for (const container of this.containerRegistry.values()) {\n if (container.isImageOnline(imageId)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Convert ImageRecord to ImageListItemResult\n */\n private toImageListItemResult(\n record: import(\"@agentxjs/types\").ImageRecord,\n online: boolean\n ): ImageListItemResult {\n const agentId = online ? this.findAgentIdForImage(record.imageId) : undefined;\n return {\n imageId: record.imageId,\n containerId: record.containerId,\n sessionId: record.sessionId,\n name: record.name,\n description: record.description,\n systemPrompt: record.systemPrompt,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n online,\n agentId,\n };\n }\n\n private createContainerContext(): RuntimeContainerContext {\n return {\n persistence: this.persistence,\n bus: this.bus,\n llmConfig: this.llmConfig,\n basePath: this.basePath,\n onDisposed: (containerId) => {\n this.containerRegistry.delete(containerId);\n },\n };\n }\n\n private createImageContext(): RuntimeImageContext {\n return {\n imageRepository: this.persistence.images,\n sessionRepository: this.persistence.sessions,\n };\n }\n\n // ==================== Lifecycle ====================\n\n async dispose(): Promise<void> {\n logger.info(\"Disposing RuntimeImpl\");\n\n // Dispose CommandHandler\n this.commandHandler.dispose();\n\n // Dispose all containers (which destroys all agents and their environments)\n for (const container of this.containerRegistry.values()) {\n await container.dispose();\n }\n\n // Destroy bus\n this.bus.destroy();\n\n // Clear all state\n this.containerRegistry.clear();\n\n logger.info(\"RuntimeImpl disposed\");\n }\n}\n","/**\n * createRuntime - Factory for creating Runtime instances\n */\n\nimport type { Persistence } from \"@agentxjs/types\";\nimport type { Runtime, LLMProvider, ClaudeLLMConfig } from \"@agentxjs/types/runtime\";\nimport type { Environment } from \"@agentxjs/types/runtime/internal\";\nimport { RuntimeImpl } from \"./RuntimeImpl\";\n\n/**\n * Runtime configuration\n */\nexport interface RuntimeConfig {\n /**\n * Persistence layer for data storage\n */\n persistence: Persistence;\n\n /**\n * LLM provider for AI model access\n */\n llmProvider: LLMProvider<ClaudeLLMConfig>;\n\n /**\n * Optional custom environment (for testing)\n * If not provided, ClaudeEnvironment will be created from llmProvider\n */\n environment?: Environment;\n}\n\n/**\n * Create a Runtime instance\n *\n * @param config - Runtime configuration\n * @returns Runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new RuntimeImpl(config);\n}\n","/**\n * PersistenceImpl - Multi-backend Persistence implementation\n *\n * Uses unstorage for backend-agnostic storage.\n * Supports: Memory, FileSystem, Redis, MongoDB, SQLite, MySQL, PostgreSQL\n *\n * @example\n * ```typescript\n * // Memory (default)\n * const persistence = await createPersistence();\n *\n * // SQLite\n * const persistence = await createPersistence({\n * driver: \"sqlite\",\n * path: \"./data.db\",\n * });\n *\n * // PostgreSQL\n * const persistence = await createPersistence({\n * driver: \"postgresql\",\n * url: \"postgres://user:pass@localhost:5432/agentx\",\n * });\n *\n * // Redis\n * const persistence = await createPersistence({\n * driver: \"redis\",\n * url: \"redis://localhost:6379\",\n * });\n * ```\n */\n\nimport { createStorage, type Storage } from \"unstorage\";\nimport type {\n Persistence,\n ImageRepository,\n ContainerRepository,\n SessionRepository,\n} from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\nimport {\n StorageImageRepository,\n StorageContainerRepository,\n StorageSessionRepository,\n} from \"./repository\";\n\nconst logger = createLogger(\"persistence/Persistence\");\n\n/**\n * Storage driver type\n */\nexport type StorageDriver =\n | \"memory\"\n | \"fs\"\n | \"redis\"\n | \"mongodb\"\n | \"sqlite\"\n | \"mysql\"\n | \"postgresql\";\n\n/**\n * Persistence configuration\n */\nexport interface PersistenceConfig {\n /**\n * Storage driver (default: \"memory\")\n */\n driver?: StorageDriver;\n\n /**\n * File path (for sqlite, fs drivers)\n * @example \"./data.db\" for sqlite\n * @example \"./data\" for fs\n */\n path?: string;\n\n /**\n * Connection URL (for redis, mongodb, mysql, postgresql)\n * @example \"redis://localhost:6379\"\n * @example \"mongodb://localhost:27017/agentx\"\n * @example \"mysql://user:pass@localhost:3306/agentx\"\n * @example \"postgres://user:pass@localhost:5432/agentx\"\n */\n url?: string;\n\n /**\n * Custom unstorage instance (advanced)\n */\n storage?: Storage;\n}\n\n/**\n * PersistenceImpl - Multi-backend Persistence implementation\n */\nexport class PersistenceImpl implements Persistence {\n readonly images: ImageRepository;\n readonly containers: ContainerRepository;\n readonly sessions: SessionRepository;\n\n private readonly storage: Storage;\n\n /**\n * Private constructor - use createPersistence() factory function\n */\n private constructor(storage: Storage, driverName: string) {\n this.storage = storage;\n\n // Create repositories\n this.images = new StorageImageRepository(this.storage);\n this.containers = new StorageContainerRepository(this.storage);\n this.sessions = new StorageSessionRepository(this.storage);\n\n logger.info(\"Persistence created\", { driver: driverName });\n }\n\n /**\n * Create a PersistenceImpl instance (async factory)\n */\n static async create(config: PersistenceConfig = {}): Promise<PersistenceImpl> {\n const driverName = config.driver ?? \"memory\";\n const storage = config.storage ?? (await createStorageFromConfig(config));\n return new PersistenceImpl(storage, driverName);\n }\n\n /**\n * Get the underlying storage instance\n */\n getStorage(): Storage {\n return this.storage;\n }\n\n /**\n * Dispose and cleanup resources\n */\n async dispose(): Promise<void> {\n await this.storage.dispose();\n logger.info(\"Persistence disposed\");\n }\n}\n\n/**\n * Create storage instance from config (async for ESM dynamic imports)\n */\nasync function createStorageFromConfig(config: PersistenceConfig): Promise<Storage> {\n const driver = config.driver ?? \"memory\";\n\n switch (driver) {\n case \"memory\":\n return createStorage();\n\n case \"fs\": {\n const { default: fsDriver } = await import(\"unstorage/drivers/fs\");\n return createStorage({\n driver: fsDriver({ base: config.path ?? \"./data\" }),\n });\n }\n\n case \"redis\": {\n const { default: redisDriver } = await import(\"unstorage/drivers/redis\");\n return createStorage({\n driver: redisDriver({ url: config.url ?? \"redis://localhost:6379\" }),\n });\n }\n\n case \"mongodb\": {\n const { default: mongoDriver } = await import(\"unstorage/drivers/mongodb\");\n return createStorage({\n driver: mongoDriver({\n connectionString: config.url ?? \"mongodb://localhost:27017\",\n databaseName: \"agentx\",\n collectionName: \"storage\",\n }),\n });\n }\n\n case \"sqlite\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: sqliteConnector } = await import(\"db0/connectors/better-sqlite3\");\n const database = createDatabase(sqliteConnector({ path: config.path ?? \"./data.db\" }));\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n case \"mysql\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: mysqlConnector } = await import(\"db0/connectors/mysql2\");\n const database = createDatabase(\n mysqlConnector({ uri: config.url ?? \"mysql://localhost:3306/agentx\" })\n );\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n case \"postgresql\": {\n const { default: db0Driver } = await import(\"unstorage/drivers/db0\");\n const { createDatabase } = await import(\"db0\");\n // @ts-expect-error - db0 connectors use .mts exports, not compatible with moduleResolution: node\n const { default: pgConnector } = await import(\"db0/connectors/postgresql\");\n const database = createDatabase(\n pgConnector({ connectionString: config.url ?? \"postgres://localhost:5432/agentx\" })\n );\n return createStorage({\n driver: db0Driver({ database }),\n });\n }\n\n default:\n throw new Error(`Unknown storage driver: ${driver}`);\n }\n}\n\n/**\n * Create Persistence instance (async)\n *\n * @param config - Configuration options\n * @returns Promise<Persistence> instance\n */\nexport async function createPersistence(config?: PersistenceConfig): Promise<PersistenceImpl> {\n return PersistenceImpl.create(config);\n}\n","/**\n * StorageImageRepository - unstorage-based ImageRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { ImageRepository, ImageRecord, ImageMetadata } from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/ImageRepository\");\n\n/** Key prefix for images */\nconst PREFIX = \"images\";\n\n/** Index prefix for name lookup */\nconst INDEX_BY_NAME = \"idx:images:name\";\n\n/** Index prefix for container lookup */\nconst INDEX_BY_CONTAINER = \"idx:images:container\";\n\n/**\n * StorageImageRepository - unstorage implementation\n */\nexport class StorageImageRepository implements ImageRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(imageId: string): string {\n return `${PREFIX}:${imageId}`;\n }\n\n private nameIndexKey(name: string, imageId: string): string {\n return `${INDEX_BY_NAME}:${name}:${imageId}`;\n }\n\n private containerIndexKey(containerId: string, imageId: string): string {\n return `${INDEX_BY_CONTAINER}:${containerId}:${imageId}`;\n }\n\n async saveImage(record: ImageRecord): Promise<void> {\n // Save main record\n await this.storage.setItem(this.key(record.imageId), record);\n\n // Save index for name lookup\n await this.storage.setItem(this.nameIndexKey(record.name, record.imageId), record.imageId);\n\n // Save index for container lookup\n await this.storage.setItem(\n this.containerIndexKey(record.containerId, record.imageId),\n record.imageId\n );\n\n logger.debug(\"Image saved\", { imageId: record.imageId });\n }\n\n async findImageById(imageId: string): Promise<ImageRecord | null> {\n const record = await this.storage.getItem<ImageRecord>(this.key(imageId));\n return record ?? null;\n }\n\n async findAllImages(): Promise<ImageRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n // Skip index keys\n if (key.startsWith(\"idx:\")) continue;\n\n const record = await this.storage.getItem<ImageRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findImagesByName(name: string): Promise<ImageRecord[]> {\n const indexPrefix = `${INDEX_BY_NAME}:${name}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n const imageId = await this.storage.getItem<string>(key);\n if (imageId) {\n const record = await this.findImageById(imageId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findImagesByContainerId(containerId: string): Promise<ImageRecord[]> {\n const indexPrefix = `${INDEX_BY_CONTAINER}:${containerId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: ImageRecord[] = [];\n\n for (const key of keys) {\n const imageId = await this.storage.getItem<string>(key);\n if (imageId) {\n const record = await this.findImageById(imageId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteImage(imageId: string): Promise<void> {\n // Get record to find name and containerId for index cleanup\n const record = await this.findImageById(imageId);\n\n // Delete main record\n await this.storage.removeItem(this.key(imageId));\n\n // Delete indexes\n if (record) {\n await this.storage.removeItem(this.nameIndexKey(record.name, imageId));\n await this.storage.removeItem(this.containerIndexKey(record.containerId, imageId));\n }\n\n logger.debug(\"Image deleted\", { imageId });\n }\n\n async imageExists(imageId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(imageId));\n }\n\n async updateMetadata(imageId: string, metadata: Partial<ImageMetadata>): Promise<void> {\n const record = await this.findImageById(imageId);\n if (!record) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Merge metadata\n const updatedRecord: ImageRecord = {\n ...record,\n metadata: {\n ...record.metadata,\n ...metadata,\n },\n updatedAt: Date.now(),\n };\n\n await this.storage.setItem(this.key(imageId), updatedRecord);\n logger.debug(\"Image metadata updated\", { imageId, metadata });\n }\n}\n","/**\n * StorageContainerRepository - unstorage-based ContainerRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { ContainerRepository, ContainerRecord } from \"@agentxjs/types/runtime/internal\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/ContainerRepository\");\n\n/** Key prefix for containers */\nconst PREFIX = \"containers\";\n\n/**\n * StorageContainerRepository - unstorage implementation\n */\nexport class StorageContainerRepository implements ContainerRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(containerId: string): string {\n return `${PREFIX}:${containerId}`;\n }\n\n async saveContainer(record: ContainerRecord): Promise<void> {\n await this.storage.setItem(this.key(record.containerId), record);\n logger.debug(\"Container saved\", { containerId: record.containerId });\n }\n\n async findContainerById(containerId: string): Promise<ContainerRecord | null> {\n const record = await this.storage.getItem<ContainerRecord>(this.key(containerId));\n return record ?? null;\n }\n\n async findAllContainers(): Promise<ContainerRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: ContainerRecord[] = [];\n\n for (const key of keys) {\n const record = await this.storage.getItem<ContainerRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n await this.storage.removeItem(this.key(containerId));\n logger.debug(\"Container deleted\", { containerId });\n }\n\n async containerExists(containerId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(containerId));\n }\n}\n","/**\n * StorageSessionRepository - unstorage-based SessionRepository\n *\n * Uses unstorage for backend-agnostic storage (Memory, Redis, SQLite, etc.)\n */\n\nimport type { Storage } from \"unstorage\";\nimport type { SessionRepository, SessionRecord } from \"@agentxjs/types/runtime/internal\";\nimport type { Message } from \"@agentxjs/types/agent\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"persistence/SessionRepository\");\n\n/** Key prefix for sessions */\nconst PREFIX = \"sessions\";\n\n/** Key prefix for messages */\nconst MESSAGES_PREFIX = \"messages\";\n\n/** Index prefix for image lookup */\nconst INDEX_BY_IMAGE = \"idx:sessions:image\";\n\n/** Index prefix for container lookup */\nconst INDEX_BY_CONTAINER = \"idx:sessions:container\";\n\n/**\n * StorageSessionRepository - unstorage implementation\n */\nexport class StorageSessionRepository implements SessionRepository {\n constructor(private readonly storage: Storage) {}\n\n private key(sessionId: string): string {\n return `${PREFIX}:${sessionId}`;\n }\n\n private messagesKey(sessionId: string): string {\n return `${MESSAGES_PREFIX}:${sessionId}`;\n }\n\n private imageIndexKey(imageId: string, sessionId: string): string {\n return `${INDEX_BY_IMAGE}:${imageId}:${sessionId}`;\n }\n\n private containerIndexKey(containerId: string, sessionId: string): string {\n return `${INDEX_BY_CONTAINER}:${containerId}:${sessionId}`;\n }\n\n async saveSession(record: SessionRecord): Promise<void> {\n // Save main record\n await this.storage.setItem(this.key(record.sessionId), record);\n\n // Save index for image lookup\n await this.storage.setItem(\n this.imageIndexKey(record.imageId, record.sessionId),\n record.sessionId\n );\n\n // Save index for container lookup\n await this.storage.setItem(\n this.containerIndexKey(record.containerId, record.sessionId),\n record.sessionId\n );\n\n logger.debug(\"Session saved\", { sessionId: record.sessionId });\n }\n\n async findSessionById(sessionId: string): Promise<SessionRecord | null> {\n const record = await this.storage.getItem<SessionRecord>(this.key(sessionId));\n return record ?? null;\n }\n\n async findSessionByImageId(imageId: string): Promise<SessionRecord | null> {\n const indexPrefix = `${INDEX_BY_IMAGE}:${imageId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n\n if (keys.length === 0) return null;\n\n // Return the first (most recent) session for this image\n const sessionId = await this.storage.getItem<string>(keys[0]);\n if (!sessionId) return null;\n\n return this.findSessionById(sessionId);\n }\n\n async findSessionsByContainerId(containerId: string): Promise<SessionRecord[]> {\n const indexPrefix = `${INDEX_BY_CONTAINER}:${containerId}`;\n const keys = await this.storage.getKeys(indexPrefix);\n const records: SessionRecord[] = [];\n\n for (const key of keys) {\n const sessionId = await this.storage.getItem<string>(key);\n if (sessionId) {\n const record = await this.findSessionById(sessionId);\n if (record) {\n records.push(record);\n }\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async findAllSessions(): Promise<SessionRecord[]> {\n const keys = await this.storage.getKeys(PREFIX);\n const records: SessionRecord[] = [];\n\n for (const key of keys) {\n // Skip index keys\n if (key.startsWith(\"idx:\")) continue;\n\n const record = await this.storage.getItem<SessionRecord>(key);\n if (record) {\n records.push(record);\n }\n }\n\n return records.sort((a, b) => b.createdAt - a.createdAt);\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n // Get record for index cleanup\n const record = await this.findSessionById(sessionId);\n\n // Delete main record\n await this.storage.removeItem(this.key(sessionId));\n\n // Delete messages\n await this.storage.removeItem(this.messagesKey(sessionId));\n\n // Delete indexes\n if (record) {\n await this.storage.removeItem(this.imageIndexKey(record.imageId, sessionId));\n await this.storage.removeItem(this.containerIndexKey(record.containerId, sessionId));\n }\n\n logger.debug(\"Session deleted\", { sessionId });\n }\n\n async sessionExists(sessionId: string): Promise<boolean> {\n return await this.storage.hasItem(this.key(sessionId));\n }\n\n // ==================== Message Operations ====================\n\n async addMessage(sessionId: string, message: Message): Promise<void> {\n const messages = await this.getMessages(sessionId);\n messages.push(message);\n await this.storage.setItem(this.messagesKey(sessionId), messages);\n logger.debug(\"Message added to session\", { sessionId, subtype: message.subtype });\n }\n\n async getMessages(sessionId: string): Promise<Message[]> {\n const messages = await this.storage.getItem<Message[]>(this.messagesKey(sessionId));\n // Ensure we always return an array (handle corrupted data)\n if (!messages || !Array.isArray(messages)) {\n if (messages) {\n logger.warn(\"Messages data is not an array, resetting\", {\n sessionId,\n type: typeof messages,\n });\n }\n return [];\n }\n return messages;\n }\n\n async clearMessages(sessionId: string): Promise<void> {\n await this.storage.removeItem(this.messagesKey(sessionId));\n logger.debug(\"Messages cleared for session\", { sessionId });\n }\n}\n"],"mappings":"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","names":["_ConsoleLogger","logger","logger","shouldPreserveToolCalls","logger","createLogger","handleMessageStart","handleMessageStop","handleTextDelta","handleToolUseStart","handleToolUseStop","handleErrorReceived","generateId","handleMessageStop","logger","createLogger","logger","createLogger","h","logger","import_rxjs","logger","logger","logger","logger","logger","logger","logger","import_node_path","logger","logger","logger","PREFIX","logger","PREFIX","INDEX_BY_CONTAINER","logger"]}
|