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 +44 -1
- package/dist/chunk-JUZULVWQ.js +388 -0
- package/dist/chunk-JUZULVWQ.js.map +1 -0
- package/dist/index.d.ts +59 -289
- package/dist/index.js +124 -304
- package/dist/index.js.map +1 -1
- package/dist/server-MVOHQ5ZM.js +184 -0
- package/dist/server-MVOHQ5ZM.js.map +1 -0
- package/package.json +3 -3
- package/src/AgentHandle.ts +16 -14
- package/src/CommandHandler.ts +89 -204
- package/src/LocalClient.ts +21 -51
- package/src/RemoteClient.ts +20 -45
- package/src/index.ts +12 -26
- package/src/namespaces/agents.ts +34 -28
- package/src/namespaces/images.ts +21 -29
- package/src/namespaces/llm.ts +16 -10
- package/src/namespaces/presentations.ts +7 -7
- package/src/namespaces/sessions.ts +16 -14
- package/src/presentation/Presentation.ts +11 -11
- package/src/types.ts +64 -206
- package/dist/chunk-JTHR3AK6.js +0 -652
- package/dist/chunk-JTHR3AK6.js.map +0 -1
- package/dist/server-UCQISBKH.js +0 -7
- package/dist/server-UCQISBKH.js.map +0 -1
- package/src/namespaces/containers.ts +0 -68
- package/src/namespaces/prototypes.ts +0 -136
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":[]}
|