@agentxjs/core 1.9.10-dev → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +342 -0
- package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
- package/dist/RpcClient-CMdhJxjS.d.ts +304 -0
- package/dist/agent/engine/internal/index.d.ts +22 -18
- package/dist/agent/engine/internal/index.js +1 -2
- package/dist/agent/engine/mealy/index.d.ts +4 -4
- package/dist/agent/engine/mealy/index.js +1 -2
- package/dist/agent/index.d.ts +92 -92
- package/dist/agent/index.js +16 -16
- package/dist/agent/types/index.d.ts +4 -4
- package/dist/agent/types/index.js +1 -2
- package/dist/bash/index.d.ts +29 -0
- package/dist/bash/index.js +7 -0
- package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
- package/dist/{chunk-E5FPOAPO.js → chunk-22NTRYNO.js} +60 -60
- package/dist/chunk-22NTRYNO.js.map +1 -0
- package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
- package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
- package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
- package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
- package/dist/chunk-BHOD5PKR.js +55 -0
- package/dist/chunk-BHOD5PKR.js.map +1 -0
- package/dist/chunk-FI7WQFGV.js +37 -0
- package/dist/chunk-FI7WQFGV.js.map +1 -0
- package/dist/{chunk-AT5P47YA.js → chunk-RWIYC65R.js} +115 -115
- package/dist/chunk-RWIYC65R.js.map +1 -0
- package/dist/chunk-SKS7S2RY.js +1 -0
- package/dist/{chunk-I7GYR3MN.js → chunk-TUFZ2YH6.js} +77 -91
- package/dist/chunk-TUFZ2YH6.js.map +1 -0
- package/dist/{chunk-K6WXQ2RW.js → chunk-YSZG6XIM.js} +1 -2
- package/dist/chunk-YSZG6XIM.js.map +1 -0
- package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
- package/dist/common/logger/index.js +14 -16
- package/dist/common/logger/index.js.map +1 -1
- package/dist/container/index.d.ts +3 -4
- package/dist/container/index.js +0 -2
- package/dist/container/index.js.map +1 -1
- package/dist/driver/index.d.ts +2 -310
- package/dist/event/index.d.ts +4 -4
- package/dist/event/index.js +2 -3
- package/dist/event/types/index.d.ts +202 -208
- package/dist/event/types/index.js +1 -2
- package/dist/{event-CDuTzs__.d.ts → event-DNsF9EkO.d.ts} +5 -8
- package/dist/image/index.d.ts +9 -5
- package/dist/image/index.js +5 -2
- package/dist/image/index.js.map +1 -1
- package/dist/index--gxNpY5W.d.ts +609 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +17 -17
- package/dist/{message-BMrMm1pq.d.ts → message-Dn-I2vr0.d.ts} +10 -33
- package/dist/mq/index.d.ts +25 -25
- package/dist/mq/index.js +1 -3
- package/dist/mq/index.js.map +1 -1
- package/dist/network/index.d.ts +59 -347
- package/dist/network/index.js +30 -41
- package/dist/network/index.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -155
- package/dist/platform/index.d.ts +76 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/runtime/index.d.ts +26 -59
- package/dist/runtime/index.js +117 -33
- package/dist/runtime/index.js.map +1 -1
- package/dist/session/index.d.ts +4 -52
- package/dist/session/index.js +4 -51
- package/dist/session/index.js.map +1 -1
- package/dist/types-Cb8tKM6Y.d.ts +90 -0
- package/package.json +10 -5
- package/src/agent/AgentStateMachine.ts +2 -2
- package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
- package/src/agent/__tests__/createAgent.test.ts +4 -4
- package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +301 -97
- package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
- package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +59 -78
- package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
- package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
- package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
- package/src/agent/createAgent.ts +15 -15
- package/src/agent/engine/AgentProcessor.ts +7 -7
- package/src/agent/engine/MealyMachine.ts +4 -4
- package/src/agent/engine/internal/index.ts +11 -11
- package/src/agent/engine/internal/messageAssemblerProcessor.ts +113 -128
- package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
- package/src/agent/engine/internal/turnTrackerProcessor.ts +27 -31
- package/src/agent/engine/mealy/Mealy.ts +2 -2
- package/src/agent/engine/mealy/combinators.ts +10 -10
- package/src/agent/engine/mealy/index.ts +9 -11
- package/src/agent/index.ts +30 -32
- package/src/agent/types/engine.ts +3 -3
- package/src/agent/types/event.ts +4 -12
- package/src/agent/types/index.ts +86 -88
- package/src/agent/types/message.ts +9 -43
- package/src/bash/index.ts +21 -0
- package/src/bash/tool.ts +57 -0
- package/src/bash/types.ts +108 -0
- package/src/common/logger/ConsoleLogger.ts +1 -1
- package/src/common/logger/LoggerFactoryImpl.ts +14 -14
- package/src/common/logger/index.ts +3 -3
- package/src/container/index.ts +4 -5
- package/src/container/types.ts +1 -1
- package/src/driver/index.ts +15 -16
- package/src/driver/types.ts +201 -73
- package/src/event/EventBus.ts +10 -10
- package/src/event/__tests__/EventBus.test.ts +2 -2
- package/src/event/index.ts +2 -3
- package/src/event/types/agent.ts +186 -191
- package/src/event/types/bus.ts +1 -1
- package/src/event/types/command.ts +293 -264
- package/src/event/types/container.ts +207 -222
- package/src/event/types/driver.ts +153 -155
- package/src/event/types/index.ts +6 -12
- package/src/event/types/session.ts +117 -130
- package/src/image/Image.ts +12 -2
- package/src/image/index.ts +4 -5
- package/src/image/types.ts +8 -2
- package/src/mq/OffsetGenerator.ts +1 -1
- package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
- package/src/mq/index.ts +4 -5
- package/src/network/RpcClient.ts +26 -25
- package/src/network/index.ts +41 -44
- package/src/network/jsonrpc.ts +5 -5
- package/src/persistence/index.ts +5 -5
- package/src/persistence/types.ts +5 -2
- package/src/platform/index.ts +21 -0
- package/src/platform/types.ts +84 -0
- package/src/runtime/AgentXRuntime.ts +188 -61
- package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
- package/src/runtime/index.ts +12 -25
- package/src/runtime/types.ts +10 -62
- package/src/session/index.ts +2 -3
- package/dist/chunk-7D4SUZUM.js +0 -38
- package/dist/chunk-AT5P47YA.js.map +0 -1
- package/dist/chunk-E5FPOAPO.js.map +0 -1
- package/dist/chunk-I7GYR3MN.js.map +0 -1
- package/dist/chunk-K6WXQ2RW.js.map +0 -1
- package/dist/workspace/index.d.ts +0 -111
- package/dist/wrapper-Y3UTVU2E.js +0 -3635
- package/dist/wrapper-Y3UTVU2E.js.map +0 -1
- package/src/workspace/index.ts +0 -27
- package/src/workspace/types.ts +0 -131
- /package/dist/{workspace → bash}/index.js.map +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
- /package/dist/{workspace → platform}/index.js +0 -0
package/dist/runtime/index.js
CHANGED
|
@@ -1,15 +1,30 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
createSession
|
|
3
|
+
} from "../chunk-BHOD5PKR.js";
|
|
4
|
+
import {
|
|
5
|
+
createAgent
|
|
6
|
+
} from "../chunk-RWIYC65R.js";
|
|
7
|
+
import "../chunk-TUFZ2YH6.js";
|
|
8
|
+
import "../chunk-APCBNCOW.js";
|
|
9
|
+
import "../chunk-YSZG6XIM.js";
|
|
10
|
+
import {
|
|
11
|
+
createBashTool
|
|
12
|
+
} from "../chunk-FI7WQFGV.js";
|
|
13
|
+
import "../chunk-AAFPAF67.js";
|
|
14
|
+
import "../chunk-22NTRYNO.js";
|
|
2
15
|
|
|
3
16
|
// src/runtime/AgentXRuntime.ts
|
|
4
17
|
import { createLogger } from "commonxjs/logger";
|
|
5
18
|
var logger = createLogger("runtime/AgentXRuntime");
|
|
6
19
|
var AgentXRuntimeImpl = class {
|
|
7
|
-
|
|
20
|
+
platform;
|
|
21
|
+
createDriver;
|
|
8
22
|
agents = /* @__PURE__ */ new Map();
|
|
9
23
|
globalSubscriptions = /* @__PURE__ */ new Set();
|
|
10
24
|
isShutdown = false;
|
|
11
|
-
constructor(
|
|
12
|
-
this.
|
|
25
|
+
constructor(platform, createDriver) {
|
|
26
|
+
this.platform = platform;
|
|
27
|
+
this.createDriver = createDriver;
|
|
13
28
|
logger.info("AgentXRuntime initialized");
|
|
14
29
|
}
|
|
15
30
|
// ==================== Agent Lifecycle ====================
|
|
@@ -18,36 +33,85 @@ var AgentXRuntimeImpl = class {
|
|
|
18
33
|
throw new Error("Runtime is shutdown");
|
|
19
34
|
}
|
|
20
35
|
const { imageId } = options;
|
|
21
|
-
const imageRecord = await this.
|
|
36
|
+
const imageRecord = await this.platform.imageRepository.findImageById(imageId);
|
|
22
37
|
if (!imageRecord) {
|
|
23
38
|
throw new Error(`Image not found: ${imageId}`);
|
|
24
39
|
}
|
|
25
40
|
const agentId = options.agentId ?? this.generateAgentId();
|
|
26
|
-
const containerExists = await this.
|
|
41
|
+
const containerExists = await this.platform.containerRepository.containerExists(
|
|
27
42
|
imageRecord.containerId
|
|
28
43
|
);
|
|
29
44
|
if (!containerExists) {
|
|
30
45
|
throw new Error(`Container not found: ${imageRecord.containerId}`);
|
|
31
46
|
}
|
|
32
|
-
const
|
|
47
|
+
const session = createSession({
|
|
48
|
+
sessionId: imageRecord.sessionId,
|
|
49
|
+
imageId,
|
|
33
50
|
containerId: imageRecord.containerId,
|
|
34
|
-
|
|
51
|
+
repository: this.platform.sessionRepository
|
|
35
52
|
});
|
|
36
|
-
|
|
53
|
+
const defaultTools = [];
|
|
54
|
+
if (this.platform.bashProvider) {
|
|
55
|
+
defaultTools.push(createBashTool(this.platform.bashProvider));
|
|
56
|
+
}
|
|
37
57
|
const driverConfig = {
|
|
38
|
-
apiKey:
|
|
39
|
-
baseUrl: process.env.ANTHROPIC_BASE_URL,
|
|
58
|
+
apiKey: "",
|
|
40
59
|
agentId,
|
|
41
60
|
systemPrompt: imageRecord.systemPrompt,
|
|
42
|
-
cwd: workspace.path,
|
|
43
61
|
mcpServers: imageRecord.mcpServers,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
62
|
+
tools: defaultTools.length > 0 ? defaultTools : void 0,
|
|
63
|
+
session,
|
|
64
|
+
// Inject Session for stateless drivers
|
|
65
|
+
resumeSessionId: imageRecord.metadata?.driverSessionId,
|
|
66
|
+
onSessionIdCaptured: async (driverSessionId) => {
|
|
67
|
+
await this.platform.imageRepository.updateMetadata(imageId, { driverSessionId });
|
|
47
68
|
}
|
|
48
69
|
};
|
|
49
|
-
const driver = this.
|
|
70
|
+
const driver = this.createDriver(driverConfig);
|
|
50
71
|
await driver.initialize();
|
|
72
|
+
const noopSource = {
|
|
73
|
+
name: "RuntimeSource",
|
|
74
|
+
connect: () => {
|
|
75
|
+
},
|
|
76
|
+
disconnect: () => {
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const sessionId = imageRecord.sessionId;
|
|
80
|
+
const sessionRepository = this.platform.sessionRepository;
|
|
81
|
+
const eventBus = this.platform.eventBus;
|
|
82
|
+
const runtimePresenter = {
|
|
83
|
+
name: "RuntimePresenter",
|
|
84
|
+
present: (_agentId, output) => {
|
|
85
|
+
const category = categorizeAgentOutput(output.type);
|
|
86
|
+
if (category === "stream") return;
|
|
87
|
+
eventBus.emit({
|
|
88
|
+
type: output.type,
|
|
89
|
+
timestamp: output.timestamp,
|
|
90
|
+
source: "agent",
|
|
91
|
+
category,
|
|
92
|
+
intent: "notification",
|
|
93
|
+
data: output.data,
|
|
94
|
+
context: {
|
|
95
|
+
agentId,
|
|
96
|
+
imageId,
|
|
97
|
+
containerId: imageRecord.containerId,
|
|
98
|
+
sessionId
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (category === "message" && output.type !== "user_message") {
|
|
102
|
+
const message = output.data;
|
|
103
|
+
sessionRepository.addMessage(sessionId, message).catch((err) => {
|
|
104
|
+
logger.error("Failed to persist message", { type: output.type, error: err });
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const engine = createAgent({
|
|
110
|
+
agentId,
|
|
111
|
+
bus: this.platform.eventBus,
|
|
112
|
+
source: noopSource,
|
|
113
|
+
presenter: runtimePresenter
|
|
114
|
+
});
|
|
51
115
|
const agent = {
|
|
52
116
|
agentId,
|
|
53
117
|
imageId,
|
|
@@ -62,10 +126,11 @@ var AgentXRuntimeImpl = class {
|
|
|
62
126
|
lifecycle: "running",
|
|
63
127
|
subscriptions: /* @__PURE__ */ new Set(),
|
|
64
128
|
driver,
|
|
129
|
+
engine,
|
|
65
130
|
isReceiving: false
|
|
66
131
|
};
|
|
67
132
|
this.agents.set(agentId, state);
|
|
68
|
-
this.
|
|
133
|
+
this.platform.eventBus.emit({
|
|
69
134
|
type: "agent_created",
|
|
70
135
|
timestamp: Date.now(),
|
|
71
136
|
source: "runtime",
|
|
@@ -109,7 +174,7 @@ var AgentXRuntimeImpl = class {
|
|
|
109
174
|
throw new Error(`Agent already destroyed: ${agentId}`);
|
|
110
175
|
}
|
|
111
176
|
state.lifecycle = "stopped";
|
|
112
|
-
this.
|
|
177
|
+
this.platform.eventBus.emit({
|
|
113
178
|
type: "agent_stopped",
|
|
114
179
|
timestamp: Date.now(),
|
|
115
180
|
source: "runtime",
|
|
@@ -134,7 +199,7 @@ var AgentXRuntimeImpl = class {
|
|
|
134
199
|
throw new Error(`Cannot resume destroyed agent: ${agentId}`);
|
|
135
200
|
}
|
|
136
201
|
state.lifecycle = "running";
|
|
137
|
-
this.
|
|
202
|
+
this.platform.eventBus.emit({
|
|
138
203
|
type: "agent_resumed",
|
|
139
204
|
timestamp: Date.now(),
|
|
140
205
|
source: "runtime",
|
|
@@ -156,12 +221,13 @@ var AgentXRuntimeImpl = class {
|
|
|
156
221
|
throw new Error(`Agent not found: ${agentId}`);
|
|
157
222
|
}
|
|
158
223
|
await state.driver.dispose();
|
|
224
|
+
await state.engine.destroy();
|
|
159
225
|
for (const unsub of state.subscriptions) {
|
|
160
226
|
unsub();
|
|
161
227
|
}
|
|
162
228
|
state.subscriptions.clear();
|
|
163
229
|
state.lifecycle = "destroyed";
|
|
164
|
-
this.
|
|
230
|
+
this.platform.eventBus.emit({
|
|
165
231
|
type: "agent_destroyed",
|
|
166
232
|
timestamp: Date.now(),
|
|
167
233
|
source: "runtime",
|
|
@@ -198,12 +264,12 @@ var AgentXRuntimeImpl = class {
|
|
|
198
264
|
content,
|
|
199
265
|
timestamp: Date.now()
|
|
200
266
|
};
|
|
201
|
-
await this.
|
|
267
|
+
await this.platform.sessionRepository.addMessage(state.agent.sessionId, userMessage);
|
|
202
268
|
this.emitEvent(state, "user_message", userMessage, actualRequestId);
|
|
203
269
|
logger.debug("User message sent", {
|
|
204
270
|
agentId,
|
|
205
271
|
requestId: actualRequestId,
|
|
206
|
-
contentPreview: typeof content === "string" ? content.substring(0, 50) : `[${content.length} parts]`
|
|
272
|
+
contentPreview: typeof content === "string" ? content.substring(0, 50) : Array.isArray(content) ? `[${content.length} parts]` : `[${typeof content}]`
|
|
207
273
|
});
|
|
208
274
|
state.isReceiving = true;
|
|
209
275
|
try {
|
|
@@ -231,12 +297,7 @@ var AgentXRuntimeImpl = class {
|
|
|
231
297
|
throw new Error(`Agent not found: ${agentId}`);
|
|
232
298
|
}
|
|
233
299
|
state.driver.interrupt();
|
|
234
|
-
this.emitEvent(
|
|
235
|
-
state,
|
|
236
|
-
"interrupt",
|
|
237
|
-
{ agentId },
|
|
238
|
-
requestId ?? this.generateRequestId()
|
|
239
|
-
);
|
|
300
|
+
this.emitEvent(state, "interrupt", { agentId }, requestId ?? this.generateRequestId());
|
|
240
301
|
logger.debug("Interrupt sent", { agentId, requestId });
|
|
241
302
|
}
|
|
242
303
|
// ==================== Event Subscription ====================
|
|
@@ -245,7 +306,7 @@ var AgentXRuntimeImpl = class {
|
|
|
245
306
|
if (!state) {
|
|
246
307
|
throw new Error(`Agent not found: ${agentId}`);
|
|
247
308
|
}
|
|
248
|
-
const unsub = this.
|
|
309
|
+
const unsub = this.platform.eventBus.onAny((event) => {
|
|
249
310
|
const context = event.context;
|
|
250
311
|
if (context?.agentId === agentId) {
|
|
251
312
|
handler(event);
|
|
@@ -260,7 +321,7 @@ var AgentXRuntimeImpl = class {
|
|
|
260
321
|
};
|
|
261
322
|
}
|
|
262
323
|
subscribeAll(handler) {
|
|
263
|
-
const unsub = this.
|
|
324
|
+
const unsub = this.platform.eventBus.onAny(handler);
|
|
264
325
|
this.globalSubscriptions.add(unsub);
|
|
265
326
|
return {
|
|
266
327
|
unsubscribe: () => {
|
|
@@ -290,12 +351,14 @@ var AgentXRuntimeImpl = class {
|
|
|
290
351
|
*/
|
|
291
352
|
handleDriverEvent(state, event, requestId) {
|
|
292
353
|
this.emitEvent(state, event.type, event.data, requestId);
|
|
354
|
+
const streamEvent = toStreamEvent(event);
|
|
355
|
+
state.engine.handleStreamEvent(streamEvent);
|
|
293
356
|
}
|
|
294
357
|
/**
|
|
295
358
|
* Emit an event to the EventBus
|
|
296
359
|
*/
|
|
297
360
|
emitEvent(state, type, data, requestId) {
|
|
298
|
-
this.
|
|
361
|
+
this.platform.eventBus.emit({
|
|
299
362
|
type,
|
|
300
363
|
timestamp: Date.now(),
|
|
301
364
|
source: "runtime",
|
|
@@ -337,8 +400,29 @@ var AgentXRuntimeImpl = class {
|
|
|
337
400
|
return `msg_${timestamp}_${random}`;
|
|
338
401
|
}
|
|
339
402
|
};
|
|
340
|
-
function
|
|
341
|
-
|
|
403
|
+
function toStreamEvent(event) {
|
|
404
|
+
const type = event.type === "error" ? "error_received" : event.type;
|
|
405
|
+
return { type, data: event.data, timestamp: Date.now() };
|
|
406
|
+
}
|
|
407
|
+
function categorizeAgentOutput(type) {
|
|
408
|
+
const streamTypes = [
|
|
409
|
+
"message_start",
|
|
410
|
+
"message_delta",
|
|
411
|
+
"message_stop",
|
|
412
|
+
"text_delta",
|
|
413
|
+
"tool_use_start",
|
|
414
|
+
"input_json_delta",
|
|
415
|
+
"tool_use_stop",
|
|
416
|
+
"tool_result",
|
|
417
|
+
"error_received"
|
|
418
|
+
];
|
|
419
|
+
if (streamTypes.includes(type)) return "stream";
|
|
420
|
+
if (type.endsWith("_message")) return "message";
|
|
421
|
+
if (type.startsWith("turn_")) return "turn";
|
|
422
|
+
return "state";
|
|
423
|
+
}
|
|
424
|
+
function createAgentXRuntime(platform, createDriver) {
|
|
425
|
+
return new AgentXRuntimeImpl(platform, createDriver);
|
|
342
426
|
}
|
|
343
427
|
export {
|
|
344
428
|
AgentXRuntimeImpl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/AgentXRuntime.ts"],"sourcesContent":["/**\n * AgentXRuntimeImpl - Runtime integration implementation\n *\n * Integrates all components to provide agent lifecycle management.\n * Uses Provider dependencies to coordinate Session, Image, Container, etc.\n *\n * New Design:\n * - Driver.receive() returns AsyncIterable<DriverStreamEvent>\n * - Runtime processes events and emits to EventBus\n * - No more EventBus-based communication with Driver\n */\n\nimport { createLogger } from \"commonxjs/logger\";\nimport type {\n AgentXProvider,\n AgentXRuntime,\n RuntimeAgent,\n CreateAgentOptions,\n AgentEventHandler,\n Subscription,\n AgentLifecycle,\n} from \"./types\";\nimport type { UserContentPart, UserMessage } from \"../agent/types\";\nimport type { BusEvent } from \"../event/types\";\nimport type { Driver, DriverConfig, DriverStreamEvent } from \"../driver/types\";\n\nconst logger = createLogger(\"runtime/AgentXRuntime\");\n\n/**\n * Internal agent state\n */\ninterface AgentState {\n agent: RuntimeAgent;\n lifecycle: AgentLifecycle;\n subscriptions: Set<() => void>;\n driver: Driver;\n /** Flag to track if a receive operation is in progress */\n isReceiving: boolean;\n}\n\n/**\n * AgentXRuntimeImpl - Runtime implementation\n */\nexport class AgentXRuntimeImpl implements AgentXRuntime {\n readonly provider: AgentXProvider;\n\n private agents = new Map<string, AgentState>();\n private globalSubscriptions = new Set<() => void>();\n private isShutdown = false;\n\n constructor(provider: AgentXProvider) {\n this.provider = provider;\n logger.info(\"AgentXRuntime initialized\");\n }\n\n // ==================== Agent Lifecycle ====================\n\n async createAgent(options: CreateAgentOptions): Promise<RuntimeAgent> {\n if (this.isShutdown) {\n throw new Error(\"Runtime is shutdown\");\n }\n\n const { imageId } = options;\n\n // Load image\n const imageRecord = await this.provider.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Generate agent ID\n const agentId = options.agentId ?? this.generateAgentId();\n\n // Ensure container exists\n const containerExists = await this.provider.containerRepository.containerExists(\n imageRecord.containerId\n );\n if (!containerExists) {\n throw new Error(`Container not found: ${imageRecord.containerId}`);\n }\n\n // Create workspace\n const workspace = await this.provider.workspaceProvider.create({\n containerId: imageRecord.containerId,\n imageId,\n });\n await workspace.initialize();\n\n // Create driver config\n const driverConfig: DriverConfig = {\n apiKey: process.env.ANTHROPIC_API_KEY ?? \"\",\n baseUrl: process.env.ANTHROPIC_BASE_URL,\n agentId,\n systemPrompt: imageRecord.systemPrompt,\n cwd: workspace.path,\n mcpServers: imageRecord.mcpServers,\n resumeSessionId: imageRecord.metadata?.claudeSdkSessionId as string | undefined,\n onSessionIdCaptured: async (claudeSdkSessionId: string) => {\n // Persist SDK session ID for resume\n await this.provider.imageRepository.updateMetadata(imageId, { claudeSdkSessionId });\n },\n };\n\n // Create driver using the new CreateDriver function\n const driver = this.provider.createDriver(driverConfig);\n\n // Initialize driver\n await driver.initialize();\n\n // Create runtime agent\n const agent: RuntimeAgent = {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n name: imageRecord.name,\n lifecycle: \"running\",\n createdAt: Date.now(),\n };\n\n // Store agent state with driver\n const state: AgentState = {\n agent,\n lifecycle: \"running\",\n subscriptions: new Set(),\n driver,\n isReceiving: false,\n };\n this.agents.set(agentId, state);\n\n // Emit agent_created event\n this.provider.eventBus.emit({\n type: \"agent_created\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n },\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent created\", {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n });\n\n return agent;\n }\n\n getAgent(agentId: string): RuntimeAgent | undefined {\n const state = this.agents.get(agentId);\n return state?.agent;\n }\n\n getAgents(): RuntimeAgent[] {\n return Array.from(this.agents.values()).map((s) => s.agent);\n }\n\n getAgentsByContainer(containerId: string): RuntimeAgent[] {\n return Array.from(this.agents.values())\n .filter((s) => s.agent.containerId === containerId)\n .map((s) => s.agent);\n }\n\n async stopAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Agent already destroyed: ${agentId}`);\n }\n\n state.lifecycle = \"stopped\";\n\n // Emit agent_stopped event\n this.provider.eventBus.emit({\n type: \"agent_stopped\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent stopped\", { agentId });\n }\n\n async resumeAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Cannot resume destroyed agent: ${agentId}`);\n }\n\n state.lifecycle = \"running\";\n\n // Emit agent_resumed event\n this.provider.eventBus.emit({\n type: \"agent_resumed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent resumed\", { agentId });\n }\n\n async destroyAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Dispose driver (new interface, no disconnect needed)\n await state.driver.dispose();\n\n // Cleanup subscriptions\n for (const unsub of state.subscriptions) {\n unsub();\n }\n state.subscriptions.clear();\n\n state.lifecycle = \"destroyed\";\n\n // Emit agent_destroyed event\n this.provider.eventBus.emit({\n type: \"agent_destroyed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n // Remove from map\n this.agents.delete(agentId);\n\n logger.info(\"Agent destroyed\", { agentId });\n }\n\n // ==================== Message Handling ====================\n\n async receive(\n agentId: string,\n content: string | UserContentPart[],\n requestId?: string\n ): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);\n }\n\n if (state.isReceiving) {\n throw new Error(`Agent ${agentId} is already processing a message`);\n }\n\n const actualRequestId = requestId ?? this.generateRequestId();\n\n // Build user message\n const userMessage: UserMessage = {\n id: this.generateMessageId(),\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // Persist to session\n await this.provider.sessionRepository.addMessage(state.agent.sessionId, userMessage);\n\n // Emit user_message event (for external subscribers)\n this.emitEvent(state, \"user_message\", userMessage, actualRequestId);\n\n logger.debug(\"User message sent\", {\n agentId,\n requestId: actualRequestId,\n contentPreview:\n typeof content === \"string\" ? content.substring(0, 50) : `[${content.length} parts]`,\n });\n\n // Mark as receiving\n state.isReceiving = true;\n\n try {\n // Call driver.receive() and process the AsyncIterable\n for await (const event of state.driver.receive(userMessage)) {\n // Convert DriverStreamEvent to BusEvent and emit\n this.handleDriverEvent(state, event, actualRequestId);\n }\n } catch (error) {\n // Emit error event\n this.emitEvent(\n state,\n \"error_received\",\n {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n },\n actualRequestId\n );\n throw error;\n } finally {\n state.isReceiving = false;\n }\n }\n\n interrupt(agentId: string, requestId?: string): void {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Call driver.interrupt() directly\n state.driver.interrupt();\n\n // Emit interrupt event (for external subscribers)\n this.emitEvent(\n state,\n \"interrupt\",\n { agentId },\n requestId ?? this.generateRequestId()\n );\n\n logger.debug(\"Interrupt sent\", { agentId, requestId });\n }\n\n // ==================== Event Subscription ====================\n\n subscribe(agentId: string, handler: AgentEventHandler): Subscription {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n const unsub = this.provider.eventBus.onAny((event) => {\n const context = (event as BusEvent & { context?: { agentId?: string } }).context;\n if (context?.agentId === agentId) {\n handler(event);\n }\n });\n\n state.subscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n state.subscriptions.delete(unsub);\n },\n };\n }\n\n subscribeAll(handler: AgentEventHandler): Subscription {\n const unsub = this.provider.eventBus.onAny(handler);\n this.globalSubscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n this.globalSubscriptions.delete(unsub);\n },\n };\n }\n\n // ==================== Cleanup ====================\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n\n logger.info(\"Shutting down AgentXRuntime...\");\n\n // Destroy all agents\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n\n // Cleanup global subscriptions\n for (const unsub of this.globalSubscriptions) {\n unsub();\n }\n this.globalSubscriptions.clear();\n\n this.isShutdown = true;\n logger.info(\"AgentXRuntime shutdown complete\");\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Handle a single DriverStreamEvent\n */\n private handleDriverEvent(\n state: AgentState,\n event: DriverStreamEvent,\n requestId: string\n ): void {\n // Map DriverStreamEvent to BusEvent and emit\n this.emitEvent(state, event.type, event.data, requestId);\n }\n\n /**\n * Emit an event to the EventBus\n */\n private emitEvent(\n state: AgentState,\n type: string,\n data: unknown,\n requestId: string\n ): void {\n this.provider.eventBus.emit({\n type,\n timestamp: Date.now(),\n source: \"runtime\",\n category: this.categorizeEvent(type),\n intent: \"notification\",\n requestId,\n data,\n context: {\n agentId: state.agent.agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n }\n\n /**\n * Categorize event type\n */\n private categorizeEvent(type: string): string {\n if (type.includes(\"message\")) return \"message\";\n if (type.includes(\"tool\")) return \"tool\";\n if (type.includes(\"error\") || type.includes(\"interrupted\")) return \"error\";\n if (type.includes(\"delta\")) return \"stream\";\n return \"stream\";\n }\n\n private generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `agent_${timestamp}_${random}`;\n }\n\n private generateRequestId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `req_${timestamp}_${random}`;\n }\n\n private generateMessageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `msg_${timestamp}_${random}`;\n }\n}\n\n/**\n * Create an AgentXRuntime instance\n */\nexport function createAgentXRuntime(provider: AgentXProvider): AgentXRuntime {\n return new AgentXRuntimeImpl(provider);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/AgentXRuntime.ts"],"sourcesContent":["/**\n * AgentXRuntimeImpl - Runtime integration implementation\n *\n * Integrates all components to provide agent lifecycle management.\n * Uses Platform dependencies to coordinate Session, Image, Container, etc.\n *\n * Architecture:\n * - Driver.receive() returns AsyncIterable<DriverStreamEvent>\n * - Runtime emits raw stream events to EventBus\n * - Runtime pushes events through AgentEngine (MealyMachine → Presenter)\n * - Presenter emits message/state/turn events and persists messages\n */\n\nimport { createLogger } from \"commonxjs/logger\";\nimport { createAgent as createAgentEngine } from \"../agent/createAgent\";\nimport type {\n AgentEngine,\n AgentOutput,\n AgentPresenter,\n AgentSource,\n Message,\n StreamEvent,\n UserContentPart,\n UserMessage,\n} from \"../agent/types\";\nimport { createBashTool } from \"../bash/tool\";\nimport type {\n CreateDriver,\n Driver,\n DriverConfig,\n DriverStreamEvent,\n ToolDefinition,\n} from \"../driver/types\";\nimport type { BusEvent } from \"../event/types\";\nimport { createSession } from \"../session/Session\";\nimport type {\n AgentEventHandler,\n AgentLifecycle,\n AgentXPlatform,\n AgentXRuntime,\n CreateAgentOptions,\n RuntimeAgent,\n Subscription,\n} from \"./types\";\n\nconst logger = createLogger(\"runtime/AgentXRuntime\");\n\n/**\n * Internal agent state\n */\ninterface AgentState {\n agent: RuntimeAgent;\n lifecycle: AgentLifecycle;\n subscriptions: Set<() => void>;\n driver: Driver;\n engine: AgentEngine;\n /** Flag to track if a receive operation is in progress */\n isReceiving: boolean;\n}\n\n/**\n * AgentXRuntimeImpl - Runtime implementation\n */\nexport class AgentXRuntimeImpl implements AgentXRuntime {\n readonly platform: AgentXPlatform;\n private readonly createDriver: CreateDriver;\n\n private agents = new Map<string, AgentState>();\n private globalSubscriptions = new Set<() => void>();\n private isShutdown = false;\n\n constructor(platform: AgentXPlatform, createDriver: CreateDriver) {\n this.platform = platform;\n this.createDriver = createDriver;\n logger.info(\"AgentXRuntime initialized\");\n }\n\n // ==================== Agent Lifecycle ====================\n\n async createAgent(options: CreateAgentOptions): Promise<RuntimeAgent> {\n if (this.isShutdown) {\n throw new Error(\"Runtime is shutdown\");\n }\n\n const { imageId } = options;\n\n // Load image\n const imageRecord = await this.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Generate agent ID\n const agentId = options.agentId ?? this.generateAgentId();\n\n // Ensure container exists\n const containerExists = await this.platform.containerRepository.containerExists(\n imageRecord.containerId\n );\n if (!containerExists) {\n throw new Error(`Container not found: ${imageRecord.containerId}`);\n }\n\n // Create Session for driver (MonoDriver needs this to read history)\n const session = createSession({\n sessionId: imageRecord.sessionId,\n imageId,\n containerId: imageRecord.containerId,\n repository: this.platform.sessionRepository,\n });\n\n // Assemble platform-provided default tools\n const defaultTools: ToolDefinition[] = [];\n if (this.platform.bashProvider) {\n defaultTools.push(createBashTool(this.platform.bashProvider));\n }\n\n // Create driver config (apiKey/baseUrl are provided by the createDriver closure)\n const driverConfig: DriverConfig = {\n apiKey: \"\",\n agentId,\n systemPrompt: imageRecord.systemPrompt,\n mcpServers: imageRecord.mcpServers,\n tools: defaultTools.length > 0 ? defaultTools : undefined,\n session, // Inject Session for stateless drivers\n resumeSessionId: imageRecord.metadata?.driverSessionId as string | undefined,\n onSessionIdCaptured: async (driverSessionId: string) => {\n // Persist driver session ID for resume\n await this.platform.imageRepository.updateMetadata(imageId, { driverSessionId });\n },\n };\n\n // Create driver using the injected CreateDriver function\n const driver = this.createDriver(driverConfig);\n\n // Initialize driver\n await driver.initialize();\n\n // Create AgentEngine with custom Source and Presenter\n // Source: no-op (Runtime pushes events directly via handleStreamEvent)\n // Presenter: emits message/state/turn events to EventBus + persists messages\n const noopSource: AgentSource = {\n name: \"RuntimeSource\",\n connect: () => {},\n disconnect: () => {},\n };\n\n const sessionId = imageRecord.sessionId;\n const sessionRepository = this.platform.sessionRepository;\n const eventBus = this.platform.eventBus;\n\n const runtimePresenter: AgentPresenter = {\n name: \"RuntimePresenter\",\n present: (_agentId: string, output: AgentOutput) => {\n const category = categorizeAgentOutput(output.type);\n\n // Skip stream events — already emitted by handleDriverEvent\n if (category === \"stream\") return;\n\n // Emit state/message/turn events to EventBus\n eventBus.emit({\n type: output.type,\n timestamp: output.timestamp,\n source: \"agent\",\n category,\n intent: \"notification\",\n data: output.data,\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId,\n },\n } as BusEvent);\n\n // Persist message events to SessionRepository\n if (category === \"message\" && output.type !== \"user_message\") {\n const message = output.data as Message;\n sessionRepository.addMessage(sessionId, message).catch((err) => {\n logger.error(\"Failed to persist message\", { type: output.type, error: err });\n });\n }\n },\n };\n\n const engine = createAgentEngine({\n agentId,\n bus: this.platform.eventBus,\n source: noopSource,\n presenter: runtimePresenter,\n });\n\n // Create runtime agent\n const agent: RuntimeAgent = {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n name: imageRecord.name,\n lifecycle: \"running\",\n createdAt: Date.now(),\n };\n\n // Store agent state with driver and engine\n const state: AgentState = {\n agent,\n lifecycle: \"running\",\n subscriptions: new Set(),\n driver,\n engine,\n isReceiving: false,\n };\n this.agents.set(agentId, state);\n\n // Emit agent_created event\n this.platform.eventBus.emit({\n type: \"agent_created\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n },\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent created\", {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n });\n\n return agent;\n }\n\n getAgent(agentId: string): RuntimeAgent | undefined {\n const state = this.agents.get(agentId);\n return state?.agent;\n }\n\n getAgents(): RuntimeAgent[] {\n return Array.from(this.agents.values()).map((s) => s.agent);\n }\n\n getAgentsByContainer(containerId: string): RuntimeAgent[] {\n return Array.from(this.agents.values())\n .filter((s) => s.agent.containerId === containerId)\n .map((s) => s.agent);\n }\n\n async stopAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Agent already destroyed: ${agentId}`);\n }\n\n state.lifecycle = \"stopped\";\n\n // Emit agent_stopped event\n this.platform.eventBus.emit({\n type: \"agent_stopped\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent stopped\", { agentId });\n }\n\n async resumeAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Cannot resume destroyed agent: ${agentId}`);\n }\n\n state.lifecycle = \"running\";\n\n // Emit agent_resumed event\n this.platform.eventBus.emit({\n type: \"agent_resumed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent resumed\", { agentId });\n }\n\n async destroyAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Dispose driver and engine\n await state.driver.dispose();\n await state.engine.destroy();\n\n // Cleanup subscriptions\n for (const unsub of state.subscriptions) {\n unsub();\n }\n state.subscriptions.clear();\n\n state.lifecycle = \"destroyed\";\n\n // Emit agent_destroyed event\n this.platform.eventBus.emit({\n type: \"agent_destroyed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n // Remove from map\n this.agents.delete(agentId);\n\n logger.info(\"Agent destroyed\", { agentId });\n }\n\n // ==================== Message Handling ====================\n\n async receive(\n agentId: string,\n content: string | UserContentPart[],\n requestId?: string\n ): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);\n }\n\n if (state.isReceiving) {\n throw new Error(`Agent ${agentId} is already processing a message`);\n }\n\n const actualRequestId = requestId ?? this.generateRequestId();\n\n // Build user message\n const userMessage: UserMessage = {\n id: this.generateMessageId(),\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // Persist to session\n await this.platform.sessionRepository.addMessage(state.agent.sessionId, userMessage);\n\n // Emit user_message event (for external subscribers)\n this.emitEvent(state, \"user_message\", userMessage, actualRequestId);\n\n logger.debug(\"User message sent\", {\n agentId,\n requestId: actualRequestId,\n contentPreview:\n typeof content === \"string\"\n ? content.substring(0, 50)\n : Array.isArray(content)\n ? `[${content.length} parts]`\n : `[${typeof content}]`,\n });\n\n // Mark as receiving\n state.isReceiving = true;\n\n try {\n // Call driver.receive() and process the AsyncIterable\n for await (const event of state.driver.receive(userMessage)) {\n // Convert DriverStreamEvent to BusEvent and emit\n this.handleDriverEvent(state, event, actualRequestId);\n }\n } catch (error) {\n // Emit error event\n this.emitEvent(\n state,\n \"error_received\",\n {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n },\n actualRequestId\n );\n throw error;\n } finally {\n state.isReceiving = false;\n }\n }\n\n interrupt(agentId: string, requestId?: string): void {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Call driver.interrupt() directly\n state.driver.interrupt();\n\n // Emit interrupt event (for external subscribers)\n this.emitEvent(state, \"interrupt\", { agentId }, requestId ?? this.generateRequestId());\n\n logger.debug(\"Interrupt sent\", { agentId, requestId });\n }\n\n // ==================== Event Subscription ====================\n\n subscribe(agentId: string, handler: AgentEventHandler): Subscription {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n const unsub = this.platform.eventBus.onAny((event) => {\n const context = (event as BusEvent & { context?: { agentId?: string } }).context;\n if (context?.agentId === agentId) {\n handler(event);\n }\n });\n\n state.subscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n state.subscriptions.delete(unsub);\n },\n };\n }\n\n subscribeAll(handler: AgentEventHandler): Subscription {\n const unsub = this.platform.eventBus.onAny(handler);\n this.globalSubscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n this.globalSubscriptions.delete(unsub);\n },\n };\n }\n\n // ==================== Cleanup ====================\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n\n logger.info(\"Shutting down AgentXRuntime...\");\n\n // Destroy all agents\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n\n // Cleanup global subscriptions\n for (const unsub of this.globalSubscriptions) {\n unsub();\n }\n this.globalSubscriptions.clear();\n\n this.isShutdown = true;\n logger.info(\"AgentXRuntime shutdown complete\");\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Handle a single DriverStreamEvent\n */\n private handleDriverEvent(state: AgentState, event: DriverStreamEvent, requestId: string): void {\n // 1. Emit raw stream event to EventBus (for Presentation and other subscribers)\n this.emitEvent(state, event.type, event.data, requestId);\n\n // 2. Push to AgentEngine for MealyMachine processing\n // Engine produces message/state/turn events via Presenter\n const streamEvent = toStreamEvent(event);\n state.engine.handleStreamEvent(streamEvent);\n }\n\n /**\n * Emit an event to the EventBus\n */\n private emitEvent(state: AgentState, type: string, data: unknown, requestId: string): void {\n this.platform.eventBus.emit({\n type,\n timestamp: Date.now(),\n source: \"runtime\",\n category: this.categorizeEvent(type),\n intent: \"notification\",\n requestId,\n data,\n context: {\n agentId: state.agent.agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n }\n\n /**\n * Categorize event type\n */\n private categorizeEvent(type: string): string {\n if (type.includes(\"message\")) return \"message\";\n if (type.includes(\"tool\")) return \"tool\";\n if (type.includes(\"error\") || type.includes(\"interrupted\")) return \"error\";\n if (type.includes(\"delta\")) return \"stream\";\n return \"stream\";\n }\n\n private generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `agent_${timestamp}_${random}`;\n }\n\n private generateRequestId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `req_${timestamp}_${random}`;\n }\n\n private generateMessageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `msg_${timestamp}_${random}`;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert DriverStreamEvent to agent-layer StreamEvent.\n * Data structures are identical; only \"error\" type needs renaming.\n */\nfunction toStreamEvent(event: DriverStreamEvent): StreamEvent {\n const type = event.type === \"error\" ? \"error_received\" : event.type;\n return { type, data: event.data, timestamp: Date.now() } as StreamEvent;\n}\n\n/**\n * Categorize AgentOutput type for EventBus emission.\n */\nfunction categorizeAgentOutput(type: string): string {\n // Stream layer — already emitted by handleDriverEvent\n const streamTypes = [\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"text_delta\",\n \"tool_use_start\",\n \"input_json_delta\",\n \"tool_use_stop\",\n \"tool_result\",\n \"error_received\",\n ];\n if (streamTypes.includes(type)) return \"stream\";\n\n // Message layer\n if (type.endsWith(\"_message\")) return \"message\";\n\n // Turn layer\n if (type.startsWith(\"turn_\")) return \"turn\";\n\n // State layer (default)\n return \"state\";\n}\n\n/**\n * Create an AgentXRuntime instance\n *\n * @param platform - AgentXPlatform with repositories and event bus\n * @param createDriver - Factory function for creating Driver instances per Agent\n */\nexport function createAgentXRuntime(\n platform: AgentXPlatform,\n createDriver: CreateDriver\n): AgentXRuntime {\n return new AgentXRuntimeImpl(platform, createDriver);\n}\n"],"mappings":"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","names":[]}
|
package/dist/session/index.d.ts
CHANGED
|
@@ -1,54 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import '../driver/index.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Session - Manages conversation messages
|
|
8
|
-
*/
|
|
9
|
-
interface Session {
|
|
10
|
-
/**
|
|
11
|
-
* Unique session identifier
|
|
12
|
-
*/
|
|
13
|
-
readonly sessionId: string;
|
|
14
|
-
/**
|
|
15
|
-
* Associated image ID
|
|
16
|
-
*/
|
|
17
|
-
readonly imageId: string;
|
|
18
|
-
/**
|
|
19
|
-
* Container this session belongs to
|
|
20
|
-
*/
|
|
21
|
-
readonly containerId: string;
|
|
22
|
-
/**
|
|
23
|
-
* Creation timestamp
|
|
24
|
-
*/
|
|
25
|
-
readonly createdAt: number;
|
|
26
|
-
/**
|
|
27
|
-
* Initialize session in storage
|
|
28
|
-
*/
|
|
29
|
-
initialize(): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Add a message to the session
|
|
32
|
-
*/
|
|
33
|
-
addMessage(message: Message): Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Get all messages in the session
|
|
36
|
-
*/
|
|
37
|
-
getMessages(): Promise<Message[]>;
|
|
38
|
-
/**
|
|
39
|
-
* Clear all messages in the session
|
|
40
|
-
*/
|
|
41
|
-
clear(): Promise<void>;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Configuration for creating a Session
|
|
45
|
-
*/
|
|
46
|
-
interface SessionConfig {
|
|
47
|
-
sessionId: string;
|
|
48
|
-
imageId: string;
|
|
49
|
-
containerId: string;
|
|
50
|
-
repository: SessionRepository;
|
|
51
|
-
}
|
|
1
|
+
import { M as Message } from '../message-Dn-I2vr0.js';
|
|
2
|
+
import { S as SessionConfig, a as Session } from '../index--gxNpY5W.js';
|
|
3
|
+
export { b as SessionRecord, c as SessionRepository } from '../index--gxNpY5W.js';
|
|
52
4
|
|
|
53
5
|
/**
|
|
54
6
|
* Session - Manages conversation messages
|
|
@@ -89,4 +41,4 @@ declare class SessionImpl implements Session {
|
|
|
89
41
|
*/
|
|
90
42
|
declare function createSession(config: SessionConfig): Session;
|
|
91
43
|
|
|
92
|
-
export {
|
|
44
|
+
export { Session, SessionConfig, SessionImpl, createSession };
|
package/dist/session/index.js
CHANGED
|
@@ -1,54 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
sessionId;
|
|
6
|
-
imageId;
|
|
7
|
-
containerId;
|
|
8
|
-
createdAt;
|
|
9
|
-
repository;
|
|
10
|
-
constructor(config) {
|
|
11
|
-
this.sessionId = config.sessionId;
|
|
12
|
-
this.imageId = config.imageId;
|
|
13
|
-
this.containerId = config.containerId;
|
|
14
|
-
this.createdAt = Date.now();
|
|
15
|
-
this.repository = config.repository;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Initialize session in storage
|
|
19
|
-
*/
|
|
20
|
-
async initialize() {
|
|
21
|
-
const record = {
|
|
22
|
-
sessionId: this.sessionId,
|
|
23
|
-
imageId: this.imageId,
|
|
24
|
-
containerId: this.containerId,
|
|
25
|
-
createdAt: this.createdAt,
|
|
26
|
-
updatedAt: this.createdAt
|
|
27
|
-
};
|
|
28
|
-
await this.repository.saveSession(record);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Add a message to the session
|
|
32
|
-
*/
|
|
33
|
-
async addMessage(message) {
|
|
34
|
-
await this.repository.addMessage(this.sessionId, message);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Get all messages in the session
|
|
38
|
-
*/
|
|
39
|
-
async getMessages() {
|
|
40
|
-
return this.repository.getMessages(this.sessionId);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Clear all messages in the session
|
|
44
|
-
*/
|
|
45
|
-
async clear() {
|
|
46
|
-
await this.repository.clearMessages(this.sessionId);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
function createSession(config) {
|
|
50
|
-
return new SessionImpl(config);
|
|
51
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
SessionImpl,
|
|
3
|
+
createSession
|
|
4
|
+
} from "../chunk-BHOD5PKR.js";
|
|
52
5
|
export {
|
|
53
6
|
SessionImpl,
|
|
54
7
|
createSession
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash Types
|
|
3
|
+
*
|
|
4
|
+
* Abstraction for command execution capability.
|
|
5
|
+
* Different platforms provide different implementations:
|
|
6
|
+
* - Node.js: child_process based
|
|
7
|
+
* - Docker: Container exec
|
|
8
|
+
* - Sandbox: Isolated environment
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* ┌─────────────────────────────────────────────────────┐
|
|
12
|
+
* │ core/bash │
|
|
13
|
+
* │ ┌─────────────────────────────────────────────────┐│
|
|
14
|
+
* │ │ BashProvider (interface) ││
|
|
15
|
+
* │ │ BashResult (interface) ││
|
|
16
|
+
* │ │ BashOptions (interface) ││
|
|
17
|
+
* │ └─────────────────────────────────────────────────┘│
|
|
18
|
+
* └─────────────────────────────────────────────────────┘
|
|
19
|
+
* │
|
|
20
|
+
* ┌────────────────┼────────────────┐
|
|
21
|
+
* ▼ ▼ ▼
|
|
22
|
+
* ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
23
|
+
* │ platform-node│ │platform-docker│ │platform-sandbox│
|
|
24
|
+
* │ ChildProcess │ │ ContainerExec│ │ SandboxExec │
|
|
25
|
+
* └──────────────┘ └──────────────┘ └──────────────┘
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* BashResult - Output from a command execution
|
|
30
|
+
*/
|
|
31
|
+
interface BashResult {
|
|
32
|
+
/**
|
|
33
|
+
* Standard output
|
|
34
|
+
*/
|
|
35
|
+
stdout: string;
|
|
36
|
+
/**
|
|
37
|
+
* Standard error
|
|
38
|
+
*/
|
|
39
|
+
stderr: string;
|
|
40
|
+
/**
|
|
41
|
+
* Process exit code (0 = success)
|
|
42
|
+
*/
|
|
43
|
+
exitCode: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* BashOptions - Configuration for a single command execution
|
|
47
|
+
*/
|
|
48
|
+
interface BashOptions {
|
|
49
|
+
/**
|
|
50
|
+
* Working directory for the command
|
|
51
|
+
*/
|
|
52
|
+
cwd?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Timeout in milliseconds
|
|
55
|
+
*/
|
|
56
|
+
timeout?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Environment variables
|
|
59
|
+
*/
|
|
60
|
+
env?: Record<string, string>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* BashProvider - Abstraction for command execution
|
|
64
|
+
*
|
|
65
|
+
* Platform implementations provide this interface.
|
|
66
|
+
* The provider is stateless — each execute() call is independent.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const result = await provider.execute("ls -la", { cwd: "/tmp" });
|
|
71
|
+
* console.log(result.stdout);
|
|
72
|
+
* console.log(result.exitCode); // 0
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
interface BashProvider {
|
|
76
|
+
/**
|
|
77
|
+
* Provider type (e.g., "child-process", "docker", "sandbox")
|
|
78
|
+
*/
|
|
79
|
+
readonly type: string;
|
|
80
|
+
/**
|
|
81
|
+
* Execute a shell command
|
|
82
|
+
*
|
|
83
|
+
* @param command - Shell command to execute
|
|
84
|
+
* @param options - Execution options
|
|
85
|
+
* @returns Command output and exit code
|
|
86
|
+
*/
|
|
87
|
+
execute(command: string, options?: BashOptions): Promise<BashResult>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export type { BashProvider as B, BashOptions as a, BashResult as b };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentxjs/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -45,10 +45,15 @@
|
|
|
45
45
|
"import": "./dist/container/index.js",
|
|
46
46
|
"default": "./dist/container/index.js"
|
|
47
47
|
},
|
|
48
|
-
"./
|
|
49
|
-
"types": "./dist/
|
|
50
|
-
"import": "./dist/
|
|
51
|
-
"default": "./dist/
|
|
48
|
+
"./bash": {
|
|
49
|
+
"types": "./dist/bash/index.d.ts",
|
|
50
|
+
"import": "./dist/bash/index.js",
|
|
51
|
+
"default": "./dist/bash/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./platform": {
|
|
54
|
+
"types": "./dist/platform/index.d.ts",
|
|
55
|
+
"import": "./dist/platform/index.js",
|
|
56
|
+
"default": "./dist/platform/index.js"
|
|
52
57
|
},
|
|
53
58
|
"./runtime": {
|
|
54
59
|
"types": "./dist/runtime/index.d.ts",
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
* - Notify state change subscribers
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { createLogger } from "commonxjs/logger";
|
|
16
17
|
import type {
|
|
18
|
+
AgentOutput,
|
|
17
19
|
AgentState,
|
|
18
20
|
StateChange,
|
|
19
21
|
StateChangeHandler,
|
|
20
|
-
AgentOutput,
|
|
21
22
|
Unsubscribe,
|
|
22
23
|
} from "./types";
|
|
23
24
|
import { isStateEvent } from "./types";
|
|
24
|
-
import { createLogger } from "commonxjs/logger";
|
|
25
25
|
|
|
26
26
|
const logger = createLogger("agent/AgentStateMachine");
|
|
27
27
|
|