@agentxjs/core 1.9.5-dev → 1.9.6-dev

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.
Files changed (80) hide show
  1. package/dist/Processor-DT0N1qI6.d.ts +64 -0
  2. package/dist/agent/engine/internal/index.d.ts +223 -0
  3. package/dist/agent/engine/internal/index.js +24 -0
  4. package/dist/agent/engine/internal/index.js.map +1 -0
  5. package/dist/agent/engine/mealy/index.d.ts +157 -0
  6. package/dist/agent/engine/mealy/index.js +26 -0
  7. package/dist/agent/engine/mealy/index.js.map +1 -0
  8. package/dist/agent/index.d.ts +244 -0
  9. package/dist/agent/index.js +66 -0
  10. package/dist/agent/index.js.map +1 -0
  11. package/dist/agent/types/index.d.ts +322 -0
  12. package/dist/agent/types/index.js +12 -0
  13. package/dist/agent/types/index.js.map +1 -0
  14. package/dist/base-m40r3Qgu.d.ts +157 -0
  15. package/dist/bus-uF1DM2ox.d.ts +906 -0
  16. package/dist/chunk-7D4SUZUM.js +38 -0
  17. package/dist/chunk-7D4SUZUM.js.map +1 -0
  18. package/dist/chunk-7ZDX3O6I.js +173 -0
  19. package/dist/chunk-7ZDX3O6I.js.map +1 -0
  20. package/dist/chunk-AT5P47YA.js +543 -0
  21. package/dist/chunk-AT5P47YA.js.map +1 -0
  22. package/dist/chunk-E5FPOAPO.js +123 -0
  23. package/dist/chunk-E5FPOAPO.js.map +1 -0
  24. package/dist/chunk-EKHT54KN.js +272 -0
  25. package/dist/chunk-EKHT54KN.js.map +1 -0
  26. package/dist/chunk-I7GYR3MN.js +502 -0
  27. package/dist/chunk-I7GYR3MN.js.map +1 -0
  28. package/dist/chunk-K6WXQ2RW.js +38 -0
  29. package/dist/chunk-K6WXQ2RW.js.map +1 -0
  30. package/dist/chunk-RL3JRNXM.js +3 -0
  31. package/dist/chunk-RL3JRNXM.js.map +1 -0
  32. package/dist/combinators-nEa5dD0T.d.ts +271 -0
  33. package/dist/common/index.d.ts +1 -0
  34. package/dist/common/index.js +2 -0
  35. package/dist/common/index.js.map +1 -0
  36. package/dist/common/logger/index.d.ts +163 -0
  37. package/dist/common/logger/index.js +184 -0
  38. package/dist/common/logger/index.js.map +1 -0
  39. package/dist/container/index.d.ts +110 -0
  40. package/dist/container/index.js +127 -0
  41. package/dist/container/index.js.map +1 -0
  42. package/dist/driver/index.d.ts +266 -0
  43. package/dist/driver/index.js +1 -0
  44. package/dist/driver/index.js.map +1 -0
  45. package/dist/event/index.d.ts +55 -0
  46. package/dist/event/index.js +60 -0
  47. package/dist/event/index.js.map +1 -0
  48. package/dist/event/types/index.d.ts +1149 -0
  49. package/dist/event/types/index.js +56 -0
  50. package/dist/event/types/index.js.map +1 -0
  51. package/dist/event-CDuTzs__.d.ts +296 -0
  52. package/dist/image/index.d.ts +112 -0
  53. package/dist/image/index.js +151 -0
  54. package/dist/image/index.js.map +1 -0
  55. package/dist/index.d.ts +8 -0
  56. package/dist/index.js +67 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/message-BMrMm1pq.d.ts +305 -0
  59. package/dist/mq/index.d.ts +165 -0
  60. package/dist/mq/index.js +37 -0
  61. package/dist/mq/index.js.map +1 -0
  62. package/dist/network/index.d.ts +567 -0
  63. package/dist/network/index.js +435 -0
  64. package/dist/network/index.js.map +1 -0
  65. package/dist/persistence/index.d.ts +155 -0
  66. package/dist/persistence/index.js +1 -0
  67. package/dist/persistence/index.js.map +1 -0
  68. package/dist/runtime/index.d.ts +240 -0
  69. package/dist/runtime/index.js +347 -0
  70. package/dist/runtime/index.js.map +1 -0
  71. package/dist/session/index.d.ts +92 -0
  72. package/dist/session/index.js +56 -0
  73. package/dist/session/index.js.map +1 -0
  74. package/dist/workspace/index.d.ts +111 -0
  75. package/dist/workspace/index.js +1 -0
  76. package/dist/workspace/index.js.map +1 -0
  77. package/dist/wrapper-Y3UTVU2E.js +3635 -0
  78. package/dist/wrapper-Y3UTVU2E.js.map +1 -0
  79. package/package.json +73 -14
  80. package/tsconfig.json +0 -10
