agentxjs 2.0.0 → 3.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/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { BusEvent, Unsubscribe, EventBus, BusEventHandler } from '@agentxjs/core/event';
1
+ import { Message } from '@agentxjs/core/agent';
2
2
  import { CreateDriver } from '@agentxjs/core/driver';
3
+ import { Unsubscribe, BusEvent, EventBus, BusEventHandler } from '@agentxjs/core/event';
3
4
  import { AgentXPlatform } from '@agentxjs/core/runtime';
4
- import { Message } from '@agentxjs/core/agent';
5
5
 
6
6
  /**
7
7
  * Presentation Types
@@ -96,44 +96,6 @@ interface PresentationState {
96
96
  */
97
97
  declare const initialPresentationState: PresentationState;
98
98
 
99
- /**
100
- * Presentation Reducer
101
- *
102
- * Aggregates events into PresentationState.
103
- * Pure function: (state, event) => newState
104
- *
105
- * Event consumption strategy:
106
- * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop
107
- * (for real-time streaming display)
108
- * - Message layer: tool_result_message
109
- * (for tool execution results — arrives after message_stop)
110
- *
111
- * Tool calls are stream-level blocks within the assistant turn,
112
- * matching the mainstream API pattern (Anthropic, OpenAI).
113
- */
114
-
115
- /**
116
- * Reduce an event into presentation state.
117
- *
118
- * Consumes:
119
- * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop
120
- * - Message events: tool_result_message
121
- * - Error events: error
122
- */
123
- declare function presentationReducer(state: PresentationState, event: BusEvent): PresentationState;
124
- declare function addUserConversation(state: PresentationState, content: string): PresentationState;
125
- declare function createInitialState(): PresentationState;
126
- /**
127
- * Convert persisted Messages to Presentation Conversations.
128
- *
129
- * Groups consecutive assistant + tool-result messages
130
- * into a single AssistantConversation.
131
- *
132
- * Tool calls are now part of AssistantMessage.content (as ToolCallPart),
133
- * so we extract them directly from the assistant message.
134
- */
135
- declare function messagesToConversations(messages: Message[]): Conversation[];
136
-
137
99
  /**
138
100
  * Presentation Class
139
101
  *
@@ -206,6 +168,44 @@ declare class Presentation {
206
168
  private notifyError;
207
169
  }
208
170
 
171
+ /**
172
+ * Presentation Reducer
173
+ *
174
+ * Aggregates events into PresentationState.
175
+ * Pure function: (state, event) => newState
176
+ *
177
+ * Event consumption strategy:
178
+ * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop
179
+ * (for real-time streaming display)
180
+ * - Message layer: tool_result_message
181
+ * (for tool execution results — arrives after message_stop)
182
+ *
183
+ * Tool calls are stream-level blocks within the assistant turn,
184
+ * matching the mainstream API pattern (Anthropic, OpenAI).
185
+ */
186
+
187
+ /**
188
+ * Reduce an event into presentation state.
189
+ *
190
+ * Consumes:
191
+ * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop
192
+ * - Message events: tool_result_message
193
+ * - Error events: error
194
+ */
195
+ declare function presentationReducer(state: PresentationState, event: BusEvent): PresentationState;
196
+ declare function addUserConversation(state: PresentationState, content: string): PresentationState;
197
+ declare function createInitialState(): PresentationState;
198
+ /**
199
+ * Convert persisted Messages to Presentation Conversations.
200
+ *
201
+ * Groups consecutive assistant + tool-result messages
202
+ * into a single AssistantConversation.
203
+ *
204
+ * Tool calls are now part of AssistantMessage.content (as ToolCallPart),
205
+ * so we extract them directly from the assistant message.
206
+ */
207
+ declare function messagesToConversations(messages: Message[]): Conversation[];
208
+
209
209
  /**
210
210
  * AgentX Client SDK Types
211
211
  */
package/dist/index.js CHANGED
@@ -1,8 +1,92 @@
1
- // src/RemoteClient.ts
2
- import { EventBusImpl } from "@agentxjs/core/event";
3
- import { RpcClient } from "@agentxjs/core/network";
1
+ // src/LocalClient.ts
4
2
  import { createLogger } from "commonxjs/logger";
5
3
 
4
+ // src/namespaces/agents.ts
5
+ function createLocalAgents(runtime) {
6
+ return {
7
+ async create(params) {
8
+ const existingAgent = runtime.getAgents().find((a) => a.imageId === params.imageId && a.lifecycle === "running");
9
+ if (existingAgent) {
10
+ return {
11
+ agentId: existingAgent.agentId,
12
+ imageId: existingAgent.imageId,
13
+ containerId: existingAgent.containerId,
14
+ sessionId: existingAgent.sessionId,
15
+ requestId: ""
16
+ };
17
+ }
18
+ const agent = await runtime.createAgent({
19
+ imageId: params.imageId,
20
+ agentId: params.agentId
21
+ });
22
+ return {
23
+ agentId: agent.agentId,
24
+ imageId: agent.imageId,
25
+ containerId: agent.containerId,
26
+ sessionId: agent.sessionId,
27
+ requestId: ""
28
+ };
29
+ },
30
+ async get(agentId) {
31
+ const agent = runtime.getAgent(agentId);
32
+ return {
33
+ agent: agent ? {
34
+ agentId: agent.agentId,
35
+ imageId: agent.imageId,
36
+ containerId: agent.containerId,
37
+ sessionId: agent.sessionId,
38
+ lifecycle: agent.lifecycle
39
+ } : null,
40
+ exists: !!agent,
41
+ requestId: ""
42
+ };
43
+ },
44
+ async list(containerId) {
45
+ const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();
46
+ return {
47
+ agents: agents.map((a) => ({
48
+ agentId: a.agentId,
49
+ imageId: a.imageId,
50
+ containerId: a.containerId,
51
+ sessionId: a.sessionId,
52
+ lifecycle: a.lifecycle
53
+ })),
54
+ requestId: ""
55
+ };
56
+ },
57
+ async destroy(agentId) {
58
+ const agent = runtime.getAgent(agentId);
59
+ if (agent) {
60
+ await runtime.destroyAgent(agentId);
61
+ }
62
+ return { requestId: "" };
63
+ }
64
+ };
65
+ }
66
+ function createRemoteAgents(rpcClient) {
67
+ return {
68
+ async create(params) {
69
+ const result = await rpcClient.call("image.run", {
70
+ imageId: params.imageId,
71
+ agentId: params.agentId
72
+ });
73
+ return { ...result, requestId: "" };
74
+ },
75
+ async get(agentId) {
76
+ const result = await rpcClient.call("agent.get", { agentId });
77
+ return { ...result, requestId: "" };
78
+ },
79
+ async list(containerId) {
80
+ const result = await rpcClient.call("agent.list", { containerId });
81
+ return { ...result, requestId: "" };
82
+ },
83
+ async destroy(agentId) {
84
+ const result = await rpcClient.call("agent.destroy", { agentId });
85
+ return { ...result, requestId: "" };
86
+ }
87
+ };
88
+ }
89
+
6
90
  // src/namespaces/containers.ts
