agentxjs 2.6.1 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -80,6 +80,9 @@ interface AgentX {
80
80
  // Conversation management
81
81
  readonly chat: ChatNamespace;
82
82
 
83
+ // Prototype registry — reusable agent templates
84
+ readonly prototype: PrototypeNamespace;
85
+
83
86
  // Low-level subsystems
84
87
  readonly runtime: RuntimeNamespace;
85
88
 
@@ -114,12 +117,14 @@ Conversation management — create, list, and open conversations:
114
117
 
115
118
  ```typescript
116
119
  interface ChatNamespace {
117
- create(params: { name?, description?, contextId?, embody?, customData? }): Promise<AgentHandle>;
120
+ create(params: { prototypeId?, name?, description?, contextId?, embody?, customData? }): Promise<AgentHandle>;
118
121
  list(): Promise<ImageListResponse>;
119
122
  get(id: string): Promise<AgentHandle | null>;
120
123
  }
121
124
  ```
122
125
 
126
+ When `prototypeId` is provided, the conversation inherits the prototype's configuration. Inline params override prototype values.
127
+
123
128
  ### AgentHandle
124
129
 
125
130
  Returned by `chat.create()` and `chat.get()`. A live reference to a conversation with agent operations.
@@ -140,6 +145,32 @@ interface AgentHandle {
140
145
  }
141
146
  ```
142
147
 
148
+ ### PrototypeNamespace
149
+
150
+ Manage reusable agent templates — register once, create many conversations:
151
+
152
+ ```typescript
153
+ interface PrototypeNamespace {
154
+ create(params: { containerId, name, description?, contextId?, embody?, customData? }): Promise<PrototypeCreateResponse>;
155
+ get(prototypeId: string): Promise<PrototypeGetResponse>;
156
+ list(containerId?: string): Promise<PrototypeListResponse>;
157
+ update(prototypeId: string, updates: { name?, description?, contextId?, embody?, customData? }): Promise<PrototypeUpdateResponse>;
158
+ delete(prototypeId: string): Promise<BaseResponse>;
159
+ }
160
+ ```
161
+
162
+ ```typescript
163
+ // Register a prototype
164
+ const res = await ax.prototype.create({
165
+ containerId: "default",
166
+ name: "Code Reviewer",
167
+ embody: { model: "claude-sonnet-4-6", systemPrompt: "You review code." },
168
+ });
169
+
170
+ // Create conversation from prototype
171
+ const agent = await ax.chat.create({ prototypeId: res.record.prototypeId });
172
+ ```
173
+
143
174
  ### Runtime Namespace (low-level)
144
175
 
145
176
  For advanced use cases, access `ax.runtime.*` for direct subsystem operations:
@@ -186,6 +217,14 @@ For advanced use cases, access `ax.runtime.*` for direct subsystem operations:
186
217
  - `setDefault(id: string): Promise<BaseResponse>`
187
218
  - `getDefault(containerId: string): Promise<LLMProviderDefaultResponse>`
188
219
 
220
+ **prototype**:
221
+
222
+ - `create(params: { containerId, name, description?, contextId?, embody?, customData? }): Promise<PrototypeCreateResponse>`
223
+ - `get(prototypeId: string): Promise<PrototypeGetResponse>`
224
+ - `list(containerId?: string): Promise<PrototypeListResponse>`
225
+ - `update(prototypeId: string, updates: { name?, description?, contextId?, embody?, customData? }): Promise<PrototypeUpdateResponse>`
226
+ - `delete(prototypeId: string): Promise<BaseResponse>`
227
+
189
228
  Each LLM provider has a **vendor** (who provides the service — `anthropic`, `openai`, `deepseek`, `ollama`) and a **protocol** (API format — `anthropic` or `openai`). These are separate dimensions: e.g., Deepseek uses vendor `"deepseek"` with protocol `"openai"`.
190
229
 
191
230
  ### Embodiment
@@ -213,6 +252,10 @@ await ax.rpc("container.create", { containerId: "default" });
213
252
  // Equivalent to ax.runtime.image.list()
214
253
  const { records } = await ax.rpc<{ records: ImageRecord[] }>("image.list");
215
254
 
255
+ // Prototype operations via RPC
256
+ await ax.rpc("prototype.create", { containerId: "default", name: "My Agent" });
257
+ const { records } = await ax.rpc<{ records: PrototypeRecord[] }>("prototype.list", {});
258
+
216
259
  // Useful for custom transport (e.g. Cloudflare Workers/DO)
217
260
  const response = await ax.rpc(request.method, request.params);
218
261
  ```
@@ -0,0 +1,388 @@
1
+ // src/CommandHandler.ts
2
+ import { DEFAULT_CONTAINER_ID } from "@agentxjs/core/container";
3
+ import { createLogger } from "@deepracticex/logger";
4
+ var logger = createLogger("server/CommandHandler");
5
+ function ok(data) {
6
+ return { success: true, data };
7
+ }
8
+ function err(code, message) {
9
+ return { success: false, code, message };
10
+ }
11
+ var CommandHandler = class {
12
+ runtime;
13
+ constructor(runtime) {
14
+ this.runtime = runtime;
15
+ logger.debug("CommandHandler created");
16
+ }
17
+ /**
18
+ * Handle an RPC request and return response
19
+ */
20
+ async handle(method, params) {
21
+ logger.debug("Handling RPC request", { method });
22
+ try {
23
+ switch (method) {
24
+ // Image
25
+ case "image.create":
26
+ return await this.handleImageCreate(params);
27
+ case "image.get":
28
+ return await this.handleImageGet(params);
29
+ case "image.list":
30
+ return await this.handleImageList(params);
31
+ case "image.delete":
32
+ return await this.handleImageDelete(params);
33
+ case "image.run":
34
+ return await this.handleImageRun(params);
35
+ case "image.stop":
36
+ return await this.handleImageStop(params);
37
+ case "image.update":
38
+ return await this.handleImageUpdate(params);
39
+ case "image.messages":
40
+ return await this.handleImageMessages(params);
41
+ // Instance
42
+ case "instance.get":
43
+ return await this.handleAgentGet(params);
44
+ case "instance.list":
45
+ return await this.handleAgentList(params);
46
+ case "instance.destroy":
47
+ return await this.handleAgentDestroy(params);
48
+ case "instance.destroyAll":
49
+ return await this.handleAgentDestroyAll(params);
50
+ case "instance.interrupt":
51
+ return await this.handleAgentInterrupt(params);
52
+ // Message
53
+ case "message.send":
54
+ return await this.handleMessageSend(params);
55
+ // LLM Provider
56
+ case "llm.create":
57
+ return await this.handleLLMCreate(params);
58
+ case "llm.get":
59
+ return await this.handleLLMGet(params);
60
+ case "llm.list":
61
+ return await this.handleLLMList(params);
62
+ case "llm.update":
63
+ return await this.handleLLMUpdate(params);
64
+ case "llm.delete":
65
+ return await this.handleLLMDelete(params);
66
+ case "llm.default":
67
+ return await this.handleLLMDefault(params);
68
+ default:
69
+ return err(-32601, `Method not found: ${method}`);
70
+ }
71
+ } catch (error) {
72
+ logger.error("RPC handler error", { method, error });
73
+ return err(-32e3, error instanceof Error ? error.message : String(error));
74
+ }
75
+ }
76
+ // ==================== Image Commands ====================
77
+ async handleImageCreate(params) {
78
+ const {
79
+ containerId: _cid,
80
+ name,
81
+ description,
82
+ contextId,
83
+ model,
84
+ systemPrompt,
85
+ mcpServers,
86
+ customData
87
+ } = params;
88
+ const { imageRepository, sessionRepository } = this.runtime.platform;
89
+ const { createImage } = await import("@agentxjs/core/image");
90
+ const embody = model || systemPrompt || mcpServers ? { model, systemPrompt, mcpServers } : void 0;
91
+ const image = await createImage(
92
+ { containerId: DEFAULT_CONTAINER_ID, name, description, contextId, embody, customData },
93
+ { imageRepository, sessionRepository }
94
+ );
95
+ return ok({
96
+ record: image.toRecord(),
97
+ __subscriptions: [image.sessionId]
98
+ });
99
+ }
100
+ async handleImageGet(params) {
101
+ const { imageId } = params;
102
+ const record = await this.runtime.platform.imageRepository.findImageById(imageId);
103
+ return ok({
104
+ record,
105
+ __subscriptions: record?.sessionId ? [record.sessionId] : void 0
106
+ });
107
+ }
108
+ async handleImageList(params) {
109
+ const { containerId } = params;
110
+ const records = containerId ? await this.runtime.platform.imageRepository.findImagesByContainerId(containerId) : await this.runtime.platform.imageRepository.findAllImages();
111
+ return ok({
112
+ records,
113
+ __subscriptions: records.map((r) => r.sessionId)
114
+ });
115
+ }
116
+ async handleImageDelete(params) {
117
+ const { imageId } = params;
118
+ const { loadImage } = await import("@agentxjs/core/image");
119
+ const { imageRepository, sessionRepository } = this.runtime.platform;
120
+ const image = await loadImage(imageId, { imageRepository, sessionRepository });
121
+ if (image) {
122
+ await image.delete();
123
+ }
124
+ return ok({ imageId });
125
+ }
126
+ async handleImageRun(params) {
127
+ const { imageId, instanceId: requestedInstanceId } = params;
128
+ const existingAgent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
129
+ if (existingAgent) {
130
+ logger.debug("Reusing existing agent for image", {
131
+ imageId,
132
+ instanceId: existingAgent.instanceId
133
+ });
134
+ return ok({
135
+ imageId,
136
+ instanceId: existingAgent.instanceId,
137
+ sessionId: existingAgent.sessionId,
138
+ containerId: existingAgent.containerId,
139
+ reused: true
140
+ });
141
+ }
142
+ const agent = await this.runtime.createAgent({
143
+ imageId,
144
+ instanceId: requestedInstanceId
145
+ });
146
+ logger.info("Created new agent for image", {
147
+ imageId,
148
+ instanceId: agent.instanceId
149
+ });
150
+ return ok({
151
+ imageId,
152
+ instanceId: agent.instanceId,
153
+ sessionId: agent.sessionId,
154
+ containerId: agent.containerId,
155
+ reused: false
156
+ });
157
+ }
158
+ async handleImageStop(params) {
159
+ const { imageId } = params;
160
+ const agent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
161
+ if (agent) {
162
+ await this.runtime.stopAgent(agent.instanceId);
163
+ logger.info("Stopped agent for image", { imageId, instanceId: agent.instanceId });
164
+ } else {
165
+ logger.debug("No running agent found for image", { imageId });
166
+ }
167
+ return ok({ imageId });
168
+ }
169
+ async handleImageUpdate(params) {
170
+ const { imageId, updates } = params;
171
+ const imageRecord = await this.runtime.platform.imageRepository.findImageById(imageId);
172
+ if (!imageRecord) {
173
+ return err(404, `Image not found: ${imageId}`);
174
+ }
175
+ const { model, systemPrompt, mcpServers, ...otherUpdates } = updates;
176
+ const embodyUpdates = model !== void 0 || systemPrompt !== void 0 || mcpServers !== void 0 ? {
177
+ ...imageRecord.embody,
178
+ model,
179
+ systemPrompt,
180
+ mcpServers
181
+ } : imageRecord.embody;
182
+ const updatedRecord = {
183
+ ...imageRecord,
184
+ ...otherUpdates,
185
+ embody: embodyUpdates,
186
+ updatedAt: Date.now()
187
+ };
188
+ await this.runtime.platform.imageRepository.saveImage(updatedRecord);
189
+ logger.info("Updated image", { imageId, updates });
190
+ return ok({ record: updatedRecord });
191
+ }
192
+ async handleImageMessages(params) {
193
+ const { imageId } = params;
194
+ const imageRecord = await this.runtime.platform.imageRepository.findImageById(imageId);
195
+ if (!imageRecord) {
196
+ return err(404, `Image not found: ${imageId}`);
197
+ }
198
+ const messages = await this.runtime.platform.sessionRepository.getMessages(
199
+ imageRecord.sessionId
200
+ );
201
+ logger.debug("Got messages for image", { imageId, count: messages.length });
202
+ return ok({ imageId, messages });
203
+ }
204
+ // ==================== Agent Commands ====================
205
+ async handleAgentGet(params) {
206
+ const { instanceId } = params;
207
+ const agent = this.runtime.getAgent(instanceId);
208
+ return ok({
209
+ agent: agent ? {
210
+ instanceId: agent.instanceId,
211
+ imageId: agent.imageId,
212
+ containerId: agent.containerId,
213
+ sessionId: agent.sessionId,
214
+ lifecycle: agent.lifecycle
215
+ } : null,
216
+ exists: !!agent
217
+ });
218
+ }
219
+ async handleAgentList(params) {
220
+ const { containerId } = params;
221
+ const agents = containerId ? this.runtime.getAgentsByContainer(containerId) : this.runtime.getAgents();
222
+ return ok({
223
+ agents: agents.map((a) => ({
224
+ instanceId: a.instanceId,
225
+ imageId: a.imageId,
226
+ containerId: a.containerId,
227
+ sessionId: a.sessionId,
228
+ lifecycle: a.lifecycle
229
+ }))
230
+ });
231
+ }
232
+ async handleAgentDestroy(params) {
233
+ const { instanceId } = params;
234
+ const agent = this.runtime.getAgent(instanceId);
235
+ if (!agent) {
236
+ return ok({ instanceId, success: false });
237
+ }
238
+ await this.runtime.destroyAgent(instanceId);
239
+ return ok({ instanceId, success: true });
240
+ }
241
+ async handleAgentDestroyAll(params) {
242
+ const { containerId } = params;
243
+ const agents = this.runtime.getAgentsByContainer(containerId);
244
+ for (const agent of agents) {
245
+ await this.runtime.destroyAgent(agent.instanceId);
246
+ }
247
+ return ok({ containerId });
248
+ }
249
+ async handleAgentInterrupt(params) {
250
+ const { instanceId } = params;
251
+ this.runtime.interrupt(instanceId);
252
+ return ok({ instanceId });
253
+ }
254
+ // ==================== Message Commands ====================
255
+ async handleMessageSend(params) {
256
+ const { instanceId, imageId, content } = params;
257
+ let targetInstanceId;
258
+ if (instanceId) {
259
+ targetInstanceId = instanceId;
260
+ } else if (imageId) {
261
+ const existingAgent = this.runtime.getAgents().find((a) => a.imageId === imageId && a.lifecycle === "running");
262
+ if (existingAgent) {
263
+ targetInstanceId = existingAgent.instanceId;
264
+ logger.debug("Using existing agent for message", {
265
+ imageId,
266
+ instanceId: targetInstanceId
267
+ });
268
+ } else {
269
+ const agent = await this.runtime.createAgent({ imageId });
270
+ targetInstanceId = agent.instanceId;
271
+ logger.info("Auto-created agent for message", {
272
+ imageId,
273
+ instanceId: targetInstanceId
274
+ });
275
+ }
276
+ } else {
277
+ return err(-32602, "Either instanceId or imageId is required");
278
+ }
279
+ await this.runtime.receive(targetInstanceId, content);
280
+ return ok({ instanceId: targetInstanceId, imageId });
281
+ }
282
+ // ==================== LLM Provider Commands ====================
283
+ async handleLLMCreate(params) {
284
+ const {
285
+ containerId: _cid,
286
+ name,
287
+ vendor,
288
+ protocol,
289
+ apiKey,
290
+ baseUrl,
291
+ model
292
+ } = params;
293
+ const repo = this.runtime.platform.llmProviderRepository;
294
+ if (!repo) {
295
+ return err(-32e3, "LLM provider repository not available");
296
+ }
297
+ const { generateId } = await import("@deepracticex/id");
298
+ const now = Date.now();
299
+ const record = {
300
+ id: generateId("llm"),
301
+ containerId: DEFAULT_CONTAINER_ID,
302
+ name,
303
+ vendor,
304
+ protocol,
305
+ apiKey,
306
+ baseUrl,
307
+ model,
308
+ isDefault: false,
309
+ createdAt: now,
310
+ updatedAt: now
311
+ };
312
+ await repo.saveLLMProvider(record);
313
+ return ok({ record });
314
+ }
315
+ async handleLLMGet(params) {
316
+ const { id } = params;
317
+ const repo = this.runtime.platform.llmProviderRepository;
318
+ if (!repo) {
319
+ return err(-32e3, "LLM provider repository not available");
320
+ }
321
+ const record = await repo.findLLMProviderById(id);
322
+ return ok({ record });
323
+ }
324
+ async handleLLMList(params) {
325
+ const { containerId } = params;
326
+ const repo = this.runtime.platform.llmProviderRepository;
327
+ if (!repo) {
328
+ return err(-32e3, "LLM provider repository not available");
329
+ }
330
+ const records = await repo.findLLMProvidersByContainerId(containerId);
331
+ return ok({ records });
332
+ }
333
+ async handleLLMUpdate(params) {
334
+ const { id, updates } = params;
335
+ const repo = this.runtime.platform.llmProviderRepository;
336
+ if (!repo) {
337
+ return err(-32e3, "LLM provider repository not available");
338
+ }
339
+ const existing = await repo.findLLMProviderById(id);
340
+ if (!existing) {
341
+ return err(404, `LLM provider not found: ${id}`);
342
+ }
343
+ const updated = {
344
+ ...existing,
345
+ ...updates,
346
+ id: existing.id,
347
+ containerId: existing.containerId,
348
+ createdAt: existing.createdAt,
349
+ updatedAt: Date.now()
350
+ };
351
+ await repo.saveLLMProvider(updated);
352
+ return ok({ record: updated });
353
+ }
354
+ async handleLLMDelete(params) {
355
+ const { id } = params;
356
+ const repo = this.runtime.platform.llmProviderRepository;
357
+ if (!repo) {
358
+ return err(-32e3, "LLM provider repository not available");
359
+ }
360
+ await repo.deleteLLMProvider(id);
361
+ return ok({ id });
362
+ }
363
+ async handleLLMDefault(params) {
364
+ const { id, containerId } = params;
365
+ const repo = this.runtime.platform.llmProviderRepository;
366
+ if (!repo) {
367
+ return err(-32e3, "LLM provider repository not available");
368
+ }
369
+ if (id) {
370
+ await repo.setDefaultLLMProvider(id);
371
+ return ok({ id });
372
+ }
373
+ if (containerId) {
374
+ const record = await repo.findDefaultLLMProvider(containerId);
375
+ return ok({ record });
376
+ }
377
+ return err(-32602, "Either id or containerId is required");
378
+ }
379
+ // ==================== Lifecycle ====================
380
+ dispose() {
381
+ logger.debug("CommandHandler disposed");
382
+ }
383
+ };
384
+
385
+ export {
386
+ CommandHandler
387
+ };
388
+ //# sourceMappingURL=chunk-JUZULVWQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CommandHandler.ts"],"sourcesContent":["/**\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 { UserContentPart } from \"@agentxjs/core/agent\";\nimport { DEFAULT_CONTAINER_ID } from \"@agentxjs/core/container\";\nimport type { RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"@deepracticex/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 // 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 // Instance\n case \"instance.get\":\n return await this.handleAgentGet(params);\n case \"instance.list\":\n return await this.handleAgentList(params);\n case \"instance.destroy\":\n return await this.handleAgentDestroy(params);\n case \"instance.destroyAll\":\n return await this.handleAgentDestroyAll(params);\n case \"instance.interrupt\":\n return await this.handleAgentInterrupt(params);\n\n // Message\n case \"message.send\":\n return await this.handleMessageSend(params);\n\n // LLM Provider\n case \"llm.create\":\n return await this.handleLLMCreate(params);\n case \"llm.get\":\n return await this.handleLLMGet(params);\n case \"llm.list\":\n return await this.handleLLMList(params);\n case \"llm.update\":\n return await this.handleLLMUpdate(params);\n case \"llm.delete\":\n return await this.handleLLMDelete(params);\n case \"llm.default\":\n return await this.handleLLMDefault(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 // ==================== Image Commands ====================\n\n private async handleImageCreate(params: unknown): Promise<RpcResponse> {\n const {\n containerId: _cid,\n name,\n description,\n contextId,\n model,\n systemPrompt,\n mcpServers,\n customData,\n } = params as {\n containerId?: string;\n name?: string;\n description?: string;\n contextId?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n\n const { imageRepository, sessionRepository } = this.runtime.platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const embody =\n model || systemPrompt || mcpServers\n ? ({ model, systemPrompt, mcpServers } as import(\"@agentxjs/core/persistence\").Embodiment)\n : undefined;\n\n const image = await createImage(\n { containerId: DEFAULT_CONTAINER_ID, name, description, contextId, embody, customData },\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.platform.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.platform.imageRepository.findImagesByContainerId(containerId)\n : await this.runtime.platform.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.platform;\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, instanceId: requestedInstanceId } = params as {\n imageId: string;\n instanceId?: 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 instanceId: existingAgent.instanceId,\n });\n return ok({\n imageId,\n instanceId: existingAgent.instanceId,\n sessionId: existingAgent.sessionId,\n containerId: existingAgent.containerId,\n reused: true,\n });\n }\n\n // Create new agent (with optional custom instanceId)\n const agent = await this.runtime.createAgent({\n imageId,\n instanceId: requestedInstanceId,\n });\n logger.info(\"Created new agent for image\", {\n imageId,\n instanceId: agent.instanceId,\n });\n\n return ok({\n imageId,\n instanceId: agent.instanceId,\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.instanceId);\n logger.info(\"Stopped agent for image\", { imageId, instanceId: agent.instanceId });\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: {\n name?: string;\n description?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n };\n\n // Get existing image\n const imageRecord = await this.runtime.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n return err(404, `Image not found: ${imageId}`);\n }\n\n // Extract embody fields from flat updates\n const { model, systemPrompt, mcpServers, ...otherUpdates } = updates;\n const embodyUpdates =\n model !== undefined || systemPrompt !== undefined || mcpServers !== undefined\n ? ({\n ...imageRecord.embody,\n model,\n systemPrompt,\n mcpServers,\n } as import(\"@agentxjs/core/persistence\").Embodiment)\n : imageRecord.embody;\n\n const updatedRecord = {\n ...imageRecord,\n ...otherUpdates,\n embody: embodyUpdates,\n updatedAt: Date.now(),\n };\n\n await this.runtime.platform.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.platform.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.platform.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 { instanceId } = params as { instanceId: string };\n const agent = this.runtime.getAgent(instanceId);\n\n return ok({\n agent: agent\n ? {\n instanceId: agent.instanceId,\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 instanceId: a.instanceId,\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 { instanceId } = params as { instanceId: string };\n\n // Check if agent exists first\n const agent = this.runtime.getAgent(instanceId);\n if (!agent) {\n return ok({ instanceId, success: false });\n }\n\n await this.runtime.destroyAgent(instanceId);\n return ok({ instanceId, 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.instanceId);\n }\n return ok({ containerId });\n }\n\n private async handleAgentInterrupt(params: unknown): Promise<RpcResponse> {\n const { instanceId } = params as { instanceId: string };\n this.runtime.interrupt(instanceId);\n return ok({ instanceId });\n }\n\n // ==================== Message Commands ====================\n\n private async handleMessageSend(params: unknown): Promise<RpcResponse> {\n const { instanceId, imageId, content } = params as {\n instanceId?: string;\n imageId?: string;\n content: string | UserContentPart[];\n };\n\n let targetInstanceId: string;\n\n if (instanceId) {\n // Direct agent reference\n targetInstanceId = instanceId;\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 targetInstanceId = existingAgent.instanceId;\n logger.debug(\"Using existing agent for message\", {\n imageId,\n instanceId: targetInstanceId,\n });\n } else {\n // Create new agent for this image\n const agent = await this.runtime.createAgent({ imageId });\n targetInstanceId = agent.instanceId;\n logger.info(\"Auto-created agent for message\", {\n imageId,\n instanceId: targetInstanceId,\n });\n }\n } else {\n return err(-32602, \"Either instanceId or imageId is required\");\n }\n\n await this.runtime.receive(targetInstanceId, content);\n return ok({ instanceId: targetInstanceId, imageId });\n }\n\n // ==================== LLM Provider Commands ====================\n\n private async handleLLMCreate(params: unknown): Promise<RpcResponse> {\n const {\n containerId: _cid,\n name,\n vendor,\n protocol,\n apiKey,\n baseUrl,\n model,\n } = params as {\n containerId?: string;\n name: string;\n vendor: string;\n protocol: string;\n apiKey: string;\n baseUrl?: string;\n model?: string;\n };\n\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n const { generateId } = await import(\"@deepracticex/id\");\n const now = Date.now();\n const record = {\n id: generateId(\"llm\"),\n containerId: DEFAULT_CONTAINER_ID,\n name,\n vendor,\n protocol: protocol as \"anthropic\" | \"openai\",\n apiKey,\n baseUrl,\n model,\n isDefault: false,\n createdAt: now,\n updatedAt: now,\n };\n\n await repo.saveLLMProvider(record);\n return ok({ record });\n }\n\n private async handleLLMGet(params: unknown): Promise<RpcResponse> {\n const { id } = params as { id: string };\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n const record = await repo.findLLMProviderById(id);\n return ok({ record });\n }\n\n private async handleLLMList(params: unknown): Promise<RpcResponse> {\n const { containerId } = params as { containerId: string };\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n const records = await repo.findLLMProvidersByContainerId(containerId);\n return ok({ records });\n }\n\n private async handleLLMUpdate(params: unknown): Promise<RpcResponse> {\n const { id, updates } = params as {\n id: string;\n updates: Record<string, unknown>;\n };\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n const existing = await repo.findLLMProviderById(id);\n if (!existing) {\n return err(404, `LLM provider not found: ${id}`);\n }\n\n const updated = {\n ...existing,\n ...updates,\n id: existing.id,\n containerId: existing.containerId,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n\n await repo.saveLLMProvider(updated);\n return ok({ record: updated });\n }\n\n private async handleLLMDelete(params: unknown): Promise<RpcResponse> {\n const { id } = params as { id: string };\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n await repo.deleteLLMProvider(id);\n return ok({ id });\n }\n\n private async handleLLMDefault(params: unknown): Promise<RpcResponse> {\n const { id, containerId } = params as { id?: string; containerId?: string };\n const repo = this.runtime.platform.llmProviderRepository;\n if (!repo) {\n return err(-32000, \"LLM provider repository not available\");\n }\n\n if (id) {\n // Set default\n await repo.setDefaultLLMProvider(id);\n return ok({ id });\n }\n if (containerId) {\n // Get default\n const record = await repo.findDefaultLLMProvider(containerId);\n return ok({ record });\n }\n return err(-32602, \"Either id or containerId is required\");\n }\n\n // ==================== Lifecycle ====================\n\n dispose(): void {\n logger.debug(\"CommandHandler disposed\");\n }\n}\n"],"mappings":"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","names":[]}