@agentxjs/core 1.9.9-dev → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +342 -0
- package/dist/RpcClient-BcJ_zAGu.d.ts +304 -0
- package/dist/agent/engine/internal/index.d.ts +20 -15
- package/dist/agent/engine/internal/index.js +1 -2
- package/dist/agent/engine/mealy/index.js +0 -1
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +6 -6
- package/dist/agent/types/index.d.ts +4 -4
- package/dist/agent/types/index.js +1 -2
- package/dist/bash/index.d.ts +29 -0
- package/dist/bash/index.js +7 -0
- package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
- package/dist/{chunk-K6WXQ2RW.js → chunk-23UUBQXR.js} +1 -2
- package/dist/chunk-23UUBQXR.js.map +1 -0
- package/dist/chunk-BHOD5PKR.js +55 -0
- package/dist/chunk-BHOD5PKR.js.map +1 -0
- package/dist/{chunk-I7GYR3MN.js → chunk-DEAR6N3O.js} +77 -91
- package/dist/chunk-DEAR6N3O.js.map +1 -0
- package/dist/chunk-FI7WQFGV.js +37 -0
- package/dist/chunk-FI7WQFGV.js.map +1 -0
- package/dist/{chunk-TBU7FFZT.js → chunk-JTKCV7IS.js} +4 -4
- package/dist/chunk-JTKCV7IS.js.map +1 -0
- package/dist/{chunk-E5FPOAPO.js → chunk-LTVNPHST.js} +1 -1
- package/dist/chunk-LTVNPHST.js.map +1 -0
- package/dist/chunk-SKS7S2RY.js +1 -0
- package/dist/common/logger/index.js +0 -2
- package/dist/common/logger/index.js.map +1 -1
- package/dist/container/index.d.ts +3 -4
- package/dist/container/index.js +0 -2
- package/dist/container/index.js.map +1 -1
- package/dist/driver/index.d.ts +2 -310
- package/dist/event/index.d.ts +4 -4
- package/dist/event/index.js +1 -2
- package/dist/event/types/index.d.ts +4 -10
- package/dist/event/types/index.js +1 -2
- package/dist/{event-CDuTzs__.d.ts → event-DNWOBSBO.d.ts} +3 -4
- package/dist/image/index.d.ts +9 -5
- package/dist/image/index.js +5 -2
- package/dist/image/index.js.map +1 -1
- package/dist/index-CuS1i5V-.d.ts +609 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -6
- package/dist/{message-BMrMm1pq.d.ts → message-03TJzvIX.d.ts} +10 -33
- package/dist/mq/index.js +0 -2
- package/dist/mq/index.js.map +1 -1
- package/dist/network/index.d.ts +3 -291
- package/dist/network/index.js +3 -14
- package/dist/network/index.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -155
- package/dist/platform/index.d.ts +76 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/runtime/index.d.ts +26 -59
- package/dist/runtime/index.js +117 -33
- package/dist/runtime/index.js.map +1 -1
- package/dist/session/index.d.ts +4 -52
- package/dist/session/index.js +4 -51
- package/dist/session/index.js.map +1 -1
- package/dist/types-aE74Eo6G.d.ts +90 -0
- package/package.json +10 -5
- package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +291 -87
- package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +56 -75
- package/src/agent/engine/MealyMachine.ts +1 -1
- package/src/agent/engine/internal/messageAssemblerProcessor.ts +99 -114
- package/src/agent/engine/internal/turnTrackerProcessor.ts +23 -27
- package/src/agent/types/event.ts +0 -4
- package/src/agent/types/index.ts +1 -3
- package/src/agent/types/message.ts +9 -43
- package/src/bash/index.ts +21 -0
- package/src/bash/tool.ts +57 -0
- package/src/bash/types.ts +108 -0
- package/src/driver/index.ts +1 -0
- package/src/driver/types.ts +122 -4
- package/src/event/__tests__/EventBus.test.ts +1 -1
- package/src/event/types/agent.ts +0 -11
- package/src/event/types/command.ts +3 -1
- package/src/image/Image.ts +11 -1
- package/src/image/types.ts +8 -2
- package/src/network/RpcClient.ts +21 -20
- package/src/network/index.ts +1 -1
- package/src/persistence/types.ts +5 -2
- package/src/platform/index.ts +21 -0
- package/src/platform/types.ts +84 -0
- package/src/runtime/AgentXRuntime.ts +184 -57
- package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
- package/src/runtime/index.ts +7 -19
- package/src/runtime/types.ts +10 -62
- package/dist/chunk-7D4SUZUM.js +0 -38
- package/dist/chunk-E5FPOAPO.js.map +0 -1
- package/dist/chunk-I7GYR3MN.js.map +0 -1
- package/dist/chunk-K6WXQ2RW.js.map +0 -1
- package/dist/chunk-TBU7FFZT.js.map +0 -1
- package/dist/workspace/index.d.ts +0 -111
- package/dist/wrapper-Y3UTVU2E.js +0 -3635
- package/dist/wrapper-Y3UTVU2E.js.map +0 -1
- package/src/workspace/index.ts +0 -27
- package/src/workspace/types.ts +0 -131
- /package/dist/{workspace → bash}/index.js.map +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
- /package/dist/{workspace → platform}/index.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/engine/internal/messageAssemblerProcessor.ts","../src/agent/engine/internal/stateEventProcessor.ts","../src/agent/engine/internal/turnTrackerProcessor.ts"],"sourcesContent":["/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function that assembles complete Message Layer events\n * from Stream Layer events.\n *\n * Input Events (Stream Layer):\n * - message_start\n * - text_delta\n * - tool_use_start\n * - input_json_delta\n * - tool_use_stop\n * - tool_result\n * - message_stop\n *\n * Output Events (Message Layer):\n * - tool_call_message (Message - AI's request to call a tool)\n * - tool_result_message (Message - tool execution result)\n * - assistant_message (Message - complete assistant response)\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n TextDeltaEvent,\n ToolUseStartEvent,\n InputJsonDeltaEvent,\n ToolResultEvent,\n MessageStopEvent,\n // Output: Message events\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n ErrorMessageEvent,\n // Message types\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n // Content parts\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"../../types\";\n\n// ===== State Types =====\n\n/**\n * Pending content accumulator\n */\nexport interface PendingContent {\n type: \"text\" | \"tool_use\";\n index: number;\n // For text content\n textDeltas?: string[];\n // For tool use\n toolId?: string;\n toolName?: string;\n toolInputJson?: string;\n}\n\n/**\n * Pending tool call info (for matching with tool_result)\n */\nexport interface PendingToolCall {\n id: string;\n name: string;\n}\n\n/**\n * MessageAssemblerState\n *\n * Tracks the state of message assembly from stream events.\n */\nexport interface MessageAssemblerState {\n /**\n * Current message ID being assembled\n */\n currentMessageId: string | null;\n\n /**\n * Timestamp when the current message started\n */\n messageStartTime: number | null;\n\n /**\n * Pending content blocks being accumulated\n * Key is the content block index\n */\n pendingContents: Record<number, PendingContent>;\n\n /**\n * Pending tool calls waiting for results\n * Key is the tool call ID\n */\n pendingToolCalls: Record<string, PendingToolCall>;\n}\n\n/**\n * Initial state factory for MessageAssembler\n */\nexport function createInitialMessageAssemblerState(): MessageAssemblerState {\n return {\n currentMessageId: null,\n messageStartTime: null,\n pendingContents: {},\n pendingToolCalls: {},\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from MessageAssembler\n */\nexport type MessageAssemblerOutput =\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Input event types for MessageAssembler\n */\nexport type MessageAssemblerInput = StreamEvent;\n\n/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function for message assembly.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const messageAssemblerProcessor: Processor<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = (state, input): [MessageAssemblerState, MessageAssemblerOutput[]] => {\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(state, input);\n\n case \"text_delta\":\n return handleTextDelta(state, input);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, input);\n\n case \"input_json_delta\":\n return handleInputJsonDelta(state, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, input);\n\n case \"tool_result\":\n return handleToolResult(state, input);\n\n case \"message_stop\":\n return handleMessageStop(state, input);\n\n case \"error_received\":\n return handleErrorReceived(state, input);\n\n default:\n // Pass through unhandled events (no state change, no output)\n return [state, []];\n }\n};\n\n/**\n * Handle message_start event\n */\nfunction handleMessageStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as MessageStartEvent;\n return [\n {\n ...state,\n currentMessageId: data.messageId,\n messageStartTime: event.timestamp,\n pendingContents: {},\n },\n [],\n ];\n}\n\n/**\n * Handle text_delta event\n */\nfunction handleTextDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as TextDeltaEvent;\n const index = 0; // Text content uses index 0\n const existingContent = state.pendingContents[index];\n\n const pendingContent: PendingContent =\n existingContent?.type === \"text\"\n ? {\n ...existingContent,\n textDeltas: [...(existingContent.textDeltas || []), data.text],\n }\n : {\n type: \"text\",\n index,\n textDeltas: [data.text],\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_start event\n */\nfunction handleToolUseStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as ToolUseStartEvent;\n const index = 1; // Tool use uses index 1\n\n const pendingContent: PendingContent = {\n type: \"tool_use\",\n index,\n toolId: data.toolCallId,\n toolName: data.toolName,\n toolInputJson: \"\",\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle input_json_delta event\n */\nfunction handleInputJsonDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as InputJsonDeltaEvent;\n const index = 1; // Tool use uses index 1\n const existingContent = state.pendingContents[index];\n\n if (!existingContent || existingContent.type !== \"tool_use\") {\n // No pending tool_use content, ignore\n return [state, []];\n }\n\n const pendingContent: PendingContent = {\n ...existingContent,\n toolInputJson: (existingContent.toolInputJson || \"\") + data.partialJson,\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Emits:\n * - tool_call_message (Message Event) - for UI display and tool execution\n */\nfunction handleToolUseStop(\n state: Readonly<MessageAssemblerState>,\n _event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const index = 1;\n const pendingContent = state.pendingContents[index];\n\n if (!pendingContent || pendingContent.type !== \"tool_use\") {\n return [state, []];\n }\n\n // Get tool info from pendingContent (saved during tool_use_start)\n const toolId = pendingContent.toolId || \"\";\n const toolName = pendingContent.toolName || \"\";\n\n // Parse tool input JSON (accumulated during input_json_delta)\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};\n } catch {\n // Failed to parse, use empty object\n toolInput = {};\n }\n\n // Create ToolCallPart\n const toolCall: ToolCallPart = {\n type: \"tool-call\",\n id: toolId,\n name: toolName,\n input: toolInput,\n };\n\n // Create ToolCallMessage (complete Message object)\n // parentId links this tool call to its parent assistant message\n const messageId = generateId();\n const timestamp = Date.now();\n const toolCallMessage: ToolCallMessage = {\n id: messageId,\n role: \"assistant\",\n subtype: \"tool-call\",\n toolCall,\n timestamp,\n parentId: state.currentMessageId || undefined,\n };\n\n // Emit tool_call_message event - data is complete Message object\n const toolCallMessageEvent: ToolCallMessageEvent = {\n type: \"tool_call_message\",\n timestamp,\n data: toolCallMessage,\n };\n\n // Remove from pending contents, add to pending tool calls\n const { [index]: _, ...remainingContents } = state.pendingContents;\n\n return [\n {\n ...state,\n pendingContents: remainingContents,\n pendingToolCalls: {\n ...state.pendingToolCalls,\n [toolId]: { id: toolId, name: toolName },\n },\n },\n [toolCallMessageEvent],\n ];\n}\n\n/**\n * Handle tool_result event\n *\n * Emits:\n * - tool_result_message (Message Event) - for UI display\n */\nfunction handleToolResult(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as ToolResultEvent;\n const { toolCallId, result, isError } = data;\n\n // Find pending tool call\n const pendingToolCall = state.pendingToolCalls[toolCallId];\n const toolName = pendingToolCall?.name || \"unknown\";\n\n // Create tool result part\n const toolResult: ToolResultPart = {\n type: \"tool-result\",\n id: toolCallId,\n name: toolName,\n output: {\n type: isError ? \"error-text\" : \"text\",\n value: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n };\n\n // Create ToolResultMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const toolResultMessage: ToolResultMessage = {\n id: messageId,\n role: \"tool\",\n subtype: \"tool-result\",\n toolCallId,\n toolResult,\n timestamp,\n };\n\n // Emit tool_result_message event - data is complete Message object\n const toolResultMessageEvent: ToolResultMessageEvent = {\n type: \"tool_result_message\",\n timestamp,\n data: toolResultMessage,\n };\n\n // Remove from pending tool calls\n const { [toolCallId]: _, ...remainingToolCalls } = state.pendingToolCalls;\n\n return [\n {\n ...state,\n pendingToolCalls: remainingToolCalls,\n },\n [toolResultMessageEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as MessageStopEvent;\n\n if (!state.currentMessageId) {\n return [state, []];\n }\n\n // Assemble all text content\n const textParts: string[] = [];\n const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);\n\n for (const pending of sortedContents) {\n if (pending.type === \"text\" && pending.textDeltas) {\n textParts.push(pending.textDeltas.join(\"\"));\n }\n }\n\n const textContent = textParts.join(\"\");\n\n // Skip empty messages (but preserve pendingToolCalls if stopReason is \"tool_use\")\n const stopReason = data.stopReason;\n if (!textContent || textContent.trim().length === 0) {\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [],\n ];\n }\n\n // Create content parts (new structure uses ContentPart[])\n const contentParts: TextPart[] = [\n {\n type: \"text\",\n text: textContent,\n },\n ];\n\n // Create AssistantMessage (complete Message object)\n const timestamp = state.messageStartTime || Date.now();\n const assistantMessage: AssistantMessage = {\n id: state.currentMessageId,\n role: \"assistant\",\n subtype: \"assistant\",\n content: contentParts,\n timestamp,\n };\n\n // Emit AssistantMessageEvent - data is complete Message object\n const assistantEvent: AssistantMessageEvent = {\n type: \"assistant_message\",\n timestamp,\n data: assistantMessage,\n };\n\n // Reset state, but preserve pendingToolCalls if stopReason is \"tool_use\"\n // (tool_result events arrive after message_stop in tool call scenarios)\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [assistantEvent],\n ];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_message (Message Event) - for UI display\n */\nfunction handleErrorReceived(\n _state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n // Create ErrorMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const errorMessage: ErrorMessage = {\n id: messageId,\n role: \"error\",\n subtype: \"error\",\n content: data.message,\n errorCode: data.errorCode,\n timestamp,\n };\n\n // Emit error_message event - data is complete Message object\n const errorMessageEvent: ErrorMessageEvent = {\n type: \"error_message\",\n timestamp,\n data: errorMessage,\n };\n\n // Reset state on error\n return [createInitialMessageAssemblerState(), [errorMessageEvent]];\n}\n\n/**\n * MessageAssembler Processor Definition\n */\nexport const messageAssemblerProcessorDef: ProcessorDefinition<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = {\n name: \"MessageAssembler\",\n description: \"Assembles complete messages from stream events\",\n initialState: createInitialMessageAssemblerState,\n processor: messageAssemblerProcessor,\n};\n","/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Input Events (Stream Layer):\n * - message_start\n * - message_stop\n * - text_delta (triggers responding state)\n * - tool_use_start\n * - tool_use_stop\n *\n * Output Events (State Layer):\n * - conversation_start\n * - conversation_responding\n * - conversation_end\n * - tool_planned\n * - tool_executing\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Base type\n EngineEvent,\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n MessageStopEvent,\n ToolUseStartEvent,\n // Output: State events\n ConversationStartEvent,\n ConversationRespondingEvent,\n ConversationEndEvent,\n ConversationInterruptedEvent,\n ToolPlannedEvent,\n ToolExecutingEvent,\n ErrorOccurredEvent,\n} from \"../../types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"engine/stateEventProcessor\");\n\n// ===== State Types =====\n\n/**\n * StateEventProcessorContext\n *\n * Minimal context needed for event transformation logic.\n * Does NOT track agent state - only auxiliary info for decision-making.\n *\n * Currently empty - no context needed as all information comes from events.\n */\nexport interface StateEventProcessorContext {\n // Empty - all information comes from events\n}\n\n/**\n * Initial context factory for StateEventProcessor\n */\nexport function createInitialStateEventProcessorContext(): StateEventProcessorContext {\n return {};\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Output event types from StateEventProcessor\n */\nexport type StateEventProcessorOutput =\n | ConversationStartEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ErrorOccurredEvent;\n\n/**\n * Input event types for StateEventProcessor\n */\nexport type StateEventProcessorInput = StreamEvent;\n\n/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Design:\n * - Does NOT track agent state (that's StateMachine's job)\n * - Only maintains auxiliary context (timestamps, etc.)\n * - Emits State Events that StateMachine consumes\n *\n * Pattern: (context, input) => [newContext, outputs]\n */\nexport const stateEventProcessor: Processor<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = (context, input): [StateEventProcessorContext, StateEventProcessorOutput[]] => {\n // Log all incoming Stream Events\n logger.debug(`[Stream Event] ${input.type}`, {\n context,\n eventData: \"data\" in input ? input.data : undefined,\n });\n\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(context, input);\n\n case \"message_delta\":\n return handleMessageDelta(context);\n\n case \"message_stop\":\n return handleMessageStop(context, input);\n\n case \"text_delta\":\n return handleTextDelta(context);\n\n case \"tool_use_start\":\n return handleToolUseStart(context, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(context);\n\n case \"error_received\":\n return handleErrorReceived(context, input);\n\n default:\n // Pass through unhandled events\n logger.debug(`[Stream Event] ${input.type} (unhandled)`);\n return [context, []];\n }\n};\n\n/**\n * Handle message_start event\n *\n * Emits: conversation_start\n */\nfunction handleMessageStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as MessageStartEvent;\n\n const conversationStartEvent: ConversationStartEvent = {\n type: \"conversation_start\",\n timestamp: Date.now(),\n data: {\n messageId: data.messageId,\n },\n };\n\n return [context, [conversationStartEvent]];\n}\n\n/**\n * Handle message_delta event\n *\n * No longer needed as stopReason is now in message_stop event.\n * Kept for compatibility with event routing.\n */\nfunction handleMessageDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // No-op: stopReason now comes from message_stop\n return [context, []];\n}\n\n/**\n * Handle message_stop event\n *\n * Emits: conversation_end (only if stopReason is NOT \"tool_use\")\n *\n * This event signals that Claude has finished streaming a message.\n * However, if stopReason is \"tool_use\", the conversation continues\n * because Claude will execute tools and send more messages.\n */\nfunction handleMessageStop(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as MessageStopEvent;\n const stopReason = data.stopReason;\n\n logger.debug(\"message_stop received\", { stopReason });\n\n // If stopReason is \"tool_use\", don't emit conversation_end\n // The conversation continues after tool execution\n if (stopReason === \"tool_use\") {\n logger.debug(\"Skipping conversation_end (tool_use in progress)\");\n return [context, []];\n }\n\n // For all other cases (end_turn, max_tokens, etc.), emit conversation_end\n const conversationEndEvent: ConversationEndEvent = {\n type: \"conversation_end\",\n timestamp: Date.now(),\n data: {\n reason: \"completed\",\n },\n };\n\n return [context, [conversationEndEvent]];\n}\n\n/**\n * Handle text_delta event\n *\n * Emits: conversation_responding\n */\nfunction handleTextDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const respondingEvent: ConversationRespondingEvent = {\n type: \"conversation_responding\",\n timestamp: Date.now(),\n data: {},\n };\n\n return [context, [respondingEvent]];\n}\n\n/**\n * Handle tool_use_start event\n *\n * Emits: tool_planned, tool_executing\n */\nfunction handleToolUseStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as ToolUseStartEvent;\n const outputs: StateEventProcessorOutput[] = [];\n\n // Emit ToolPlannedEvent\n const toolPlannedEvent: ToolPlannedEvent = {\n type: \"tool_planned\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n },\n };\n outputs.push(toolPlannedEvent);\n\n // Emit ToolExecutingEvent\n const toolExecutingEvent: ToolExecutingEvent = {\n type: \"tool_executing\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n input: {},\n },\n };\n outputs.push(toolExecutingEvent);\n\n return [context, outputs];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Pass through - no State Event emitted.\n * StateMachine handles the state transition internally.\n */\nfunction handleToolUseStop(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // Pass through - no State Event\n return [context, []];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_occurred\n */\nfunction handleErrorReceived(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as EngineEvent<\"error_received\", { message: string; errorCode?: string }>;\n\n const errorOccurredEvent: ErrorOccurredEvent = {\n type: \"error_occurred\",\n timestamp: Date.now(),\n data: {\n code: data.errorCode || \"unknown_error\",\n message: data.message,\n recoverable: true,\n },\n };\n\n return [context, [errorOccurredEvent]];\n}\n\n/**\n * StateEvent Processor Definition\n *\n * Stateless event transformer: Stream Events → State Events\n */\nexport const stateEventProcessorDef: ProcessorDefinition<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = {\n name: \"StateEventProcessor\",\n description: \"Transform Stream Events into State Events\",\n initialState: createInitialStateEventProcessorContext,\n processor: stateEventProcessor,\n};\n","/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function that tracks request-response turn pairs.\n *\n * Input Events:\n * - user_message (Message Layer)\n * - message_stop (Stream Layer - contains stop reason)\n * - assistant_message (Message Layer)\n *\n * Output Events (Turn Layer):\n * - turn_request\n * - turn_response\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Input: combined stream and message events\n StreamEvent,\n AgentMessageEvent,\n MessageStopEvent,\n UserMessageEvent,\n // Output: Turn events\n TurnRequestEvent,\n TurnResponseEvent,\n // Data types\n TokenUsage,\n} from \"../../types\";\n\n// ===== State Types =====\n\n/**\n * Pending turn tracking\n */\nexport interface PendingTurn {\n turnId: string;\n messageId: string;\n content: string;\n requestedAt: number;\n}\n\n/**\n * TurnTrackerState\n *\n * Tracks the current turn state.\n */\nexport interface TurnTrackerState {\n /**\n * Currently pending turn (waiting for response)\n */\n pendingTurn: PendingTurn | null;\n\n /**\n * Cost per input token (USD)\n */\n costPerInputToken: number;\n\n /**\n * Cost per output token (USD)\n */\n costPerOutputToken: number;\n}\n\n/**\n * Initial state factory for TurnTracker\n */\nexport function createInitialTurnTrackerState(): TurnTrackerState {\n return {\n pendingTurn: null,\n costPerInputToken: 0.000003, // $3 per 1M tokens\n costPerOutputToken: 0.000015, // $15 per 1M tokens\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from TurnTracker\n */\nexport type TurnTrackerOutput = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Input event types for TurnTracker\n * Accepts both Stream and Message layer events\n */\nexport type TurnTrackerInput = StreamEvent | AgentMessageEvent;\n\n/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function for turn tracking.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const turnTrackerProcessor: Processor<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = (state, input): [TurnTrackerState, TurnTrackerOutput[]] => {\n switch (input.type) {\n case \"user_message\":\n return handleUserMessage(state, input as AgentMessageEvent);\n\n case \"message_stop\":\n return handleMessageStop(state, input as StreamEvent);\n\n case \"assistant_message\":\n // Turn completion is handled in message_stop\n // This handler is kept for potential future use\n return [state, []];\n\n default:\n return [state, []];\n }\n};\n\n/**\n * Handle user_message event\n */\nfunction handleUserMessage(\n state: Readonly<TurnTrackerState>,\n event: AgentMessageEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n const { data } = event as UserMessageEvent;\n const turnId = generateId();\n\n // Extract content as string (UserMessage.content can be string or array)\n const contentText = typeof data.content === \"string\" ? data.content : \"\";\n\n const pendingTurn: PendingTurn = {\n turnId,\n messageId: data.id,\n content: contentText,\n requestedAt: event.timestamp,\n };\n\n const turnRequestEvent: TurnRequestEvent = {\n type: \"turn_request\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId: data.id,\n content: contentText,\n timestamp: event.timestamp,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn,\n },\n [turnRequestEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<TurnTrackerState>,\n event: StreamEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { data } = event as MessageStopEvent;\n const stopReason = data.stopReason;\n\n // Complete turn based on stop reason\n // - \"end_turn\": Normal completion (no tool use)\n // - \"tool_use\": Tool calling in progress, DON'T complete yet\n // - \"max_tokens\": Hit token limit, complete turn\n // - \"stop_sequence\": Hit stop sequence, complete turn\n if (stopReason === \"end_turn\" || stopReason === \"max_tokens\" || stopReason === \"stop_sequence\") {\n return completeTurn(state, event.timestamp);\n }\n\n // For tool_use, don't complete turn yet\n return [state, []];\n}\n\n/**\n * Complete the turn and emit TurnResponseEvent\n */\nfunction completeTurn(\n state: Readonly<TurnTrackerState>,\n completedAt: number\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { turnId, messageId, requestedAt } = state.pendingTurn;\n const duration = completedAt - requestedAt;\n\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const turnResponseEvent: TurnResponseEvent = {\n type: \"turn_response\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId,\n duration,\n usage,\n timestamp: completedAt,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn: null,\n },\n [turnResponseEvent],\n ];\n}\n\n/**\n * TurnTracker Processor Definition\n */\nexport const turnTrackerProcessorDef: ProcessorDefinition<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = {\n name: \"TurnTracker\",\n description: \"Tracks request-response turn pairs\",\n initialState: createInitialTurnTrackerState,\n processor: turnTrackerProcessor,\n};\n"],"mappings":"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","names":["shouldPreserveToolCalls","handleMessageStart","handleMessageStop","handleTextDelta","handleToolUseStart","handleToolUseStop","handleErrorReceived","generateId","handleMessageStop"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/types/event.ts"],"sourcesContent":["/**\n * Event Types - Stream, State, Message, and Turn Events\n *\n * This file defines all event types for the AgentEngine:\n * - Base EngineEvent type\n * - Stream Events: message_start, text_delta, tool_use_*, etc.\n * - State Events: conversation_*, tool_*, error_*\n * - Message Events: user_message, assistant_message, etc.\n * - Turn Events: turn_request, turn_response\n * - AgentOutput: Union of all output events\n *\n * @packageDocumentation\n */\n\nimport type {\n UserMessage,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n TokenUsage,\n} from \"./message\";\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\n/**\n * EngineEvent - Lightweight event base for AgentEngine domain\n *\n * EngineEvent is the simplified event structure used inside AgentEngine.\n * It only contains: type, timestamp, data\n *\n * This is a self-contained type without external dependencies.\n * All specific event types (StreamEvent, StateEvent, etc.) extend this base.\n */\nexport interface EngineEvent<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/**\n * @deprecated Use EngineEvent instead\n */\nexport type AgentEvent<T extends string = string, D = unknown> = EngineEvent<T, D>;\n\n// =============================================================================\n// Agent State\n// =============================================================================\n\n/**\n * AgentState\n *\n * Agent conversation states for fine-grained monitoring.\n *\n * State transitions:\n * ```\n * idle -> thinking -> responding -> idle\n * |\n * planning_tool -> awaiting_tool_result\n * |\n * thinking -> responding -> idle\n *\n * Any state can transition to error:\n * thinking/responding/planning_tool/awaiting_tool_result -> error -> idle\n * ```\n */\nexport type AgentState =\n | \"idle\" // Waiting for user input\n | \"thinking\" // LLM is thinking\n | \"responding\" // LLM is generating response\n | \"planning_tool\" // Generating tool call parameters\n | \"awaiting_tool_result\" // Waiting for tool execution result\n | \"error\"; // Error occurred during processing\n\n// =============================================================================\n// Agent Error\n// =============================================================================\n\n/**\n * Error category\n */\nexport type AgentErrorCategory =\n | \"network\" // Network/API errors\n | \"validation\" // Input validation errors\n | \"system\" // Internal system errors\n | \"business\"; // Business logic errors\n\n/**\n * AgentError - Standardized error structure\n */\nexport interface AgentError {\n /**\n * Error category\n */\n category: AgentErrorCategory;\n\n /**\n * Error code (e.g., \"NETWORK_TIMEOUT\", \"INVALID_INPUT\")\n */\n code: string;\n\n /**\n * Human-readable error message\n */\n message: string;\n\n /**\n * Whether the error is recoverable\n */\n recoverable: boolean;\n\n /**\n * Original error (if any)\n */\n cause?: Error;\n\n /**\n * Additional context\n */\n context?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Stream Events\n// =============================================================================\n\n/**\n * Stop reason for message completion\n */\nexport type StopReason = \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n\n// --- Stream Event Data Types ---\n\nexport interface MessageStartData {\n messageId: string;\n model: string;\n}\n\nexport interface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface MessageStopData {\n stopReason?: StopReason;\n}\n\nexport interface TextDeltaData {\n text: string;\n}\n\nexport interface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\nexport interface InputJsonDeltaData {\n partialJson: string;\n}\n\nexport interface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolResultData {\n toolCallId: string;\n result: unknown;\n isError?: boolean;\n}\n\nexport interface ErrorReceivedData {\n message: string;\n errorCode?: string;\n}\n\n// --- Stream Event Types ---\n\nexport type MessageStartEvent = EngineEvent<\"message_start\", MessageStartData>;\nexport type MessageDeltaEvent = EngineEvent<\"message_delta\", MessageDeltaData>;\nexport type MessageStopEvent = EngineEvent<\"message_stop\", MessageStopData>;\nexport type TextDeltaEvent = EngineEvent<\"text_delta\", TextDeltaData>;\nexport type ToolUseStartEvent = EngineEvent<\"tool_use_start\", ToolUseStartData>;\nexport type InputJsonDeltaEvent = EngineEvent<\"input_json_delta\", InputJsonDeltaData>;\nexport type ToolUseStopEvent = EngineEvent<\"tool_use_stop\", ToolUseStopData>;\nexport type ToolResultEvent = EngineEvent<\"tool_result\", ToolResultData>;\nexport type ErrorReceivedEvent = EngineEvent<\"error_received\", ErrorReceivedData>;\n\n/**\n * StreamEvent - All lightweight stream events\n */\nexport type StreamEvent =\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageStopEvent\n | TextDeltaEvent\n | ToolUseStartEvent\n | InputJsonDeltaEvent\n | ToolUseStopEvent\n | ToolResultEvent\n | ErrorReceivedEvent;\n\n/**\n * StreamEventType - String literal union\n */\nexport type StreamEventType = StreamEvent[\"type\"];\n\n// =============================================================================\n// State Events\n// =============================================================================\n\n// --- State Event Data Types ---\n\nexport interface ConversationQueuedData {\n messageId: string;\n}\n\nexport interface ConversationStartData {\n messageId: string;\n}\n\nexport interface ConversationThinkingData {\n // Empty\n}\n\nexport interface ConversationRespondingData {\n // Empty\n}\n\nexport interface ConversationEndData {\n reason: \"completed\" | \"interrupted\" | \"error\";\n}\n\nexport interface ConversationInterruptedData {\n reason: string;\n}\n\nexport interface ToolPlannedData {\n toolId: string;\n toolName: string;\n}\n\nexport interface ToolExecutingData {\n toolId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolCompletedData {\n toolId: string;\n toolName: string;\n result: unknown;\n}\n\nexport interface ToolFailedData {\n toolId: string;\n toolName: string;\n error: string;\n}\n\nexport interface ErrorOccurredData {\n code: string;\n message: string;\n recoverable: boolean;\n category?: string;\n}\n\n/**\n * StateEvent - Base type for state events\n * @deprecated Use specific event types instead\n */\nexport interface StateEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- State Event Types ---\n\nexport type ConversationQueuedEvent = EngineEvent<\"conversation_queued\", ConversationQueuedData>;\nexport type ConversationStartEvent = EngineEvent<\"conversation_start\", ConversationStartData>;\nexport type ConversationThinkingEvent = EngineEvent<\n \"conversation_thinking\",\n ConversationThinkingData\n>;\nexport type ConversationRespondingEvent = EngineEvent<\n \"conversation_responding\",\n ConversationRespondingData\n>;\nexport type ConversationEndEvent = EngineEvent<\"conversation_end\", ConversationEndData>;\nexport type ConversationInterruptedEvent = EngineEvent<\n \"conversation_interrupted\",\n ConversationInterruptedData\n>;\nexport type ToolPlannedEvent = EngineEvent<\"tool_planned\", ToolPlannedData>;\nexport type ToolExecutingEvent = EngineEvent<\"tool_executing\", ToolExecutingData>;\nexport type ToolCompletedEvent = EngineEvent<\"tool_completed\", ToolCompletedData>;\nexport type ToolFailedEvent = EngineEvent<\"tool_failed\", ToolFailedData>;\nexport type ErrorOccurredEvent = EngineEvent<\"error_occurred\", ErrorOccurredData>;\n\n/**\n * Alias for ErrorOccurredEvent (legacy compatibility)\n */\nexport type AgentErrorOccurredEvent = ErrorOccurredEvent;\n\n/**\n * AgentStateEvent - All lightweight state events\n */\nexport type AgentStateEvent =\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 * Type guard: is this a state event?\n */\nexport function isStateEvent(event: EngineEvent): event is AgentStateEvent {\n const stateTypes = [\n \"conversation_queued\",\n \"conversation_start\",\n \"conversation_thinking\",\n \"conversation_responding\",\n \"conversation_end\",\n \"conversation_interrupted\",\n \"tool_planned\",\n \"tool_executing\",\n \"tool_completed\",\n \"tool_failed\",\n \"error_occurred\",\n ];\n return stateTypes.includes(event.type);\n}\n\n// =============================================================================\n// Message Events\n// =============================================================================\n\n/**\n * MessageEvent - Base type for message events\n * @deprecated Use specific event types instead\n */\nexport interface MessageEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- Message Event Types ---\n\nexport type UserMessageEvent = EngineEvent<\"user_message\", UserMessage>;\nexport type AssistantMessageEvent = EngineEvent<\"assistant_message\", AssistantMessage>;\nexport type ToolCallMessageEvent = EngineEvent<\"tool_call_message\", ToolCallMessage>;\nexport type ToolResultMessageEvent = EngineEvent<\"tool_result_message\", ToolResultMessage>;\nexport type ErrorMessageEvent = EngineEvent<\"error_message\", ErrorMessage>;\n\n/**\n * AgentMessageEvent - All lightweight message events\n */\nexport type AgentMessageEvent =\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Type guard: is this a message event?\n */\nexport function isMessageEvent(event: EngineEvent): event is AgentMessageEvent {\n const messageTypes = [\n \"user_message\",\n \"assistant_message\",\n \"tool_call_message\",\n \"tool_result_message\",\n \"error_message\",\n ];\n return messageTypes.includes(event.type);\n}\n\n// =============================================================================\n// Turn Events\n// =============================================================================\n\n// --- Turn Event Data Types ---\n\nexport interface TurnRequestData {\n turnId: string;\n messageId: string;\n content: string;\n timestamp: number;\n}\n\nexport interface TurnResponseData {\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 * TurnEvent - Base type for turn events\n * @deprecated Use specific event types instead\n */\nexport interface TurnEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- Turn Event Types ---\n\nexport type TurnRequestEvent = EngineEvent<\"turn_request\", TurnRequestData>;\nexport type TurnResponseEvent = EngineEvent<\"turn_response\", TurnResponseData>;\n\n/**\n * AgentTurnEvent - All lightweight turn events\n */\nexport type AgentTurnEvent = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isTurnEvent(event: EngineEvent): event is AgentTurnEvent {\n const turnTypes = [\"turn_request\", \"turn_response\"];\n return turnTypes.includes(event.type);\n}\n\n// =============================================================================\n// Agent Output\n// =============================================================================\n\n/**\n * AgentOutput - Union of all possible agent output events\n *\n * Includes all event layers:\n * - Stream: Real-time streaming events from Driver\n * - State: State machine transitions\n * - Message: Assembled messages\n * - Turn: Turn analytics\n */\nexport type AgentOutput = StreamEvent | AgentStateEvent | AgentMessageEvent | AgentTurnEvent;\n\n// =============================================================================\n// Event Handling Types\n// =============================================================================\n\n/**\n * Unsubscribe function returned by on()\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Agent output event callback function type\n */\nexport type AgentOutputCallback<T extends AgentOutput = AgentOutput> = (event: T) => void;\n\n/**\n * @deprecated Use AgentOutputCallback instead\n */\nexport type AgentEventHandler<T extends AgentOutput = AgentOutput> = AgentOutputCallback<T>;\n"],"mappings":";AAmVO,SAAS,aAAa,OAA8C;AACzE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,WAAW,SAAS,MAAM,IAAI;AACvC;AAiCO,SAAS,eAAe,OAAgD;AAC7E,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,aAAa,SAAS,MAAM,IAAI;AACzC;AA4CO,SAAS,YAAY,OAA6C;AACvE,QAAM,YAAY,CAAC,gBAAgB,eAAe;AAClD,SAAO,UAAU,SAAS,MAAM,IAAI;AACtC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/engine/AgentProcessor.ts","../src/agent/engine/MealyMachine.ts","../src/agent/AgentStateMachine.ts","../src/agent/createAgent.ts"],"sourcesContent":["/**\n * AgentProcessor\n *\n * Combined Mealy processor for the full AgentX engine.\n * Composes MessageAssembler, StateMachine, and TurnTracker processors.\n */\n\nimport { combineProcessors, combineInitialStates, type Processor } from \"./mealy\";\n// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)\n// They flow through the system but AgentProcessor doesn't need to import them directly\nimport {\n messageAssemblerProcessor,\n stateEventProcessor,\n turnTrackerProcessor,\n createInitialMessageAssemblerState,\n createInitialStateEventProcessorContext,\n createInitialTurnTrackerState,\n type MessageAssemblerState,\n type StateEventProcessorContext,\n type TurnTrackerState,\n type MessageAssemblerOutput,\n type StateEventProcessorOutput,\n type TurnTrackerOutput,\n} from \"./internal\";\nimport type { AgentOutput } from \"../types\";\n\n/**\n * Combined state type for the full agent engine\n */\nexport type AgentEngineState = {\n messageAssembler: MessageAssemblerState;\n stateEventProcessor: StateEventProcessorContext;\n turnTracker: TurnTrackerState;\n};\n\n/**\n * Input event type for AgentProcessor\n *\n * Accepts:\n * - StreamEventType: Raw stream events from Driver\n * - MessageEventType: Re-injected message events (for TurnTracker)\n *\n * Note: AgentOutput is used because re-injected events can be any output type\n */\nexport type AgentProcessorInput = AgentOutput;\n\n/**\n * Output event type from AgentProcessor\n *\n * Produces:\n * - MessageAssemblerOutput: Assembled message events\n * - StateEventProcessorOutput: State transition events\n * - TurnTrackerOutput: Turn analytics events\n *\n * Note: StreamEventType is NOT in output - it's passed through by AgentEngine\n */\nexport type AgentProcessorOutput =\n | MessageAssemblerOutput\n | StateEventProcessorOutput\n | TurnTrackerOutput;\n\n/**\n * Combined processor for the full agent engine\n *\n * This combines:\n * - MessageAssembler: Stream → Message events\n * - StateEventProcessor: Stream → State events\n * - TurnTracker: Message → Turn events\n *\n * Pattern: (state, input) => [newState, outputs]\n * Key insight: State is means, outputs are the goal (Mealy Machine)\n *\n * Note: Raw StreamEvents are NOT output by this processor.\n * The AgentEngine handles pass-through of original events.\n */\nexport const agentProcessor: Processor<\n AgentEngineState,\n AgentProcessorInput,\n AgentProcessorOutput\n> = combineProcessors<AgentEngineState, AgentProcessorInput, AgentProcessorOutput>({\n messageAssembler: messageAssemblerProcessor as unknown as Processor<\n AgentEngineState[\"messageAssembler\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n stateEventProcessor: stateEventProcessor as unknown as Processor<\n AgentEngineState[\"stateEventProcessor\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n turnTracker: turnTrackerProcessor as unknown as Processor<\n AgentEngineState[\"turnTracker\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n});\n\n/**\n * Initial state factory for the full agent engine\n */\nexport const createInitialAgentEngineState: () => AgentEngineState =\n combineInitialStates<AgentEngineState>({\n messageAssembler: createInitialMessageAssemblerState,\n stateEventProcessor: createInitialStateEventProcessorContext,\n turnTracker: createInitialTurnTrackerState,\n });\n","/**\n * MealyMachine - Pure Mealy Machine Event Processor\n *\n * MealyMachine is a stateless event processor that transforms StreamEvents\n * into higher-level events (state, message, turn events).\n *\n * Key Design:\n * - Engine is a pure Mealy Machine: process(agentId, event) → outputs\n * - Engine does NOT hold driver or presenters (those belong to AgentEngine layer)\n * - Engine manages intermediate processing state per agentId\n * - Multiple agents can share the same MealyMachine instance\n *\n * Type Relationship:\n * ```\n * StreamEvent (from Driver)\n * │\n * └── message_start, text_delta, tool_use_start, message_stop...\n * ↓ MealyMachine processes\n * AgentOutput (to AgentEngine/Presenter)\n * │\n * ├── StateEvent (conversation_start, conversation_end...)\n * ├── MessageEvent (assistant_message, tool_call_message...)\n * └── TurnEvent (turn_request, turn_response)\n * ```\n *\n * State Management:\n * - Processing state (pendingContents, etc.) is managed internally per agentId\n * - Business data persistence is NOT handled here - that's AgentEngine layer's job\n *\n * Usage:\n * ```typescript\n * const machine = new MealyMachine();\n *\n * // AgentEngine layer coordinates:\n * // 1. Driver produces StreamEvents\n * // 2. MealyMachine processes events\n * // 3. Presenters handle outputs\n *\n * for await (const streamEvent of driver.receive(message)) {\n * const outputs = machine.process(agentId, streamEvent);\n * for (const output of outputs) {\n * presenters.forEach(p => p.present(agentId, output));\n * }\n * }\n * ```\n */\n\nimport {\n agentProcessor,\n createInitialAgentEngineState,\n type AgentEngineState,\n} from \"./AgentProcessor\";\nimport { MemoryStore } from \"./mealy\";\nimport type { AgentOutput, StreamEvent } from \"../types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"engine/MealyMachine\");\n\n/**\n * MealyMachine - Pure Mealy Machine for event processing\n *\n * - Input: StreamEvent (from Driver)\n * - Output: AgentOutput[] (state, message, turn events)\n * - State: Managed internally per agentId\n */\nexport class MealyMachine {\n private readonly store: MemoryStore<AgentEngineState>;\n\n constructor() {\n this.store = new MemoryStore<AgentEngineState>();\n logger.debug(\"MealyMachine initialized\");\n }\n\n /**\n * Process a single driveable event and return output events\n *\n * This is the core Mealy Machine operation:\n * process(agentId, event) → outputs[]\n *\n * @param agentId - The agent identifier (for state isolation)\n * @param event - StreamEvent to process\n * @returns Array of output events (state, message, turn events)\n */\n process(agentId: string, event: StreamEvent): AgentOutput[] {\n const eventType = (event as { type?: string }).type || \"unknown\";\n logger.debug(\"Processing event\", { agentId, eventType });\n\n // Get current state or create initial state\n const isNewState = !this.store.has(agentId);\n let state = this.store.get(agentId) ?? createInitialAgentEngineState();\n\n if (isNewState) {\n logger.debug(\"Created initial state for agent\", { agentId });\n }\n\n // Collect all outputs\n const allOutputs: AgentOutput[] = [];\n\n // Pass-through: original stream event is also an output\n allOutputs.push(event);\n\n // Process through Mealy Machine\n const [newState, outputs] = agentProcessor(state, event);\n state = newState;\n\n // Collect processor outputs\n for (const output of outputs) {\n allOutputs.push(output);\n\n // Re-inject for event chaining (e.g., TurnTracker needs MessageEvents)\n const [chainedState, chainedOutputs] = this.processChained(state, output);\n state = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n // Store updated state\n this.store.set(agentId, state);\n\n if (outputs.length > 0) {\n logger.debug(\"Produced outputs\", {\n agentId,\n inputEvent: eventType,\n outputCount: allOutputs.length,\n processorOutputs: outputs.length,\n });\n }\n\n return allOutputs;\n }\n\n /**\n * Process chained events recursively\n *\n * Some processors produce events that trigger other processors:\n * - MessageAssembler produces MessageEvents\n * - TurnTracker consumes MessageEvents to produce TurnEvents\n */\n private processChained(\n state: AgentEngineState,\n event: AgentOutput\n ): [AgentEngineState, AgentOutput[]] {\n const [newState, outputs] = agentProcessor(state, event);\n\n if (outputs.length === 0) {\n return [newState, []];\n }\n\n // Process outputs recursively\n const allOutputs: AgentOutput[] = [...outputs];\n let currentState = newState;\n\n for (const output of outputs) {\n const [chainedState, chainedOutputs] = this.processChained(currentState, output);\n currentState = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n return [currentState, allOutputs];\n }\n\n /**\n * Clear state for an agent\n *\n * Call this when an agent is destroyed to free memory.\n */\n clearState(agentId: string): void {\n logger.debug(\"Clearing state\", { agentId });\n this.store.delete(agentId);\n }\n\n /**\n * Check if state exists for an agent\n */\n hasState(agentId: string): boolean {\n return this.store.has(agentId);\n }\n}\n\n/**\n * Factory function to create MealyMachine\n */\nexport function createMealyMachine(): MealyMachine {\n return new MealyMachine();\n}\n","/**\n * AgentStateMachine - State management driven by StateEvents\n *\n * Manages agent state transitions driven by StateEvents.\n * Single source of truth for agent state in AgentEngine.\n *\n * Flow:\n * StreamEvent → MealyMachine → StateEvent → AgentStateMachine → state update\n *\n * Responsibilities:\n * - Process StateEvents\n * - Maintain current AgentState\n * - Notify state change subscribers\n */\n\nimport type {\n AgentState,\n StateChange,\n StateChangeHandler,\n AgentOutput,\n Unsubscribe,\n} from \"./types\";\nimport { isStateEvent } from \"./types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"agent/AgentStateMachine\");\n\n/**\n * AgentStateMachine implementation\n */\nexport class AgentStateMachine {\n private _state: AgentState = \"idle\";\n private readonly handlers = new Set<StateChangeHandler>();\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this._state;\n }\n\n /**\n * Process an event and update internal state if it's a StateEvent\n *\n * @param event - Event from MealyMachine (could be any AgentOutput)\n */\n process(event: AgentOutput): void {\n // Only process StateEvents\n if (!isStateEvent(event)) {\n return;\n }\n\n const prev = this._state;\n const next = this.mapEventToState(event);\n\n if (next !== null && prev !== next) {\n this._state = next;\n logger.debug(\"State transition\", {\n eventType: event.type,\n from: prev,\n to: next,\n });\n this.notifyHandlers({ prev, current: next });\n }\n }\n\n /**\n * Subscribe to state changes\n *\n * @param handler - Callback receiving { prev, current } state change\n * @returns Unsubscribe function\n */\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n this.handlers.add(handler);\n return () => {\n this.handlers.delete(handler);\n };\n }\n\n /**\n * Reset state machine (used on destroy)\n */\n reset(): void {\n const prev = this._state;\n this._state = \"idle\";\n\n // Notify handlers of reset to idle\n if (prev !== \"idle\") {\n this.notifyHandlers({ prev, current: \"idle\" });\n }\n\n this.handlers.clear();\n }\n\n /**\n * Map StateEvent type to AgentState\n *\n * @param event - StateEvent from MealyMachine\n * @returns New AgentState or null if no transition needed\n */\n private mapEventToState(event: AgentOutput): AgentState | null {\n switch (event.type) {\n // Conversation lifecycle\n case \"conversation_start\":\n return \"thinking\";\n case \"conversation_thinking\":\n return \"thinking\";\n case \"conversation_responding\":\n return \"responding\";\n case \"conversation_end\":\n return \"idle\";\n case \"conversation_interrupted\":\n return \"idle\";\n\n // Tool lifecycle\n case \"tool_planned\":\n return \"planning_tool\";\n case \"tool_executing\":\n return \"awaiting_tool_result\";\n case \"tool_completed\":\n return \"responding\";\n case \"tool_failed\":\n return \"responding\";\n\n // Error\n case \"error_occurred\":\n return \"error\";\n\n default:\n // Unknown event type, no state change\n return null;\n }\n }\n\n /**\n * Notify all registered handlers of state change\n */\n private notifyHandlers(change: StateChange): void {\n for (const handler of this.handlers) {\n try {\n handler(change);\n } catch (error) {\n logger.error(\"State change handler error\", {\n from: change.prev,\n to: change.current,\n error,\n });\n }\n }\n }\n}\n","/**\n * createAgent - Factory function to create an AgentEngine\n *\n * Creates an AgentEngine connected to EventBus:\n * - receive() emits user_message to EventBus\n * - Source subscribes to StreamEvent from EventBus\n * - Presenter emits AgentOutput to EventBus\n *\n * ```\n * EventBus\n * ↗ ↘\n * emit │ │ emit\n * user_message │ │ AgentOutput\n * ↑ │ │ ↑\n * ┌─────────────────────────────────────────────────────────────┐\n * │ AgentEngine │\n * │ │\n * │ receive() ──► Source ──► MealyMachine ──► Presenter │\n * │ (sub) (pub) │\n * └─────────────────────────────────────────────────────────────┘\n * ```\n */\n\nimport type {\n AgentEngine,\n AgentState,\n AgentOutputCallback,\n UserMessage,\n MessageQueue,\n StateChangeHandler,\n EventHandlerMap,\n ReactHandlerMap,\n AgentOutput,\n CreateAgentOptions,\n AgentSource,\n AgentPresenter,\n AgentEventBus,\n StreamEvent,\n Unsubscribe,\n AgentMiddleware,\n AgentInterceptor,\n} from \"./types\";\nimport { MealyMachine } from \"./engine/MealyMachine\";\nimport { AgentStateMachine } from \"./AgentStateMachine\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { isDriveableEvent } from \"../event\";\n\nconst logger = createLogger(\"agent/AgentEngine\");\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * StreamEvent types that Source should subscribe to\n */\nconst STREAM_EVENT_TYPES = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_delta\",\n \"tool_use_start\",\n \"input_json_delta\",\n \"tool_use_stop\",\n \"tool_result\",\n \"error_received\",\n];\n\n/**\n * Default Source implementation\n * Subscribes to StreamEvent from EventBus\n */\nclass DefaultSource implements AgentSource {\n readonly name = \"DefaultSource\";\n private unsubscribes: Unsubscribe[] = [];\n\n constructor(\n private readonly bus: AgentEventBus,\n private readonly agentId: string\n ) {}\n\n connect(onEvent: (event: StreamEvent) => void): void {\n // Subscribe to each StreamEvent type\n for (const type of STREAM_EVENT_TYPES) {\n const unsub = this.bus.on(type, (event: unknown) => {\n // Only process DriveableEvents (source: \"driver\", category: \"stream\")\n // This prevents circular processing of AgentOutput events\n if (!isDriveableEvent(event as { source?: string; category?: string })) {\n return;\n }\n\n // Filter by agentId if present in context\n const e = event as { context?: { agentId?: string } };\n if (e.context?.agentId && e.context.agentId !== this.agentId) {\n return;\n }\n onEvent(event as StreamEvent);\n });\n this.unsubscribes.push(unsub);\n }\n\n logger.debug(\"DefaultSource connected\", { agentId: this.agentId });\n }\n\n disconnect(): void {\n for (const unsub of this.unsubscribes) {\n unsub();\n }\n this.unsubscribes = [];\n logger.debug(\"DefaultSource disconnected\", { agentId: this.agentId });\n }\n}\n\n/**\n * Default Presenter implementation\n * Emits AgentOutput to EventBus\n */\nclass DefaultPresenter implements AgentPresenter {\n readonly name = \"DefaultPresenter\";\n\n constructor(private readonly bus: AgentEventBus) {}\n\n present(agentId: string, output: AgentOutput): void {\n // Emit to EventBus with agent context\n this.bus.emit({\n ...output,\n source: \"agent\",\n context: { agentId },\n });\n }\n}\n\n/**\n * Simple MessageQueue implementation\n */\nclass SimpleMessageQueue implements MessageQueue {\n private queue: UserMessage[] = [];\n\n get length(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n enqueue(message: UserMessage): void {\n this.queue.push(message);\n }\n\n dequeue(): UserMessage | undefined {\n return this.queue.shift();\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * AgentEngineImpl - EventBus-based AgentEngine implementation\n */\nclass AgentEngineImpl implements AgentEngine {\n readonly agentId: string;\n readonly createdAt: number;\n readonly messageQueue: MessageQueue;\n\n private readonly _messageQueue = new SimpleMessageQueue();\n private readonly bus: AgentEventBus;\n private readonly source: AgentSource;\n private readonly presenter: AgentPresenter;\n private readonly machine: MealyMachine;\n private readonly stateMachine: AgentStateMachine;\n\n private readonly handlers: Set<AgentOutputCallback> = new Set();\n private readonly typeHandlers: Map<string, Set<AgentOutputCallback>> = new Map();\n private readonly readyHandlers: Set<() => void> = new Set();\n private readonly destroyHandlers: Set<() => void> = new Set();\n private readonly middlewares: AgentMiddleware[] = [];\n private readonly interceptors: AgentInterceptor[] = [];\n\n private isDestroyed = false;\n\n constructor(options: CreateAgentOptions) {\n this.agentId = options.agentId ?? generateAgentId();\n this.createdAt = Date.now();\n this.messageQueue = this._messageQueue;\n this.bus = options.bus;\n this.machine = new MealyMachine();\n this.stateMachine = new AgentStateMachine();\n\n // Use provided Source/Presenter or create defaults\n this.source = options.source ?? new DefaultSource(this.bus, this.agentId);\n this.presenter = options.presenter ?? new DefaultPresenter(this.bus);\n\n // Connect Source to receive StreamEvents\n this.source.connect((event) => this.handleStreamEvent(event));\n\n logger.debug(\"AgentEngine created\", { agentId: this.agentId });\n }\n\n get state(): AgentState {\n return this.stateMachine.state;\n }\n\n async receive(message: string | UserMessage): Promise<void> {\n if (this.isDestroyed) {\n throw new Error(\"Cannot receive message on destroyed agent\");\n }\n\n const userMessage: UserMessage =\n typeof message === \"string\"\n ? {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content: message,\n timestamp: Date.now(),\n }\n : message;\n\n logger.debug(\"Receiving message\", { messageId: userMessage.id });\n\n // Run through middleware chain\n let processedMessage = userMessage;\n for (const middleware of this.middlewares) {\n let nextCalled = false;\n await middleware(processedMessage, async (msg) => {\n nextCalled = true;\n processedMessage = msg;\n });\n if (!nextCalled) {\n logger.debug(\"Middleware blocked message\", { messageId: userMessage.id });\n return;\n }\n }\n\n // Emit user_message to EventBus\n // This triggers Driver to send to LLM\n this.bus.emit({\n type: \"user_message\",\n timestamp: Date.now(),\n source: \"agent\",\n data: processedMessage,\n context: { agentId: this.agentId },\n });\n\n logger.debug(\"user_message emitted to EventBus\", { messageId: userMessage.id });\n }\n\n /**\n * Handle a stream event (called by Source)\n */\n handleStreamEvent(event: StreamEvent): void {\n if (this.isDestroyed) return;\n\n logger.debug(\"handleStreamEvent\", { type: event.type });\n\n // Process through MealyMachine\n const outputs = this.machine.process(this.agentId, event);\n\n logger.debug(\"MealyMachine outputs\", {\n count: outputs.length,\n types: outputs.map((o) => o.type),\n });\n\n // Emit all outputs\n for (const output of outputs) {\n this.stateMachine.process(output);\n this.emitOutput(output);\n }\n }\n\n private emitOutput(output: AgentOutput): void {\n // Run through interceptor chain\n let currentOutput: AgentOutput | null = output;\n\n const runInterceptor = (index: number, out: AgentOutput): void => {\n if (index >= this.interceptors.length) {\n currentOutput = out;\n return;\n }\n this.interceptors[index](out, (nextOut) => {\n runInterceptor(index + 1, nextOut);\n });\n };\n\n runInterceptor(0, output);\n if (!currentOutput) return;\n\n // Send to presenter (emits to EventBus)\n this.presenter.present(this.agentId, currentOutput);\n\n // Notify local handlers\n for (const handler of this.handlers) {\n try {\n handler(currentOutput);\n } catch (e) {\n logger.error(\"Event handler error\", { error: e });\n }\n }\n\n // Notify type-specific handlers\n const typeSet = this.typeHandlers.get(currentOutput.type);\n if (typeSet) {\n for (const handler of typeSet) {\n try {\n handler(currentOutput);\n } catch (e) {\n logger.error(\"Event handler error\", { error: e });\n }\n }\n }\n }\n\n on(handler: AgentOutputCallback): Unsubscribe;\n on(handlers: EventHandlerMap): Unsubscribe;\n on(type: string, handler: AgentOutputCallback): Unsubscribe;\n on(types: string[], handler: AgentOutputCallback): Unsubscribe;\n on(\n typeOrHandler: string | string[] | AgentOutputCallback | EventHandlerMap,\n handler?: AgentOutputCallback\n ): Unsubscribe {\n if (typeof typeOrHandler === \"function\") {\n this.handlers.add(typeOrHandler);\n return () => this.handlers.delete(typeOrHandler);\n }\n\n if (typeof typeOrHandler === \"object\" && !Array.isArray(typeOrHandler)) {\n const unsubscribes: Unsubscribe[] = [];\n for (const [type, h] of Object.entries(typeOrHandler)) {\n if (h) {\n unsubscribes.push(this.on(type, h));\n }\n }\n return () => unsubscribes.forEach((u) => u());\n }\n\n const types = Array.isArray(typeOrHandler) ? typeOrHandler : [typeOrHandler];\n const h = handler!;\n\n for (const type of types) {\n if (!this.typeHandlers.has(type)) {\n this.typeHandlers.set(type, new Set());\n }\n this.typeHandlers.get(type)!.add(h);\n }\n\n return () => {\n for (const type of types) {\n this.typeHandlers.get(type)?.delete(h);\n }\n };\n }\n\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n return this.stateMachine.onStateChange(handler);\n }\n\n react(handlers: ReactHandlerMap): Unsubscribe {\n const eventHandlerMap: EventHandlerMap = {};\n for (const [key, handler] of Object.entries(handlers)) {\n if (handler && key.startsWith(\"on\")) {\n const eventType = key\n .slice(2)\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .slice(1);\n eventHandlerMap[eventType] = handler;\n }\n }\n return this.on(eventHandlerMap);\n }\n\n onReady(handler: () => void): Unsubscribe {\n try {\n handler();\n } catch (e) {\n logger.error(\"onReady handler error\", { error: e });\n }\n this.readyHandlers.add(handler);\n return () => this.readyHandlers.delete(handler);\n }\n\n onDestroy(handler: () => void): Unsubscribe {\n this.destroyHandlers.add(handler);\n return () => this.destroyHandlers.delete(handler);\n }\n\n use(middleware: AgentMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n intercept(interceptor: AgentInterceptor): Unsubscribe {\n this.interceptors.push(interceptor);\n return () => {\n const index = this.interceptors.indexOf(interceptor);\n if (index >= 0) {\n this.interceptors.splice(index, 1);\n }\n };\n }\n\n interrupt(): void {\n if (this.state === \"idle\" || this.isDestroyed) {\n return;\n }\n\n // Emit interrupt event to EventBus\n this.bus.emit({\n type: \"interrupt_request\",\n timestamp: Date.now(),\n source: \"agent\",\n data: {},\n context: { agentId: this.agentId },\n });\n\n logger.debug(\"Interrupt requested\", { agentId: this.agentId });\n }\n\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n // Disconnect Source\n this.source.disconnect();\n\n // Notify destroy handlers\n for (const handler of this.destroyHandlers) {\n try {\n handler();\n } catch (e) {\n logger.error(\"onDestroy handler error\", { error: e });\n }\n }\n\n // Clear state\n this.machine.clearState(this.agentId);\n this.stateMachine.reset();\n\n this._messageQueue.clear();\n this.handlers.clear();\n this.typeHandlers.clear();\n this.readyHandlers.clear();\n this.destroyHandlers.clear();\n this.middlewares.length = 0;\n this.interceptors.length = 0;\n\n logger.debug(\"AgentEngine destroyed\", { agentId: this.agentId });\n }\n}\n\n/**\n * Create an AgentEngine instance connected to EventBus\n */\nexport function createAgent(options: CreateAgentOptions): AgentEngine {\n return new AgentEngineImpl(options);\n}\n"],"mappings":"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","names":["createLogger","logger","createLogger","logger","createLogger","h"]}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace Types
|
|
3
|
-
*
|
|
4
|
-
* Workspace is an abstraction for isolated working environments.
|
|
5
|
-
* Different platforms provide different implementations:
|
|
6
|
-
* - Node.js: File system based (local directories)
|
|
7
|
-
* - Cloudflare: R2/KV based (cloud storage)
|
|
8
|
-
* - Browser: IndexedDB/Memory based
|
|
9
|
-
*
|
|
10
|
-
* Architecture:
|
|
11
|
-
* ```
|
|
12
|
-
* ┌─────────────────────────────────────────────────────────┐
|
|
13
|
-
* │ core/workspace │
|
|
14
|
-
* │ ┌─────────────────────────────────────────────────────┐│
|
|
15
|
-
* │ │ Workspace (interface) ││
|
|
16
|
-
* │ │ WorkspaceProvider (interface) ││
|
|
17
|
-
* │ └─────────────────────────────────────────────────────┘│
|
|
18
|
-
* └─────────────────────────────────────────────────────────┘
|
|
19
|
-
* │
|
|
20
|
-
* ┌────────────────┼────────────────┐
|
|
21
|
-
* ▼ ▼ ▼
|
|
22
|
-
* ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
23
|
-
* │ platform-node│ │platform-cf │ │platform-web │
|
|
24
|
-
* │ FileWorkspace│ │ R2Workspace │ │ IDBWorkspace │
|
|
25
|
-
* └──────────────┘ └──────────────┘ └──────────────┘
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Workspace - Isolated working environment for an Agent
|
|
30
|
-
*
|
|
31
|
-
* Provides a location abstraction for Agent file operations.
|
|
32
|
-
* The actual storage mechanism depends on platform implementation.
|
|
33
|
-
*/
|
|
34
|
-
interface Workspace {
|
|
35
|
-
/**
|
|
36
|
-
* Unique workspace identifier
|
|
37
|
-
*/
|
|
38
|
-
readonly id: string;
|
|
39
|
-
/**
|
|
40
|
-
* Human-readable workspace name
|
|
41
|
-
*/
|
|
42
|
-
readonly name: string;
|
|
43
|
-
/**
|
|
44
|
-
* Workspace path or URI
|
|
45
|
-
*
|
|
46
|
-
* Platform-specific:
|
|
47
|
-
* - Node.js: Absolute file path (e.g., ~/.agentx/workspaces/xxx/)
|
|
48
|
-
* - Cloudflare: R2 bucket prefix (e.g., workspaces/xxx/)
|
|
49
|
-
* - Browser: IndexedDB store name
|
|
50
|
-
*/
|
|
51
|
-
readonly path: string;
|
|
52
|
-
/**
|
|
53
|
-
* Initialize workspace (create if not exists)
|
|
54
|
-
*/
|
|
55
|
-
initialize(): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Check if workspace exists
|
|
58
|
-
*/
|
|
59
|
-
exists(): Promise<boolean>;
|
|
60
|
-
/**
|
|
61
|
-
* Clean up workspace (optional, for temporary workspaces)
|
|
62
|
-
*/
|
|
63
|
-
cleanup?(): Promise<void>;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Configuration for creating a workspace
|
|
67
|
-
*/
|
|
68
|
-
interface WorkspaceCreateConfig {
|
|
69
|
-
/**
|
|
70
|
-
* Associated container ID
|
|
71
|
-
*/
|
|
72
|
-
containerId: string;
|
|
73
|
-
/**
|
|
74
|
-
* Associated image ID
|
|
75
|
-
*/
|
|
76
|
-
imageId: string;
|
|
77
|
-
/**
|
|
78
|
-
* Optional custom workspace name
|
|
79
|
-
*/
|
|
80
|
-
name?: string;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* WorkspaceProvider - Factory for creating workspaces
|
|
84
|
-
*
|
|
85
|
-
* Platform implementations provide this interface to create
|
|
86
|
-
* platform-specific workspaces.
|
|
87
|
-
*/
|
|
88
|
-
interface WorkspaceProvider {
|
|
89
|
-
/**
|
|
90
|
-
* Provider name (e.g., "file", "r2", "indexeddb")
|
|
91
|
-
*/
|
|
92
|
-
readonly type: string;
|
|
93
|
-
/**
|
|
94
|
-
* Create a new workspace
|
|
95
|
-
*/
|
|
96
|
-
create(config: WorkspaceCreateConfig): Promise<Workspace>;
|
|
97
|
-
/**
|
|
98
|
-
* Get an existing workspace by ID
|
|
99
|
-
*/
|
|
100
|
-
get(workspaceId: string): Promise<Workspace | null>;
|
|
101
|
-
/**
|
|
102
|
-
* List all workspaces for a container
|
|
103
|
-
*/
|
|
104
|
-
listByContainer(containerId: string): Promise<Workspace[]>;
|
|
105
|
-
/**
|
|
106
|
-
* Delete a workspace
|
|
107
|
-
*/
|
|
108
|
-
delete(workspaceId: string): Promise<void>;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export type { Workspace, WorkspaceCreateConfig, WorkspaceProvider };
|