@agentxjs/core 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
- package/dist/{RpcClient-BcJ_zAGu.d.ts → RpcClient-CMdhJxjS.d.ts} +2 -2
- package/dist/agent/engine/internal/index.d.ts +4 -5
- package/dist/agent/engine/internal/index.js +1 -1
- package/dist/agent/engine/mealy/index.d.ts +4 -4
- package/dist/agent/engine/mealy/index.js +1 -1
- package/dist/agent/index.d.ts +91 -91
- package/dist/agent/index.js +6 -6
- package/dist/agent/types/index.d.ts +4 -4
- package/dist/agent/types/index.js +1 -1
- package/dist/bash/index.d.ts +4 -4
- package/dist/{chunk-LTVNPHST.js → chunk-22NTRYNO.js} +60 -60
- package/dist/chunk-22NTRYNO.js.map +1 -0
- package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
- package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
- package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
- package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
- package/dist/{chunk-JTKCV7IS.js → chunk-RWIYC65R.js} +111 -111
- package/dist/{chunk-JTKCV7IS.js.map → chunk-RWIYC65R.js.map} +1 -1
- package/dist/{chunk-DEAR6N3O.js → chunk-TUFZ2YH6.js} +1 -1
- package/dist/chunk-TUFZ2YH6.js.map +1 -0
- package/dist/{chunk-23UUBQXR.js → chunk-YSZG6XIM.js} +1 -1
- package/dist/chunk-YSZG6XIM.js.map +1 -0
- package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
- package/dist/common/logger/index.js +14 -14
- package/dist/common/logger/index.js.map +1 -1
- package/dist/container/index.d.ts +3 -3
- package/dist/driver/index.d.ts +2 -2
- package/dist/event/index.d.ts +1 -1
- package/dist/event/index.js +2 -2
- package/dist/event/types/index.d.ts +199 -199
- package/dist/event/types/index.js +1 -1
- package/dist/{event-DNWOBSBO.d.ts → event-DNsF9EkO.d.ts} +4 -6
- package/dist/image/index.d.ts +3 -3
- package/dist/image/index.js.map +1 -1
- package/dist/{index-CuS1i5V-.d.ts → index--gxNpY5W.d.ts} +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +6 -6
- package/dist/{message-03TJzvIX.d.ts → message-Dn-I2vr0.d.ts} +1 -1
- package/dist/mq/index.d.ts +25 -25
- package/dist/mq/index.js +1 -1
- package/dist/mq/index.js.map +1 -1
- package/dist/network/index.d.ts +57 -57
- package/dist/network/index.js +27 -27
- package/dist/network/index.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -2
- package/dist/platform/index.d.ts +4 -4
- package/dist/runtime/index.d.ts +5 -5
- package/dist/runtime/index.js +6 -6
- package/dist/runtime/index.js.map +1 -1
- package/dist/session/index.d.ts +3 -3
- package/dist/{types-aE74Eo6G.d.ts → types-Cb8tKM6Y.d.ts} +1 -1
- package/package.json +1 -1
- package/src/agent/AgentStateMachine.ts +2 -2
- package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
- package/src/agent/__tests__/createAgent.test.ts +4 -4
- package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +10 -10
- package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
- package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +4 -4
- package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
- package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
- package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
- package/src/agent/createAgent.ts +15 -15
- package/src/agent/engine/AgentProcessor.ts +7 -7
- package/src/agent/engine/MealyMachine.ts +3 -3
- package/src/agent/engine/internal/index.ts +11 -11
- package/src/agent/engine/internal/messageAssemblerProcessor.ts +14 -14
- package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
- package/src/agent/engine/internal/turnTrackerProcessor.ts +4 -4
- package/src/agent/engine/mealy/Mealy.ts +2 -2
- package/src/agent/engine/mealy/combinators.ts +10 -10
- package/src/agent/engine/mealy/index.ts +9 -11
- package/src/agent/index.ts +30 -32
- package/src/agent/types/engine.ts +3 -3
- package/src/agent/types/event.ts +4 -8
- package/src/agent/types/index.ts +85 -85
- package/src/bash/index.ts +1 -1
- package/src/common/logger/ConsoleLogger.ts +1 -1
- package/src/common/logger/LoggerFactoryImpl.ts +14 -14
- package/src/common/logger/index.ts +3 -3
- package/src/container/index.ts +4 -5
- package/src/container/types.ts +1 -1
- package/src/driver/index.ts +15 -17
- package/src/driver/types.ts +89 -79
- package/src/event/EventBus.ts +10 -10
- package/src/event/__tests__/EventBus.test.ts +1 -1
- package/src/event/index.ts +2 -3
- package/src/event/types/agent.ts +186 -180
- package/src/event/types/bus.ts +1 -1
- package/src/event/types/command.ts +292 -265
- package/src/event/types/container.ts +207 -222
- package/src/event/types/driver.ts +153 -155
- package/src/event/types/index.ts +6 -12
- package/src/event/types/session.ts +117 -130
- package/src/image/Image.ts +1 -1
- package/src/image/index.ts +4 -5
- package/src/mq/OffsetGenerator.ts +1 -1
- package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
- package/src/mq/index.ts +4 -5
- package/src/network/RpcClient.ts +5 -5
- package/src/network/index.ts +40 -43
- package/src/network/jsonrpc.ts +5 -5
- package/src/persistence/index.ts +5 -5
- package/src/platform/types.ts +3 -3
- package/src/runtime/AgentXRuntime.ts +15 -15
- package/src/runtime/__tests__/AgentXRuntime.test.ts +5 -5
- package/src/runtime/index.ts +5 -6
- package/src/runtime/types.ts +1 -1
- package/src/session/index.ts +2 -3
- package/dist/chunk-23UUBQXR.js.map +0 -1
- package/dist/chunk-DEAR6N3O.js.map +0 -1
- package/dist/chunk-LTVNPHST.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/AgentXRuntime.ts"],"sourcesContent":["/**\n * AgentXRuntimeImpl - Runtime integration implementation\n *\n * Integrates all components to provide agent lifecycle management.\n * Uses Platform dependencies to coordinate Session, Image, Container, etc.\n *\n * Architecture:\n * - Driver.receive() returns AsyncIterable<DriverStreamEvent>\n * - Runtime emits raw stream events to EventBus\n * - Runtime pushes events through AgentEngine (MealyMachine → Presenter)\n * - Presenter emits message/state/turn events and persists messages\n */\n\nimport { createLogger } from \"commonxjs/logger\";\nimport type {\n AgentXPlatform,\n AgentXRuntime,\n RuntimeAgent,\n CreateAgentOptions,\n AgentEventHandler,\n Subscription,\n AgentLifecycle,\n} from \"./types\";\nimport type {\n UserContentPart,\n UserMessage,\n AgentEngine,\n StreamEvent,\n AgentOutput,\n AgentPresenter,\n AgentSource,\n Message,\n} from \"../agent/types\";\nimport type { BusEvent } from \"../event/types\";\nimport type {\n CreateDriver,\n Driver,\n DriverConfig,\n DriverStreamEvent,\n ToolDefinition,\n} from \"../driver/types\";\nimport { createSession } from \"../session/Session\";\nimport { createBashTool } from \"../bash/tool\";\nimport { createAgent as createAgentEngine } from \"../agent/createAgent\";\n\nconst logger = createLogger(\"runtime/AgentXRuntime\");\n\n/**\n * Internal agent state\n */\ninterface AgentState {\n agent: RuntimeAgent;\n lifecycle: AgentLifecycle;\n subscriptions: Set<() => void>;\n driver: Driver;\n engine: AgentEngine;\n /** Flag to track if a receive operation is in progress */\n isReceiving: boolean;\n}\n\n/**\n * AgentXRuntimeImpl - Runtime implementation\n */\nexport class AgentXRuntimeImpl implements AgentXRuntime {\n readonly platform: AgentXPlatform;\n private readonly createDriver: CreateDriver;\n\n private agents = new Map<string, AgentState>();\n private globalSubscriptions = new Set<() => void>();\n private isShutdown = false;\n\n constructor(platform: AgentXPlatform, createDriver: CreateDriver) {\n this.platform = platform;\n this.createDriver = createDriver;\n logger.info(\"AgentXRuntime initialized\");\n }\n\n // ==================== Agent Lifecycle ====================\n\n async createAgent(options: CreateAgentOptions): Promise<RuntimeAgent> {\n if (this.isShutdown) {\n throw new Error(\"Runtime is shutdown\");\n }\n\n const { imageId } = options;\n\n // Load image\n const imageRecord = await this.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Generate agent ID\n const agentId = options.agentId ?? this.generateAgentId();\n\n // Ensure container exists\n const containerExists = await this.platform.containerRepository.containerExists(\n imageRecord.containerId\n );\n if (!containerExists) {\n throw new Error(`Container not found: ${imageRecord.containerId}`);\n }\n\n // Create Session for driver (MonoDriver needs this to read history)\n const session = createSession({\n sessionId: imageRecord.sessionId,\n imageId,\n containerId: imageRecord.containerId,\n repository: this.platform.sessionRepository,\n });\n\n // Assemble platform-provided default tools\n const defaultTools: ToolDefinition[] = [];\n if (this.platform.bashProvider) {\n defaultTools.push(createBashTool(this.platform.bashProvider));\n }\n\n // Create driver config (apiKey/baseUrl are provided by the createDriver closure)\n const driverConfig: DriverConfig = {\n apiKey: \"\",\n agentId,\n systemPrompt: imageRecord.systemPrompt,\n mcpServers: imageRecord.mcpServers,\n tools: defaultTools.length > 0 ? defaultTools : undefined,\n session, // Inject Session for stateless drivers\n resumeSessionId: imageRecord.metadata?.driverSessionId as string | undefined,\n onSessionIdCaptured: async (driverSessionId: string) => {\n // Persist driver session ID for resume\n await this.platform.imageRepository.updateMetadata(imageId, { driverSessionId });\n },\n };\n\n // Create driver using the injected CreateDriver function\n const driver = this.createDriver(driverConfig);\n\n // Initialize driver\n await driver.initialize();\n\n // Create AgentEngine with custom Source and Presenter\n // Source: no-op (Runtime pushes events directly via handleStreamEvent)\n // Presenter: emits message/state/turn events to EventBus + persists messages\n const noopSource: AgentSource = {\n name: \"RuntimeSource\",\n connect: () => {},\n disconnect: () => {},\n };\n\n const sessionId = imageRecord.sessionId;\n const sessionRepository = this.platform.sessionRepository;\n const eventBus = this.platform.eventBus;\n\n const runtimePresenter: AgentPresenter = {\n name: \"RuntimePresenter\",\n present: (_agentId: string, output: AgentOutput) => {\n const category = categorizeAgentOutput(output.type);\n\n // Skip stream events — already emitted by handleDriverEvent\n if (category === \"stream\") return;\n\n // Emit state/message/turn events to EventBus\n eventBus.emit({\n type: output.type,\n timestamp: output.timestamp,\n source: \"agent\",\n category,\n intent: \"notification\",\n data: output.data,\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId,\n },\n } as BusEvent);\n\n // Persist message events to SessionRepository\n if (category === \"message\" && output.type !== \"user_message\") {\n const message = output.data as Message;\n sessionRepository.addMessage(sessionId, message).catch((err) => {\n logger.error(\"Failed to persist message\", { type: output.type, error: err });\n });\n }\n },\n };\n\n const engine = createAgentEngine({\n agentId,\n bus: this.platform.eventBus,\n source: noopSource,\n presenter: runtimePresenter,\n });\n\n // Create runtime agent\n const agent: RuntimeAgent = {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n name: imageRecord.name,\n lifecycle: \"running\",\n createdAt: Date.now(),\n };\n\n // Store agent state with driver and engine\n const state: AgentState = {\n agent,\n lifecycle: \"running\",\n subscriptions: new Set(),\n driver,\n engine,\n isReceiving: false,\n };\n this.agents.set(agentId, state);\n\n // Emit agent_created event\n this.platform.eventBus.emit({\n type: \"agent_created\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n },\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent created\", {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n });\n\n return agent;\n }\n\n getAgent(agentId: string): RuntimeAgent | undefined {\n const state = this.agents.get(agentId);\n return state?.agent;\n }\n\n getAgents(): RuntimeAgent[] {\n return Array.from(this.agents.values()).map((s) => s.agent);\n }\n\n getAgentsByContainer(containerId: string): RuntimeAgent[] {\n return Array.from(this.agents.values())\n .filter((s) => s.agent.containerId === containerId)\n .map((s) => s.agent);\n }\n\n async stopAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Agent already destroyed: ${agentId}`);\n }\n\n state.lifecycle = \"stopped\";\n\n // Emit agent_stopped event\n this.platform.eventBus.emit({\n type: \"agent_stopped\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent stopped\", { agentId });\n }\n\n async resumeAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Cannot resume destroyed agent: ${agentId}`);\n }\n\n state.lifecycle = \"running\";\n\n // Emit agent_resumed event\n this.platform.eventBus.emit({\n type: \"agent_resumed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent resumed\", { agentId });\n }\n\n async destroyAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Dispose driver and engine\n await state.driver.dispose();\n await state.engine.destroy();\n\n // Cleanup subscriptions\n for (const unsub of state.subscriptions) {\n unsub();\n }\n state.subscriptions.clear();\n\n state.lifecycle = \"destroyed\";\n\n // Emit agent_destroyed event\n this.platform.eventBus.emit({\n type: \"agent_destroyed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n // Remove from map\n this.agents.delete(agentId);\n\n logger.info(\"Agent destroyed\", { agentId });\n }\n\n // ==================== Message Handling ====================\n\n async receive(\n agentId: string,\n content: string | UserContentPart[],\n requestId?: string\n ): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);\n }\n\n if (state.isReceiving) {\n throw new Error(`Agent ${agentId} is already processing a message`);\n }\n\n const actualRequestId = requestId ?? this.generateRequestId();\n\n // Build user message\n const userMessage: UserMessage = {\n id: this.generateMessageId(),\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // Persist to session\n await this.platform.sessionRepository.addMessage(state.agent.sessionId, userMessage);\n\n // Emit user_message event (for external subscribers)\n this.emitEvent(state, \"user_message\", userMessage, actualRequestId);\n\n logger.debug(\"User message sent\", {\n agentId,\n requestId: actualRequestId,\n contentPreview:\n typeof content === \"string\"\n ? content.substring(0, 50)\n : Array.isArray(content)\n ? `[${content.length} parts]`\n : `[${typeof content}]`,\n });\n\n // Mark as receiving\n state.isReceiving = true;\n\n try {\n // Call driver.receive() and process the AsyncIterable\n for await (const event of state.driver.receive(userMessage)) {\n // Convert DriverStreamEvent to BusEvent and emit\n this.handleDriverEvent(state, event, actualRequestId);\n }\n } catch (error) {\n // Emit error event\n this.emitEvent(\n state,\n \"error_received\",\n {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n },\n actualRequestId\n );\n throw error;\n } finally {\n state.isReceiving = false;\n }\n }\n\n interrupt(agentId: string, requestId?: string): void {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Call driver.interrupt() directly\n state.driver.interrupt();\n\n // Emit interrupt event (for external subscribers)\n this.emitEvent(state, \"interrupt\", { agentId }, requestId ?? this.generateRequestId());\n\n logger.debug(\"Interrupt sent\", { agentId, requestId });\n }\n\n // ==================== Event Subscription ====================\n\n subscribe(agentId: string, handler: AgentEventHandler): Subscription {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n const unsub = this.platform.eventBus.onAny((event) => {\n const context = (event as BusEvent & { context?: { agentId?: string } }).context;\n if (context?.agentId === agentId) {\n handler(event);\n }\n });\n\n state.subscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n state.subscriptions.delete(unsub);\n },\n };\n }\n\n subscribeAll(handler: AgentEventHandler): Subscription {\n const unsub = this.platform.eventBus.onAny(handler);\n this.globalSubscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n this.globalSubscriptions.delete(unsub);\n },\n };\n }\n\n // ==================== Cleanup ====================\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n\n logger.info(\"Shutting down AgentXRuntime...\");\n\n // Destroy all agents\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n\n // Cleanup global subscriptions\n for (const unsub of this.globalSubscriptions) {\n unsub();\n }\n this.globalSubscriptions.clear();\n\n this.isShutdown = true;\n logger.info(\"AgentXRuntime shutdown complete\");\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Handle a single DriverStreamEvent\n */\n private handleDriverEvent(state: AgentState, event: DriverStreamEvent, requestId: string): void {\n // 1. Emit raw stream event to EventBus (for Presentation and other subscribers)\n this.emitEvent(state, event.type, event.data, requestId);\n\n // 2. Push to AgentEngine for MealyMachine processing\n // Engine produces message/state/turn events via Presenter\n const streamEvent = toStreamEvent(event);\n state.engine.handleStreamEvent(streamEvent);\n }\n\n /**\n * Emit an event to the EventBus\n */\n private emitEvent(state: AgentState, type: string, data: unknown, requestId: string): void {\n this.platform.eventBus.emit({\n type,\n timestamp: Date.now(),\n source: \"runtime\",\n category: this.categorizeEvent(type),\n intent: \"notification\",\n requestId,\n data,\n context: {\n agentId: state.agent.agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n }\n\n /**\n * Categorize event type\n */\n private categorizeEvent(type: string): string {\n if (type.includes(\"message\")) return \"message\";\n if (type.includes(\"tool\")) return \"tool\";\n if (type.includes(\"error\") || type.includes(\"interrupted\")) return \"error\";\n if (type.includes(\"delta\")) return \"stream\";\n return \"stream\";\n }\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 private generateRequestId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `req_${timestamp}_${random}`;\n }\n\n private generateMessageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `msg_${timestamp}_${random}`;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert DriverStreamEvent to agent-layer StreamEvent.\n * Data structures are identical; only \"error\" type needs renaming.\n */\nfunction toStreamEvent(event: DriverStreamEvent): StreamEvent {\n const type = event.type === \"error\" ? \"error_received\" : event.type;\n return { type, data: event.data, timestamp: Date.now() } as StreamEvent;\n}\n\n/**\n * Categorize AgentOutput type for EventBus emission.\n */\nfunction categorizeAgentOutput(type: string): string {\n // Stream layer — already emitted by handleDriverEvent\n const streamTypes = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_delta\",\n \"tool_use_start\",\n \"input_json_delta\",\n \"tool_use_stop\",\n \"tool_result\",\n \"error_received\",\n ];\n if (streamTypes.includes(type)) return \"stream\";\n\n // Message layer\n if (type.endsWith(\"_message\")) return \"message\";\n\n // Turn layer\n if (type.startsWith(\"turn_\")) return \"turn\";\n\n // State layer (default)\n return \"state\";\n}\n\n/**\n * Create an AgentXRuntime instance\n *\n * @param platform - AgentXPlatform with repositories and event bus\n * @param createDriver - Factory function for creating Driver instances per Agent\n */\nexport function createAgentXRuntime(\n platform: AgentXPlatform,\n createDriver: CreateDriver\n): AgentXRuntime {\n return new AgentXRuntimeImpl(platform, createDriver);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/AgentXRuntime.ts"],"sourcesContent":["/**\n * AgentXRuntimeImpl - Runtime integration implementation\n *\n * Integrates all components to provide agent lifecycle management.\n * Uses Platform dependencies to coordinate Session, Image, Container, etc.\n *\n * Architecture:\n * - Driver.receive() returns AsyncIterable<DriverStreamEvent>\n * - Runtime emits raw stream events to EventBus\n * - Runtime pushes events through AgentEngine (MealyMachine → Presenter)\n * - Presenter emits message/state/turn events and persists messages\n */\n\nimport { createLogger } from \"commonxjs/logger\";\nimport { createAgent as createAgentEngine } from \"../agent/createAgent\";\nimport type {\n AgentEngine,\n AgentOutput,\n AgentPresenter,\n AgentSource,\n Message,\n StreamEvent,\n UserContentPart,\n UserMessage,\n} from \"../agent/types\";\nimport { createBashTool } from \"../bash/tool\";\nimport type {\n CreateDriver,\n Driver,\n DriverConfig,\n DriverStreamEvent,\n ToolDefinition,\n} from \"../driver/types\";\nimport type { BusEvent } from \"../event/types\";\nimport { createSession } from \"../session/Session\";\nimport type {\n AgentEventHandler,\n AgentLifecycle,\n AgentXPlatform,\n AgentXRuntime,\n CreateAgentOptions,\n RuntimeAgent,\n Subscription,\n} from \"./types\";\n\nconst logger = createLogger(\"runtime/AgentXRuntime\");\n\n/**\n * Internal agent state\n */\ninterface AgentState {\n agent: RuntimeAgent;\n lifecycle: AgentLifecycle;\n subscriptions: Set<() => void>;\n driver: Driver;\n engine: AgentEngine;\n /** Flag to track if a receive operation is in progress */\n isReceiving: boolean;\n}\n\n/**\n * AgentXRuntimeImpl - Runtime implementation\n */\nexport class AgentXRuntimeImpl implements AgentXRuntime {\n readonly platform: AgentXPlatform;\n private readonly createDriver: CreateDriver;\n\n private agents = new Map<string, AgentState>();\n private globalSubscriptions = new Set<() => void>();\n private isShutdown = false;\n\n constructor(platform: AgentXPlatform, createDriver: CreateDriver) {\n this.platform = platform;\n this.createDriver = createDriver;\n logger.info(\"AgentXRuntime initialized\");\n }\n\n // ==================== Agent Lifecycle ====================\n\n async createAgent(options: CreateAgentOptions): Promise<RuntimeAgent> {\n if (this.isShutdown) {\n throw new Error(\"Runtime is shutdown\");\n }\n\n const { imageId } = options;\n\n // Load image\n const imageRecord = await this.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Generate agent ID\n const agentId = options.agentId ?? this.generateAgentId();\n\n // Ensure container exists\n const containerExists = await this.platform.containerRepository.containerExists(\n imageRecord.containerId\n );\n if (!containerExists) {\n throw new Error(`Container not found: ${imageRecord.containerId}`);\n }\n\n // Create Session for driver (MonoDriver needs this to read history)\n const session = createSession({\n sessionId: imageRecord.sessionId,\n imageId,\n containerId: imageRecord.containerId,\n repository: this.platform.sessionRepository,\n });\n\n // Assemble platform-provided default tools\n const defaultTools: ToolDefinition[] = [];\n if (this.platform.bashProvider) {\n defaultTools.push(createBashTool(this.platform.bashProvider));\n }\n\n // Create driver config (apiKey/baseUrl are provided by the createDriver closure)\n const driverConfig: DriverConfig = {\n apiKey: \"\",\n agentId,\n systemPrompt: imageRecord.systemPrompt,\n mcpServers: imageRecord.mcpServers,\n tools: defaultTools.length > 0 ? defaultTools : undefined,\n session, // Inject Session for stateless drivers\n resumeSessionId: imageRecord.metadata?.driverSessionId as string | undefined,\n onSessionIdCaptured: async (driverSessionId: string) => {\n // Persist driver session ID for resume\n await this.platform.imageRepository.updateMetadata(imageId, { driverSessionId });\n },\n };\n\n // Create driver using the injected CreateDriver function\n const driver = this.createDriver(driverConfig);\n\n // Initialize driver\n await driver.initialize();\n\n // Create AgentEngine with custom Source and Presenter\n // Source: no-op (Runtime pushes events directly via handleStreamEvent)\n // Presenter: emits message/state/turn events to EventBus + persists messages\n const noopSource: AgentSource = {\n name: \"RuntimeSource\",\n connect: () => {},\n disconnect: () => {},\n };\n\n const sessionId = imageRecord.sessionId;\n const sessionRepository = this.platform.sessionRepository;\n const eventBus = this.platform.eventBus;\n\n const runtimePresenter: AgentPresenter = {\n name: \"RuntimePresenter\",\n present: (_agentId: string, output: AgentOutput) => {\n const category = categorizeAgentOutput(output.type);\n\n // Skip stream events — already emitted by handleDriverEvent\n if (category === \"stream\") return;\n\n // Emit state/message/turn events to EventBus\n eventBus.emit({\n type: output.type,\n timestamp: output.timestamp,\n source: \"agent\",\n category,\n intent: \"notification\",\n data: output.data,\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId,\n },\n } as BusEvent);\n\n // Persist message events to SessionRepository\n if (category === \"message\" && output.type !== \"user_message\") {\n const message = output.data as Message;\n sessionRepository.addMessage(sessionId, message).catch((err) => {\n logger.error(\"Failed to persist message\", { type: output.type, error: err });\n });\n }\n },\n };\n\n const engine = createAgentEngine({\n agentId,\n bus: this.platform.eventBus,\n source: noopSource,\n presenter: runtimePresenter,\n });\n\n // Create runtime agent\n const agent: RuntimeAgent = {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n name: imageRecord.name,\n lifecycle: \"running\",\n createdAt: Date.now(),\n };\n\n // Store agent state with driver and engine\n const state: AgentState = {\n agent,\n lifecycle: \"running\",\n subscriptions: new Set(),\n driver,\n engine,\n isReceiving: false,\n };\n this.agents.set(agentId, state);\n\n // Emit agent_created event\n this.platform.eventBus.emit({\n type: \"agent_created\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n },\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent created\", {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n });\n\n return agent;\n }\n\n getAgent(agentId: string): RuntimeAgent | undefined {\n const state = this.agents.get(agentId);\n return state?.agent;\n }\n\n getAgents(): RuntimeAgent[] {\n return Array.from(this.agents.values()).map((s) => s.agent);\n }\n\n getAgentsByContainer(containerId: string): RuntimeAgent[] {\n return Array.from(this.agents.values())\n .filter((s) => s.agent.containerId === containerId)\n .map((s) => s.agent);\n }\n\n async stopAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Agent already destroyed: ${agentId}`);\n }\n\n state.lifecycle = \"stopped\";\n\n // Emit agent_stopped event\n this.platform.eventBus.emit({\n type: \"agent_stopped\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent stopped\", { agentId });\n }\n\n async resumeAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Cannot resume destroyed agent: ${agentId}`);\n }\n\n state.lifecycle = \"running\";\n\n // Emit agent_resumed event\n this.platform.eventBus.emit({\n type: \"agent_resumed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent resumed\", { agentId });\n }\n\n async destroyAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Dispose driver and engine\n await state.driver.dispose();\n await state.engine.destroy();\n\n // Cleanup subscriptions\n for (const unsub of state.subscriptions) {\n unsub();\n }\n state.subscriptions.clear();\n\n state.lifecycle = \"destroyed\";\n\n // Emit agent_destroyed event\n this.platform.eventBus.emit({\n type: \"agent_destroyed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n // Remove from map\n this.agents.delete(agentId);\n\n logger.info(\"Agent destroyed\", { agentId });\n }\n\n // ==================== Message Handling ====================\n\n async receive(\n agentId: string,\n content: string | UserContentPart[],\n requestId?: string\n ): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);\n }\n\n if (state.isReceiving) {\n throw new Error(`Agent ${agentId} is already processing a message`);\n }\n\n const actualRequestId = requestId ?? this.generateRequestId();\n\n // Build user message\n const userMessage: UserMessage = {\n id: this.generateMessageId(),\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // Persist to session\n await this.platform.sessionRepository.addMessage(state.agent.sessionId, userMessage);\n\n // Emit user_message event (for external subscribers)\n this.emitEvent(state, \"user_message\", userMessage, actualRequestId);\n\n logger.debug(\"User message sent\", {\n agentId,\n requestId: actualRequestId,\n contentPreview:\n typeof content === \"string\"\n ? content.substring(0, 50)\n : Array.isArray(content)\n ? `[${content.length} parts]`\n : `[${typeof content}]`,\n });\n\n // Mark as receiving\n state.isReceiving = true;\n\n try {\n // Call driver.receive() and process the AsyncIterable\n for await (const event of state.driver.receive(userMessage)) {\n // Convert DriverStreamEvent to BusEvent and emit\n this.handleDriverEvent(state, event, actualRequestId);\n }\n } catch (error) {\n // Emit error event\n this.emitEvent(\n state,\n \"error_received\",\n {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n },\n actualRequestId\n );\n throw error;\n } finally {\n state.isReceiving = false;\n }\n }\n\n interrupt(agentId: string, requestId?: string): void {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Call driver.interrupt() directly\n state.driver.interrupt();\n\n // Emit interrupt event (for external subscribers)\n this.emitEvent(state, \"interrupt\", { agentId }, requestId ?? this.generateRequestId());\n\n logger.debug(\"Interrupt sent\", { agentId, requestId });\n }\n\n // ==================== Event Subscription ====================\n\n subscribe(agentId: string, handler: AgentEventHandler): Subscription {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n const unsub = this.platform.eventBus.onAny((event) => {\n const context = (event as BusEvent & { context?: { agentId?: string } }).context;\n if (context?.agentId === agentId) {\n handler(event);\n }\n });\n\n state.subscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n state.subscriptions.delete(unsub);\n },\n };\n }\n\n subscribeAll(handler: AgentEventHandler): Subscription {\n const unsub = this.platform.eventBus.onAny(handler);\n this.globalSubscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n this.globalSubscriptions.delete(unsub);\n },\n };\n }\n\n // ==================== Cleanup ====================\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n\n logger.info(\"Shutting down AgentXRuntime...\");\n\n // Destroy all agents\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n\n // Cleanup global subscriptions\n for (const unsub of this.globalSubscriptions) {\n unsub();\n }\n this.globalSubscriptions.clear();\n\n this.isShutdown = true;\n logger.info(\"AgentXRuntime shutdown complete\");\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Handle a single DriverStreamEvent\n */\n private handleDriverEvent(state: AgentState, event: DriverStreamEvent, requestId: string): void {\n // 1. Emit raw stream event to EventBus (for Presentation and other subscribers)\n this.emitEvent(state, event.type, event.data, requestId);\n\n // 2. Push to AgentEngine for MealyMachine processing\n // Engine produces message/state/turn events via Presenter\n const streamEvent = toStreamEvent(event);\n state.engine.handleStreamEvent(streamEvent);\n }\n\n /**\n * Emit an event to the EventBus\n */\n private emitEvent(state: AgentState, type: string, data: unknown, requestId: string): void {\n this.platform.eventBus.emit({\n type,\n timestamp: Date.now(),\n source: \"runtime\",\n category: this.categorizeEvent(type),\n intent: \"notification\",\n requestId,\n data,\n context: {\n agentId: state.agent.agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n }\n\n /**\n * Categorize event type\n */\n private categorizeEvent(type: string): string {\n if (type.includes(\"message\")) return \"message\";\n if (type.includes(\"tool\")) return \"tool\";\n if (type.includes(\"error\") || type.includes(\"interrupted\")) return \"error\";\n if (type.includes(\"delta\")) return \"stream\";\n return \"stream\";\n }\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 private generateRequestId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `req_${timestamp}_${random}`;\n }\n\n private generateMessageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `msg_${timestamp}_${random}`;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert DriverStreamEvent to agent-layer StreamEvent.\n * Data structures are identical; only \"error\" type needs renaming.\n */\nfunction toStreamEvent(event: DriverStreamEvent): StreamEvent {\n const type = event.type === \"error\" ? \"error_received\" : event.type;\n return { type, data: event.data, timestamp: Date.now() } as StreamEvent;\n}\n\n/**\n * Categorize AgentOutput type for EventBus emission.\n */\nfunction categorizeAgentOutput(type: string): string {\n // Stream layer — already emitted by handleDriverEvent\n const streamTypes = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_delta\",\n \"tool_use_start\",\n \"input_json_delta\",\n \"tool_use_stop\",\n \"tool_result\",\n \"error_received\",\n ];\n if (streamTypes.includes(type)) return \"stream\";\n\n // Message layer\n if (type.endsWith(\"_message\")) return \"message\";\n\n // Turn layer\n if (type.startsWith(\"turn_\")) return \"turn\";\n\n // State layer (default)\n return \"state\";\n}\n\n/**\n * Create an AgentXRuntime instance\n *\n * @param platform - AgentXPlatform with repositories and event bus\n * @param createDriver - Factory function for creating Driver instances per Agent\n */\nexport function createAgentXRuntime(\n platform: AgentXPlatform,\n createDriver: CreateDriver\n): AgentXRuntime {\n return new AgentXRuntimeImpl(platform, createDriver);\n}\n"],"mappings":"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","names":[]}
|
package/dist/session/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { M as Message } from '../message-Dn-I2vr0.js';
|
|
2
|
+
import { S as SessionConfig, a as Session } from '../index--gxNpY5W.js';
|
|
3
|
+
export { b as SessionRecord, c as SessionRepository } from '../index--gxNpY5W.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Session - Manages conversation messages
|
package/package.json
CHANGED
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
* - Notify state change subscribers
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { createLogger } from "commonxjs/logger";
|
|
16
17
|
import type {
|
|
18
|
+
AgentOutput,
|
|
17
19
|
AgentState,
|
|
18
20
|
StateChange,
|
|
19
21
|
StateChangeHandler,
|
|
20
|
-
AgentOutput,
|
|
21
22
|
Unsubscribe,
|
|
22
23
|
} from "./types";
|
|
23
24
|
import { isStateEvent } from "./types";
|
|
24
|
-
import { createLogger } from "commonxjs/logger";
|
|
25
25
|
|
|
26
26
|
const logger = createLogger("agent/AgentStateMachine");
|
|
27
27
|
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* driven by StateEvents from the MealyMachine.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
9
9
|
import { AgentStateMachine } from "../AgentStateMachine";
|
|
10
|
-
import type { AgentState, StateChange
|
|
10
|
+
import type { AgentOutput, AgentState, StateChange } from "../types";
|
|
11
11
|
|
|
12
12
|
// Helper to create test events
|
|
13
13
|
function createStateEvent(type: string, data: unknown = {}): AgentOutput {
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* Uses MockEventBus to simulate Driver behavior.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
9
9
|
import { createAgent } from "../createAgent";
|
|
10
10
|
import type {
|
|
11
11
|
AgentEventBus,
|
|
12
|
-
UserMessage,
|
|
13
|
-
StreamEvent,
|
|
14
12
|
AgentOutput,
|
|
15
13
|
CreateAgentOptions,
|
|
14
|
+
StreamEvent,
|
|
15
|
+
UserMessage,
|
|
16
16
|
} from "../types";
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -484,7 +484,7 @@ describe("createAgent", () => {
|
|
|
484
484
|
agent.use(async (message, next) => {
|
|
485
485
|
const modified: UserMessage = {
|
|
486
486
|
...message,
|
|
487
|
-
content: message.content
|
|
487
|
+
content: `${message.content} MODIFIED`,
|
|
488
488
|
};
|
|
489
489
|
await next(modified);
|
|
490
490
|
});
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* from Stream Layer events.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
9
9
|
import {
|
|
10
|
-
messageAssemblerProcessor,
|
|
11
10
|
createInitialMessageAssemblerState,
|
|
12
|
-
type MessageAssemblerState,
|
|
13
11
|
type MessageAssemblerInput,
|
|
14
12
|
type MessageAssemblerOutput,
|
|
13
|
+
type MessageAssemblerState,
|
|
14
|
+
messageAssemblerProcessor,
|
|
15
15
|
} from "../../../engine/internal/messageAssemblerProcessor";
|
|
16
16
|
|
|
17
17
|
// Helper to create test events
|
|
@@ -251,7 +251,7 @@ describe("messageAssemblerProcessor", () => {
|
|
|
251
251
|
expect(newState.pendingContents[0].parsedInput).toEqual({ x: 10, y: 20 });
|
|
252
252
|
|
|
253
253
|
// Should add to pending tool calls
|
|
254
|
-
expect(newState.pendingToolCalls
|
|
254
|
+
expect(newState.pendingToolCalls.tool_123).toEqual({
|
|
255
255
|
id: "tool_123",
|
|
256
256
|
name: "calculate",
|
|
257
257
|
});
|
|
@@ -289,7 +289,7 @@ describe("messageAssemblerProcessor", () => {
|
|
|
289
289
|
describe("tool_result event", () => {
|
|
290
290
|
it("should emit tool_result_message event", () => {
|
|
291
291
|
// Setup: pending tool call
|
|
292
|
-
state.pendingToolCalls
|
|
292
|
+
state.pendingToolCalls.tool_123 = {
|
|
293
293
|
id: "tool_123",
|
|
294
294
|
name: "calculate",
|
|
295
295
|
};
|
|
@@ -315,11 +315,11 @@ describe("messageAssemblerProcessor", () => {
|
|
|
315
315
|
expect(toolResultMessage.toolResult.output.value).toBe("42");
|
|
316
316
|
|
|
317
317
|
// Should remove from pending tool calls
|
|
318
|
-
expect(newState.pendingToolCalls
|
|
318
|
+
expect(newState.pendingToolCalls.tool_123).toBeUndefined();
|
|
319
319
|
});
|
|
320
320
|
|
|
321
321
|
it("should handle error results", () => {
|
|
322
|
-
state.pendingToolCalls
|
|
322
|
+
state.pendingToolCalls.tool_123 = {
|
|
323
323
|
id: "tool_123",
|
|
324
324
|
name: "test",
|
|
325
325
|
};
|
|
@@ -410,7 +410,7 @@ describe("messageAssemblerProcessor", () => {
|
|
|
410
410
|
|
|
411
411
|
it("should preserve pending tool calls when stopReason is tool_use", () => {
|
|
412
412
|
state.currentMessageId = "msg_123";
|
|
413
|
-
state.pendingToolCalls
|
|
413
|
+
state.pendingToolCalls.tool_123 = { id: "tool_123", name: "test" };
|
|
414
414
|
state.pendingContents = [
|
|
415
415
|
{
|
|
416
416
|
type: "tool_use",
|
|
@@ -434,12 +434,12 @@ describe("messageAssemblerProcessor", () => {
|
|
|
434
434
|
expect(content[0].type).toBe("tool-call");
|
|
435
435
|
expect(content[0].id).toBe("tool_123");
|
|
436
436
|
|
|
437
|
-
expect(newState.pendingToolCalls
|
|
437
|
+
expect(newState.pendingToolCalls.tool_123).toBeDefined();
|
|
438
438
|
});
|
|
439
439
|
|
|
440
440
|
it("should clear pending tool calls for non-tool_use stop reason", () => {
|
|
441
441
|
state.currentMessageId = "msg_123";
|
|
442
|
-
state.pendingToolCalls
|
|
442
|
+
state.pendingToolCalls.tool_123 = { id: "tool_123", name: "test" };
|
|
443
443
|
state.pendingContents = [
|
|
444
444
|
{
|
|
445
445
|
type: "text",
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
* Tests the stateless event transformer: Stream Events -> State Events
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
8
8
|
import {
|
|
9
|
-
stateEventProcessor,
|
|
10
9
|
createInitialStateEventProcessorContext,
|
|
11
10
|
type StateEventProcessorContext,
|
|
12
11
|
type StateEventProcessorInput,
|
|
13
12
|
type StateEventProcessorOutput,
|
|
13
|
+
stateEventProcessor,
|
|
14
14
|
} from "../../../engine/internal/stateEventProcessor";
|
|
15
15
|
|
|
16
16
|
// Helper to create test events
|
|
@@ -67,7 +67,7 @@ describe("stateEventProcessor", () => {
|
|
|
67
67
|
it("should emit conversation_end for end_turn stop reason", () => {
|
|
68
68
|
const event = createStreamEvent("message_stop", { stopReason: "end_turn" });
|
|
69
69
|
|
|
70
|
-
const [
|
|
70
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
71
71
|
|
|
72
72
|
expect(outputs).toHaveLength(1);
|
|
73
73
|
expect(outputs[0].type).toBe("conversation_end");
|
|
@@ -106,7 +106,7 @@ describe("stateEventProcessor", () => {
|
|
|
106
106
|
it("should emit conversation_responding event", () => {
|
|
107
107
|
const event = createStreamEvent("text_delta", { text: "Hello" });
|
|
108
108
|
|
|
109
|
-
const [
|
|
109
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
110
110
|
|
|
111
111
|
expect(outputs).toHaveLength(1);
|
|
112
112
|
expect(outputs[0].type).toBe("conversation_responding");
|
|
@@ -122,7 +122,7 @@ describe("stateEventProcessor", () => {
|
|
|
122
122
|
toolName: "search",
|
|
123
123
|
});
|
|
124
124
|
|
|
125
|
-
const [
|
|
125
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
126
126
|
|
|
127
127
|
expect(outputs).toHaveLength(2);
|
|
128
128
|
|
|
@@ -157,7 +157,7 @@ describe("stateEventProcessor", () => {
|
|
|
157
157
|
errorCode: "rate_limit",
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
const [
|
|
160
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
161
161
|
|
|
162
162
|
expect(outputs).toHaveLength(1);
|
|
163
163
|
expect(outputs[0].type).toBe("error_occurred");
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* - message_stop → turn_response
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
11
11
|
import {
|
|
12
|
-
turnTrackerProcessor,
|
|
13
12
|
createInitialTurnTrackerState,
|
|
14
|
-
type TurnTrackerState,
|
|
15
13
|
type TurnTrackerInput,
|
|
16
14
|
type TurnTrackerOutput,
|
|
15
|
+
type TurnTrackerState,
|
|
16
|
+
turnTrackerProcessor,
|
|
17
17
|
} from "../../../engine/internal/turnTrackerProcessor";
|
|
18
18
|
|
|
19
19
|
// Helper to create test events
|
|
@@ -77,7 +77,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
77
77
|
const [state2] = turnTrackerProcessor(state1, createMessageStopEvent("end_turn"));
|
|
78
78
|
|
|
79
79
|
// Start new turn
|
|
80
|
-
const [
|
|
80
|
+
const [_state3, outputs3] = turnTrackerProcessor(state2, createMessageStartEvent("msg_2"));
|
|
81
81
|
|
|
82
82
|
expect(outputs1[0].data.turnId).not.toBe(outputs3[0].data.turnId);
|
|
83
83
|
});
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Mealy.test.ts - Unit tests for Mealy Machine runtime
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { MemoryStore } from "../../../engine/mealy/Store";
|
|
5
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
6
|
+
import { createMealy, Mealy, type MealyConfig } from "../../../engine/mealy/Mealy";
|
|
8
7
|
import type { Processor } from "../../../engine/mealy/Processor";
|
|
9
8
|
import type { Sink, SinkDefinition } from "../../../engine/mealy/Sink";
|
|
9
|
+
import { MemoryStore } from "../../../engine/mealy/Store";
|
|
10
10
|
|
|
11
11
|
// Test types
|
|
12
12
|
interface TestState {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Store.test.ts - Unit tests for MemoryStore
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
6
6
|
import { MemoryStore, type Store } from "../../../engine/mealy/Store";
|
|
7
7
|
|
|
8
8
|
describe("MemoryStore", () => {
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* combinators.test.ts - Unit tests for Mealy processor combinators
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe,
|
|
5
|
+
import { describe, expect, it } from "bun:test";
|
|
6
6
|
import {
|
|
7
|
-
combineProcessors,
|
|
8
|
-
combineInitialStates,
|
|
9
7
|
chainProcessors,
|
|
8
|
+
combineInitialStates,
|
|
9
|
+
combineProcessors,
|
|
10
10
|
filterProcessor,
|
|
11
|
+
identityProcessor,
|
|
11
12
|
mapOutput,
|
|
12
13
|
withLogging,
|
|
13
|
-
identityProcessor,
|
|
14
14
|
} from "../../../engine/mealy/combinators";
|
|
15
15
|
import type { Processor } from "../../../engine/mealy/Processor";
|
|
16
16
|
|
package/src/agent/createAgent.ts
CHANGED
|
@@ -21,29 +21,29 @@
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { createLogger } from "commonxjs/logger";
|
|
25
|
+
import { isDriveableEvent } from "../event";
|
|
26
|
+
import { AgentStateMachine } from "./AgentStateMachine";
|
|
27
|
+
import { MealyMachine } from "./engine/MealyMachine";
|
|
24
28
|
import type {
|
|
25
29
|
AgentEngine,
|
|
26
|
-
|
|
30
|
+
AgentEventBus,
|
|
31
|
+
AgentInterceptor,
|
|
32
|
+
AgentMiddleware,
|
|
33
|
+
AgentOutput,
|
|
27
34
|
AgentOutputCallback,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
AgentPresenter,
|
|
36
|
+
AgentSource,
|
|
37
|
+
AgentState,
|
|
38
|
+
CreateAgentOptions,
|
|
31
39
|
EventHandlerMap,
|
|
40
|
+
MessageQueue,
|
|
32
41
|
ReactHandlerMap,
|
|
33
|
-
|
|
34
|
-
CreateAgentOptions,
|
|
35
|
-
AgentSource,
|
|
36
|
-
AgentPresenter,
|
|
37
|
-
AgentEventBus,
|
|
42
|
+
StateChangeHandler,
|
|
38
43
|
StreamEvent,
|
|
39
44
|
Unsubscribe,
|
|
40
|
-
|
|
41
|
-
AgentInterceptor,
|
|
45
|
+
UserMessage,
|
|
42
46
|
} from "./types";
|
|
43
|
-
import { MealyMachine } from "./engine/MealyMachine";
|
|
44
|
-
import { AgentStateMachine } from "./AgentStateMachine";
|
|
45
|
-
import { createLogger } from "commonxjs/logger";
|
|
46
|
-
import { isDriveableEvent } from "../event";
|
|
47
47
|
|
|
48
48
|
const logger = createLogger("agent/AgentEngine");
|
|
49
49
|
|
|
@@ -5,24 +5,24 @@
|
|
|
5
5
|
* Composes MessageAssembler, StateMachine, and TurnTracker processors.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import type { AgentOutput } from "../types";
|
|
9
9
|
// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)
|
|
10
10
|
// They flow through the system but AgentProcessor doesn't need to import them directly
|
|
11
11
|
import {
|
|
12
|
-
messageAssemblerProcessor,
|
|
13
|
-
stateEventProcessor,
|
|
14
|
-
turnTrackerProcessor,
|
|
15
12
|
createInitialMessageAssemblerState,
|
|
16
13
|
createInitialStateEventProcessorContext,
|
|
17
14
|
createInitialTurnTrackerState,
|
|
15
|
+
type MessageAssemblerOutput,
|
|
18
16
|
type MessageAssemblerState,
|
|
17
|
+
messageAssemblerProcessor,
|
|
19
18
|
type StateEventProcessorContext,
|
|
20
|
-
type TurnTrackerState,
|
|
21
|
-
type MessageAssemblerOutput,
|
|
22
19
|
type StateEventProcessorOutput,
|
|
20
|
+
stateEventProcessor,
|
|
23
21
|
type TurnTrackerOutput,
|
|
22
|
+
type TurnTrackerState,
|
|
23
|
+
turnTrackerProcessor,
|
|
24
24
|
} from "./internal";
|
|
25
|
-
import type
|
|
25
|
+
import { combineInitialStates, combineProcessors, type Processor } from "./mealy";
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Combined state type for the full agent engine
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
|
+
import { createLogger } from "commonxjs/logger";
|
|
49
|
+
import type { AgentOutput, StreamEvent } from "../types";
|
|
48
50
|
import {
|
|
51
|
+
type AgentEngineState,
|
|
49
52
|
agentProcessor,
|
|
50
53
|
createInitialAgentEngineState,
|
|
51
|
-
type AgentEngineState,
|
|
52
54
|
} from "./AgentProcessor";
|
|
53
55
|
import { MemoryStore } from "./mealy";
|
|
54
|
-
import type { AgentOutput, StreamEvent } from "../types";
|
|
55
|
-
import { createLogger } from "commonxjs/logger";
|
|
56
56
|
|
|
57
57
|
const logger = createLogger("engine/MealyMachine");
|
|
58
58
|
|
|
@@ -6,30 +6,30 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export {
|
|
9
|
-
|
|
10
|
-
messageAssemblerProcessorDef,
|
|
9
|
+
createInitialMessageAssemblerState,
|
|
11
10
|
type MessageAssemblerInput,
|
|
12
11
|
type MessageAssemblerOutput,
|
|
13
12
|
type MessageAssemblerState,
|
|
13
|
+
messageAssemblerProcessor,
|
|
14
|
+
messageAssemblerProcessorDef,
|
|
14
15
|
type PendingContent,
|
|
15
|
-
createInitialMessageAssemblerState,
|
|
16
16
|
} from "./messageAssemblerProcessor";
|
|
17
17
|
|
|
18
18
|
export {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
createInitialStateEventProcessorContext,
|
|
20
|
+
type StateEventProcessorContext,
|
|
21
21
|
type StateEventProcessorInput,
|
|
22
22
|
type StateEventProcessorOutput,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
stateEventProcessor,
|
|
24
|
+
stateEventProcessorDef,
|
|
25
25
|
} from "./stateEventProcessor";
|
|
26
26
|
|
|
27
27
|
export {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
createInitialTurnTrackerState,
|
|
29
|
+
type PendingTurn,
|
|
30
30
|
type TurnTrackerInput,
|
|
31
31
|
type TurnTrackerOutput,
|
|
32
32
|
type TurnTrackerState,
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
turnTrackerProcessor,
|
|
34
|
+
turnTrackerProcessorDef,
|
|
35
35
|
} from "./turnTrackerProcessor";
|
|
@@ -18,29 +18,29 @@
|
|
|
18
18
|
* - tool_result_message (Message - tool execution result)
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import type { Processor, ProcessorDefinition } from "../mealy";
|
|
22
21
|
import type {
|
|
23
|
-
// Input: StreamEvent (from agent layer)
|
|
24
|
-
StreamEvent,
|
|
25
|
-
MessageStartEvent,
|
|
26
|
-
TextDeltaEvent,
|
|
27
|
-
ToolUseStartEvent,
|
|
28
|
-
InputJsonDeltaEvent,
|
|
29
|
-
ToolResultEvent,
|
|
30
|
-
MessageStopEvent,
|
|
31
|
-
// Output: Message events
|
|
32
|
-
AssistantMessageEvent,
|
|
33
|
-
ToolResultMessageEvent,
|
|
34
|
-
ErrorMessageEvent,
|
|
35
22
|
// Message types
|
|
36
23
|
AssistantMessage,
|
|
37
|
-
|
|
24
|
+
// Output: Message events
|
|
25
|
+
AssistantMessageEvent,
|
|
38
26
|
ErrorMessage,
|
|
27
|
+
ErrorMessageEvent,
|
|
28
|
+
InputJsonDeltaEvent,
|
|
29
|
+
MessageStartEvent,
|
|
30
|
+
MessageStopEvent,
|
|
31
|
+
// Input: StreamEvent (from agent layer)
|
|
32
|
+
StreamEvent,
|
|
33
|
+
TextDeltaEvent,
|
|
39
34
|
// Content parts
|
|
40
35
|
TextPart,
|
|
41
36
|
ToolCallPart,
|
|
37
|
+
ToolResultEvent,
|
|
38
|
+
ToolResultMessage,
|
|
39
|
+
ToolResultMessageEvent,
|
|
42
40
|
ToolResultPart,
|
|
41
|
+
ToolUseStartEvent,
|
|
43
42
|
} from "../../types";
|
|
43
|
+
import type { Processor, ProcessorDefinition } from "../mealy";
|
|
44
44
|
|
|
45
45
|
// ===== State Types =====
|
|
46
46
|
|