@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.
Files changed (142) hide show
  1. package/README.md +342 -0
  2. package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
  3. package/dist/RpcClient-CMdhJxjS.d.ts +304 -0
  4. package/dist/agent/engine/internal/index.d.ts +22 -18
  5. package/dist/agent/engine/internal/index.js +1 -2
  6. package/dist/agent/engine/mealy/index.d.ts +4 -4
  7. package/dist/agent/engine/mealy/index.js +1 -2
  8. package/dist/agent/index.d.ts +92 -92
  9. package/dist/agent/index.js +16 -16
  10. package/dist/agent/types/index.d.ts +4 -4
  11. package/dist/agent/types/index.js +1 -2
  12. package/dist/bash/index.d.ts +29 -0
  13. package/dist/bash/index.js +7 -0
  14. package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
  15. package/dist/{chunk-E5FPOAPO.js → chunk-22NTRYNO.js} +60 -60
  16. package/dist/chunk-22NTRYNO.js.map +1 -0
  17. package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
  18. package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
  19. package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
  20. package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
  21. package/dist/chunk-BHOD5PKR.js +55 -0
  22. package/dist/chunk-BHOD5PKR.js.map +1 -0
  23. package/dist/chunk-FI7WQFGV.js +37 -0
  24. package/dist/chunk-FI7WQFGV.js.map +1 -0
  25. package/dist/{chunk-AT5P47YA.js → chunk-RWIYC65R.js} +115 -115
  26. package/dist/chunk-RWIYC65R.js.map +1 -0
  27. package/dist/chunk-SKS7S2RY.js +1 -0
  28. package/dist/{chunk-I7GYR3MN.js → chunk-TUFZ2YH6.js} +77 -91
  29. package/dist/chunk-TUFZ2YH6.js.map +1 -0
  30. package/dist/{chunk-K6WXQ2RW.js → chunk-YSZG6XIM.js} +1 -2
  31. package/dist/chunk-YSZG6XIM.js.map +1 -0
  32. package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
  33. package/dist/common/logger/index.js +14 -16
  34. package/dist/common/logger/index.js.map +1 -1
  35. package/dist/container/index.d.ts +3 -4
  36. package/dist/container/index.js +0 -2
  37. package/dist/container/index.js.map +1 -1
  38. package/dist/driver/index.d.ts +2 -310
  39. package/dist/event/index.d.ts +4 -4
  40. package/dist/event/index.js +2 -3
  41. package/dist/event/types/index.d.ts +202 -208
  42. package/dist/event/types/index.js +1 -2
  43. package/dist/{event-CDuTzs__.d.ts → event-DNsF9EkO.d.ts} +5 -8
  44. package/dist/image/index.d.ts +9 -5
  45. package/dist/image/index.js +5 -2
  46. package/dist/image/index.js.map +1 -1
  47. package/dist/index--gxNpY5W.d.ts +609 -0
  48. package/dist/index.d.ts +4 -4
  49. package/dist/index.js +17 -17
  50. package/dist/{message-BMrMm1pq.d.ts → message-Dn-I2vr0.d.ts} +10 -33
  51. package/dist/mq/index.d.ts +25 -25
  52. package/dist/mq/index.js +1 -3
  53. package/dist/mq/index.js.map +1 -1
  54. package/dist/network/index.d.ts +59 -347
  55. package/dist/network/index.js +30 -41
  56. package/dist/network/index.js.map +1 -1
  57. package/dist/persistence/index.d.ts +2 -155
  58. package/dist/platform/index.d.ts +76 -0
  59. package/dist/platform/index.js.map +1 -0
  60. package/dist/runtime/index.d.ts +26 -59
  61. package/dist/runtime/index.js +117 -33
  62. package/dist/runtime/index.js.map +1 -1
  63. package/dist/session/index.d.ts +4 -52
  64. package/dist/session/index.js +4 -51
  65. package/dist/session/index.js.map +1 -1
  66. package/dist/types-Cb8tKM6Y.d.ts +90 -0
  67. package/package.json +10 -5
  68. package/src/agent/AgentStateMachine.ts +2 -2
  69. package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
  70. package/src/agent/__tests__/createAgent.test.ts +4 -4
  71. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +301 -97
  72. package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
  73. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +59 -78
  74. package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
  75. package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
  76. package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
  77. package/src/agent/createAgent.ts +15 -15
  78. package/src/agent/engine/AgentProcessor.ts +7 -7
  79. package/src/agent/engine/MealyMachine.ts +4 -4
  80. package/src/agent/engine/internal/index.ts +11 -11
  81. package/src/agent/engine/internal/messageAssemblerProcessor.ts +113 -128
  82. package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
  83. package/src/agent/engine/internal/turnTrackerProcessor.ts +27 -31
  84. package/src/agent/engine/mealy/Mealy.ts +2 -2
  85. package/src/agent/engine/mealy/combinators.ts +10 -10
  86. package/src/agent/engine/mealy/index.ts +9 -11
  87. package/src/agent/index.ts +30 -32
  88. package/src/agent/types/engine.ts +3 -3
  89. package/src/agent/types/event.ts +4 -12
  90. package/src/agent/types/index.ts +86 -88
  91. package/src/agent/types/message.ts +9 -43
  92. package/src/bash/index.ts +21 -0
  93. package/src/bash/tool.ts +57 -0
  94. package/src/bash/types.ts +108 -0
  95. package/src/common/logger/ConsoleLogger.ts +1 -1
  96. package/src/common/logger/LoggerFactoryImpl.ts +14 -14
  97. package/src/common/logger/index.ts +3 -3
  98. package/src/container/index.ts +4 -5
  99. package/src/container/types.ts +1 -1
  100. package/src/driver/index.ts +15 -16
  101. package/src/driver/types.ts +201 -73
  102. package/src/event/EventBus.ts +10 -10
  103. package/src/event/__tests__/EventBus.test.ts +2 -2
  104. package/src/event/index.ts +2 -3
  105. package/src/event/types/agent.ts +186 -191
  106. package/src/event/types/bus.ts +1 -1
  107. package/src/event/types/command.ts +293 -264
  108. package/src/event/types/container.ts +207 -222
  109. package/src/event/types/driver.ts +153 -155
  110. package/src/event/types/index.ts +6 -12
  111. package/src/event/types/session.ts +117 -130
  112. package/src/image/Image.ts +12 -2
  113. package/src/image/index.ts +4 -5
  114. package/src/image/types.ts +8 -2
  115. package/src/mq/OffsetGenerator.ts +1 -1
  116. package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
  117. package/src/mq/index.ts +4 -5
  118. package/src/network/RpcClient.ts +26 -25
  119. package/src/network/index.ts +41 -44
  120. package/src/network/jsonrpc.ts +5 -5
  121. package/src/persistence/index.ts +5 -5
  122. package/src/persistence/types.ts +5 -2
  123. package/src/platform/index.ts +21 -0
  124. package/src/platform/types.ts +84 -0
  125. package/src/runtime/AgentXRuntime.ts +188 -61
  126. package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
  127. package/src/runtime/index.ts +12 -25
  128. package/src/runtime/types.ts +10 -62
  129. package/src/session/index.ts +2 -3
  130. package/dist/chunk-7D4SUZUM.js +0 -38
  131. package/dist/chunk-AT5P47YA.js.map +0 -1
  132. package/dist/chunk-E5FPOAPO.js.map +0 -1
  133. package/dist/chunk-I7GYR3MN.js.map +0 -1
  134. package/dist/chunk-K6WXQ2RW.js.map +0 -1
  135. package/dist/workspace/index.d.ts +0 -111
  136. package/dist/wrapper-Y3UTVU2E.js +0 -3635
  137. package/dist/wrapper-Y3UTVU2E.js.map +0 -1
  138. package/src/workspace/index.ts +0 -27
  139. package/src/workspace/types.ts +0 -131
  140. /package/dist/{workspace → bash}/index.js.map +0 -0
  141. /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
  142. /package/dist/{workspace → platform}/index.js +0 -0