7
91
  function createLocalContainers(platform) {
8
92
  return {
@@ -150,134 +234,6 @@ function createRemoteImages(rpcClient, subscribeFn) {
150
234
  };
151
235
  }
152
236
 
153
- // src/namespaces/agents.ts
154
- function createLocalAgents(runtime) {
155
- return {
156
- async create(params) {
157
- const existingAgent = runtime.getAgents().find((a) => a.imageId === params.imageId && a.lifecycle === "running");
158
- if (existingAgent) {
159
- return {
160
- agentId: existingAgent.agentId,
161
- imageId: existingAgent.imageId,
162
- containerId: existingAgent.containerId,
163
- sessionId: existingAgent.sessionId,
164
- requestId: ""
165
- };
166
- }
167
- const agent = await runtime.createAgent({
168
- imageId: params.imageId,
169
- agentId: params.agentId
170
- });
171
- return {
172
- agentId: agent.agentId,
173
- imageId: agent.imageId,
174
- containerId: agent.containerId,
175
- sessionId: agent.sessionId,
176
- requestId: ""
177
- };
178
- },
179
- async get(agentId) {
180
- const agent = runtime.getAgent(agentId);
181
- return {
182
- agent: agent ? {
183
- agentId: agent.agentId,
184
- imageId: agent.imageId,
185
- containerId: agent.containerId,
186
- sessionId: agent.sessionId,
187
- lifecycle: agent.lifecycle
188
- } : null,
189
- exists: !!agent,
190
- requestId: ""
191
- };
192
- },
193
- async list(containerId) {
194
- const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();
195
- return {
196
- agents: agents.map((a) => ({
197
- agentId: a.agentId,
198
- imageId: a.imageId,
199
- containerId: a.containerId,
200
- sessionId: a.sessionId,
201
- lifecycle: a.lifecycle
202
- })),
203
- requestId: ""
204
- };
205
- },
206
- async destroy(agentId) {
207
- const agent = runtime.getAgent(agentId);
208
- if (agent) {
209
- await runtime.destroyAgent(agentId);
210
- }
211
- return { requestId: "" };
212
- }
213
- };
214
- }
215
- function createRemoteAgents(rpcClient) {
216
- return {
217
- async create(params) {
218
- const result = await rpcClient.call("image.run", {
219
- imageId: params.imageId,
220
- agentId: params.agentId
221
- });
222
- return { ...result, requestId: "" };
223
- },
224
- async get(agentId) {
225
- const result = await rpcClient.call("agent.get", { agentId });
226
- return { ...result, requestId: "" };
227
- },
228
- async list(containerId) {
229
- const result = await rpcClient.call("agent.list", { containerId });
230
- return { ...result, requestId: "" };
231
- },
232
- async destroy(agentId) {
233
- const result = await rpcClient.call("agent.destroy", { agentId });
234
- return { ...result, requestId: "" };
235
- }
236
- };
237
- }
238
-
239
- // src/namespaces/sessions.ts
240
- function createLocalSessions(runtime) {
241
- return {
242
- async send(agentId, content) {
243
- await runtime.receive(agentId, content);
244
- return { agentId, requestId: "" };
245
- },
246
- async interrupt(agentId) {
247
- runtime.interrupt(agentId);
248
- return { requestId: "" };
249
- },
250
- async getMessages(agentId) {
251
- const agent = runtime.getAgent(agentId);
252
- if (!agent) return [];
253
- return runtime.platform.sessionRepository.getMessages(agent.sessionId);
254
- }
255
- };
256
- }
257
- function createRemoteSessions(rpcClient) {
258
- return {
259
- async send(agentId, content) {
260
- const result = await rpcClient.call("message.send", {
261
- agentId,
262
- content
263
- });
264
- return { ...result, requestId: "" };
265
- },
266
- async interrupt(agentId) {
267
- const result = await rpcClient.call("agent.interrupt", { agentId });
268
- return { ...result, requestId: "" };
269
- },
270
- async getMessages(agentId) {
271
- const agentRes = await rpcClient.call("agent.get", { agentId });
272
- if (!agentRes.agent) return [];
273
- const msgRes = await rpcClient.call("image.messages", {
274
- imageId: agentRes.agent.imageId
275
- });
276
- return msgRes.messages ?? [];
277
- }
278
- };
279
- }
280
-
281
237
  // src/presentation/types.ts
282
238
  var initialPresentationState = {
283
239
  conversations: [],
@@ -709,8 +665,100 @@ function createPresentations(agentx) {
709
665
  };
710
666
  }
711
667
 
668
+ // src/namespaces/sessions.ts
669
+ function createLocalSessions(runtime) {
670
+ return {
671
+ async send(agentId, content) {
672
+ await runtime.receive(agentId, content);
673
+ return { agentId, requestId: "" };
674
+ },
675
+ async interrupt(agentId) {
676
+ runtime.interrupt(agentId);
677
+ return { requestId: "" };
678
+ },
679
+ async getMessages(agentId) {
680
+ const agent = runtime.getAgent(agentId);
681
+ if (!agent) return [];
682
+ return runtime.platform.sessionRepository.getMessages(agent.sessionId);
683
+ }
684
+ };
685
+ }
686
+ function createRemoteSessions(rpcClient) {
687
+ return {
688
+ async send(agentId, content) {
689
+ const result = await rpcClient.call("message.send", {
690
+ agentId,
691
+ content
692
+ });
693
+ return { ...result, requestId: "" };
694
+ },
695
+ async interrupt(agentId) {
696
+ const result = await rpcClient.call("agent.interrupt", { agentId });
697
+ return { ...result, requestId: "" };
698
+ },
699
+ async getMessages(agentId) {
700
+ const agentRes = await rpcClient.call("agent.get", { agentId });
701
+ if (!agentRes.agent) return [];
702
+ const msgRes = await rpcClient.call("image.messages", {
703
+ imageId: agentRes.agent.imageId
704
+ });
705
+ return msgRes.messages ?? [];
706
+ }
707
+ };
708
+ }
709
+
710
+ // src/LocalClient.ts
711
+ var logger = createLogger("agentx/LocalClient");
712
+ var LocalClient = class {
713
+ runtime;
714
+ isDisposed = false;
715
+ containers;
716
+ images;
717
+ agents;
718
+ sessions;
719
+ presentations;
720
+ constructor(runtime) {
721
+ this.runtime = runtime;
722
+ const platform = runtime.platform;
723
+ this.containers = createLocalContainers(platform);
724
+ this.images = createLocalImages(platform);
725
+ this.agents = createLocalAgents(runtime);
726
+ this.sessions = createLocalSessions(runtime);
727
+ this.presentations = createPresentations(this);
728
+ logger.info("LocalClient initialized");
729
+ }
730
+ // ==================== Properties ====================
731
+ get connected() {
732
+ return !this.isDisposed;
733
+ }
734
+ get events() {
735
+ return this.runtime.platform.eventBus;
736
+ }
737
+ // ==================== Event Subscription ====================
738
+ on(type, handler) {
739
+ return this.runtime.platform.eventBus.on(type, handler);
740
+ }
741
+ onAny(handler) {
742
+ return this.runtime.platform.eventBus.onAny(handler);
743
+ }
744
+ subscribe(_sessionId) {
745
+ }
746
+ // ==================== Lifecycle ====================
747
+ async disconnect() {
748
+ }
749
+ async dispose() {
750
+ if (this.isDisposed) return;
751
+ await this.runtime.shutdown();
752
+ this.isDisposed = true;
753
+ logger.info("LocalClient disposed");
754
+ }
755
+ };
756
+
712
757
  // src/RemoteClient.ts
713
- var logger = createLogger("agentx/RemoteClient");
758
+ import { EventBusImpl } from "@agentxjs/core/event";
759
+ import { RpcClient } from "@agentxjs/core/network";
760
+ import { createLogger as createLogger2 } from "commonxjs/logger";
761
+ var logger2 = createLogger2("agentx/RemoteClient");
714
762
  var RemoteClient = class {
715
763
  config;
716
764
  eventBus;
@@ -725,14 +773,14 @@ var RemoteClient = class {
725
773
  this.eventBus = new EventBusImpl();
726
774
  this.rpcClient = new RpcClient({
727
775
  url: config.serverUrl,
728
- createWebSocket: config.customPlatform?.webSocketFactory,
776
+ createWebSocket: config.customPlatform?.channelClient,
729
777
  timeout: config.timeout ?? 3e4,
730
778
  autoReconnect: config.autoReconnect ?? true,
731
779
  headers: config.headers,
732
780
  debug: false
733
781
  });
734
782
  this.rpcClient.onStreamEvent((topic, event) => {
735
- logger.debug("Received stream event", { topic, type: event.type });
783
+ logger2.debug("Received stream event", { topic, type: event.type });
736
784
  this.eventBus.emit(event);
737
785
  });
738
786
  this.containers = createRemoteContainers(this.rpcClient);
@@ -751,16 +799,16 @@ var RemoteClient = class {
751
799
  // ==================== Connection ====================
752
800
  async connect() {
753
801
  await this.rpcClient.connect();
754
- logger.info("Connected to server", { url: this.config.serverUrl });
802
+ logger2.info("Connected to server", { url: this.config.serverUrl });
755
803
  }
756
804
  async disconnect() {
757
805
  this.rpcClient.disconnect();
758
- logger.info("Disconnected from server");
806
+ logger2.info("Disconnected from server");
759
807
  }
760
808
  async dispose() {
761
809
  this.rpcClient.dispose();
762
810
  this.eventBus.destroy();
763
- logger.info("RemoteClient disposed");
811
+ logger2.info("RemoteClient disposed");
764
812
  }
765
813
  // ==================== Event Subscription ====================
766
814
  on(type, handler) {
@@ -771,55 +819,7 @@ var RemoteClient = class {
771
819
  }
772
820
  subscribe(sessionId) {
773
821
  this.rpcClient.subscribe(sessionId);
774
- logger.debug("Subscribed to session", { sessionId });
775
- }
776
- };
777
-
778
- // src/LocalClient.ts
779
- import { createLogger as createLogger2 } from "commonxjs/logger";
780
- var logger2 = createLogger2("agentx/LocalClient");
781
- var LocalClient = class {
782
- runtime;
783
- isDisposed = false;
784
- containers;
785
- images;
786
- agents;
787
- sessions;
788
- presentations;
789
- constructor(runtime) {
790
- this.runtime = runtime;
791
- const platform = runtime.platform;
792
- this.containers = createLocalContainers(platform);
793
- this.images = createLocalImages(platform);
794
- this.agents = createLocalAgents(runtime);
795
- this.sessions = createLocalSessions(runtime);
796
- this.presentations = createPresentations(this);
797
- logger2.info("LocalClient initialized");
798
- }
799
- // ==================== Properties ====================
800
- get connected() {
801
- return !this.isDisposed;
802
- }
803
- get events() {
804
- return this.runtime.platform.eventBus;
805
- }
806
- // ==================== Event Subscription ====================
807
- on(type, handler) {
808
- return this.runtime.platform.eventBus.on(type, handler);
809
- }
810
- onAny(handler) {
811
- return this.runtime.platform.eventBus.onAny(handler);
812
- }
813
- subscribe(_sessionId) {
814
- }
815
- // ==================== Lifecycle ====================
816
- async disconnect() {
817
- }
818
- async dispose() {
819
- if (this.isDisposed) return;
820
- await this.runtime.shutdown();
821
- this.isDisposed = true;
822
- logger2.info("LocalClient disposed");
822
+ logger2.debug("Subscribed to session", { sessionId });
823
823
  }
824
824
  };
825
825
 
@@ -839,7 +839,7 @@ async function createAgentX(config) {
839
839
  );
840
840
  }
841
841
  async function resolvePlatformForRemote(config) {
842
- if (config.customPlatform?.webSocketFactory) {
842
+ if (config.customPlatform?.channelClient) {
843
843
  return config;
844
844
  }
845
845
  if (typeof globalThis !== "undefined" && globalThis.window?.document !== void 0) {
@@ -851,7 +851,7 @@ async function resolvePlatformForRemote(config) {
851
851
  ...config,
852
852
  customPlatform: {
853
853
  ...config.customPlatform,
854
- webSocketFactory: createNodeWebSocket
854
+ channelClient: createNodeWebSocket
855
855
  }
856
856
  };
857
857
  } catch {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RemoteClient.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/namespaces/agents.ts","../src/namespaces/sessions.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/LocalClient.ts","../src/index.ts"],"sourcesContent":["/**\n * RemoteClient - AgentX client for remote server\n *\n * Uses RpcClient from @agentxjs/core/network for JSON-RPC communication.\n * This class focuses on business logic, not protocol details.\n */\n\nimport type { BusEvent, EventBus, BusEventHandler, Unsubscribe } from \"@agentxjs/core/event\";\nimport { EventBusImpl } from \"@agentxjs/core/event\";\nimport { RpcClient } from \"@agentxjs/core/network\";\nimport { createLogger } from \"commonxjs/logger\";\nimport type {\n AgentX,\n AgentXConfig,\n ContainerNamespace,\n ImageNamespace,\n AgentNamespace,\n SessionNamespace,\n PresentationNamespace,\n} from \"./types\";\nimport { createRemoteContainers } from \"./namespaces/containers\";\nimport { createRemoteImages } from \"./namespaces/images\";\nimport { createRemoteAgents } from \"./namespaces/agents\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport { createPresentations } from \"./namespaces/presentations\";\n\nconst logger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * RemoteClient implementation using JSON-RPC 2.0\n */\nexport class RemoteClient implements AgentX {\n private readonly config: AgentXConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(config: AgentXConfig) {\n this.config = config;\n this.eventBus = new EventBusImpl();\n\n // Create RPC client (WebSocket factory from platform if available)\n this.rpcClient = new RpcClient({\n url: config.serverUrl!,\n createWebSocket: config.customPlatform?.webSocketFactory,\n timeout: config.timeout ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n headers: config.headers as Record<string, string> | undefined,\n debug: false,\n });\n\n // Forward stream events to internal event bus\n this.rpcClient.onStreamEvent((topic, event) => {\n logger.debug(\"Received stream event\", { topic, type: event.type });\n this.eventBus.emit(event as BusEvent);\n });\n\n // Assemble namespaces\n this.containers = createRemoteContainers(this.rpcClient);\n this.images = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n this.agents = createRemoteAgents(this.rpcClient);\n this.sessions = createRemoteSessions(this.rpcClient);\n this.presentations = createPresentations(this);\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return this.rpcClient.connected;\n }\n\n get events(): EventBus {\n return this.eventBus;\n }\n\n // ==================== Connection ====================\n\n async connect(): Promise<void> {\n await this.rpcClient.connect();\n logger.info(\"Connected to server\", { url: this.config.serverUrl });\n }\n\n async disconnect(): Promise<void> {\n this.rpcClient.disconnect();\n logger.info(\"Disconnected from server\");\n }\n\n async dispose(): Promise<void> {\n this.rpcClient.dispose();\n this.eventBus.destroy();\n logger.info(\"RemoteClient disposed\");\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.eventBus.onAny(handler);\n }\n\n subscribe(sessionId: string): void {\n this.rpcClient.subscribe(sessionId);\n logger.debug(\"Subscribed to session\", { sessionId });\n }\n}\n","/**\n * Container namespace factories\n */\n\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type {\n ContainerNamespace,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerListResponse,\n} from \"../types\";\n\n/**\n * Create local container namespace backed by embedded runtime\n */\nexport function createLocalContainers(platform: AgentXPlatform): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const { getOrCreateContainer } = await import(\"@agentxjs/core/container\");\n const { containerRepository, imageRepository, sessionRepository } = platform;\n\n const container = await getOrCreateContainer(containerId, {\n containerRepository,\n imageRepository,\n sessionRepository,\n });\n\n return { containerId: container.containerId, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const exists = await platform.containerRepository.containerExists(containerId);\n return { containerId, exists, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const containers = await platform.containerRepository.findAllContainers();\n return { containerIds: containers.map((c) => c.containerId), requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote container namespace backed by RPC client\n */\nexport function createRemoteContainers(rpcClient: RpcClient): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const result = await rpcClient.call<ContainerCreateResponse>(\"container.create\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const result = await rpcClient.call<ContainerGetResponse>(\"container.get\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const result = await rpcClient.call<ContainerListResponse>(\"container.list\", {});\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Image namespace factories\n */\n\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type {\n ImageNamespace,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageUpdateResponse,\n BaseResponse,\n} from \"../types\";\n\n/**\n * Create local image namespace backed by embedded runtime\n */\nexport function createLocalImages(platform: AgentXPlatform): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const { imageRepository, sessionRepository } = platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: params.containerId,\n name: params.name,\n description: params.description,\n systemPrompt: params.systemPrompt,\n mcpServers: params.mcpServers as any,\n customData: params.customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return {\n record: image.toRecord(),\n __subscriptions: [image.sessionId],\n requestId: \"\",\n };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const record = await platform.imageRepository.findImageById(imageId);\n return {\n record,\n __subscriptions: record?.sessionId ? [record.sessionId] : undefined,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const records = containerId\n ? await platform.imageRepository.findImagesByContainerId(containerId)\n : await platform.imageRepository.findAllImages();\n\n return {\n records,\n __subscriptions: records.map((r) => r.sessionId),\n requestId: \"\",\n };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const updated = await image.update(updates);\n return { record: updated.toRecord(), requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) {\n await image.delete();\n }\n\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote image namespace backed by RPC client\n */\nexport function createRemoteImages(\n rpcClient: RpcClient,\n subscribeFn: (sessionId: string) => void\n): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const result = await rpcClient.call<ImageCreateResponse>(\"image.create\", params);\n\n // Auto subscribe to session events\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const result = await rpcClient.call<ImageGetResponse>(\"image.get\", { imageId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const result = await rpcClient.call<ImageListResponse>(\"image.list\", { containerId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const result = await rpcClient.call<ImageUpdateResponse>(\"image.update\", {\n imageId,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"image.delete\", { imageId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Agent namespace factories\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { RpcClient, RpcMethod } from \"@agentxjs/core/network\";\nimport type {\n AgentNamespace,\n AgentCreateResponse,\n AgentGetResponse,\n AgentListResponse,\n BaseResponse,\n} from \"../types\";\n\n/**\n * Create local agent namespace backed by embedded runtime\n */\nexport function createLocalAgents(runtime: AgentXRuntime): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Reuse existing running agent for this image\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === params.imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return {\n agentId: existingAgent.agentId,\n imageId: existingAgent.imageId,\n containerId: existingAgent.containerId,\n sessionId: existingAgent.sessionId,\n requestId: \"\",\n };\n }\n\n const agent = await runtime.createAgent({\n imageId: params.imageId,\n agentId: params.agentId,\n });\n\n return {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n requestId: \"\",\n };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const agent = runtime.getAgent(agentId);\n return {\n agent: agent\n ? {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n\n return {\n agents: agents.map((a) => ({\n agentId: a.agentId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n requestId: \"\",\n };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const agent = runtime.getAgent(agentId);\n if (agent) {\n await runtime.destroyAgent(agentId);\n }\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote agent namespace backed by RPC client\n */\nexport function createRemoteAgents(rpcClient: RpcClient): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Agent creation via image.run RPC\n const result = await rpcClient.call<AgentCreateResponse>(\"image.run\" as RpcMethod, {\n imageId: params.imageId,\n agentId: params.agentId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const result = await rpcClient.call<AgentGetResponse>(\"agent.get\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const result = await rpcClient.call<AgentListResponse>(\"agent.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.destroy\", { agentId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Session namespace factories (messaging)\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { UserContentPart, Message } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { SessionNamespace, MessageSendResponse, BaseResponse, AgentInfo } from \"../types\";\n\n/**\n * Create local session namespace backed by embedded runtime\n */\nexport function createLocalSessions(runtime: AgentXRuntime): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n await runtime.receive(agentId, content as string | UserContentPart[]);\n return { agentId, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n runtime.interrupt(agentId);\n return { requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agent = runtime.getAgent(agentId);\n if (!agent) return [];\n return runtime.platform.sessionRepository.getMessages(agent.sessionId);\n },\n };\n}\n\n/**\n * Create remote session namespace backed by RPC client\n */\nexport function createRemoteSessions(rpcClient: RpcClient): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n const result = await rpcClient.call<MessageSendResponse>(\"message.send\", {\n agentId,\n content,\n });\n return { ...result, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.interrupt\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agentRes = await rpcClient.call<{ agent: AgentInfo | null }>(\"agent.get\", { agentId });\n if (!agentRes.agent) return [];\n const msgRes = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", {\n imageId: agentRes.agent.imageId,\n });\n return msgRes.messages ?? [];\n },\n };\n}\n","/**\n * Presentation Types\n *\n * UI-friendly data model aggregated from stream events.\n * This implements the Presentation Model pattern.\n */\n\n// ============================================================================\n// Block Types - Basic content units\n// ============================================================================\n\n/**\n * Text block\n */\nexport interface TextBlock {\n type: \"text\";\n content: string;\n}\n\n/**\n * Tool block - represents a tool call and its result\n */\nexport interface ToolBlock {\n type: \"tool\";\n toolUseId: string;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolResult?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n}\n\n/**\n * Image block\n */\nexport interface ImageBlock {\n type: \"image\";\n url: string;\n alt?: string;\n}\n\n/**\n * All block types\n */\nexport type Block = TextBlock | ToolBlock | ImageBlock;\n\n// ============================================================================\n// Conversation Types - A single turn in the conversation\n// ============================================================================\n\n/**\n * User conversation\n */\nexport interface UserConversation {\n role: \"user\";\n blocks: Block[];\n}\n\n/**\n * Token usage for a message (one LLM call / step)\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/**\n * Assistant conversation\n */\nexport interface AssistantConversation {\n role: \"assistant\";\n blocks: Block[];\n isStreaming: boolean;\n /** Accumulated token usage across all steps in this conversation */\n usage?: TokenUsage;\n}\n\n/**\n * Error conversation\n */\nexport interface ErrorConversation {\n role: \"error\";\n message: string;\n}\n\n/**\n * All conversation types\n */\nexport type Conversation = UserConversation | AssistantConversation | ErrorConversation;\n\n// ============================================================================\n// Presentation State\n// ============================================================================\n\n/**\n * Presentation state - the complete UI state\n */\nexport interface PresentationState {\n /**\n * All completed conversations\n */\n conversations: Conversation[];\n\n /**\n * Current streaming conversation (null if not streaming)\n */\n streaming: AssistantConversation | null;\n\n /**\n * Current status\n */\n status: \"idle\" | \"thinking\" | \"responding\" | \"executing\";\n}\n\n/**\n * Initial presentation state\n */\nexport const initialPresentationState: PresentationState = {\n conversations: [],\n streaming: null,\n status: \"idle\",\n};\n","/**\n * Presentation Reducer\n *\n * Aggregates events into PresentationState.\n * Pure function: (state, event) => newState\n *\n * Event consumption strategy:\n * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * (for real-time streaming display)\n * - Message layer: tool_result_message\n * (for tool execution results — arrives after message_stop)\n *\n * Tool calls are stream-level blocks within the assistant turn,\n * matching the mainstream API pattern (Anthropic, OpenAI).\n */\n\nimport type { BusEvent } from \"@agentxjs/core/event\";\nimport type {\n Message,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n ErrorMessage,\n ToolResultOutput,\n ToolCallPart,\n} from \"@agentxjs/core/agent\";\nimport type {\n PresentationState,\n Conversation,\n AssistantConversation,\n TextBlock,\n ToolBlock,\n Block,\n TokenUsage,\n} from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\ninterface MessageStartData {\n messageId?: string;\n model?: string;\n}\n\ninterface TextDeltaData {\n text: string;\n}\n\ninterface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\ninterface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\ninterface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\ninterface MessageStopData {\n stopReason?: string;\n}\n\ninterface ErrorData {\n message: string;\n code?: string;\n}\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\n/**\n * Reduce an event into presentation state.\n *\n * Consumes:\n * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * - Message events: tool_result_message\n * - Error events: error\n */\nexport function presentationReducer(state: PresentationState, event: BusEvent): PresentationState {\n switch (event.type) {\n // Stream layer — real-time display\n case \"message_start\":\n return handleMessageStart(state, event.data as MessageStartData);\n\n case \"text_delta\":\n return handleTextDelta(state, event.data as TextDeltaData);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, event.data as ToolUseStartData);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, event.data as ToolUseStopData);\n\n case \"message_delta\":\n return handleMessageDelta(state, event.data as MessageDeltaData);\n\n case \"message_stop\":\n return handleMessageStop(state, event.data as MessageStopData);\n\n // Message layer — tool results from Engine\n case \"tool_result_message\":\n return handleToolResultMessage(state, event.data as ToolResultMessage);\n\n case \"error\":\n return handleError(state, event.data as ErrorData);\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nfunction handleMessageStart(state: PresentationState, _data: MessageStartData): PresentationState {\n // If streaming already exists (e.g. tool_use turn not yet flushed), flush it first\n let conversations = state.conversations;\n if (state.streaming && state.streaming.blocks.length > 0) {\n conversations = [...conversations, { ...state.streaming, isStreaming: false }];\n }\n\n const streaming: AssistantConversation = {\n role: \"assistant\",\n blocks: [],\n isStreaming: true,\n };\n\n return {\n ...state,\n conversations,\n streaming,\n status: \"thinking\",\n };\n}\n\nfunction handleTextDelta(state: PresentationState, data: TextDeltaData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = [...state.streaming.blocks];\n const lastBlock = blocks[blocks.length - 1];\n\n if (lastBlock && lastBlock.type === \"text\") {\n blocks[blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + data.text,\n };\n } else {\n blocks.push({\n type: \"text\",\n content: data.text,\n } as TextBlock);\n }\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleToolUseStart(state: PresentationState, data: ToolUseStartData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // Create a pending tool block — toolInput will be filled by tool_use_stop\n const toolBlock: ToolBlock = {\n type: \"tool\",\n toolUseId: data.toolCallId,\n toolName: data.toolName,\n toolInput: {},\n status: \"pending\",\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks: [...state.streaming.blocks, toolBlock],\n },\n status: \"executing\",\n };\n}\n\n/**\n * Handle tool_use_stop from stream layer.\n * Fills in the complete toolInput for the matching pending tool block.\n * The stream event carries the fully assembled input.\n */\nfunction handleToolUseStop(state: PresentationState, data: ToolUseStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === data.toolCallId) {\n return {\n ...block,\n toolInput: data.input,\n status: \"running\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n };\n}\n\nfunction handleMessageDelta(state: PresentationState, data: MessageDeltaData): PresentationState {\n if (!state.streaming || !data.usage) {\n return state;\n }\n\n const prev = state.streaming.usage;\n const usage: TokenUsage = {\n inputTokens: (prev?.inputTokens ?? 0) + data.usage.inputTokens,\n outputTokens: (prev?.outputTokens ?? 0) + data.usage.outputTokens,\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n usage,\n },\n };\n}\n\nfunction handleMessageStop(state: PresentationState, data: MessageStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // tool_use stop → don't flush, tool results are still incoming\n if (data.stopReason === \"tool_use\") {\n return {\n ...state,\n status: \"executing\",\n };\n }\n\n // end_turn / max_tokens / etc → flush streaming to conversations\n const completedConversation: AssistantConversation = {\n ...state.streaming,\n isStreaming: false,\n };\n\n return {\n ...state,\n conversations: [...state.conversations, completedConversation],\n streaming: null,\n status: \"idle\",\n };\n}\n\n/**\n * Handle tool_result_message from Engine layer.\n * Fills in the toolResult for the matching tool block.\n *\n * Note: tool_result_message arrives after message_stop(tool_use),\n * but streaming is kept alive (not flushed) during tool_use turns.\n */\nfunction handleToolResultMessage(\n state: PresentationState,\n data: ToolResultMessage\n): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const toolCallId = data.toolCallId;\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === toolCallId) {\n return {\n ...block,\n toolResult: formatToolResultOutput(data.toolResult.output),\n status:\n data.toolResult.output.type === \"error-text\" ||\n data.toolResult.output.type === \"error-json\" ||\n data.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleError(state: PresentationState, data: ErrorData): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"error\",\n message: data.message,\n },\n ],\n streaming: null,\n status: \"idle\",\n };\n}\n\n// ============================================================================\n// Helper: Add user conversation\n// ============================================================================\n\nexport function addUserConversation(state: PresentationState, content: string): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"user\",\n blocks: [{ type: \"text\", content }],\n },\n ],\n };\n}\n\nexport function createInitialState(): PresentationState {\n return { ...initialPresentationState };\n}\n\n// ============================================================================\n// Helper: Format tool result output\n// ============================================================================\n\nfunction formatToolResultOutput(output: ToolResultOutput): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Execution denied\";\n case \"content\":\n return output.value\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n }\n}\n\n// ============================================================================\n// Message → Conversation Converter\n// ============================================================================\n\n/**\n * Convert persisted Messages to Presentation Conversations.\n *\n * Groups consecutive assistant + tool-result messages\n * into a single AssistantConversation.\n *\n * Tool calls are now part of AssistantMessage.content (as ToolCallPart),\n * so we extract them directly from the assistant message.\n */\nexport function messagesToConversations(messages: Message[]): Conversation[] {\n const conversations: Conversation[] = [];\n let currentAssistant: AssistantConversation | null = null;\n\n function flushAssistant() {\n if (currentAssistant && currentAssistant.blocks.length > 0) {\n conversations.push(currentAssistant);\n }\n currentAssistant = null;\n }\n\n for (const msg of messages) {\n switch (msg.subtype) {\n case \"user\": {\n flushAssistant();\n const m = msg as UserMessage;\n const text =\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n conversations.push({\n role: \"user\",\n blocks: [{ type: \"text\", content: text }],\n });\n break;\n }\n\n case \"assistant\": {\n if (!currentAssistant) {\n currentAssistant = { role: \"assistant\", blocks: [], isStreaming: false };\n }\n const m = msg as AssistantMessage;\n if (typeof m.content === \"string\") {\n if (m.content) {\n currentAssistant.blocks.push({ type: \"text\", content: m.content } as TextBlock);\n }\n } else {\n // Extract text and tool call parts from content\n for (const part of m.content) {\n if (part.type === \"text\") {\n if (part.text) {\n currentAssistant.blocks.push({ type: \"text\", content: part.text } as TextBlock);\n }\n } else if (part.type === \"tool-call\") {\n const tc = part as ToolCallPart;\n currentAssistant.blocks.push({\n type: \"tool\",\n toolUseId: tc.id,\n toolName: tc.name,\n toolInput: tc.input,\n status: \"completed\",\n } as ToolBlock);\n }\n }\n }\n break;\n }\n\n case \"tool-result\": {\n const m = msg as ToolResultMessage;\n if (currentAssistant) {\n for (const block of currentAssistant.blocks) {\n if (block.type === \"tool\" && block.toolUseId === m.toolResult.id) {\n block.toolResult = formatToolResultOutput(m.toolResult.output);\n block.status =\n m.toolResult.output.type === \"error-text\" ||\n m.toolResult.output.type === \"error-json\" ||\n m.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\";\n break;\n }\n }\n }\n break;\n }\n\n case \"error\": {\n flushAssistant();\n const m = msg as ErrorMessage;\n conversations.push({\n role: \"error\",\n message: m.content,\n });\n break;\n }\n }\n }\n\n flushAssistant();\n return conversations;\n}\n","/**\n * Presentation Class\n *\n * High-level API for UI integration.\n * Wraps AgentX client and provides presentation state management.\n */\n\nimport type { AgentX } from \"../types\";\nimport type { Unsubscribe, BusEvent } from \"@agentxjs/core/event\";\nimport type { PresentationState, Conversation } from \"./types\";\nimport { initialPresentationState } from \"./types\";\nimport { presentationReducer, addUserConversation, createInitialState } from \"./reducer\";\n\n/**\n * Presentation update handler\n */\nexport type PresentationUpdateHandler = (state: PresentationState) => void;\n\n/**\n * Presentation error handler\n */\nexport type PresentationErrorHandler = (error: Error) => void;\n\n/**\n * Presentation options\n */\nexport interface PresentationOptions {\n /**\n * Called on every state update\n */\n onUpdate?: PresentationUpdateHandler;\n\n /**\n * Called on errors\n */\n onError?: PresentationErrorHandler;\n}\n\n/**\n * Presentation - UI-friendly wrapper for AgentX\n */\nexport class Presentation {\n private agentx: AgentX;\n private agentId: string;\n private state: PresentationState;\n private updateHandlers: Set<PresentationUpdateHandler> = new Set();\n private errorHandlers: Set<PresentationErrorHandler> = new Set();\n private eventUnsubscribe: Unsubscribe | null = null;\n\n constructor(\n agentx: AgentX,\n agentId: string,\n options?: PresentationOptions,\n initialConversations?: Conversation[]\n ) {\n this.agentx = agentx;\n this.agentId = agentId;\n this.state = initialConversations?.length\n ? { ...initialPresentationState, conversations: initialConversations }\n : createInitialState();\n\n // Register initial handlers\n if (options?.onUpdate) {\n this.updateHandlers.add(options.onUpdate);\n }\n if (options?.onError) {\n this.errorHandlers.add(options.onError);\n }\n\n // Subscribe to all events\n this.subscribeToEvents();\n }\n\n /**\n * Get current state\n */\n getState(): PresentationState {\n return this.state;\n }\n\n /**\n * Subscribe to state updates\n */\n onUpdate(handler: PresentationUpdateHandler): Unsubscribe {\n this.updateHandlers.add(handler);\n // Immediately call with current state\n handler(this.state);\n return () => {\n this.updateHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to errors\n */\n onError(handler: PresentationErrorHandler): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Send a message\n */\n async send(content: string): Promise<void> {\n // Add user conversation\n this.state = addUserConversation(this.state, content);\n this.notify();\n\n try {\n // Send message via agentx\n await this.agentx.sessions.send(this.agentId, content);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Interrupt current response\n */\n async interrupt(): Promise<void> {\n try {\n await this.agentx.sessions.interrupt(this.agentId);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.state = createInitialState();\n this.notify();\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n if (this.eventUnsubscribe) {\n this.eventUnsubscribe();\n this.eventUnsubscribe = null;\n }\n this.updateHandlers.clear();\n this.errorHandlers.clear();\n }\n\n // ==================== Private ====================\n\n private subscribeToEvents(): void {\n // Subscribe to all events and filter by agentId\n this.eventUnsubscribe = this.agentx.onAny((event: BusEvent) => {\n // Filter events for this agent (if context is available)\n // Note: Events from server may or may not include context with agentId\n const eventWithContext = event as BusEvent & { context?: { agentId?: string } };\n const eventAgentId = eventWithContext.context?.agentId;\n\n // Only filter if event has agentId and it doesn't match\n if (eventAgentId && eventAgentId !== this.agentId) {\n return;\n }\n\n // Reduce event into state\n const newState = presentationReducer(this.state, event);\n if (newState !== this.state) {\n this.state = newState;\n this.notify();\n }\n });\n }\n\n private notify(): void {\n for (const handler of this.updateHandlers) {\n try {\n handler(this.state);\n } catch (error) {\n console.error(\"Presentation update handler error:\", error);\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (e) {\n console.error(\"Presentation error handler error:\", e);\n }\n }\n }\n}\n","/**\n * Presentation namespace factory\n *\n * Single factory for both local and remote modes —\n * Presentation only depends on the AgentX interface.\n */\n\nimport type { AgentX, PresentationNamespace } from \"../types\";\nimport { Presentation, type PresentationOptions, messagesToConversations } from \"../presentation\";\n\n/**\n * Create presentation namespace backed by any AgentX client\n */\nexport function createPresentations(agentx: AgentX): PresentationNamespace {\n return {\n async create(agentId: string, options?: PresentationOptions): Promise<Presentation> {\n const messages = await agentx.sessions.getMessages(agentId);\n const conversations = messagesToConversations(messages);\n return new Presentation(agentx, agentId, options, conversations);\n },\n };\n}\n","/**\n * LocalClient - AgentX client for local mode\n *\n * Runs an embedded Runtime + Driver directly, without WebSocket.\n * Implements the same AgentX interface as RemoteClient.\n */\n\nimport type { BusEvent, EventBus, BusEventHandler, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport type {\n AgentX,\n ContainerNamespace,\n ImageNamespace,\n AgentNamespace,\n SessionNamespace,\n PresentationNamespace,\n} from \"./types\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport { createPresentations } from \"./namespaces/presentations\";\n\nconst logger = createLogger(\"agentx/LocalClient\");\n\n/**\n * LocalClient - Embedded runtime implementation\n */\nexport class LocalClient implements AgentX {\n private readonly runtime: AgentXRuntime;\n private isDisposed = false;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n this.containers = createLocalContainers(platform);\n this.images = createLocalImages(platform);\n this.agents = createLocalAgents(runtime);\n this.sessions = createLocalSessions(runtime);\n this.presentations = createPresentations(this);\n\n logger.info(\"LocalClient initialized\");\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return !this.isDisposed;\n }\n\n get events(): EventBus {\n return this.runtime.platform.eventBus;\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.runtime.platform.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.runtime.platform.eventBus.onAny(handler);\n }\n\n subscribe(_sessionId: string): void {\n // No-op for local mode - already subscribed via eventBus\n }\n\n // ==================== Lifecycle ====================\n\n async disconnect(): Promise<void> {\n // No-op for local mode\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) return;\n await this.runtime.shutdown();\n this.isDisposed = true;\n logger.info(\"LocalClient disposed\");\n }\n}\n","/**\n * agentxjs - AgentX Client SDK\n *\n * Unified entry point supporting local and remote modes.\n *\n * @example Local mode (embedded runtime)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * provider: \"anthropic\",\n * });\n *\n * await agentx.containers.create(\"my-app\");\n * const { record: image } = await agentx.images.create({\n * containerId: \"my-app\",\n * systemPrompt: \"You are helpful\",\n * });\n * const { agentId } = await agentx.agents.create({ imageId: image.imageId });\n *\n * agentx.on(\"text_delta\", (e) => process.stdout.write(e.data.text));\n * await agentx.sessions.send(agentId, \"Hello!\");\n * ```\n *\n * @example Remote mode (WebSocket client)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * serverUrl: \"ws://localhost:5200\",\n * });\n * ```\n */\n\nimport { RemoteClient } from \"./RemoteClient\";\nimport { LocalClient } from \"./LocalClient\";\nimport type { AgentX, AgentXConfig } from \"./types\";\n\n/**\n * Create an AgentX client\n *\n * Mode detection:\n * - `serverUrl` present → **Remote mode** (WebSocket client)\n * - `apiKey` present → **Local mode** (embedded Runtime + MonoDriver)\n *\n * @param config - Client configuration\n * @returns Connected AgentX client\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (config.serverUrl) {\n // Remote mode — resolve platform for WebSocket factory if needed\n const resolvedConfig = await resolvePlatformForRemote(config);\n const client = new RemoteClient(resolvedConfig);\n await client.connect();\n return client;\n }\n\n if (config.apiKey || config.createDriver || config.customPlatform) {\n // Local mode\n return createLocalClient(config);\n }\n\n throw new Error(\n \"Invalid AgentX config: provide either 'serverUrl' (remote mode) or 'apiKey' (local mode)\"\n );\n}\n\n/**\n * Resolve platform for remote mode\n *\n * In Node.js: auto-import node-platform to get webSocketFactory\n * In browser: no platform needed (native WebSocket is the default)\n */\nasync function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {\n if (config.customPlatform?.webSocketFactory) {\n return config;\n }\n\n // In browser, native WebSocket works — no platform needed\n if (typeof globalThis !== \"undefined\" && (globalThis as any).window?.document !== undefined) {\n return config;\n }\n\n // Node.js — auto-resolve webSocketFactory from node-platform\n try {\n const { createNodeWebSocket } = await import(\"@agentxjs/node-platform/network\");\n return {\n ...config,\n customPlatform: {\n ...config.customPlatform,\n webSocketFactory: createNodeWebSocket,\n } as any,\n };\n } catch {\n // node-platform not available, fall back to global WebSocket\n return config;\n }\n}\n\n/**\n * Create a local client with embedded runtime\n */\nasync function createLocalClient(config: AgentXConfig): Promise<AgentX> {\n const { createAgentXRuntime } = await import(\"@agentxjs/core/runtime\");\n\n // Resolve platform\n let platform;\n if (config.customPlatform) {\n platform = config.customPlatform;\n } else {\n const { createNodePlatform } = await import(\"@agentxjs/node-platform\");\n platform = await createNodePlatform({\n dataPath: config.dataPath ?? \":memory:\",\n logLevel: config.logLevel ?? (config.debug ? \"debug\" : undefined),\n });\n }\n\n // Resolve createDriver\n let createDriver = config.createDriver;\n if (!createDriver) {\n const { createMonoDriver } = await import(\"@agentxjs/mono-driver\");\n createDriver = (driverConfig: import(\"@agentxjs/core/driver\").DriverConfig) => {\n const existingOptions = (driverConfig as any).options ?? {};\n return createMonoDriver({\n ...driverConfig,\n apiKey: config.apiKey ?? driverConfig.apiKey,\n baseUrl: config.baseUrl ?? driverConfig.baseUrl,\n model: config.model ?? driverConfig.model,\n options: {\n ...existingOptions,\n provider: config.provider ?? existingOptions.provider ?? \"anthropic\",\n },\n });\n };\n }\n\n // Create runtime\n const runtime = createAgentXRuntime(platform, createDriver);\n\n return new LocalClient(runtime);\n}\n\n// Re-export types\nexport type {\n AgentX,\n AgentXConfig,\n LLMProvider,\n MaybeAsync,\n AgentInfo,\n ImageRecord,\n ContainerInfo,\n ContainerNamespace,\n ImageNamespace,\n AgentNamespace,\n SessionNamespace,\n PresentationNamespace,\n AgentCreateResponse,\n AgentGetResponse,\n AgentListResponse,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerListResponse,\n MessageSendResponse,\n BaseResponse,\n} from \"./types\";\n\n// Re-export Presentation types and classes\nexport type {\n Block,\n TextBlock,\n ToolBlock,\n ImageBlock,\n Conversation,\n UserConversation,\n AssistantConversation,\n ErrorConversation,\n PresentationState,\n PresentationOptions,\n PresentationUpdateHandler,\n PresentationErrorHandler,\n} from \"./presentation\";\n\nexport {\n Presentation,\n presentationReducer,\n addUserConversation,\n createInitialState,\n initialPresentationState,\n messagesToConversations,\n} from \"./presentation\";\n"],"mappings":"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","names":["createLogger","logger","createLogger"]}
1
+ {"version":3,"sources":["../src/LocalClient.ts","../src/namespaces/agents.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/namespaces/sessions.ts","../src/RemoteClient.ts","../src/index.ts"],"sourcesContent":["/**\n * LocalClient - AgentX client for local mode\n *\n * Runs an embedded Runtime + Driver directly, without WebSocket.\n * Implements the same AgentX interface as RemoteClient.\n */\n\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n ContainerNamespace,\n ImageNamespace,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/LocalClient\");\n\n/**\n * LocalClient - Embedded runtime implementation\n */\nexport class LocalClient implements AgentX {\n private readonly runtime: AgentXRuntime;\n private isDisposed = false;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n this.containers = createLocalContainers(platform);\n this.images = createLocalImages(platform);\n this.agents = createLocalAgents(runtime);\n this.sessions = createLocalSessions(runtime);\n this.presentations = createPresentations(this);\n\n logger.info(\"LocalClient initialized\");\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return !this.isDisposed;\n }\n\n get events(): EventBus {\n return this.runtime.platform.eventBus;\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.runtime.platform.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.runtime.platform.eventBus.onAny(handler);\n }\n\n subscribe(_sessionId: string): void {\n // No-op for local mode - already subscribed via eventBus\n }\n\n // ==================== Lifecycle ====================\n\n async disconnect(): Promise<void> {\n // No-op for local mode\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) return;\n await this.runtime.shutdown();\n this.isDisposed = true;\n logger.info(\"LocalClient disposed\");\n }\n}\n","/**\n * Agent namespace factories\n */\n\nimport type { RpcClient, RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentListResponse,\n AgentNamespace,\n BaseResponse,\n} from \"../types\";\n\n/**\n * Create local agent namespace backed by embedded runtime\n */\nexport function createLocalAgents(runtime: AgentXRuntime): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Reuse existing running agent for this image\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === params.imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return {\n agentId: existingAgent.agentId,\n imageId: existingAgent.imageId,\n containerId: existingAgent.containerId,\n sessionId: existingAgent.sessionId,\n requestId: \"\",\n };\n }\n\n const agent = await runtime.createAgent({\n imageId: params.imageId,\n agentId: params.agentId,\n });\n\n return {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n requestId: \"\",\n };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const agent = runtime.getAgent(agentId);\n return {\n agent: agent\n ? {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n\n return {\n agents: agents.map((a) => ({\n agentId: a.agentId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n requestId: \"\",\n };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const agent = runtime.getAgent(agentId);\n if (agent) {\n await runtime.destroyAgent(agentId);\n }\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote agent namespace backed by RPC client\n */\nexport function createRemoteAgents(rpcClient: RpcClient): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Agent creation via image.run RPC\n const result = await rpcClient.call<AgentCreateResponse>(\"image.run\" as RpcMethod, {\n imageId: params.imageId,\n agentId: params.agentId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const result = await rpcClient.call<AgentGetResponse>(\"agent.get\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const result = await rpcClient.call<AgentListResponse>(\"agent.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.destroy\", { agentId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Container namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerListResponse,\n ContainerNamespace,\n} from \"../types\";\n\n/**\n * Create local container namespace backed by embedded runtime\n */\nexport function createLocalContainers(platform: AgentXPlatform): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const { getOrCreateContainer } = await import(\"@agentxjs/core/container\");\n const { containerRepository, imageRepository, sessionRepository } = platform;\n\n const container = await getOrCreateContainer(containerId, {\n containerRepository,\n imageRepository,\n sessionRepository,\n });\n\n return { containerId: container.containerId, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const exists = await platform.containerRepository.containerExists(containerId);\n return { containerId, exists, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const containers = await platform.containerRepository.findAllContainers();\n return { containerIds: containers.map((c) => c.containerId), requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote container namespace backed by RPC client\n */\nexport function createRemoteContainers(rpcClient: RpcClient): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const result = await rpcClient.call<ContainerCreateResponse>(\"container.create\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const result = await rpcClient.call<ContainerGetResponse>(\"container.get\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const result = await rpcClient.call<ContainerListResponse>(\"container.list\", {});\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Image namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n BaseResponse,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageUpdateResponse,\n} from \"../types\";\n\n/**\n * Create local image namespace backed by embedded runtime\n */\nexport function createLocalImages(platform: AgentXPlatform): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const { imageRepository, sessionRepository } = platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: params.containerId,\n name: params.name,\n description: params.description,\n systemPrompt: params.systemPrompt,\n mcpServers: params.mcpServers as any,\n customData: params.customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return {\n record: image.toRecord(),\n __subscriptions: [image.sessionId],\n requestId: \"\",\n };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const record = await platform.imageRepository.findImageById(imageId);\n return {\n record,\n __subscriptions: record?.sessionId ? [record.sessionId] : undefined,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const records = containerId\n ? await platform.imageRepository.findImagesByContainerId(containerId)\n : await platform.imageRepository.findAllImages();\n\n return {\n records,\n __subscriptions: records.map((r) => r.sessionId),\n requestId: \"\",\n };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const updated = await image.update(updates);\n return { record: updated.toRecord(), requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) {\n await image.delete();\n }\n\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote image namespace backed by RPC client\n */\nexport function createRemoteImages(\n rpcClient: RpcClient,\n subscribeFn: (sessionId: string) => void\n): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const result = await rpcClient.call<ImageCreateResponse>(\"image.create\", params);\n\n // Auto subscribe to session events\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const result = await rpcClient.call<ImageGetResponse>(\"image.get\", { imageId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const result = await rpcClient.call<ImageListResponse>(\"image.list\", { containerId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const result = await rpcClient.call<ImageUpdateResponse>(\"image.update\", {\n imageId,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"image.delete\", { imageId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Presentation Types\n *\n * UI-friendly data model aggregated from stream events.\n * This implements the Presentation Model pattern.\n */\n\n// ============================================================================\n// Block Types - Basic content units\n// ============================================================================\n\n/**\n * Text block\n */\nexport interface TextBlock {\n type: \"text\";\n content: string;\n}\n\n/**\n * Tool block - represents a tool call and its result\n */\nexport interface ToolBlock {\n type: \"tool\";\n toolUseId: string;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolResult?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n}\n\n/**\n * Image block\n */\nexport interface ImageBlock {\n type: \"image\";\n url: string;\n alt?: string;\n}\n\n/**\n * All block types\n */\nexport type Block = TextBlock | ToolBlock | ImageBlock;\n\n// ============================================================================\n// Conversation Types - A single turn in the conversation\n// ============================================================================\n\n/**\n * User conversation\n */\nexport interface UserConversation {\n role: \"user\";\n blocks: Block[];\n}\n\n/**\n * Token usage for a message (one LLM call / step)\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/**\n * Assistant conversation\n */\nexport interface AssistantConversation {\n role: \"assistant\";\n blocks: Block[];\n isStreaming: boolean;\n /** Accumulated token usage across all steps in this conversation */\n usage?: TokenUsage;\n}\n\n/**\n * Error conversation\n */\nexport interface ErrorConversation {\n role: \"error\";\n message: string;\n}\n\n/**\n * All conversation types\n */\nexport type Conversation = UserConversation | AssistantConversation | ErrorConversation;\n\n// ============================================================================\n// Presentation State\n// ============================================================================\n\n/**\n * Presentation state - the complete UI state\n */\nexport interface PresentationState {\n /**\n * All completed conversations\n */\n conversations: Conversation[];\n\n /**\n * Current streaming conversation (null if not streaming)\n */\n streaming: AssistantConversation | null;\n\n /**\n * Current status\n */\n status: \"idle\" | \"thinking\" | \"responding\" | \"executing\";\n}\n\n/**\n * Initial presentation state\n */\nexport const initialPresentationState: PresentationState = {\n conversations: [],\n streaming: null,\n status: \"idle\",\n};\n","/**\n * Presentation Reducer\n *\n * Aggregates events into PresentationState.\n * Pure function: (state, event) => newState\n *\n * Event consumption strategy:\n * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * (for real-time streaming display)\n * - Message layer: tool_result_message\n * (for tool execution results — arrives after message_stop)\n *\n * Tool calls are stream-level blocks within the assistant turn,\n * matching the mainstream API pattern (Anthropic, OpenAI).\n */\n\nimport type {\n AssistantMessage,\n ErrorMessage,\n Message,\n ToolCallPart,\n ToolResultMessage,\n ToolResultOutput,\n UserMessage,\n} from \"@agentxjs/core/agent\";\nimport type { BusEvent } from \"@agentxjs/core/event\";\nimport type {\n AssistantConversation,\n Block,\n Conversation,\n PresentationState,\n TextBlock,\n TokenUsage,\n ToolBlock,\n} from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\ninterface MessageStartData {\n messageId?: string;\n model?: string;\n}\n\ninterface TextDeltaData {\n text: string;\n}\n\ninterface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\ninterface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\ninterface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\ninterface MessageStopData {\n stopReason?: string;\n}\n\ninterface ErrorData {\n message: string;\n code?: string;\n}\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\n/**\n * Reduce an event into presentation state.\n *\n * Consumes:\n * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * - Message events: tool_result_message\n * - Error events: error\n */\nexport function presentationReducer(state: PresentationState, event: BusEvent): PresentationState {\n switch (event.type) {\n // Stream layer — real-time display\n case \"message_start\":\n return handleMessageStart(state, event.data as MessageStartData);\n\n case \"text_delta\":\n return handleTextDelta(state, event.data as TextDeltaData);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, event.data as ToolUseStartData);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, event.data as ToolUseStopData);\n\n case \"message_delta\":\n return handleMessageDelta(state, event.data as MessageDeltaData);\n\n case \"message_stop\":\n return handleMessageStop(state, event.data as MessageStopData);\n\n // Message layer — tool results from Engine\n case \"tool_result_message\":\n return handleToolResultMessage(state, event.data as ToolResultMessage);\n\n case \"error\":\n return handleError(state, event.data as ErrorData);\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nfunction handleMessageStart(state: PresentationState, _data: MessageStartData): PresentationState {\n // If streaming already exists (e.g. tool_use turn not yet flushed), flush it first\n let conversations = state.conversations;\n if (state.streaming && state.streaming.blocks.length > 0) {\n conversations = [...conversations, { ...state.streaming, isStreaming: false }];\n }\n\n const streaming: AssistantConversation = {\n role: \"assistant\",\n blocks: [],\n isStreaming: true,\n };\n\n return {\n ...state,\n conversations,\n streaming,\n status: \"thinking\",\n };\n}\n\nfunction handleTextDelta(state: PresentationState, data: TextDeltaData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = [...state.streaming.blocks];\n const lastBlock = blocks[blocks.length - 1];\n\n if (lastBlock && lastBlock.type === \"text\") {\n blocks[blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + data.text,\n };\n } else {\n blocks.push({\n type: \"text\",\n content: data.text,\n } as TextBlock);\n }\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleToolUseStart(state: PresentationState, data: ToolUseStartData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // Create a pending tool block — toolInput will be filled by tool_use_stop\n const toolBlock: ToolBlock = {\n type: \"tool\",\n toolUseId: data.toolCallId,\n toolName: data.toolName,\n toolInput: {},\n status: \"pending\",\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks: [...state.streaming.blocks, toolBlock],\n },\n status: \"executing\",\n };\n}\n\n/**\n * Handle tool_use_stop from stream layer.\n * Fills in the complete toolInput for the matching pending tool block.\n * The stream event carries the fully assembled input.\n */\nfunction handleToolUseStop(state: PresentationState, data: ToolUseStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === data.toolCallId) {\n return {\n ...block,\n toolInput: data.input,\n status: \"running\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n };\n}\n\nfunction handleMessageDelta(state: PresentationState, data: MessageDeltaData): PresentationState {\n if (!state.streaming || !data.usage) {\n return state;\n }\n\n const prev = state.streaming.usage;\n const usage: TokenUsage = {\n inputTokens: (prev?.inputTokens ?? 0) + data.usage.inputTokens,\n outputTokens: (prev?.outputTokens ?? 0) + data.usage.outputTokens,\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n usage,\n },\n };\n}\n\nfunction handleMessageStop(state: PresentationState, data: MessageStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // tool_use stop → don't flush, tool results are still incoming\n if (data.stopReason === \"tool_use\") {\n return {\n ...state,\n status: \"executing\",\n };\n }\n\n // end_turn / max_tokens / etc → flush streaming to conversations\n const completedConversation: AssistantConversation = {\n ...state.streaming,\n isStreaming: false,\n };\n\n return {\n ...state,\n conversations: [...state.conversations, completedConversation],\n streaming: null,\n status: \"idle\",\n };\n}\n\n/**\n * Handle tool_result_message from Engine layer.\n * Fills in the toolResult for the matching tool block.\n *\n * Note: tool_result_message arrives after message_stop(tool_use),\n * but streaming is kept alive (not flushed) during tool_use turns.\n */\nfunction handleToolResultMessage(\n state: PresentationState,\n data: ToolResultMessage\n): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const toolCallId = data.toolCallId;\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === toolCallId) {\n return {\n ...block,\n toolResult: formatToolResultOutput(data.toolResult.output),\n status:\n data.toolResult.output.type === \"error-text\" ||\n data.toolResult.output.type === \"error-json\" ||\n data.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleError(state: PresentationState, data: ErrorData): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"error\",\n message: data.message,\n },\n ],\n streaming: null,\n status: \"idle\",\n };\n}\n\n// ============================================================================\n// Helper: Add user conversation\n// ============================================================================\n\nexport function addUserConversation(state: PresentationState, content: string): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"user\",\n blocks: [{ type: \"text\", content }],\n },\n ],\n };\n}\n\nexport function createInitialState(): PresentationState {\n return { ...initialPresentationState };\n}\n\n// ============================================================================\n// Helper: Format tool result output\n// ============================================================================\n\nfunction formatToolResultOutput(output: ToolResultOutput): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Execution denied\";\n case \"content\":\n return output.value\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n }\n}\n\n// ============================================================================\n// Message → Conversation Converter\n// ============================================================================\n\n/**\n * Convert persisted Messages to Presentation Conversations.\n *\n * Groups consecutive assistant + tool-result messages\n * into a single AssistantConversation.\n *\n * Tool calls are now part of AssistantMessage.content (as ToolCallPart),\n * so we extract them directly from the assistant message.\n */\nexport function messagesToConversations(messages: Message[]): Conversation[] {\n const conversations: Conversation[] = [];\n let currentAssistant: AssistantConversation | null = null;\n\n function flushAssistant() {\n if (currentAssistant && currentAssistant.blocks.length > 0) {\n conversations.push(currentAssistant);\n }\n currentAssistant = null;\n }\n\n for (const msg of messages) {\n switch (msg.subtype) {\n case \"user\": {\n flushAssistant();\n const m = msg as UserMessage;\n const text =\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n conversations.push({\n role: \"user\",\n blocks: [{ type: \"text\", content: text }],\n });\n break;\n }\n\n case \"assistant\": {\n if (!currentAssistant) {\n currentAssistant = { role: \"assistant\", blocks: [], isStreaming: false };\n }\n const m = msg as AssistantMessage;\n if (typeof m.content === \"string\") {\n if (m.content) {\n currentAssistant.blocks.push({ type: \"text\", content: m.content } as TextBlock);\n }\n } else {\n // Extract text and tool call parts from content\n for (const part of m.content) {\n if (part.type === \"text\") {\n if (part.text) {\n currentAssistant.blocks.push({ type: \"text\", content: part.text } as TextBlock);\n }\n } else if (part.type === \"tool-call\") {\n const tc = part as ToolCallPart;\n currentAssistant.blocks.push({\n type: \"tool\",\n toolUseId: tc.id,\n toolName: tc.name,\n toolInput: tc.input,\n status: \"completed\",\n } as ToolBlock);\n }\n }\n }\n break;\n }\n\n case \"tool-result\": {\n const m = msg as ToolResultMessage;\n if (currentAssistant) {\n for (const block of currentAssistant.blocks) {\n if (block.type === \"tool\" && block.toolUseId === m.toolResult.id) {\n block.toolResult = formatToolResultOutput(m.toolResult.output);\n block.status =\n m.toolResult.output.type === \"error-text\" ||\n m.toolResult.output.type === \"error-json\" ||\n m.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\";\n break;\n }\n }\n }\n break;\n }\n\n case \"error\": {\n flushAssistant();\n const m = msg as ErrorMessage;\n conversations.push({\n role: \"error\",\n message: m.content,\n });\n break;\n }\n }\n }\n\n flushAssistant();\n return conversations;\n}\n","/**\n * Presentation Class\n *\n * High-level API for UI integration.\n * Wraps AgentX client and provides presentation state management.\n */\n\nimport type { BusEvent, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentX } from \"../types\";\nimport { addUserConversation, createInitialState, presentationReducer } from \"./reducer\";\nimport type { Conversation, PresentationState } from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n/**\n * Presentation update handler\n */\nexport type PresentationUpdateHandler = (state: PresentationState) => void;\n\n/**\n * Presentation error handler\n */\nexport type PresentationErrorHandler = (error: Error) => void;\n\n/**\n * Presentation options\n */\nexport interface PresentationOptions {\n /**\n * Called on every state update\n */\n onUpdate?: PresentationUpdateHandler;\n\n /**\n * Called on errors\n */\n onError?: PresentationErrorHandler;\n}\n\n/**\n * Presentation - UI-friendly wrapper for AgentX\n */\nexport class Presentation {\n private agentx: AgentX;\n private agentId: string;\n private state: PresentationState;\n private updateHandlers: Set<PresentationUpdateHandler> = new Set();\n private errorHandlers: Set<PresentationErrorHandler> = new Set();\n private eventUnsubscribe: Unsubscribe | null = null;\n\n constructor(\n agentx: AgentX,\n agentId: string,\n options?: PresentationOptions,\n initialConversations?: Conversation[]\n ) {\n this.agentx = agentx;\n this.agentId = agentId;\n this.state = initialConversations?.length\n ? { ...initialPresentationState, conversations: initialConversations }\n : createInitialState();\n\n // Register initial handlers\n if (options?.onUpdate) {\n this.updateHandlers.add(options.onUpdate);\n }\n if (options?.onError) {\n this.errorHandlers.add(options.onError);\n }\n\n // Subscribe to all events\n this.subscribeToEvents();\n }\n\n /**\n * Get current state\n */\n getState(): PresentationState {\n return this.state;\n }\n\n /**\n * Subscribe to state updates\n */\n onUpdate(handler: PresentationUpdateHandler): Unsubscribe {\n this.updateHandlers.add(handler);\n // Immediately call with current state\n handler(this.state);\n return () => {\n this.updateHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to errors\n */\n onError(handler: PresentationErrorHandler): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Send a message\n */\n async send(content: string): Promise<void> {\n // Add user conversation\n this.state = addUserConversation(this.state, content);\n this.notify();\n\n try {\n // Send message via agentx\n await this.agentx.sessions.send(this.agentId, content);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Interrupt current response\n */\n async interrupt(): Promise<void> {\n try {\n await this.agentx.sessions.interrupt(this.agentId);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.state = createInitialState();\n this.notify();\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n if (this.eventUnsubscribe) {\n this.eventUnsubscribe();\n this.eventUnsubscribe = null;\n }\n this.updateHandlers.clear();\n this.errorHandlers.clear();\n }\n\n // ==================== Private ====================\n\n private subscribeToEvents(): void {\n // Subscribe to all events and filter by agentId\n this.eventUnsubscribe = this.agentx.onAny((event: BusEvent) => {\n // Filter events for this agent (if context is available)\n // Note: Events from server may or may not include context with agentId\n const eventWithContext = event as BusEvent & { context?: { agentId?: string } };\n const eventAgentId = eventWithContext.context?.agentId;\n\n // Only filter if event has agentId and it doesn't match\n if (eventAgentId && eventAgentId !== this.agentId) {\n return;\n }\n\n // Reduce event into state\n const newState = presentationReducer(this.state, event);\n if (newState !== this.state) {\n this.state = newState;\n this.notify();\n }\n });\n }\n\n private notify(): void {\n for (const handler of this.updateHandlers) {\n try {\n handler(this.state);\n } catch (error) {\n console.error(\"Presentation update handler error:\", error);\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (e) {\n console.error(\"Presentation error handler error:\", e);\n }\n }\n }\n}\n","/**\n * Presentation namespace factory\n *\n * Single factory for both local and remote modes —\n * Presentation only depends on the AgentX interface.\n */\n\nimport { messagesToConversations, Presentation, type PresentationOptions } from \"../presentation\";\nimport type { AgentX, PresentationNamespace } from \"../types\";\n\n/**\n * Create presentation namespace backed by any AgentX client\n */\nexport function createPresentations(agentx: AgentX): PresentationNamespace {\n return {\n async create(agentId: string, options?: PresentationOptions): Promise<Presentation> {\n const messages = await agentx.sessions.getMessages(agentId);\n const conversations = messagesToConversations(messages);\n return new Presentation(agentx, agentId, options, conversations);\n },\n };\n}\n","/**\n * Session namespace factories (messaging)\n */\n\nimport type { Message, UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { AgentInfo, BaseResponse, MessageSendResponse, SessionNamespace } from \"../types\";\n\n/**\n * Create local session namespace backed by embedded runtime\n */\nexport function createLocalSessions(runtime: AgentXRuntime): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n await runtime.receive(agentId, content as string | UserContentPart[]);\n return { agentId, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n runtime.interrupt(agentId);\n return { requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agent = runtime.getAgent(agentId);\n if (!agent) return [];\n return runtime.platform.sessionRepository.getMessages(agent.sessionId);\n },\n };\n}\n\n/**\n * Create remote session namespace backed by RPC client\n */\nexport function createRemoteSessions(rpcClient: RpcClient): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n const result = await rpcClient.call<MessageSendResponse>(\"message.send\", {\n agentId,\n content,\n });\n return { ...result, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.interrupt\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agentRes = await rpcClient.call<{ agent: AgentInfo | null }>(\"agent.get\", { agentId });\n if (!agentRes.agent) return [];\n const msgRes = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", {\n imageId: agentRes.agent.imageId,\n });\n return msgRes.messages ?? [];\n },\n };\n}\n","/**\n * RemoteClient - AgentX client for remote server\n *\n * Uses RpcClient from @agentxjs/core/network for JSON-RPC communication.\n * This class focuses on business logic, not protocol details.\n */\n\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport { EventBusImpl } from \"@agentxjs/core/event\";\nimport { RpcClient } from \"@agentxjs/core/network\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createRemoteAgents } from \"./namespaces/agents\";\nimport { createRemoteContainers } from \"./namespaces/containers\";\nimport { createRemoteImages } from \"./namespaces/images\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n AgentXConfig,\n ContainerNamespace,\n ImageNamespace,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * RemoteClient implementation using JSON-RPC 2.0\n */\nexport class RemoteClient implements AgentX {\n private readonly config: AgentXConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(config: AgentXConfig) {\n this.config = config;\n this.eventBus = new EventBusImpl();\n\n // Create RPC client (WebSocket factory from platform if available)\n this.rpcClient = new RpcClient({\n url: config.serverUrl!,\n createWebSocket: config.customPlatform?.channelClient,\n timeout: config.timeout ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n headers: config.headers as Record<string, string> | undefined,\n debug: false,\n });\n\n // Forward stream events to internal event bus\n this.rpcClient.onStreamEvent((topic, event) => {\n logger.debug(\"Received stream event\", { topic, type: event.type });\n this.eventBus.emit(event as BusEvent);\n });\n\n // Assemble namespaces\n this.containers = createRemoteContainers(this.rpcClient);\n this.images = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n this.agents = createRemoteAgents(this.rpcClient);\n this.sessions = createRemoteSessions(this.rpcClient);\n this.presentations = createPresentations(this);\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return this.rpcClient.connected;\n }\n\n get events(): EventBus {\n return this.eventBus;\n }\n\n // ==================== Connection ====================\n\n async connect(): Promise<void> {\n await this.rpcClient.connect();\n logger.info(\"Connected to server\", { url: this.config.serverUrl });\n }\n\n async disconnect(): Promise<void> {\n this.rpcClient.disconnect();\n logger.info(\"Disconnected from server\");\n }\n\n async dispose(): Promise<void> {\n this.rpcClient.dispose();\n this.eventBus.destroy();\n logger.info(\"RemoteClient disposed\");\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.eventBus.onAny(handler);\n }\n\n subscribe(sessionId: string): void {\n this.rpcClient.subscribe(sessionId);\n logger.debug(\"Subscribed to session\", { sessionId });\n }\n}\n","/**\n * agentxjs - AgentX Client SDK\n *\n * Unified entry point supporting local and remote modes.\n *\n * @example Local mode (embedded runtime)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * provider: \"anthropic\",\n * });\n *\n * await agentx.containers.create(\"my-app\");\n * const { record: image } = await agentx.images.create({\n * containerId: \"my-app\",\n * systemPrompt: \"You are helpful\",\n * });\n * const { agentId } = await agentx.agents.create({ imageId: image.imageId });\n *\n * agentx.on(\"text_delta\", (e) => process.stdout.write(e.data.text));\n * await agentx.sessions.send(agentId, \"Hello!\");\n * ```\n *\n * @example Remote mode (WebSocket client)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * serverUrl: \"ws://localhost:5200\",\n * });\n * ```\n */\n\nimport { LocalClient } from \"./LocalClient\";\nimport { RemoteClient } from \"./RemoteClient\";\nimport type { AgentX, AgentXConfig } from \"./types\";\n\n/**\n * Create an AgentX client\n *\n * Mode detection:\n * - `serverUrl` present → **Remote mode** (WebSocket client)\n * - `apiKey` present → **Local mode** (embedded Runtime + MonoDriver)\n *\n * @param config - Client configuration\n * @returns Connected AgentX client\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (config.serverUrl) {\n // Remote mode — resolve platform for WebSocket factory if needed\n const resolvedConfig = await resolvePlatformForRemote(config);\n const client = new RemoteClient(resolvedConfig);\n await client.connect();\n return client;\n }\n\n if (config.apiKey || config.createDriver || config.customPlatform) {\n // Local mode\n return createLocalClient(config);\n }\n\n throw new Error(\n \"Invalid AgentX config: provide either 'serverUrl' (remote mode) or 'apiKey' (local mode)\"\n );\n}\n\n/**\n * Resolve platform for remote mode\n *\n * In Node.js: auto-import node-platform to get channelClient\n * In browser: no platform needed (native WebSocket is the default)\n */\nasync function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {\n if (config.customPlatform?.channelClient) {\n return config;\n }\n\n // In browser, native WebSocket works — no platform needed\n if (typeof globalThis !== \"undefined\" && (globalThis as any).window?.document !== undefined) {\n return config;\n }\n\n // Node.js — auto-resolve channelClient from node-platform\n try {\n const { createNodeWebSocket } = await import(\"@agentxjs/node-platform/network\");\n return {\n ...config,\n customPlatform: {\n ...config.customPlatform,\n channelClient: createNodeWebSocket,\n } as any,\n };\n } catch {\n // node-platform not available, fall back to global WebSocket\n return config;\n }\n}\n\n/**\n * Create a local client with embedded runtime\n */\nasync function createLocalClient(config: AgentXConfig): Promise<AgentX> {\n const { createAgentXRuntime } = await import(\"@agentxjs/core/runtime\");\n\n // Resolve platform\n let platform;\n if (config.customPlatform) {\n platform = config.customPlatform;\n } else {\n const { createNodePlatform } = await import(\"@agentxjs/node-platform\");\n platform = await createNodePlatform({\n dataPath: config.dataPath ?? \":memory:\",\n logLevel: config.logLevel ?? (config.debug ? \"debug\" : undefined),\n });\n }\n\n // Resolve createDriver\n let createDriver = config.createDriver;\n if (!createDriver) {\n const { createMonoDriver } = await import(\"@agentxjs/mono-driver\");\n createDriver = (driverConfig: import(\"@agentxjs/core/driver\").DriverConfig) => {\n const existingOptions = (driverConfig as any).options ?? {};\n return createMonoDriver({\n ...driverConfig,\n apiKey: config.apiKey ?? driverConfig.apiKey,\n baseUrl: config.baseUrl ?? driverConfig.baseUrl,\n model: config.model ?? driverConfig.model,\n options: {\n ...existingOptions,\n provider: config.provider ?? existingOptions.provider ?? \"anthropic\",\n },\n });\n };\n }\n\n // Create runtime\n const runtime = createAgentXRuntime(platform, createDriver);\n\n return new LocalClient(runtime);\n}\n\n// Re-export Presentation types and classes\nexport type {\n AssistantConversation,\n Block,\n Conversation,\n ErrorConversation,\n ImageBlock,\n PresentationErrorHandler,\n PresentationOptions,\n PresentationState,\n PresentationUpdateHandler,\n TextBlock,\n ToolBlock,\n UserConversation,\n} from \"./presentation\";\nexport {\n addUserConversation,\n createInitialState,\n initialPresentationState,\n messagesToConversations,\n Presentation,\n presentationReducer,\n} from \"./presentation\";\n// Re-export types\nexport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentInfo,\n AgentListResponse,\n AgentNamespace,\n AgentX,\n AgentXConfig,\n BaseResponse,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerInfo,\n ContainerListResponse,\n ContainerNamespace,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageRecord,\n LLMProvider,\n MaybeAsync,\n MessageSendResponse,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n"],"mappings":";AASA,SAAS,oBAAoB;;;ACQtB,SAAS,kBAAkB,SAAwC;AACxE,SAAO;AAAA,IACL,MAAM,OAAO,QAA6E;AAExF,YAAM,gBAAgB,QACnB,UAAU,EACV,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,WAAW,EAAE,cAAc,SAAS;AAExE,UAAI,eAAe;AACjB,eAAO;AAAA,UACL,SAAS,cAAc;AAAA,UACvB,SAAS,cAAc;AAAA,UACvB,aAAa,cAAc;AAAA,UAC3B,WAAW,cAAc;AAAA,UACzB,WAAW;AAAA,QACb;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,QAAQ,YAAY;AAAA,QACtC,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,aAAO;AAAA,QACL,OAAO,QACH;AAAA,UACE,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA,UACnB,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,QACnB,IACA;AAAA,QACJ,QAAQ,CAAC,CAAC;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,cAAc,QAAQ,qBAAqB,WAAW,IAAI,QAAQ,UAAU;AAE3F,aAAO;AAAA,QACL,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,UACzB,SAAS,EAAE;AAAA,UACX,SAAS,EAAE;AAAA,UACX,aAAa,EAAE;AAAA,UACf,WAAW,EAAE;AAAA,UACb,WAAW,EAAE;AAAA,QACf,EAAE;AAAA,QACF,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,SAAwC;AACpD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,UAAI,OAAO;AACT,cAAM,QAAQ,aAAa,OAAO;AAAA,MACpC;AACA,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,WAAsC;AACvE,SAAO;AAAA,IACL,MAAM,OAAO,QAA6E;AAExF,YAAM,SAAS,MAAM,UAAU,KAA0B,aAA0B;AAAA,QACjF,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MAClB,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,UAAU,KAAuB,aAAa,EAAE,QAAQ,CAAC;AAC9E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,MAAM,UAAU,KAAwB,cAAc,EAAE,YAAY,CAAC;AACpF,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,QAAQ,SAAwC;AACpD,YAAM,SAAS,MAAM,UAAU,KAAmB,iBAAiB,EAAE,QAAQ,CAAC;AAC9E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;ACxGO,SAAS,sBAAsB,UAA8C;AAClF,SAAO;AAAA,IACL,MAAM,OAAO,aAAuD;AAClE,YAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,0BAA0B;AACxE,YAAM,EAAE,qBAAqB,iBAAiB,kBAAkB,IAAI;AAEpE,YAAM,YAAY,MAAM,qBAAqB,aAAa;AAAA,QACxD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO,EAAE,aAAa,UAAU,aAAa,WAAW,GAAG;AAAA,IAC7D;AAAA,IAEA,MAAM,IAAI,aAAoD;AAC5D,YAAM,SAAS,MAAM,SAAS,oBAAoB,gBAAgB,WAAW;AAC7E,aAAO,EAAE,aAAa,QAAQ,WAAW,GAAG;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAuC;AAC3C,YAAM,aAAa,MAAM,SAAS,oBAAoB,kBAAkB;AACxE,aAAO,EAAE,cAAc,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG;AAAA,IAC7E;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,WAA0C;AAC/E,SAAO;AAAA,IACL,MAAM,OAAO,aAAuD;AAClE,YAAM,SAAS,MAAM,UAAU,KAA8B,oBAAoB;AAAA,QAC/E;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,aAAoD;AAC5D,YAAM,SAAS,MAAM,UAAU,KAA2B,iBAAiB;AAAA,QACzE;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OAAuC;AAC3C,YAAM,SAAS,MAAM,UAAU,KAA4B,kBAAkB,CAAC,CAAC;AAC/E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;ACjDO,SAAS,kBAAkB,UAA0C;AAC1E,SAAO;AAAA,IACL,MAAM,OAAO,QAOoB;AAC/B,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAC/C,YAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAsB;AAE3D,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,UACE,aAAa,OAAO;AAAA,UACpB,MAAM,OAAO;AAAA,UACb,aAAa,OAAO;AAAA,UACpB,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO;AAAA,UACnB,YAAY,OAAO;AAAA,QACrB;AAAA,QACA,EAAE,iBAAiB,kBAAkB;AAAA,MACvC;AAEA,aAAO;AAAA,QACL,QAAQ,MAAM,SAAS;AAAA,QACvB,iBAAiB,CAAC,MAAM,SAAS;AAAA,QACjC,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,SAAS,gBAAgB,cAAc,OAAO;AACnE,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI;AAAA,QAC1D,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,UAAU,cACZ,MAAM,SAAS,gBAAgB,wBAAwB,WAAW,IAClE,MAAM,SAAS,gBAAgB,cAAc;AAEjD,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,QAC/C,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,OACJ,SACA,SAK8B;AAC9B,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAE/C,YAAM,QAAQ,MAAM,UAAU,SAAS,EAAE,iBAAiB,kBAAkB,CAAC;AAC7E,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,MAC/C;AAEA,YAAM,UAAU,MAAM,MAAM,OAAO,OAAO;AAC1C,aAAO,EAAE,QAAQ,QAAQ,SAAS,GAAG,WAAW,GAAG;AAAA,IACrD;AAAA,IAEA,MAAM,OAAO,SAAwC;AACnD,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAE/C,YAAM,QAAQ,MAAM,UAAU,SAAS,EAAE,iBAAiB,kBAAkB,CAAC;AAC7E,UAAI,OAAO;AACT,cAAM,MAAM,OAAO;AAAA,MACrB;AAEA,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,mBACd,WACA,aACgB;AAChB,SAAO;AAAA,IACL,MAAM,OAAO,QAOoB;AAC/B,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB,MAAM;AAG/E,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,UAAU,KAAuB,aAAa,EAAE,QAAQ,CAAC;AAG9E,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,MAAM,UAAU,KAAwB,cAAc,EAAE,YAAY,CAAC;AAGpF,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OACJ,SACA,SAK8B;AAC9B,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB;AAAA,QACvE;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OAAO,SAAwC;AACnD,YAAM,SAAS,MAAM,UAAU,KAAmB,gBAAgB,EAAE,QAAQ,CAAC;AAC7E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;AC/DO,IAAM,2BAA8C;AAAA,EACzD,eAAe,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV;;;AC/BO,SAAS,oBAAoB,OAA0B,OAAoC;AAChG,UAAQ,MAAM,MAAM;AAAA;AAAA,IAElB,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,gBAAgB,OAAO,MAAM,IAAqB;AAAA,IAE3D,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,kBAAkB,OAAO,MAAM,IAAuB;AAAA,IAE/D,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,kBAAkB,OAAO,MAAM,IAAuB;AAAA;AAAA,IAG/D,KAAK;AACH,aAAO,wBAAwB,OAAO,MAAM,IAAyB;AAAA,IAEvE,KAAK;AACH,aAAO,YAAY,OAAO,MAAM,IAAiB;AAAA,IAEnD;AACE,aAAO;AAAA,EACX;AACF;AAMA,SAAS,mBAAmB,OAA0B,OAA4C;AAEhG,MAAI,gBAAgB,MAAM;AAC1B,MAAI,MAAM,aAAa,MAAM,UAAU,OAAO,SAAS,GAAG;AACxD,oBAAgB,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,WAAW,aAAa,MAAM,CAAC;AAAA,EAC/E;AAEA,QAAM,YAAmC;AAAA,IACvC,MAAM;AAAA,IACN,QAAQ,CAAC;AAAA,IACT,aAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,OAA0B,MAAwC;AACzF,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,GAAG,MAAM,UAAU,MAAM;AACzC,QAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAE1C,MAAI,aAAa,UAAU,SAAS,QAAQ;AAC1C,WAAO,OAAO,SAAS,CAAC,IAAI;AAAA,MAC1B,GAAG;AAAA,MACH,SAAS,UAAU,UAAU,KAAK;AAAA,IACpC;AAAA,EACF,OAAO;AACL,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IAChB,CAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,mBAAmB,OAA0B,MAA2C;AAC/F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAGA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,WAAW,CAAC;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ,CAAC,GAAG,MAAM,UAAU,QAAQ,SAAS;AAAA,IAC/C;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAOA,SAAS,kBAAkB,OAA0B,MAA0C;AAC7F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,UAAU,OAAO,IAAI,CAAC,UAAiB;AAC1D,QAAI,MAAM,SAAS,UAAU,MAAM,cAAc,KAAK,YAAY;AAChE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAA0B,MAA2C;AAC/F,MAAI,CAAC,MAAM,aAAa,CAAC,KAAK,OAAO;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM,UAAU;AAC7B,QAAM,QAAoB;AAAA,IACxB,cAAc,MAAM,eAAe,KAAK,KAAK,MAAM;AAAA,IACnD,eAAe,MAAM,gBAAgB,KAAK,KAAK,MAAM;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAA0B,MAA0C;AAC7F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,eAAe,YAAY;AAClC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,wBAA+C;AAAA,IACnD,GAAG,MAAM;AAAA,IACT,aAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,CAAC,GAAG,MAAM,eAAe,qBAAqB;AAAA,IAC7D,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AASA,SAAS,wBACP,OACA,MACmB;AACnB,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK;AACxB,QAAM,SAAS,MAAM,UAAU,OAAO,IAAI,CAAC,UAAiB;AAC1D,QAAI,MAAM,SAAS,UAAU,MAAM,cAAc,YAAY;AAC3D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,uBAAuB,KAAK,WAAW,MAAM;AAAA,QACzD,QACE,KAAK,WAAW,OAAO,SAAS,gBAChC,KAAK,WAAW,OAAO,SAAS,gBAChC,KAAK,WAAW,OAAO,SAAS,qBAC5B,UACA;AAAA,MACR;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,YAAY,OAA0B,MAAoC;AACjF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,MACb,GAAG,MAAM;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAMO,SAAS,oBAAoB,OAA0B,SAAoC;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,MACb,GAAG,MAAM;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,QAAQ,CAAC,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBAAwC;AACtD,SAAO,EAAE,GAAG,yBAAyB;AACvC;AAMA,SAAS,uBAAuB,QAAkC;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,UAAU,OAAO,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,OAAO,MACX,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAAA,EACd;AACF;AAeO,SAAS,wBAAwB,UAAqC;AAC3E,QAAM,gBAAgC,CAAC;AACvC,MAAI,mBAAiD;AAErD,WAAS,iBAAiB;AACxB,QAAI,oBAAoB,iBAAiB,OAAO,SAAS,GAAG;AAC1D,oBAAc,KAAK,gBAAgB;AAAA,IACrC;AACA,uBAAmB;AAAA,EACrB;AAEA,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,SAAS;AAAA,MACnB,KAAK,QAAQ;AACX,uBAAe;AACf,cAAM,IAAI;AACV,cAAM,OACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,EAAE,QACC,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAChB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,QAC1C,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,CAAC,kBAAkB;AACrB,6BAAmB,EAAE,MAAM,aAAa,QAAQ,CAAC,GAAG,aAAa,MAAM;AAAA,QACzE;AACA,cAAM,IAAI;AACV,YAAI,OAAO,EAAE,YAAY,UAAU;AACjC,cAAI,EAAE,SAAS;AACb,6BAAiB,OAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ,CAAc;AAAA,UAChF;AAAA,QACF,OAAO;AAEL,qBAAW,QAAQ,EAAE,SAAS;AAC5B,gBAAI,KAAK,SAAS,QAAQ;AACxB,kBAAI,KAAK,MAAM;AACb,iCAAiB,OAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK,KAAK,CAAc;AAAA,cAChF;AAAA,YACF,WAAW,KAAK,SAAS,aAAa;AACpC,oBAAM,KAAK;AACX,+BAAiB,OAAO,KAAK;AAAA,gBAC3B,MAAM;AAAA,gBACN,WAAW,GAAG;AAAA,gBACd,UAAU,GAAG;AAAA,gBACb,WAAW,GAAG;AAAA,gBACd,QAAQ;AAAA,cACV,CAAc;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,IAAI;AACV,YAAI,kBAAkB;AACpB,qBAAW,SAAS,iBAAiB,QAAQ;AAC3C,gBAAI,MAAM,SAAS,UAAU,MAAM,cAAc,EAAE,WAAW,IAAI;AAChE,oBAAM,aAAa,uBAAuB,EAAE,WAAW,MAAM;AAC7D,oBAAM,SACJ,EAAE,WAAW,OAAO,SAAS,gBAC7B,EAAE,WAAW,OAAO,SAAS,gBAC7B,EAAE,WAAW,OAAO,SAAS,qBACzB,UACA;AACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,SAAS;AACZ,uBAAe;AACf,cAAM,IAAI;AACV,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,EAAE;AAAA,QACb,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,iBAAe;AACf,SAAO;AACT;;;AC5bO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiD,oBAAI,IAAI;AAAA,EACzD,gBAA+C,oBAAI,IAAI;AAAA,EACvD,mBAAuC;AAAA,EAE/C,YACE,QACA,SACA,SACA,sBACA;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,QAAQ,sBAAsB,SAC/B,EAAE,GAAG,0BAA0B,eAAe,qBAAqB,IACnE,mBAAmB;AAGvB,QAAI,SAAS,UAAU;AACrB,WAAK,eAAe,IAAI,QAAQ,QAAQ;AAAA,IAC1C;AACA,QAAI,SAAS,SAAS;AACpB,WAAK,cAAc,IAAI,QAAQ,OAAO;AAAA,IACxC;AAGA,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAiD;AACxD,SAAK,eAAe,IAAI,OAAO;AAE/B,YAAQ,KAAK,KAAK;AAClB,WAAO,MAAM;AACX,WAAK,eAAe,OAAO,OAAO;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAgD;AACtD,SAAK,cAAc,IAAI,OAAO;AAC9B,WAAO,MAAM;AACX,WAAK,cAAc,OAAO,OAAO;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,SAAgC;AAEzC,SAAK,QAAQ,oBAAoB,KAAK,OAAO,OAAO;AACpD,SAAK,OAAO;AAEZ,QAAI;AAEF,YAAM,KAAK,OAAO,SAAS,KAAK,KAAK,SAAS,OAAO;AAAA,IACvD,SAAS,OAAO;AACd,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,QAAI;AACF,YAAM,KAAK,OAAO,SAAS,UAAU,KAAK,OAAO;AAAA,IACnD,SAAS,OAAO;AACd,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,mBAAmB;AAChC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,eAAe,MAAM;AAC1B,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA;AAAA,EAIQ,oBAA0B;AAEhC,SAAK,mBAAmB,KAAK,OAAO,MAAM,CAAC,UAAoB;AAG7D,YAAM,mBAAmB;AACzB,YAAM,eAAe,iBAAiB,SAAS;AAG/C,UAAI,gBAAgB,iBAAiB,KAAK,SAAS;AACjD;AAAA,MACF;AAGA,YAAM,WAAW,oBAAoB,KAAK,OAAO,KAAK;AACtD,UAAI,aAAa,KAAK,OAAO;AAC3B,aAAK,QAAQ;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,SAAe;AACrB,eAAW,WAAW,KAAK,gBAAgB;AACzC,UAAI;AACF,gBAAQ,KAAK,KAAK;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,OAAoB;AACtC,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,GAAG;AACV,gBAAQ,MAAM,qCAAqC,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;;;ACnLO,SAAS,oBAAoB,QAAuC;AACzE,SAAO;AAAA,IACL,MAAM,OAAO,SAAiB,SAAsD;AAClF,YAAM,WAAW,MAAM,OAAO,SAAS,YAAY,OAAO;AAC1D,YAAM,gBAAgB,wBAAwB,QAAQ;AACtD,aAAO,IAAI,aAAa,QAAQ,SAAS,SAAS,aAAa;AAAA,IACjE;AAAA,EACF;AACF;;;ACTO,SAAS,oBAAoB,SAA0C;AAC5E,SAAO;AAAA,IACL,MAAM,KAAK,SAAiB,SAA2D;AACrF,YAAM,QAAQ,QAAQ,SAAS,OAAqC;AACpE,aAAO,EAAE,SAAS,WAAW,GAAG;AAAA,IAClC;AAAA,IAEA,MAAM,UAAU,SAAwC;AACtD,cAAQ,UAAU,OAAO;AACzB,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,IAEA,MAAM,YAAY,SAAqC;AACrD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,CAAC;AACpB,aAAO,QAAQ,SAAS,kBAAkB,YAAY,MAAM,SAAS;AAAA,IACvE;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,WAAwC;AAC3E,SAAO;AAAA,IACL,MAAM,KAAK,SAAiB,SAA2D;AACrF,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB;AAAA,QACvE;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,UAAU,SAAwC;AACtD,YAAM,SAAS,MAAM,UAAU,KAAmB,mBAAmB,EAAE,QAAQ,CAAC;AAChF,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,YAAY,SAAqC;AACrD,YAAM,WAAW,MAAM,UAAU,KAAkC,aAAa,EAAE,QAAQ,CAAC;AAC3F,UAAI,CAAC,SAAS,MAAO,QAAO,CAAC;AAC7B,YAAM,SAAS,MAAM,UAAU,KAA8B,kBAAkB;AAAA,QAC7E,SAAS,SAAS,MAAM;AAAA,MAC1B,CAAC;AACD,aAAO,OAAO,YAAY,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;;;ARnCA,IAAM,SAAS,aAAa,oBAAoB;AAKzC,IAAM,cAAN,MAAoC;AAAA,EACxB;AAAA,EACT,aAAa;AAAA,EAEZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAwB;AAClC,SAAK,UAAU;AACf,UAAM,WAAW,QAAQ;AAEzB,SAAK,aAAa,sBAAsB,QAAQ;AAChD,SAAK,SAAS,kBAAkB,QAAQ;AACxC,SAAK,SAAS,kBAAkB,OAAO;AACvC,SAAK,WAAW,oBAAoB,OAAO;AAC3C,SAAK,gBAAgB,oBAAoB,IAAI;AAE7C,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAAA;AAAA,EAIA,IAAI,YAAqB;AACvB,WAAO,CAAC,KAAK;AAAA,EACf;AAAA,EAEA,IAAI,SAAmB;AACrB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA;AAAA,EAIA,GAAqB,MAAS,SAA+D;AAC3F,WAAO,KAAK,QAAQ,SAAS,SAAS,GAAG,MAAM,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,SAAuC;AAC3C,WAAO,KAAK,QAAQ,SAAS,SAAS,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,UAAU,YAA0B;AAAA,EAEpC;AAAA;AAAA,EAIA,MAAM,aAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,WAAY;AACrB,UAAM,KAAK,QAAQ,SAAS;AAC5B,SAAK,aAAa;AAClB,WAAO,KAAK,sBAAsB;AAAA,EACpC;AACF;;;AShFA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,gBAAAA,qBAAoB;AAgB7B,IAAMC,UAASC,cAAa,qBAAqB;AAK1C,IAAM,eAAN,MAAqC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,SAAK,WAAW,IAAI,aAAa;AAGjC,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,KAAK,OAAO;AAAA,MACZ,iBAAiB,OAAO,gBAAgB;AAAA,MACxC,SAAS,OAAO,WAAW;AAAA,MAC3B,eAAe,OAAO,iBAAiB;AAAA,MACvC,SAAS,OAAO;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAGD,SAAK,UAAU,cAAc,CAAC,OAAO,UAAU;AAC7C,MAAAD,QAAO,MAAM,yBAAyB,EAAE,OAAO,MAAM,MAAM,KAAK,CAAC;AACjE,WAAK,SAAS,KAAK,KAAiB;AAAA,IACtC,CAAC;AAGD,SAAK,aAAa,uBAAuB,KAAK,SAAS;AACvD,SAAK,SAAS,mBAAmB,KAAK,WAAW,CAAC,cAAc,KAAK,UAAU,SAAS,CAAC;AACzF,SAAK,SAAS,mBAAmB,KAAK,SAAS;AAC/C,SAAK,WAAW,qBAAqB,KAAK,SAAS;AACnD,SAAK,gBAAgB,oBAAoB,IAAI;AAAA,EAC/C;AAAA;AAAA,EAIA,IAAI,YAAqB;AACvB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,SAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,UAAyB;AAC7B,UAAM,KAAK,UAAU,QAAQ;AAC7B,IAAAA,QAAO,KAAK,uBAAuB,EAAE,KAAK,KAAK,OAAO,UAAU,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,UAAU,WAAW;AAC1B,IAAAA,QAAO,KAAK,0BAA0B;AAAA,EACxC;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AACtB,IAAAA,QAAO,KAAK,uBAAuB;AAAA,EACrC;AAAA;AAAA,EAIA,GAAqB,MAAS,SAA+D;AAC3F,WAAO,KAAK,SAAS,GAAG,MAAM,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,SAAuC;AAC3C,WAAO,KAAK,SAAS,MAAM,OAAO;AAAA,EACpC;AAAA,EAEA,UAAU,WAAyB;AACjC,SAAK,UAAU,UAAU,SAAS;AAClC,IAAAA,QAAO,MAAM,yBAAyB,EAAE,UAAU,CAAC;AAAA,EACrD;AACF;;;AC/DA,eAAsB,aAAa,QAAuC;AACxE,MAAI,OAAO,WAAW;AAEpB,UAAM,iBAAiB,MAAM,yBAAyB,MAAM;AAC5D,UAAM,SAAS,IAAI,aAAa,cAAc;AAC9C,UAAM,OAAO,QAAQ;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,OAAO,gBAAgB,OAAO,gBAAgB;AAEjE,WAAO,kBAAkB,MAAM;AAAA,EACjC;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAQA,eAAe,yBAAyB,QAA6C;AACnF,MAAI,OAAO,gBAAgB,eAAe;AACxC,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,eAAe,eAAgB,WAAmB,QAAQ,aAAa,QAAW;AAC3F,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,iCAAiC;AAC9E,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,QACd,GAAG,OAAO;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAKA,eAAe,kBAAkB,QAAuC;AACtE,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AAGrE,MAAI;AACJ,MAAI,OAAO,gBAAgB;AACzB,eAAW,OAAO;AAAA,EACpB,OAAO;AACL,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,yBAAyB;AACrE,eAAW,MAAM,mBAAmB;AAAA,MAClC,UAAU,OAAO,YAAY;AAAA,MAC7B,UAAU,OAAO,aAAa,OAAO,QAAQ,UAAU;AAAA,IACzD,CAAC;AAAA,EACH;AAGA,MAAI,eAAe,OAAO;AAC1B,MAAI,CAAC,cAAc;AACjB,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,uBAAuB;AACjE,mBAAe,CAAC,iBAA+D;AAC7E,YAAM,kBAAmB,aAAqB,WAAW,CAAC;AAC1D,aAAO,iBAAiB;AAAA,QACtB,GAAG;AAAA,QACH,QAAQ,OAAO,UAAU,aAAa;AAAA,QACtC,SAAS,OAAO,WAAW,aAAa;AAAA,QACxC,OAAO,OAAO,SAAS,aAAa;AAAA,QACpC,SAAS;AAAA,UACP,GAAG;AAAA,UACH,UAAU,OAAO,YAAY,gBAAgB,YAAY;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,UAAU,oBAAoB,UAAU,YAAY;AAE1D,SAAO,IAAI,YAAY,OAAO;AAChC;","names":["createLogger","logger","createLogger"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentxjs",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "description": "AgentX Client SDK - Local and remote AI agent management",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,16 +25,15 @@
25
25
  "bdd:developer": "bdd --tags @developer"
26
26
  },