@@ -0,0 +1,123 @@
1
+ // src/event/types/base.ts
2
+ function isFromSource(event, source) {
3
+ return event.source === source;
4
+ }
5
+ function hasIntent(event, intent) {
6
+ return event.intent === intent;
7
+ }
8
+ function isRequest(event) {
9
+ return event.intent === "request";
10
+ }
11
+ function isResult(event) {
12
+ return event.intent === "result";
13
+ }
14
+ function isNotification(event) {
15
+ return event.intent === "notification";
16
+ }
17
+
18
+ // src/event/types/driver.ts
19
+ function isStopReason(value) {
20
+ return [
21
+ "end_turn",
22
+ "max_tokens",
23
+ "tool_use",
24
+ "stop_sequence",
25
+ "content_filter",
26
+ "error",
27
+ "other"
28
+ ].includes(value);
29
+ }
30
+ function isDriveableEvent(event) {
31
+ return event.source === "driver" && event.category === "stream";
32
+ }
33
+ function isConnectionEvent(event) {
34
+ return event.source === "driver" && event.category === "connection";
35
+ }
36
+
37
+ // src/event/types/agent.ts
38
+ function isAgentStreamEvent(event) {
39
+ return event.source === "agent" && event.category === "stream";
40
+ }
41
+ function isAgentStateEvent(event) {
42
+ return event.source === "agent" && event.category === "state";
43
+ }
44
+ function isAgentMessageEvent(event) {
45
+ return event.source === "agent" && event.category === "message";
46
+ }
47
+ function isAgentTurnEvent(event) {
48
+ return event.source === "agent" && event.category === "turn";
49
+ }
50
+ function isAgentEvent(event) {
51
+ return event.source === "agent";
52
+ }
53
+
54
+ // src/event/types/session.ts
55
+ function isSessionLifecycleEvent(event) {
56
+ return event.source === "session" && event.category === "lifecycle";
57
+ }
58
+ function isSessionPersistEvent(event) {
59
+ return event.source === "session" && event.category === "persist";
60
+ }
61
+ function isSessionActionEvent(event) {
62
+ return event.source === "session" && event.category === "action";
63
+ }
64
+ function isSessionEvent(event) {
65
+ return event.source === "session";
66
+ }
67
+
68
+ // src/event/types/container.ts
69
+ function isContainerLifecycleEvent(event) {
70
+ return event.source === "container" && event.category === "lifecycle";
71
+ }
72
+ function isWorkdirEvent(event) {
73
+ return event.source === "sandbox" && event.category === "workdir";
74
+ }
75
+ function isMCPEvent(event) {
76
+ return event.source === "sandbox" && event.category === "mcp";
77
+ }
78
+ function isSandboxEvent(event) {
79
+ return event.source === "sandbox";
80
+ }
81
+ function isContainerEvent(event) {
82
+ return event.source === "container" || event.source === "sandbox";
83
+ }
84
+
85
+ // src/event/types/command.ts
86
+ function isCommandEvent(event) {
87
+ return event.source === "command";
88
+ }
89
+ function isCommandRequest(event) {
90
+ return event.source === "command" && event.category === "request";
91
+ }
92
+ function isCommandResponse(event) {
93
+ return event.source === "command" && event.category === "response";
94
+ }
95
+
96
+ export {
97
+ isFromSource,
98
+ hasIntent,
99
+ isRequest,
100
+ isResult,
101
+ isNotification,
102
+ isStopReason,
103
+ isDriveableEvent,
104
+ isConnectionEvent,
105
+ isAgentStreamEvent,
106
+ isAgentStateEvent,
107
+ isAgentMessageEvent,
108
+ isAgentTurnEvent,
109
+ isAgentEvent,
110
+ isSessionLifecycleEvent,
111
+ isSessionPersistEvent,
112
+ isSessionActionEvent,
113
+ isSessionEvent,
114
+ isContainerLifecycleEvent,
115
+ isWorkdirEvent,
116
+ isMCPEvent,
117
+ isSandboxEvent,
118
+ isContainerEvent,
119
+ isCommandEvent,
120
+ isCommandRequest,
121
+ isCommandResponse
122
+ };
123
+ //# sourceMappingURL=chunk-E5FPOAPO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event/types/base.ts","../src/event/types/driver.ts","../src/event/types/agent.ts","../src/event/types/session.ts","../src/event/types/container.ts","../src/event/types/command.ts"],"sourcesContent":["/**\n * Base Event Types - SystemEvent, EventSource, EventIntent, EventCategory, EventContext\n *\n * Foundation types for the event system.\n */\n\n// ============================================================================\n// SECTION 1: Legacy BusEvent Types (for backward compatibility)\n// ============================================================================\n\n/**\n * BusEvent - Base event type for EventBus\n *\n * All events flowing through the EventBus must conform to this structure.\n * This is a minimal event type that can be extended for specific use cases.\n *\n * @deprecated Use SystemEvent instead for full event system support\n */\nexport interface BusEvent<T extends string = string, D = unknown> {\n /**\n * Event type identifier (e.g., \"text_delta\", \"assistant_message\")\n */\n readonly type: T;\n\n /**\n * Event timestamp (Unix milliseconds)\n */\n readonly timestamp: number;\n\n /**\n * Event payload data\n */\n readonly data: D;\n\n /**\n * Event source (optional, for routing/filtering)\n */\n readonly source?: string;\n\n /**\n * Event category (optional, for classification)\n */\n readonly category?: string;\n\n /**\n * Event intent (optional, for command pattern)\n */\n readonly intent?: string;\n}\n\n// ============================================================================\n// SECTION 2: Base Types (SystemEvent, EventSource, EventIntent, EventCategory)\n// ============================================================================\n\n/**\n * Event source - where the event originated\n */\nexport type EventSource =\n | \"driver\" // LLM Driver (Claude API, etc.)\n | \"agent\" // Agent internal\n | \"session\" // Session operations\n | \"container\" // Container operations\n | \"sandbox\" // Sandbox resources (Workspace, MCP)\n | \"command\"; // Command request/response (API operations)\n\n/**\n * Event intent - what the event represents\n */\nexport type EventIntent =\n | \"request\" // Request to perform action (may be forwarded or executed)\n | \"result\" // Result of completed action\n | \"notification\"; // State change notification (no action needed)\n\n/**\n * Event category - fine-grained classification within source\n */\nexport type EventCategory =\n // Environment categories\n | \"stream\" // Streaming output from LLM\n | \"connection\" // Network connection status\n // Agent categories\n | \"state\" // State transitions\n | \"message\" // Complete messages\n | \"turn\" // Conversation turns\n | \"error\" // Errors\n // Session categories\n | \"lifecycle\" // Creation/destruction\n | \"persist\" // Persistence operations\n | \"action\" // User actions (resume, fork)\n // Sandbox categories\n | \"workdir\" // File operations\n | \"mcp\" // MCP tool operations\n // Command categories (API request/response)\n | \"request\" // Request to perform action\n | \"response\"; // Response with result\n\n/**\n * EventContext - Scope information attached to events\n */\nexport interface EventContext {\n /**\n * Container ID (isolation boundary)\n */\n containerId?: string;\n\n /**\n * Image ID (persistent conversation identity)\n */\n imageId?: string;\n\n /**\n * Agent ID (if event is agent-scoped)\n */\n agentId?: string;\n\n /**\n * Session ID (if event is session-scoped)\n */\n sessionId?: string;\n\n /**\n * Turn ID (for correlating events within a single turn)\n * A turn = one user message + assistant response cycle\n */\n turnId?: string;\n\n /**\n * Correlation ID (for request-response tracking)\n */\n correlationId?: string;\n}\n\n/**\n * SystemEvent - Base interface for ALL events in the system\n *\n * Every event has:\n * - type: What happened (e.g., \"text_delta\", \"session_saved\")\n * - timestamp: When it happened\n * - data: Event payload\n * - source: Where it came from\n * - category: What kind of event\n * - intent: What it means (notification/request/result)\n * - context: Optional scope information\n * - broadcastable: Whether to broadcast to external clients (default: true)\n */\nexport interface SystemEvent<\n T extends string = string,\n D = unknown,\n S extends EventSource = EventSource,\n C extends EventCategory = EventCategory,\n I extends EventIntent = EventIntent,\n> {\n /**\n * Event type identifier (e.g., \"text_delta\", \"session_saved\")\n */\n readonly type: T;\n\n /**\n * Event timestamp (Unix milliseconds)\n */\n readonly timestamp: number;\n\n /**\n * Event payload data\n */\n readonly data: D;\n\n /**\n * Event source - where the event originated\n */\n readonly source: S;\n\n /**\n * Event category - fine-grained classification\n */\n readonly category: C;\n\n /**\n * Event intent - what the event represents\n */\n readonly intent: I;\n\n /**\n * Event context - scope information (optional)\n */\n readonly context?: EventContext;\n\n /**\n * Whether to broadcast this event to external clients (SSE/WebSocket)\n *\n * - true or undefined: Broadcast to all external clients\n * - false: Only consumed internally, not broadcast\n *\n * Used for internal events like DriveableEvent that should be\n * processed by the engine but not sent directly to clients.\n * @default true\n */\n readonly broadcastable?: boolean;\n}\n\n// Type Guards for SystemEvent\n/**\n * Check if event is from a specific source\n */\nexport function isFromSource<S extends EventSource>(\n event: SystemEvent,\n source: S\n): event is SystemEvent<string, unknown, S> {\n return event.source === source;\n}\n\n/**\n * Check if event has a specific intent\n */\nexport function hasIntent<I extends EventIntent>(\n event: SystemEvent,\n intent: I\n): event is SystemEvent<string, unknown, EventSource, EventCategory, I> {\n return event.intent === intent;\n}\n\n/**\n * Check if event is a request\n */\nexport function isRequest(event: SystemEvent): boolean {\n return event.intent === \"request\";\n}\n\n/**\n * Check if event is a result\n */\nexport function isResult(event: SystemEvent): boolean {\n return event.intent === \"result\";\n}\n\n/**\n * Check if event is a notification\n */\nexport function isNotification(event: SystemEvent): boolean {\n return event.intent === \"notification\";\n}\n","/**\n * Environment Events - External world events (LLM API, Network)\n *\n * DriveableEvent, ConnectionEvent, StopReason, ErrorEvent\n */\n\nimport type { SystemEvent } from \"./base\";\n\n// ============================================================================\n// Stop Reason\n// ============================================================================\n\n/**\n * Reason why the LLM stopped generating\n *\n * Based on common stop reasons across multiple LLM providers:\n * - Anthropic Claude: end_turn, max_tokens, tool_use, stop_sequence\n * - OpenAI: stop, length, tool_calls, content_filter\n * - Vercel AI SDK: stop, length, tool-calls, content-filter, error, other\n */\nexport type StopReason =\n /**\n * Natural completion - model decided to stop\n */\n | \"end_turn\"\n\n /**\n * Reached maximum token limit\n */\n | \"max_tokens\"\n\n /**\n * Model requested tool usage\n */\n | \"tool_use\"\n\n /**\n * Encountered a custom stop sequence\n */\n | \"stop_sequence\"\n\n /**\n * Content filter triggered\n */\n | \"content_filter\"\n\n /**\n * Error occurred during generation\n */\n | \"error\"\n\n /**\n * Other/unknown reason\n */\n | \"other\";\n\n/**\n * Type guard to check if a string is a valid StopReason\n */\nexport function isStopReason(value: string): value is StopReason {\n return [\n \"end_turn\",\n \"max_tokens\",\n \"tool_use\",\n \"stop_sequence\",\n \"content_filter\",\n \"error\",\n \"other\",\n ].includes(value);\n}\n\n// ============================================================================\n// Driveable Events (LLM Stream Events)\n// ============================================================================\n\n/**\n * Base interface for all LLM stream events (DriveableEvent)\n *\n * All DriveableEvents have:\n * - source: \"driver\" (from LLM Driver)\n * - category: \"stream\" (streaming output)\n * - intent: \"notification\" (informational, no action needed)\n * - requestId: correlation with the original request\n * - context: agent/image/session scope (inherited from SystemEvent)\n */\ninterface BaseStreamEvent<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"driver\",\n \"stream\",\n \"notification\"\n> {\n /**\n * Content block index (for multi-block responses)\n */\n index?: number;\n\n /**\n * Request ID for correlating events with the original message_send_request\n */\n requestId?: string;\n}\n\n// Message Lifecycle Events\n/**\n * MessageStartEvent - Emitted when streaming message begins\n */\nexport interface MessageStartEvent extends BaseStreamEvent<\n \"message_start\",\n {\n message: {\n id: string;\n model: string;\n };\n }\n> {}\n\n/**\n * MessageDeltaEvent - Emitted with message-level updates\n */\nexport interface MessageDeltaEvent extends BaseStreamEvent<\n \"message_delta\",\n {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n }\n> {}\n\n/**\n * MessageStopEvent - Emitted when streaming message completes\n */\nexport interface MessageStopEvent extends BaseStreamEvent<\n \"message_stop\",\n {\n stopReason?: StopReason;\n stopSequence?: string;\n }\n> {}\n\n// Text Content Block Events\n/**\n * TextContentBlockStartEvent - Text block started\n */\nexport interface TextContentBlockStartEvent extends BaseStreamEvent<\n \"text_content_block_start\",\n Record<string, never>\n> {\n index: number;\n}\n\n/**\n * TextDeltaEvent - Incremental text output\n */\nexport interface TextDeltaEvent extends BaseStreamEvent<\n \"text_delta\",\n {\n text: string;\n }\n> {}\n\n/**\n * TextContentBlockStopEvent - Text block completed\n */\nexport interface TextContentBlockStopEvent extends BaseStreamEvent<\n \"text_content_block_stop\",\n Record<string, never>\n> {\n index: number;\n}\n\n// Tool Use Content Block Events\n/**\n * ToolUseContentBlockStartEvent - Tool use block started\n */\nexport interface ToolUseContentBlockStartEvent extends BaseStreamEvent<\n \"tool_use_content_block_start\",\n {\n id: string;\n name: string;\n }\n> {\n index: number;\n}\n\n/**\n * InputJsonDeltaEvent - Incremental tool input JSON\n */\nexport interface InputJsonDeltaEvent extends BaseStreamEvent<\n \"input_json_delta\",\n {\n partialJson: string;\n }\n> {\n index: number;\n}\n\n/**\n * ToolUseContentBlockStopEvent - Tool use block completed\n */\nexport interface ToolUseContentBlockStopEvent extends BaseStreamEvent<\n \"tool_use_content_block_stop\",\n Record<string, never>\n> {\n index: number;\n}\n\n// Tool Execution Events\n/**\n * ToolCallEvent - Tool call ready for execution\n */\nexport interface ToolCallEvent extends BaseStreamEvent<\n \"tool_call\",\n {\n id: string;\n name: string;\n input: Record<string, unknown>;\n }\n> {}\n\n/**\n * ToolResultEvent - Tool execution result\n */\nexport interface ToolResultEvent extends BaseStreamEvent<\n \"tool_result\",\n {\n toolUseId: string;\n result: unknown;\n isError?: boolean;\n }\n> {}\n\n// Interrupt Event\n/**\n * InterruptedEvent - Stream interrupted\n */\nexport interface InterruptedEvent extends BaseStreamEvent<\n \"interrupted\",\n {\n reason: \"user_interrupt\" | \"timeout\" | \"error\" | \"system\";\n }\n> {}\n\n// Error Event (Environment)\n/**\n * ErrorReceivedEvent - Error received from environment (e.g., Claude API error)\n *\n * This event drives the MealyMachine to produce:\n * - error_occurred (StateEvent) -> state transitions to \"error\"\n * - error_message (MessageEvent) -> displayed in chat\n */\nexport interface ErrorReceivedEvent extends BaseStreamEvent<\n \"error_received\",\n {\n /** Error message (human-readable) */\n message: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\", \"overloaded_error\") */\n errorCode?: string;\n }\n> {}\n\n/**\n * DriveableEvent - All events that can drive Agent\n */\nexport type DriveableEvent =\n // Message lifecycle\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageStopEvent\n // Text content block\n | TextContentBlockStartEvent\n | TextDeltaEvent\n | TextContentBlockStopEvent\n // Tool use content block\n | ToolUseContentBlockStartEvent\n | InputJsonDeltaEvent\n | ToolUseContentBlockStopEvent\n // Tool execution\n | ToolCallEvent\n | ToolResultEvent\n // Interrupt\n | InterruptedEvent\n // Error\n | ErrorReceivedEvent;\n\n/**\n * DriveableEventType - String literal union of all driveable event types\n */\nexport type DriveableEventType = DriveableEvent[\"type\"];\n\n/**\n * Type guard: is this a DriveableEvent?\n */\nexport function isDriveableEvent(event: {\n source?: string;\n category?: string;\n}): event is DriveableEvent {\n return event.source === \"driver\" && event.category === \"stream\";\n}\n\n// ============================================================================\n// Connection Events (Network Status)\n// ============================================================================\n\n/**\n * Base interface for all connection events\n */\ninterface BaseConnectionEvent<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"driver\",\n \"connection\",\n \"notification\"\n> {}\n\n/**\n * ConnectedEvent - Connection established\n */\nexport interface ConnectedEvent extends BaseConnectionEvent<\n \"connected\",\n {\n url?: string;\n reconnectAttempt?: number;\n }\n> {}\n\n/**\n * DisconnectedEvent - Connection lost\n */\nexport interface DisconnectedEvent extends BaseConnectionEvent<\n \"disconnected\",\n {\n reason?: string;\n code?: number;\n willReconnect?: boolean;\n }\n> {}\n\n/**\n * ReconnectingEvent - Attempting to reconnect\n */\nexport interface ReconnectingEvent extends BaseConnectionEvent<\n \"reconnecting\",\n {\n attempt: number;\n maxAttempts?: number;\n delayMs: number;\n }\n> {}\n\n/**\n * ConnectionEvent - All network status events\n */\nexport type ConnectionEvent = ConnectedEvent | DisconnectedEvent | ReconnectingEvent;\n\n/**\n * ConnectionEventType - String literal union\n */\nexport type ConnectionEventType = ConnectionEvent[\"type\"];\n\n/**\n * Type guard: is this a ConnectionEvent?\n */\nexport function isConnectionEvent(event: {\n source?: string;\n category?: string;\n}): event is ConnectionEvent {\n return event.source === \"driver\" && event.category === \"connection\";\n}\n\n/**\n * EnvironmentEvent - Union of all environment events\n */\nexport type EnvironmentEvent = DriveableEvent | ConnectionEvent;\n\n// ============================================================================\n// Error Events (System-wide error notifications)\n// ============================================================================\n\n/**\n * SystemError - Generic error event\n *\n * Used for all errors until we create specific error types.\n * Can originate from any source (runtime, agent, container, etc.)\n *\n * @example\n * ```typescript\n * const error: SystemError = {\n * type: \"system_error\",\n * timestamp: Date.now(),\n * source: \"container\",\n * category: \"error\",\n * intent: \"notification\",\n * data: {\n * message: \"Container not found: default\",\n * requestId: \"req_123\",\n * severity: \"error\",\n * },\n * context: { containerId: \"default\" }\n * };\n * ```\n */\nexport interface SystemError extends SystemEvent<\n \"system_error\",\n {\n /**\n * Error message (human-readable)\n */\n message: string;\n\n /**\n * Associated request ID (if error is related to a request)\n */\n requestId?: string;\n\n /**\n * Error severity\n * - info: Informational, no action needed\n * - warn: Warning, operation succeeded but with issues\n * - error: Error, operation failed\n * - fatal: Fatal error, system unstable\n */\n severity?: \"info\" | \"warn\" | \"error\" | \"fatal\";\n\n /**\n * Additional error details (stack trace, error code, etc.)\n */\n details?: unknown;\n },\n \"agent\" | \"container\" | \"driver\" | \"session\" | \"sandbox\" | \"command\",\n \"error\",\n \"notification\"\n> {}\n\n/**\n * Error event map - will grow as we add specific error types\n */\nexport interface ErrorEventMap {\n system_error: SystemError;\n // Future: container_not_found_error, agent_creation_error, llm_api_error, etc.\n}\n\n/**\n * Error event types\n */\nexport type ErrorEventType = keyof ErrorEventMap;\n\n/**\n * Union of all error events\n */\nexport type ErrorEvent = ErrorEventMap[ErrorEventType];\n","/**\n * Agent Events - Events from Agent domain (stream/state/message/turn)\n *\n * Agent events for the EventBus system.\n */\n\nimport type {\n UserMessage,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n} from \"../../agent/types\";\nimport type { SystemEvent, EventContext } from \"./base\";\nimport type { StopReason } from \"./driver\";\n\n// ============================================================================\n// Agent Event Categories and Base Types\n// ============================================================================\n\n/**\n * Agent event categories\n */\nexport type AgentEventCategory = \"stream\" | \"state\" | \"message\" | \"turn\";\n\n/**\n * BaseAgentEvent - Base interface for all Agent events\n *\n * Extends SystemEvent with fixed source and intent.\n */\nexport interface BaseAgentEvent<\n T extends string,\n D,\n C extends AgentEventCategory,\n> extends SystemEvent<T, D, \"agent\", C, \"notification\"> {\n /**\n * Runtime context (optional, added by Presenter)\n */\n readonly context?: EventContext;\n}\n\n// ============================================================================\n// Agent Stream Events\n// ============================================================================\n\n/**\n * Base type for agent stream events\n */\nexport interface AgentStreamEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"stream\"> {}\n\n// Re-export StopReason for convenience (as AgentStopReason to avoid conflict)\nexport type AgentStopReason = StopReason;\n\n/**\n * AgentMessageStartEvent - Streaming message begins\n */\nexport interface AgentMessageStartEvent extends AgentStreamEventBase<\n \"message_start\",\n {\n messageId: string;\n model: string;\n }\n> {}\n\n/**\n * AgentMessageDeltaEvent - Message-level updates (usage info)\n */\nexport interface AgentMessageDeltaEvent extends AgentStreamEventBase<\n \"message_delta\",\n {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n }\n> {}\n\n/**\n * AgentMessageStopEvent - Streaming message completes\n */\nexport interface AgentMessageStopEvent extends AgentStreamEventBase<\n \"message_stop\",\n {\n stopReason?: StopReason;\n }\n> {}\n\n/**\n * AgentTextDeltaEvent - Incremental text output\n */\nexport interface AgentTextDeltaEvent extends AgentStreamEventBase<\n \"text_delta\",\n {\n text: string;\n }\n> {}\n\n/**\n * AgentToolUseStartEvent - Tool use block started\n */\nexport interface AgentToolUseStartEvent extends AgentStreamEventBase<\n \"tool_use_start\",\n {\n toolCallId: string;\n toolName: string;\n }\n> {}\n\n/**\n * AgentInputJsonDeltaEvent - Incremental tool input JSON\n */\nexport interface AgentInputJsonDeltaEvent extends AgentStreamEventBase<\n \"input_json_delta\",\n {\n partialJson: string;\n }\n> {}\n\n/**\n * AgentToolUseStopEvent - Tool use block completed\n */\nexport interface AgentToolUseStopEvent extends AgentStreamEventBase<\n \"tool_use_stop\",\n {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n> {}\n\n/**\n * AgentToolResultEvent - Tool execution result\n */\nexport interface AgentToolResultEvent extends AgentStreamEventBase<\n \"tool_result\",\n {\n toolCallId: string;\n result: unknown;\n isError?: boolean;\n }\n> {}\n\n/**\n * AgentErrorReceivedEvent - Error received from environment\n *\n * Processed by MealyMachine to produce:\n * - error_occurred (StateEvent)\n * - error_message (MessageEvent)\n */\nexport interface AgentErrorReceivedEvent extends AgentStreamEventBase<\n \"error_received\",\n {\n /** Error message (human-readable) */\n message: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\") */\n errorCode?: string;\n }\n> {}\n\n/**\n * AgentStreamEvent - All stream events\n */\nexport type AgentStreamEvent =\n | AgentMessageStartEvent\n | AgentMessageDeltaEvent\n | AgentMessageStopEvent\n | AgentTextDeltaEvent\n | AgentToolUseStartEvent\n | AgentInputJsonDeltaEvent\n | AgentToolUseStopEvent\n | AgentToolResultEvent\n | AgentErrorReceivedEvent;\n\n/**\n * AgentStreamEventType - String literal union\n */\nexport type AgentStreamEventType = AgentStreamEvent[\"type\"];\n\n/**\n * Type guard: is this a stream event?\n */\nexport function isAgentStreamEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStreamEvent {\n return event.source === \"agent\" && event.category === \"stream\";\n}\n\n// ============================================================================\n// Agent State Events\n// ============================================================================\n\n/**\n * Base type for state events\n */\nexport interface AgentStateEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"state\"> {}\n\n// Conversation Events\n/**\n * ConversationQueuedEvent - Message queued for processing\n */\nexport interface ConversationQueuedEvent extends AgentStateEventBase<\n \"conversation_queued\",\n {\n messageId: string;\n }\n> {}\n\n/**\n * ConversationStartEvent - Conversation started\n */\nexport interface ConversationStartEvent extends AgentStateEventBase<\n \"conversation_start\",\n {\n messageId: string;\n }\n> {}\n\n/**\n * ConversationThinkingEvent - Agent is thinking\n */\nexport interface ConversationThinkingEvent extends AgentStateEventBase<\n \"conversation_thinking\",\n Record<string, never>\n> {}\n\n/**\n * ConversationRespondingEvent - Agent is responding\n */\nexport interface ConversationRespondingEvent extends AgentStateEventBase<\n \"conversation_responding\",\n Record<string, never>\n> {}\n\n/**\n * ConversationEndEvent - Conversation ended\n */\nexport interface ConversationEndEvent extends AgentStateEventBase<\n \"conversation_end\",\n {\n reason: \"completed\" | \"interrupted\" | \"error\";\n }\n> {}\n\n/**\n * ConversationInterruptedEvent - Conversation interrupted\n */\nexport interface ConversationInterruptedEvent extends AgentStateEventBase<\n \"conversation_interrupted\",\n {\n reason: string;\n }\n> {}\n\n// Tool Events\n/**\n * ToolPlannedEvent - Tool use planned\n */\nexport interface ToolPlannedEvent extends AgentStateEventBase<\n \"tool_planned\",\n {\n toolId: string;\n toolName: string;\n }\n> {}\n\n/**\n * ToolExecutingEvent - Tool is executing\n */\nexport interface ToolExecutingEvent extends AgentStateEventBase<\n \"tool_executing\",\n {\n toolId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n> {}\n\n/**\n * ToolCompletedEvent - Tool execution completed\n */\nexport interface ToolCompletedEvent extends AgentStateEventBase<\n \"tool_completed\",\n {\n toolId: string;\n toolName: string;\n result: unknown;\n }\n> {}\n\n/**\n * ToolFailedEvent - Tool execution failed\n */\nexport interface ToolFailedEvent extends AgentStateEventBase<\n \"tool_failed\",\n {\n toolId: string;\n toolName: string;\n error: string;\n }\n> {}\n\n// Error Events (State)\n/**\n * ErrorOccurredEvent - Error occurred during processing\n */\nexport interface ErrorOccurredEvent extends AgentStateEventBase<\n \"error_occurred\",\n {\n code: string;\n message: string;\n recoverable: boolean;\n category?: string;\n }\n> {}\n\n/**\n * AgentStateEvent - All state events\n */\nexport type AgentStateEvent =\n // Conversation\n | ConversationQueuedEvent\n | ConversationStartEvent\n | ConversationThinkingEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n // Tool\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ToolCompletedEvent\n | ToolFailedEvent\n // Error\n | ErrorOccurredEvent;\n\n/**\n * AgentStateEventType - String literal union\n */\nexport type AgentStateEventType = AgentStateEvent[\"type\"];\n\n/**\n * Type guard: is this a state event?\n */\nexport function isAgentStateEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStateEvent {\n return event.source === \"agent\" && event.category === \"state\";\n}\n\n// ============================================================================\n// Agent Message Events\n// ============================================================================\n\n/**\n * Base type for message events\n */\nexport interface AgentMessageEventBase<T extends string, D> extends BaseAgentEvent<\n T,\n D,\n \"message\"\n> {}\n\n/**\n * UserMessageEvent - User sent a message\n * Data: Complete UserMessage object\n */\nexport interface UserMessageEvent extends AgentMessageEventBase<\"user_message\", UserMessage> {}\n\n/**\n * AssistantMessageEvent - Assistant response message\n * Data: Complete AssistantMessage object\n */\nexport interface AssistantMessageEvent extends AgentMessageEventBase<\n \"assistant_message\",\n AssistantMessage\n> {}\n\n/**\n * ToolCallMessageEvent - Tool call message (part of assistant turn)\n * Data: Complete ToolCallMessage object\n */\nexport interface ToolCallMessageEvent extends AgentMessageEventBase<\n \"tool_call_message\",\n ToolCallMessage\n> {}\n\n/**\n * ToolResultMessageEvent - Tool result message\n * Data: Complete ToolResultMessage object\n */\nexport interface ToolResultMessageEvent extends AgentMessageEventBase<\n \"tool_result_message\",\n ToolResultMessage\n> {}\n\n/**\n * ErrorMessageEvent - Error message displayed in chat\n * Data: Complete ErrorMessage object\n *\n * Generated when error_received StreamEvent is processed by MealyMachine.\n * Displayed in the chat history so users can see what went wrong.\n */\nexport interface ErrorMessageEvent extends AgentMessageEventBase<\"error_message\", ErrorMessage> {}\n\n/**\n * AgentMessageEvent - All message events\n */\nexport type AgentMessageEvent =\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * AgentMessageEventType - String literal union\n */\nexport type AgentMessageEventType = AgentMessageEvent[\"type\"];\n\n/**\n * Type guard: is this a message event?\n */\nexport function isAgentMessageEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentMessageEvent {\n return event.source === \"agent\" && event.category === \"message\";\n}\n\n// ============================================================================\n// Agent Turn Events\n// ============================================================================\n\n/**\n * Base type for turn events\n */\nexport interface AgentTurnEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"turn\"> {}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n}\n\n/**\n * TurnRequestEvent - Turn started (user message received)\n */\nexport interface TurnRequestEvent extends AgentTurnEventBase<\n \"turn_request\",\n {\n turnId: string;\n messageId: string;\n content: string;\n timestamp: number;\n }\n> {}\n\n/**\n * TurnResponseEvent - Turn completed (assistant response finished)\n */\nexport interface TurnResponseEvent extends AgentTurnEventBase<\n \"turn_response\",\n {\n turnId: string;\n messageId: string;\n duration: number;\n usage?: TokenUsage;\n model?: string;\n stopReason?: string;\n timestamp: number;\n }\n> {}\n\n/**\n * AgentTurnEvent - All turn events\n */\nexport type AgentTurnEvent = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * AgentTurnEventType - String literal union\n */\nexport type AgentTurnEventType = AgentTurnEvent[\"type\"];\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isAgentTurnEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentTurnEvent {\n return event.source === \"agent\" && event.category === \"turn\";\n}\n\n// ============================================================================\n// Agent Event Union\n// ============================================================================\n\n/**\n * AgentEvent - All events from Agent domain\n */\nexport type AgentEvent = AgentStreamEvent | AgentStateEvent | AgentMessageEvent | AgentTurnEvent;\n\n/**\n * Type guard: is this an agent event?\n */\nexport function isAgentEvent(event: { source?: string }): event is AgentEvent {\n return event.source === \"agent\";\n}\n","/**\n * Session Events - Session lifecycle, persist, and action events\n *\n * Events for session operations in the event system.\n */\n\nimport type { SystemEvent } from \"./base\";\n\n// ============================================================================\n// Session Lifecycle Events\n// ============================================================================\n\n/**\n * Base SessionLifecycleEvent\n */\ninterface BaseSessionLifecycleEvent<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"session\",\n \"lifecycle\",\n \"notification\"\n> {}\n\n/**\n * SessionCreatedEvent - Session was created\n */\nexport interface SessionCreatedEvent extends BaseSessionLifecycleEvent<\n \"session_created\",\n {\n sessionId: string;\n imageId: string;\n containerId: string;\n title?: string;\n createdAt: number;\n }\n> {}\n\n/**\n * SessionDestroyedEvent - Session was destroyed\n */\nexport interface SessionDestroyedEvent extends BaseSessionLifecycleEvent<\n \"session_destroyed\",\n {\n sessionId: string;\n reason?: string;\n }\n> {}\n\n/**\n * SessionLifecycleEvent - All session lifecycle events\n */\nexport type SessionLifecycleEvent = SessionCreatedEvent | SessionDestroyedEvent;\n\n/**\n * Type guard: is this a SessionLifecycleEvent?\n */\nexport function isSessionLifecycleEvent(event: {\n source?: string;\n category?: string;\n}): event is SessionLifecycleEvent {\n return event.source === \"session\" && event.category === \"lifecycle\";\n}\n\n// ============================================================================\n// Session Persist Events\n// ============================================================================\n\n/**\n * Base SessionPersistRequest\n */\ninterface BaseSessionPersistRequest<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"session\",\n \"persist\",\n \"request\"\n> {}\n\n/**\n * Base SessionPersistResult\n */\ninterface BaseSessionPersistResult<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"session\",\n \"persist\",\n \"result\"\n> {}\n\n/**\n * SessionSaveRequest - Request to save session\n */\nexport interface SessionSaveRequest extends BaseSessionPersistRequest<\n \"session_save_request\",\n {\n sessionId: string;\n title?: string;\n metadata?: Record<string, unknown>;\n }\n> {}\n\n/**\n * SessionSavedEvent - Session was saved\n */\nexport interface SessionSavedEvent extends BaseSessionPersistResult<\n \"session_saved\",\n {\n sessionId: string;\n savedAt: number;\n }\n> {}\n\n/**\n * MessagePersistRequest - Request to persist a message\n */\nexport interface MessagePersistRequest extends BaseSessionPersistRequest<\n \"message_persist_request\",\n {\n sessionId: string;\n messageId: string;\n role: \"user\" | \"assistant\" | \"tool_call\" | \"tool_result\";\n content: unknown;\n }\n> {}\n\n/**\n * MessagePersistedEvent - Message was persisted\n */\nexport interface MessagePersistedEvent extends BaseSessionPersistResult<\n \"message_persisted\",\n {\n sessionId: string;\n messageId: string;\n savedAt: number;\n }\n> {}\n\n/**\n * SessionPersistEvent - All session persist events\n */\nexport type SessionPersistEvent =\n | SessionSaveRequest\n | SessionSavedEvent\n | MessagePersistRequest\n | MessagePersistedEvent;\n\n/**\n * Session persist request events\n */\nexport type SessionPersistRequestEvent = SessionSaveRequest | MessagePersistRequest;\n\n/**\n * Session persist result events\n */\nexport type SessionPersistResultEvent = SessionSavedEvent | MessagePersistedEvent;\n\n/**\n * Type guard: is this a SessionPersistEvent?\n */\nexport function isSessionPersistEvent(event: {\n source?: string;\n category?: string;\n}): event is SessionPersistEvent {\n return event.source === \"session\" && event.category === \"persist\";\n}\n\n// ============================================================================\n// Session Action Events\n// ============================================================================\n\n/**\n * Base SessionActionRequest\n */\ninterface BaseSessionActionRequest<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"session\",\n \"action\",\n \"request\"\n> {}\n\n/**\n * Base SessionActionResult\n */\ninterface BaseSessionActionResult<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"session\",\n \"action\",\n \"result\"\n> {}\n\n/**\n * SessionResumeRequest - Request to resume a session\n */\nexport interface SessionResumeRequest extends BaseSessionActionRequest<\n \"session_resume_request\",\n {\n sessionId: string;\n containerId?: string;\n }\n> {}\n\n/**\n * SessionResumedEvent - Session was resumed\n */\nexport interface SessionResumedEvent extends BaseSessionActionResult<\n \"session_resumed\",\n {\n sessionId: string;\n agentId: string;\n resumedAt: number;\n }\n> {}\n\n/**\n * SessionForkRequest - Request to fork a session\n */\nexport interface SessionForkRequest extends BaseSessionActionRequest<\n \"session_fork_request\",\n {\n sessionId: string;\n newTitle?: string;\n }\n> {}\n\n/**\n * SessionForkedEvent - Session was forked\n */\nexport interface SessionForkedEvent extends BaseSessionActionResult<\n \"session_forked\",\n {\n originalSessionId: string;\n newSessionId: string;\n newImageId: string;\n forkedAt: number;\n }\n> {}\n\n/**\n * SessionTitleUpdateRequest - Request to update session title\n */\nexport interface SessionTitleUpdateRequest extends BaseSessionActionRequest<\n \"session_title_update_request\",\n {\n sessionId: string;\n title: string;\n }\n> {}\n\n/**\n * SessionTitleUpdatedEvent - Session title was updated\n */\nexport interface SessionTitleUpdatedEvent extends BaseSessionActionResult<\n \"session_title_updated\",\n {\n sessionId: string;\n title: string;\n updatedAt: number;\n }\n> {}\n\n/**\n * SessionActionEvent - All session action events\n */\nexport type SessionActionEvent =\n | SessionResumeRequest\n | SessionResumedEvent\n | SessionForkRequest\n | SessionForkedEvent\n | SessionTitleUpdateRequest\n | SessionTitleUpdatedEvent;\n\n/**\n * Session action request events\n */\nexport type SessionActionRequestEvent =\n | SessionResumeRequest\n | SessionForkRequest\n | SessionTitleUpdateRequest;\n\n/**\n * Session action result events\n */\nexport type SessionActionResultEvent =\n | SessionResumedEvent\n | SessionForkedEvent\n | SessionTitleUpdatedEvent;\n\n/**\n * Type guard: is this a SessionActionEvent?\n */\nexport function isSessionActionEvent(event: {\n source?: string;\n category?: string;\n}): event is SessionActionEvent {\n return event.source === \"session\" && event.category === \"action\";\n}\n\n// ============================================================================\n// Session Event Union\n// ============================================================================\n\n/**\n * SessionEvent - All session events\n */\nexport type SessionEvent = SessionLifecycleEvent | SessionPersistEvent | SessionActionEvent;\n\n/**\n * Type guard: is this a session event?\n */\nexport function isSessionEvent(event: { source?: string }): event is SessionEvent {\n return event.source === \"session\";\n}\n","/**\n * Container Events - Container lifecycle and sandbox events\n *\n * Events for container operations in the event system.\n */\n\nimport type { SystemEvent } from \"./base\";\n\n// ============================================================================\n// Container Lifecycle Events\n// ============================================================================\n\n/**\n * Base ContainerLifecycleEvent\n */\ninterface BaseContainerLifecycleEvent<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"container\",\n \"lifecycle\",\n \"notification\"\n> {}\n\n/**\n * ContainerCreatedEvent - Container was created\n */\nexport interface ContainerCreatedEvent extends BaseContainerLifecycleEvent<\n \"container_created\",\n {\n containerId: string;\n name?: string;\n createdAt: number;\n }\n> {}\n\n/**\n * ContainerDestroyedEvent - Container was destroyed\n */\nexport interface ContainerDestroyedEvent extends BaseContainerLifecycleEvent<\n \"container_destroyed\",\n {\n containerId: string;\n reason?: string;\n agentCount: number;\n }\n> {}\n\n/**\n * AgentRegisteredEvent - Agent was registered to container\n */\nexport interface AgentRegisteredEvent extends BaseContainerLifecycleEvent<\n \"agent_registered\",\n {\n containerId: string;\n agentId: string;\n definitionName: string;\n registeredAt: number;\n }\n> {}\n\n/**\n * AgentUnregisteredEvent - Agent was unregistered from container\n */\nexport interface AgentUnregisteredEvent extends BaseContainerLifecycleEvent<\n \"agent_unregistered\",\n {\n containerId: string;\n agentId: string;\n reason?: string;\n }\n> {}\n\n/**\n * ContainerLifecycleEvent - All container lifecycle events\n */\nexport type ContainerLifecycleEvent =\n | ContainerCreatedEvent\n | ContainerDestroyedEvent\n | AgentRegisteredEvent\n | AgentUnregisteredEvent;\n\n/**\n * Type guard: is this a ContainerLifecycleEvent?\n */\nexport function isContainerLifecycleEvent(event: {\n source?: string;\n category?: string;\n}): event is ContainerLifecycleEvent {\n return event.source === \"container\" && event.category === \"lifecycle\";\n}\n\n// ============================================================================\n// Sandbox Workdir Events\n// ============================================================================\n\n/**\n * Base WorkdirRequest\n */\ninterface BaseWorkdirRequest<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"workdir\",\n \"request\"\n> {}\n\n/**\n * Base WorkdirResult\n */\ninterface BaseWorkdirResult<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"workdir\",\n \"result\"\n> {}\n\n/**\n * Base WorkdirNotification\n */\ninterface BaseWorkdirNotification<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"workdir\",\n \"notification\"\n> {}\n\n/**\n * FileReadRequest - Request to read a file\n */\nexport interface FileReadRequest extends BaseWorkdirRequest<\n \"file_read_request\",\n {\n path: string;\n encoding?: string;\n }\n> {}\n\n/**\n * FileReadResult - File read result\n */\nexport interface FileReadResult extends BaseWorkdirResult<\n \"file_read_result\",\n {\n path: string;\n content: string;\n size: number;\n encoding: string;\n }\n> {}\n\n/**\n * FileWriteRequest - Request to write a file\n */\nexport interface FileWriteRequest extends BaseWorkdirRequest<\n \"file_write_request\",\n {\n path: string;\n content: string;\n encoding?: string;\n createDirectories?: boolean;\n }\n> {}\n\n/**\n * FileWrittenEvent - File was written\n */\nexport interface FileWrittenEvent extends BaseWorkdirResult<\n \"file_written\",\n {\n path: string;\n size: number;\n timestamp: number;\n }\n> {}\n\n/**\n * FileDeleteRequest - Request to delete a file\n */\nexport interface FileDeleteRequest extends BaseWorkdirRequest<\n \"file_delete_request\",\n {\n path: string;\n recursive?: boolean;\n }\n> {}\n\n/**\n * FileDeletedEvent - File was deleted\n */\nexport interface FileDeletedEvent extends BaseWorkdirResult<\n \"file_deleted\",\n {\n path: string;\n timestamp: number;\n }\n> {}\n\n/**\n * DirectoryListRequest - Request to list directory\n */\nexport interface DirectoryListRequest extends BaseWorkdirRequest<\n \"directory_list_request\",\n {\n path: string;\n recursive?: boolean;\n pattern?: string;\n }\n> {}\n\n/**\n * DirectoryListResult - Directory listing result\n */\nexport interface DirectoryListResult extends BaseWorkdirResult<\n \"directory_list_result\",\n {\n path: string;\n entries: Array<{\n name: string;\n type: \"file\" | \"directory\";\n size?: number;\n modifiedAt?: number;\n }>;\n }\n> {}\n\n/**\n * WorkdirErrorEvent - Workdir operation error\n */\nexport interface WorkdirErrorEvent extends BaseWorkdirNotification<\n \"workdir_error\",\n {\n operation: string;\n path: string;\n code: string;\n message: string;\n }\n> {}\n\n/**\n * WorkdirEvent - All workdir events\n */\nexport type WorkdirEvent =\n | FileReadRequest\n | FileReadResult\n | FileWriteRequest\n | FileWrittenEvent\n | FileDeleteRequest\n | FileDeletedEvent\n | DirectoryListRequest\n | DirectoryListResult\n | WorkdirErrorEvent;\n\n/**\n * Workdir request events\n */\nexport type WorkdirRequestEvent =\n | FileReadRequest\n | FileWriteRequest\n | FileDeleteRequest\n | DirectoryListRequest;\n\n/**\n * Workdir result events\n */\nexport type WorkdirResultEvent =\n | FileReadResult\n | FileWrittenEvent\n | FileDeletedEvent\n | DirectoryListResult;\n\n/**\n * Type guard: is this a WorkdirEvent?\n */\nexport function isWorkdirEvent(event: {\n source?: string;\n category?: string;\n}): event is WorkdirEvent {\n return event.source === \"sandbox\" && event.category === \"workdir\";\n}\n\n// ============================================================================\n// Sandbox MCP Events\n// ============================================================================\n\n/**\n * Base MCPRequest\n */\ninterface BaseMCPRequest<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"mcp\",\n \"request\"\n> {}\n\n/**\n * Base MCPResult\n */\ninterface BaseMCPResult<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"mcp\",\n \"result\"\n> {}\n\n/**\n * Base MCPNotification\n */\ninterface BaseMCPNotification<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"sandbox\",\n \"mcp\",\n \"notification\"\n> {}\n\n/**\n * ToolExecuteRequest - Request to execute a tool\n */\nexport interface ToolExecuteRequest extends BaseMCPRequest<\n \"tool_execute_request\",\n {\n toolId: string;\n toolName: string;\n serverName: string;\n input: Record<string, unknown>;\n timestamp: number;\n }\n> {}\n\n/**\n * ToolExecutedEvent - Tool execution completed\n */\nexport interface ToolExecutedEvent extends BaseMCPResult<\n \"tool_executed\",\n {\n toolId: string;\n toolName: string;\n result: unknown;\n duration: number;\n timestamp: number;\n }\n> {}\n\n/**\n * ToolExecutionErrorEvent - Tool execution failed\n */\nexport interface ToolExecutionErrorEvent extends BaseMCPNotification<\n \"tool_execution_error\",\n {\n toolId: string;\n toolName: string;\n code: string;\n message: string;\n timestamp: number;\n }\n> {}\n\n/**\n * MCPServerConnectedEvent - MCP server connected\n */\nexport interface MCPServerConnectedEvent extends BaseMCPNotification<\n \"mcp_server_connected\",\n {\n serverName: string;\n version?: string;\n toolCount: number;\n resourceCount: number;\n timestamp: number;\n }\n> {}\n\n/**\n * MCPServerDisconnectedEvent - MCP server disconnected\n */\nexport interface MCPServerDisconnectedEvent extends BaseMCPNotification<\n \"mcp_server_disconnected\",\n {\n serverName: string;\n reason?: string;\n timestamp: number;\n }\n> {}\n\n/**\n * ResourceReadRequest - Request to read an MCP resource\n */\nexport interface ResourceReadRequest extends BaseMCPRequest<\n \"resource_read_request\",\n {\n serverName: string;\n uri: string;\n }\n> {}\n\n/**\n * ResourceReadResult - Resource read result\n */\nexport interface ResourceReadResult extends BaseMCPResult<\n \"resource_read_result\",\n {\n serverName: string;\n uri: string;\n content: unknown;\n mimeType?: string;\n }\n> {}\n\n/**\n * MCPEvent - All MCP events\n */\nexport type MCPEvent =\n | ToolExecuteRequest\n | ToolExecutedEvent\n | ToolExecutionErrorEvent\n | MCPServerConnectedEvent\n | MCPServerDisconnectedEvent\n | ResourceReadRequest\n | ResourceReadResult;\n\n/**\n * MCP request events\n */\nexport type MCPRequestEvent = ToolExecuteRequest | ResourceReadRequest;\n\n/**\n * MCP result events\n */\nexport type MCPResultEvent = ToolExecutedEvent | ResourceReadResult;\n\n/**\n * Type guard: is this a MCPEvent?\n */\nexport function isMCPEvent(event: { source?: string; category?: string }): event is MCPEvent {\n return event.source === \"sandbox\" && event.category === \"mcp\";\n}\n\n// ============================================================================\n// Sandbox Event Union\n// ============================================================================\n\n/**\n * SandboxEvent - All sandbox events\n */\nexport type SandboxEvent = WorkdirEvent | MCPEvent;\n\n/**\n * Type guard: is this a sandbox event?\n */\nexport function isSandboxEvent(event: { source?: string }): event is SandboxEvent {\n return event.source === \"sandbox\";\n}\n\n// ============================================================================\n// Container Event Union\n// ============================================================================\n\n/**\n * ContainerEvent - All container events\n */\nexport type ContainerEvent = ContainerLifecycleEvent | SandboxEvent;\n\n/**\n * Type guard: is this a container event?\n */\nexport function isContainerEvent(event: { source?: string }): event is ContainerEvent {\n return event.source === \"container\" || event.source === \"sandbox\";\n}\n","/**\n * Command Events - API operations (request/response)\n *\n * Command events for the EventBus system.\n */\n\nimport type { SystemEvent } from \"./base\";\n\n// ============================================================================\n// Content Part Types (Self-contained)\n// ============================================================================\n\n/**\n * Text content part for user messages\n */\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\n/**\n * Image content part for user messages\n */\nexport interface ImagePart {\n type: \"image\";\n data: string;\n mediaType: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n}\n\n/**\n * File content part for user messages\n */\nexport interface FilePart {\n type: \"file\";\n data: string;\n filename: string;\n mediaType: string;\n}\n\n/**\n * User content part - content that users can send in messages\n */\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\n// ============================================================================\n// Response Types (Self-contained)\n// ============================================================================\n\n/**\n * AgentXResponse - Base interface for all command response data\n *\n * All command response data types should extend this interface\n * to ensure consistent structure and enable automatic client-side handling.\n */\nexport interface AgentXResponse {\n /**\n * Request ID for correlation and tracking\n */\n requestId: string;\n\n /**\n * Error message if the request failed\n */\n error?: string;\n\n /**\n * Session IDs that the client should subscribe to\n */\n __subscriptions?: string[];\n}\n\n// ============================================================================\n// Record Types (Self-contained)\n// ============================================================================\n\n/**\n * MCP Server Configuration\n */\nexport interface McpServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n}\n\n/**\n * Image metadata for storing provider-specific data\n */\nexport interface ImageMetadata {\n claudeSdkSessionId?: string;\n}\n\n/**\n * Image storage record\n */\nexport interface ImageRecord {\n imageId: string;\n containerId: string;\n sessionId: string;\n name: string;\n description?: string;\n systemPrompt?: string;\n parentImageId?: string;\n mcpServers?: Record<string, McpServerConfig>;\n metadata?: ImageMetadata;\n createdAt: number;\n updatedAt: number;\n}\n\n/**\n * Image list item with online status\n */\nexport interface ImageListItem extends ImageRecord {\n /** Whether an agent is currently running for this image */\n online: boolean;\n /** Current agent ID if online */\n agentId?: string;\n}\n\n// ============================================================================\n// Command Base Types\n// ============================================================================\n\n/**\n * Base interface for Command request events\n */\ninterface BaseCommandRequest<T extends string, D = unknown> extends SystemEvent<\n T,\n D,\n \"command\",\n \"request\",\n \"request\"\n> {}\n\n/**\n * Base interface for Command response events\n *\n * All response data types must extend AgentXResponse to ensure:\n * - Consistent structure (requestId, error)\n * - Automatic client-side handling (__subscriptions, etc.)\n */\ninterface BaseCommandResponse<\n T extends string,\n D extends AgentXResponse = AgentXResponse,\n> extends SystemEvent<T, D, \"command\", \"response\", \"result\"> {}\n\n// ============================================================================\n// Container Commands\n// ============================================================================\n\n/**\n * Request to create a container\n */\nexport interface ContainerCreateRequest extends BaseCommandRequest<\n \"container_create_request\",\n {\n requestId: string;\n containerId: string;\n }\n> {}\n\n/**\n * Response to container creation\n */\nexport interface ContainerCreateResponse extends BaseCommandResponse<\n \"container_create_response\",\n AgentXResponse & {\n containerId: string;\n }\n> {}\n\n/**\n * Request to get a container\n */\nexport interface ContainerGetRequest extends BaseCommandRequest<\n \"container_get_request\",\n {\n requestId: string;\n containerId: string;\n }\n> {}\n\n/**\n * Response to container get\n */\nexport interface ContainerGetResponse extends BaseCommandResponse<\n \"container_get_response\",\n AgentXResponse & {\n containerId?: string;\n exists: boolean;\n }\n> {}\n\n/**\n * Request to list containers\n */\nexport interface ContainerListRequest extends BaseCommandRequest<\n \"container_list_request\",\n {\n requestId: string;\n }\n> {}\n\n/**\n * Response to container list\n */\nexport interface ContainerListResponse extends BaseCommandResponse<\n \"container_list_response\",\n AgentXResponse & {\n containerIds: string[];\n }\n> {}\n\n// ============================================================================\n// Agent Commands\n// ============================================================================\n\n/**\n * Request to get an agent\n */\nexport interface AgentGetRequest extends BaseCommandRequest<\n \"agent_get_request\",\n {\n requestId: string;\n agentId: string;\n }\n> {}\n\n/**\n * Response to agent get\n */\nexport interface AgentGetResponse extends BaseCommandResponse<\n \"agent_get_response\",\n AgentXResponse & {\n agentId?: string;\n containerId?: string;\n exists: boolean;\n }\n> {}\n\n/**\n * Request to list agents\n */\nexport interface AgentListRequest extends BaseCommandRequest<\n \"agent_list_request\",\n {\n requestId: string;\n containerId: string;\n }\n> {}\n\n/**\n * Response to agent list\n */\nexport interface AgentListResponse extends BaseCommandResponse<\n \"agent_list_response\",\n AgentXResponse & {\n agents: Array<{ agentId: string; containerId: string; imageId: string }>;\n }\n> {}\n\n/**\n * Request to destroy an agent\n */\nexport interface AgentDestroyRequest extends BaseCommandRequest<\n \"agent_destroy_request\",\n {\n requestId: string;\n agentId: string;\n }\n> {}\n\n/**\n * Response to agent destroy\n */\nexport interface AgentDestroyResponse extends BaseCommandResponse<\n \"agent_destroy_response\",\n AgentXResponse & {\n agentId: string;\n success: boolean;\n }\n> {}\n\n/**\n * Request to destroy all agents in a container\n */\nexport interface AgentDestroyAllRequest extends BaseCommandRequest<\n \"agent_destroy_all_request\",\n {\n requestId: string;\n containerId: string;\n }\n> {}\n\n/**\n * Response to destroy all agents\n */\nexport interface AgentDestroyAllResponse extends BaseCommandResponse<\n \"agent_destroy_all_response\",\n AgentXResponse & {\n containerId: string;\n }\n> {}\n\n/**\n * Request to send a message\n * Can use either imageId (preferred) or agentId\n * If using imageId and agent is not running, it will be auto-activated\n */\nexport interface MessageSendRequest extends BaseCommandRequest<\n \"message_send_request\",\n {\n requestId: string;\n /** Image ID (preferred) - will auto-activate if offline */\n imageId?: string;\n /** Agent ID (legacy) - must be already running */\n agentId?: string;\n /** Message content (text-only or multimodal) */\n content: string | UserContentPart[];\n }\n> {}\n\n/**\n * Response to message send (acknowledges message received, not completion)\n */\nexport interface MessageSendResponse extends BaseCommandResponse<\n \"message_send_response\",\n AgentXResponse & {\n imageId?: string;\n agentId: string;\n }\n> {}\n\n/**\n * Request to interrupt an agent\n * Can use either imageId or agentId\n */\nexport interface AgentInterruptRequest extends BaseCommandRequest<\n \"agent_interrupt_request\",\n {\n requestId: string;\n /** Image ID (preferred) */\n imageId?: string;\n /** Agent ID (legacy) */\n agentId?: string;\n }\n> {}\n\n/**\n * Response to agent interrupt\n */\nexport interface AgentInterruptResponse extends BaseCommandResponse<\n \"agent_interrupt_response\",\n AgentXResponse & {\n imageId?: string;\n agentId?: string;\n }\n> {}\n\n// ============================================================================\n// Image Commands\n// ============================================================================\n\n/**\n * Request to create a new image (conversation)\n */\nexport interface ImageCreateRequest extends BaseCommandRequest<\n \"image_create_request\",\n {\n requestId: string;\n containerId: string;\n config: {\n name?: string;\n description?: string;\n systemPrompt?: string;\n };\n }\n> {}\n\n/**\n * Response to image creation\n *\n * Includes __subscriptions with the new image's sessionId for auto-subscription.\n * Note: record is optional because it may be undefined on error.\n */\nexport interface ImageCreateResponse extends BaseCommandResponse<\n \"image_create_response\",\n AgentXResponse & {\n record?: ImageRecord;\n }\n> {}\n\n/**\n * Request to run an image (create or reuse agent)\n */\nexport interface ImageRunRequest extends BaseCommandRequest<\n \"image_run_request\",\n {\n requestId: string;\n imageId: string;\n }\n> {}\n\n/**\n * Response to image run\n */\nexport interface ImageRunResponse extends BaseCommandResponse<\n \"image_run_response\",\n AgentXResponse & {\n imageId: string;\n agentId: string;\n /** true if reusing existing agent, false if newly created */\n reused: boolean;\n }\n> {}\n\n/**\n * Request to stop an image (destroy agent, keep image)\n */\nexport interface ImageStopRequest extends BaseCommandRequest<\n \"image_stop_request\",\n {\n requestId: string;\n imageId: string;\n }\n> {}\n\n/**\n * Response to image stop\n */\nexport interface ImageStopResponse extends BaseCommandResponse<\n \"image_stop_response\",\n AgentXResponse & {\n imageId: string;\n }\n> {}\n\n/**\n * Request to update an image (name, description, etc.)\n */\nexport interface ImageUpdateRequest extends BaseCommandRequest<\n \"image_update_request\",\n {\n requestId: string;\n imageId: string;\n updates: {\n name?: string;\n description?: string;\n };\n }\n> {}\n\n/**\n * Response to image update\n *\n * Note: record is optional because it may be undefined on error.\n */\nexport interface ImageUpdateResponse extends BaseCommandResponse<\n \"image_update_response\",\n AgentXResponse & {\n record?: ImageRecord;\n }\n> {}\n\n/**\n * Request to list all images\n */\nexport interface ImageListRequest extends BaseCommandRequest<\n \"image_list_request\",\n {\n requestId: string;\n containerId?: string;\n }\n> {}\n\n/**\n * Response to image list\n *\n * Includes __subscriptions with all images' sessionIds for auto-subscription.\n */\nexport interface ImageListResponse extends BaseCommandResponse<\n \"image_list_response\",\n AgentXResponse & {\n records: ImageListItem[];\n }\n> {}\n\n/**\n * Request to get an image by ID\n */\nexport interface ImageGetRequest extends BaseCommandRequest<\n \"image_get_request\",\n {\n requestId: string;\n imageId: string;\n }\n> {}\n\n/**\n * Response to image get\n *\n * Includes __subscriptions with the image's sessionId for auto-subscription.\n */\nexport interface ImageGetResponse extends BaseCommandResponse<\n \"image_get_response\",\n AgentXResponse & {\n record?: ImageListItem | null;\n }\n> {}\n\n/**\n * Request to delete an image\n */\nexport interface ImageDeleteRequest extends BaseCommandRequest<\n \"image_delete_request\",\n {\n requestId: string;\n imageId: string;\n }\n> {}\n\n/**\n * Response to image delete\n */\nexport interface ImageDeleteResponse extends BaseCommandResponse<\n \"image_delete_response\",\n AgentXResponse & {\n imageId: string;\n }\n> {}\n\n/**\n * Request to get messages for an image\n */\nexport interface ImageMessagesRequest extends BaseCommandRequest<\n \"image_messages_request\",\n {\n requestId: string;\n imageId: string;\n }\n> {}\n\n/**\n * Response to image messages request\n */\nexport interface ImageMessagesResponse extends BaseCommandResponse<\n \"image_messages_response\",\n AgentXResponse & {\n imageId: string;\n messages: Array<{\n id: string;\n role: \"user\" | \"assistant\" | \"tool_call\" | \"tool_result\";\n content: unknown;\n timestamp: number;\n }>;\n }\n> {}\n\n// ============================================================================\n// Command Union Types\n// ============================================================================\n\n/**\n * All Command request events\n */\nexport type CommandRequest =\n // Container\n | ContainerCreateRequest\n | ContainerGetRequest\n | ContainerListRequest\n // Agent\n | AgentGetRequest\n | AgentListRequest\n | AgentDestroyRequest\n | AgentDestroyAllRequest\n | MessageSendRequest\n | AgentInterruptRequest\n // Image\n | ImageCreateRequest\n | ImageRunRequest\n | ImageStopRequest\n | ImageUpdateRequest\n | ImageListRequest\n | ImageGetRequest\n | ImageDeleteRequest\n | ImageMessagesRequest;\n\n/**\n * All Command response events\n */\nexport type CommandResponse =\n // Container\n | ContainerCreateResponse\n | ContainerGetResponse\n | ContainerListResponse\n // Agent\n | AgentGetResponse\n | AgentListResponse\n | AgentDestroyResponse\n | AgentDestroyAllResponse\n | MessageSendResponse\n | AgentInterruptResponse\n // Image\n | ImageCreateResponse\n | ImageRunResponse\n | ImageStopResponse\n | ImageUpdateResponse\n | ImageListResponse\n | ImageGetResponse\n | ImageDeleteResponse\n | ImageMessagesResponse;\n\n/**\n * All Command events (requests + responses)\n */\nexport type CommandEvent = CommandRequest | CommandResponse;\n\n/**\n * Command event type strings\n */\nexport type CommandEventType = CommandEvent[\"type\"];\n\n/**\n * Type guard: is this a CommandEvent?\n */\nexport function isCommandEvent(event: { source?: string }): event is CommandEvent {\n return event.source === \"command\";\n}\n\n/**\n * Type guard: is this a Command request event?\n */\nexport function isCommandRequest(event: {\n source?: string;\n category?: string;\n}): event is CommandRequest {\n return event.source === \"command\" && event.category === \"request\";\n}\n\n/**\n * Type guard: is this a Command response event?\n */\nexport function isCommandResponse(event: {\n source?: string;\n category?: string;\n}): event is CommandResponse {\n return event.source === \"command\" && event.category === \"response\";\n}\n\n// ============================================================================\n// Command Event Map\n// ============================================================================\n\n/**\n * CommandEventMap - Maps event type string to event interface\n *\n * Enables type-safe event handling:\n * ```typescript\n * bus.onCommand(\"container_create_request\", (event) => {\n * event.data.requestId; // string\n * event.data.containerId; // string\n * });\n * ```\n */\nexport interface CommandEventMap {\n // Container\n container_create_request: ContainerCreateRequest;\n container_create_response: ContainerCreateResponse;\n container_get_request: ContainerGetRequest;\n container_get_response: ContainerGetResponse;\n container_list_request: ContainerListRequest;\n container_list_response: ContainerListResponse;\n // Agent\n agent_get_request: AgentGetRequest;\n agent_get_response: AgentGetResponse;\n agent_list_request: AgentListRequest;\n agent_list_response: AgentListResponse;\n agent_destroy_request: AgentDestroyRequest;\n agent_destroy_response: AgentDestroyResponse;\n agent_destroy_all_request: AgentDestroyAllRequest;\n agent_destroy_all_response: AgentDestroyAllResponse;\n message_send_request: MessageSendRequest;\n message_send_response: MessageSendResponse;\n agent_interrupt_request: AgentInterruptRequest;\n agent_interrupt_response: AgentInterruptResponse;\n // Image\n image_create_request: ImageCreateRequest;\n image_create_response: ImageCreateResponse;\n image_run_request: ImageRunRequest;\n image_run_response: ImageRunResponse;\n image_stop_request: ImageStopRequest;\n image_stop_response: ImageStopResponse;\n image_update_request: ImageUpdateRequest;\n image_update_response: ImageUpdateResponse;\n image_list_request: ImageListRequest;\n image_list_response: ImageListResponse;\n image_get_request: ImageGetRequest;\n image_get_response: ImageGetResponse;\n image_delete_request: ImageDeleteRequest;\n image_delete_response: ImageDeleteResponse;\n image_messages_request: ImageMessagesRequest;\n image_messages_response: ImageMessagesResponse;\n}\n\n/**\n * Maps request event type to its corresponding response event type\n */\nexport interface CommandRequestResponseMap {\n container_create_request: \"container_create_response\";\n container_get_request: \"container_get_response\";\n container_list_request: \"container_list_response\";\n agent_get_request: \"agent_get_response\";\n agent_list_request: \"agent_list_response\";\n agent_destroy_request: \"agent_destroy_response\";\n agent_destroy_all_request: \"agent_destroy_all_response\";\n message_send_request: \"message_send_response\";\n agent_interrupt_request: \"agent_interrupt_response\";\n image_create_request: \"image_create_response\";\n image_run_request: \"image_run_response\";\n image_stop_request: \"image_stop_response\";\n image_update_request: \"image_update_response\";\n image_list_request: \"image_list_response\";\n image_get_request: \"image_get_response\";\n image_delete_request: \"image_delete_response\";\n image_messages_request: \"image_messages_response\";\n}\n\n/**\n * All command request types\n */\nexport type CommandRequestType = keyof CommandRequestResponseMap;\n\n/**\n * Get response type for a request type\n */\nexport type ResponseTypeFor<T extends CommandRequestType> = CommandRequestResponseMap[T];\n\n/**\n * Get response event for a request type\n */\nexport type ResponseEventFor<T extends CommandRequestType> = CommandEventMap[ResponseTypeFor<T>];\n\n/**\n * Get request data type (without requestId, as it's auto-generated)\n */\nexport type RequestDataFor<T extends CommandRequestType> = Omit<\n CommandEventMap[T][\"data\"],\n \"requestId\"\n>;\n"],"mappings":";AA4MO,SAAS,aACd,OACA,QAC0C;AAC1C,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,UACd,OACA,QACsE;AACtE,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,UAAU,OAA6B;AACrD,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,SAAS,OAA6B;AACpD,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,eAAe,OAA6B;AAC1D,SAAO,MAAM,WAAW;AAC1B;;;ACrLO,SAAS,aAAa,OAAoC;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK;AAClB;AAiOO,SAAS,iBAAiB,OAGL;AAC1B,SAAO,MAAM,WAAW,YAAY,MAAM,aAAa;AACzD;AAiEO,SAAS,kBAAkB,OAGL;AAC3B,SAAO,MAAM,WAAW,YAAY,MAAM,aAAa;AACzD;;;AC5LO,SAAS,mBAAmB,OAGL;AAC5B,SAAO,MAAM,WAAW,WAAW,MAAM,aAAa;AACxD;AA6JO,SAAS,kBAAkB,OAGL;AAC3B,SAAO,MAAM,WAAW,WAAW,MAAM,aAAa;AACxD;AA2EO,SAAS,oBAAoB,OAGL;AAC7B,SAAO,MAAM,WAAW,WAAW,MAAM,aAAa;AACxD;AA8DO,SAAS,iBAAiB,OAGL;AAC1B,SAAO,MAAM,WAAW,WAAW,MAAM,aAAa;AACxD;AAcO,SAAS,aAAa,OAAiD;AAC5E,SAAO,MAAM,WAAW;AAC1B;;;ACvcO,SAAS,wBAAwB,OAGL;AACjC,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AAkGO,SAAS,sBAAsB,OAGL;AAC/B,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AAgIO,SAAS,qBAAqB,OAGL;AAC9B,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AAcO,SAAS,eAAe,OAAmD;AAChF,SAAO,MAAM,WAAW;AAC1B;;;ACrOO,SAAS,0BAA0B,OAGL;AACnC,SAAO,MAAM,WAAW,eAAe,MAAM,aAAa;AAC5D;AA0LO,SAAS,eAAe,OAGL;AACxB,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AA4JO,SAAS,WAAW,OAAkE;AAC3F,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AAcO,SAAS,eAAe,OAAmD;AAChF,SAAO,MAAM,WAAW;AAC1B;AAcO,SAAS,iBAAiB,OAAqD;AACpF,SAAO,MAAM,WAAW,eAAe,MAAM,WAAW;AAC1D;;;AC2JO,SAAS,eAAe,OAAmD;AAChF,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,iBAAiB,OAGL;AAC1B,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;AAKO,SAAS,kBAAkB,OAGL;AAC3B,SAAO,MAAM,WAAW,aAAa,MAAM,aAAa;AAC1D;","names":[]}
@@ -0,0 +1,272 @@
1
+ // src/agent/engine/mealy/Store.ts
2
+ var MemoryStore = class {
3
+ states = /* @__PURE__ */ new Map();
4
+ get(id) {
5
+ return this.states.get(id);
6
+ }
7
+ set(id, state) {
8
+ this.states.set(id, state);
9
+ }
10
+ delete(id) {
11
+ this.states.delete(id);
12
+ }
13
+ has(id) {
14
+ return this.states.has(id);
15
+ }
16
+ /**
17
+ * Clear all stored states
18
+ */
19
+ clear() {
20
+ this.states.clear();
21
+ }
22
+ /**
23
+ * Get the number of stored states
24
+ */
25
+ get size() {
26
+ return this.states.size;
27
+ }
28
+ /**
29
+ * Get all stored IDs
30
+ */
31
+ keys() {
32
+ return this.states.keys();
33
+ }
34
+ };
35
+
36
+ // src/agent/engine/mealy/Mealy.ts
37
+ import { createLogger } from "commonxjs/logger";
38
+ var logger = createLogger("engine/Mealy");
39
+ var Mealy = class {
40
+ processor;
41
+ store;
42
+ initialState;
43
+ sinks;
44
+ recursive;
45
+ maxDepth;
46
+ constructor(config) {
47
+ this.processor = config.processor;
48
+ this.store = config.store;
49
+ this.initialState = config.initialState;
50
+ this.sinks = config.sinks ?? [];
51
+ this.recursive = config.recursive ?? true;
52
+ this.maxDepth = config.maxDepth ?? 100;
53
+ logger.debug("Mealy instance created", {
54
+ sinkCount: this.sinks.length,
55
+ recursive: this.recursive,
56
+ maxDepth: this.maxDepth
57
+ });
58
+ }
59
+ /**
60
+ * Process an input through the Mealy Machine
61
+ *
62
+ * @param id - Unique identifier (e.g., agentId)
63
+ * @param input - The input to process
64
+ * @returns Result containing new state and all outputs
65
+ */
66
+ process(id, input) {
67
+ return this.processInternal(id, input, 0);
68
+ }
69
+ /**
70
+ * Internal process with depth tracking
71
+ */
72
+ processInternal(id, input, depth) {
73
+ if (depth >= this.maxDepth) {
74
+ logger.warn("Max recursion depth reached", {
75
+ id,
76
+ maxDepth: this.maxDepth,
77
+ depth
78
+ });
79
+ return {
80
+ state: this.store.get(id) ?? this.initialState,
81
+ outputs: [],
82
+ processCount: 0
83
+ };
84
+ }
85
+ let state = this.store.get(id);
86
+ if (state === void 0) {
87
+ state = this.initialState;
88
+ }
89
+ const [newState, outputs] = this.processor(state, input);
90
+ this.store.set(id, newState);
91
+ const allOutputs = [...outputs];
92
+ let processCount = 1;
93
+ if (outputs.length > 0) {
94
+ this.sendToSinks(id, outputs);
95
+ }
96
+ if (this.recursive) {
97
+ for (const output of outputs) {
98
+ const result = this.processInternal(id, output, depth + 1);
99
+ allOutputs.push(...result.outputs);
100
+ processCount += result.processCount;
101
+ }
102
+ }
103
+ return {
104
+ state: newState,
105
+ outputs: allOutputs,
106
+ processCount
107
+ };
108
+ }
109
+ /**
110
+ * Send outputs to all sinks
111
+ */
112
+ sendToSinks(id, outputs) {
113
+ for (const sink of this.sinks) {
114
+ if (typeof sink === "function") {
115
+ try {
116
+ const result = sink(id, outputs);
117
+ if (result instanceof Promise) {
118
+ result.catch((error) => {
119
+ logger.error("Sink error (async)", { id, error });
120
+ });
121
+ }
122
+ } catch (error) {
123
+ logger.error("Sink error (sync)", { id, error });
124
+ }
125
+ } else {
126
+ const filteredOutputs = sink.filter ? outputs.filter(sink.filter) : outputs;
127
+ if (filteredOutputs.length === 0) {
128
+ continue;
129
+ }
130
+ try {
131
+ const result = sink.sink(id, filteredOutputs);
132
+ if (result instanceof Promise) {
133
+ result.catch((error) => {
134
+ logger.error("Named sink error (async)", {
135
+ id,
136
+ sinkName: sink.name,
137
+ error
138
+ });
139
+ });
140
+ }
141
+ } catch (error) {
142
+ logger.error("Named sink error (sync)", {
143
+ id,
144
+ sinkName: sink.name,
145
+ error
146
+ });
147
+ }
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Get current state for an ID (without processing)
153
+ */
154
+ getState(id) {
155
+ return this.store.get(id);
156
+ }
157
+ /**
158
+ * Check if state exists for an ID
159
+ */
160
+ hasState(id) {
161
+ return this.store.has(id);
162
+ }
163
+ /**
164
+ * Delete state for an ID (cleanup)
165
+ */
166
+ cleanup(id) {
167
+ logger.debug("Cleaning up state", { id });
168
+ this.store.delete(id);
169
+ }
170
+ /**
171
+ * Add a sink at runtime
172
+ */
173
+ addSink(sink) {
174
+ const sinkName = typeof sink === "function" ? "(anonymous)" : sink.name;
175
+ logger.debug("Adding sink", { sinkName });
176
+ this.sinks.push(sink);
177
+ }
178
+ /**
179
+ * Remove a sink by name (only works for SinkDefinitions)
180
+ */
181
+ removeSink(name) {
182
+ const index = this.sinks.findIndex((s) => typeof s !== "function" && s.name === name);
183
+ if (index !== -1) {
184
+ this.sinks.splice(index, 1);
185
+ logger.debug("Removed sink", { name });
186
+ return true;
187
+ }
188
+ logger.debug("Sink not found for removal", { name });
189
+ return false;
190
+ }
191
+ };
192
+ function createMealy(config) {
193
+ return new Mealy(config);
194
+ }
195
+
196
+ // src/agent/engine/mealy/combinators.ts
197
+ function combineProcessors(processors) {
198
+ return (state, event) => {
199
+ const newState = {};
200
+ const allOutputs = [];
201
+ for (const key in processors) {
202
+ const processor = processors[key];
203
+ const subState = state[key];
204
+ const [newSubState, outputs] = processor(subState, event);
205
+ newState[key] = newSubState;
206
+ allOutputs.push(...outputs);
207
+ }
208
+ return [newState, allOutputs];
209
+ };
210
+ }
211
+ function combineInitialStates(initialStates) {
212
+ return () => {
213
+ const state = {};
214
+ for (const key in initialStates) {
215
+ state[key] = initialStates[key]();
216
+ }
217
+ return state;
218
+ };
219
+ }
220
+ function chainProcessors(...processors) {
221
+ return (state, event) => {
222
+ let currentState = state;
223
+ const finalOutputs = [];
224
+ for (const processor of processors) {
225
+ const [newState, outputs] = processor(currentState, event);
226
+ currentState = newState;
227
+ finalOutputs.push(...outputs);
228
+ }
229
+ return [currentState, finalOutputs];
230
+ };
231
+ }
232
+ function filterProcessor(predicate, processor) {
233
+ return (state, event) => {
234
+ if (predicate(event)) {
235
+ return processor(state, event);
236
+ }
237
+ return [state, []];
238
+ };
239
+ }
240
+ function mapOutput(processor, mapper) {
241
+ return (state, event) => {
242
+ const [newState, outputs] = processor(state, event);
243
+ return [newState, outputs.map(mapper)];
244
+ };
245
+ }
246
+ function withLogging(processor, name, logger2 = console) {
247
+ return (state, event) => {
248
+ logger2.debug(`[${name}] Input:`, { event, state });
249
+ const [newState, outputs] = processor(state, event);
250
+ logger2.debug(`[${name}] Output:`, { newState, outputs });
251
+ return [newState, outputs];
252
+ };
253
+ }
254
+ function identityProcessor() {
255
+ return (state, _event) => {
256
+ return [state, []];
257
+ };
258
+ }
259
+
260
+ export {
261
+ MemoryStore,
262
+ Mealy,
263
+ createMealy,
264
+ combineProcessors,
265
+ combineInitialStates,
266
+ chainProcessors,
267
+ filterProcessor,
268
+ mapOutput,
269
+ withLogging,
270
+ identityProcessor
271
+ };
272
+ //# sourceMappingURL=chunk-EKHT54KN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/engine/mealy/Store.ts","../src/agent/engine/mealy/Mealy.ts","../src/agent/engine/mealy/combinators.ts"],"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 \"commonxjs/logger\";\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"],"mappings":"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","names":["logger"]}