@agentxjs/core 1.9.10-dev → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +342 -0
  2. package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
  3. package/dist/RpcClient-CMdhJxjS.d.ts +304 -0
  4. package/dist/agent/engine/internal/index.d.ts +22 -18
  5. package/dist/agent/engine/internal/index.js +1 -2
  6. package/dist/agent/engine/mealy/index.d.ts +4 -4
  7. package/dist/agent/engine/mealy/index.js +1 -2
  8. package/dist/agent/index.d.ts +92 -92
  9. package/dist/agent/index.js +16 -16
  10. package/dist/agent/types/index.d.ts +4 -4
  11. package/dist/agent/types/index.js +1 -2
  12. package/dist/bash/index.d.ts +29 -0
  13. package/dist/bash/index.js +7 -0
  14. package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
  15. package/dist/{chunk-E5FPOAPO.js → chunk-22NTRYNO.js} +60 -60
  16. package/dist/chunk-22NTRYNO.js.map +1 -0
  17. package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
  18. package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
  19. package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
  20. package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
  21. package/dist/chunk-BHOD5PKR.js +55 -0
  22. package/dist/chunk-BHOD5PKR.js.map +1 -0
  23. package/dist/chunk-FI7WQFGV.js +37 -0
  24. package/dist/chunk-FI7WQFGV.js.map +1 -0
  25. package/dist/{chunk-AT5P47YA.js → chunk-RWIYC65R.js} +115 -115
  26. package/dist/chunk-RWIYC65R.js.map +1 -0
  27. package/dist/chunk-SKS7S2RY.js +1 -0
  28. package/dist/{chunk-I7GYR3MN.js → chunk-TUFZ2YH6.js} +77 -91
  29. package/dist/chunk-TUFZ2YH6.js.map +1 -0
  30. package/dist/{chunk-K6WXQ2RW.js → chunk-YSZG6XIM.js} +1 -2
  31. package/dist/chunk-YSZG6XIM.js.map +1 -0
  32. package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
  33. package/dist/common/logger/index.js +14 -16
  34. package/dist/common/logger/index.js.map +1 -1
  35. package/dist/container/index.d.ts +3 -4
  36. package/dist/container/index.js +0 -2
  37. package/dist/container/index.js.map +1 -1
  38. package/dist/driver/index.d.ts +2 -310
  39. package/dist/event/index.d.ts +4 -4
  40. package/dist/event/index.js +2 -3
  41. package/dist/event/types/index.d.ts +202 -208
  42. package/dist/event/types/index.js +1 -2
  43. package/dist/{event-CDuTzs__.d.ts → event-DNsF9EkO.d.ts} +5 -8
  44. package/dist/image/index.d.ts +9 -5
  45. package/dist/image/index.js +5 -2
  46. package/dist/image/index.js.map +1 -1
  47. package/dist/index--gxNpY5W.d.ts +609 -0
  48. package/dist/index.d.ts +4 -4
  49. package/dist/index.js +17 -17
  50. package/dist/{message-BMrMm1pq.d.ts → message-Dn-I2vr0.d.ts} +10 -33
  51. package/dist/mq/index.d.ts +25 -25
  52. package/dist/mq/index.js +1 -3
  53. package/dist/mq/index.js.map +1 -1
  54. package/dist/network/index.d.ts +59 -347
  55. package/dist/network/index.js +30 -41
  56. package/dist/network/index.js.map +1 -1
  57. package/dist/persistence/index.d.ts +2 -155
  58. package/dist/platform/index.d.ts +76 -0
  59. package/dist/platform/index.js.map +1 -0
  60. package/dist/runtime/index.d.ts +26 -59
  61. package/dist/runtime/index.js +117 -33
  62. package/dist/runtime/index.js.map +1 -1
  63. package/dist/session/index.d.ts +4 -52
  64. package/dist/session/index.js +4 -51
  65. package/dist/session/index.js.map +1 -1
  66. package/dist/types-Cb8tKM6Y.d.ts +90 -0
  67. package/package.json +10 -5
  68. package/src/agent/AgentStateMachine.ts +2 -2
  69. package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
  70. package/src/agent/__tests__/createAgent.test.ts +4 -4
  71. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +301 -97
  72. package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
  73. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +59 -78
  74. package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
  75. package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
  76. package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
  77. package/src/agent/createAgent.ts +15 -15
  78. package/src/agent/engine/AgentProcessor.ts +7 -7
  79. package/src/agent/engine/MealyMachine.ts +4 -4
  80. package/src/agent/engine/internal/index.ts +11 -11
  81. package/src/agent/engine/internal/messageAssemblerProcessor.ts +113 -128
  82. package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
  83. package/src/agent/engine/internal/turnTrackerProcessor.ts +27 -31
  84. package/src/agent/engine/mealy/Mealy.ts +2 -2
  85. package/src/agent/engine/mealy/combinators.ts +10 -10
  86. package/src/agent/engine/mealy/index.ts +9 -11
  87. package/src/agent/index.ts +30 -32
  88. package/src/agent/types/engine.ts +3 -3
  89. package/src/agent/types/event.ts +4 -12
  90. package/src/agent/types/index.ts +86 -88
  91. package/src/agent/types/message.ts +9 -43
  92. package/src/bash/index.ts +21 -0
  93. package/src/bash/tool.ts +57 -0
  94. package/src/bash/types.ts +108 -0
  95. package/src/common/logger/ConsoleLogger.ts +1 -1
  96. package/src/common/logger/LoggerFactoryImpl.ts +14 -14
  97. package/src/common/logger/index.ts +3 -3
  98. package/src/container/index.ts +4 -5
  99. package/src/container/types.ts +1 -1
  100. package/src/driver/index.ts +15 -16
  101. package/src/driver/types.ts +201 -73
  102. package/src/event/EventBus.ts +10 -10
  103. package/src/event/__tests__/EventBus.test.ts +2 -2
  104. package/src/event/index.ts +2 -3
  105. package/src/event/types/agent.ts +186 -191
  106. package/src/event/types/bus.ts +1 -1
  107. package/src/event/types/command.ts +293 -264
  108. package/src/event/types/container.ts +207 -222
  109. package/src/event/types/driver.ts +153 -155
  110. package/src/event/types/index.ts +6 -12
  111. package/src/event/types/session.ts +117 -130
  112. package/src/image/Image.ts +12 -2
  113. package/src/image/index.ts +4 -5
  114. package/src/image/types.ts +8 -2
  115. package/src/mq/OffsetGenerator.ts +1 -1
  116. package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
  117. package/src/mq/index.ts +4 -5
  118. package/src/network/RpcClient.ts +26 -25
  119. package/src/network/index.ts +41 -44
  120. package/src/network/jsonrpc.ts +5 -5
  121. package/src/persistence/index.ts +5 -5
  122. package/src/persistence/types.ts +5 -2
  123. package/src/platform/index.ts +21 -0
  124. package/src/platform/types.ts +84 -0
  125. package/src/runtime/AgentXRuntime.ts +188 -61
  126. package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
  127. package/src/runtime/index.ts +12 -25
  128. package/src/runtime/types.ts +10 -62
  129. package/src/session/index.ts +2 -3
  130. package/dist/chunk-7D4SUZUM.js +0 -38
  131. package/dist/chunk-AT5P47YA.js.map +0 -1
  132. package/dist/chunk-E5FPOAPO.js.map +0 -1
  133. package/dist/chunk-I7GYR3MN.js.map +0 -1
  134. package/dist/chunk-K6WXQ2RW.js.map +0 -1
  135. package/dist/workspace/index.d.ts +0 -111
  136. package/dist/wrapper-Y3UTVU2E.js +0 -3635
  137. package/dist/wrapper-Y3UTVU2E.js.map +0 -1
  138. package/src/workspace/index.ts +0 -27
  139. package/src/workspace/types.ts +0 -131
  140. /package/dist/{workspace → bash}/index.js.map +0 -0
  141. /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
  142. /package/dist/{workspace → platform}/index.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/network/protocol.ts","../../src/network/jsonrpc.ts","../../src/network/RpcClient.ts"],"sourcesContent":["/**\n * Reliable Message Protocol\n *\n * Internal protocol for message acknowledgment between server and client.\n * This is transparent to the application layer.\n *\n * Flow:\n * 1. Server sends: { __msgId: \"xxx\", __payload: \"actual message\" }\n * 2. Client receives, extracts payload, sends: { __ack: \"xxx\" }\n * 3. Server receives ACK, triggers onAck callback\n */\n\n// ============================================================================\n// Protocol Types\n// ============================================================================\n\n/**\n * ReliableWrapper - Wrapper for reliable messages (server → client)\n *\n * Contains the original message payload with a unique ID for tracking.\n */\nexport interface ReliableWrapper {\n /** Unique message ID for tracking */\n __msgId: string;\n /** Original message payload */\n __payload: string;\n}\n\n/**\n * AckMessage - Acknowledgment message (client → server)\n *\n * Sent automatically by client when receiving a reliable message.\n */\nexport interface AckMessage {\n /** Message ID being acknowledged */\n __ack: string;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if data is a ReliableWrapper\n */\nexport function isReliableWrapper(data: unknown): data is ReliableWrapper {\n return typeof data === \"object\" && data !== null && \"__msgId\" in data && \"__payload\" in data;\n}\n\n/**\n * Check if data is an AckMessage\n */\nexport function isAckMessage(data: unknown): data is AckMessage {\n return typeof data === \"object\" && data !== null && \"__ack\" in data;\n}\n\n// ============================================================================\n// Protocol Helpers\n// ============================================================================\n\n/**\n * Wrap a message for reliable delivery\n */\nexport function wrapMessage(msgId: string, payload: string): ReliableWrapper {\n return { __msgId: msgId, __payload: payload };\n}\n\n/**\n * Create an ACK message\n */\nexport function createAck(msgId: string): AckMessage {\n return { __ack: msgId };\n}\n\n/**\n * Unwrap a reliable message, returning the original payload\n */\nexport function unwrapMessage(wrapper: ReliableWrapper): string {\n return wrapper.__payload;\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n","/**\n * JSON-RPC 2.0 Protocol for AgentX Network Communication\n *\n * Uses jsonrpc-lite for message parsing/serialization.\n *\n * Message Types:\n * - Request: Client → Server (has id, expects response)\n * - Response: Server → Client (success or error)\n * - Notification: Server → Client (no id, stream events)\n *\n * @see https://www.jsonrpc.org/specification\n */\n\nimport {\n request as jsonrpcRequest,\n notification as jsonrpcNotification,\n success as jsonrpcSuccess,\n error as jsonrpcError,\n parse as jsonrpcParse,\n parseObject as jsonrpcParseObject,\n JsonRpcError,\n} from \"jsonrpc-lite\";\nimport type { IParsedObject, JsonRpc } from \"jsonrpc-lite\";\nimport type { SystemEvent } from \"../event/types/base\";\n\n// ============================================================================\n// Re-export jsonrpc-lite types and functions\n// ============================================================================\n\nexport { JsonRpcError };\nexport type { IParsedObject, JsonRpc };\n\n// ============================================================================\n// RPC Method Names\n// ============================================================================\n\n/**\n * All RPC method names supported by AgentX\n */\nexport type RpcMethod =\n // Container\n | \"container.create\"\n | \"container.get\"\n | \"container.list\"\n // Image\n | \"image.create\"\n | \"image.get\"\n | \"image.list\"\n | \"image.delete\"\n | \"image.run\"\n | \"image.stop\"\n | \"image.update\"\n | \"image.messages\"\n // Agent\n | \"agent.get\"\n | \"agent.list\"\n | \"agent.destroy\"\n | \"agent.destroyAll\"\n | \"agent.interrupt\"\n // Message\n | \"message.send\";\n\n/**\n * Notification method names (server push)\n */\nexport type NotificationMethod =\n | \"stream.event\" // Stream events (text_delta, tool_call, etc.)\n | \"control.ack\"; // ACK for reliable delivery\n\n// ============================================================================\n// Request/Response Type Definitions\n// ============================================================================\n\n/**\n * JSON-RPC Request structure\n */\nexport interface RpcRequest<M extends RpcMethod = RpcMethod, P = unknown> {\n jsonrpc: \"2.0\";\n method: M;\n params: P;\n id: string | number;\n}\n\n/**\n * JSON-RPC Success Response structure\n */\nexport interface RpcSuccessResponse<R = unknown> {\n jsonrpc: \"2.0\";\n result: R;\n id: string | number;\n}\n\n/**\n * JSON-RPC Error Response structure\n */\nexport interface RpcErrorResponse {\n jsonrpc: \"2.0\";\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n id: string | number | null;\n}\n\n/**\n * JSON-RPC Notification structure (no id, no response expected)\n */\nexport interface RpcNotification<M extends NotificationMethod = NotificationMethod, P = unknown> {\n jsonrpc: \"2.0\";\n method: M;\n params: P;\n}\n\n/**\n * Stream event notification params\n */\nexport interface StreamEventParams {\n topic: string;\n event: SystemEvent;\n}\n\n/**\n * Control ACK notification params\n */\nexport interface ControlAckParams {\n msgId: string;\n}\n\n// ============================================================================\n// Standard JSON-RPC Error Codes\n// ============================================================================\n\nexport const RpcErrorCodes = {\n // Standard JSON-RPC errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n // Server errors (reserved: -32000 to -32099)\n SERVER_ERROR: -32000,\n // Application errors (custom)\n NOT_FOUND: 404,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n TIMEOUT: 408,\n} as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest(\n id: string | number,\n method: RpcMethod | string,\n params: unknown\n): JsonRpc {\n return jsonrpcRequest(id, method, params as Record<string, unknown>);\n}\n\n/**\n * Create a JSON-RPC notification (no response expected)\n */\nexport function createNotification(method: NotificationMethod | string, params: unknown): JsonRpc {\n return jsonrpcNotification(method, params as Record<string, unknown>);\n}\n\n/**\n * Create a stream event notification\n */\nexport function createStreamEvent(topic: string, event: SystemEvent): JsonRpc {\n return jsonrpcNotification(\"stream.event\", { topic, event });\n}\n\n/**\n * Create an ACK notification\n */\nexport function createAckNotification(msgId: string): JsonRpc {\n return jsonrpcNotification(\"control.ack\", { msgId });\n}\n\n/**\n * Create a success response\n */\nexport function createSuccessResponse(id: string | number, result: unknown): JsonRpc {\n return jsonrpcSuccess(id, result as Record<string, unknown>);\n}\n\n/**\n * Create an error response\n */\nexport function createErrorResponse(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown\n): JsonRpc {\n return jsonrpcError(id, new JsonRpcError(message, code, data));\n}\n\n/**\n * Parse a JSON-RPC message string\n */\nexport function parseMessage(message: string): IParsedObject | IParsedObject[] {\n return jsonrpcParse(message);\n}\n\n/**\n * Parse a JSON-RPC message object\n */\nexport function parseMessageObject(obj: unknown): IParsedObject {\n return jsonrpcParseObject(obj);\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if parsed message is a request\n */\nexport function isRequest(parsed: IParsedObject): boolean {\n return parsed.type === \"request\";\n}\n\n/**\n * Check if parsed message is a notification\n */\nexport function isNotification(parsed: IParsedObject): boolean {\n return parsed.type === \"notification\";\n}\n\n/**\n * Check if parsed message is a success response\n */\nexport function isSuccessResponse(parsed: IParsedObject): boolean {\n return parsed.type === \"success\";\n}\n\n/**\n * Check if parsed message is an error response\n */\nexport function isErrorResponse(parsed: IParsedObject): boolean {\n return parsed.type === \"error\";\n}\n\n/**\n * Check if parsed message is invalid\n */\nexport function isInvalid(parsed: IParsedObject): boolean {\n return parsed.type === \"invalid\";\n}\n\n/**\n * Check if notification is a stream event\n */\nexport function isStreamEvent(parsed: IParsedObject): parsed is IParsedObject & {\n payload: RpcNotification<\"stream.event\", StreamEventParams>;\n} {\n if (parsed.type !== \"notification\") return false;\n const payload = parsed.payload as RpcNotification;\n return payload.method === \"stream.event\";\n}\n\n/**\n * Check if notification is a control ACK\n */\nexport function isControlAck(parsed: IParsedObject): parsed is IParsedObject & {\n payload: RpcNotification<\"control.ack\", ControlAckParams>;\n} {\n if (parsed.type !== \"notification\") return false;\n const payload = parsed.payload as RpcNotification;\n return payload.method === \"control.ack\";\n}\n\n// ============================================================================\n// Method Name Mapping (for backward compatibility)\n// ============================================================================\n\n/**\n * Map old event type names to new RPC method names\n */\nexport const eventTypeToRpcMethod: Record<string, RpcMethod> = {\n // Container\n container_create_request: \"container.create\",\n container_get_request: \"container.get\",\n container_list_request: \"container.list\",\n // Image\n image_create_request: \"image.create\",\n image_get_request: \"image.get\",\n image_list_request: \"image.list\",\n image_delete_request: \"image.delete\",\n image_run_request: \"image.run\",\n image_stop_request: \"image.stop\",\n image_update_request: \"image.update\",\n image_messages_request: \"image.messages\",\n // Agent\n agent_get_request: \"agent.get\",\n agent_list_request: \"agent.list\",\n agent_destroy_request: \"agent.destroy\",\n agent_destroy_all_request: \"agent.destroyAll\",\n agent_interrupt_request: \"agent.interrupt\",\n // Message\n message_send_request: \"message.send\",\n};\n\n/**\n * Map RPC method names back to response event types\n */\nexport const rpcMethodToResponseType: Record<RpcMethod, string> = {\n // Container\n \"container.create\": \"container_create_response\",\n \"container.get\": \"container_get_response\",\n \"container.list\": \"container_list_response\",\n // Image\n \"image.create\": \"image_create_response\",\n \"image.get\": \"image_get_response\",\n \"image.list\": \"image_list_response\",\n \"image.delete\": \"image_delete_response\",\n \"image.run\": \"image_run_response\",\n \"image.stop\": \"image_stop_response\",\n \"image.update\": \"image_update_response\",\n \"image.messages\": \"image_messages_response\",\n // Agent\n \"agent.get\": \"agent_get_response\",\n \"agent.list\": \"agent_list_response\",\n \"agent.destroy\": \"agent_destroy_response\",\n \"agent.destroyAll\": \"agent_destroy_all_response\",\n \"agent.interrupt\": \"agent_interrupt_response\",\n // Message\n \"message.send\": \"message_send_response\",\n};\n","/**\n * RpcClient - JSON-RPC 2.0 Client over WebSocket\n *\n * Provides:\n * - Request/Response with automatic ID matching\n * - Notification handling (stream events)\n * - Timeout management\n * - Reconnection support\n *\n * @example\n * ```typescript\n * const client = new RpcClient({ url: \"ws://localhost:5200\" });\n * await client.connect();\n *\n * // RPC call\n * const result = await client.call(\"container.list\", {});\n *\n * // Stream events\n * client.onNotification(\"stream.event\", (params) => {\n * console.log(\"Event:\", params.event);\n * });\n *\n * // Subscribe to topic\n * client.notify(\"subscribe\", { topic: \"session-123\" });\n * ```\n */\n\nimport {\n createRequest,\n createNotification,\n parseMessage,\n isSuccessResponse,\n isErrorResponse,\n isNotification,\n isStreamEvent,\n type RpcMethod,\n type NotificationMethod,\n type StreamEventParams,\n} from \"./jsonrpc\";\nimport type { SystemEvent } from \"../event/types/base\";\n\n/**\n * Check if running in browser environment\n */\nfunction isBrowser(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const globalWindow = typeof globalThis !== \"undefined\" ? (globalThis as any).window : undefined;\n return globalWindow?.document !== undefined;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * RpcClient configuration\n */\nexport interface RpcClientConfig {\n /**\n * WebSocket URL\n */\n url: string;\n\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n timeout?: number;\n\n /**\n * Auto reconnect on disconnect (default: true)\n */\n autoReconnect?: boolean;\n\n /**\n * Reconnect delay in milliseconds (default: 3000)\n */\n reconnectDelay?: number;\n\n /**\n * Headers for authentication (Node.js only, sent in first message for browser)\n */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\n /**\n * Debug logging\n */\n debug?: boolean;\n}\n\n/**\n * Pending request state\n */\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Notification handler\n */\ntype NotificationHandler = (method: string, params: unknown) => void;\n\n/**\n * Stream event handler\n */\ntype StreamEventHandler = (topic: string, event: SystemEvent) => void;\n\n/**\n * Connection state\n */\nexport type RpcClientState = \"disconnected\" | \"connecting\" | \"connected\";\n\n// ============================================================================\n// RpcClient Implementation\n// ============================================================================\n\n/**\n * JSON-RPC 2.0 Client\n */\nexport class RpcClient {\n private readonly config: RpcClientConfig;\n private readonly timeout: number;\n private readonly pendingRequests = new Map<string | number, PendingRequest>();\n private readonly notificationHandlers = new Set<NotificationHandler>();\n private readonly streamEventHandlers = new Set<StreamEventHandler>();\n\n private ws: WebSocket | null = null;\n private state: RpcClientState = \"disconnected\";\n private requestId = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private disposed = false;\n\n constructor(config: RpcClientConfig) {\n this.config = config;\n this.timeout = config.timeout ?? 30000;\n }\n\n // ==================== Properties ====================\n\n /**\n * Current connection state\n */\n get connectionState(): RpcClientState {\n return this.state;\n }\n\n /**\n * Whether client is connected\n */\n get connected(): boolean {\n return this.state === \"connected\";\n }\n\n // ==================== Connection ====================\n\n /**\n * Connect to server\n */\n async connect(): Promise<void> {\n if (this.disposed) {\n throw new Error(\"Client has been disposed\");\n }\n\n if (this.state === \"connected\") {\n return;\n }\n\n this.state = \"connecting\";\n\n const url = this.config.url;\n\n // Create WebSocket (browser or Node.js)\n let ws: WebSocket;\n if (isBrowser()) {\n ws = new WebSocket(url);\n } else {\n const { default: WS } = await import(\"ws\");\n ws = new WS(url) as unknown as WebSocket;\n }\n\n this.ws = ws;\n\n return new Promise((resolve, reject) => {\n ws.onopen = async () => {\n this.state = \"connected\";\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Connected to\", url);\n }\n\n // Send auth if in browser (headers not supported in WebSocket API)\n if (isBrowser() && this.config.headers) {\n const headers =\n typeof this.config.headers === \"function\"\n ? await this.config.headers()\n : this.config.headers;\n this.notify(\"auth\" as NotificationMethod, { headers });\n }\n\n resolve();\n };\n\n ws.onclose = () => {\n this.state = \"disconnected\";\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Disconnected\");\n }\n\n // Auto reconnect\n if (!this.disposed && this.config.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err) => {\n if (this.config.debug) {\n console.error(\"[RpcClient] WebSocket error:\", err);\n }\n\n if (this.state === \"connecting\") {\n this.state = \"disconnected\";\n reject(new Error(\"Failed to connect to server\"));\n }\n };\n\n ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n });\n }\n\n /**\n * Disconnect from server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispose client and clean up resources\n */\n dispose(): void {\n this.disposed = true;\n\n // Reject all pending requests\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"Client disposed\"));\n this.pendingRequests.delete(id);\n }\n\n this.disconnect();\n this.notificationHandlers.clear();\n this.streamEventHandlers.clear();\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Disposed\");\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const delay = this.config.reconnectDelay ?? 3000;\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n\n if (!this.disposed && this.state === \"disconnected\") {\n if (this.config.debug) {\n console.log(\"[RpcClient] Attempting to reconnect...\");\n }\n\n try {\n await this.connect();\n } catch {\n this.scheduleReconnect();\n }\n }\n }, delay);\n }\n\n // ==================== RPC Methods ====================\n\n /**\n * Call an RPC method and wait for response\n */\n async call<T = unknown>(method: RpcMethod, params: unknown): Promise<T> {\n if (!this.connected || !this.ws) {\n throw new Error(\"Not connected to server\");\n }\n\n const id = ++this.requestId;\n const request = createRequest(id, method, params);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request timeout: ${method}`));\n }, this.timeout);\n\n this.pendingRequests.set(id, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timer,\n });\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Sending request:\", method, params);\n }\n\n this.ws!.send(JSON.stringify(request));\n });\n }\n\n /**\n * Send a notification (no response expected)\n */\n notify(method: NotificationMethod | string, params: unknown): void {\n if (!this.connected || !this.ws) {\n if (this.config.debug) {\n console.warn(\"[RpcClient] Cannot send notification: not connected\");\n }\n return;\n }\n\n const notification = createNotification(method as NotificationMethod, params);\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Sending notification:\", method, params);\n }\n\n this.ws.send(JSON.stringify(notification));\n }\n\n /**\n * Subscribe to a topic (convenience method)\n */\n subscribe(topic: string): void {\n this.notify(\"subscribe\", { topic });\n }\n\n /**\n * Unsubscribe from a topic (convenience method)\n */\n unsubscribe(topic: string): void {\n this.notify(\"unsubscribe\", { topic });\n }\n\n // ==================== Event Handlers ====================\n\n /**\n * Register handler for all notifications\n */\n onNotification(handler: NotificationHandler): () => void {\n this.notificationHandlers.add(handler);\n return () => this.notificationHandlers.delete(handler);\n }\n\n /**\n * Register handler for stream events\n */\n onStreamEvent(handler: StreamEventHandler): () => void {\n this.streamEventHandlers.add(handler);\n return () => this.streamEventHandlers.delete(handler);\n }\n\n // ==================== Message Handling ====================\n\n private handleMessage(data: string): void {\n try {\n const parsed = parseMessage(data);\n\n // Handle single message\n if (!Array.isArray(parsed)) {\n this.handleParsedMessage(parsed);\n } else {\n // Batch response (rare)\n for (const item of parsed) {\n this.handleParsedMessage(item);\n }\n }\n } catch (err) {\n if (this.config.debug) {\n console.error(\"[RpcClient] Failed to parse message:\", err);\n }\n }\n }\n\n private handleParsedMessage(parsed: import(\"jsonrpc-lite\").IParsedObject): void {\n if (isSuccessResponse(parsed)) {\n // Success response - resolve pending request\n const payload = parsed.payload as { id: string | number; result: unknown };\n const pending = this.pendingRequests.get(payload.id);\n\n if (pending) {\n this.pendingRequests.delete(payload.id);\n clearTimeout(pending.timer);\n pending.resolve(payload.result);\n }\n } else if (isErrorResponse(parsed)) {\n // Error response - reject pending request\n const payload = parsed.payload as {\n id: string | number | null;\n error: { code: number; message: string; data?: unknown };\n };\n\n if (payload.id !== null) {\n const pending = this.pendingRequests.get(payload.id);\n\n if (pending) {\n this.pendingRequests.delete(payload.id);\n clearTimeout(pending.timer);\n pending.reject(new Error(payload.error.message));\n }\n }\n } else if (isNotification(parsed)) {\n // Notification - stream event or control message\n const payload = parsed.payload as { method: string; params: unknown };\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Received notification:\", payload.method);\n }\n\n // Notify all handlers\n for (const handler of this.notificationHandlers) {\n handler(payload.method, payload.params);\n }\n\n // Handle stream events specially\n if (isStreamEvent(parsed)) {\n const streamPayload = parsed.payload as { params: StreamEventParams };\n const { topic, event } = streamPayload.params;\n\n for (const handler of this.streamEventHandlers) {\n handler(topic, event);\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/network/jsonrpc.ts","../../src/network/protocol.ts","../../src/network/RpcClient.ts"],"sourcesContent":["/**\n * JSON-RPC 2.0 Protocol for AgentX Network Communication\n *\n * Uses jsonrpc-lite for message parsing/serialization.\n *\n * Message Types:\n * - Request: Client → Server (has id, expects response)\n * - Response: Server → Client (success or error)\n * - Notification: Server → Client (no id, stream events)\n *\n * @see https://www.jsonrpc.org/specification\n */\n\nimport type { IParsedObject, JsonRpc } from \"jsonrpc-lite\";\nimport {\n JsonRpcError,\n error as jsonrpcError,\n notification as jsonrpcNotification,\n parse as jsonrpcParse,\n parseObject as jsonrpcParseObject,\n request as jsonrpcRequest,\n success as jsonrpcSuccess,\n} from \"jsonrpc-lite\";\nimport type { SystemEvent } from \"../event/types/base\";\n\n// ============================================================================\n// Re-export jsonrpc-lite types and functions\n// ============================================================================\n\nexport { JsonRpcError };\nexport type { IParsedObject, JsonRpc };\n\n// ============================================================================\n// RPC Method Names\n// ============================================================================\n\n/**\n * All RPC method names supported by AgentX\n */\nexport type RpcMethod =\n // Container\n | \"container.create\"\n | \"container.get\"\n | \"container.list\"\n // Image\n | \"image.create\"\n | \"image.get\"\n | \"image.list\"\n | \"image.delete\"\n | \"image.run\"\n | \"image.stop\"\n | \"image.update\"\n | \"image.messages\"\n // Agent\n | \"agent.get\"\n | \"agent.list\"\n | \"agent.destroy\"\n | \"agent.destroyAll\"\n | \"agent.interrupt\"\n // Message\n | \"message.send\";\n\n/**\n * Notification method names (server push)\n */\nexport type NotificationMethod =\n | \"stream.event\" // Stream events (text_delta, tool_call, etc.)\n | \"control.ack\"; // ACK for reliable delivery\n\n// ============================================================================\n// Request/Response Type Definitions\n// ============================================================================\n\n/**\n * JSON-RPC Request structure\n */\nexport interface RpcRequest<M extends RpcMethod = RpcMethod, P = unknown> {\n jsonrpc: \"2.0\";\n method: M;\n params: P;\n id: string | number;\n}\n\n/**\n * JSON-RPC Success Response structure\n */\nexport interface RpcSuccessResponse<R = unknown> {\n jsonrpc: \"2.0\";\n result: R;\n id: string | number;\n}\n\n/**\n * JSON-RPC Error Response structure\n */\nexport interface RpcErrorResponse {\n jsonrpc: \"2.0\";\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n id: string | number | null;\n}\n\n/**\n * JSON-RPC Notification structure (no id, no response expected)\n */\nexport interface RpcNotification<M extends NotificationMethod = NotificationMethod, P = unknown> {\n jsonrpc: \"2.0\";\n method: M;\n params: P;\n}\n\n/**\n * Stream event notification params\n */\nexport interface StreamEventParams {\n topic: string;\n event: SystemEvent;\n}\n\n/**\n * Control ACK notification params\n */\nexport interface ControlAckParams {\n msgId: string;\n}\n\n// ============================================================================\n// Standard JSON-RPC Error Codes\n// ============================================================================\n\nexport const RpcErrorCodes = {\n // Standard JSON-RPC errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n // Server errors (reserved: -32000 to -32099)\n SERVER_ERROR: -32000,\n // Application errors (custom)\n NOT_FOUND: 404,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n TIMEOUT: 408,\n} as const;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest(\n id: string | number,\n method: RpcMethod | string,\n params: unknown\n): JsonRpc {\n return jsonrpcRequest(id, method, params as Record<string, unknown>);\n}\n\n/**\n * Create a JSON-RPC notification (no response expected)\n */\nexport function createNotification(method: NotificationMethod | string, params: unknown): JsonRpc {\n return jsonrpcNotification(method, params as Record<string, unknown>);\n}\n\n/**\n * Create a stream event notification\n */\nexport function createStreamEvent(topic: string, event: SystemEvent): JsonRpc {\n return jsonrpcNotification(\"stream.event\", { topic, event });\n}\n\n/**\n * Create an ACK notification\n */\nexport function createAckNotification(msgId: string): JsonRpc {\n return jsonrpcNotification(\"control.ack\", { msgId });\n}\n\n/**\n * Create a success response\n */\nexport function createSuccessResponse(id: string | number, result: unknown): JsonRpc {\n return jsonrpcSuccess(id, result as Record<string, unknown>);\n}\n\n/**\n * Create an error response\n */\nexport function createErrorResponse(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown\n): JsonRpc {\n return jsonrpcError(id, new JsonRpcError(message, code, data));\n}\n\n/**\n * Parse a JSON-RPC message string\n */\nexport function parseMessage(message: string): IParsedObject | IParsedObject[] {\n return jsonrpcParse(message);\n}\n\n/**\n * Parse a JSON-RPC message object\n */\nexport function parseMessageObject(obj: unknown): IParsedObject {\n return jsonrpcParseObject(obj);\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if parsed message is a request\n */\nexport function isRequest(parsed: IParsedObject): boolean {\n return parsed.type === \"request\";\n}\n\n/**\n * Check if parsed message is a notification\n */\nexport function isNotification(parsed: IParsedObject): boolean {\n return parsed.type === \"notification\";\n}\n\n/**\n * Check if parsed message is a success response\n */\nexport function isSuccessResponse(parsed: IParsedObject): boolean {\n return parsed.type === \"success\";\n}\n\n/**\n * Check if parsed message is an error response\n */\nexport function isErrorResponse(parsed: IParsedObject): boolean {\n return parsed.type === \"error\";\n}\n\n/**\n * Check if parsed message is invalid\n */\nexport function isInvalid(parsed: IParsedObject): boolean {\n return parsed.type === \"invalid\";\n}\n\n/**\n * Check if notification is a stream event\n */\nexport function isStreamEvent(parsed: IParsedObject): parsed is IParsedObject & {\n payload: RpcNotification<\"stream.event\", StreamEventParams>;\n} {\n if (parsed.type !== \"notification\") return false;\n const payload = parsed.payload as RpcNotification;\n return payload.method === \"stream.event\";\n}\n\n/**\n * Check if notification is a control ACK\n */\nexport function isControlAck(parsed: IParsedObject): parsed is IParsedObject & {\n payload: RpcNotification<\"control.ack\", ControlAckParams>;\n} {\n if (parsed.type !== \"notification\") return false;\n const payload = parsed.payload as RpcNotification;\n return payload.method === \"control.ack\";\n}\n\n// ============================================================================\n// Method Name Mapping (for backward compatibility)\n// ============================================================================\n\n/**\n * Map old event type names to new RPC method names\n */\nexport const eventTypeToRpcMethod: Record<string, RpcMethod> = {\n // Container\n container_create_request: \"container.create\",\n container_get_request: \"container.get\",\n container_list_request: \"container.list\",\n // Image\n image_create_request: \"image.create\",\n image_get_request: \"image.get\",\n image_list_request: \"image.list\",\n image_delete_request: \"image.delete\",\n image_run_request: \"image.run\",\n image_stop_request: \"image.stop\",\n image_update_request: \"image.update\",\n image_messages_request: \"image.messages\",\n // Agent\n agent_get_request: \"agent.get\",\n agent_list_request: \"agent.list\",\n agent_destroy_request: \"agent.destroy\",\n agent_destroy_all_request: \"agent.destroyAll\",\n agent_interrupt_request: \"agent.interrupt\",\n // Message\n message_send_request: \"message.send\",\n};\n\n/**\n * Map RPC method names back to response event types\n */\nexport const rpcMethodToResponseType: Record<RpcMethod, string> = {\n // Container\n \"container.create\": \"container_create_response\",\n \"container.get\": \"container_get_response\",\n \"container.list\": \"container_list_response\",\n // Image\n \"image.create\": \"image_create_response\",\n \"image.get\": \"image_get_response\",\n \"image.list\": \"image_list_response\",\n \"image.delete\": \"image_delete_response\",\n \"image.run\": \"image_run_response\",\n \"image.stop\": \"image_stop_response\",\n \"image.update\": \"image_update_response\",\n \"image.messages\": \"image_messages_response\",\n // Agent\n \"agent.get\": \"agent_get_response\",\n \"agent.list\": \"agent_list_response\",\n \"agent.destroy\": \"agent_destroy_response\",\n \"agent.destroyAll\": \"agent_destroy_all_response\",\n \"agent.interrupt\": \"agent_interrupt_response\",\n // Message\n \"message.send\": \"message_send_response\",\n};\n","/**\n * Reliable Message Protocol\n *\n * Internal protocol for message acknowledgment between server and client.\n * This is transparent to the application layer.\n *\n * Flow:\n * 1. Server sends: { __msgId: \"xxx\", __payload: \"actual message\" }\n * 2. Client receives, extracts payload, sends: { __ack: \"xxx\" }\n * 3. Server receives ACK, triggers onAck callback\n */\n\n// ============================================================================\n// Protocol Types\n// ============================================================================\n\n/**\n * ReliableWrapper - Wrapper for reliable messages (server → client)\n *\n * Contains the original message payload with a unique ID for tracking.\n */\nexport interface ReliableWrapper {\n /** Unique message ID for tracking */\n __msgId: string;\n /** Original message payload */\n __payload: string;\n}\n\n/**\n * AckMessage - Acknowledgment message (client → server)\n *\n * Sent automatically by client when receiving a reliable message.\n */\nexport interface AckMessage {\n /** Message ID being acknowledged */\n __ack: string;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if data is a ReliableWrapper\n */\nexport function isReliableWrapper(data: unknown): data is ReliableWrapper {\n return typeof data === \"object\" && data !== null && \"__msgId\" in data && \"__payload\" in data;\n}\n\n/**\n * Check if data is an AckMessage\n */\nexport function isAckMessage(data: unknown): data is AckMessage {\n return typeof data === \"object\" && data !== null && \"__ack\" in data;\n}\n\n// ============================================================================\n// Protocol Helpers\n// ============================================================================\n\n/**\n * Wrap a message for reliable delivery\n */\nexport function wrapMessage(msgId: string, payload: string): ReliableWrapper {\n return { __msgId: msgId, __payload: payload };\n}\n\n/**\n * Create an ACK message\n */\nexport function createAck(msgId: string): AckMessage {\n return { __ack: msgId };\n}\n\n/**\n * Unwrap a reliable message, returning the original payload\n */\nexport function unwrapMessage(wrapper: ReliableWrapper): string {\n return wrapper.__payload;\n}\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n","/**\n * RpcClient - JSON-RPC 2.0 Client over WebSocket\n *\n * Provides:\n * - Request/Response with automatic ID matching\n * - Notification handling (stream events)\n * - Timeout management\n * - Reconnection support\n *\n * @example\n * ```typescript\n * const client = new RpcClient({ url: \"ws://localhost:5200\" });\n * await client.connect();\n *\n * // RPC call\n * const result = await client.call(\"container.list\", {});\n *\n * // Stream events\n * client.onNotification(\"stream.event\", (params) => {\n * console.log(\"Event:\", params.event);\n * });\n *\n * // Subscribe to topic\n * client.notify(\"subscribe\", { topic: \"session-123\" });\n * ```\n */\n\nimport type { SystemEvent } from \"../event/types/base\";\nimport {\n createNotification,\n createRequest,\n isErrorResponse,\n isNotification,\n isStreamEvent,\n isSuccessResponse,\n type NotificationMethod,\n parseMessage,\n type RpcMethod,\n type StreamEventParams,\n} from \"./jsonrpc\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Factory function for creating WebSocket instances.\n * Platform layer provides the implementation:\n * - Browser: native WebSocket (default)\n * - Node.js: ws library (via @agentxjs/node-platform)\n */\nexport type WebSocketFactory = (url: string) => WebSocket;\n\n/**\n * RpcClient configuration\n */\nexport interface RpcClientConfig {\n /**\n * WebSocket URL\n */\n url: string;\n\n /**\n * Factory for creating WebSocket instances.\n * If not provided, falls back to the global WebSocket constructor.\n */\n createWebSocket?: WebSocketFactory;\n\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n timeout?: number;\n\n /**\n * Auto reconnect on disconnect (default: true)\n */\n autoReconnect?: boolean;\n\n /**\n * Reconnect delay in milliseconds (default: 3000)\n */\n reconnectDelay?: number;\n\n /**\n * Headers for authentication (sent in first message after connection)\n */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\n /**\n * Debug logging\n */\n debug?: boolean;\n}\n\n/**\n * Pending request state\n */\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Notification handler\n */\ntype NotificationHandler = (method: string, params: unknown) => void;\n\n/**\n * Stream event handler\n */\ntype StreamEventHandler = (topic: string, event: SystemEvent) => void;\n\n/**\n * Connection state\n */\nexport type RpcClientState = \"disconnected\" | \"connecting\" | \"connected\";\n\n// ============================================================================\n// RpcClient Implementation\n// ============================================================================\n\n/**\n * JSON-RPC 2.0 Client\n */\nexport class RpcClient {\n private readonly config: RpcClientConfig;\n private readonly timeout: number;\n private readonly pendingRequests = new Map<string | number, PendingRequest>();\n private readonly notificationHandlers = new Set<NotificationHandler>();\n private readonly streamEventHandlers = new Set<StreamEventHandler>();\n\n private ws: WebSocket | null = null;\n private state: RpcClientState = \"disconnected\";\n private requestId = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private disposed = false;\n\n constructor(config: RpcClientConfig) {\n this.config = config;\n this.timeout = config.timeout ?? 30000;\n }\n\n // ==================== Properties ====================\n\n /**\n * Current connection state\n */\n get connectionState(): RpcClientState {\n return this.state;\n }\n\n /**\n * Whether client is connected\n */\n get connected(): boolean {\n return this.state === \"connected\";\n }\n\n // ==================== Connection ====================\n\n /**\n * Connect to server\n */\n async connect(): Promise<void> {\n if (this.disposed) {\n throw new Error(\"Client has been disposed\");\n }\n\n if (this.state === \"connected\") {\n return;\n }\n\n this.state = \"connecting\";\n\n const url = this.config.url;\n\n // Create WebSocket via injected factory or global WebSocket\n const factory = this.config.createWebSocket ?? ((u: string) => new WebSocket(u));\n const ws = factory(url);\n\n this.ws = ws;\n\n return new Promise((resolve, reject) => {\n ws.onopen = async () => {\n this.state = \"connected\";\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Connected to\", url);\n }\n\n // Send auth headers after connection (for environments where\n // WebSocket constructor doesn't support headers, e.g. browser)\n if (this.config.headers) {\n const headers =\n typeof this.config.headers === \"function\"\n ? await this.config.headers()\n : this.config.headers;\n this.notify(\"auth\" as NotificationMethod, { headers });\n }\n\n resolve();\n };\n\n ws.onclose = () => {\n this.state = \"disconnected\";\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Disconnected\");\n }\n\n // Auto reconnect\n if (!this.disposed && this.config.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n ws.onerror = (err) => {\n if (this.config.debug) {\n console.error(\"[RpcClient] WebSocket error:\", err);\n }\n\n if (this.state === \"connecting\") {\n this.state = \"disconnected\";\n reject(new Error(\"Failed to connect to server\"));\n }\n };\n\n ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n });\n }\n\n /**\n * Disconnect from server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispose client and clean up resources\n */\n dispose(): void {\n this.disposed = true;\n\n // Reject all pending requests\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"Client disposed\"));\n this.pendingRequests.delete(id);\n }\n\n this.disconnect();\n this.notificationHandlers.clear();\n this.streamEventHandlers.clear();\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Disposed\");\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const delay = this.config.reconnectDelay ?? 3000;\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n\n if (!this.disposed && this.state === \"disconnected\") {\n if (this.config.debug) {\n console.log(\"[RpcClient] Attempting to reconnect...\");\n }\n\n try {\n await this.connect();\n } catch {\n this.scheduleReconnect();\n }\n }\n }, delay);\n }\n\n // ==================== RPC Methods ====================\n\n /**\n * Call an RPC method and wait for response\n */\n async call<T = unknown>(method: RpcMethod, params: unknown): Promise<T> {\n if (!this.connected || !this.ws) {\n throw new Error(\"Not connected to server\");\n }\n\n const id = ++this.requestId;\n const request = createRequest(id, method, params);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request timeout: ${method}`));\n }, this.timeout);\n\n this.pendingRequests.set(id, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timer,\n });\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Sending request:\", method, params);\n }\n\n this.ws!.send(JSON.stringify(request));\n });\n }\n\n /**\n * Send a notification (no response expected)\n */\n notify(method: NotificationMethod | string, params: unknown): void {\n if (!this.connected || !this.ws) {\n if (this.config.debug) {\n console.warn(\"[RpcClient] Cannot send notification: not connected\");\n }\n return;\n }\n\n const notification = createNotification(method as NotificationMethod, params);\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Sending notification:\", method, params);\n }\n\n this.ws.send(JSON.stringify(notification));\n }\n\n /**\n * Subscribe to a topic (convenience method)\n */\n subscribe(topic: string): void {\n this.notify(\"subscribe\", { topic });\n }\n\n /**\n * Unsubscribe from a topic (convenience method)\n */\n unsubscribe(topic: string): void {\n this.notify(\"unsubscribe\", { topic });\n }\n\n // ==================== Event Handlers ====================\n\n /**\n * Register handler for all notifications\n */\n onNotification(handler: NotificationHandler): () => void {\n this.notificationHandlers.add(handler);\n return () => this.notificationHandlers.delete(handler);\n }\n\n /**\n * Register handler for stream events\n */\n onStreamEvent(handler: StreamEventHandler): () => void {\n this.streamEventHandlers.add(handler);\n return () => this.streamEventHandlers.delete(handler);\n }\n\n // ==================== Message Handling ====================\n\n private handleMessage(data: string): void {\n try {\n const parsed = parseMessage(data);\n\n // Handle single message\n if (!Array.isArray(parsed)) {\n this.handleParsedMessage(parsed);\n } else {\n // Batch response (rare)\n for (const item of parsed) {\n this.handleParsedMessage(item);\n }\n }\n } catch (err) {\n if (this.config.debug) {\n console.error(\"[RpcClient] Failed to parse message:\", err);\n }\n }\n }\n\n private handleParsedMessage(parsed: import(\"jsonrpc-lite\").IParsedObject): void {\n if (isSuccessResponse(parsed)) {\n // Success response - resolve pending request\n const payload = parsed.payload as { id: string | number; result: unknown };\n const pending = this.pendingRequests.get(payload.id);\n\n if (pending) {\n this.pendingRequests.delete(payload.id);\n clearTimeout(pending.timer);\n pending.resolve(payload.result);\n }\n } else if (isErrorResponse(parsed)) {\n // Error response - reject pending request\n const payload = parsed.payload as {\n id: string | number | null;\n error: { code: number; message: string; data?: unknown };\n };\n\n if (payload.id !== null) {\n const pending = this.pendingRequests.get(payload.id);\n\n if (pending) {\n this.pendingRequests.delete(payload.id);\n clearTimeout(pending.timer);\n pending.reject(new Error(payload.error.message));\n }\n }\n } else if (isNotification(parsed)) {\n // Notification - stream event or control message\n const payload = parsed.payload as { method: string; params: unknown };\n\n if (this.config.debug) {\n console.log(\"[RpcClient] Received notification:\", payload.method);\n }\n\n // Notify all handlers\n for (const handler of this.notificationHandlers) {\n handler(payload.method, payload.params);\n }\n\n // Handle stream events specially\n if (isStreamEvent(parsed)) {\n const streamPayload = parsed.payload as { params: StreamEventParams };\n const { topic, event } = streamPayload.params;\n\n for (const handler of this.streamEventHandlers) {\n handler(topic, event);\n }\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,155 +1,2 @@
