@agentxjs/core 1.9.5-dev → 1.9.6-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/Processor-DT0N1qI6.d.ts +64 -0
  2. package/dist/agent/engine/internal/index.d.ts +223 -0
  3. package/dist/agent/engine/internal/index.js +24 -0
  4. package/dist/agent/engine/internal/index.js.map +1 -0
  5. package/dist/agent/engine/mealy/index.d.ts +157 -0
  6. package/dist/agent/engine/mealy/index.js +26 -0
  7. package/dist/agent/engine/mealy/index.js.map +1 -0
  8. package/dist/agent/index.d.ts +244 -0
  9. package/dist/agent/index.js +66 -0
  10. package/dist/agent/index.js.map +1 -0
  11. package/dist/agent/types/index.d.ts +322 -0
  12. package/dist/agent/types/index.js +12 -0
  13. package/dist/agent/types/index.js.map +1 -0
  14. package/dist/base-m40r3Qgu.d.ts +157 -0
  15. package/dist/bus-uF1DM2ox.d.ts +906 -0
  16. package/dist/chunk-7D4SUZUM.js +38 -0
  17. package/dist/chunk-7D4SUZUM.js.map +1 -0
  18. package/dist/chunk-7ZDX3O6I.js +173 -0
  19. package/dist/chunk-7ZDX3O6I.js.map +1 -0
  20. package/dist/chunk-AT5P47YA.js +543 -0
  21. package/dist/chunk-AT5P47YA.js.map +1 -0
  22. package/dist/chunk-E5FPOAPO.js +123 -0
  23. package/dist/chunk-E5FPOAPO.js.map +1 -0
  24. package/dist/chunk-EKHT54KN.js +272 -0
  25. package/dist/chunk-EKHT54KN.js.map +1 -0
  26. package/dist/chunk-I7GYR3MN.js +502 -0
  27. package/dist/chunk-I7GYR3MN.js.map +1 -0
  28. package/dist/chunk-K6WXQ2RW.js +38 -0
  29. package/dist/chunk-K6WXQ2RW.js.map +1 -0
  30. package/dist/chunk-RL3JRNXM.js +3 -0
  31. package/dist/chunk-RL3JRNXM.js.map +1 -0
  32. package/dist/combinators-nEa5dD0T.d.ts +271 -0
  33. package/dist/common/index.d.ts +1 -0
  34. package/dist/common/index.js +2 -0
  35. package/dist/common/index.js.map +1 -0
  36. package/dist/common/logger/index.d.ts +163 -0
  37. package/dist/common/logger/index.js +184 -0
  38. package/dist/common/logger/index.js.map +1 -0
  39. package/dist/container/index.d.ts +110 -0
  40. package/dist/container/index.js +127 -0
  41. package/dist/container/index.js.map +1 -0
  42. package/dist/driver/index.d.ts +266 -0
  43. package/dist/driver/index.js +1 -0
  44. package/dist/driver/index.js.map +1 -0
  45. package/dist/event/index.d.ts +55 -0
  46. package/dist/event/index.js +60 -0
  47. package/dist/event/index.js.map +1 -0
  48. package/dist/event/types/index.d.ts +1149 -0
  49. package/dist/event/types/index.js +56 -0
  50. package/dist/event/types/index.js.map +1 -0
  51. package/dist/event-CDuTzs__.d.ts +296 -0
  52. package/dist/image/index.d.ts +112 -0
  53. package/dist/image/index.js +151 -0
  54. package/dist/image/index.js.map +1 -0
  55. package/dist/index.d.ts +8 -0
  56. package/dist/index.js +67 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/message-BMrMm1pq.d.ts +305 -0
  59. package/dist/mq/index.d.ts +165 -0
  60. package/dist/mq/index.js +37 -0
  61. package/dist/mq/index.js.map +1 -0
  62. package/dist/network/index.d.ts +567 -0
  63. package/dist/network/index.js +435 -0
  64. package/dist/network/index.js.map +1 -0
  65. package/dist/persistence/index.d.ts +155 -0
  66. package/dist/persistence/index.js +1 -0
  67. package/dist/persistence/index.js.map +1 -0
  68. package/dist/runtime/index.d.ts +240 -0
  69. package/dist/runtime/index.js +347 -0
  70. package/dist/runtime/index.js.map +1 -0
  71. package/dist/session/index.d.ts +92 -0
  72. package/dist/session/index.js +56 -0
  73. package/dist/session/index.js.map +1 -0
  74. package/dist/workspace/index.d.ts +111 -0
  75. package/dist/workspace/index.js +1 -0
  76. package/dist/workspace/index.js.map +1 -0
  77. package/dist/wrapper-Y3UTVU2E.js +3635 -0
  78. package/dist/wrapper-Y3UTVU2E.js.map +1 -0
  79. package/package.json +73 -14
  80. package/tsconfig.json +0 -10