@@ -1,15 +1,30 @@
1
- import "../chunk-7D4SUZUM.js";
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
- provider;
20
+ platform;
21
+ createDriver;
8
22
  agents = /* @__PURE__ */ new Map();
9
23
  globalSubscriptions = /* @__PURE__ */ new Set();
10
24
  isShutdown = false;
11
- constructor(provider) {
12
- this.provider = provider;
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.provider.imageRepository.findImageById(imageId);
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.provider.containerRepository.containerExists(
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 workspace = await this.provider.workspaceProvider.create({
47
+ const session = createSession({
48
+ sessionId: imageRecord.sessionId,
49
+ imageId,
33
50
  containerId: imageRecord.containerId,
34
- imageId
51
+ repository: this.platform.sessionRepository
35
52
  });
36
- await workspace.initialize();
53
+ const defaultTools = [];
54
+ if (this.platform.bashProvider) {
55
+ defaultTools.push(createBashTool(this.platform.bashProvider));
56
+ }
37
57
  const driverConfig = {
38
- apiKey: process.env.ANTHROPIC_API_KEY ?? "",
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
- resumeSessionId: imageRecord.metadata?.claudeSdkSessionId,
45
- onSessionIdCaptured: async (claudeSdkSessionId) => {
46
- await this.provider.imageRepository.updateMetadata(imageId, { claudeSdkSessionId });
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.provider.createDriver(driverConfig);
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.provider.eventBus.emit({
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.provider.eventBus.emit({
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.provider.eventBus.emit({
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.provider.eventBus.emit({
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.provider.sessionRepository.addMessage(state.agent.sessionId, userMessage);
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.provider.eventBus.onAny((event) => {
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.provider.eventBus.onAny(handler);
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.provider.eventBus.emit({
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 createAgentXRuntime(provider) {
341
- return new AgentXRuntimeImpl(provider);
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":[]}
@@ -1,54 +1,6 @@
1
- import { SessionRepository } from '../persistence/index.js';
2
- export { SessionRecord } from '../persistence/index.js';
3
- import { M as Message } from '../message-BMrMm1pq.js';
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 { type Session, type SessionConfig, SessionImpl, SessionRepository, createSession };
44
+ export { Session, SessionConfig, SessionImpl, createSession };
@@ -1,54 +1,7 @@
1
- import "../chunk-7D4SUZUM.js";
2
-
3
- // src/session/Session.ts
4
- var SessionImpl = class {
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":["../../src/session/Session.ts"],"sourcesContent":["/**\n * Session - Manages conversation messages\n *\n * Collects messages and persists to storage via SessionRepository.\n * Pure implementation without EventBus dependency.\n */\n\nimport type { Message } from \"../agent/types\";\nimport type { Session, SessionConfig, SessionRecord, SessionRepository } from \"./types\";\n\n/**\n * SessionImpl - Session implementation\n */\nexport class SessionImpl implements Session {\n readonly sessionId: string;\n readonly imageId: string;\n readonly containerId: string;\n readonly createdAt: number;\n\n private readonly repository: SessionRepository;\n\n constructor(config: SessionConfig) {\n this.sessionId = config.sessionId;\n this.imageId = config.imageId;\n this.containerId = config.containerId;\n this.createdAt = Date.now();\n this.repository = config.repository;\n }\n\n /**\n * Initialize session in storage\n */\n async initialize(): Promise<void> {\n const record: SessionRecord = {\n sessionId: this.sessionId,\n imageId: this.imageId,\n containerId: this.containerId,\n createdAt: this.createdAt,\n updatedAt: this.createdAt,\n };\n await this.repository.saveSession(record);\n }\n\n /**\n * Add a message to the session\n */\n async addMessage(message: Message): Promise<void> {\n await this.repository.addMessage(this.sessionId, message);\n }\n\n /**\n * Get all messages in the session\n */\n async getMessages(): Promise<Message[]> {\n return this.repository.getMessages(this.sessionId);\n }\n\n /**\n * Clear all messages in the session\n */\n async clear(): Promise<void> {\n await this.repository.clearMessages(this.sessionId);\n }\n}\n\n/**\n * Create a new Session instance\n */\nexport function createSession(config: SessionConfig): Session {\n return new SessionImpl(config);\n}\n"],"mappings":";;;AAaO,IAAM,cAAN,MAAqC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEQ;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,YAAY,OAAO;AACxB,SAAK,UAAU,OAAO;AACtB,SAAK,cAAc,OAAO;AAC1B,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,SAAwB;AAAA,MAC5B,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,IAClB;AACA,UAAM,KAAK,WAAW,YAAY,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAiC;AAChD,UAAM,KAAK,WAAW,WAAW,KAAK,WAAW,OAAO;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAkC;AACtC,WAAO,KAAK,WAAW,YAAY,KAAK,SAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,WAAW,cAAc,KAAK,SAAS;AAAA,EACpD;AACF;AAKO,SAAS,cAAc,QAAgC;AAC5D,SAAO,IAAI,YAAY,MAAM;AAC/B;","names":[]}
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": "1.9.10-dev",
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
- "./workspace": {
49
- "types": "./dist/workspace/index.d.ts",
50
- "import": "./dist/workspace/index.js",
51
- "default": "./dist/workspace/index.js"
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