1
- import { M as Message } from '../message-BMrMm1pq.js';
2
- import { McpServerConfig } from '../driver/index.js';
3
-
4
- /**
5
- * Persistence Types - Repository interfaces and record types
6
- *
7
- * Defines standard interfaces for data persistence.
8
- * Implementations are provided by platform packages (node, cloudflare).
9
- */
10
-
11
- /**
12
- * Container configuration (extensible)
13
- */
14
- interface ContainerConfig {
15
- [key: string]: unknown;
16
- }
17
- /**
18
- * ContainerRecord - Persistent container data
19
- *
20
- * Represents a logical container (resource isolation unit).
21
- * Each container provides an isolated environment for running Agents.
22
- */
23
- interface ContainerRecord {
24
- /** Unique container identifier */
25
- containerId: string;
26
- /** Container creation timestamp (Unix milliseconds) */
27
- createdAt: number;
28
- /** Last update timestamp (Unix milliseconds) */
29
- updatedAt: number;
30
- /** Container configuration (extensible) */
31
- config?: ContainerConfig;
32
- }
33
- /**
34
- * Image metadata for storing provider-specific data
35
- */
36
- interface ImageMetadata {
37
- /** Claude SDK session ID for conversation resume */
38
- claudeSdkSessionId?: string;
39
- }
40
- /**
41
- * ImageRecord - Persistent representation of a conversation
42
- *
43
- * Image is the primary entity users interact with (displayed as "conversation").
44
- * Agent is a transient runtime instance created from Image.
45
- *
46
- * Lifecycle:
47
- * - image_create → ImageRecord (persistent)
48
- * - image_run → Agent (runtime, in-memory)
49
- * - image_stop / server restart → Agent destroyed, Image remains
50
- */
51
- interface ImageRecord {
52
- /** Unique image identifier (pattern: `img_${nanoid()}`) */
53
- imageId: string;
54
- /** Container ID (user isolation boundary) */
55
- containerId: string;
56
- /** Session ID for message storage */
57
- sessionId: string;
58
- /** Conversation name (displayed to user) */
59
- name: string;
60
- /** Conversation description (optional) */
61
- description?: string;
62
- /** System prompt - controls agent behavior */
63
- systemPrompt?: string;
64
- /** Parent image ID (for fork/branch feature) */
65
- parentImageId?: string;
66
- /** MCP servers configuration */
67
- mcpServers?: Record<string, McpServerConfig>;
68
- /** Provider-specific metadata */
69
- metadata?: ImageMetadata;
70
- /** Creation timestamp (Unix milliseconds) */
71
- createdAt: number;
72
- /** Last update timestamp (Unix milliseconds) */
73
- updatedAt: number;
74
- }
75
- /**
76
- * SessionRecord - Storage schema for Session persistence
77
- *
78
- * Session stores conversation messages for an Image.
79
- * Each Image has exactly one Session.
80
- */
81
- interface SessionRecord {
82
- /** Unique session identifier */
83
- sessionId: string;
84
- /** Associated image ID (owner of this session) */
85
- imageId: string;
86
- /** Container this session belongs to */
87
- containerId: string;
88
- /** Creation timestamp (Unix milliseconds) */
89
- createdAt: number;
90
- /** Last update timestamp (Unix milliseconds) */
91
- updatedAt: number;
92
- }
93
- /**
94
- * ContainerRepository - Storage operations for containers
95
- */
96
- interface ContainerRepository {
97
- /** Save a container record (create or update) */
98
- saveContainer(record: ContainerRecord): Promise<void>;
99
- /** Find container by ID */
100
- findContainerById(containerId: string): Promise<ContainerRecord | null>;
101
- /** Find all containers */
102
- findAllContainers(): Promise<ContainerRecord[]>;
103
- /** Delete container by ID */
104
- deleteContainer(containerId: string): Promise<void>;
105
- /** Check if container exists */
106
- containerExists(containerId: string): Promise<boolean>;
107
- }
108
- /**
109
- * ImageRepository - Storage operations for images
110
- */
111
- interface ImageRepository {
112
- /** Save an image record (create or update) */
113
- saveImage(record: ImageRecord): Promise<void>;
114
- /** Find image by ID */
115
- findImageById(imageId: string): Promise<ImageRecord | null>;
116
- /** Find all images */
117
- findAllImages(): Promise<ImageRecord[]>;
118
- /** Find images by agent name */
119
- findImagesByName(name: string): Promise<ImageRecord[]>;
120
- /** Find images by container ID */
121
- findImagesByContainerId(containerId: string): Promise<ImageRecord[]>;
122
- /** Delete image by ID */
123
- deleteImage(imageId: string): Promise<void>;
124
- /** Check if image exists */
125
- imageExists(imageId: string): Promise<boolean>;
126
- /** Update image metadata (merges with existing) */
127
- updateMetadata(imageId: string, metadata: Partial<ImageMetadata>): Promise<void>;
128
- }
129
- /**
130
- * SessionRepository - Storage operations for sessions
131
- */
132
- interface SessionRepository {
133
- /** Save a session record (create or update) */
134
- saveSession(record: SessionRecord): Promise<void>;
135
- /** Find session by ID */
136
- findSessionById(sessionId: string): Promise<SessionRecord | null>;
137
- /** Find session by image ID */
138
- findSessionByImageId(imageId: string): Promise<SessionRecord | null>;
139
- /** Find all sessions for a container */
140
- findSessionsByContainerId(containerId: string): Promise<SessionRecord[]>;
141
- /** Find all sessions */
142
- findAllSessions(): Promise<SessionRecord[]>;
143
- /** Delete session by ID */
144
- deleteSession(sessionId: string): Promise<void>;
145
- /** Check if session exists */
146
- sessionExists(sessionId: string): Promise<boolean>;
147
- /** Add a message to a session */
148
- addMessage(sessionId: string, message: Message): Promise<void>;
149
- /** Get all messages for a session */
150
- getMessages(sessionId: string): Promise<Message[]>;
151
- /** Clear all messages for a session */
152
- clearMessages(sessionId: string): Promise<void>;
153
- }
154
-
155
- export { type ContainerConfig, type ContainerRecord, type ContainerRepository, type ImageMetadata, type ImageRecord, type ImageRepository, McpServerConfig, type SessionRecord, type SessionRepository };
1
+ export { e as ContainerConfig, C as ContainerRecord, d as ContainerRepository, g as ImageMetadata, f as ImageRecord, I as ImageRepository, M as McpServerConfig, b as SessionRecord, c as SessionRepository } from '../index--gxNpY5W.js';
2
+ import '../message-Dn-I2vr0.js';
@@ -0,0 +1,76 @@
1
+ import { B as BashProvider } from '../types-Cb8tKM6Y.js';
2
+ import { d as ContainerRepository, I as ImageRepository, c as SessionRepository } from '../index--gxNpY5W.js';
3
+ import { E as EventBus } from '../bus-C9FLWIu8.js';
4
+ import { W as WebSocketFactory } from '../RpcClient-CMdhJxjS.js';
5
+ import '../message-Dn-I2vr0.js';
6
+ import '../base-m40r3Qgu.js';
7
+ import 'jsonrpc-lite';
8
+
9
+ /**
10
+ * Platform Types
11
+ *
12
+ * AgentXPlatform - Dependency injection container for platform capabilities.
13
+ * Platform packages (node-platform, etc.) provide implementations.
14
+ *
15
+ * ```
16
+ * ┌─────────────────────────────────────────────────────────────┐
17
+ * │ AgentXPlatform │
18
+ * │ (Dependency Injection - Platform provides implementations) │
19
+ * │ │
20
+ * │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
21
+ * │ │ Repositories│ │ EventBus │ │ Providers │ │
22
+ * │ │ Container │ │ │ │ Bash (opt) │ │
23
+ * │ │ Image │ │ │ │ │ │
24
+ * │ │ Session │ │ │ │ │ │
25
+ * │ └─────────────┘ └─────────────┘ └─────────────┘ │
26
+ * └─────────────────────────────────────────────────────────────┘
27
+ * ```
28
+ */
29
+
30
+ /**
31
+ * AgentXPlatform - Collects all dependencies for runtime
32
+ *
33
+ * Platform packages provide implementations of these interfaces.
34
+ * The platform is passed to AgentXRuntime for integration.
35
+ *
36
+ * Required capabilities:
37
+ * - containerRepository, imageRepository, sessionRepository — persistence
38
+ * - eventBus — pub/sub
39
+ *
40
+ * Optional capabilities:
41
+ * - bashProvider — command execution (not all platforms support this)
42
+ */
43
+ interface AgentXPlatform {
44
+ /**
45
+ * Container repository for persistence
46
+ */
47
+ readonly containerRepository: ContainerRepository;
48
+ /**
49
+ * Image repository for persistence
50
+ */
51
+ readonly imageRepository: ImageRepository;
52
+ /**
53
+ * Session repository for persistence
54
+ */
55
+ readonly sessionRepository: SessionRepository;
56
+ /**
57
+ * Event bus for pub/sub
58
+ */
59
+ readonly eventBus: EventBus;
60
+ /**
61
+ * Bash provider for command execution
62
+ *
63
+ * Optional — not all platforms support shell execution.
64
+ * Node.js platform provides child_process based implementation.
65
+ */
66
+ readonly bashProvider?: BashProvider;
67
+ /**
68
+ * WebSocket factory for creating client connections
69
+ *
70
+ * Optional — browser uses native WebSocket by default.
71
+ * Node.js platform provides ws-based implementation.
72
+ */
73
+ readonly webSocketFactory?: WebSocketFactory;
74
+ }
75
+
76
+ export type { AgentXPlatform };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,34 +1,28 @@
1
- import { ContainerRepository, ImageRepository, SessionRepository } from '../persistence/index.js';
2
- import { CreateDriver } from '../driver/index.js';
3
- import { c as UserContentPart } from '../message-BMrMm1pq.js';
4
- import { WorkspaceProvider } from '../workspace/index.js';
1
+ import { b as UserContentPart } from '../message-Dn-I2vr0.js';
2
+ import { h as CreateDriver } from '../index--gxNpY5W.js';
5
3
  import { B as BusEvent } from '../base-m40r3Qgu.js';