@@ -0,0 +1,240 @@
1
+ import { ContainerRepository, ImageRepository, SessionRepository } from '../persistence/index.js';
2
+ import { CreateDriver } from '../driver/index.js';
3
+ import { c as UserContentPart } from '../message-BMrMm1pq.js';
4
+ import { WorkspaceProvider } from '../workspace/index.js';
5
+ import { B as BusEvent } from '../base-m40r3Qgu.js';
6
+ import { E as EventBus } from '../bus-uF1DM2ox.js';
7
+
8
+ /**
9
+ * Runtime Types
10
+ *
11
+ * AgentXProvider - Dependency injection container
12
+ * AgentXRuntime - Runtime integration layer
13
+ *
14
+ * Architecture:
15
+ * ```
16
+ * ┌─────────────────────────────────────────────────────────────┐
17
+ * │ AgentXProvider │
18
+ * │ (Dependency Injection - Platform provides implementations) │
19
+ * │ │
20
+ * │ ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ │
21
+ * │ │ Repositories│ │ Workspace │ │ DriverFactory │ │
22
+ * │ │ Container │ │ Provider │ │ (per-Agent) │ │
23
+ * │ │ Image │ │ │ │ │ │
24
+ * │ │ Session │ │ │ │ │ │
25
+ * │ └─────────────┘ └─────────────┘ └─────────────┘ │
26
+ * └─────────────────────────────────────────────────────────────┘
27
+ * │
28
+ * ▼
29
+ * ┌─────────────────────────────────────────────────────────────┐
30
+ * │ AgentXRuntime │
31
+ * │ (Integration - Uses Provider dependencies) │
32
+ * │ │
33
+ * │ ┌─────────────────────────────────────────────────────┐ │
34
+ * │ │ Agent Lifecycle: create / get / destroy │ │
35
+ * │ │ Message Flow: receive → EventBus → Driver │ │
36
+ * │ │ Event Subscription: subscribe to agent events │ │
37
+ * │ └─────────────────────────────────────────────────────┘ │
38
+ * └─────────────────────────────────────────────────────────────┘
39
+ * ```
40
+ */
41
+
42
+ /**
43
+ * Agent lifecycle states
44
+ */
45
+ type AgentLifecycle = "running" | "stopped" | "destroyed";
46
+ /**
47
+ * Runtime Agent - Active agent instance
48
+ */
49
+ interface RuntimeAgent {
50
+ readonly agentId: string;
51
+ readonly imageId: string;
52
+ readonly containerId: string;
53
+ readonly sessionId: string;
54
+ readonly name: string;
55
+ readonly lifecycle: AgentLifecycle;
56
+ readonly createdAt: number;
57
+ }
58
+ /**
59
+ * AgentXProvider - Collects all dependencies for runtime
60
+ *
61
+ * Platform packages provide implementations of these interfaces.
62
+ * The provider is passed to AgentXRuntime for integration.
63
+ */
64
+ interface AgentXProvider {
65
+ /**
66
+ * Container repository for persistence
67
+ */
68
+ readonly containerRepository: ContainerRepository;
69
+ /**
70
+ * Image repository for persistence
71
+ */
72
+ readonly imageRepository: ImageRepository;
73
+ /**
74
+ * Session repository for persistence
75
+ */
76
+ readonly sessionRepository: SessionRepository;
77
+ /**
78
+ * Workspace provider for isolated environments
79
+ */
80
+ readonly workspaceProvider: WorkspaceProvider;
81
+ /**
82
+ * LLM Driver factory function - creates Driver per Agent
83
+ */
84
+ readonly createDriver: CreateDriver;
85
+ /**
86
+ * Event bus for pub/sub
87
+ */
88
+ readonly eventBus: EventBus;
89
+ }
90
+ /**
91
+ * Agent creation options
92
+ */
93
+ interface CreateAgentOptions {
94
+ /**
95
+ * Image ID to create agent from
96
+ */
97
+ imageId: string;
98
+ /**
99
+ * Optional agent ID (auto-generated if not provided)
100
+ */
101
+ agentId?: string;
102
+ }
103
+ /**
104
+ * Event handler for agent events
105
+ */
106
+ type AgentEventHandler = (event: BusEvent) => void;
107
+ /**
108
+ * Subscription handle for unsubscribing
109
+ */
110
+ interface Subscription {
111
+ unsubscribe(): void;
112
+ }
113
+ /**
114
+ * AgentXRuntime - Runtime integration layer
115
+ *
116
+ * Integrates all components to provide agent lifecycle management
117
+ * and message handling.
118
+ */
119
+ interface AgentXRuntime {
120
+ /**
121
+ * The provider containing all dependencies
122
+ */
123
+ readonly provider: AgentXProvider;
124
+ /**
125
+ * Create and start an agent from an image
126
+ */
127
+ createAgent(options: CreateAgentOptions): Promise<RuntimeAgent>;
128
+ /**
129
+ * Get an active agent by ID
130
+ */
131
+ getAgent(agentId: string): RuntimeAgent | undefined;
132
+ /**
133
+ * Get all active agents
134
+ */
135
+ getAgents(): RuntimeAgent[];
136
+ /**
137
+ * Get agents by container ID
138
+ */
139
+ getAgentsByContainer(containerId: string): RuntimeAgent[];
140
+ /**
141
+ * Stop an agent (can be resumed)
142
+ */
143
+ stopAgent(agentId: string): Promise<void>;
144
+ /**
145
+ * Resume a stopped agent
146
+ */
147
+ resumeAgent(agentId: string): Promise<void>;
148
+ /**
149
+ * Destroy an agent (cannot be resumed)
150
+ */
151
+ destroyAgent(agentId: string): Promise<void>;
152
+ /**
153
+ * Send a message to an agent
154
+ *
155
+ * Emits user_message to EventBus, Driver picks it up and responds.
156
+ */
157
+ receive(agentId: string, content: string | UserContentPart[], requestId?: string): Promise<void>;
158
+ /**
159
+ * Interrupt an agent's current operation
160
+ */
161
+ interrupt(agentId: string, requestId?: string): void;
162
+ /**
163
+ * Subscribe to events for a specific agent
164
+ */
165
+ subscribe(agentId: string, handler: AgentEventHandler): Subscription;
166
+ /**
167
+ * Subscribe to all events (all agents)
168
+ */
169
+ subscribeAll(handler: AgentEventHandler): Subscription;
170
+ /**
171
+ * Shutdown runtime and cleanup all resources
172
+ */
173
+ shutdown(): Promise<void>;
174
+ }
175
+ /**
176
+ * Configuration for creating AgentXRuntime
177
+ */
178
+ interface AgentXRuntimeConfig {
179
+ provider: AgentXProvider;
180
+ }
181
+ /**
182
+ * Factory function type for creating AgentXRuntime
183
+ */
184
+ type CreateAgentXRuntime = (config: AgentXRuntimeConfig) => AgentXRuntime;
185
+
186
+ /**
187
+ * AgentXRuntimeImpl - Runtime integration implementation
188
+ *
189
+ * Integrates all components to provide agent lifecycle management.
190
+ * Uses Provider dependencies to coordinate Session, Image, Container, etc.
191
+ *
192
+ * New Design:
193
+ * - Driver.receive() returns AsyncIterable<DriverStreamEvent>
194
+ * - Runtime processes events and emits to EventBus
195
+ * - No more EventBus-based communication with Driver
196
+ */
197
+
198
+ /**
199
+ * AgentXRuntimeImpl - Runtime implementation
200
+ */
201
+ declare class AgentXRuntimeImpl implements AgentXRuntime {
202
+ readonly provider: AgentXProvider;
203
+ private agents;
204
+ private globalSubscriptions;
205
+ private isShutdown;
206
+ constructor(provider: AgentXProvider);
207
+ createAgent(options: CreateAgentOptions): Promise<RuntimeAgent>;
208
+ getAgent(agentId: string): RuntimeAgent | undefined;
209
+ getAgents(): RuntimeAgent[];
210
+ getAgentsByContainer(containerId: string): RuntimeAgent[];
211
+ stopAgent(agentId: string): Promise<void>;
212
+ resumeAgent(agentId: string): Promise<void>;
213
+ destroyAgent(agentId: string): Promise<void>;
214
+ receive(agentId: string, content: string | UserContentPart[], requestId?: string): Promise<void>;
215
+ interrupt(agentId: string, requestId?: string): void;
216
+ subscribe(agentId: string, handler: AgentEventHandler): Subscription;
217
+ subscribeAll(handler: AgentEventHandler): Subscription;
218
+ shutdown(): Promise<void>;
219
+ /**
220
+ * Handle a single DriverStreamEvent
221
+ */
222
+ private handleDriverEvent;
223
+ /**
224
+ * Emit an event to the EventBus
225
+ */
226
+ private emitEvent;
227
+ /**
228
+ * Categorize event type
229
+ */
230
+ private categorizeEvent;
231
+ private generateAgentId;
232
+ private generateRequestId;
233
+ private generateMessageId;
234
+ }
235
+ /**
236
+ * Create an AgentXRuntime instance
237
+ */
238
+ declare function createAgentXRuntime(provider: AgentXProvider): AgentXRuntime;
239
+
240
+ export { type AgentEventHandler, type AgentLifecycle, type AgentXProvider, type AgentXRuntime, type AgentXRuntimeConfig, AgentXRuntimeImpl, type CreateAgentOptions, type CreateAgentXRuntime, type RuntimeAgent, type Subscription, createAgentXRuntime };
@@ -0,0 +1,347 @@
1
+ import "../chunk-7D4SUZUM.js";
2
+
3
+ // src/runtime/AgentXRuntime.ts
4
+ import { createLogger } from "commonxjs/logger";
5
+ var logger = createLogger("runtime/AgentXRuntime");
6
+ var AgentXRuntimeImpl = class {
7
+ provider;
8
+ agents = /* @__PURE__ */ new Map();
9
+ globalSubscriptions = /* @__PURE__ */ new Set();
10
+ isShutdown = false;
11
+ constructor(provider) {
12
+ this.provider = provider;
13
+ logger.info("AgentXRuntime initialized");
14
+ }
15
+ // ==================== Agent Lifecycle ====================
16
+ async createAgent(options) {
17
+ if (this.isShutdown) {
18
+ throw new Error("Runtime is shutdown");
19
+ }
20
+ const { imageId } = options;
21
+ const imageRecord = await this.provider.imageRepository.findImageById(imageId);
22
+ if (!imageRecord) {
23
+ throw new Error(`Image not found: ${imageId}`);
24
+ }
25
+ const agentId = options.agentId ?? this.generateAgentId();
26
+ const containerExists = await this.provider.containerRepository.containerExists(
27
+ imageRecord.containerId
28
+ );
29
+ if (!containerExists) {
30
+ throw new Error(`Container not found: ${imageRecord.containerId}`);
31
+ }
32
+ const workspace = await this.provider.workspaceProvider.create({
33
+ containerId: imageRecord.containerId,
34
+ imageId
35
+ });
36
+ await workspace.initialize();
37
+ const driverConfig = {
38
+ apiKey: process.env.ANTHROPIC_API_KEY ?? "",
39
+ baseUrl: process.env.ANTHROPIC_BASE_URL,
40
+ agentId,
41
+ systemPrompt: imageRecord.systemPrompt,
42
+ cwd: workspace.path,
43
+ mcpServers: imageRecord.mcpServers,
44
+ resumeSessionId: imageRecord.metadata?.claudeSdkSessionId,
45
+ onSessionIdCaptured: async (claudeSdkSessionId) => {
46
+ await this.provider.imageRepository.updateMetadata(imageId, { claudeSdkSessionId });
47
+ }
48
+ };
49
+ const driver = this.provider.createDriver(driverConfig);
50
+ await driver.initialize();
51
+ const agent = {
52
+ agentId,
53
+ imageId,
54
+ containerId: imageRecord.containerId,
55
+ sessionId: imageRecord.sessionId,
56
+ name: imageRecord.name,
57
+ lifecycle: "running",
58
+ createdAt: Date.now()
59
+ };
60
+ const state = {
61
+ agent,
62
+ lifecycle: "running",
63
+ subscriptions: /* @__PURE__ */ new Set(),
64
+ driver,
65
+ isReceiving: false
66
+ };
67
+ this.agents.set(agentId, state);
68
+ this.provider.eventBus.emit({
69
+ type: "agent_created",
70
+ timestamp: Date.now(),
71
+ source: "runtime",
72
+ category: "lifecycle",
73
+ intent: "notification",
74
+ data: {
75
+ agentId,
76
+ imageId,
77
+ containerId: imageRecord.containerId
78
+ },
79
+ context: {
80
+ agentId,
81
+ imageId,
82
+ containerId: imageRecord.containerId,
83
+ sessionId: imageRecord.sessionId
84
+ }
85
+ });
86
+ logger.info("Agent created", {
87
+ agentId,
88
+ imageId,
89
+ containerId: imageRecord.containerId
90
+ });
91
+ return agent;
92
+ }
93
+ getAgent(agentId) {
94
+ const state = this.agents.get(agentId);
95
+ return state?.agent;
96
+ }
97
+ getAgents() {
98
+ return Array.from(this.agents.values()).map((s) => s.agent);
99
+ }
100
+ getAgentsByContainer(containerId) {
101
+ return Array.from(this.agents.values()).filter((s) => s.agent.containerId === containerId).map((s) => s.agent);
102
+ }
103
+ async stopAgent(agentId) {
104
+ const state = this.agents.get(agentId);
105
+ if (!state) {
106
+ throw new Error(`Agent not found: ${agentId}`);
107
+ }
108
+ if (state.lifecycle === "destroyed") {
109
+ throw new Error(`Agent already destroyed: ${agentId}`);
110
+ }
111
+ state.lifecycle = "stopped";
112
+ this.provider.eventBus.emit({
113
+ type: "agent_stopped",
114
+ timestamp: Date.now(),
115
+ source: "runtime",
116
+ category: "lifecycle",
117
+ intent: "notification",
118
+ data: { agentId },
119
+ context: {
120
+ agentId,
121
+ imageId: state.agent.imageId,
122
+ containerId: state.agent.containerId,
123
+ sessionId: state.agent.sessionId
124
+ }
125
+ });
126
+ logger.info("Agent stopped", { agentId });
127
+ }
128
+ async resumeAgent(agentId) {
129
+ const state = this.agents.get(agentId);
130
+ if (!state) {
131
+ throw new Error(`Agent not found: ${agentId}`);
132
+ }
133
+ if (state.lifecycle === "destroyed") {
134
+ throw new Error(`Cannot resume destroyed agent: ${agentId}`);
135
+ }
136
+ state.lifecycle = "running";
137
+ this.provider.eventBus.emit({
138
+ type: "agent_resumed",
139
+ timestamp: Date.now(),
140
+ source: "runtime",
141
+ category: "lifecycle",
142
+ intent: "notification",
143
+ data: { agentId },
144
+ context: {
145
+ agentId,
146
+ imageId: state.agent.imageId,
147
+ containerId: state.agent.containerId,
148
+ sessionId: state.agent.sessionId
149
+ }
150
+ });
151
+ logger.info("Agent resumed", { agentId });
152
+ }
153
+ async destroyAgent(agentId) {
154
+ const state = this.agents.get(agentId);
155
+ if (!state) {
156
+ throw new Error(`Agent not found: ${agentId}`);
157
+ }
158
+ await state.driver.dispose();
159
+ for (const unsub of state.subscriptions) {
160
+ unsub();
161
+ }
162
+ state.subscriptions.clear();
163
+ state.lifecycle = "destroyed";
164
+ this.provider.eventBus.emit({
165
+ type: "agent_destroyed",
166
+ timestamp: Date.now(),
167
+ source: "runtime",
168
+ category: "lifecycle",
169
+ intent: "notification",
170
+ data: { agentId },
171
+ context: {
172
+ agentId,
173
+ imageId: state.agent.imageId,
174
+ containerId: state.agent.containerId,
175
+ sessionId: state.agent.sessionId
176
+ }
177
+ });
178
+ this.agents.delete(agentId);
179
+ logger.info("Agent destroyed", { agentId });
180
+ }
181
+ // ==================== Message Handling ====================
182
+ async receive(agentId, content, requestId) {
183
+ const state = this.agents.get(agentId);
184
+ if (!state) {
185
+ throw new Error(`Agent not found: ${agentId}`);
186
+ }
187
+ if (state.lifecycle !== "running") {
188
+ throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);
189
+ }
190
+ if (state.isReceiving) {
191
+ throw new Error(`Agent ${agentId} is already processing a message`);
192
+ }
193
+ const actualRequestId = requestId ?? this.generateRequestId();
194
+ const userMessage = {
195
+ id: this.generateMessageId(),
196
+ role: "user",
197
+ subtype: "user",
198
+ content,
199
+ timestamp: Date.now()
200
+ };
201
+ await this.provider.sessionRepository.addMessage(state.agent.sessionId, userMessage);
202
+ this.emitEvent(state, "user_message", userMessage, actualRequestId);
203
+ logger.debug("User message sent", {
204
+ agentId,
205
+ requestId: actualRequestId,
206
+ contentPreview: typeof content === "string" ? content.substring(0, 50) : `[${content.length} parts]`
207
+ });
208
+ state.isReceiving = true;
209
+ try {
210
+ for await (const event of state.driver.receive(userMessage)) {
211
+ this.handleDriverEvent(state, event, actualRequestId);
212
+ }
213
+ } catch (error) {
214
+ this.emitEvent(
215
+ state,
216
+ "error_received",
217
+ {
218
+ message: error instanceof Error ? error.message : String(error),
219
+ errorCode: "runtime_error"
220
+ },
221
+ actualRequestId
222
+ );
223
+ throw error;
224
+ } finally {
225
+ state.isReceiving = false;
226
+ }
227
+ }
228
+ interrupt(agentId, requestId) {
229
+ const state = this.agents.get(agentId);
230
+ if (!state) {
231
+ throw new Error(`Agent not found: ${agentId}`);
232
+ }
233
+ state.driver.interrupt();
234
+ this.emitEvent(
235
+ state,
236
+ "interrupt",
237
+ { agentId },
238
+ requestId ?? this.generateRequestId()
239
+ );
240
+ logger.debug("Interrupt sent", { agentId, requestId });
241
+ }
242
+ // ==================== Event Subscription ====================
243
+ subscribe(agentId, handler) {
244
+ const state = this.agents.get(agentId);
245
+ if (!state) {
246
+ throw new Error(`Agent not found: ${agentId}`);
247
+ }
248
+ const unsub = this.provider.eventBus.onAny((event) => {
249
+ const context = event.context;
250
+ if (context?.agentId === agentId) {
251
+ handler(event);
252
+ }
253
+ });
254
+ state.subscriptions.add(unsub);
255
+ return {
256
+ unsubscribe: () => {
257
+ unsub();
258
+ state.subscriptions.delete(unsub);
259
+ }
260
+ };
261
+ }
262
+ subscribeAll(handler) {
263
+ const unsub = this.provider.eventBus.onAny(handler);
264
+ this.globalSubscriptions.add(unsub);
265
+ return {
266
+ unsubscribe: () => {
267
+ unsub();
268
+ this.globalSubscriptions.delete(unsub);
269
+ }
270
+ };
271
+ }
272
+ // ==================== Cleanup ====================
273
+ async shutdown() {
274
+ if (this.isShutdown) return;
275
+ logger.info("Shutting down AgentXRuntime...");
276
+ const agentIds = Array.from(this.agents.keys());
277
+ for (const agentId of agentIds) {
278
+ await this.destroyAgent(agentId);
279
+ }
280
+ for (const unsub of this.globalSubscriptions) {
281
+ unsub();
282
+ }
283
+ this.globalSubscriptions.clear();
284
+ this.isShutdown = true;
285
+ logger.info("AgentXRuntime shutdown complete");
286
+ }
287
+ // ==================== Private Helpers ====================
288
+ /**
289
+ * Handle a single DriverStreamEvent
290
+ */
291
+ handleDriverEvent(state, event, requestId) {
292
+ this.emitEvent(state, event.type, event.data, requestId);
293
+ }
294
+ /**
295
+ * Emit an event to the EventBus
296
+ */
297
+ emitEvent(state, type, data, requestId) {
298
+ this.provider.eventBus.emit({
299
+ type,
300
+ timestamp: Date.now(),
301
+ source: "runtime",
302
+ category: this.categorizeEvent(type),
303
+ intent: "notification",
304
+ requestId,
305
+ data,
306
+ context: {
307
+ agentId: state.agent.agentId,
308
+ imageId: state.agent.imageId,
309
+ containerId: state.agent.containerId,
310
+ sessionId: state.agent.sessionId
311
+ }
312
+ });
313
+ }
314
+ /**
315
+ * Categorize event type
316
+ */
317
+ categorizeEvent(type) {
318
+ if (type.includes("message")) return "message";
319
+ if (type.includes("tool")) return "tool";
320
+ if (type.includes("error") || type.includes("interrupted")) return "error";
321
+ if (type.includes("delta")) return "stream";
322
+ return "stream";
323
+ }
324
+ generateAgentId() {
325
+ const timestamp = Date.now().toString(36);
326
+ const random = Math.random().toString(36).substring(2, 8);
327
+ return `agent_${timestamp}_${random}`;
328
+ }
329
+ generateRequestId() {
330
+ const timestamp = Date.now().toString(36);
331
+ const random = Math.random().toString(36).substring(2, 8);
332
+ return `req_${timestamp}_${random}`;
333
+ }
334
+ generateMessageId() {
335
+ const timestamp = Date.now().toString(36);
336
+ const random = Math.random().toString(36).substring(2, 8);
337
+ return `msg_${timestamp}_${random}`;
338
+ }
339
+ };
340
+ function createAgentXRuntime(provider) {
341
+ return new AgentXRuntimeImpl(provider);
342
+ }
343
+ export {
344
+ AgentXRuntimeImpl,
345
+ createAgentXRuntime
346
+ };
347
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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":[]}