@agentxjs/agent 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/README.md +539 -0
- package/dist/index.cjs +1099 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +772 -0
- package/dist/index.d.ts +772 -0
- package/dist/index.js +1075 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/mealy/Store.ts","../src/engine/mealy/Mealy.ts","../src/engine/mealy/combinators.ts","../src/engine/internal/messageAssemblerProcessor.ts","../src/engine/internal/stateEventProcessor.ts","../src/engine/internal/turnTrackerProcessor.ts","../src/engine/AgentProcessor.ts","../src/engine/MealyMachine.ts","../src/AgentStateMachine.ts","../src/createAgent.ts"],"names":["createLogger","logger","shouldPreserveToolCalls","handleMessageStart","handleMessageStop","handleTextDelta","handleToolUseStart","handleToolUseStop","handleErrorReceived","generateId","isStateEvent","h"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 // Message types\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\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 // Create ToolCallMessage (complete Message object)\n // parentId links this tool call to its parent assistant message\n const messageId = generateId();\n const timestamp = Date.now();\n const toolCallMessage: ToolCallMessage = {\n id: messageId,\n role: \"assistant\",\n subtype: \"tool-call\",\n toolCall,\n timestamp,\n parentId: state.currentMessageId || undefined,\n };\n\n // Emit tool_call_message event - data is complete Message object\n const toolCallMessageEvent: ToolCallMessageEvent = {\n type: \"tool_call_message\",\n timestamp,\n data: toolCallMessage,\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 // Create ToolResultMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const toolResultMessage: ToolResultMessage = {\n id: messageId,\n role: \"tool\",\n subtype: \"tool-result\",\n toolCallId,\n toolResult,\n timestamp,\n };\n\n // Emit tool_result_message event - data is complete Message object\n const toolResultMessageEvent: ToolResultMessageEvent = {\n type: \"tool_result_message\",\n timestamp,\n data: toolResultMessage,\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 // Create AssistantMessage (complete Message object)\n const timestamp = state.messageStartTime || Date.now();\n const assistantMessage: AssistantMessage = {\n id: state.currentMessageId,\n role: \"assistant\",\n subtype: \"assistant\",\n content: contentParts,\n timestamp,\n };\n\n // Emit AssistantMessageEvent - data is complete Message object\n const assistantEvent: AssistantMessageEvent = {\n type: \"assistant_message\",\n timestamp,\n data: assistantMessage,\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 // Create ErrorMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const errorMessage: ErrorMessage = {\n id: messageId,\n role: \"error\",\n subtype: \"error\",\n content: data.message,\n errorCode: data.errorCode,\n timestamp,\n };\n\n // Emit error_message event - data is complete Message object\n const errorMessageEvent: ErrorMessageEvent = {\n type: \"error_message\",\n timestamp,\n data: errorMessage,\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 // Extract content as string (UserMessage.content can be string or array)\n const contentText = typeof data.content === \"string\" ? data.content : \"\";\n\n const pendingTurn: PendingTurn = {\n turnId,\n messageId: data.id,\n content: contentText,\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.id,\n content: contentText,\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"]}
|