6
- import { E as EventBus } from '../bus-uF1DM2ox.js';
4
+ import { AgentXPlatform } from '../platform/index.js';
5
+ import '../types-Cb8tKM6Y.js';
6
+ import '../bus-C9FLWIu8.js';
7
+ import '../RpcClient-CMdhJxjS.js';
8
+ import 'jsonrpc-lite';
7
9
 
8
10
  /**
9
11
  * Runtime Types
10
12
  *
11
- * AgentXProvider - Dependency injection container
12
13
  * AgentXRuntime - Runtime integration layer
13
14
  *
14
15
  * Architecture:
15
16
  * ```
16
17
  * ┌─────────────────────────────────────────────────────────────┐
17
- * │ AgentXProvider
18
- * │ (Dependency Injection - Platform provides implementations)
19
- * │ │
20
- * │ ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ │
21
- * │ │ Repositories│ │ Workspace │ │ DriverFactory │ │
22
- * │ │ Container │ │ Provider │ │ (per-Agent) │ │
23
- * │ │ Image │ │ │ │ │ │
24
- * │ │ Session │ │ │ │ │ │
25
- * │ └─────────────┘ └─────────────┘ └─────────────┘ │
18
+ * │ AgentXPlatform
19
+ * │ (see @agentxjs/core/platform)
26
20
  * └─────────────────────────────────────────────────────────────┘
27
21
  * │
28
22
  * ▼
29
23
  * ┌─────────────────────────────────────────────────────────────┐
30
24
  * │ AgentXRuntime │
31
- * │ (Integration - Uses Provider dependencies) │
25
+ * │ (Integration - Uses Platform dependencies) │
32
26
  * │ │
33
27
  * │ ┌─────────────────────────────────────────────────────┐ │
34
28
  * │ │ Agent Lifecycle: create / get / destroy │ │
@@ -55,38 +49,6 @@ interface RuntimeAgent {
55
49
  readonly lifecycle: AgentLifecycle;
56
50
  readonly createdAt: number;
57
51
  }
58
- /**
59
- * AgentXProvider - Collects all dependencies for runtime
60
- *
61
- * Platform packages provide implementations of these interfaces.
62
- * The provider is passed to AgentXRuntime for integration.
63
- */
64
- interface AgentXProvider {
65
- /**
66
- * Container repository for persistence
67
- */
68
- readonly containerRepository: ContainerRepository;
69
- /**
70
- * Image repository for persistence
71
- */
72
- readonly imageRepository: ImageRepository;
73
- /**
74
- * Session repository for persistence
75
- */
76
- readonly sessionRepository: SessionRepository;
77
- /**
78
- * Workspace provider for isolated environments
79
- */
80
- readonly workspaceProvider: WorkspaceProvider;
81
- /**
82
- * LLM Driver factory function - creates Driver per Agent
83
- */
84
- readonly createDriver: CreateDriver;
85
- /**
86
- * Event bus for pub/sub
87
- */
88
- readonly eventBus: EventBus;
89
- }
90
52
  /**
91
53
  * Agent creation options
92
54
  */
