@agentxjs/server 1.9.3-dev → 1.9.6-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,113 @@
1
+ import * as _agentxjs_core_network from '@agentxjs/core/network';
2
+ import { RpcMethod } from '@agentxjs/core/network';
3
+ import { AgentXProvider, AgentXRuntime } from '@agentxjs/core/runtime';
4
+ import { DeferredProviderConfig } from '@agentxjs/node-provider';
5
+
6
+ /**
7
+ * Server Types
8
+ */
9
+ /**
10
+ * AgentX Server instance
11
+ */
12
+ interface AgentXServer {
13
+ /**
14
+ * Start listening (standalone mode only)
15
+ */
16
+ listen(port?: number, host?: string): Promise<void>;
17
+ /**
18
+ * Close server and cleanup
19
+ */
20
+ close(): Promise<void>;
21
+ /**
22
+ * Dispose all resources
23
+ */
24
+ dispose(): Promise<void>;
25
+ }
26
+
27
+ /**
28
+ * Server configuration (supports both immediate and deferred providers)
29
+ */
30
+ interface ServerConfig {
31
+ /**
32
+ * AgentX Provider (can be AgentXProvider or DeferredProviderConfig)
33
+ */
34
+ provider: AgentXProvider | DeferredProviderConfig;
35
+ /**
36
+ * Port to listen on (standalone mode)
37
+ */
38
+ port?: number;
39
+ /**
40
+ * Host to bind to (default: "0.0.0.0")
41
+ */
42
+ host?: string;
43
+ /**
44
+ * Existing HTTP server to attach to (attached mode)
45
+ */
46
+ server?: _agentxjs_core_network.MinimalHTTPServer;
47
+ /**
48
+ * WebSocket path when attached (default: "/ws")
49
+ */
50
+ wsPath?: string;
51
+ /**
52
+ * Enable debug logging
53
+ */
54
+ debug?: boolean;
55
+ }
56
+ /**
57
+ * Create an AgentX server
58
+ */
59
+ declare function createServer(config: ServerConfig): Promise<AgentXServer>;
60
+
61
+ /**
62
+ * CommandHandler - Handles JSON-RPC requests directly
63
+ *
64
+ * No longer uses EventBus for request/response. Instead:
65
+ * - Receives RPC requests directly
66
+ * - Returns RPC responses directly
67
+ * - EventBus is only used for stream events (notifications)
68
+ */
69
+
70
+ /**
71
+ * RPC Result type
72
+ */
73
+ interface RpcResult<T = unknown> {
74
+ success: true;
75
+ data: T;
76
+ }
77
+ interface RpcError {
78
+ success: false;
79
+ code: number;
80
+ message: string;
81
+ }
82
+ type RpcResponse<T = unknown> = RpcResult<T> | RpcError;
83
+ /**
84
+ * CommandHandler - Processes RPC requests directly
85
+ */
86
+ declare class CommandHandler {
87
+ private readonly runtime;
88
+ constructor(runtime: AgentXRuntime);
89
+ /**
90
+ * Handle an RPC request and return response
91
+ */
92
+ handle(method: RpcMethod, params: unknown): Promise<RpcResponse>;
93
+ private handleContainerCreate;
94
+ private handleContainerGet;
95
+ private handleContainerList;
96
+ private handleImageCreate;
97
+ private handleImageGet;
98
+ private handleImageList;
99
+ private handleImageDelete;
100
+ private handleImageRun;
101
+ private handleImageStop;
102
+ private handleImageUpdate;
103
+ private handleImageMessages;
104
+ private handleAgentGet;
105
+ private handleAgentList;
106
+ private handleAgentDestroy;
107
+ private handleAgentDestroyAll;
108
+ private handleAgentInterrupt;
109
+ private handleMessageSend;
110
+ dispose(): void;
111
+ }
112
+
113
+ export { type AgentXServer, CommandHandler, type ServerConfig, createServer };
package/dist/index.js ADDED
@@ -0,0 +1,471 @@
1
+ // src/Server.ts
2
+ import { createAgentXRuntime } from "@agentxjs/core/runtime";
3
+ import {
4
+ parseMessage,
5
+ isRequest,
6
+ isNotification,
7
+ createSuccessResponse,
8
+ createErrorResponse,
9
+ createStreamEvent,
10
+ RpcErrorCodes
11
+ } from "@agentxjs/core/network";
12
+ import {
13
+ WebSocketServer,
14
+ isDeferredProvider
15
+ } from "@agentxjs/node-provider";
16
+ import { createLogger as createLogger2 } from "commonxjs/logger";
17
+
18
+ // src/CommandHandler.ts
19
+ import { createLogger } from "commonxjs/logger";
20
+ var logger = createLogger("server/CommandHandler");
21
+ function ok(data) {
22
+ return { success: true, data };
23
+ }
24
+ function err(code, message) {
25
+ return { success: false, code, message };
26
+ }
27
+ var CommandHandler = class {
28
+ runtime;
29
+ constructor(runtime) {
30
+ this.runtime = runtime;
31
+ logger.debug("CommandHandler created");
32
+ }
33
+ /**
34
+ * Handle an RPC request and return response
35
+ */
36
+ async handle(method, params) {
37
+ logger.debug("Handling RPC request", { method });
38
+ try {
39
+ switch (method) {
40
+ // Container
41
+ case "container.create":
42
+ return await this.handleContainerCreate(params);
43
+ case "container.get":
44
+ return await this.handleContainerGet(params);
45
+ case "container.list":
46
+ return await this.handleContainerList(params);
47
+ // Image
48
+ case "image.create":
49
+ return await this.handleImageCreate(params);
50
+ case "image.get":
51
+ return await this.handleImageGet(params);
52
+ case "image.list":
53
+ return await this.handleImageList(params);
54
+ case "image.delete":
55
+ return await this.handleImageDelete(params);
56
+ case "image.run":
57
+ return await this.handleImageRun(params);
58
+ case "image.stop":
59
+ return await this.handleImageStop(params);
60
+ case "image.update":
61
+ return await this.handleImageUpdate(params);
62
+ case "image.messages":
63
+ return await this.handleImageMessages(params);
64
+ // Agent
65
+ case "agent.get":
66
+ return await this.handleAgentGet(params);
67
+ case "agent.list":
68
+ return await this.handleAgentList(params);
69
+ case "agent.destroy":
70
+ return await this.handleAgentDestroy(params);
71
+ case "agent.destroyAll":
72
+ return await this.handleAgentDestroyAll(params);
73
+ case "agent.interrupt":
74
+ return await this.handleAgentInterrupt(params);
75
+ // Message
76
+ case "message.send":
77
+ return await this.handleMessageSend(params);
78
+ default:
79
+ return err(-32601, `Method not found: ${method}`);
80
+ }
81
+ } catch (error) {
82
+ logger.error("RPC handler error", { method, error });
83
+ return err(-32e3, error instanceof Error ? error.message : String(error));
84
+ }
85
+ }
86
+ // ==================== Container Commands ====================
87
+ async handleContainerCreate(params) {
88
+ const { containerId } = params;
89
+ const { getOrCreateContainer } = await import("@agentxjs/core/container");
90
+ const { containerRepository, imageRepository, sessionRepository } = this.runtime.provider;
91
+ const container = await getOrCreateContainer(containerId, {
92
+ containerRepository,
93
+ imageRepository,
94
+ sessionRepository
95
+ });
96
+ return ok({ containerId: container.containerId });
97
+ }
98
+ async handleContainerGet(params) {
99
+ const { containerId } = params;
100
+ const exists = await this.runtime.provider.containerRepository.containerExists(containerId);
101
+ return ok({ containerId, exists });
102
+ }
103
+ async handleContainerList(_params) {
104
+ const containers = await this.runtime.provider.containerRepository.findAllContainers();
105
+ return ok({ containerIds: containers.map((c) => c.containerId) });
106
+ }
107
+ // ==================== Image Commands ====================
108
+ async handleImageCreate(params) {
109
+ const { containerId, name, description, systemPrompt, mcpServers } = params;
110
+ const { imageRepository, sessionRepository } = this.runtime.provider;
111
+ const { createImage } = await import("@agentxjs/core/image");
112
+ const image = await createImage(
113
+ { containerId, name, description, systemPrompt, mcpServers },
114
+ { imageRepository, sessionRepository }
115
+ );
116
+ return ok({
117
+ record: image.toRecord(),
118
+ __subscriptions: [image.sessionId]
119
+ });
120
+ }
121
+ async handleImageGet(params) {
122
+ const { imageId } = params;
123
+ const record = await this.runtime.provider.imageRepository.findImageById(imageId);
124
+ return ok({
125
+ record,
126
+ __subscriptions: record?.sessionId ? [record.sessionId] : void 0
127
+ });
128
+ }
129
+ async handleImageList(params) {
130
+ const { containerId } = params;
131
+ const records = containerId ? await this.runtime.provider.imageRepository.findImagesByContainerId(containerId) : await this.runtime.provider.imageRepository.findAllImages();
132
+ return ok({
133
+ records,
134
+ __subscriptions: records.map((r) => r.sessionId)
135
+ });
136
+ }
137
+ async handleImageDelete(params) {
138
+ const { imageId } = params;
139
+ const { loadImage } = await import("@agentxjs/core/image");
140
+ const { imageRepository, sessionRepository } = this.runtime.provider;
141
+ const image = await loadImage(imageId, { imageRepository, sessionRepository });
142
+ if (image) {
143
+ await image.delete();
144
+ }
145
+ return ok({ imageId });
146
+ }
147
+ async handleImageRun(params) {
148
+ const { imageId, agentId: requestedAgentId } = params;
149
+ const existingAgent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
150
+ if (existingAgent) {
151
+ logger.debug("Reusing existing agent for image", {
152
+ imageId,
153
+ agentId: existingAgent.agentId
154
+ });
155
+ return ok({
156
+ imageId,
157
+ agentId: existingAgent.agentId,
158
+ sessionId: existingAgent.sessionId,
159
+ containerId: existingAgent.containerId,
160
+ reused: true
161
+ });
162
+ }
163
+ const agent = await this.runtime.createAgent({
164
+ imageId,
165
+ agentId: requestedAgentId
166
+ });
167
+ logger.info("Created new agent for image", {
168
+ imageId,
169
+ agentId: agent.agentId
170
+ });
171
+ return ok({
172
+ imageId,
173
+ agentId: agent.agentId,
174
+ sessionId: agent.sessionId,
175
+ containerId: agent.containerId,
176
+ reused: false
177
+ });
178
+ }
179
+ async handleImageStop(params) {
180
+ const { imageId } = params;
181
+ const agent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
182
+ if (agent) {
183
+ await this.runtime.stopAgent(agent.agentId);
184
+ logger.info("Stopped agent for image", { imageId, agentId: agent.agentId });
185
+ } else {
186
+ logger.debug("No running agent found for image", { imageId });
187
+ }
188
+ return ok({ imageId });
189
+ }
190
+ async handleImageUpdate(params) {
191
+ const { imageId, updates } = params;
192
+ const imageRecord = await this.runtime.provider.imageRepository.findImageById(imageId);
193
+ if (!imageRecord) {
194
+ return err(404, `Image not found: ${imageId}`);
195
+ }
196
+ const updatedRecord = {
197
+ ...imageRecord,
198
+ ...updates,
199
+ updatedAt: Date.now()
200
+ };
201
+ await this.runtime.provider.imageRepository.saveImage(updatedRecord);
202
+ logger.info("Updated image", { imageId, updates });
203
+ return ok({ record: updatedRecord });
204
+ }
205
+ async handleImageMessages(params) {
206
+ const { imageId } = params;
207
+ const imageRecord = await this.runtime.provider.imageRepository.findImageById(imageId);
208
+ if (!imageRecord) {
209
+ return err(404, `Image not found: ${imageId}`);
210
+ }
211
+ const messages = await this.runtime.provider.sessionRepository.getMessages(
212
+ imageRecord.sessionId
213
+ );
214
+ logger.debug("Got messages for image", { imageId, count: messages.length });
215
+ return ok({ imageId, messages });
216
+ }
217
+ // ==================== Agent Commands ====================
218
+ async handleAgentGet(params) {
219
+ const { agentId } = params;
220
+ const agent = this.runtime.getAgent(agentId);
221
+ return ok({
222
+ agent: agent ? {
223
+ agentId: agent.agentId,
224
+ imageId: agent.imageId,
225
+ containerId: agent.containerId,
226
+ sessionId: agent.sessionId,
227
+ lifecycle: agent.lifecycle
228
+ } : null,
229
+ exists: !!agent
230
+ });
231
+ }
232
+ async handleAgentList(params) {
233
+ const { containerId } = params;
234
+ const agents = containerId ? this.runtime.getAgentsByContainer(containerId) : this.runtime.getAgents();
235
+ return ok({
236
+ agents: agents.map((a) => ({
237
+ agentId: a.agentId,
238
+ imageId: a.imageId,
239
+ containerId: a.containerId,
240
+ sessionId: a.sessionId,
241
+ lifecycle: a.lifecycle
242
+ }))
243
+ });
244
+ }
245
+ async handleAgentDestroy(params) {
246
+ const { agentId } = params;
247
+ const agent = this.runtime.getAgent(agentId);
248
+ if (!agent) {
249
+ return ok({ agentId, success: false });
250
+ }
251
+ await this.runtime.destroyAgent(agentId);
252
+ return ok({ agentId, success: true });
253
+ }
254
+ async handleAgentDestroyAll(params) {
255
+ const { containerId } = params;
256
+ const agents = this.runtime.getAgentsByContainer(containerId);
257
+ for (const agent of agents) {
258
+ await this.runtime.destroyAgent(agent.agentId);
259
+ }
260
+ return ok({ containerId });
261
+ }
262
+ async handleAgentInterrupt(params) {
263
+ const { agentId } = params;
264
+ this.runtime.interrupt(agentId);
265
+ return ok({ agentId });
266
+ }
267
+ // ==================== Message Commands ====================
268
+ async handleMessageSend(params) {
269
+ const { agentId, imageId, content } = params;
270
+ let targetAgentId;
271
+ if (agentId) {
272
+ targetAgentId = agentId;
273
+ } else if (imageId) {
274
+ const existingAgent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
275
+ if (existingAgent) {
276
+ targetAgentId = existingAgent.agentId;
277
+ logger.debug("Using existing agent for message", {
278
+ imageId,
279
+ agentId: targetAgentId
280
+ });
281
+ } else {
282
+ const agent = await this.runtime.createAgent({ imageId });
283
+ targetAgentId = agent.agentId;
284
+ logger.info("Auto-created agent for message", {
285
+ imageId,
286
+ agentId: targetAgentId
287
+ });
288
+ }
289
+ } else {
290
+ return err(-32602, "Either agentId or imageId is required");
291
+ }
292
+ await this.runtime.receive(targetAgentId, content);
293
+ return ok({ agentId: targetAgentId, imageId });
294
+ }
295
+ // ==================== Lifecycle ====================
296
+ dispose() {
297
+ logger.debug("CommandHandler disposed");
298
+ }
299
+ };
300
+
301
+ // src/Server.ts
302
+ var logger2 = createLogger2("server/Server");
303
+ async function createServer(config) {
304
+ const { wsPath = "/ws" } = config;
305
+ const provider = isDeferredProvider(config.provider) ? await config.provider.resolve() : config.provider;
306
+ const runtime = createAgentXRuntime(provider);
307
+ const wsServer = new WebSocketServer({
308
+ heartbeat: true,
309
+ heartbeatInterval: 3e4,
310
+ debug: config.debug
311
+ });
312
+ const commandHandler = new CommandHandler(runtime);
313
+ const connections = /* @__PURE__ */ new Map();
314
+ function subscribeToTopic(connectionId, topic) {
315
+ const state = connections.get(connectionId);
316
+ if (!state || state.subscribedTopics.has(topic)) return;
317
+ state.subscribedTopics.add(topic);
318
+ logger2.debug("Connection subscribed to topic", { connectionId, topic });
319
+ }
320
+ function shouldSendToConnection(state, event) {
321
+ if (event.source === "driver" && event.intent !== "notification") {
322
+ return false;
323
+ }
324
+ if (event.source === "command") {
325
+ return false;
326
+ }
327
+ const eventWithContext = event;
328
+ const sessionId = eventWithContext.context?.sessionId;
329
+ if (sessionId && state.subscribedTopics.has(sessionId)) {
330
+ return true;
331
+ }
332
+ return state.subscribedTopics.has("global");
333
+ }
334
+ function sendResponse(connection, id, result) {
335
+ const response = createSuccessResponse(id, result);
336
+ connection.send(JSON.stringify(response));
337
+ }
338
+ function sendError(connection, id, code, message) {
339
+ const response = createErrorResponse(id, code, message);
340
+ connection.send(JSON.stringify(response));
341
+ }
342
+ wsServer.onConnection((connection) => {
343
+ const state = {
344
+ connection,
345
+ subscribedTopics: /* @__PURE__ */ new Set(["global"])
346
+ };
347
+ connections.set(connection.id, state);
348
+ logger2.info("Client connected", {
349
+ connectionId: connection.id,
350
+ totalConnections: connections.size
351
+ });
352
+ connection.onMessage(async (message) => {
353
+ try {
354
+ const parsed = parseMessage(message);
355
+ if (!Array.isArray(parsed)) {
356
+ await handleParsedMessage(connection, state, parsed);
357
+ } else {
358
+ for (const item of parsed) {
359
+ await handleParsedMessage(connection, state, item);
360
+ }
361
+ }
362
+ } catch (err2) {
363
+ logger2.error("Failed to parse message", { error: err2.message });
364
+ sendError(connection, null, RpcErrorCodes.PARSE_ERROR, "Parse error");
365
+ }
366
+ });
367
+ connection.onClose(() => {
368
+ connections.delete(connection.id);
369
+ logger2.info("Client disconnected", {
370
+ connectionId: connection.id,
371
+ totalConnections: connections.size
372
+ });
373
+ });
374
+ });
375
+ async function handleParsedMessage(connection, state, parsed) {
376
+ if (isRequest(parsed)) {
377
+ const payload = parsed.payload;
378
+ const { id, method, params } = payload;
379
+ logger2.debug("Received RPC request", { id, method });
380
+ const result = await commandHandler.handle(method, params);
381
+ if (result.success) {
382
+ sendResponse(connection, id, result.data);
383
+ } else {
384
+ sendError(connection, id, result.code, result.message);
385
+ }
386
+ } else if (isNotification(parsed)) {
387
+ const payload = parsed.payload;
388
+ const { method, params } = payload;
389
+ logger2.debug("Received notification", { method });
390
+ if (method === "subscribe") {
391
+ const { topic } = params;
392
+ subscribeToTopic(connection.id, topic);
393
+ } else if (method === "unsubscribe") {
394
+ const { topic } = params;
395
+ state.subscribedTopics.delete(topic);
396
+ logger2.debug("Connection unsubscribed from topic", { connectionId: connection.id, topic });
397
+ } else if (method === "control.ack") {
398
+ logger2.debug("Received ACK notification");
399
+ }
400
+ } else {
401
+ logger2.warn("Received invalid JSON-RPC message");
402
+ }
403
+ }
404
+ provider.eventBus.onAny((event) => {
405
+ if (!shouldBroadcastEvent(event)) {
406
+ return;
407
+ }
408
+ const eventWithContext = event;
409
+ const topic = eventWithContext.context?.sessionId || "global";
410
+ const notification = createStreamEvent(topic, event);
411
+ const message = JSON.stringify(notification);
412
+ for (const [connectionId, state] of connections) {
413
+ if (shouldSendToConnection(state, event)) {
414
+ state.connection.sendReliable(message, {
415
+ timeout: 1e4,
416
+ onTimeout: () => {
417
+ logger2.warn("Event ACK timeout", {
418
+ connectionId,
419
+ eventType: event.type
420
+ });
421
+ }
422
+ });
423
+ }
424
+ }
425
+ });
426
+ function shouldBroadcastEvent(event) {
427
+ if (event.source === "driver" && event.intent !== "notification") {
428
+ return false;
429
+ }
430
+ if (event.source === "command") {
431
+ return false;
432
+ }
433
+ const systemEvent = event;
434
+ if (systemEvent.broadcastable === false) {
435
+ return false;
436
+ }
437
+ return true;
438
+ }
439
+ if (config.server) {
440
+ wsServer.attach(config.server, wsPath);
441
+ logger2.info("WebSocket attached to existing server", { path: wsPath });
442
+ }
443
+ return {
444
+ async listen(port, host) {
445
+ if (config.server) {
446
+ throw new Error(
447
+ "Cannot listen when attached to existing server. The server should call listen() instead."
448
+ );
449
+ }
450
+ const listenPort = port ?? config.port ?? 5200;
451
+ const listenHost = host ?? config.host ?? "0.0.0.0";
452
+ await wsServer.listen(listenPort, listenHost);
453
+ logger2.info("Server listening", { port: listenPort, host: listenHost });
454
+ },
455
+ async close() {
456
+ await wsServer.close();
457
+ logger2.info("Server closed");
458
+ },
459
+ async dispose() {
460
+ await wsServer.dispose();
461
+ commandHandler.dispose();
462
+ await runtime.shutdown();
463
+ logger2.info("Server disposed");
464
+ }
465
+ };
466
+ }
467
+ export {
468
+ CommandHandler,
469
+ createServer
470
+ };
471
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Server.ts","../src/CommandHandler.ts"],"sourcesContent":["/**\n * AgentX Server Implementation (JSON-RPC 2.0)\n *\n * Creates a WebSocket server that:\n * 1. Accepts client connections\n * 2. Handles JSON-RPC requests directly via CommandHandler\n * 3. Broadcasts stream events as JSON-RPC notifications\n *\n * Message Types:\n * - RPC Request (has id): Client → Server → Client (direct response)\n * - RPC Notification (no id): Server → Client (stream events)\n */\n\nimport type { AgentXProvider } from \"@agentxjs/core/runtime\";\nimport type { ChannelConnection } from \"@agentxjs/core/network\";\nimport type { BusEvent, SystemEvent } from \"@agentxjs/core/event\";\nimport { createAgentXRuntime } from \"@agentxjs/core/runtime\";\nimport {\n parseMessage,\n isRequest,\n isNotification,\n createSuccessResponse,\n createErrorResponse,\n createStreamEvent,\n RpcErrorCodes,\n type RpcMethod,\n} from \"@agentxjs/core/network\";\nimport {\n WebSocketServer,\n isDeferredProvider,\n type DeferredProviderConfig,\n} from \"@agentxjs/node-provider\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { CommandHandler } from \"./CommandHandler\";\nimport type { AgentXServer } from \"./types\";\n\nconst logger = createLogger(\"server/Server\");\n\n/**\n * Connection state\n */\ninterface ConnectionState {\n connection: ChannelConnection;\n subscribedTopics: Set<string>;\n}\n\n/**\n * Server configuration (supports both immediate and deferred providers)\n */\nexport interface ServerConfig {\n /**\n * AgentX Provider (can be AgentXProvider or DeferredProviderConfig)\n */\n provider: AgentXProvider | DeferredProviderConfig;\n\n /**\n * Port to listen on (standalone mode)\n */\n port?: number;\n\n /**\n * Host to bind to (default: \"0.0.0.0\")\n */\n host?: string;\n\n /**\n * Existing HTTP server to attach to (attached mode)\n */\n server?: import(\"@agentxjs/core/network\").MinimalHTTPServer;\n\n /**\n * WebSocket path when attached (default: \"/ws\")\n */\n wsPath?: string;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n}\n\n/**\n * Create an AgentX server\n */\nexport async function createServer(config: ServerConfig): Promise<AgentXServer> {\n const { wsPath = \"/ws\" } = config;\n\n // Resolve deferred provider if needed\n const provider: AgentXProvider = isDeferredProvider(config.provider)\n ? await config.provider.resolve()\n : config.provider;\n\n // Create runtime from provider\n const runtime = createAgentXRuntime(provider);\n\n // Create WebSocket server\n const wsServer = new WebSocketServer({\n heartbeat: true,\n heartbeatInterval: 30000,\n debug: config.debug,\n });\n\n // Create command handler (no longer needs eventBus)\n const commandHandler = new CommandHandler(runtime);\n\n // Track connections\n const connections = new Map<string, ConnectionState>();\n\n /**\n * Subscribe connection to a topic\n */\n function subscribeToTopic(connectionId: string, topic: string): void {\n const state = connections.get(connectionId);\n if (!state || state.subscribedTopics.has(topic)) return;\n\n state.subscribedTopics.add(topic);\n logger.debug(\"Connection subscribed to topic\", { connectionId, topic });\n }\n\n /**\n * Check if event should be sent to connection based on subscriptions\n */\n function shouldSendToConnection(state: ConnectionState, event: BusEvent): boolean {\n // Skip internal driver events\n if (event.source === \"driver\" && event.intent !== \"notification\") {\n return false;\n }\n\n // Skip command events (they are handled via RPC, not broadcast)\n if (event.source === \"command\") {\n return false;\n }\n\n // Check if subscribed to event's session\n const eventWithContext = event as BusEvent & { context?: { sessionId?: string } };\n const sessionId = eventWithContext.context?.sessionId;\n if (sessionId && state.subscribedTopics.has(sessionId)) {\n return true;\n }\n\n // Send to global subscribers\n return state.subscribedTopics.has(\"global\");\n }\n\n /**\n * Send JSON-RPC response to a specific connection\n */\n function sendResponse(connection: ChannelConnection, id: string | number, result: unknown): void {\n const response = createSuccessResponse(id, result);\n connection.send(JSON.stringify(response));\n }\n\n /**\n * Send JSON-RPC error to a specific connection\n */\n function sendError(\n connection: ChannelConnection,\n id: string | number | null,\n code: number,\n message: string\n ): void {\n const response = createErrorResponse(id, code, message);\n connection.send(JSON.stringify(response));\n }\n\n // Handle new connections\n wsServer.onConnection((connection) => {\n const state: ConnectionState = {\n connection,\n subscribedTopics: new Set([\"global\"]),\n };\n connections.set(connection.id, state);\n\n logger.info(\"Client connected\", {\n connectionId: connection.id,\n totalConnections: connections.size,\n });\n\n // Handle messages from client\n connection.onMessage(async (message) => {\n try {\n const parsed = parseMessage(message);\n\n // Handle single message (not batch)\n if (!Array.isArray(parsed)) {\n await handleParsedMessage(connection, state, parsed);\n } else {\n // Handle batch (not common, but supported by JSON-RPC 2.0)\n for (const item of parsed) {\n await handleParsedMessage(connection, state, item);\n }\n }\n } catch (err) {\n logger.error(\"Failed to parse message\", { error: (err as Error).message });\n sendError(connection, null, RpcErrorCodes.PARSE_ERROR, \"Parse error\");\n }\n });\n\n // Cleanup on disconnect\n connection.onClose(() => {\n connections.delete(connection.id);\n logger.info(\"Client disconnected\", {\n connectionId: connection.id,\n totalConnections: connections.size,\n });\n });\n });\n\n /**\n * Handle a parsed JSON-RPC message\n */\n async function handleParsedMessage(\n connection: ChannelConnection,\n state: ConnectionState,\n parsed: import(\"jsonrpc-lite\").IParsedObject\n ): Promise<void> {\n if (isRequest(parsed)) {\n // JSON-RPC Request - handle and respond directly\n const payload = parsed.payload as {\n id: string | number;\n method: string;\n params: unknown;\n };\n const { id, method, params } = payload;\n\n logger.debug(\"Received RPC request\", { id, method });\n\n // Call command handler\n const result = await commandHandler.handle(method as RpcMethod, params);\n\n if (result.success) {\n sendResponse(connection, id, result.data);\n } else {\n sendError(connection, id, result.code, result.message);\n }\n } else if (isNotification(parsed)) {\n // JSON-RPC Notification - control messages\n const payload = parsed.payload as {\n method: string;\n params: unknown;\n };\n const { method, params } = payload;\n\n logger.debug(\"Received notification\", { method });\n\n if (method === \"subscribe\") {\n const { topic } = params as { topic: string };\n subscribeToTopic(connection.id, topic);\n } else if (method === \"unsubscribe\") {\n const { topic } = params as { topic: string };\n state.subscribedTopics.delete(topic);\n logger.debug(\"Connection unsubscribed from topic\", { connectionId: connection.id, topic });\n } else if (method === \"control.ack\") {\n // ACK for reliable delivery - handled by network layer\n logger.debug(\"Received ACK notification\");\n }\n } else {\n // Invalid message\n logger.warn(\"Received invalid JSON-RPC message\");\n }\n }\n\n // Route internal events to connected clients as JSON-RPC notifications\n provider.eventBus.onAny((event) => {\n // Only broadcast broadcastable events\n if (!shouldBroadcastEvent(event)) {\n return;\n }\n\n // Get topic from event context\n const eventWithContext = event as BusEvent & { context?: { sessionId?: string } };\n const topic = eventWithContext.context?.sessionId || \"global\";\n\n // Wrap as JSON-RPC notification\n const notification = createStreamEvent(topic, event as SystemEvent);\n const message = JSON.stringify(notification);\n\n for (const [connectionId, state] of connections) {\n if (shouldSendToConnection(state, event)) {\n state.connection.sendReliable(message, {\n timeout: 10000,\n onTimeout: () => {\n logger.warn(\"Event ACK timeout\", {\n connectionId,\n eventType: event.type,\n });\n },\n });\n }\n }\n });\n\n /**\n * Check if event should be broadcast\n */\n function shouldBroadcastEvent(event: BusEvent): boolean {\n // Skip internal driver events\n if (event.source === \"driver\" && event.intent !== \"notification\") {\n return false;\n }\n\n // Skip command events (handled via RPC)\n if (event.source === \"command\") {\n return false;\n }\n\n // Check broadcastable flag\n const systemEvent = event as SystemEvent;\n if (systemEvent.broadcastable === false) {\n return false;\n }\n\n return true;\n }\n\n // Attach to existing server if provided\n if (config.server) {\n wsServer.attach(config.server, wsPath);\n logger.info(\"WebSocket attached to existing server\", { path: wsPath });\n }\n\n return {\n async listen(port?: number, host?: string) {\n if (config.server) {\n throw new Error(\n \"Cannot listen when attached to existing server. The server should call listen() instead.\"\n );\n }\n\n const listenPort = port ?? config.port ?? 5200;\n const listenHost = host ?? config.host ?? \"0.0.0.0\";\n\n await wsServer.listen(listenPort, listenHost);\n logger.info(\"Server listening\", { port: listenPort, host: listenHost });\n },\n\n async close() {\n await wsServer.close();\n logger.info(\"Server closed\");\n },\n\n async dispose() {\n // Cleanup in order\n await wsServer.dispose();\n commandHandler.dispose();\n await runtime.shutdown();\n logger.info(\"Server disposed\");\n },\n };\n}\n","/**\n * CommandHandler - Handles JSON-RPC requests directly\n *\n * No longer uses EventBus for request/response. Instead:\n * - Receives RPC requests directly\n * - Returns RPC responses directly\n * - EventBus is only used for stream events (notifications)\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcMethod } from \"@agentxjs/core/network\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"server/CommandHandler\");\n\n/**\n * RPC Result type\n */\nexport interface RpcResult<T = unknown> {\n success: true;\n data: T;\n}\n\nexport interface RpcError {\n success: false;\n code: number;\n message: string;\n}\n\nexport type RpcResponse<T = unknown> = RpcResult<T> | RpcError;\n\n/**\n * Helper to create success result\n */\nfunction ok<T>(data: T): RpcResult<T> {\n return { success: true, data };\n}\n\n/**\n * Helper to create error result\n */\nfunction err(code: number, message: string): RpcError {\n return { success: false, code, message };\n}\n\n/**\n * CommandHandler - Processes RPC requests directly\n */\nexport class CommandHandler {\n private readonly runtime: AgentXRuntime;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n logger.debug(\"CommandHandler created\");\n }\n\n /**\n * Handle an RPC request and return response\n */\n async handle(method: RpcMethod, params: unknown): Promise<RpcResponse> {\n logger.debug(\"Handling RPC request\", { method });\n\n try {\n switch (method) {\n // Container\n case \"container.create\":\n return await this.handleContainerCreate(params);\n case \"container.get\":\n return await this.handleContainerGet(params);\n case \"container.list\":\n return await this.handleContainerList(params);\n\n // Image\n case \"image.create\":\n return await this.handleImageCreate(params);\n case \"image.get\":\n return await this.handleImageGet(params);\n case \"image.list\":\n return await this.handleImageList(params);\n case \"image.delete\":\n return await this.handleImageDelete(params);\n case \"image.run\":\n return await this.handleImageRun(params);\n case \"image.stop\":\n return await this.handleImageStop(params);\n case \"image.update\":\n return await this.handleImageUpdate(params);\n case \"image.messages\":\n return await this.handleImageMessages(params);\n\n // Agent\n case \"agent.get\":\n return await this.handleAgentGet(params);\n case \"agent.list\":\n return await this.handleAgentList(params);\n case \"agent.destroy\":\n return await this.handleAgentDestroy(params);\n case \"agent.destroyAll\":\n return await this.handleAgentDestroyAll(params);\n case \"agent.interrupt\":\n return await this.handleAgentInterrupt(params);\n\n // Message\n case \"message.send\":\n return await this.handleMessageSend(params);\n\n default:\n return err(-32601, `Method not found: ${method}`);\n }\n } catch (error) {\n logger.error(\"RPC handler error\", { method, error });\n return err(-32000, error instanceof Error ? error.message : String(error));\n }\n }\n\n // ==================== Container Commands ====================\n\n private async handleContainerCreate(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId: string };\n const { getOrCreateContainer } = await import(\"@agentxjs/core/container\");\n const { containerRepository, imageRepository, sessionRepository } = this.runtime.provider;\n\n const container = await getOrCreateContainer(containerId, {\n containerRepository,\n imageRepository,\n sessionRepository,\n });\n\n return ok({ containerId: container.containerId });\n }\n\n private async handleContainerGet(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId: string };\n const exists = await this.runtime.provider.containerRepository.containerExists(containerId);\n return ok({ containerId, exists });\n }\n\n private async handleContainerList(_params: unknown): Promise<RpcResponse> {\n const containers = await this.runtime.provider.containerRepository.findAllContainers();\n return ok({ containerIds: containers.map((c) => c.containerId) });\n }\n\n // ==================== Image Commands ====================\n\n private async handleImageCreate(params: unknown): Promise<RpcResponse> {\n const { containerId, name, description, systemPrompt, mcpServers } = params as {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n };\n\n const { imageRepository, sessionRepository } = this.runtime.provider;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n { containerId, name, description, systemPrompt, mcpServers: mcpServers as any },\n { imageRepository, sessionRepository }\n );\n\n return ok({\n record: image.toRecord(),\n __subscriptions: [image.sessionId],\n });\n }\n\n private async handleImageGet(params: unknown): Promise<RpcResponse> {\n const { imageId } = params as { imageId: string };\n const record = await this.runtime.provider.imageRepository.findImageById(imageId);\n return ok({\n record,\n __subscriptions: record?.sessionId ? [record.sessionId] : undefined,\n });\n }\n\n private async handleImageList(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId?: string };\n const records = containerId\n ? await this.runtime.provider.imageRepository.findImagesByContainerId(containerId)\n : await this.runtime.provider.imageRepository.findAllImages();\n\n return ok({\n records,\n __subscriptions: records.map((r) => r.sessionId),\n });\n }\n\n private async handleImageDelete(params: unknown): Promise<RpcResponse> {\n const { imageId } = params as { imageId: string };\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = this.runtime.provider;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) {\n await image.delete();\n }\n\n return ok({ imageId });\n }\n\n private async handleImageRun(params: unknown): Promise<RpcResponse> {\n const { imageId, agentId: requestedAgentId } = params as {\n imageId: string;\n agentId?: string;\n };\n\n // Check if already have a running agent for this image\n const existingAgent = this.runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n logger.debug(\"Reusing existing agent for image\", {\n imageId,\n agentId: existingAgent.agentId,\n });\n return ok({\n imageId,\n agentId: existingAgent.agentId,\n sessionId: existingAgent.sessionId,\n containerId: existingAgent.containerId,\n reused: true,\n });\n }\n\n // Create new agent (with optional custom agentId)\n const agent = await this.runtime.createAgent({\n imageId,\n agentId: requestedAgentId,\n });\n logger.info(\"Created new agent for image\", {\n imageId,\n agentId: agent.agentId,\n });\n\n return ok({\n imageId,\n agentId: agent.agentId,\n sessionId: agent.sessionId,\n containerId: agent.containerId,\n reused: false,\n });\n }\n\n private async handleImageStop(params: unknown): Promise<RpcResponse> {\n const { imageId } = params as { imageId: string };\n\n // Find running agent for this image\n const agent = this.runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n\n if (agent) {\n await this.runtime.stopAgent(agent.agentId);\n logger.info(\"Stopped agent for image\", { imageId, agentId: agent.agentId });\n } else {\n logger.debug(\"No running agent found for image\", { imageId });\n }\n\n return ok({ imageId });\n }\n\n private async handleImageUpdate(params: unknown): Promise<RpcResponse> {\n const { imageId, updates } = params as {\n imageId: string;\n updates: { name?: string; description?: string };\n };\n\n // Get existing image\n const imageRecord = await this.runtime.provider.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n return err(404, `Image not found: ${imageId}`);\n }\n\n // Update image record\n const updatedRecord = {\n ...imageRecord,\n ...updates,\n updatedAt: Date.now(),\n };\n\n await this.runtime.provider.imageRepository.saveImage(updatedRecord);\n\n logger.info(\"Updated image\", { imageId, updates });\n\n return ok({ record: updatedRecord });\n }\n\n private async handleImageMessages(params: unknown): Promise<RpcResponse> {\n const { imageId } = params as { imageId: string };\n\n // Get image record to find sessionId\n const imageRecord = await this.runtime.provider.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n return err(404, `Image not found: ${imageId}`);\n }\n\n // Get messages from session\n const messages = await this.runtime.provider.sessionRepository.getMessages(\n imageRecord.sessionId\n );\n\n logger.debug(\"Got messages for image\", { imageId, count: messages.length });\n\n return ok({ imageId, messages });\n }\n\n // ==================== Agent Commands ====================\n\n private async handleAgentGet(params: unknown): Promise<RpcResponse> {\n const { agentId } = params as { agentId: string };\n const agent = this.runtime.getAgent(agentId);\n\n return ok({\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 });\n }\n\n private async handleAgentList(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId?: string };\n const agents = containerId\n ? this.runtime.getAgentsByContainer(containerId)\n : this.runtime.getAgents();\n\n return ok({\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 });\n }\n\n private async handleAgentDestroy(params: unknown): Promise<RpcResponse> {\n const { agentId } = params as { agentId: string };\n\n // Check if agent exists first\n const agent = this.runtime.getAgent(agentId);\n if (!agent) {\n return ok({ agentId, success: false });\n }\n\n await this.runtime.destroyAgent(agentId);\n return ok({ agentId, success: true });\n }\n\n private async handleAgentDestroyAll(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId: string };\n const agents = this.runtime.getAgentsByContainer(containerId);\n for (const agent of agents) {\n await this.runtime.destroyAgent(agent.agentId);\n }\n return ok({ containerId });\n }\n\n private async handleAgentInterrupt(params: unknown): Promise<RpcResponse> {\n const { agentId } = params as { agentId: string };\n this.runtime.interrupt(agentId);\n return ok({ agentId });\n }\n\n // ==================== Message Commands ====================\n\n private async handleMessageSend(params: unknown): Promise<RpcResponse> {\n const { agentId, imageId, content } = params as {\n agentId?: string;\n imageId?: string;\n content: string | UserContentPart[];\n };\n\n let targetAgentId: string;\n\n if (agentId) {\n // Direct agent reference\n targetAgentId = agentId;\n } else if (imageId) {\n // Auto-activate image: find or create agent\n const existingAgent = this.runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n targetAgentId = existingAgent.agentId;\n logger.debug(\"Using existing agent for message\", {\n imageId,\n agentId: targetAgentId,\n });\n } else {\n // Create new agent for this image\n const agent = await this.runtime.createAgent({ imageId });\n targetAgentId = agent.agentId;\n logger.info(\"Auto-created agent for message\", {\n imageId,\n agentId: targetAgentId,\n });\n }\n } else {\n return err(-32602, \"Either agentId or imageId is required\");\n }\n\n await this.runtime.receive(targetAgentId, content);\n return ok({ agentId: targetAgentId, imageId });\n }\n\n // ==================== Lifecycle ====================\n\n dispose(): void {\n logger.debug(\"CommandHandler disposed\");\n }\n}\n"],"mappings":";AAgBA,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,gBAAAA,qBAAoB;;;ACpB7B,SAAS,oBAAoB;AAE7B,IAAM,SAAS,aAAa,uBAAuB;AAqBnD,SAAS,GAAM,MAAuB;AACpC,SAAO,EAAE,SAAS,MAAM,KAAK;AAC/B;AAKA,SAAS,IAAI,MAAc,SAA2B;AACpD,SAAO,EAAE,SAAS,OAAO,MAAM,QAAQ;AACzC;AAKO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EAEjB,YAAY,SAAwB;AAClC,SAAK,UAAU;AACf,WAAO,MAAM,wBAAwB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAmB,QAAuC;AACrE,WAAO,MAAM,wBAAwB,EAAE,OAAO,CAAC;AAE/C,QAAI;AACF,cAAQ,QAAQ;AAAA;AAAA,QAEd,KAAK;AACH,iBAAO,MAAM,KAAK,sBAAsB,MAAM;AAAA,QAChD,KAAK;AACH,iBAAO,MAAM,KAAK,mBAAmB,MAAM;AAAA,QAC7C,KAAK;AACH,iBAAO,MAAM,KAAK,oBAAoB,MAAM;AAAA;AAAA,QAG9C,KAAK;AACH,iBAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,QAC5C,KAAK;AACH,iBAAO,MAAM,KAAK,eAAe,MAAM;AAAA,QACzC,KAAK;AACH,iBAAO,MAAM,KAAK,gBAAgB,MAAM;AAAA,QAC1C,KAAK;AACH,iBAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,QAC5C,KAAK;AACH,iBAAO,MAAM,KAAK,eAAe,MAAM;AAAA,QACzC,KAAK;AACH,iBAAO,MAAM,KAAK,gBAAgB,MAAM;AAAA,QAC1C,KAAK;AACH,iBAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,QAC5C,KAAK;AACH,iBAAO,MAAM,KAAK,oBAAoB,MAAM;AAAA;AAAA,QAG9C,KAAK;AACH,iBAAO,MAAM,KAAK,eAAe,MAAM;AAAA,QACzC,KAAK;AACH,iBAAO,MAAM,KAAK,gBAAgB,MAAM;AAAA,QAC1C,KAAK;AACH,iBAAO,MAAM,KAAK,mBAAmB,MAAM;AAAA,QAC7C,KAAK;AACH,iBAAO,MAAM,KAAK,sBAAsB,MAAM;AAAA,QAChD,KAAK;AACH,iBAAO,MAAM,KAAK,qBAAqB,MAAM;AAAA;AAAA,QAG/C,KAAK;AACH,iBAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,QAE5C;AACE,iBAAO,IAAI,QAAQ,qBAAqB,MAAM,EAAE;AAAA,MACpD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,qBAAqB,EAAE,QAAQ,MAAM,CAAC;AACnD,aAAO,IAAI,OAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3E;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,sBAAsB,QAAuC;AACzE,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,0BAA0B;AACxE,UAAM,EAAE,qBAAqB,iBAAiB,kBAAkB,IAAI,KAAK,QAAQ;AAEjF,UAAM,YAAY,MAAM,qBAAqB,aAAa;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,GAAG,EAAE,aAAa,UAAU,YAAY,CAAC;AAAA,EAClD;AAAA,EAEA,MAAc,mBAAmB,QAAuC;AACtE,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,SAAS,MAAM,KAAK,QAAQ,SAAS,oBAAoB,gBAAgB,WAAW;AAC1F,WAAO,GAAG,EAAE,aAAa,OAAO,CAAC;AAAA,EACnC;AAAA,EAEA,MAAc,oBAAoB,SAAwC;AACxE,UAAM,aAAa,MAAM,KAAK,QAAQ,SAAS,oBAAoB,kBAAkB;AACrF,WAAO,GAAG,EAAE,cAAc,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA,EAIA,MAAc,kBAAkB,QAAuC;AACrE,UAAM,EAAE,aAAa,MAAM,aAAa,cAAc,WAAW,IAAI;AAQrE,UAAM,EAAE,iBAAiB,kBAAkB,IAAI,KAAK,QAAQ;AAC5D,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAsB;AAE3D,UAAM,QAAQ,MAAM;AAAA,MAClB,EAAE,aAAa,MAAM,aAAa,cAAc,WAA8B;AAAA,MAC9E,EAAE,iBAAiB,kBAAkB;AAAA,IACvC;AAEA,WAAO,GAAG;AAAA,MACR,QAAQ,MAAM,SAAS;AAAA,MACvB,iBAAiB,CAAC,MAAM,SAAS;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eAAe,QAAuC;AAClE,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,SAAS,MAAM,KAAK,QAAQ,SAAS,gBAAgB,cAAc,OAAO;AAChF,WAAO,GAAG;AAAA,MACR;AAAA,MACA,iBAAiB,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBAAgB,QAAuC;AACnE,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,UAAU,cACZ,MAAM,KAAK,QAAQ,SAAS,gBAAgB,wBAAwB,WAAW,IAC/E,MAAM,KAAK,QAAQ,SAAS,gBAAgB,cAAc;AAE9D,WAAO,GAAG;AAAA,MACR;AAAA,MACA,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,kBAAkB,QAAuC;AACrE,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,UAAM,EAAE,iBAAiB,kBAAkB,IAAI,KAAK,QAAQ;AAE5D,UAAM,QAAQ,MAAM,UAAU,SAAS,EAAE,iBAAiB,kBAAkB,CAAC;AAC7E,QAAI,OAAO;AACT,YAAM,MAAM,OAAO;AAAA,IACrB;AAEA,WAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACvB;AAAA,EAEA,MAAc,eAAe,QAAuC;AAClE,UAAM,EAAE,SAAS,SAAS,iBAAiB,IAAI;AAM/C,UAAM,gBAAgB,KAAK,QACxB,UAAU,EACV,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,cAAc,SAAS;AAEjE,QAAI,eAAe;AACjB,aAAO,MAAM,oCAAoC;AAAA,QAC/C;AAAA,QACA,SAAS,cAAc;AAAA,MACzB,CAAC;AACD,aAAO,GAAG;AAAA,QACR;AAAA,QACA,SAAS,cAAc;AAAA,QACvB,WAAW,cAAc;AAAA,QACzB,aAAa,cAAc;AAAA,QAC3B,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,QAAQ,MAAM,KAAK,QAAQ,YAAY;AAAA,MAC3C;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO,KAAK,+BAA+B;AAAA,MACzC;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,GAAG;AAAA,MACR;AAAA,MACA,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBAAgB,QAAuC;AACnE,UAAM,EAAE,QAAQ,IAAI;AAGpB,UAAM,QAAQ,KAAK,QAChB,UAAU,EACV,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,cAAc,SAAS;AAEjE,QAAI,OAAO;AACT,YAAM,KAAK,QAAQ,UAAU,MAAM,OAAO;AAC1C,aAAO,KAAK,2BAA2B,EAAE,SAAS,SAAS,MAAM,QAAQ,CAAC;AAAA,IAC5E,OAAO;AACL,aAAO,MAAM,oCAAoC,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAEA,WAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACvB;AAAA,EAEA,MAAc,kBAAkB,QAAuC;AACrE,UAAM,EAAE,SAAS,QAAQ,IAAI;AAM7B,UAAM,cAAc,MAAM,KAAK,QAAQ,SAAS,gBAAgB,cAAc,OAAO;AACrF,QAAI,CAAC,aAAa;AAChB,aAAO,IAAI,KAAK,oBAAoB,OAAO,EAAE;AAAA,IAC/C;AAGA,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,UAAM,KAAK,QAAQ,SAAS,gBAAgB,UAAU,aAAa;AAEnE,WAAO,KAAK,iBAAiB,EAAE,SAAS,QAAQ,CAAC;AAEjD,WAAO,GAAG,EAAE,QAAQ,cAAc,CAAC;AAAA,EACrC;AAAA,EAEA,MAAc,oBAAoB,QAAuC;AACvE,UAAM,EAAE,QAAQ,IAAI;AAGpB,UAAM,cAAc,MAAM,KAAK,QAAQ,SAAS,gBAAgB,cAAc,OAAO;AACrF,QAAI,CAAC,aAAa;AAChB,aAAO,IAAI,KAAK,oBAAoB,OAAO,EAAE;AAAA,IAC/C;AAGA,UAAM,WAAW,MAAM,KAAK,QAAQ,SAAS,kBAAkB;AAAA,MAC7D,YAAY;AAAA,IACd;AAEA,WAAO,MAAM,0BAA0B,EAAE,SAAS,OAAO,SAAS,OAAO,CAAC;AAE1E,WAAO,GAAG,EAAE,SAAS,SAAS,CAAC;AAAA,EACjC;AAAA;AAAA,EAIA,MAAc,eAAe,QAAuC;AAClE,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAE3C,WAAO,GAAG;AAAA,MACR,OAAO,QACH;AAAA,QACE,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,MACnB,IACA;AAAA,MACJ,QAAQ,CAAC,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBAAgB,QAAuC;AACnE,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,SAAS,cACX,KAAK,QAAQ,qBAAqB,WAAW,IAC7C,KAAK,QAAQ,UAAU;AAE3B,WAAO,GAAG;AAAA,MACR,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,QACzB,SAAS,EAAE;AAAA,QACX,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,mBAAmB,QAAuC;AACtE,UAAM,EAAE,QAAQ,IAAI;AAGpB,UAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAC3C,QAAI,CAAC,OAAO;AACV,aAAO,GAAG,EAAE,SAAS,SAAS,MAAM,CAAC;AAAA,IACvC;AAEA,UAAM,KAAK,QAAQ,aAAa,OAAO;AACvC,WAAO,GAAG,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,MAAc,sBAAsB,QAAuC;AACzE,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,SAAS,KAAK,QAAQ,qBAAqB,WAAW;AAC5D,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,QAAQ,aAAa,MAAM,OAAO;AAAA,IAC/C;AACA,WAAO,GAAG,EAAE,YAAY,CAAC;AAAA,EAC3B;AAAA,EAEA,MAAc,qBAAqB,QAAuC;AACxE,UAAM,EAAE,QAAQ,IAAI;AACpB,SAAK,QAAQ,UAAU,OAAO;AAC9B,WAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACvB;AAAA;AAAA,EAIA,MAAc,kBAAkB,QAAuC;AACrE,UAAM,EAAE,SAAS,SAAS,QAAQ,IAAI;AAMtC,QAAI;AAEJ,QAAI,SAAS;AAEX,sBAAgB;AAAA,IAClB,WAAW,SAAS;AAElB,YAAM,gBAAgB,KAAK,QACxB,UAAU,EACV,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,cAAc,SAAS;AAEjE,UAAI,eAAe;AACjB,wBAAgB,cAAc;AAC9B,eAAO,MAAM,oCAAoC;AAAA,UAC/C;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,QAAQ,MAAM,KAAK,QAAQ,YAAY,EAAE,QAAQ,CAAC;AACxD,wBAAgB,MAAM;AACtB,eAAO,KAAK,kCAAkC;AAAA,UAC5C;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,aAAO,IAAI,QAAQ,uCAAuC;AAAA,IAC5D;AAEA,UAAM,KAAK,QAAQ,QAAQ,eAAe,OAAO;AACjD,WAAO,GAAG,EAAE,SAAS,eAAe,QAAQ,CAAC;AAAA,EAC/C;AAAA;AAAA,EAIA,UAAgB;AACd,WAAO,MAAM,yBAAyB;AAAA,EACxC;AACF;;;ADlYA,IAAMC,UAASC,cAAa,eAAe;AAgD3C,eAAsB,aAAa,QAA6C;AAC9E,QAAM,EAAE,SAAS,MAAM,IAAI;AAG3B,QAAM,WAA2B,mBAAmB,OAAO,QAAQ,IAC/D,MAAM,OAAO,SAAS,QAAQ,IAC9B,OAAO;AAGX,QAAM,UAAU,oBAAoB,QAAQ;AAG5C,QAAM,WAAW,IAAI,gBAAgB;AAAA,IACnC,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,OAAO,OAAO;AAAA,EAChB,CAAC;AAGD,QAAM,iBAAiB,IAAI,eAAe,OAAO;AAGjD,QAAM,cAAc,oBAAI,IAA6B;AAKrD,WAAS,iBAAiB,cAAsB,OAAqB;AACnE,UAAM,QAAQ,YAAY,IAAI,YAAY;AAC1C,QAAI,CAAC,SAAS,MAAM,iBAAiB,IAAI,KAAK,EAAG;AAEjD,UAAM,iBAAiB,IAAI,KAAK;AAChC,IAAAD,QAAO,MAAM,kCAAkC,EAAE,cAAc,MAAM,CAAC;AAAA,EACxE;AAKA,WAAS,uBAAuB,OAAwB,OAA0B;AAEhF,QAAI,MAAM,WAAW,YAAY,MAAM,WAAW,gBAAgB;AAChE,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,WAAW,WAAW;AAC9B,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB;AACzB,UAAM,YAAY,iBAAiB,SAAS;AAC5C,QAAI,aAAa,MAAM,iBAAiB,IAAI,SAAS,GAAG;AACtD,aAAO;AAAA,IACT;AAGA,WAAO,MAAM,iBAAiB,IAAI,QAAQ;AAAA,EAC5C;AAKA,WAAS,aAAa,YAA+B,IAAqB,QAAuB;AAC/F,UAAM,WAAW,sBAAsB,IAAI,MAAM;AACjD,eAAW,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC1C;AAKA,WAAS,UACP,YACA,IACA,MACA,SACM;AACN,UAAM,WAAW,oBAAoB,IAAI,MAAM,OAAO;AACtD,eAAW,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC1C;AAGA,WAAS,aAAa,CAAC,eAAe;AACpC,UAAM,QAAyB;AAAA,MAC7B;AAAA,MACA,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAAA,IACtC;AACA,gBAAY,IAAI,WAAW,IAAI,KAAK;AAEpC,IAAAA,QAAO,KAAK,oBAAoB;AAAA,MAC9B,cAAc,WAAW;AAAA,MACzB,kBAAkB,YAAY;AAAA,IAChC,CAAC;AAGD,eAAW,UAAU,OAAO,YAAY;AACtC,UAAI;AACF,cAAM,SAAS,aAAa,OAAO;AAGnC,YAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,gBAAM,oBAAoB,YAAY,OAAO,MAAM;AAAA,QACrD,OAAO;AAEL,qBAAW,QAAQ,QAAQ;AACzB,kBAAM,oBAAoB,YAAY,OAAO,IAAI;AAAA,UACnD;AAAA,QACF;AAAA,MACF,SAASE,MAAK;AACZ,QAAAF,QAAO,MAAM,2BAA2B,EAAE,OAAQE,KAAc,QAAQ,CAAC;AACzE,kBAAU,YAAY,MAAM,cAAc,aAAa,aAAa;AAAA,MACtE;AAAA,IACF,CAAC;AAGD,eAAW,QAAQ,MAAM;AACvB,kBAAY,OAAO,WAAW,EAAE;AAChC,MAAAF,QAAO,KAAK,uBAAuB;AAAA,QACjC,cAAc,WAAW;AAAA,QACzB,kBAAkB,YAAY;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAKD,iBAAe,oBACb,YACA,OACA,QACe;AACf,QAAI,UAAU,MAAM,GAAG;AAErB,YAAM,UAAU,OAAO;AAKvB,YAAM,EAAE,IAAI,QAAQ,OAAO,IAAI;AAE/B,MAAAA,QAAO,MAAM,wBAAwB,EAAE,IAAI,OAAO,CAAC;AAGnD,YAAM,SAAS,MAAM,eAAe,OAAO,QAAqB,MAAM;AAEtE,UAAI,OAAO,SAAS;AAClB,qBAAa,YAAY,IAAI,OAAO,IAAI;AAAA,MAC1C,OAAO;AACL,kBAAU,YAAY,IAAI,OAAO,MAAM,OAAO,OAAO;AAAA,MACvD;AAAA,IACF,WAAW,eAAe,MAAM,GAAG;AAEjC,YAAM,UAAU,OAAO;AAIvB,YAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,MAAAA,QAAO,MAAM,yBAAyB,EAAE,OAAO,CAAC;AAEhD,UAAI,WAAW,aAAa;AAC1B,cAAM,EAAE,MAAM,IAAI;AAClB,yBAAiB,WAAW,IAAI,KAAK;AAAA,MACvC,WAAW,WAAW,eAAe;AACnC,cAAM,EAAE,MAAM,IAAI;AAClB,cAAM,iBAAiB,OAAO,KAAK;AACnC,QAAAA,QAAO,MAAM,sCAAsC,EAAE,cAAc,WAAW,IAAI,MAAM,CAAC;AAAA,MAC3F,WAAW,WAAW,eAAe;AAEnC,QAAAA,QAAO,MAAM,2BAA2B;AAAA,MAC1C;AAAA,IACF,OAAO;AAEL,MAAAA,QAAO,KAAK,mCAAmC;AAAA,IACjD;AAAA,EACF;AAGA,WAAS,SAAS,MAAM,CAAC,UAAU;AAEjC,QAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC;AAAA,IACF;AAGA,UAAM,mBAAmB;AACzB,UAAM,QAAQ,iBAAiB,SAAS,aAAa;AAGrD,UAAM,eAAe,kBAAkB,OAAO,KAAoB;AAClE,UAAM,UAAU,KAAK,UAAU,YAAY;AAE3C,eAAW,CAAC,cAAc,KAAK,KAAK,aAAa;AAC/C,UAAI,uBAAuB,OAAO,KAAK,GAAG;AACxC,cAAM,WAAW,aAAa,SAAS;AAAA,UACrC,SAAS;AAAA,UACT,WAAW,MAAM;AACf,YAAAA,QAAO,KAAK,qBAAqB;AAAA,cAC/B;AAAA,cACA,WAAW,MAAM;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAKD,WAAS,qBAAqB,OAA0B;AAEtD,QAAI,MAAM,WAAW,YAAY,MAAM,WAAW,gBAAgB;AAChE,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,WAAW,WAAW;AAC9B,aAAO;AAAA,IACT;AAGA,UAAM,cAAc;AACpB,QAAI,YAAY,kBAAkB,OAAO;AACvC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,QAAQ;AACjB,aAAS,OAAO,OAAO,QAAQ,MAAM;AACrC,IAAAA,QAAO,KAAK,yCAAyC,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,MAAe,MAAe;AACzC,UAAI,OAAO,QAAQ;AACjB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,OAAO,QAAQ;AAC1C,YAAM,aAAa,QAAQ,OAAO,QAAQ;AAE1C,YAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,MAAAA,QAAO,KAAK,oBAAoB,EAAE,MAAM,YAAY,MAAM,WAAW,CAAC;AAAA,IACxE;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAM,SAAS,MAAM;AACrB,MAAAA,QAAO,KAAK,eAAe;AAAA,IAC7B;AAAA,IAEA,MAAM,UAAU;AAEd,YAAM,SAAS,QAAQ;AACvB,qBAAe,QAAQ;AACvB,YAAM,QAAQ,SAAS;AACvB,MAAAA,QAAO,KAAK,iBAAiB;AAAA,IAC/B;AAAA,EACF;AACF;","names":["createLogger","logger","createLogger","err"]}
package/package.json CHANGED
@@ -1,24 +1,36 @@
1
1
  {
2
2
  "name": "@agentxjs/server",
3
- "version": "1.9.3-dev",
3
+ "version": "1.9.6-dev",
4
4
  "description": "AgentX Server - WebSocket server with Provider support",
5
5
  "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
6
8
  "bin": {
7
9
  "agentx-server": "./bin/server.ts"
8
10
  },
9
11
  "exports": {
10
- ".": "./src/index.ts"
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ }
11
17
  },
18
+ "files": [
19
+ "dist",
20
+ "src",
21
+ "bin"
22
+ ],
12
23
  "scripts": {
24
+ "build": "tsup",
13
25
  "dev": "bun run bin/server.ts",
14
26
  "typecheck": "tsc --noEmit",
15
27
  "test": "bun test"
16
28
  },
17
29
  "dependencies": {
18
- "@agentxjs/core": "1.9.3-dev",
19
- "@agentxjs/node-provider": "1.9.3-dev",
20
- "@agentxjs/claude-driver": "1.9.3-dev",
21
- "commonxjs": "^0.1.0"
30
+ "@agentxjs/core": "1.9.6-dev",
31
+ "@agentxjs/node-provider": "1.9.6-dev",
32
+ "@agentxjs/claude-driver": "1.9.6-dev",
33
+ "commonxjs": "^0.1.1"
22
34
  },
23
35
  "devDependencies": {
24
36
  "typescript": "^5.3.3"
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "declaration": true,
5
- "outDir": "./dist",
6
- "rootDir": "./src"
7
- },
8
- "include": ["src/**/*"],
9
- "exclude": ["node_modules", "dist"]
10
- }