27
27
  "dependencies": {
28
- "@agentxjs/core": "^2.0.0",
29
- "@agentxjs/mono-driver": "^2.0.0",
30
- "@agentxjs/node-platform": "^2.0.0",
28
+ "@agentxjs/core": "^3.0.0",
29
+ "@agentxjs/mono-driver": "^3.0.0",
30
+ "@agentxjs/node-platform": "^3.0.0",
31
31
  "reconnecting-websocket": "^4.4.0",
32
32
  "ws": "^8.18.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@agentxjs/devtools": "^2.0.0",
36
- "@agentxjs/server": "^2.0.0",
37
- "@cucumber/cucumber": "^11.0.0",
35
+ "@agentxjs/devtools": "^3.0.0",
36
+ "@agentxjs/server": "^3.0.0",
38
37
  "@types/ws": "^8.5.10",
39
38
  "tsx": "^4.19.0",
40
39
  "typescript": "^5.3.3"
@@ -5,22 +5,22 @@
5
5
  * Implements the same AgentX interface as RemoteClient.
6
6
  */
7
7
 
8
- import type { BusEvent, EventBus, BusEventHandler, Unsubscribe } from "@agentxjs/core/event";
8
+ import type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from "@agentxjs/core/event";
9
9
  import type { AgentXRuntime } from "@agentxjs/core/runtime";
10
10
  import { createLogger } from "commonxjs/logger";
11
+ import { createLocalAgents } from "./namespaces/agents";
12
+ import { createLocalContainers } from "./namespaces/containers";
13
+ import { createLocalImages } from "./namespaces/images";
14
+ import { createPresentations } from "./namespaces/presentations";
15
+ import { createLocalSessions } from "./namespaces/sessions";
11
16
  import type {
17
+ AgentNamespace,
12
18
  AgentX,
13
19
  ContainerNamespace,
14
20
  ImageNamespace,
15
- AgentNamespace,
16
- SessionNamespace,
17
21
  PresentationNamespace,
22
+ SessionNamespace,
18
23
  } from "./types";
19
- import { createLocalContainers } from "./namespaces/containers";
20
- import { createLocalImages } from "./namespaces/images";
21
- import { createLocalAgents } from "./namespaces/agents";
22
- import { createLocalSessions } from "./namespaces/sessions";
23
- import { createPresentations } from "./namespaces/presentations";
24
24
 
25
25
  const logger = createLogger("agentx/LocalClient");
26
26
 
@@ -5,24 +5,24 @@
5
5
  * This class focuses on business logic, not protocol details.
6
6
  */
7
7
 
8
- import type { BusEvent, EventBus, BusEventHandler, Unsubscribe } from "@agentxjs/core/event";
8
+ import type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from "@agentxjs/core/event";
9
9
  import { EventBusImpl } from "@agentxjs/core/event";
10
10
  import { RpcClient } from "@agentxjs/core/network";
11
11
  import { createLogger } from "commonxjs/logger";
12
+ import { createRemoteAgents } from "./namespaces/agents";
13
+ import { createRemoteContainers } from "./namespaces/containers";
14
+ import { createRemoteImages } from "./namespaces/images";
15
+ import { createPresentations } from "./namespaces/presentations";
16
+ import { createRemoteSessions } from "./namespaces/sessions";
12
17
  import type {
18
+ AgentNamespace,
13
19
  AgentX,
14
20
  AgentXConfig,
15
21
  ContainerNamespace,
16
22
  ImageNamespace,
17
- AgentNamespace,
18
- SessionNamespace,
19
23
  PresentationNamespace,
24
+ SessionNamespace,
20
25
  } from "./types";
21
- import { createRemoteContainers } from "./namespaces/containers";
22
- import { createRemoteImages } from "./namespaces/images";
23
- import { createRemoteAgents } from "./namespaces/agents";
24
- import { createRemoteSessions } from "./namespaces/sessions";
25
- import { createPresentations } from "./namespaces/presentations";
26
26
 
27
27
  const logger = createLogger("agentx/RemoteClient");
28
28
 
@@ -47,7 +47,7 @@ export class RemoteClient implements AgentX {
47
47
  // Create RPC client (WebSocket factory from platform if available)
48
48
  this.rpcClient = new RpcClient({
49
49
  url: config.serverUrl!,
50
- createWebSocket: config.customPlatform?.webSocketFactory,
50
+ createWebSocket: config.customPlatform?.channelClient,
51
51
  timeout: config.timeout ?? 30000,
52
52
  autoReconnect: config.autoReconnect ?? true,
53
53
  headers: config.headers as Record<string, string> | undefined,
package/src/index.ts CHANGED
@@ -33,8 +33,8 @@
33
33
  * ```
34
34
  */
35
35
 
36
- import { RemoteClient } from "./RemoteClient";
37
36
  import { LocalClient } from "./LocalClient";
37
+ import { RemoteClient } from "./RemoteClient";
38
38
  import type { AgentX, AgentXConfig } from "./types";
39
39
 
40
40
  /**
@@ -69,11 +69,11 @@ export async function createAgentX(config: AgentXConfig): Promise<AgentX> {
69
69
  /**
70
70
  * Resolve platform for remote mode
71
71
  *
72
- * In Node.js: auto-import node-platform to get webSocketFactory
72
+ * In Node.js: auto-import node-platform to get channelClient
73
73
  * In browser: no platform needed (native WebSocket is the default)
74
74
  */
75
75
  async function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {
76
- if (config.customPlatform?.webSocketFactory) {
76
+ if (config.customPlatform?.channelClient) {
77
77
  return config;
78
78
  }
79
79
 
@@ -82,14 +82,14 @@ async function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXCon
82
82
  return config;
83
83
  }
84
84
 
85
- // Node.js — auto-resolve webSocketFactory from node-platform
85
+ // Node.js — auto-resolve channelClient from node-platform
86
86
  try {
87
87
  const { createNodeWebSocket } = await import("@agentxjs/node-platform/network");
88
88
  return {
89
89
  ...config,
90
90
  customPlatform: {
91
91
  ...config.customPlatform,
92
- webSocketFactory: createNodeWebSocket,
92
+ channelClient: createNodeWebSocket,
93
93
  } as any,
94
94
  };
95
95
  } catch {
@@ -141,54 +141,52 @@ async function createLocalClient(config: AgentXConfig): Promise<AgentX> {
141
141
  return new LocalClient(runtime);
142
142
  }
143
143
 
144
- // Re-export types
145
- export type {
146
- AgentX,
147
- AgentXConfig,
148
- LLMProvider,
149
- MaybeAsync,
150
- AgentInfo,
151
- ImageRecord,
152
- ContainerInfo,
153
- ContainerNamespace,
154
- ImageNamespace,
155
- AgentNamespace,
156
- SessionNamespace,
157
- PresentationNamespace,
158
- AgentCreateResponse,
159
- AgentGetResponse,
160
- AgentListResponse,
161
- ImageCreateResponse,
162
- ImageGetResponse,
163
- ImageListResponse,
164
- ContainerCreateResponse,
165
- ContainerGetResponse,
166
- ContainerListResponse,
167
- MessageSendResponse,
168
- BaseResponse,
169
- } from "./types";
170
-
171
144
  // Re-export Presentation types and classes
172
145
  export type {
146
+ AssistantConversation,
173
147
  Block,
174
- TextBlock,
175
- ToolBlock,
176
- ImageBlock,
177
148
  Conversation,
178
- UserConversation,
179
- AssistantConversation,
180
149
  ErrorConversation,
181
- PresentationState,
150
+ ImageBlock,
151
+ PresentationErrorHandler,
182
152
  PresentationOptions,
153
+ PresentationState,
183
154
  PresentationUpdateHandler,
184
- PresentationErrorHandler,
155
+ TextBlock,
156
+ ToolBlock,
157
+ UserConversation,
185
158
  } from "./presentation";
186
-
187
159
  export {
188
- Presentation,
189
- presentationReducer,
190
160
  addUserConversation,
191
161
  createInitialState,
192
162
  initialPresentationState,
193
163
  messagesToConversations,
164
+ Presentation,
165
+ presentationReducer,
194
166
  } from "./presentation";
167
+ // Re-export types
168
+ export type {
169
+ AgentCreateResponse,
170
+ AgentGetResponse,
171
+ AgentInfo,
172
+ AgentListResponse,
173
+ AgentNamespace,
174
+ AgentX,
175
+ AgentXConfig,
176
+ BaseResponse,
177
+ ContainerCreateResponse,
178
+ ContainerGetResponse,
179
+ ContainerInfo,
180
+ ContainerListResponse,
181
+ ContainerNamespace,
182
+ ImageCreateResponse,
183
+ ImageGetResponse,
184
+ ImageListResponse,
185
+ ImageNamespace,
186
+ ImageRecord,
187
+ LLMProvider,
188
+ MaybeAsync,
189
+ MessageSendResponse,
190
+ PresentationNamespace,
191
+ SessionNamespace,
192
+ } from "./types";
@@ -2,13 +2,13 @@
2
2
  * Agent namespace factories
3
3
  */
4
4
 
5
- import type { AgentXRuntime } from "@agentxjs/core/runtime";
6
5
  import type { RpcClient, RpcMethod } from "@agentxjs/core/network";
6
+ import type { AgentXRuntime } from "@agentxjs/core/runtime";
7
7
  import type {
8
- AgentNamespace,
9
8
  AgentCreateResponse,
10
9
  AgentGetResponse,
11
10
  AgentListResponse,
11
+ AgentNamespace,
12
12
  BaseResponse,
13
13
  } from "../types";
14
14
 
@@ -2,13 +2,13 @@
2
2
  * Container namespace factories
3
3
  */
4
4
 
5
- import type { AgentXPlatform } from "@agentxjs/core/runtime";
6
5
  import type { RpcClient } from "@agentxjs/core/network";
6
+ import type { AgentXPlatform } from "@agentxjs/core/runtime";
7
7
  import type {
8
- ContainerNamespace,
9
8
  ContainerCreateResponse,
10
9
  ContainerGetResponse,
11
10
  ContainerListResponse,
11
+ ContainerNamespace,
12
12
  } from "../types";
13
13
 
14
14
  /**
@@ -2,15 +2,15 @@
2
2
  * Image namespace factories
3
3
  */
4
4
 
5
- import type { AgentXPlatform } from "@agentxjs/core/runtime";
6
5
  import type { RpcClient } from "@agentxjs/core/network";
6
+ import type { AgentXPlatform } from "@agentxjs/core/runtime";
7
7
  import type {
8
- ImageNamespace,
8
+ BaseResponse,
9
9
  ImageCreateResponse,
10
10
  ImageGetResponse,
11
11
  ImageListResponse,
12
+ ImageNamespace,
12
13
  ImageUpdateResponse,
13
- BaseResponse,
14
14
  } from "../types";
15
15
 
16
16
  /**
@@ -5,8 +5,8 @@
5
5
  * Presentation only depends on the AgentX interface.
6
6
  */
7
7
 
8
+ import { messagesToConversations, Presentation, type PresentationOptions } from "../presentation";
8
9
  import type { AgentX, PresentationNamespace } from "../types";
9
- import { Presentation, type PresentationOptions, messagesToConversations } from "../presentation";
10
10
 
11
11
  /**
12
12
  * Create presentation namespace backed by any AgentX client
@@ -2,10 +2,10 @@
2
2
  * Session namespace factories (messaging)
3
3
  */
4
4
 
5
- import type { AgentXRuntime } from "@agentxjs/core/runtime";
6
- import type { UserContentPart, Message } from "@agentxjs/core/agent";
5
+ import type { Message, UserContentPart } from "@agentxjs/core/agent";
7
6
  import type { RpcClient } from "@agentxjs/core/network";
8
- import type { SessionNamespace, MessageSendResponse, BaseResponse, AgentInfo } from "../types";
7
+ import type { AgentXRuntime } from "@agentxjs/core/runtime";
8
+ import type { AgentInfo, BaseResponse, MessageSendResponse, SessionNamespace } from "../types";
9
9
 
10
10
  /**
11
11
  * Create local session namespace backed by embedded runtime
@@ -5,11 +5,11 @@
5
5
  * Wraps AgentX client and provides presentation state management.
6
6
  */
7
7
 
8
+ import type { BusEvent, Unsubscribe } from "@agentxjs/core/event";
8
9
  import type { AgentX } from "../types";
9
- import type { Unsubscribe, BusEvent } from "@agentxjs/core/event";
10
- import type { PresentationState, Conversation } from "./types";
10
+ import { addUserConversation, createInitialState, presentationReducer } from "./reducer";
11
+ import type { Conversation, PresentationState } from "./types";
11
12
  import { initialPresentationState } from "./types";
12
- import { presentationReducer, addUserConversation, createInitialState } from "./reducer";
13
13
 
14
14
  /**
15
15
  * Presentation update handler
@@ -4,31 +4,28 @@
4
4
  * UI-friendly data model and state management.
5
5
  */
6
6
 
7
+ export {
8
+ Presentation,
9
+ type PresentationErrorHandler,
10
+ type PresentationOptions,
11
+ type PresentationUpdateHandler,
12
+ } from "./Presentation";
13
+ export {
14
+ addUserConversation,
15
+ createInitialState,
16
+ messagesToConversations,
17
+ presentationReducer,
18
+ } from "./reducer";
7
19
  export type {
20
+ AssistantConversation,
8
21
  Block,
9
- TextBlock,
10
- ToolBlock,
11
- ImageBlock,
12
- TokenUsage,
13
22
  Conversation,
14
- UserConversation,
15
- AssistantConversation,
16
23
  ErrorConversation,
24
+ ImageBlock,
17
25
  PresentationState,
26
+ TextBlock,
27
+ TokenUsage,
28
+ ToolBlock,
29
+ UserConversation,
18
30
  } from "./types";
19
-
20
31
  export { initialPresentationState } from "./types";
21
-
22
- export {
23
- presentationReducer,
24
- addUserConversation,
25
- createInitialState,
26
- messagesToConversations,
27
- } from "./reducer";
28
-
29
- export {
30
- Presentation,
31
- type PresentationOptions,
32
- type PresentationUpdateHandler,
33
- type PresentationErrorHandler,
34
- } from "./Presentation";
@@ -14,24 +14,24 @@
14
14
  * matching the mainstream API pattern (Anthropic, OpenAI).
15
15
  */
16
16
 
17
- import type { BusEvent } from "@agentxjs/core/event";
18
17
  import type {
19
- Message,
20
- UserMessage,
21
18
  AssistantMessage,
22
- ToolResultMessage,
23
19
  ErrorMessage,
24
- ToolResultOutput,
20
+ Message,
25
21
  ToolCallPart,
22
+ ToolResultMessage,
23
+ ToolResultOutput,
24
+ UserMessage,
26
25
  } from "@agentxjs/core/agent";
26
+ import type { BusEvent } from "@agentxjs/core/event";
27
27
  import type {
28
- PresentationState,
29
- Conversation,
30
28
  AssistantConversation,
31
- TextBlock,
32
- ToolBlock,
33
29
  Block,
30
+ Conversation,
31
+ PresentationState,
32
+ TextBlock,
34
33
  TokenUsage,
34
+ ToolBlock,
35
35
  } from "./types";
36
36
  import { initialPresentationState } from "./types";
37
37
 
package/src/types.ts CHANGED
@@ -2,10 +2,10 @@
2
2
  * AgentX Client SDK Types
3
3
  */
4
4
 
5
- import type { BusEvent, EventBus, Unsubscribe, BusEventHandler } from "@agentxjs/core/event";
5
+ import type { Message } from "@agentxjs/core/agent";
6
6
  import type { CreateDriver } from "@agentxjs/core/driver";
7
+ import type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from "@agentxjs/core/event";
7
8
  import type { AgentXPlatform } from "@agentxjs/core/runtime";
8
- import type { Message } from "@agentxjs/core/agent";
9
9
  import type { Presentation, PresentationOptions } from "./presentation";
10
10
 
11
11
  // ============================================================================