@@ -118,9 +80,9 @@ interface Subscription {
118
80
  */
119
81
  interface AgentXRuntime {
120
82
  /**
121
- * The provider containing all dependencies
83
+ * The platform containing all dependencies
122
84
  */
123
- readonly provider: AgentXProvider;
85
+ readonly platform: AgentXPlatform;
124
86
  /**
125
87
  * Create and start an agent from an image
126
88
  */
@@ -176,7 +138,7 @@ interface AgentXRuntime {
176
138
  * Configuration for creating AgentXRuntime
177
139
  */
178
140
  interface AgentXRuntimeConfig {
179
- provider: AgentXProvider;
141
+ platform: AgentXPlatform;
180
142
  }
181
143
  /**
182
144
  * Factory function type for creating AgentXRuntime
@@ -187,23 +149,25 @@ type CreateAgentXRuntime = (config: AgentXRuntimeConfig) => AgentXRuntime;
187
149
  * AgentXRuntimeImpl - Runtime integration implementation
188
150
  *
189
151
  * Integrates all components to provide agent lifecycle management.
190
- * Uses Provider dependencies to coordinate Session, Image, Container, etc.
152
+ * Uses Platform dependencies to coordinate Session, Image, Container, etc.
191
153
  *
192
- * New Design:
154
+ * Architecture:
193
155
  * - Driver.receive() returns AsyncIterable<DriverStreamEvent>
194
- * - Runtime processes events and emits to EventBus
195
- * - No more EventBus-based communication with Driver
156
+ * - Runtime emits raw stream events to EventBus
157
+ * - Runtime pushes events through AgentEngine (MealyMachine → Presenter)
158
+ * - Presenter emits message/state/turn events and persists messages
196
159
  */
197
160
 
198
161
  /**
199
162
  * AgentXRuntimeImpl - Runtime implementation
200
163
  */
201
164
  declare class AgentXRuntimeImpl implements AgentXRuntime {
202
- readonly provider: AgentXProvider;
165
+ readonly platform: AgentXPlatform;
166
+ private readonly createDriver;
203
167
  private agents;
204
168
  private globalSubscriptions;
205
169
  private isShutdown;
206
- constructor(provider: AgentXProvider);
170
+ constructor(platform: AgentXPlatform, createDriver: CreateDriver);
207
171
  createAgent(options: CreateAgentOptions): Promise<RuntimeAgent>;
208
172
  getAgent(agentId: string): RuntimeAgent | undefined;
209
173
  getAgents(): RuntimeAgent[];
@@ -234,7 +198,10 @@ declare class AgentXRuntimeImpl implements AgentXRuntime {
234
198
  }
235
199
  /**
236
200
  * Create an AgentXRuntime instance
201
+ *
202
+ * @param platform - AgentXPlatform with repositories and event bus
203
+ * @param createDriver - Factory function for creating Driver instances per Agent
237
204
  */
238
- declare function createAgentXRuntime(provider: AgentXProvider): AgentXRuntime;
205
+ declare function createAgentXRuntime(platform: AgentXPlatform, createDriver: CreateDriver): AgentXRuntime;
239
206
 
240
- export { type AgentEventHandler, type AgentLifecycle, type AgentXProvider, type AgentXRuntime, type AgentXRuntimeConfig, AgentXRuntimeImpl, type CreateAgentOptions, type CreateAgentXRuntime, type RuntimeAgent, type Subscription, createAgentXRuntime };
207
+ export { type AgentEventHandler, type AgentLifecycle, AgentXPlatform, type AgentXRuntime, type AgentXRuntimeConfig, AgentXRuntimeImpl, type CreateAgentOptions, type CreateAgentXRuntime, type RuntimeAgent, type Subscription, createAgentXRuntime };